From b6f3badfe6abdd4ccbc68f525e0ee547e05a3570 Mon Sep 17 00:00:00 2001 From: Miguel Barão Date: Mon, 15 Jul 2019 16:40:49 +0100 Subject: [PATCH] - fix some mypy errors. - added some type annotations - fix recomment_topic_sequence argument not being used - fix load_yaml error line number info --- BUGS.md | 1 + aprendizations/serve.py | 8 ++++---- aprendizations/student.py | 25 ++++++++++++++----------- aprendizations/tools.py | 2 +- demo/demo.yaml | 1 - 5 files changed, 20 insertions(+), 17 deletions(-) diff --git a/BUGS.md b/BUGS.md index 4ce9b04..67bbe58 100644 --- a/BUGS.md +++ b/BUGS.md @@ -40,6 +40,7 @@ sqlite3.ProgrammingError: SQLite objects created in a thread can only be used in # FIXED +- forgetting factor is hardcoded in student.py - add aprendizatons --version - se aluno abre dois tabs no browser, conseque navegar em simultaneo para perguntas diferentes. quando submete uma delas dá asneira. Tem de haver um campo hidden que tenha um céodigo único que indique qual a pergunta. do lado do servidor apnas há o codigo da pergunta corrente, se forem diferentes faz redirect para /. - nos topicos learn.yaml, qd falha acrescenta no fim. nao faz sentido. diff --git a/aprendizations/serve.py b/aprendizations/serve.py index cd8a59c..2086ba0 100644 --- a/aprendizations/serve.py +++ b/aprendizations/serve.py @@ -299,14 +299,14 @@ class QuestionHandler(BaseHandler): # --- answers are in a list. fix depending on question type qtype = self.learn.get_student_question_type(user) if qtype in ('success', 'information', 'info'): - answer = None + ans = None elif qtype == 'radio' and not answer: - answer = None + ans = None elif qtype != 'checkbox': # radio, text, textarea, ... - answer = answer[0] + ans = answer[0] # --- check answer (nonblocking) and get corrected question and action - q, action = await self.learn.check_answer(user, answer) + q, action = await self.learn.check_answer(user, ans) # --- built response to return response = {'method': action, 'params': {}} diff --git a/aprendizations/student.py b/aprendizations/student.py index 8235070..9bc1a63 100644 --- a/aprendizations/student.py +++ b/aprendizations/student.py @@ -3,6 +3,7 @@ import random from datetime import datetime import logging +from typing import List # third party libraries import networkx as nx @@ -52,7 +53,7 @@ class StudentState(object): pred = self.deps.predecessors(topic) min_level = self.deps.node[topic]['min_level'] if all(d in self.state and self.state[d]['level'] > min_level - for d in pred): # all deps are greater than min_level + for d in pred): # all deps are greater than min_level self.state[topic] = { 'level': 0.0, # unlocked @@ -92,11 +93,6 @@ class StudentState(object): questions = t['questions'][:k] logger.debug(f'[start_topic] questions: {", ".join(questions)}') - # synchronous - # self.questions = [self.factory[ref].generate() - # for ref in questions] - - # asynchronous: self.questions = [await self.factory[ref].generate_async() for ref in questions] @@ -180,14 +176,21 @@ class StudentState(object): # pure functions of the state (no side effects) # ======================================================================== - def topic_has_finished(self): + def topic_has_finished(self) -> bool: return self.current_question is None # ------------------------------------------------------------------------ # compute recommended sequence of topics ['a', 'b', ...] # ------------------------------------------------------------------------ - def recommend_topic_sequence(self, target=None): + def recommend_topic_sequence(self, target: str = '') -> List[str]: tt = list(nx.topological_sort(self.deps)) + try: + idx = tt.index(target) + except ValueError: + pass + else: + del tt[idx:] + unlocked = [t for t in tt if t in self.state] locked = [t for t in tt if t not in unlocked] return unlocked + locked @@ -197,11 +200,11 @@ class StudentState(object): return self.current_question # ------------------------------------------------------------------------ - def get_current_topic(self): + def get_current_topic(self) -> str: return self.current_topic # ------------------------------------------------------------------------ - def is_locked(self, topic): + def is_locked(self, topic: str) -> bool: return topic not in self.state # ------------------------------------------------------------------------ @@ -227,7 +230,7 @@ class StudentState(object): return self.state[topic]['level'] # ------------------------------------------------------------------------ - def get_topic_date(self, topic): + def get_topic_date(self, topic: str): return self.state[topic]['date'] # ------------------------------------------------------------------------ diff --git a/aprendizations/tools.py b/aprendizations/tools.py index be62ab3..7f97156 100644 --- a/aprendizations/tools.py +++ b/aprendizations/tools.py @@ -154,7 +154,7 @@ def load_yaml(filename: str, default: Any = None) -> Any: except yaml.YAMLError as e: if hasattr(e, 'problem_mark'): mark = e.problem_mark - logger.error(f'File "{filename}" near line {mark.line}, ' + logger.error(f'File "{filename}" near line {mark.line+1}, ' f'column {mark.column+1}') else: logger.error(f'File "{filename}"') diff --git a/demo/demo.yaml b/demo/demo.yaml index 9a3ab67..142dffa 100644 --- a/demo/demo.yaml +++ b/demo/demo.yaml @@ -3,7 +3,6 @@ title: Example database: students.db - # values applied to each topic, if undefined there file: questions.yaml shuffle_questions: true -- libgit2 0.21.2