logger-36 2024.4__py3-none-any.whl → 2024.6__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.
@@ -56,6 +56,21 @@ from rich.console import Console as console_t
56
56
  from rich.console import RenderableType as renderable_t
57
57
  from rich.markup import escape as EscapedForRich
58
58
  from rich.text import Text as text_t
59
+ from rich.traceback import install as InstallTracebackHandler
60
+
61
+
62
+ _COMMON_TRACEBACK_ARGUMENTS = ("theme", "width")
63
+ _EXCLUSIVE_TRACEBACK_ARGUMENTS = (
64
+ "extra_lines",
65
+ "indent_guides",
66
+ "locals_hide_dunder",
67
+ "locals_hide_sunder",
68
+ "locals_max_length",
69
+ "locals_max_string",
70
+ "max_frames" "show_locals",
71
+ "suppress",
72
+ "word_wrap",
73
+ )
59
74
 
60
75
 
61
76
  @dtcl.dataclass(slots=True, repr=False, eq=False)
@@ -69,6 +84,7 @@ class console_rich_handler_t(lggg.Handler):
69
84
  show_where: dtcl.InitVar[bool] = True
70
85
  show_memory_usage: dtcl.InitVar[bool] = False
71
86
  formatter: dtcl.InitVar[lggg.Formatter | None] = None
87
+ should_install_traceback: dtcl.InitVar[bool] = False
72
88
 
73
89
  rich_kwargs: dtcl.InitVar[dict[str, h.Any] | None] = None
74
90
 
@@ -79,6 +95,7 @@ class console_rich_handler_t(lggg.Handler):
79
95
  show_where: bool,
80
96
  show_memory_usage: bool,
81
97
  formatter: lggg.Formatter | None,
98
+ should_install_traceback: bool,
82
99
  rich_kwargs: dict[str, h.Any] | None,
83
100
  ) -> None:
84
101
  """"""
@@ -94,13 +111,27 @@ class console_rich_handler_t(lggg.Handler):
94
111
  )
95
112
 
96
113
  if rich_kwargs is None:
97
- rich_kwargs = {}
114
+ rich_console_kwargs = {}
115
+ else:
116
+ rich_console_kwargs = rich_kwargs
117
+ rich_traceback_kwargs = {}
118
+ if should_install_traceback:
119
+ for key in rich_console_kwargs:
120
+ if key in _COMMON_TRACEBACK_ARGUMENTS:
121
+ rich_traceback_kwargs[key] = rich_console_kwargs[key]
122
+ elif key in _EXCLUSIVE_TRACEBACK_ARGUMENTS:
123
+ rich_traceback_kwargs[key] = rich_console_kwargs[key]
124
+ del rich_console_kwargs[key]
125
+
98
126
  self.console = console_t(
99
127
  highlight=False,
100
128
  force_terminal=True,
101
129
  record=True,
102
- **rich_kwargs,
130
+ **rich_console_kwargs,
103
131
  )
132
+ if should_install_traceback:
133
+ rich_traceback_kwargs["console"] = self.console
134
+ InstallTracebackHandler(**rich_traceback_kwargs)
104
135
 
105
136
  self.FormattedLines = self.extension.FormattedLines
106
137
 
