ka-uts-com 2023.6.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
File without changes
@@ -0,0 +1,10 @@
1
+ __title__ = 'ka_uts_com'
2
+ __description__ = 'Communication Area Utilities.'
3
+ __url__ = 'https://ka-ut-com.readthedocs.io/en/latest'
4
+ __version__ = '2023.6.0'
5
+ __build__ = 0x022200
6
+ __author__ = 'Bernd Stroehle'
7
+ __author_email__ = 'bernd.stroehle@bs29.com'
8
+ __license__ = 'Apache-2.0'
9
+ __copyright__ = 'Copyright 2023 bs29'
10
+ __cake__ = u'\u2728 \U0001f370 \u2728'
@@ -0,0 +1,196 @@
1
+ # coding=utf-8
2
+
3
+ import calendar
4
+ import logging
5
+ import logging.config
6
+ from logging import Logger
7
+
8
+ import os
9
+ import time
10
+ from datetime import datetime
11
+
12
+ from ka_uts_com.ioc import Yaml
13
+ from ka_uts_com.ioc import Jinja2
14
+ from ka_uts_com.pacmod import Pacmod
15
+
16
+ from typing import Any, Callable, List, Dict
17
+
18
+ T_Arr = List[Any]
19
+ T_Dic = Dict[Any, Any]
20
+
21
+ TN_Arr = None | T_Arr
22
+ TN_Dic = None | T_Dic
23
+
24
+
25
+ class StandardLog:
26
+
27
+ sw_init: bool = False
28
+ cfg: T_Dic = {}
29
+ log: Logger = logging.getLogger('dummy_logger')
30
+
31
+ @staticmethod
32
+ def read(pacmod: T_Dic, filename: str) -> Any:
33
+ path: str = Pacmod.Path.Log.sh_cfg(filename=filename)
34
+ tenant: str = pacmod['tenant']
35
+ package: str = pacmod['package']
36
+ module: str = pacmod['module']
37
+ pid = Com.pid
38
+ ts: None | datetime = Com.ts_start
39
+ log_main = Jinja2.read(
40
+ path, tenant=tenant, package=package, module=module,
41
+ pid=pid, ts=ts)
42
+ return log_main
43
+
44
+ @classmethod
45
+ def set_level(cls, sw_debug: bool) -> None:
46
+ if sw_debug:
47
+ level = logging.DEBUG
48
+ else:
49
+ level = logging.INFO
50
+ cls.cfg['handlers']['main_debug_console']['level'] = level
51
+ cls.cfg['handlers']['main_debug_file']['level'] = level
52
+
53
+ @classmethod
54
+ def init(
55
+ cls, **kwargs) -> None:
56
+ sw_debug: Any = kwargs.get('sw_debug')
57
+ if cls.sw_init:
58
+ return
59
+ cls.sw_init = True
60
+ cls.cfg = cls.read(Com.pacmod_curr, 'log.main.tenant.yml')
61
+ cls.set_level(sw_debug)
62
+ logging.config.dictConfig(cls.cfg)
63
+ cls.log = logging.getLogger('main')
64
+ return cls.log
65
+
66
+
67
+ class PersonLog:
68
+
69
+ sw_init: bool = False
70
+ cfg: T_Dic = {}
71
+ log: Logger = logging.getLogger('dummy_logger')
72
+
73
+ @classmethod
74
+ def read(
75
+ cls, pacmod: T_Dic, person: Any, filename: str) -> Any:
76
+ path: str = Pacmod.Path.Log.sh_cfg(filename=filename)
77
+ package: str = pacmod['package']
78
+ module: str = pacmod['module']
79
+ return Jinja2.read(
80
+ path, package=package, module=module, person=person,
81
+ pid=Com.pid, ts=Com.ts_start)
82
+
83
+ @classmethod
84
+ def set_level(cls, person: str, sw_debug: bool) -> None:
85
+ if sw_debug:
86
+ level = logging.DEBUG
87
+ else:
88
+ level = logging.INFO
89
+ cls.cfg['handlers'][f'{person}_debug_console']['level'] = level
90
+ cls.cfg['handlers'][f'{person}_debug_file']['level'] = level
91
+
92
+ @classmethod
93
+ def init(cls, pacmod: T_Dic, person: str, sw_debug: bool) -> None:
94
+ cls.cfg = cls.read(pacmod, person, 'log.person.yml')
95
+ cls.set_level(person, sw_debug)
96
+ logging.config.dictConfig(cls.cfg)
97
+ cls.log = logging.getLogger(person)
98
+ return cls.log
99
+
100
+
101
+ class Cfg:
102
+
103
+ @classmethod
104
+ def init(cls, pacmod: T_Dic) -> TN_Dic:
105
+ """ the package data directory has to contain a __init__.py
106
+ file otherwise the objects notation {package}.data to
107
+ locate the package data directory is invalid
108
+ """
109
+ _dic: TN_Dic = Yaml.read(Pacmod.Cfg.sh_path(pacmod))
110
+ return _dic
111
+
112
+
113
+ class Mgo:
114
+
115
+ client = None
116
+
117
+
118
+ class App:
119
+
120
+ sw_init: bool = False
121
+ httpmod = None
122
+ sw_replace_keys: None | bool = None
123
+ keys: TN_Arr = None
124
+ reqs: T_Dic = {}
125
+ app: T_Dic = {}
126
+
127
+ @classmethod
128
+ def init(
129
+ cls, **kwargs) -> Any:
130
+ if cls.sw_init:
131
+ return cls
132
+ cls.sw_init = True
133
+
134
+ cls.httpmod = kwargs.get('httpmod')
135
+ cls.sw_replace_keys = kwargs.get('sw_replace_keys', False)
136
+
137
+ try:
138
+ if cls.sw_replace_keys:
139
+ pacmod = kwargs.get('pacmod_curr')
140
+ cls.keys = Yaml.read(Pacmod.Pmd.sh_path_keys(pacmod))
141
+ except Exception as e:
142
+ if Com.Log is not None:
143
+ fnc_error: Callable = Com.Log.error
144
+ fnc_error(e, exc_info=True)
145
+ raise
146
+ return cls
147
+
148
+
149
+ class Exit:
150
+
151
+ sw_critical: bool = False
152
+ sw_stop: bool = False
153
+ sw_interactive: bool = False
154
+
155
+
156
+ class Com:
157
+ """Communication Class
158
+ """
159
+
160
+ sw_init: bool = False
161
+ cfg: TN_Dic = None
162
+ pid = None
163
+ pacmod_curr: T_Dic = {}
164
+
165
+ ts_start: None | datetime = None
166
+ ts_end: None | datetime = None
167
+ ts_etime: None | datetime = None
168
+ d_timer: Dict = {}
169
+
170
+ Log: Logger = logging.getLogger('dummy_logger')
171
+ App = None
172
+ Exit = Exit
173
+
174
+ @classmethod
175
+ def init(cls, **kwargs):
176
+ """ set log and application (module) configuration
177
+ """
178
+ if cls.sw_init:
179
+ return
180
+ cls.sw_init = True
181
+
182
+ cls.pacmod_curr = kwargs.get('pacmod_curr')
183
+ cls.ts_start = calendar.timegm(time.gmtime())
184
+ cls.pid = os.getpid()
185
+
186
+ cls.cfg = Cfg.init(cls.pacmod_curr)
187
+ cls.Log = StandardLog.init(**kwargs)
188
+ cls.App = App.init(**kwargs)
189
+
190
+ # @classmethod
191
+ # def terminate(cls):
192
+ # """ set log and application (module) configuration
193
+ # """
194
+ # cls.Log = StandardLog.log
195
+ # cls.ts_end = calendar.timegm(time.gmtime())
196
+ # cls.ts_etime = cls.ts_end - cls.ts_start
File without changes
@@ -0,0 +1,86 @@
1
+ version: 1
2
+
3
+ disable_existing_loggers: False
4
+
5
+ # root:
6
+ # level: DEBUG
7
+ # handlers:
8
+ # - debug_console
9
+ # - debug_file
10
+
11
+ loggers:
12
+
13
+ # main logger
14
+ main:
15
+ # level: NOTSET
16
+ level: DEBUG
17
+ handlers:
18
+ - main_debug_console
19
+ - main_debug_file
20
+ - main_info_file
21
+ - main_error_file
22
+
23
+ handlers:
24
+
25
+ main_debug_console:
26
+ class: 'logging.StreamHandler'
27
+ level: DEBUG
28
+ formatter: main_debug
29
+ stream: 'ext://sys.stderr'
30
+
31
+ # main_info_rotating_file_handler:
32
+ # class: 'logging.handlers.RotatingFileHandler'
33
+ # level: INFO
34
+ # formatter: info
35
+ # filename: 'info.rotating.log'
36
+ # mode: 'a'
37
+ # maxBytes: 1048576 # 1MB
38
+ # backupCount: 10
39
+ # encoding: utf8
40
+
41
+ main_debug_file:
42
+ class: 'logging.FileHandler'
43
+ level: DEBUG
44
+ formatter: main_error
45
+ filename: '/data/{{tenant}}/RUN/{{package}}/{{module}}/debs/debs_{{pid}}_{{ts}}.log'
46
+ mode: 'a'
47
+
48
+ main_info_file:
49
+ class: 'logging.FileHandler'
50
+ level: INFO
51
+ formatter: main_info
52
+ filename: '/data/{{tenant}}/RUN/{{package}}/{{module}}/logs/logs_{{pid}}_{{ts}}.log'
53
+ mode: 'a'
54
+
55
+ main_error_file:
56
+ class: 'logging.FileHandler'
57
+ level: ERROR
58
+ formatter: main_error
59
+ filename: '/data/{{tenant}}/RUN/{{package}}/{{module}}/errs/errs_{{pid}}_{{ts}}.log'
60
+ mode: 'a'
61
+
62
+ main_critical_mail:
63
+ class: 'logging.handlers.SMTPHandler'
64
+ level: CRITICAL
65
+ formatter: main_critical
66
+ mailhost : localhost
67
+ fromaddr: 'monitoring@domain.com'
68
+ toaddrs:
69
+ - 'dev@domain.com'
70
+ - 'qa@domain.com'
71
+ subject: 'Critical error with application name'
72
+
73
+
74
+ formatters:
75
+
76
+ main_info:
77
+ format: '%(asctime)s-%(levelname)s-%(name)s::%(module)s|%(lineno)s:: %(message)s'
78
+ main_debug:
79
+ format: '%(asctime)-15s %(levelname)s-%(name)s-%(process)d::%(module)s.%(funcName)s|%(lineno)s:: %(message)s'
80
+ datefmt: '%Y-%m-%d %H:%M:%S'
81
+ main_error:
82
+ format: '%(asctime)-15s %(levelname)s-%(name)s-%(process)d::%(module)s.%(funcName)s|%(lineno)s:: %(message)s'
83
+ datefmt: '%Y-%m-%d %H:%M:%S'
84
+ main_critical:
85
+ format: '%(asctime)-15s %(levelname)s-%(name)s-%(process)d::%(module)s.%(funcName)s|%(lineno)s:: %(message)s'
86
+ datefmt: '%Y-%m-%d %H:%M:%S'
@@ -0,0 +1,86 @@
1
+ version: 1
2
+
3
+ disable_existing_loggers: False
4
+
5
+ # root:
6
+ # level: DEBUG
7
+ # handlers:
8
+ # - debug_console
9
+ # - debug_file
10
+
11
+ loggers:
12
+
13
+ # main logger
14
+ main:
15
+ # level: NOTSET
16
+ level: DEBUG
17
+ handlers:
18
+ - main_debug_console
19
+ - main_debug_file
20
+ - main_info_file
21
+ - main_error_file
22
+
23
+ handlers:
24
+
25
+ main_debug_console:
26
+ class: 'logging.StreamHandler'
27
+ level: DEBUG
28
+ formatter: main_debug
29
+ stream: 'ext://sys.stderr'
30
+
31
+ # main_info_rotating_file_handler:
32
+ # class: 'logging.handlers.RotatingFileHandler'
33
+ # level: INFO
34
+ # formatter: info
35
+ # filename: 'info.rotating.log'
36
+ # mode: 'a'
37
+ # maxBytes: 1048576 # 1MB
38
+ # backupCount: 10
39
+ # encoding: utf8
40
+
41
+ main_debug_file:
42
+ class: 'logging.FileHandler'
43
+ level: DEBUG
44
+ formatter: main_error
45
+ filename: '/data/{{tenant}}/RUN/{{package}}/{{module}}/debs/debs_{{pid}}_{{ts}}.log'
46
+ mode: 'a'
47
+
48
+ main_info_file:
49
+ class: 'logging.FileHandler'
50
+ level: INFO
51
+ formatter: main_info
52
+ filename: '/data/{{tenant}}/RUN/{{package}}/{{module}}/logs/logs_{{pid}}_{{ts}}.log'
53
+ mode: 'a'
54
+
55
+ main_error_file:
56
+ class: 'logging.FileHandler'
57
+ level: ERROR
58
+ formatter: main_error
59
+ filename: '/data/{{tenant}}/RUN/{{package}}/{{module}}/errs/errs_{{pid}}_{{ts}}.log'
60
+ mode: 'a'
61
+
62
+ main_critical_mail:
63
+ class: 'logging.handlers.SMTPHandler'
64
+ level: CRITICAL
65
+ formatter: main_critical
66
+ mailhost : localhost
67
+ fromaddr: 'monitoring@domain.com'
68
+ toaddrs:
69
+ - 'dev@domain.com'
70
+ - 'qa@domain.com'
71
+ subject: 'Critical error with application name'
72
+
73
+
74
+ formatters:
75
+
76
+ main_info:
77
+ format: '%(asctime)s-%(levelname)s-%(name)s::%(module)s|%(lineno)s:: %(message)s'
78
+ main_debug:
79
+ format: '%(asctime)-15s %(levelname)s-%(name)s-%(process)d::%(module)s.%(funcName)s|%(lineno)s:: %(message)s'
80
+ datefmt: '%Y-%m-%d %H:%M:%S'
81
+ main_error:
82
+ format: '%(asctime)-15s %(levelname)s-%(name)s-%(process)d::%(module)s.%(funcName)s|%(lineno)s:: %(message)s'
83
+ datefmt: '%Y-%m-%d %H:%M:%S'
84
+ main_critical:
85
+ format: '%(asctime)-15s %(levelname)s-%(name)s-%(process)d::%(module)s.%(funcName)s|%(lineno)s:: %(message)s'
86
+ datefmt: '%Y-%m-%d %H:%M:%S'
@@ -0,0 +1,93 @@
1
+ version: 1
2
+
3
+ disable_existing_loggers: False
4
+
5
+ root:
6
+ level: DEBUG
7
+ handlers:
8
+ - debug_console
9
+ - debug_file
10
+
11
+ loggers:
12
+
13
+ # main logger
14
+ main:
15
+ level: 'NOTSET'
16
+ handlers:
17
+ - debug_console
18
+ - debug_file
19
+ - info_file
20
+ - error_file
21
+
22
+ # person logger
23
+ person:
24
+ level: NOTSET
25
+ handlers:
26
+ - debug_console
27
+ - debug_file
28
+ - info_file
29
+ - error_file
30
+
31
+ handlers:
32
+
33
+ debug_console:
34
+ class: 'logging.StreamHandler'
35
+ level: DEBUG
36
+ formatter: debug
37
+ stream: 'ext://sys.stderr'
38
+
39
+ debug_file:
40
+ class: 'logging.FileHandler'
41
+ level: DEBUG
42
+ formatter: error
43
+ filename: 'debug.log'
44
+ mode: 'a'
45
+
46
+ # info_rotating_file_handler:
47
+ # class: 'logging.handlers.RotatingFileHandler'
48
+ # level: INFO
49
+ # formatter: info
50
+ # filename: 'info.rotating.log'
51
+ # mode: 'a'
52
+ # maxBytes: 1048576 # 1MB
53
+ # backupCount: 10
54
+ # encoding: utf8
55
+
56
+ info_file:
57
+ class: 'logging.FileHandler'
58
+ level: INFO
59
+ formatter: info
60
+ filename: 'info.log'
61
+ mode: 'a'
62
+
63
+ error_file:
64
+ class: 'logging.FileHandler'
65
+ level: ERROR
66
+ formatter: error
67
+ filename: 'error.log'
68
+ mode: 'a'
69
+
70
+ critical_mail:
71
+ class: 'logging.handlers.SMTPHandler'
72
+ level: CRITICAL
73
+ formatter: critical
74
+ mailhost : localhost
75
+ fromaddr: 'monitoring@domain.com'
76
+ toaddrs:
77
+ - 'dev@domain.com'
78
+ - 'qa@domain.com'
79
+ subject: 'Critical error with application name'
80
+
81
+ formatters:
82
+
83
+ info:
84
+ format: '%(asctime)s-%(levelname)s-%(name)s::%(module)s|%(lineno)s:: %(message)s'
85
+ debug:
86
+ format: '%(asctime)-15s %(levelname)s-%(name)s-%(process)d::%(module)s.%(funcName)s|%(lineno)s:: %(message)s'
87
+ datefmt: '%Y-%m-%d %H:%M:%S'
88
+ error:
89
+ format: '%(asctime)-15s %(levelname)s-%(name)s-%(process)d::%(module)s.%(funcName)s|%(lineno)s:: %(message)s'
90
+ datefmt: '%Y-%m-%d %H:%M:%S'
91
+ critical:
92
+ format: '%(asctime)-15s %(levelname)s-%(name)s-%(process)d::%(module)s.%(funcName)s|%(lineno)s:: %(message)s'
93
+ datefmt: '%Y-%m-%d %H:%M:%S'
@@ -0,0 +1,55 @@
1
+ # coding=utf-8
2
+
3
+ import jinja2
4
+ import os
5
+ import yaml
6
+
7
+ from typing import Any, Dict
8
+
9
+ T_Dic = Dict[Any, Any]
10
+
11
+ TN_Any = None | Any
12
+
13
+
14
+ class Yaml:
15
+
16
+ """ Manage Object to Yaml file affilitation
17
+ """
18
+ @staticmethod
19
+ def load_with_safeloader(string: str) -> None | Any:
20
+ return yaml.load(string, Loader=yaml.SafeLoader)
21
+
22
+ @staticmethod
23
+ def read(path: str) -> TN_Any:
24
+ with open(path) as fd:
25
+ # The Loader parameter handles the conversion from YAML
26
+ # scalar values to Python object format
27
+ return yaml.load(fd, Loader=yaml.SafeLoader)
28
+ return None
29
+
30
+
31
+ class Jinja2:
32
+ """ Manage Object to Json file affilitation
33
+ """
34
+ @staticmethod
35
+ def read_template(
36
+ path: str) -> Any:
37
+ dir, file = os.path.split(path)
38
+ env = jinja2.Environment(loader=jinja2.FileSystemLoader(dir))
39
+ return env.get_template(file)
40
+
41
+ @classmethod
42
+ def read(
43
+ cls, path: str, **kwargs):
44
+ try:
45
+ # read jinja template from file
46
+ template = cls.read_template(path)
47
+
48
+ # render template as yaml string
49
+ template_rendered = template.render(**kwargs)
50
+
51
+ # parse yaml string as dictionary
52
+ dic = Yaml.load_with_safeloader(template_rendered)
53
+ return dic
54
+ except Exception:
55
+ raise
@@ -0,0 +1,82 @@
1
+ from ka_uts_com.com import Com
2
+
3
+ from typing import Any, Callable
4
+
5
+
6
+ # class Eq:
7
+ # """ Manage Equate Class
8
+ # """
9
+ # @staticmethod
10
+ # def sh(key: Any, value: Any) -> str:
11
+ # """ Show Key, Value as Equate
12
+ # """
13
+ # return f"{key} = {value}"
14
+
15
+
16
+ class Log:
17
+ """Logging Class
18
+ """
19
+
20
+ class Eq:
21
+
22
+ @staticmethod
23
+ def sh(key: Any, value: Any) -> str:
24
+ """ Show Key, Value as Equate
25
+ """
26
+ return f"{key} = {value}"
27
+
28
+ @classmethod
29
+ def debug(cls, key: Any, value: Any) -> None:
30
+ Log.debug(cls.sh(key, value), stacklevel=3)
31
+
32
+ @classmethod
33
+ def error(cls, key: Any, value: Any) -> None:
34
+ Log.error(cls.sh(key, value), stacklevel=3)
35
+
36
+ @classmethod
37
+ def info(cls, key: Any, value: Any) -> None:
38
+ Log.info(cls.sh(key, value), stacklevel=3)
39
+
40
+ @classmethod
41
+ def warning(cls, key: Any, value: Any) -> None:
42
+ Log.warning(cls.sh(key, value), stacklevel=3)
43
+
44
+ @staticmethod
45
+ def debug(*args, **kwargs) -> None:
46
+ if kwargs is None:
47
+ kwargs = {}
48
+ kwargs['stacklevel'] = kwargs.get('stacklevel', 2)
49
+ fnc_debug: Callable = Com.Log.debug
50
+ fnc_debug(*args, **kwargs)
51
+
52
+ @staticmethod
53
+ def error(*args, **kwargs) -> None:
54
+ if kwargs is None:
55
+ kwargs = {}
56
+ kwargs['stacklevel'] = kwargs.get('stacklevel', 2)
57
+ fnc_error: Callable = Com.Log.error
58
+ fnc_error(*args, **kwargs)
59
+
60
+ @staticmethod
61
+ def info(*args, **kwargs) -> None:
62
+ if kwargs is None:
63
+ kwargs = {}
64
+ kwargs['stacklevel'] = kwargs.get('stacklevel', 2)
65
+ fnc_info: Callable = Com.Log.info
66
+ fnc_info(*args, **kwargs)
67
+
68
+ @staticmethod
69
+ def warning(*args, **kwargs) -> None:
70
+ if kwargs is None:
71
+ kwargs = {}
72
+ kwargs['stacklevel'] = kwargs.get('stacklevel', 2)
73
+ fnc_warning: Callable = Com.Log.warning
74
+ fnc_warning(*args, **kwargs)
75
+
76
+ # @staticmethod
77
+ # def finished(*args, **kwargs) -> None:
78
+ # msg_finished: str = Com.cfg.profs.msgs.finished
79
+ # Com.Log.info(msg_finished)
80
+ # msg_etime: str = Com.cfg.profs.msgs.etime
81
+ # msg_etime = msg_etime.format(etime=Com.ts_etime)
82
+ # Com.Log.info(msg_profile)