Coverage for yasmon/cli.py: 94%
68 statements
« prev ^ index » next coverage.py v7.2.2, created at 2023-03-28 10:57 +0000
« prev ^ index » next coverage.py v7.2.2, created at 2023-03-28 10:57 +0000
1from yasmon.tasks import TaskRunner
2from yasmon.tasks import TaskError
3from yasmon.processor import YAMLProcessor
4from yasmon.processor import YAMLSyntaxError
5from yasmon.callbacks import CallbackSyntaxError
6from yasmon.loggers import LoggerSyntaxError
8from loguru import logger
9import argparse
10from pathlib import Path
11from enum import IntEnum
12import sys
14logger.remove(0)
17class ExitCodes(IntEnum):
18 Success = 0 # noqa
19 UnexpectedException = 1 # noqa
20 YAMLSyntaxError = 2 # noqa
21 FileNotFoundError = 3 # noqa
22 TaskNotImplementedError = 4 # noqa
23 CallbackNotImplementedError = 5 # noqa
24 CallbackSyntaxError = 6 # noqa
25 TaskError = 7 # noqa
26 LoggerSyntaxError = 8 # noqa
29def parse_args(*args):
30 parser = argparse.ArgumentParser()
31 parser.add_argument("--config", type=str,
32 help="yaml config file path",
33 default=str(Path(Path.home(),
34 '.config',
35 'yasmon',
36 'config.yaml')))
37 return parser.parse_args(args)
40def setup_default_logger():
41 journal_logger_format = (
42 "<level>{level: <8}</level> | "
43 "<cyan>{name}</cyan>:<cyan>{function}</cyan>:<cyan>{line}</cyan> | "
44 "<level>{message}</level>"
45 )
46 return logger.add(sys.stderr, format=journal_logger_format, level='DEBUG')
49def execute(args, default_logger_id):
50 try:
51 processor = YAMLProcessor()
52 processor.load_file(args.config)
54 loggers = processor.add_loggers()
55 num_usr_loggers = len(loggers)
56 if num_usr_loggers > 0:
57 logger.remove(default_logger_id)
58 logger.info(f'there are {num_usr_loggers} user loggers defined: '
59 'default stderr logger removed')
60 else:
61 logger.warning('there are no user loggers defined: '
62 'keeping default stderr logger')
64 callbacks = processor.get_callbacks()
65 tasks = processor.get_tasks(callbacks)
66 runner = TaskRunner(tasks)
67 runner.loop.run_until_complete(runner())
68 return ExitCodes.Success
69 except YAMLSyntaxError as err:
70 logger.error(f'{err.__class__.__name__}: {err}')
71 return ExitCodes.YAMLSyntaxError
72 except FileNotFoundError as err:
73 logger.error(f'{err.__class__.__name__}: {err}')
74 return ExitCodes.FileNotFoundError
75 except CallbackSyntaxError as err:
76 logger.error(f'{err.__class__.__name__}: {err}')
77 return ExitCodes.CallbackSyntaxError
78 except TaskError as err:
79 logger.error(f'{err.__class__.__name__}: {err}')
80 return ExitCodes.TaskError
81 except LoggerSyntaxError as err:
82 logger.error(f'{err.__class__.__name__}: {err}')
83 return ExitCodes.LoggerSyntaxError
84 except Exception as err:
85 logger.error(f'Unexpected {err.__class__.__name__}: {err}')
86 return ExitCodes.UnexpectedException
89def main():
90 default_logger_id = setup_default_logger()
91 args = parse_args(*sys.argv[1:])
92 return execute(args, default_logger_id)
95if __name__ == '__main__':
96 sys.exit(main())