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.
Files changed (67) hide show
  1. {nuclear-2.2.3 → nuclear-2.2.5}/PKG-INFO +1 -1
  2. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/sublog/logging.py +34 -14
  3. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/utils/collections.py +7 -0
  4. nuclear-2.2.5/nuclear/version.py +1 -0
  5. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear.egg-info/PKG-INFO +1 -1
  6. nuclear-2.2.3/nuclear/version.py +0 -1
  7. {nuclear-2.2.3 → nuclear-2.2.5}/LICENSE +0 -0
  8. {nuclear-2.2.3 → nuclear-2.2.5}/README.md +0 -0
  9. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/__init__.py +0 -0
  10. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/__init__.py +0 -0
  11. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/args/__init__.py +0 -0
  12. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/args/args_que.py +0 -0
  13. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/args/container.py +0 -0
  14. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/autocomplete/__init__.py +0 -0
  15. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/autocomplete/autocomplete.py +0 -0
  16. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/autocomplete/install.py +0 -0
  17. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/builder/__init__.py +0 -0
  18. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/builder/builder.py +0 -0
  19. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/builder/decorator_builder.py +0 -0
  20. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/builder/rule.py +0 -0
  21. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/builder/rule_factory.py +0 -0
  22. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/builder/typedef.py +0 -0
  23. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/completers/__init__.py +0 -0
  24. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/completers/file.py +0 -0
  25. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/help.py +0 -0
  26. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/parser/__init__.py +0 -0
  27. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/parser/context.py +0 -0
  28. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/parser/error.py +0 -0
  29. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/parser/inject.py +0 -0
  30. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/parser/internal_vars.py +0 -0
  31. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/parser/keyword.py +0 -0
  32. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/parser/matcher.py +0 -0
  33. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/parser/parser.py +0 -0
  34. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/parser/transform.py +0 -0
  35. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/parser/validate.py +0 -0
  36. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/parser/value.py +0 -0
  37. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/types/__init__.py +0 -0
  38. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/types/boolean.py +0 -0
  39. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/types/filesystem.py +0 -0
  40. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/cli/types/time.py +0 -0
  41. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/inspection/__init__.py +0 -0
  42. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/inspection/inspection.py +0 -0
  43. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/py.typed +0 -0
  44. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/shell/__init__.py +0 -0
  45. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/shell/background_cmd.py +0 -0
  46. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/shell/shell_utils.py +0 -0
  47. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/sublog/__init__.py +0 -0
  48. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/sublog/catch.py +0 -0
  49. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/sublog/context_error.py +0 -0
  50. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/sublog/exception.py +0 -0
  51. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/utils/__init__.py +0 -0
  52. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/utils/config.py +0 -0
  53. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/utils/datamodel.py +0 -0
  54. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/utils/env.py +0 -0
  55. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/utils/files.py +0 -0
  56. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/utils/functools.py +0 -0
  57. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/utils/input.py +0 -0
  58. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/utils/regex.py +0 -0
  59. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/utils/strings.py +0 -0
  60. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/utils/time.py +0 -0
  61. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear/utils/url.py +0 -0
  62. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear.egg-info/SOURCES.txt +0 -0
  63. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear.egg-info/dependency_links.txt +0 -0
  64. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear.egg-info/requires.txt +0 -0
  65. {nuclear-2.2.3 → nuclear-2.2.5}/nuclear.egg-info/top_level.txt +0 -0
  66. {nuclear-2.2.3 → nuclear-2.2.5}/setup.cfg +0 -0
  67. {nuclear-2.2.3 → nuclear-2.2.5}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: nuclear
3
- Version: 2.2.3
3
+ Version: 2.2.5
4
4
  Summary: Declarative parser for command line interfaces
5
5
  Home-page: https://github.com/igrek51/nuclear
6
6
  Author: igrek51
@@ -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 filter_not_none
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
- """Configure loggers: formatters, handlers and log levels"""
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
- part_levelname = self.log_level_templates.get(record.levelname, record.levelname) if log_level_show else None
166
- part_message = record.msg
181
+ parts: List[str] = []
167
182
  part_time = self.format_time()
168
- parts: List[str] = filter_not_none([part_time, part_levelname, part_message])
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
- @staticmethod
175
- def format_time() -> Optional[str]:
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"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: nuclear
3
- Version: 2.2.3
3
+ Version: 2.2.5
4
4
  Summary: Declarative parser for command line interfaces
5
5
  Home-page: https://github.com/igrek51/nuclear
6
6
  Author: igrek51
@@ -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