logger-36 2025.12__py3-none-any.whl → 2025.14__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/logger.py CHANGED
@@ -17,6 +17,9 @@ from os import sep as FOLDER_SEPARATOR
17
17
  from pathlib import Path as path_t
18
18
  from traceback import TracebackException as traceback_t
19
19
 
20
+ from logger_36.catalog.config.optional import MISSING_RICH_MESSAGE, RICH_IS_AVAILABLE
21
+ from logger_36.catalog.handler.console import console_handler_t
22
+ from logger_36.catalog.handler.file import file_handler_t
20
23
  from logger_36.config.issue import ISSUE_CONTEXT_END, ISSUE_CONTEXT_SEPARATOR
21
24
  from logger_36.config.message import (
22
25
  DATE_FORMAT,
@@ -41,17 +44,20 @@ from logger_36.constant.record import (
41
44
  STORE_MEMORY_ATTR,
42
45
  )
43
46
  from logger_36.extension.exception import OverrideExceptionFormat
44
- from logger_36.task.format.message import MessageWithActualExpected
47
+ from logger_36.task.format.message import MessageFromRecord, MessageWithActualExpected
45
48
  from logger_36.task.format.rule import RuleAsText
46
- from logger_36.task.handling import (
47
- AddConsoleHandler,
48
- AddFileHandler,
49
- AddRichConsoleHandler,
50
- )
51
49
  from logger_36.task.measure.chronos import ElapsedTime
52
50
  from logger_36.task.measure.memory import CurrentUsage as CurrentMemoryUsage
51
+ from logger_36.type.handler import any_handler_t as base_handler_t
53
52
  from logger_36.type.issue import NewIssue, issue_t
54
53
 
54
+ if RICH_IS_AVAILABLE:
55
+ from logger_36.catalog.handler.console_rich import console_rich_handler_t
56
+ else:
57
+ from logger_36.catalog.handler.console import (
58
+ console_handler_t as console_rich_handler_t,
59
+ )
60
+
55
61
  base_t = l.Logger
56
62
 
57
63
  logger_handle_raw_h = h.Callable[[l.LogRecord], None]
@@ -68,21 +74,23 @@ class logger_t(base_t):
68
74
  intercepted_wrn_handle: When warning interception is on, this stores the original
69
75
  "handle" method of the Python warning logger.
70
76
 
71
- should_activate_log_interceptions: Loggers instantiated after a logger_t logger will
77
+ _should_activate_log_interceptions: Loggers instantiated after a logger_t logger will
72
78
  be missed by an early call of ToggleLogInterceptions. Therefore, passing True for
73
- activate_log_interceptions only sets should_activate_log_interceptions to True,
79
+ activate_log_interceptions only sets _should_activate_log_interceptions to True,
74
80
  which is later checked in AddHandler to effectively call ToggleLogInterceptions if
75
- should_hold_messages is False (which normally indicates that the handler about to be
81
+ _should_hold_messages is False (which normally indicates that the handler about to be
76
82
  added is the last one).
83
+
84
+ _should_hold_messages: Must not be False until at least one handler has been added.
77
85
  """
78
86
 
79
- # Must not be False until at least one handler has been added.
80
- should_hold_messages: bool = True
87
+ should_record_messages: bool = False
81
88
  exit_on_error: bool = False # Implies exit_on_critical.
82
89
  exit_on_critical: bool = False
83
90
 
84
- on_hold: list[l.LogRecord] = d.field(init=False, default_factory=list)
85
91
  events: dict[int, int] = d.field(init=False, default_factory=dict)
92
+ recorded: list[tuple[int, str]] = d.field(init=False, default_factory=list)
93
+
86
94
  last_message_now: date_time_t = d.field(init=False, default=_DATE_TIME_ORIGIN)
87
95
  last_message_date: date_t = d.field(init=False, default=_DATE_ORIGIN)
88
96
  any_handler_stores_memory: bool = d.field(init=False, default=False)
@@ -93,7 +101,9 @@ class logger_t(base_t):
93
101
  intercepted_log_handles: dict[str, logger_handle_h] = d.field(
94
102
  init=False, default_factory=dict
95
103
  )
96
- should_activate_log_interceptions: bool = False
104
+ _on_hold: list[l.LogRecord] = d.field(init=False, default_factory=list)
105
+ _should_hold_messages: bool = d.field(init=False, default=True)
106
+ _should_activate_log_interceptions: bool = d.field(init=False, default=False)
97
107
 
98
108
  name_: d.InitVar[str] = LOGGER_NAME
99
109
  level_: d.InitVar[int] = l.NOTSET
@@ -120,18 +130,6 @@ class logger_t(base_t):
120
130
  """"""
121
131
  return self.staged_issues.__len__()
122
132
 
123
- @property
124
- def past_logs_as_HTML(self) -> str | None:
125
- """
126
- From the first handler found with the given functionality, if any.
127
- """
128
- for handler in self.handlers:
129
- past_logs_as_HTML = getattr(handler, "past_logs_as_HTML", None)
130
- if past_logs_as_HTML is not None:
131
- return past_logs_as_HTML
132
-
133
- return None
134
-
135
133
  @property
136
134
  def max_memory_usage(self) -> int:
137
135
  """"""
@@ -170,7 +168,7 @@ class logger_t(base_t):
170
168
  if activate_wrn_interceptions:
171
169
  self.ToggleWarningInterceptions(True)
172
170
  if activate_log_interceptions:
173
- self.should_activate_log_interceptions = True
171
+ self._should_activate_log_interceptions = True
174
172
 
175
173
  if self.exit_on_error:
176
174
  self.exit_on_critical = True
@@ -179,10 +177,14 @@ class logger_t(base_t):
179
177
  """"""
180
178
  elapsed_time, now = ElapsedTime(should_return_now=True)
181
179
 
182
- if (self.on_hold.__len__() > 0) and not self.should_hold_messages:
183
- for held in self.on_hold:
180
+ if (self._on_hold.__len__() > 0) and not self._should_hold_messages:
181
+ for held in self._on_hold:
182
+ if self.should_record_messages:
183
+ self.recorded.append(
184
+ (held.levelno, MessageFromRecord(held, RuleAsText)[0])
185
+ )
184
186
  base_t.handle(self, held)
185
- self.on_hold.clear()
187
+ self._on_hold.clear()
186
188
 
187
189
  if (date := now.date()) != self.last_message_date:
188
190
  self.last_message_date = date
@@ -195,9 +197,16 @@ class logger_t(base_t):
195
197
  SHOW_W_RULE_ATTR: True,
196
198
  }
197
199
  )
198
- if self.should_hold_messages:
199
- self.on_hold.append(date_record)
200
+ if self._should_hold_messages:
201
+ self._on_hold.append(date_record)
200
202
  else:
203
+ if self.should_record_messages:
204
+ self.recorded.append(
205
+ (
206
+ date_record.levelno,
207
+ MessageFromRecord(date_record, RuleAsText)[0],
208
+ )
209
+ )
201
210
  base_t.handle(self, date_record)
202
211
 
203
212
  # When.
@@ -237,9 +246,13 @@ class logger_t(base_t):
237
246
  if not isinstance(record.msg, str):
238
247
  record.msg = str(record.msg)
239
248
 
240
- if self.should_hold_messages:
241
- self.on_hold.append(record)
249
+ if self._should_hold_messages:
250
+ self._on_hold.append(record)
242
251
  else:
252
+ if self.should_record_messages:
253
+ self.recorded.append(
254
+ (record.levelno, MessageFromRecord(record, RuleAsText)[0])
255
+ )
243
256
  base_t.handle(self, record)
244
257
 
245
258
  if (self.exit_on_critical and (record.levelno is l.CRITICAL)) or (
@@ -254,13 +267,7 @@ class logger_t(base_t):
254
267
  if should_store_where:
255
268
  self.memory_usages.append((where, CurrentMemoryUsage()))
256
269
 
257
- def SetLevel(
258
- self,
259
- level: int,
260
- /,
261
- *,
262
- which: handler_codes_h | str = "a",
263
- ) -> None:
270
+ def SetLevel(self, level: int, /, *, which: handler_codes_h | str = "a") -> None:
264
271
  """
265
272
  Set level of handlers, but the logger level is not modified.
266
273
 
@@ -290,17 +297,24 @@ class logger_t(base_t):
290
297
  def MakeMonochrome(self) -> None:
291
298
  """"""
292
299
  OverrideExceptionFormat()
293
- AddConsoleHandler(self)
300
+ self.AddHandler(console_handler_t)
294
301
 
295
302
  def MakeRich(self, *, alternating_logs: int = 0) -> None:
296
303
  """"""
304
+ if MISSING_RICH_MESSAGE is not None:
305
+ s.__stderr__.write(MISSING_RICH_MESSAGE + "\n")
306
+
297
307
  OverrideExceptionFormat()
298
- AddRichConsoleHandler(self, alternating_logs=alternating_logs)
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)
299
313
 
300
314
  def MakePermanent(self, path: str | path_t, /) -> None:
301
315
  """"""
302
316
  OverrideExceptionFormat()
303
- AddFileHandler(self, path)
317
+ self.AddHandler(file_handler_t, path=path)
304
318
 
305
319
  def ResetEventCounts(self) -> None:
306
320
  """"""
@@ -364,14 +378,32 @@ class logger_t(base_t):
364
378
  self.info("Log Interception: OFF")
365
379
 
366
380
  def AddHandler(
367
- self, handler: l.Handler, /, *, should_hold_messages: bool = False
381
+ self,
382
+ handler_t: type[base_handler_t],
383
+ /,
384
+ *,
385
+ name: str | None = None,
386
+ level: int = l.INFO,
387
+ should_store_memory_usage: bool = False,
388
+ message_width: int = -1,
389
+ formatter: l.Formatter | None = None,
390
+ should_still_hold_messages: bool = False,
391
+ **kwargs,
368
392
  ) -> None:
369
393
  """"""
370
- if (not should_hold_messages) and self.should_activate_log_interceptions:
394
+ if (not should_still_hold_messages) and self._should_activate_log_interceptions:
371
395
  self.ToggleLogInterceptions(True)
372
- self.should_activate_log_interceptions = False
396
+ self._should_activate_log_interceptions = False
373
397
 
374
- self.should_hold_messages = should_hold_messages
398
+ self._should_hold_messages = should_still_hold_messages
399
+ handler = handler_t.New(
400
+ name=name,
401
+ should_store_memory_usage=should_store_memory_usage,
402
+ message_width=message_width,
403
+ level=level,
404
+ formatter=formatter,
405
+ **kwargs,
406
+ )
375
407
  base_t.addHandler(self, handler)
376
408
 
377
409
  extension = getattr(handler, "extension", None)
@@ -390,9 +422,16 @@ class logger_t(base_t):
390
422
 
391
423
  self.info(
392
424
  f'New handler "{name}" of type "{type(handler).__name__}" and '
393
- f"level {handler.level}={l.getLevelName(handler.level)}{path}",
425
+ f"level {handler.level}={l.getLevelName(handler.level)}{path}"
394
426
  )
395
427
 
428
+ def __call__(self, *args, **kwargs) -> None:
429
+ """
430
+ For a print-like calling.
431
+ """
432
+ separator = kwargs.get("separator", " ")
433
+ self.info(separator.join(map(str, args)))
434
+
396
435
  def Log(
397
436
  self,
398
437
  message: str,
@@ -441,10 +480,7 @@ class logger_t(base_t):
441
480
  self.log(level, message)
442
481
 
443
482
  def LogAsIs(self, message: str, /, *, indented: bool = False) -> None:
444
- """
445
- See documentation of
446
- logger_36.catalog.handler.generic.generic_handler_t.LogAsIs.
447
- """
483
+ """"""
448
484
  if indented:
449
485
  message = text.indent(message, LINE_INDENT)
450
486
 
@@ -454,7 +490,7 @@ class logger_t(base_t):
454
490
  else:
455
491
  LogAsIs(message)
456
492
 
457
- raw_info = LogAsIs # To follow the convention of the logging methods info, error...
493
+ info_raw = LogAsIs # To follow the convention of the logging methods info, error...
458
494
 
459
495
  def DisplayRule(
460
496
  self, /, *, message: str | None = None, color: str = "white"
@@ -462,7 +498,7 @@ class logger_t(base_t):
462
498
  """"""
463
499
  for handler in self.handlers:
464
500
  if (DisplayRule := getattr(handler, "DisplayRule", None)) is None:
465
- self.info(RuleAsText(message))
501
+ self.info(RuleAsText(message, None))
466
502
  else:
467
503
  DisplayRule(text=message, color=color)
468
504
 
@@ -528,11 +564,7 @@ class logger_t(base_t):
528
564
  return output
529
565
 
530
566
  def CommitIssues(
531
- self,
532
- /,
533
- *,
534
- order: order_h = "when",
535
- unified: bool = False,
567
+ self, /, *, order: order_h = "when", unified: bool = False
536
568
  ) -> None:
537
569
  """
538
570
  Note that issues after an issue with a level triggering process exit will not be
@@ -553,7 +585,7 @@ class logger_t(base_t):
553
585
  if order == "when":
554
586
  issues = self.staged_issues
555
587
  else: # order == "context"
556
- issues = sorted(self.staged_issues, key=lambda _elm: _elm.context)
588
+ issues = sorted(self.staged_issues, key=lambda _: _.context)
557
589
  """
558
590
  Format issues as an exception:
559
591
  try:
@@ -0,0 +1,90 @@
1
+ """
2
+ Copyright CNRS/Inria/UniCA
3
+ Contributor(s): Eric Debreuve (eric.debreuve@cnrs.fr) since 2023
4
+ SEE COPYRIGHT NOTICE BELOW
5
+ """
6
+
7
+ import logging as l
8
+ import typing as h
9
+
10
+ from logger_36.catalog.config.optional import RICH_IS_AVAILABLE
11
+
12
+
13
+ @h.runtime_checkable
14
+ class _RuleAsText_p(h.Protocol):
15
+ def __call__(self, text: str | None, color: None, /) -> str: ...
16
+
17
+
18
+ if RICH_IS_AVAILABLE:
19
+ from rich.rule import Rule as rule_t # noqa
20
+
21
+ @h.runtime_checkable
22
+ class _Rule_p(h.Protocol):
23
+ def __call__(self, text: str | None, color: str, /) -> rule_t | str: ...
24
+ else:
25
+ _Rule_p = None
26
+
27
+ RuleWithText_h = _RuleAsText_p | _Rule_p
28
+
29
+
30
+ @h.runtime_checkable
31
+ class _MessageFromRecordPreprocessed_p(h.Protocol):
32
+ def __call__(
33
+ self,
34
+ record: l.LogRecord,
35
+ RuleWithText: RuleWithText_h,
36
+ /,
37
+ *,
38
+ line_width: int = 0,
39
+ PreProcessed: h.Callable[[str], str] | None = None,
40
+ ) -> tuple[str, bool]: ...
41
+
42
+
43
+ MessageFromRecord_h = _MessageFromRecordPreprocessed_p
44
+
45
+
46
+ """
47
+ COPYRIGHT NOTICE
48
+
49
+ This software is governed by the CeCILL license under French law and
50
+ abiding by the rules of distribution of free software. You can use,
51
+ modify and/ or redistribute the software under the terms of the CeCILL
52
+ license as circulated by CEA, CNRS and INRIA at the following URL
53
+ "http://www.cecill.info".
54
+
55
+ As a counterpart to the access to the source code and rights to copy,
56
+ modify and redistribute granted by the license, users are provided only
57
+ with a limited warranty and the software's author, the holder of the
58
+ economic rights, and the successive licensors have only limited
59
+ liability.
60
+
61
+ In this respect, the user's attention is drawn to the risks associated
62
+ with loading, using, modifying and/or developing or reproducing the
63
+ software by the user in light of its specific status of free software,
64
+ that may mean that it is complicated to manipulate, and that also
65
+ therefore means that it is reserved for developers and experienced
66
+ professionals having in-depth computer knowledge. Users are therefore
67
+ encouraged to load and test the software's suitability as regards their
68
+ requirements in conditions enabling the security of their systems and/or
69
+ data to be ensured and, more generally, to use and operate it in the
70
+ same conditions as regards security.
71
+
72
+ The fact that you are presently reading this means that you have had
73
+ knowledge of the CeCILL license and that you accept its terms.
74
+
75
+ SEE LICENCE NOTICE: file README-LICENCE-utf8.txt at project source root.
76
+
77
+ This software is being developed by Eric Debreuve, a CNRS employee and
78
+ member of team Morpheme.
79
+ Team Morpheme is a joint team between Inria, CNRS, and UniCA.
80
+ It is hosted by the Centre Inria d'Université Côte d'Azur, Laboratory
81
+ I3S, and Laboratory iBV.
82
+
83
+ CNRS: https://www.cnrs.fr/index.php/en
84
+ Inria: https://www.inria.fr/en/
85
+ UniCA: https://univ-cotedazur.eu/
86
+ Centre Inria d'Université Côte d'Azur: https://www.inria.fr/en/centre/sophia/
87
+ I3S: https://www.i3s.unice.fr/en/
88
+ iBV: http://ibv.unice.fr/
89
+ Team Morpheme: https://team.inria.fr/morpheme/
90
+ """
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.12"
7
+ __version__ = "2025.14"
8
8
 
9
9
  """
10
10
  COPYRIGHT NOTICE
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: logger-36
3
- Version: 2025.12
3
+ Version: 2025.14
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,9 +1,8 @@
1
1
  logger_36/__init__.py,sha256=UhKxuQLS1Pfgt5H0K_7BaDAPejOUR8byD5BYRCnHQMQ,2655
2
- logger_36/version.py,sha256=otEn_aRbss3NWUVceeYkCGHBJ2PQSQsj0GdECeVsuLo,2206
2
+ logger_36/version.py,sha256=puslblEld2sLwTmqWreV3vMyhNnL0uc4l3B-pcUa2hg,2206
3
3
  logger_36/api/content.py,sha256=clHYYUKa8n4qef6PVlUV4mFHRRf6fnm9wEd2fu9oagA,2381
4
4
  logger_36/api/exception.py,sha256=QKIkNJA0N6FvVHLTApiH3ymhVQoSYU08t2RkyufQPIw,2291
5
5
  logger_36/api/gpu.py,sha256=BOumedCAPWvCo7J-KJ3XE-jr5S0KSmgcFv_S4QKRPO8,2252
6
- logger_36/api/handler.py,sha256=cM9bn4LDj4rtHKjzfBsTvsp-HYJMRd8Y7HSVNvVgudU,2323
7
6
  logger_36/api/memory.py,sha256=szJVk4UTXsbYv3B-W9LFttf1F3j86GXHsKgEUOsXKl4,2743
8
7
  logger_36/api/storage.py,sha256=t83D7Ge0ka7FCHUM8xchLsO_TMu0Bcc2IcBzw_gjkSA,2300
9
8
  logger_36/api/system.py,sha256=cgOMF_OneYeIJDMbIbIDx96EZss2uAdkk8QofOC7O1U,2251
@@ -11,21 +10,22 @@ logger_36/api/time.py,sha256=Uw1jQtY1njsRuIPRAXX44v4nPOo84MSBu_WK_YCRzQs,2324
11
10
  logger_36/api/type.py,sha256=4m5fZGI6LOQvFakEStFv6HTP4FY9nyFpNNlK34rCfQw,2286
12
11
  logger_36/catalog/config/console_rich.py,sha256=lAa5Ev5BhXvmQzfIt1FNihMNUQJFlXaIzNanAMdgtd0,2861
13
12
  logger_36/catalog/config/optional.py,sha256=HaN6mbx7gHBBppNvUw1ckhYTOrlYqb-b_r0mzPcHPjM,2398
14
- logger_36/catalog/handler/console.py,sha256=13ygxLmsywdGlr9hV9guw7FuRD-dxlZX20d1Mn-pWKs,4206
15
- logger_36/catalog/handler/console_rich.py,sha256=RrNp8Uqf_MVw6o3Qcf7-4AfsZM_TjaTR2L_FKqD6LjI,8033
16
- logger_36/catalog/handler/file.py,sha256=ZbYLic0XcX3vw-col8hiuO-SQOSZh06tPYu5z3FdGDo,4620
17
- logger_36/catalog/handler/generic.py,sha256=YYVdfG5nJHLIC-W9p8YhRREyFFSjJGHfSKJFd9EtLp0,8663
13
+ logger_36/catalog/handler/console.py,sha256=5F_JFsGm5ERFh0_1rh8Jae51VwAJMg7d7bRLZkOK4DY,3283
14
+ logger_36/catalog/handler/console_rich.py,sha256=U4hD8qF88dpDALKkeOvwnrJpUbUpG5egq1JfImU4pFg,7168
15
+ logger_36/catalog/handler/file.py,sha256=4Du9f-UNJsZrcNV9jCVLLCklA0T4HYX_jKjxSie-deM,3428
16
+ logger_36/catalog/handler/generic.py,sha256=8xQA0ETIMmdhmip0wcaD21h4ZGz-52gk0hgoUJYxbn8,8258
18
17
  logger_36/catalog/logger/chronos.py,sha256=ocY13f98EfknU7wZCv0FS9Xb7pTNaWCPSusXFIEvEd4,2437
19
- logger_36/catalog/logger/gpu.py,sha256=n_kbAQdRNk3Jdket6031_r2unOcz3dWplhCR-WFPjE0,3417
18
+ logger_36/catalog/logger/gpu.py,sha256=ybn7Q8exiqoigvNpzEhg0Zp027WogypuNJwfsQ1pRY4,3416
20
19
  logger_36/catalog/logger/memory.py,sha256=CWhr2J4BqArJxzH6tS-ZThr-rYPAQGtuLn0pP7Iryfg,4685
21
- logger_36/catalog/logger/system.py,sha256=KXP2jdPd-ACFNdA0wWdmOLwuxt4baUvXkuChyOHyfy0,3066
20
+ logger_36/catalog/logger/system.py,sha256=3VWbceSAknZwmRhEfd8pkuLwU2B8zPhCGNGQE0h5KLo,3065
22
21
  logger_36/config/issue.py,sha256=G-i5p6lhZCLAOa-VTMyL9ZonvGCvhdoQ5KZdSWgP-FU,2267
23
22
  logger_36/config/memory.py,sha256=yCX5phsB_KJMr5xHpVUeOHFhAA7p_8yahP3X28VndOY,2217
24
- logger_36/config/message.py,sha256=yfbMO_Jk1IbWvT6Lp6hVpID2Tr99cuiJ-ZaMBesIFXw,2527
23
+ logger_36/config/message.py,sha256=mgPcMS7qWBuqP2w5NoHw1df32kcVToVhisozb32_EII,2554
25
24
  logger_36/config/system.py,sha256=HD8ZuwsXhEAExeZrww8YoDkQGMs4T5RDqQMb1W4qVgc,2477
26
25
  logger_36/constant/error.py,sha256=LzsS_P1IoH3ct_ifNWi9LzJ-X_Y5DN1naTLwwIFzDQA,2827
27
26
  logger_36/constant/generic.py,sha256=t6aRb66_NHwMhR1p7BZ4QXTU2jpLz-H5YAL4PuMtKx8,2244
28
27
  logger_36/constant/handler.py,sha256=PQUehMK9Yg0_rBDcMc8xpUbAsCauCLy_eS_ntiWew1Y,2378
28
+ logger_36/constant/html.py,sha256=-m1CDyDN0kkurloEtJeqBsyxy9nXCImIMGLwEIF33M0,2515
29
29
  logger_36/constant/issue.py,sha256=01l8itRPWGS5F6gXtsXUJgGR-4lS1Eu3_YeKC-khKLw,2315
30
30
  logger_36/constant/logger.py,sha256=2qRkteblpbHrq9x0aiw9MPquyXrSRd6_yMQnPEhFp2U,2468
31
31
  logger_36/constant/memory.py,sha256=ZL1MwbdtNsrCrOwzEyfTsfOoOsRBTJtbbf3otHGnxXo,2343
@@ -33,23 +33,24 @@ logger_36/constant/message.py,sha256=Ys_CAyhENlT8Z3rr-AxO4hjdl1jLsKzVSPQ8wqLOCPQ
33
33
  logger_36/constant/path.py,sha256=fKJn2vGj012BU5DFRetDFus_tKMty2q_WL0J2KrXdCo,2731
34
34
  logger_36/constant/record.py,sha256=9Q28lVH_s0og4v74delgwIPAJ9G28I5rBM-brXcoY80,2308
35
35
  logger_36/constant/system.py,sha256=G2mzBTxRXoJMxb53TnmBaceMJC_q3WonoCG7y6nC_R8,2430
36
- logger_36/extension/exception.py,sha256=cKY5-AyaiRXqY6ZMyvRk8ZyvBJbNPn8ZoovSOZS2eQY,5383
36
+ logger_36/extension/exception.py,sha256=CPie_jbp_cPhYln0dECFplykmS7pUaHqiiuQ4M5lvho,5416
37
37
  logger_36/extension/html_.py,sha256=J9EX8-Rotq9i8bZ9U-dIpXv5gKLLnLmWqdDy4XayT1Q,3868
38
+ logger_36/extension/line.py,sha256=3MJ3B5PXJn18RHxBUcWnNBLEYzb7VTcEAufn7ULdYfY,3143
38
39
  logger_36/instance/logger.py,sha256=oTw5svRzKRJKvGrrZUtutJIOjp5UISft3fl0Ze7DOBE,2241
39
40
  logger_36/instance/loggers.py,sha256=RCWpC1NPAf6vXnFc9NqsSALv-x-FEzcH6k_OlxTxeQk,2251
40
- logger_36/task/handling.py,sha256=fYc9L0RkMnlwKH_dSwOEeOV61D-L3zd-hxbPkzEvKbY,6303
41
- logger_36/task/inspection.py,sha256=KZzmQyREQ6VmBWCLyNIYIOOISW9C_fC9TWTSX90zGDk,5019
42
- logger_36/task/storage.py,sha256=T96JZT5Tmrt_-Kqf_WKweTvJYPX6lmPZZkJzCqyVPcI,3502
43
- logger_36/task/format/memory.py,sha256=jpQS8tAdxy7GM_FzqEIJUU3m-6O9iX-jiyO7gx5YwR8,4266
44
- logger_36/task/format/message.py,sha256=siQ3crsaw0846-lEKEC1bc29Exmxw7qMBdBF91fncpc,4028
45
- logger_36/task/format/rule.py,sha256=vkf-HivFb4VqV2GeOPVqMAp99krtziI-kXhox3UVnzw,2873
41
+ logger_36/task/inspection.py,sha256=VR9ESSa2iAAiQggwzHzV2A3-rRr6VgMqR1HvclhK2Xc,5010
42
+ logger_36/task/storage.py,sha256=Y88934cVcen1i8qruskmCMQYA5-dl1wI8EaJFCv49Q0,4042
43
+ logger_36/task/format/memory.py,sha256=ZipL1f-Bqv4ugFvXZfNrj49rdIMXjEKcVz1OvgMaZXI,4249
44
+ logger_36/task/format/message.py,sha256=5mR9CZaARy9q-JtIX68IyY-DKTepkxyRV7juByqBH7c,5771
45
+ logger_36/task/format/rule.py,sha256=CtR7d2X-pZFKdqG6Y2_3b5AMKg_J274Jq69kht0N6xs,2910
46
46
  logger_36/task/measure/chronos.py,sha256=1kVhu6jZlNAtNWQQh8ZVuRwZIAC9gGz3_ul1tn0t4Yw,3055
47
47
  logger_36/task/measure/memory.py,sha256=OjU5EYFH8SnzlCQKAoiXvauUlwQYOrH34jFXTVYF0jE,2517
48
- logger_36/type/handler.py,sha256=5g5KdmKk6cdsUSV0JoFfjpAXdQIzSRcW81STyLqqWq8,6824
48
+ logger_36/type/handler.py,sha256=6oxW-Y_kuAEfoXsMr-KXspv0czYiwe8rDzMAMrshFmw,6567
49
49
  logger_36/type/issue.py,sha256=2rGsFqaQJCbeml9xN08mN_nK79L8qscaS_0ws36Y0bI,3214
50
- logger_36/type/logger.py,sha256=0r2D6idyZJeH19MnCkTNQs2UQJpDOqYhkNulkWSzA4w,23549
50
+ logger_36/type/logger.py,sha256=ISMUQBZ-KhLBi_tZjCAYtss5pAwFW3psTQu5k9_ZbEw,25287
51
51
  logger_36/type/loggers.py,sha256=znqxWBnfQxvkg3VUfbTUvt3S6Kq0DAzWWepxQDt9suI,2871
52
- logger_36-2025.12.dist-info/METADATA,sha256=C76uDmBqS_RO-DVr8d-lBkazvKtAe-2sHt2yg4viSx0,6506
53
- logger_36-2025.12.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
54
- logger_36-2025.12.dist-info/top_level.txt,sha256=sM95BTMWmslEEgR_1pzwZsOeSp8C_QBiu8ImbFr0XLc,10
55
- logger_36-2025.12.dist-info/RECORD,,
52
+ logger_36/type/message.py,sha256=zKME5p87ynsXte_b5usXV3VHaj34Uezs9Gg_WVWfaeY,3063
53
+ logger_36-2025.14.dist-info/METADATA,sha256=GkEE-L8P0ShhL0XxKOu-A5p3yZD0mJzAcGax90FiUw8,6506
54
+ logger_36-2025.14.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
55
+ logger_36-2025.14.dist-info/top_level.txt,sha256=sM95BTMWmslEEgR_1pzwZsOeSp8C_QBiu8ImbFr0XLc,10
56
+ logger_36-2025.14.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.8.2)
2
+ Generator: setuptools (80.9.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5