Commit 39cd1cfe62d43b161decc807f94211519ee95597
1 parent
1841cc32
Exists in
master
and in
1 other branch
add config/logger.yaml example files to start from.
Showing
5 changed files
with
116 additions
and
26 deletions
Show diff stats
README.md
@@ -220,6 +220,7 @@ errors in the browser. | @@ -220,6 +220,7 @@ errors in the browser. | ||
220 | Logging levels can be adjusted in `~/.config/aprendizations/logger.yaml` and | 220 | Logging levels can be adjusted in `~/.config/aprendizations/logger.yaml` and |
221 | `~/.config/aprendizations/logger-debug.yaml`. | 221 | `~/.config/aprendizations/logger-debug.yaml`. |
222 | 222 | ||
223 | +If these files do not yet exist, there are examples in `aprendizations/config` that can be copied to `~/.config/aprendizations`. | ||
223 | 224 | ||
224 | #### UnicodeEncodeError | 225 | #### UnicodeEncodeError |
225 | 226 |
aprendizations/knowledge.py
@@ -69,13 +69,14 @@ class StudentKnowledge(object): | @@ -69,13 +69,14 @@ class StudentKnowledge(object): | ||
69 | # ------------------------------------------------------------------------ | 69 | # ------------------------------------------------------------------------ |
70 | async def start_topic(self, topic): | 70 | async def start_topic(self, topic): |
71 | logger.debug('StudentKnowledge.start_topic()') | 71 | logger.debug('StudentKnowledge.start_topic()') |
72 | + | ||
72 | if self.current_topic == topic: | 73 | if self.current_topic == topic: |
73 | - logger.info(' Restarting current topic is not allowed.') | 74 | + logger.info('Restarting current topic is not allowed.') |
74 | return False | 75 | return False |
75 | 76 | ||
76 | # do not allow locked topics | 77 | # do not allow locked topics |
77 | if self.is_locked(topic): | 78 | if self.is_locked(topic): |
78 | - logger.debug(f' Topic {topic} is locked') | 79 | + logger.debug(f'Topic {topic} is locked') |
79 | return False | 80 | return False |
80 | 81 | ||
81 | # starting new topic | 82 | # starting new topic |
@@ -96,23 +97,16 @@ class StudentKnowledge(object): | @@ -96,23 +97,16 @@ class StudentKnowledge(object): | ||
96 | # synchronous: | 97 | # synchronous: |
97 | # self.questions = [self.factory[ref].generate() for ref in questions] | 98 | # self.questions = [self.factory[ref].generate() for ref in questions] |
98 | 99 | ||
99 | - loop = asyncio.get_running_loop() | ||
100 | - | ||
101 | # async: | 100 | # async: |
102 | - # generators = [loop.run_in_executor(None, self.factory[qref].generate) | ||
103 | - # for qref in questions] | ||
104 | - # self.questions = await asyncio.gather(*generators) | ||
105 | - | ||
106 | - # another async: | ||
107 | - self.questions = [] | ||
108 | - for qref in questions: | ||
109 | - q = await loop.run_in_executor(None, self.factory[qref].generate) | ||
110 | - self.questions.append(q) | ||
111 | - | ||
112 | - logger.debug(f'Generated {len(self.questions)} questions') | 101 | + loop = asyncio.get_running_loop() |
102 | + generators = [loop.run_in_executor(None, self.factory[qref].generate) | ||
103 | + for qref in questions] | ||
104 | + self.questions = await asyncio.gather(*generators) | ||
113 | 105 | ||
114 | # get first question | 106 | # get first question |
115 | self.next_question() | 107 | self.next_question() |
108 | + | ||
109 | + logger.debug(f'Generated {len(self.questions)} questions') | ||
116 | return True | 110 | return True |
117 | 111 | ||
118 | # ------------------------------------------------------------------------ | 112 | # ------------------------------------------------------------------------ |
aprendizations/serve.py
1 | #!/usr/bin/env python3 | 1 | #!/usr/bin/env python3 |
2 | 2 | ||
3 | # python standard library | 3 | # python standard library |
4 | -from os import path | ||
5 | -import os | ||
6 | import sys | 4 | import sys |
7 | import base64 | 5 | import base64 |
8 | import uuid | 6 | import uuid |
@@ -13,12 +11,12 @@ import signal | @@ -13,12 +11,12 @@ import signal | ||
13 | import functools | 11 | import functools |
14 | import ssl | 12 | import ssl |
15 | import asyncio | 13 | import asyncio |
16 | -# from typing import NoReturn | 14 | +from os import path, environ |
17 | 15 | ||
18 | # third party libraries | 16 | # third party libraries |
19 | import tornado.ioloop | 17 | import tornado.ioloop |
20 | -import tornado.web | ||
21 | import tornado.httpserver | 18 | import tornado.httpserver |
19 | +import tornado.web | ||
22 | from tornado.escape import to_unicode | 20 | from tornado.escape import to_unicode |
23 | 21 | ||
24 | # this project | 22 | # this project |
@@ -294,7 +292,7 @@ class QuestionHandler(BaseHandler): | @@ -294,7 +292,7 @@ class QuestionHandler(BaseHandler): | ||
294 | answer_qid = self.get_body_arguments('qid')[0] | 292 | answer_qid = self.get_body_arguments('qid')[0] |
295 | current_qid = self.learn.get_current_question_id(user) | 293 | current_qid = self.learn.get_current_question_id(user) |
296 | if answer_qid != current_qid: | 294 | if answer_qid != current_qid: |
297 | - logging.debug(f'User {user} desynchronized questions') | 295 | + logging.info(f'User {user} desynchronized questions') |
298 | self.write({ | 296 | self.write({ |
299 | 'method': 'invalid', | 297 | 'method': 'invalid', |
300 | 'params': { | 298 | 'params': { |
@@ -428,16 +426,16 @@ def get_logger_config(debug=False): | @@ -428,16 +426,16 @@ def get_logger_config(debug=False): | ||
428 | filename = 'logger.yaml' | 426 | filename = 'logger.yaml' |
429 | level = 'INFO' | 427 | level = 'INFO' |
430 | 428 | ||
431 | - config_dir = os.environ.get('XDG_CONFIG_HOME', '~/.config/') | 429 | + config_dir = environ.get('XDG_CONFIG_HOME', '~/.config/') |
432 | config_file = path.join(path.expanduser(config_dir), APP_NAME, filename) | 430 | config_file = path.join(path.expanduser(config_dir), APP_NAME, filename) |
433 | 431 | ||
434 | default_config = { | 432 | default_config = { |
435 | 'version': 1, | 433 | 'version': 1, |
436 | 'formatters': { | 434 | 'formatters': { |
437 | 'standard': { | 435 | 'standard': { |
438 | - 'format': '%(asctime)s %(name)-24s %(levelname)-8s ' | 436 | + 'format': '%(asctime)s %(name)-24s %(levelname)-10s - ' |
439 | '%(message)s', | 437 | '%(message)s', |
440 | - 'datefmt': '%H:%M:%S', | 438 | + 'datefmt': '%Y-%m-%d %H:%M:%S', |
441 | }, | 439 | }, |
442 | }, | 440 | }, |
443 | 'handlers': { | 441 | 'handlers': { |
@@ -503,8 +501,8 @@ def main(): | @@ -503,8 +501,8 @@ def main(): | ||
503 | sys.exit(1) | 501 | sys.exit(1) |
504 | 502 | ||
505 | # --- get SSL certificates | 503 | # --- get SSL certificates |
506 | - if 'XDG_DATA_HOME' in os.environ: | ||
507 | - certs_dir = path.join(os.environ['XDG_DATA_HOME'], 'certs') | 504 | + if 'XDG_DATA_HOME' in environ: |
505 | + certs_dir = path.join(environ['XDG_DATA_HOME'], 'certs') | ||
508 | else: | 506 | else: |
509 | certs_dir = path.expanduser('~/.local/share/certs') | 507 | certs_dir = path.expanduser('~/.local/share/certs') |
510 | 508 | ||
@@ -523,7 +521,12 @@ def main(): | @@ -523,7 +521,12 @@ def main(): | ||
523 | logging.critical('Certificates cert.pem and privkey.pem not found') | 521 | logging.critical('Certificates cert.pem and privkey.pem not found') |
524 | sys.exit(1) | 522 | sys.exit(1) |
525 | 523 | ||
526 | - httpserver.listen(arg.port) | 524 | + try: |
525 | + httpserver.listen(arg.port) | ||
526 | + except OSError: | ||
527 | + logging.critical(f'Cannot bind port {arg.port}. Already in use?') | ||
528 | + sys.exit(1) | ||
529 | + | ||
527 | logging.info(f'Listening on port {arg.port}.') | 530 | logging.info(f'Listening on port {arg.port}.') |
528 | 531 | ||
529 | # --- run webserver | 532 | # --- run webserver |
@@ -0,0 +1,46 @@ | @@ -0,0 +1,46 @@ | ||
1 | +--- | ||
2 | +version: 1 | ||
3 | + | ||
4 | +formatters: | ||
5 | + void: | ||
6 | + format: '' | ||
7 | + standard: | ||
8 | + format: '%(asctime)s | %(levelname)-9s | %(name)-24s | %(thread)-15d | %(message)s' | ||
9 | + datefmt: '%H:%M:%S' | ||
10 | + | ||
11 | +handlers: | ||
12 | + default: | ||
13 | + level: 'DEBUG' | ||
14 | + class: 'logging.StreamHandler' | ||
15 | + formatter: 'standard' | ||
16 | + stream: 'ext://sys.stdout' | ||
17 | + | ||
18 | +loggers: | ||
19 | + '': | ||
20 | + handlers: ['default'] | ||
21 | + level: 'DEBUG' | ||
22 | + | ||
23 | + 'aprendizations.factory': | ||
24 | + handlers: ['default'] | ||
25 | + level: 'DEBUG' | ||
26 | + propagate: false | ||
27 | + | ||
28 | + 'aprendizations.knowledge': | ||
29 | + handlers: ['default'] | ||
30 | + level: 'DEBUG' | ||
31 | + propagate: false | ||
32 | + | ||
33 | + 'aprendizations.learnapp': | ||
34 | + handlers: ['default'] | ||
35 | + level: 'DEBUG' | ||
36 | + propagate: false | ||
37 | + | ||
38 | + 'aprendizations.questions': | ||
39 | + handlers: ['default'] | ||
40 | + level: 'DEBUG' | ||
41 | + propagate: false | ||
42 | + | ||
43 | + 'aprendizations.tools': | ||
44 | + handlers: ['default'] | ||
45 | + level: 'DEBUG' | ||
46 | + propagate: false |
@@ -0,0 +1,46 @@ | @@ -0,0 +1,46 @@ | ||
1 | +--- | ||
2 | +version: 1 | ||
3 | + | ||
4 | +formatters: | ||
5 | + void: | ||
6 | + format: '' | ||
7 | + standard: | ||
8 | + format: '%(asctime)s | %(thread)-15d | %(levelname)-9s | %(name)-24s | %(message)s' | ||
9 | + datefmt: '%Y-%m-%d %H:%M:%S' | ||
10 | + | ||
11 | +handlers: | ||
12 | + default: | ||
13 | + level: 'INFO' | ||
14 | + class: 'logging.StreamHandler' | ||
15 | + formatter: 'standard' | ||
16 | + stream: 'ext://sys.stdout' | ||
17 | + | ||
18 | +loggers: | ||
19 | + '': | ||
20 | + handlers: ['default'] | ||
21 | + level: 'INFO' | ||
22 | + | ||
23 | + 'aprendizations.factory': | ||
24 | + handlers: ['default'] | ||
25 | + level: 'INFO' | ||
26 | + propagate: false | ||
27 | + | ||
28 | + 'aprendizations.knowledge': | ||
29 | + handlers: ['default'] | ||
30 | + level: 'INFO' | ||
31 | + propagate: false | ||
32 | + | ||
33 | + 'aprendizations.learnapp': | ||
34 | + handlers: ['default'] | ||
35 | + level: 'INFO' | ||
36 | + propagate: false | ||
37 | + | ||
38 | + 'aprendizations.questions': | ||
39 | + handlers: ['default'] | ||
40 | + level: 'INFO' | ||
41 | + propagate: false | ||
42 | + | ||
43 | + 'aprendizations.tools': | ||
44 | + handlers: ['default'] | ||
45 | + level: 'INFO' | ||
46 | + propagate: false |