hello world

This commit is contained in:
waldek 2021-05-23 16:04:09 +02:00
commit 9d9a1e97a9
5 changed files with 279 additions and 0 deletions

5
.gitignore vendored Normal file
View File

@ -0,0 +1,5 @@
bin/
data/
include/
lib/
__pycache__

88
ccpq/lib_ccpq.py Normal file
View File

@ -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

81
poc_standalone.py Executable file
View File

@ -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")

5
requirements.txt Normal file
View File

@ -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

100
standalone_tui.py Executable file
View File

@ -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()