logger_36/main.py CHANGED
@@ -61,6 +61,7 @@ def AddGenericHandler(
61
61
  interface: interface_h,
62
62
  /,
63
63
  *,
64
+ logger: lggg.Logger | None = None,
64
65
  name: str | None = None,
65
66
  level: int = lggg.INFO,
66
67
  show_where: bool = True,
@@ -71,6 +72,9 @@ def AddGenericHandler(
71
72
  **kwargs,
72
73
  ) -> None:
73
74
  """"""
75
+ if logger is None:
76
+ logger = LOGGER
77
+
74
78
  handler = generic_handler_t(
75
79
  name=name,
76
80
  level=level,
@@ -81,11 +85,12 @@ def AddGenericHandler(
81
85
  rich_kwargs=kwargs,
82
86
  interface=interface,
83
87
  )
84
- LOGGER.AddHandler(handler, should_hold_messages)
88
+ logger.AddHandler(handler, should_hold_messages)
85
89
 
86
90
 
87
91
  def AddConsoleHandler(
88
92
  *,
93
+ logger: lggg.Logger | None = None,
89
94
  name: str | None = None,
90
95
  level: int = lggg.INFO,
91
96
  show_where: bool = True,
@@ -94,6 +99,9 @@ def AddConsoleHandler(
94
99
  should_hold_messages: bool = False,
95
100
  ) -> None:
96
101
  """"""
102
+ if logger is None:
103
+ logger = LOGGER
104
+
97
105
  handler = console_handler_t(
98
106
  name=name,
99
107
  level=level,
@@ -101,17 +109,19 @@ def AddConsoleHandler(
101
109
  show_memory_usage=show_memory_usage,
102
110
  formatter=formatter,
103
111
  )
104
- LOGGER.AddHandler(handler, should_hold_messages)
112
+ logger.AddHandler(handler, should_hold_messages)
105
113
 
106
114
 
107
115
  def AddRichConsoleHandler(
108
116
  *,
117
+ logger: lggg.Logger | None = None,
109
118
  name: str | None = None,
110
119
  level: int = lggg.INFO,
111
120
  show_where: bool = True,
112
121
  show_memory_usage: bool = False,
113
122
  formatter: lggg.Formatter | None = None,
114
123
  should_hold_messages: bool = False,
124
+ should_install_traceback: bool = False,
115
125
  **kwargs,
116
126
  ) -> None:
117
127
  """"""
@@ -120,21 +130,26 @@ def AddRichConsoleHandler(
120
130
  print(_RICH_ERROR, file=sstm.stderr)
121
131
  _RICH_ERROR = None
122
132
 
133
+ if logger is None:
134
+ logger = LOGGER
135
+
123
136
  handler = console_rich_handler_t(
124
137
  name=name,
125
138
  level=level,
126
139
  show_where=show_where,
127
140
  show_memory_usage=show_memory_usage,
128
141
  formatter=formatter,
142
+ should_install_traceback=should_install_traceback,
129
143
  rich_kwargs=kwargs,
130
144
  )
131
- LOGGER.AddHandler(handler, should_hold_messages)
145
+ logger.AddHandler(handler, should_hold_messages)
132
146
 
133
147
 
134
148
  def AddFileHandler(
135
149
  path: str | path_t,
136
150
  /,
137
151
  *args,
152
+ logger: lggg.Logger | None = None,
138
153
  name: str | None = None,
139
154
  level: int = lggg.INFO,
140
155
  show_where: bool = True,
@@ -148,6 +163,8 @@ def AddFileHandler(
148
163
  path = path_t(path)
149
164
  if path.exists():
150
165
  raise ValueError(f"File or folder already exists: {path}.")
166
+ if logger is None:
167
+ logger = LOGGER
151
168
 
152
169
  handler = file_handler_t(
153
170
  name=name,
@@ -159,16 +176,25 @@ def AddFileHandler(
159
176
  handler_args=args,
160
177
  handler_kwargs=kwargs,
161
178
  )
162
- LOGGER.AddHandler(handler, should_hold_messages)
179
+ logger.AddHandler(handler, should_hold_messages)
163
180
 
164
181
 
165
- def SetLOGLevel(level: int, /, *, which: handler_codes_h | str = "a") -> None:
182
+ def SetLOGLevel(
183
+ level: int,
184
+ /,
185
+ *,
186
+ logger: lggg.Logger | None = None,
187
+ which: handler_codes_h | str = "a",
188
+ ) -> None:
166
189
  """
167
190
  which: g=generic, c=console, f=file, a=all, str=name.
168
191
  """
192
+ if logger is None:
193
+ logger = LOGGER
194
+
169
195
  which_is_name = which not in HANDLER_CODES
170
196
  found = False
171
- for handler in LOGGER.handlers:
197
+ for handler in logger.handlers:
172
198
  if (
173
199
  (which == "a")
174
200
  or ((which == "g") and isinstance(handler, generic_handler_t))
logger_36/type/logger.py CHANGED
@@ -296,17 +296,16 @@ class logger_t(lggg.Logger):
296
296
  issues = sorted(self.staged_issues, key=lambda _elm: _elm.context)
297
297
  issues = "\n".join(issues)
298
298
 
299
- if issubclass(level, Exception):
299
+ if isinstance(level, type) and issubclass(level, Exception):
300
300
  try:
301
301
  raise level("\n" + issues)
302
302
  except Exception as exception:
303
- traceback = "Traceback (most recent call last):\n" + "\n".join(
304
- tbck.format_stack()[:-1]
305
- )
306
- print(traceback[:-1], file=sstm.stderr)
307
- print(
308
- "\n".join(tbck.format_exception_only(exception)), file=sstm.stderr
309
- )
303
+ lines = ["Traceback (most recent call last):"] + tbck.format_stack()[
304
+ :-1
305
+ ]
306
+ lines[-1] = lines[-1][:-1]
307
+ lines.extend(tbck.format_exception_only(exception))
308
+ print("\n".join(lines), file=sstm.stderr)
310
309
  sstm.exit(1)
311
310
 
312
311
  self.log(level, issues, **HIDE_WHERE_KWARG)
logger_36/version.py CHANGED
@@ -29,4 +29,4 @@
29
29
  # The fact that you are presently reading this means that you have had
30
30
  # knowledge of the CeCILL license and that you accept its terms.
31
31
 
32
- __version__ = "2024.4"
32
+ __version__ = "2024.6"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: logger-36
3
- Version: 2024.4
3
+ Version: 2024.6
4
4
  Summary: Simple logger with a catalog of handlers
5
5
  Home-page: https://src.koda.cnrs.fr/eric.debreuve/logger-36/
6
6
  Author: Eric Debreuve
@@ -12,8 +12,8 @@ Keywords: log,warning,error
12
12
  Classifier: Topic :: Software Development
13
13
  Classifier: Intended Audience :: Developers
14
14
  Classifier: License :: OSI Approved :: CEA CNRS Inria Logiciel Libre License, version 2.1 (CeCILL-2.1)
15
- Classifier: Programming Language :: Python :: 3.10
16
- Classifier: Development Status :: 4 - Beta
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Development Status :: 5 - Production/Stable
17
17
  Requires-Python: >=3.10
18
18
  Description-Content-Type: text/x-rst
19
19
 
@@ -1,10 +1,10 @@
1
1
  logger_36/__init__.py,sha256=-VGyte6TD6SWU4jBXUjur_xU1R1Asha5KXEwDNmGJ6Q,1756
2
2
  logger_36/instance.py,sha256=NQlDAyXV3TNekX9xj9V7JMePmsa2DWnTDaVzh5dcyGM,1616
3
- logger_36/main.py,sha256=hj3hctMBHJbPWw1078tJ_zOU-6-kEGCzMgHwpWY5ElA,6134
4
- logger_36/version.py,sha256=b61fTunI_uzuupVlwY9m5iA0uH2qcxIRpuMvNp6g3BQ,1575
3
+ logger_36/main.py,sha256=kdv79ZTpapb9ltLoKfSfR89CdPxDlizUJs6IctSRTqE,6690
4
+ logger_36/version.py,sha256=4cJ_wNkTKxQDHDz6-DuN3-53TI6P_28cAcNpeuDUmCQ,1575
5
5
  logger_36/catalog/config/console_rich.py,sha256=jJnYXPDsMCTu8zny2X3NdeyKFCfhJupberqIBxyv3LA,2030
6
6
  logger_36/catalog/handler/console.py,sha256=PnaCWJsXN-x_-X8i-4o4HWys-7K0A83s4kIdtmDz3AQ,3092
7
- logger_36/catalog/handler/console_rich.py,sha256=YqKyKwHoYCEVnW1S87NDu3ReTCIzSdYgC-20-813TFQ,5395
7
+ logger_36/catalog/handler/console_rich.py,sha256=pTczLjsEB78DT4ph57yLeQKPTcJVXpc3Q99d_I4YOk0,6512
8
8
  logger_36/catalog/handler/file.py,sha256=BAxA-ZQAikmH0R9Ia3mbSXf-Z60-FfA4ElOVjjmanS0,3507
9
9
  logger_36/catalog/handler/generic.py,sha256=1pAmP5vOxBPWhpqoBRDNIc3q14dIDsj7JbX-VqcgUbM,5931
10
10
  logger_36/catalog/logging/chronos.py,sha256=5SWyRUhwwKeJg3NPf9jkCqtKc7b_4x58Slbq2iMA8kE,1814
@@ -32,8 +32,8 @@ logger_36/task/measure/chronos.py,sha256=qT80jxZm_dAg2P4WkfU0L3PRvRojT21Ps3DtNYq
32
32
  logger_36/task/measure/memory.py,sha256=1f1X-XHd_58LJYJ0Ok5TGIagnf0k5F39IFqWHN2Ojas,1874
33
33
  logger_36/type/extension.py,sha256=fsYx0wT1bR6DtpM2VnaxsM0MFv2vBLROgRSCs4duasY,5198
34
34
  logger_36/type/issue.py,sha256=T1WFtc8Js1OChYkIHQiOP825Dcb9atpEprLWaPTxAHA,2151
35
- logger_36/type/logger.py,sha256=jCmY-pxPT-4XLUpBNd81mPHasJZNVl5CaLEjLZyrCco,12731
36
- logger_36-2024.4.dist-info/METADATA,sha256=_zL8RSuzNN7ruojiwBQol923L0t0oTZ9pcrGc1ELvtc,4236
37
- logger_36-2024.4.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
38
- logger_36-2024.4.dist-info/top_level.txt,sha256=sM95BTMWmslEEgR_1pzwZsOeSp8C_QBiu8ImbFr0XLc,10
39
- logger_36-2024.4.dist-info/RECORD,,
35
+ logger_36/type/logger.py,sha256=t1pXc82F8wF-g-qyh7VxyoFBp0MKgtpOoyDznem9L6Q,12729
36
+ logger_36-2024.6.dist-info/METADATA,sha256=HPZZUBLa9QTUkXToFVDxwVGXx47snsdOQ1BUwxX0xdM,4246
37
+ logger_36-2024.6.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
38
+ logger_36-2024.6.dist-info/top_level.txt,sha256=sM95BTMWmslEEgR_1pzwZsOeSp8C_QBiu8ImbFr0XLc,10
39
+ logger_36-2024.6.dist-info/RECORD,,