Commit 1ad906edd57901ac8781e224a084e50104fdb512
1 parent
f2567db3
Exists in
dev
remove synchronous question generators
Showing
3 changed files
with
39 additions
and
35 deletions
Show diff stats
aprendizations/learnapp.py
| ... | ... | @@ -125,7 +125,7 @@ class LearnApp(): |
| 125 | 125 | for qref, qfactory in self.factory.items(): |
| 126 | 126 | logger.debug('checking %s...', qref) |
| 127 | 127 | try: |
| 128 | - question = qfactory.generate() | |
| 128 | + question = asyncio.run(qfactory.generate()) | |
| 129 | 129 | except QuestionException as exc: |
| 130 | 130 | logger.error(exc) |
| 131 | 131 | errors += 1 | ... | ... |
aprendizations/questions.py
| ... | ... | @@ -5,6 +5,7 @@ Description: Classes the implement several types of questions. |
| 5 | 5 | |
| 6 | 6 | |
| 7 | 7 | # python standard library |
| 8 | +import asyncio | |
| 8 | 9 | from datetime import datetime |
| 9 | 10 | import logging |
| 10 | 11 | from os import path |
| ... | ... | @@ -14,7 +15,7 @@ from typing import Any, Dict, NewType |
| 14 | 15 | import uuid |
| 15 | 16 | |
| 16 | 17 | # this project |
| 17 | -from aprendizations.tools import run_script, run_script_async | |
| 18 | +from aprendizations.tools import run_script_async | |
| 18 | 19 | |
| 19 | 20 | # setup logger for this module |
| 20 | 21 | logger = logging.getLogger(__name__) |
| ... | ... | @@ -506,36 +507,39 @@ class QuestionTextArea(Question): |
| 506 | 507 | self['correct'] = path.join(self['path'], self['correct']) |
| 507 | 508 | |
| 508 | 509 | # ------------------------------------------------------------------------ |
| 509 | - def correct(self) -> None: | |
| 510 | - super().correct() | |
| 511 | - | |
| 512 | - if self['answer'] is not None: # correct answer and parse yaml ouput | |
| 513 | - out = run_script( | |
| 514 | - script=self['correct'], | |
| 515 | - args=self['args'], | |
| 516 | - stdin=self['answer'], | |
| 517 | - timeout=self['timeout'] | |
| 518 | - ) | |
| 519 | - | |
| 520 | - if out is None: | |
| 521 | - logger.warning('No grade after running "%s".', self["correct"]) | |
| 522 | - self['comments'] = ('Erro interno durante a correcção. ' | |
| 523 | - 'Por favor reporte este erro') | |
| 524 | - self['grade'] = 0.0 | |
| 525 | - elif isinstance(out, dict): | |
| 526 | - self['comments'] = out.get('comments', '') | |
| 527 | - try: | |
| 528 | - self['grade'] = float(out['grade']) | |
| 529 | - except ValueError: | |
| 530 | - logger.error('Output error in "%s".', self["correct"]) | |
| 531 | - except KeyError: | |
| 532 | - logger.error('No grade in "%s".', self["correct"]) | |
| 533 | - else: | |
| 534 | - try: | |
| 535 | - self['grade'] = float(out) | |
| 536 | - except (TypeError, ValueError): | |
| 537 | - logger.error('Invalid grade in "%s".', self["correct"]) | |
| 538 | - | |
| 510 | + # def correct(self) -> None: | |
| 511 | + # super().correct() | |
| 512 | + # | |
| 513 | + # if self['answer'] is not None: # correct answer and parse yaml ouput | |
| 514 | + # out = run_script( | |
| 515 | + # script=self['correct'], | |
| 516 | + # args=self['args'], | |
| 517 | + # stdin=self['answer'], | |
| 518 | + # timeout=self['timeout'] | |
| 519 | + # ) | |
| 520 | + # | |
| 521 | + # if out is None: | |
| 522 | + # logger.warning('No grade after running "%s".', self["correct"]) | |
| 523 | + # self['comments'] = ('Erro interno durante a correcção. ' | |
| 524 | + # 'Por favor reporte este erro') | |
| 525 | + # self['grade'] = 0.0 | |
| 526 | + # elif isinstance(out, dict): | |
| 527 | + # self['comments'] = out.get('comments', '') | |
| 528 | + # try: | |
| 529 | + # self['grade'] = float(out['grade']) | |
| 530 | + # except ValueError: | |
| 531 | + # logger.error('Output error in "%s".', self["correct"]) | |
| 532 | + # except KeyError: | |
| 533 | + # logger.error('No grade in "%s".', self["correct"]) | |
| 534 | + # else: | |
| 535 | + # try: | |
| 536 | + # self['grade'] = float(out) | |
| 537 | + # except (TypeError, ValueError): | |
| 538 | + # logger.error('Invalid grade in "%s".', self["correct"]) | |
| 539 | + # | |
| 540 | + def correct(self) -> None: # FIXME | |
| 541 | + asyncio.run(self.correct_async()) | |
| 542 | + | |
| 539 | 543 | # ------------------------------------------------------------------------ |
| 540 | 544 | async def correct_async(self) -> None: |
| 541 | 545 | super().correct() |
| ... | ... | @@ -663,7 +667,7 @@ class QFactory(): |
| 663 | 667 | self.qdict = qdict |
| 664 | 668 | |
| 665 | 669 | # ------------------------------------------------------------------------ |
| 666 | - async def gen_async(self) -> Question: | |
| 670 | + async def generate(self) -> Question: | |
| 667 | 671 | ''' |
| 668 | 672 | generates a question instance of QuestionRadio, QuestionCheckbox, ..., |
| 669 | 673 | which is a descendent of base class Question. | ... | ... |
aprendizations/student.py
| ... | ... | @@ -114,7 +114,7 @@ class StudentState(): |
| 114 | 114 | questions = topic['questions'][:k] |
| 115 | 115 | logger.debug('selected questions: %s', ', '.join(questions)) |
| 116 | 116 | |
| 117 | - self.questions: List[Question] = [await self.factory[ref].gen_async() | |
| 117 | + self.questions: List[Question] = [await self.factory[ref].generate() | |
| 118 | 118 | for ref in questions] |
| 119 | 119 | |
| 120 | 120 | logger.debug('generated %s questions', len(self.questions)) |
| ... | ... | @@ -171,7 +171,7 @@ class StudentState(): |
| 171 | 171 | elif question['status'] == 'wrong': |
| 172 | 172 | if question['append_wrong']: |
| 173 | 173 | logger.debug(' wrong answer => append new question') |
| 174 | - new_question = await self.factory[question['ref']].gen_async() | |
| 174 | + new_question = await self.factory[question['ref']].generate() | |
| 175 | 175 | self.questions.append(new_question) |
| 176 | 176 | self.next_question() |
| 177 | 177 | ... | ... |