logger-36 2025.19__py3-none-any.whl → 2025.20__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.
logger_36/type/handler.py CHANGED
@@ -82,8 +82,6 @@ class extension_t:
82
82
  if when_or_elapsed is None:
83
83
  return message, True
84
84
 
85
- level_first_letter = getattr(record, "level_first_letter", "")
86
-
87
85
  if (where := getattr(record, "where", None)) is None:
88
86
  where = ""
89
87
  else:
@@ -91,7 +89,7 @@ class extension_t:
91
89
 
92
90
  return (
93
91
  f"{when_or_elapsed}"
94
- f"{LEVEL_OPENING}{level_first_letter}{LEVEL_CLOSING} "
92
+ f"{LEVEL_OPENING}{record.levelname[0]}{LEVEL_CLOSING} "
95
93
  f"{MESSAGE_MARKER} {message}{where}"
96
94
  ), True
97
95
 
logger_36/type/logger.py CHANGED
@@ -38,12 +38,6 @@ from logger_36.constant.memory import UNKNOWN_MEMORY_USAGE
38
38
  from logger_36.constant.message import LINE_INDENT, TIME_LENGTH_m_1, expected_op_h
39
39
  from logger_36.constant.path import PROJECT_FILE_RELATIVE, USER_FOLDER
40
40
  from logger_36.constant.record import SHOW_W_RULE_ATTR, SHOW_WHERE_ATTR
41
- from logger_36.constant.rule import (
42
- DEFAULT_RULE,
43
- DEFAULT_RULE_LENGTH,
44
- MIN_HALF_RULE_LENGTH,
45
- RULE_CHARACTER,
46
- )
47
41
  from logger_36.task.format.message import MessageWithActualExpected
48
42
  from logger_36.task.measure.chronos import ElapsedTime
49
43
  from logger_36.task.measure.memory import CanCheckUsage as CanCheckMemoryUsage
@@ -171,6 +165,9 @@ class logger_t(base_t):
171
165
  self.setLevel(level_)
172
166
  self.propagate = False # Part of base_t.
173
167
 
168
+ if self.should_record_messages:
169
+ self.ActivateMessageRecording()
170
+
174
171
  for level_id in l.getLevelNamesMapping().values():
175
172
  self.events[level_id] = 0
176
173
 
@@ -184,9 +181,6 @@ class logger_t(base_t):
184
181
  if self.exit_on_error:
185
182
  self.exit_on_critical = True
186
183
 
187
- if self.should_record_messages:
188
- self.ActivateMessageRecording()
189
-
190
184
  if self.should_watch_memory_usage and not CanCheckMemoryUsage():
191
185
  self.should_watch_memory_usage = False
192
186
  if _MEMORY_MEASURE_ERROR is not None:
@@ -200,38 +194,10 @@ class logger_t(base_t):
200
194
  elapsed_time, now = ElapsedTime(should_return_now=True)
201
195
 
202
196
  if (self._on_hold.__len__() > 0) and not self._should_hold_messages:
203
- for held in self._on_hold:
204
- if self.should_record_messages:
205
- self.recorded.append(
206
- (
207
- held.levelno,
208
- self._recording_handler.MessageFromRecord(held)[0],
209
- )
210
- )
211
- base_t.handle(self, held)
212
- self._on_hold.clear()
197
+ self._FlushRecordsOnHold()
213
198
 
214
199
  if (date := now.date()) != self.last_message_date:
215
- self.last_message_date = date
216
- date_record = l.makeLogRecord(
217
- {
218
- "name": self.name,
219
- "levelno": l.INFO, # For management by logging.Logger.handle.
220
- "msg": f"DATE: {date.strftime(DATE_FORMAT)}",
221
- SHOW_W_RULE_ATTR: True,
222
- }
223
- )
224
- if self._should_hold_messages:
225
- self._on_hold.append(date_record)
226
- else:
227
- if self.should_record_messages:
228
- self.recorded.append(
229
- (
230
- date_record.levelno,
231
- self._recording_handler.MessageFromRecord(date_record)[0],
232
- )
233
- )
234
- base_t.handle(self, date_record)
200
+ self._AcknowledgeDateChange(date)
235
201
 
236
202
  # When.
237
203
  if now - self.last_message_now > LONG_ENOUGH:
@@ -259,9 +225,6 @@ class logger_t(base_t):
259
225
  else:
260
226
  where = None
261
227
 
262
- # How.
263
- record.level_first_letter = record.levelname[0]
264
-
265
228
  # What.
266
229
  if not isinstance(record.msg, str):
267
230
  record.msg = str(record.msg)
@@ -269,14 +232,11 @@ class logger_t(base_t):
269
232
  if self._should_hold_messages:
270
233
  self._on_hold.append(record)
271
234
  else:
272
- if self.should_record_messages:
273
- self.recorded.append(
274
- (
275
- record.levelno,
276
- self._recording_handler.MessageFromRecord(record)[0],
277
- )
278
- )
279
- base_t.handle(self, record)
235
+ self._HandleRecord(record)
236
+ self.events[record.levelno] += 1
237
+
238
+ if self.should_watch_memory_usage:
239
+ self.memory_usages.append((where, CurrentMemoryUsage()))
280
240
 
