hello world
This commit is contained in:
commit
9d9a1e97a9
|
@ -0,0 +1,5 @@
|
||||||
|
bin/
|
||||||
|
data/
|
||||||
|
include/
|
||||||
|
lib/
|
||||||
|
__pycache__
|
|
@ -0,0 +1,88 @@
|
||||||
|
import pathlib
|
||||||
|
import time
|
||||||
|
import os
|
||||||
|
import csv
|
||||||
|
import random
|
||||||
|
from rich.console import Console
|
||||||
|
from rich.markdown import Markdown
|
||||||
|
|
||||||
|
LEVEL = "LEVEL"
|
||||||
|
QUESTION = "QUESTION"
|
||||||
|
ANSWER = "ANSWER"
|
||||||
|
|
||||||
|
|
||||||
|
class Question(object):
|
||||||
|
"""class to hold the question data and methods"""
|
||||||
|
def __init__(self, data):
|
||||||
|
self._data = data
|
||||||
|
self._clean_data()
|
||||||
|
|
||||||
|
def _clean_data(self):
|
||||||
|
"""
|
||||||
|
TODO needs quite bit of actual cleanup to make the parsing more robust
|
||||||
|
"""
|
||||||
|
self._level = self._data[LEVEL].strip()
|
||||||
|
self._question = self._data[QUESTION].strip()
|
||||||
|
self._answers = self._data[ANSWER].strip().split(" ")
|
||||||
|
|
||||||
|
def get_question(self):
|
||||||
|
return self._question
|
||||||
|
|
||||||
|
def get_possibilities(self):
|
||||||
|
"""returns a list of all the possible answers"""
|
||||||
|
possibilities = []
|
||||||
|
for key in self._data.keys():
|
||||||
|
if key.isnumeric():
|
||||||
|
possibilities.append(self._data[key])
|
||||||
|
return possibilities
|
||||||
|
|
||||||
|
def verify(self, answer):
|
||||||
|
"""needs quite some work"""
|
||||||
|
if answer in self._data[ANSWER]:
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
def get_right_answers(self):
|
||||||
|
answers = []
|
||||||
|
for answer in self._answers:
|
||||||
|
if len(answer) == 0:
|
||||||
|
print("question not complete...")
|
||||||
|
else:
|
||||||
|
answers.append(self._data[answer])
|
||||||
|
return answers
|
||||||
|
|
||||||
|
|
||||||
|
class Database(object):
|
||||||
|
"""holds all the Question objects and methods to get new questions"""
|
||||||
|
def __init__(self, filepath):
|
||||||
|
self.filepath = filepath
|
||||||
|
self._db = []
|
||||||
|
self.setup()
|
||||||
|
|
||||||
|
def setup(self):
|
||||||
|
data = csv.DictReader(open(self.filepath, "r"))
|
||||||
|
for row in data:
|
||||||
|
self._db.append(Question(row))
|
||||||
|
|
||||||
|
def get_question(self):
|
||||||
|
return random.choice(self._db)
|
||||||
|
|
||||||
|
|
||||||
|
class Game(object):
|
||||||
|
def __init__(self):
|
||||||
|
self._stats = []
|
||||||
|
|
||||||
|
def update_stats(self, stat):
|
||||||
|
self._stats.append(stat)
|
||||||
|
|
||||||
|
def get_stats(self):
|
||||||
|
right = self._stats.count(True)
|
||||||
|
wrong = self._stats.count(False)
|
||||||
|
total = len(self._stats)
|
||||||
|
return (right, wrong, total)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
pass
|
||||||
|
|
|
@ -0,0 +1,81 @@
|
||||||
|
#!/usr/bin/python3
|
||||||
|
|
||||||
|
import pathlib
|
||||||
|
import time
|
||||||
|
import os
|
||||||
|
import csv
|
||||||
|
import random
|
||||||
|
from collections import Counter
|
||||||
|
from rich.console import Console
|
||||||
|
from rich.markdown import Markdown
|
||||||
|
|
||||||
|
|
||||||
|
def _load_csv(filepath):
|
||||||
|
"""Loads the csv file to a dict"""
|
||||||
|
dictreader = csv.DictReader(open(filepath, "r"))
|
||||||
|
data = []
|
||||||
|
for element in dictreader:
|
||||||
|
data.append(element)
|
||||||
|
return data
|
||||||
|
|
||||||
|
|
||||||
|
def _get_random_question(data):
|
||||||
|
choice = random.choice(data)
|
||||||
|
return choice
|
||||||
|
|
||||||
|
|
||||||
|
def print_random_question(data):
|
||||||
|
os.system("clear")
|
||||||
|
c = Console()
|
||||||
|
question = "# {}".format(data["QUESTION"])
|
||||||
|
question = Markdown(question)
|
||||||
|
c.print(question)
|
||||||
|
answers = []
|
||||||
|
for i in data.keys():
|
||||||
|
if i.isnumeric():
|
||||||
|
answers.append(data[i])
|
||||||
|
answer = ""
|
||||||
|
for i in answers:
|
||||||
|
answer += "1. {} \n".format(i)
|
||||||
|
answer = Markdown(answer)
|
||||||
|
c.print(answer)
|
||||||
|
|
||||||
|
|
||||||
|
def _test_question(data):
|
||||||
|
result = input("What's your answer? ")
|
||||||
|
if result in data["ANSWER"]:
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
def _print_succes(status):
|
||||||
|
c = Console()
|
||||||
|
if status:
|
||||||
|
msg = "## Good job!"
|
||||||
|
else:
|
||||||
|
msg = "## that's not the right answer..."
|
||||||
|
md = Markdown(msg)
|
||||||
|
c.print(md)
|
||||||
|
|
||||||
|
def print_stats(counter):
|
||||||
|
succes = counter.count(True)
|
||||||
|
fail = counter.count(False)
|
||||||
|
print("{} out of {} correct!".format(succes, succes + fail))
|
||||||
|
input("press ENTER for a new question or CTRL-C to quit")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
filepath = pathlib.Path("./data/list_book1.csv")
|
||||||
|
data = _load_csv(filepath)
|
||||||
|
try:
|
||||||
|
counter = []
|
||||||
|
while True:
|
||||||
|
question = _get_random_question(data)
|
||||||
|
print_random_question(question)
|
||||||
|
status = _test_question(question)
|
||||||
|
counter.append(status)
|
||||||
|
_print_succes(status)
|
||||||
|
print_stats(counter)
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
print("byebye")
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
colorama==0.4.4
|
||||||
|
commonmark==0.9.1
|
||||||
|
Pygments==2.9.0
|
||||||
|
rich==10.2.2
|
||||||
|
typing-extensions==3.10.0.0
|
|
@ -0,0 +1,100 @@
|
||||||
|
#!/usr/bin/python3
|
||||||
|
|
||||||
|
import pathlib
|
||||||
|
import time
|
||||||
|
import os
|
||||||
|
import csv
|
||||||
|
import random
|
||||||
|
from rich.console import Console
|
||||||
|
from rich.markdown import Markdown
|
||||||
|
|
||||||
|
from ccpq.lib_ccpq import Question, Database, Game
|
||||||
|
|
||||||
|
class Tui(object):
|
||||||
|
def __init__(self):
|
||||||
|
self._console = Console()
|
||||||
|
self._stats = []
|
||||||
|
|
||||||
|
def ask_question(self, question):
|
||||||
|
md = Markdown("# {}".format(question.get_question()))
|
||||||
|
self._console.print(md)
|
||||||
|
md = ""
|
||||||
|
for possibility in question.get_possibilities():
|
||||||
|
md += "1. {}\n".format(possibility)
|
||||||
|
md = Markdown(md)
|
||||||
|
self._console.print(md)
|
||||||
|
|
||||||
|
def prompt_for_answer(self):
|
||||||
|
md = Markdown("What's your answer?")
|
||||||
|
self._console.print(md)
|
||||||
|
answer = self._parse_input()
|
||||||
|
return answer
|
||||||
|
|
||||||
|
def _parse_input(self):
|
||||||
|
"""
|
||||||
|
TODO make it adapt to questions with multiple choices and fill the
|
||||||
|
blank
|
||||||
|
"""
|
||||||
|
while True:
|
||||||
|
result = input()
|
||||||
|
if result.isdigit():
|
||||||
|
return result
|
||||||
|
md = Markdown("**only digits please**")
|
||||||
|
self._console.print(md)
|
||||||
|
|
||||||
|
def show_response(self, question):
|
||||||
|
answers = question.get_right_answers()
|
||||||
|
if len(answers) == 1:
|
||||||
|
answer = answers[0]
|
||||||
|
md = Markdown("### The right answer is: {}".format(answer))
|
||||||
|
else:
|
||||||
|
md = "### The right answers are:\n"
|
||||||
|
for answer in answers:
|
||||||
|
md += "* {}\n".format(answer)
|
||||||
|
md = Markdown(md)
|
||||||
|
self._console.print(md)
|
||||||
|
|
||||||
|
def show_stats(self, stats):
|
||||||
|
md = "### you have {} out of {} right!".format(stats[0], stats[2])
|
||||||
|
md = Markdown(md)
|
||||||
|
self._console.print(md)
|
||||||
|
md = "### press **enter** to get a new question or **CTRL-C** to quit"
|
||||||
|
md = Markdown(md)
|
||||||
|
self._console.print(md)
|
||||||
|
input()
|
||||||
|
os.system("clear")
|
||||||
|
|
||||||
|
|
||||||
|
def goodbye(self):
|
||||||
|
md = Markdown("# Goodbye!")
|
||||||
|
self._console.print(md)
|
||||||
|
|
||||||
|
|
||||||
|
class Application(object):
|
||||||
|
def __init__(self, filepath, interface):
|
||||||
|
self._db = Database(filepath)
|
||||||
|
self._session = Game()
|
||||||
|
self._interface = interface
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
while True:
|
||||||
|
question = self._db.get_question()
|
||||||
|
self._interface.ask_question(question)
|
||||||
|
answer = self._interface.prompt_for_answer()
|
||||||
|
stat = question.verify(answer)
|
||||||
|
self._session.update_stats(stat)
|
||||||
|
self._interface.show_response(question)
|
||||||
|
self._interface.show_stats(self._session.get_stats())
|
||||||
|
|
||||||
|
def quit(self):
|
||||||
|
self._interface.goodbye()
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
filepath = pathlib.Path("./data/list_book1.csv")
|
||||||
|
interface = Tui()
|
||||||
|
app = Application(filepath, interface)
|
||||||
|
try:
|
||||||
|
app.run()
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
app.quit()
|
Loading…
Reference in New Issue