nuclear 2.2.3__tar.gz → 2.2.5__tar.gz
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.
- {nuclear-2.2.3 → nuclear-2.2.5}/PKG-INFO +1 -1
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/sublog/logging.py +34 -14
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/utils/collections.py +7 -0
- nuclear-2.2.5/nuclear/version.py +1 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear.egg-info/PKG-INFO +1 -1
- nuclear-2.2.3/nuclear/version.py +0 -1
- {nuclear-2.2.3 → nuclear-2.2.5}/LICENSE +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/README.md +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/__init__.py +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/__init__.py +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/args/__init__.py +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/args/args_que.py +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/args/container.py +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/autocomplete/__init__.py +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/autocomplete/autocomplete.py +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/autocomplete/install.py +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/builder/__init__.py +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/builder/builder.py +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/builder/decorator_builder.py +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/builder/rule.py +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/builder/rule_factory.py +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/builder/typedef.py +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/completers/__init__.py +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/completers/file.py +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/help.py +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/parser/__init__.py +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/parser/context.py +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/parser/error.py +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/parser/inject.py +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/parser/internal_vars.py +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/parser/keyword.py +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/parser/matcher.py +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/parser/parser.py +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/parser/transform.py +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/parser/validate.py +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/parser/value.py +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/types/__init__.py +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/types/boolean.py +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/types/filesystem.py +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/types/time.py +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/inspection/__init__.py +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/inspection/inspection.py +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/py.typed +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/shell/__init__.py +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/shell/background_cmd.py +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/shell/shell_utils.py +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/sublog/__init__.py +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/sublog/catch.py +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/sublog/context_error.py +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/sublog/exception.py +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/utils/__init__.py +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/utils/config.py +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/utils/datamodel.py +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/utils/env.py +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/utils/files.py +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/utils/functools.py +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/utils/input.py +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/utils/regex.py +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/utils/strings.py +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/utils/time.py +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/utils/url.py +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear.egg-info/SOURCES.txt +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear.egg-info/dependency_links.txt +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear.egg-info/requires.txt +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/nuclear.egg-info/top_level.txt +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/setup.cfg +0 -0
- {nuclear-2.2.3 → nuclear-2.2.5}/setup.py +0 -0
|
@@ -12,7 +12,7 @@ from colorama import init, Fore, Style
|
|
|
12
12
|
|
|
13
13
|
from nuclear.sublog.context_error import ContextError
|
|
14
14
|
from nuclear.sublog.exception import extended_exception_details
|
|
15
|
-
from nuclear.utils.collections import
|
|
15
|
+
from nuclear.utils.collections import coalesce
|
|
16
16
|
from nuclear.utils.env import is_env_flag_enabled
|
|
17
17
|
from nuclear.utils.strings import strip_ansi_colors
|
|
18
18
|
|
|
@@ -22,16 +22,22 @@ LOG_DATE_FORMAT_UTC = r'%Y-%m-%d %H:%M:%SZ'
|
|
|
22
22
|
ISO_DATE_FORMAT = r'%Y-%m-%dT%H:%M:%S.%fZ'
|
|
23
23
|
LOGGING_LOGGER_NAME = 'nuclear.sublog'
|
|
24
24
|
|
|
25
|
-
log_level: str = os.environ.get('NUCLEAR_LOG_LEVEL', 'debug')
|
|
26
|
-
log_level_show: bool = is_env_flag_enabled('NUCLEAR_LOG_LEVEL_SHOW', 'true')
|
|
27
|
-
log_time_show: bool = is_env_flag_enabled('NUCLEAR_LOG_TIME', 'true')
|
|
28
25
|
simultaneous_print_lock = threading.Lock()
|
|
29
26
|
_logging_logger: logging.Logger = logging.getLogger(LOGGING_LOGGER_NAME)
|
|
30
27
|
_log_state = {'init': False}
|
|
31
28
|
|
|
32
29
|
|
|
33
|
-
def init_logs(
|
|
34
|
-
|
|
30
|
+
def init_logs(
|
|
31
|
+
show_time: Optional[bool] = None,
|
|
32
|
+
show_log_level: Optional[bool] = None,
|
|
33
|
+
):
|
|
34
|
+
"""
|
|
35
|
+
Configure loggers: formatters, handlers and log levels
|
|
36
|
+
:param show_time: True to display formatted time in each log message,
|
|
37
|
+
False to turn it off, None to use the default
|
|
38
|
+
:param show_log_level: True to display log level in each log message,
|
|
39
|
+
False to turn it off, None to use the default
|
|
40
|
+
"""
|
|
35
41
|
logging_kwargs: Dict[str, Any] = {
|
|
36
42
|
'stream': sys.stdout,
|
|
37
43
|
'format': LOG_FORMAT,
|
|
@@ -46,16 +52,24 @@ def init_logs():
|
|
|
46
52
|
for handler in logging.getLogger().handlers:
|
|
47
53
|
handler.setFormatter(StructuredFormatter())
|
|
48
54
|
else:
|
|
55
|
+
_show_log_time: bool = coalesce(show_time, is_env_flag_enabled('NUCLEAR_LOG_TIME', 'true'))
|
|
56
|
+
_show_log_level: bool = coalesce(show_log_level, is_env_flag_enabled('NUCLEAR_LOG_LEVEL_SHOW', 'true'))
|
|
49
57
|
logging.basicConfig(**logging_kwargs)
|
|
50
58
|
for handler in logging.getLogger().handlers:
|
|
51
|
-
handler.setFormatter(ColoredFormatter())
|
|
59
|
+
handler.setFormatter(ColoredFormatter(_show_log_time, _show_log_level))
|
|
52
60
|
|
|
61
|
+
log_level: str = os.environ.get('NUCLEAR_LOG_LEVEL', 'debug')
|
|
53
62
|
level = _get_logging_level(log_level)
|
|
54
63
|
root_logger = logging.getLogger(LOGGING_LOGGER_NAME)
|
|
55
64
|
root_logger.setLevel(level)
|
|
56
65
|
_log_state['init'] = True
|
|
57
66
|
|
|
58
67
|
|
|
68
|
+
def init_logs_once():
|
|
69
|
+
if not _log_state['init']:
|
|
70
|
+
init_logs()
|
|
71
|
+
|
|
72
|
+
|
|
59
73
|
def get_logger(logger_name: str) -> logging.Logger:
|
|
60
74
|
"""
|
|
61
75
|
Get configured child logger
|
|
@@ -150,8 +164,10 @@ def add_context(context_name: str, log: bool = False, **ctx):
|
|
|
150
164
|
|
|
151
165
|
|
|
152
166
|
class ColoredFormatter(logging.Formatter):
|
|
153
|
-
def __init__(self):
|
|
167
|
+
def __init__(self, log_time_show: bool, log_level_show: bool):
|
|
154
168
|
logging.Formatter.__init__(self)
|
|
169
|
+
self.log_level_show: bool = log_level_show
|
|
170
|
+
self.log_time_show: bool = log_time_show
|
|
155
171
|
|
|
156
172
|
log_level_templates = {
|
|
157
173
|
'CRITICAL': f'{Style.BRIGHT + Fore.RED}CRIT {Style.RESET_ALL}',
|
|
@@ -162,18 +178,22 @@ class ColoredFormatter(logging.Formatter):
|
|
|
162
178
|
}
|
|
163
179
|
|
|
164
180
|
def format(self, record: logging.LogRecord) -> str:
|
|
165
|
-
|
|
166
|
-
part_message = record.msg
|
|
181
|
+
parts: List[str] = []
|
|
167
182
|
part_time = self.format_time()
|
|
168
|
-
|
|
183
|
+
if part_time:
|
|
184
|
+
parts.append(part_time)
|
|
185
|
+
if self.log_level_show:
|
|
186
|
+
part_levelname = self.log_level_templates.get(record.levelname, record.levelname)
|
|
187
|
+
parts.append(part_levelname)
|
|
188
|
+
log_message: str = record.getMessage()
|
|
189
|
+
parts.append(log_message)
|
|
169
190
|
line = ' '.join(parts)
|
|
170
191
|
if not sys.stdout.isatty():
|
|
171
192
|
line = strip_ansi_colors(line)
|
|
172
193
|
return line
|
|
173
194
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
if not log_time_show:
|
|
195
|
+
def format_time(self) -> Optional[str]:
|
|
196
|
+
if not self.log_time_show:
|
|
177
197
|
return None
|
|
178
198
|
now_tz = datetime.now().astimezone()
|
|
179
199
|
if time.timezone == 0:
|
|
@@ -46,3 +46,10 @@ def flatten(collection: Iterable[Union[T, List[T]]]) -> List[T]:
|
|
|
46
46
|
|
|
47
47
|
def filter_not_none(items: List[Optional[T]]) -> List[T]:
|
|
48
48
|
return [item for item in items if item is not None]
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def coalesce(*items: Optional[T]) -> T:
|
|
52
|
+
for item in items:
|
|
53
|
+
if item is not None:
|
|
54
|
+
return item
|
|
55
|
+
raise ValueError('all items are None')
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "2.2.5"
|
nuclear-2.2.3/nuclear/version.py
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "2.2.3"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|