Coverage for kiirastuli/__init__.py: 93.02%

39 statements  

« prev     ^ index     » next       coverage.py v7.0.1, created at 2023-01-02 20:15 +0100

1"""Purgatory (Finnish: kiirastuli) - purge like hell to stay out of trouble.""" 

2import datetime as dti 

3import logging 

4import os 

5import pathlib 

6from typing import List, no_type_check 

7 

8# [[[fill git_describe()]]] 

9__version__ = '2022.10.23+parent.d04133d9' 

10# [[[end]]] (checksum: 18fdfd17580575137d602b77a9411178) 

11__version_info__ = tuple( 

12 e if '-' not in e else e.split('-')[0] for part in __version__.split('+') for e in part.split('.') if e != 'parent' 

13) 

14 

15APP_NAME = 'Purgatory (Finnish: kiirastuli) - purge like hell to stay out of trouble.' 

16APP_ALIAS = 'kiirastuli' 

17APP_ENV = 'KIIRASTULI' 

18COMMA = ',' 

19DEBUG = bool(os.getenv(f'{APP_ENV}_DEBUG', '')) 

20VERBOSE = bool(os.getenv(f'{APP_ENV}_VERBOSE', '')) 

21QUIET = False 

22STRICT = bool(os.getenv(f'{APP_ENV}_STRICT', '')) 

23ENCODING = 'utf-8' 

24ENCODING_ERRORS_POLICY = 'ignore' 

25DEFAULT_CONFIG_NAME = '.kiirastuli.json' 

26DEFAULT_LF_ONLY = 'YES' 

27log = logging.getLogger() # Module level logger is sufficient 

28LOG_FOLDER = pathlib.Path('logs') 

29LOG_FILE = f'{APP_ALIAS}.log' 

30LOG_PATH = pathlib.Path(LOG_FOLDER, LOG_FILE) if LOG_FOLDER.is_dir() else pathlib.Path(LOG_FILE) 

31LOG_LEVEL = logging.INFO 

32 

33TS_FORMAT_LOG = '%Y-%m-%dT%H:%M:%S' 

34TS_FORMAT_PAYLOADS = '%Y-%m-%d %H:%M:%S.%f UTC' 

35 

36__all__: List[str] = [ 

37 'APP_ALIAS', 

38 'APP_NAME', 

39 'COMMA', 

40 'DEBUG', 

41 'log', 

42 'parse_csl', 

43] 

44 

45 

46def parse_csl(csl: str) -> List[str]: 

47 """DRY.""" 

48 return [fmt.strip().lower() for fmt in csl.split(COMMA) if fmt.strip()] 

49 

50 

51@no_type_check 

52def formatTime_RFC3339(self, record, datefmt=None): # noqa 

53 """HACK A DID ACK we could inject .astimezone() to localize ...""" 

54 return dti.datetime.fromtimestamp(record.created, dti.timezone.utc).isoformat() # pragma: no cover 

55 

56 

57@no_type_check 

58def init_logger(name=None, level=None): 

59 """Initialize module level logger""" 

60 global log # pylint: disable=global-statement 

61 

62 log_format = { 

63 'format': '%(asctime)s %(levelname)s [%(name)s]: %(message)s', 

64 'datefmt': TS_FORMAT_LOG, 

65 # 'filename': LOG_PATH, 

66 'level': LOG_LEVEL if level is None else level, 

67 } 

68 logging.Formatter.formatTime = formatTime_RFC3339 

69 logging.basicConfig(**log_format) 

70 log = logging.getLogger(APP_ENV if name is None else name) 

71 log.propagate = True 

72 

73 

74init_logger(name=APP_ENV, level=logging.DEBUG if DEBUG else None)