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