281
241
  if (self.exit_on_critical and (record.levelno is l.CRITICAL)) or (
282
242
  self.exit_on_error and (record.levelno is l.ERROR)
@@ -285,35 +245,44 @@ class logger_t(base_t):
285
245
  # __post_init__ set self.exit_on_critical if self.exit_on_error.
286
246
  s.exit(1)
287
247
 
288
- self.events[record.levelno] += 1
248
+ def _FlushRecordsOnHold(self) -> None:
249
+ """"""
250
+ for held in self._on_hold:
251
+ self._HandleRecord(held)
289
252
 
290
- if self.should_watch_memory_usage:
291
- self.memory_usages.append((where, CurrentMemoryUsage()))
253
+ self._on_hold.clear()
292
254
 
293
- def ActivateMessageRecording(self) -> None:
255
+ def _AcknowledgeDateChange(self, date: date_t, /) -> None:
294
256
  """"""
295
- if self._recording_handler is None:
296
- self._recording_handler = handler_extension_t("recording_handler", 0, None)
297
- self.should_record_messages = True # Useless if called from __post_init__.
257
+ self.last_message_date = date
258
+
259
+ record = l.makeLogRecord(
260
+ {
261
+ "name": self.name,
262
+ "levelno": l.INFO, # For management by logging.Logger.handle.
263
+ "msg": f"DATE: {date.strftime(DATE_FORMAT)}",
264
+ SHOW_W_RULE_ATTR: True,
265
+ }
266
+ )
298
267
 
299
- def MakeMonochrome(self) -> None:
300
- """"""
301
- self.AddHandler(console_handler_t)
268
+ if self._should_hold_messages:
269
+ self._on_hold.append(record)
270
+ else:
271
+ self._HandleRecord(record)
302
272
 
303
- def MakeRich(self, *, alternating_logs: int = 0) -> None:
273
+ def _HandleRecord(self, record: l.LogRecord, /) -> None:
304
274
  """"""
305
- if MISSING_RICH_MESSAGE is not None:
306
- s.__stderr__.write(MISSING_RICH_MESSAGE + "\n")
275
+ if self.should_record_messages:
276
+ message = self._recording_handler.MessageFromRecord(record)[0]
277
+ self.recorded.append((record.levelno, message))
307
278
 
308
- if console_rich_handler_t is console_handler_t:
309
- handler_kwargs = {}
310
- else:
311
- handler_kwargs = {"alternating_logs": alternating_logs}
312
- self.AddHandler(console_rich_handler_t, **handler_kwargs)
279
+ base_t.handle(self, record)
313
280
 
314
- def MakePermanent(self, path: str | path_t, /) -> None:
281
+ def ActivateMessageRecording(self) -> None:
315
282
  """"""
316
- self.AddHandler(file_handler_t, path=path)
283
+ self._recording_handler = handler_extension_t("recording_handler", 0, None)
284
+ self.should_record_messages = True # Useless if called from __post_init__.
285
+ self.info(f'Message recording activated for logger "{self.name}"')
317
286
 
318
287
  def ResetEventCounts(self) -> None:
319
288
  """"""
@@ -395,18 +364,6 @@ class logger_t(base_t):
395
364
  self.intercepts_exceptions = False
396
365
  self.info("Exception Interception: OFF")
397
366
 
398
- def DealWithException(self, _, exc_value, exc_traceback, /) -> None:
399
- """"""
400
- exception = exc_value.with_traceback(exc_traceback)
401
- self.LogException(exception, level=l.CRITICAL)
402
- s.exit(1)
403
-
404
- def DealWithExceptionInThread(
405
- self, exc_type, exc_value, exc_traceback, _, /
406
- ) -> None:
407
- """"""
408
- self.DealWithException(exc_type, exc_value, exc_traceback)
409
-
410
367
  def AddHandler(
411
368
  self,
412
369
  handler_t_or_handler: type[base_handler_t]
@@ -444,6 +401,25 @@ class logger_t(base_t):
444
401
  f"level {handler.level}={l.getLevelName(handler.level)}{path}"
445
402
  )
446
403
 
404
+ def MakeMonochrome(self) -> None:
405
+ """"""
406
+ self.AddHandler(console_handler_t)
407
+
408
+ def MakeRich(self, *, alternating_logs: int = 0) -> None:
409
+ """"""
410
+ if MISSING_RICH_MESSAGE is not None:
411
+ s.__stderr__.write(MISSING_RICH_MESSAGE + "\n")
412
+
413
+ if console_rich_handler_t is console_handler_t:
414
+ handler_kwargs = {}
415
+ else:
416
+ handler_kwargs = {"alternating_logs": alternating_logs}
417
+ self.AddHandler(console_rich_handler_t, **handler_kwargs)
418
+
419
+ def MakePermanent(self, path: str | path_t, /) -> None:
420
+ """"""
421
+ self.AddHandler(file_handler_t, path=path)
422
+
447
423
  def __call__(self, *args, **kwargs) -> None:
448
424
  """
449
425
  For a print-like calling for print-based debugging.
@@ -506,6 +482,18 @@ class logger_t(base_t):
506
482
  message = f"Exception of type {type(exception).__name__}\n----\n{formatted}"
507
483
  self.log(level, message, extra={SHOW_WHERE_ATTR: False})
508
484
 
485
+ def DealWithException(self, _, exc_value, exc_traceback, /) -> None:
486
+ """"""
487
+ exception = exc_value.with_traceback(exc_traceback)
488
+ self.LogException(exception, level=l.CRITICAL)
489
+ s.exit(1)
490
+
491
+ def DealWithExceptionInThread(
492
+ self, exc_type, exc_value, exc_traceback, _, /
493
+ ) -> None:
494
+ """"""
495
+ self.DealWithException(exc_type, exc_value, exc_traceback)
496
+
509
497
  def LogAsIs(self, message: str, /, *, indented: bool = False) -> None:
510
498
  """"""
511
499
  if indented:
logger_36/version.py CHANGED
@@ -4,7 +4,7 @@ Contributor(s): Eric Debreuve (eric.debreuve@cnrs.fr) since 2023
4
4
  SEE COPYRIGHT NOTICE BELOW
5
5
  """
6
6
 
7
- __version__ = "2025.19"
7
+ __version__ = "2025.20"
8
8
 
9
9
  """
10
10
  COPYRIGHT NOTICE
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: logger-36
3
- Version: 2025.19
3
+ Version: 2025.20
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
@@ -1,5 +1,5 @@
1
1
  logger_36/__init__.py,sha256=mK6AD0eWI2Sk42oxleTvsxzYJ28FbHK5WNkpLgAhnNE,2129
2
- logger_36/version.py,sha256=DefgP6TAlC9ZItUKr6xILYjfpSID0x0a7pe5gfQoQ1s,1680
2
+ logger_36/version.py,sha256=vDO1d9-QYkQ8yZUGGG46kdG9NRQx6ONSvh6-E6JGHu4,1680
3
3
  logger_36/api/content.py,sha256=DuT4UX4r_1DTXzuuRD-tvsTZk5X-Nj11loBKhuWOMw0,1791
4
4
  logger_36/api/gpu.py,sha256=NNs1IvQ7bh8Dppm8O8K2YLWbm4rogc3Ie_-D6xzkX3g,1726
5
5
  logger_36/api/memory.py,sha256=vOY4cTTrC3u7L0OrKXdPNlsCahYjCrY4h7iqpGZv9kU,2217
@@ -42,11 +42,11 @@ logger_36/task/format/memory.py,sha256=J1Oy3jw8wjSp2kuiRUm_VFpzXOHX2FOc7nuRrCyrs
42
42
  logger_36/task/format/message.py,sha256=Rm6zymVEEGcgKfmxMPXP7q3PtwZJKlXGhqZ5tnvlwxA,3502
43
43
  logger_36/task/measure/chronos.py,sha256=7ijMZgP4EP18HbLV2yCxpNpRS9724Wyk523f-nkbhUM,2529
44
44
  logger_36/task/measure/memory.py,sha256=kkPHEIUTUhkCOLrAt01eLJLnsnkl0nFPNhFZdIB_JAw,1991
45
- logger_36/type/handler.py,sha256=LmdiBI1NLzpgI_Mzr6nVBsj9Nu_5iZFGKNKTqGAmdSM,6673
45
+ logger_36/type/handler.py,sha256=ChxP1j9PXLmoiNcsOdxI4bYVdr75v7HeCWp_iYJ2WNY,6602
46
46
  logger_36/type/issue.py,sha256=QHAYf7QgrjJUtF2D46z6X630qTgeP_0FE5hIwf54RsE,2688
47
- logger_36/type/logger.py,sha256=oQy5VrJor6aJYH3KMIRMpbWx9YoR9oWFeSZWYzle2n4,26041
47
+ logger_36/type/logger.py,sha256=tWdexeJT9IrxKK2NQmnHi1WVmN16xR8RNZPMc__SWBs,25447
48
48
  logger_36/type/loggers.py,sha256=7EX7Sg_RlduBjdfFlNZmUfNeDloH1xU30Rdkg_-rXh8,3172
49
- logger_36-2025.19.dist-info/METADATA,sha256=o3JDxhFujB13yngrFl9lTrpRoSvLYMev6u9pY06nB_E,6529
50
- logger_36-2025.19.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
51
- logger_36-2025.19.dist-info/top_level.txt,sha256=sM95BTMWmslEEgR_1pzwZsOeSp8C_QBiu8ImbFr0XLc,10
52
- logger_36-2025.19.dist-info/RECORD,,
49
+ logger_36-2025.20.dist-info/METADATA,sha256=On7rI0r81M6ehWSyX7ZPiBKYVZoLqMPj-1VJWRuSd50,6529
50
+ logger_36-2025.20.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
51
+ logger_36-2025.20.dist-info/top_level.txt,sha256=sM95BTMWmslEEgR_1pzwZsOeSp8C_QBiu8ImbFr0XLc,10
52
+ logger_36-2025.20.dist-info/RECORD,,