logger-36 2025.5__py3-none-any.whl → 2025.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.
logger_36/api/logger.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
- from logger_36.type.logger import logger_t
7
+ from logger_36.type.logger import logger_t # noqa
8
8
 
9
9
  """
10
10
  COPYRIGHT NOTICE
logger_36/api/storage.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
- from logger_36.task.storage import html_reader_t
7
+ from logger_36.task.storage import html_reader_t # noqa
8
8
 
9
9
  """
10
10
  COPYRIGHT NOTICE
@@ -6,8 +6,8 @@ SEE COPYRIGHT NOTICE BELOW
6
6
 
7
7
  import logging as l
8
8
 
9
- from rich.color import Color as color_t
10
- from rich.style import Style as style_t
9
+ from rich.color import Color as color_t # noqa
10
+ from rich.style import Style as style_t # noqa
11
11
 
12
12
  """
13
13
  Colors: See https://rich.readthedocs.io/en/stable/appendix/colors.html.
@@ -4,54 +4,14 @@ Contributor(s): Eric Debreuve (eric.debreuve@cnrs.fr) since 2023
4
4
  SEE COPYRIGHT NOTICE BELOW
5
5
  """
6
6
 
7
- import logging as l
8
-
9
- from logger_36.catalog.handler.console import console_handler_t
10
- from logger_36.catalog.handler.console_rich import console_rich_handler_t
11
- from logger_36.catalog.handler.file import file_handler_t
12
- from logger_36.catalog.handler.generic import generic_handler_t
13
- from logger_36.constant.handler import HANDLER_CODES, handler_codes_h
14
- from logger_36.instance.logger import L
15
- from logger_36.task.format.message import MessageWithActualExpected
16
-
17
-
18
- def SetLOGLevel(
19
- level: int,
20
- /,
21
- *,
22
- logger: l.Logger = L,
23
- which: handler_codes_h | str = "a",
24
- ) -> None:
25
- """
26
- which: g=generic, c=console, f=file, a=all, str=name.
27
- """
28
- which_is_name = which not in HANDLER_CODES
29
- found = False
30
- for handler in logger.handlers:
31
- if (
32
- (which == "a")
33
- or ((which == "g") and isinstance(handler, generic_handler_t))
34
- or (
35
- (which == "c")
36
- and isinstance(handler, (console_handler_t, console_rich_handler_t))
37
- )
38
- or ((which == "f") and isinstance(handler, file_handler_t))
39
- or (which == handler.name)
40
- ):
41
- handler.setLevel(level)
42
- if which_is_name:
43
- return
44
- found = True
45
-
46
- if not found:
47
- raise ValueError(
48
- MessageWithActualExpected(
49
- "Handler not found",
50
- actual=which,
51
- expected=f"{str(HANDLER_CODES)[1:-1]}, or a handler name",
52
- )
53
- )
54
-
7
+ try:
8
+ import rich # noqa
9
+ except ModuleNotFoundError:
10
+ RICH_IS_AVAILABLE = False
11
+ from logger_36.constant.error import MISSING_RICH_MESSAGE
12
+ else:
13
+ RICH_IS_AVAILABLE = True
14
+ MISSING_RICH_MESSAGE = None
55
15
 
56
16
  """
57
17
  COPYRIGHT NOTICE
@@ -13,12 +13,19 @@ from logger_36.constant.message import LINE_INDENT
13
13
  from logger_36.constant.record import SHOW_W_RULE_ATTR
14
14
  from logger_36.task.format.rule import RuleAsText
15
15
  from logger_36.type.handler import handler_extension_t
16
+ from logger_36.type.handler import message_from_record_raw_p as message_from_record_p
16
17
 
17
18
 
18
19
  @d.dataclass(slots=True, repr=False, eq=False)
19
20
  class console_handler_t(l.Handler):
21
+ """
22
+ kind: See logger_36.constant.handler.handler_codes_h.
23
+ """
24
+
25
+ kind: h.ClassVar[str] = "c"
26
+
20
27
  extension: handler_extension_t = d.field(init=False)
21
- MessageFromRecord: h.Callable[..., tuple[str, str | None]] = d.field(init=False)
28
+ MessageFromRecord: message_from_record_p = d.field(init=False)
22
29
 
23
30
  name: d.InitVar[str | None] = None
24
31
  level: d.InitVar[int] = l.NOTSET
@@ -24,11 +24,14 @@ from logger_36.constant.message import CONTEXT_LENGTH, LINE_INDENT
24
24
  from logger_36.constant.record import SHOW_W_RULE_ATTR
25
25
  from logger_36.task.format.rule import Rule, rule_t
26
26
  from logger_36.type.handler import handler_extension_t
27
- from rich.console import Console as console_t
28
- from rich.console import RenderableType as renderable_t
29
- from rich.markup import escape as EscapedVersion
30
- from rich.text import Text as text_t
31
- from rich.traceback import install as InstallTracebackHandler
27
+ from logger_36.type.handler import (
28
+ message_from_record_preprocessed_p as message_from_record_p,
29
+ )
30
+ from rich.console import Console as console_t # noqa
31
+ from rich.console import RenderableType as renderable_t # noqa
32
+ from rich.markup import escape as EscapedVersion # noqa
33
+ from rich.text import Text as text_t # noqa
34
+ from rich.traceback import install as InstallTracebackHandler # noqa
32
35
 
33
36
  _COMMON_TRACEBACK_ARGUMENTS = ("theme", "width")
34
37
  _EXCLUSIVE_TRACEBACK_ARGUMENTS = (
@@ -47,6 +50,8 @@ _EXCLUSIVE_TRACEBACK_ARGUMENTS = (
47
50
  @d.dataclass(slots=True, repr=False, eq=False)
48
51
  class console_rich_handler_t(l.Handler):
49
52
  """
53
+ kind: See logger_36.constant.handler.handler_codes_h.
54
+
50
55
  alternating_lines:
51
56
  - Initial value:
52
57
  - 1: enabled for dark background
@@ -55,9 +60,11 @@ class console_rich_handler_t(l.Handler):
55
60
  - Runtime value: 0/1=do not/do highlight next time.
56
61
  """
57
62
 
63
+ kind: h.ClassVar[str] = "c"
64
+
58
65
  extension: handler_extension_t = d.field(init=False)
59
66
  console: console_t = d.field(init=False)
60
- MessageFromRecord: h.Callable[..., str] = d.field(init=False)
67
+ MessageFromRecord: message_from_record_p = d.field(init=False)
61
68
  alternating_lines: int = 0
62
69
  background_is_light: bool = True
63
70
 
@@ -14,13 +14,19 @@ from logger_36.constant.message import LINE_INDENT
14
14
  from logger_36.constant.record import SHOW_W_RULE_ATTR
15
15
  from logger_36.task.format.rule import RuleAsText
16
16
  from logger_36.type.handler import handler_extension_t
17
+ from logger_36.type.handler import message_from_record_raw_p as message_from_record_p
17
18
 
18
19
 
19
20
  @d.dataclass(slots=True, repr=False, eq=False)
20
21
  class file_handler_t(l.FileHandler):
22
+ """
23
+ kind: See logger_36.constant.handler.handler_codes_h.
24
+ """
25
+
26
+ kind: h.ClassVar[str] = "f"
21
27
 
22
28
  extension: handler_extension_t = d.field(init=False)
23
- MessageFromRecord: h.Callable[..., tuple[str, str | None]] = d.field(init=False)
29
+ MessageFromRecord: message_from_record_p = d.field(init=False)
24
30
 
25
31
  name: d.InitVar[str | None] = None
26
32
  level: d.InitVar[int] = l.NOTSET
@@ -8,19 +8,23 @@ import dataclasses as d
8
8
  import logging as l
9
9
  import typing as h
10
10
 
11
- try:
11
+ from logger_36.catalog.config.optional import RICH_IS_AVAILABLE
12
+
13
+ if RICH_IS_AVAILABLE:
12
14
  from logger_36.catalog.config.console_rich import DATE_TIME_COLOR
13
15
  from logger_36.catalog.handler.console_rich import HighlightedVersion
14
16
  from rich.console import Console as console_t # noqa
15
17
  from rich.console import ConsoleOptions as console_options_t # noqa
16
18
  from rich.markup import escape as EscapedForRich # noqa
17
19
  from rich.terminal_theme import DEFAULT_TERMINAL_THEME # noqa
18
- except ModuleNotFoundError:
19
- console_t = console_options_t = EscapedForRich = DEFAULT_TERMINAL_THEME = None
20
+ else:
21
+ DATE_TIME_COLOR = HighlightedVersion = console_t = console_options_t = (
22
+ EscapedForRich
23
+ ) = DEFAULT_TERMINAL_THEME = None
20
24
 
21
25
  from logger_36.constant.record import SHOW_W_RULE_ATTR
22
26
  from logger_36.task.format.rule import Rule, RuleAsText
23
- from logger_36.type.handler import handler_extension_t
27
+ from logger_36.type.handler import handler_extension_t, message_from_record_h
24
28
 
25
29
 
26
30
  @h.runtime_checkable
@@ -36,6 +40,8 @@ class display_rule_p(h.Protocol):
36
40
  @d.dataclass(slots=True, repr=False, eq=False)
37
41
  class generic_handler_t(l.Handler):
38
42
  """
43
+ kind: See logger_36.constant.handler.handler_codes_h.
44
+
39
45
  alternating_lines:
40
46
  - Initial value:
41
47
  - 1: enabled for dark background
@@ -54,6 +60,8 @@ class generic_handler_t(l.Handler):
54
60
  it is indeed called at the end of the emit method.
55
61
  """
56
62
 
63
+ kind: h.ClassVar[str] = "g"
64
+
57
65
  ShowMessage: show_message_p
58
66
  # "None -> h.Any" (twice below) since None | None is invalid.
59
67
  console: console_t | h.Any = None
@@ -63,7 +71,7 @@ class generic_handler_t(l.Handler):
63
71
 
64
72
  DisplayRule: display_rule_p = d.field(init=False)
65
73
  extension: handler_extension_t = d.field(init=False)
66
- MessageFromRecord: h.Callable[..., tuple[str, str | None]] = d.field(init=False)
74
+ MessageFromRecord: message_from_record_h = d.field(init=False)
67
75
 
68
76
  name: d.InitVar[str | None] = None
69
77
  level: d.InitVar[int] = l.NOTSET
@@ -13,11 +13,11 @@ from logger_36.type.logger import logger_t
13
13
  try:
14
14
  import tensorflow as tsfl # noqa
15
15
  import tensorrt as tsrt # noqa
16
-
17
- _GPU_LOGGING_ERROR = None
18
16
  except ModuleNotFoundError:
19
17
  tsfl = tsrt = None
20
18
  _GPU_LOGGING_ERROR = GPU_LOGGING_ERROR
19
+ else:
20
+ _GPU_LOGGING_ERROR = None
21
21
 
22
22
 
23
23
  def LogGPURelatedDetails(*, logger: logger_t = L) -> None:
@@ -16,7 +16,7 @@ MEMORY_MEASURE_ERROR = (
16
16
  "is not installed or not importable."
17
17
  )
18
18
 
19
- MISSING_RICH_ERROR = (
19
+ MISSING_RICH_MESSAGE = (
20
20
  "The Rich console handler is not available because the Rich package "
21
21
  "(https://rich.readthedocs.io/en/stable/) "
22
22
  "is not installed or not importable. "
@@ -6,8 +6,8 @@ SEE COPYRIGHT NOTICE BELOW
6
6
 
7
7
  import typing as h
8
8
 
9
- handler_codes_h = h.Literal["g", "c", "f", "a"]
10
- HANDLER_CODES: tuple[str, ...] = h.get_args(handler_codes_h)
9
+ handler_codes_h = h.Literal["g", "c", "f", "a"] # g=generic, c=console, f=file, a=all.
10
+ HANDLER_KINDS: tuple[str, ...] = h.get_args(handler_codes_h)
11
11
 
12
12
  ANONYMOUS = "<Anonymous>"
13
13
 
@@ -4,21 +4,14 @@ Contributor(s): Eric Debreuve (eric.debreuve@cnrs.fr) since 2023
4
4
  SEE COPYRIGHT NOTICE BELOW
5
5
  """
6
6
 
7
- import logging as l
8
- import re as regx
9
- import typing as h
7
+ import re as r
10
8
 
11
9
  LOGGER_NAME = "logger-36"
12
10
 
13
11
  # https://docs.python.org/3/library/logging.html#logging.captureWarnings
14
12
  WARNING_LOGGER_NAME = "py.warnings"
15
13
  WARNING_TYPE_PATTERN = r"\s*([^:]+):([0-9]+):\s*([^:]+)\s*:((.|\n)*)"
16
- WARNING_TYPE_COMPILED_PATTERN = regx.compile(WARNING_TYPE_PATTERN)
17
-
18
- # Second version: with self as first parameter.
19
- logger_handle_h = (
20
- h.Callable[[l.LogRecord], None] | h.Callable[[l.Logger, l.LogRecord], None]
21
- )
14
+ WARNING_TYPE_COMPILED_PATTERN = r.compile(WARNING_TYPE_PATTERN)
22
15
 
23
16
  """
24
17
  COPYRIGHT NOTICE
logger_36/content.py CHANGED
@@ -4,9 +4,9 @@ Contributor(s): Eric Debreuve (eric.debreuve@cnrs.fr) since 2023
4
4
  SEE COPYRIGHT NOTICE BELOW
5
5
  """
6
6
 
7
- from logger_36.constant.message import LINE_INDENT
8
- from logger_36.task.format.message import MessageWithActualExpected
9
- from logger_36.task.format.rule import Rule, RuleAsText
7
+ from logger_36.constant.message import LINE_INDENT # noqa
8
+ from logger_36.task.format.message import MessageWithActualExpected # noqa
9
+ from logger_36.task.format.rule import Rule, RuleAsText # noqa
10
10
 
11
11
  """
12
12
  COPYRIGHT NOTICE
logger_36/exception.py CHANGED
@@ -4,6 +4,7 @@ Contributor(s): Eric Debreuve (eric.debreuve@cnrs.fr) since 2023
4
4
  SEE COPYRIGHT NOTICE BELOW
5
5
  """
6
6
 
7
+ import re as r
7
8
  import sys as s
8
9
  import tempfile as tmpf
9
10
  import traceback as tcbk
@@ -30,24 +31,57 @@ def _HandleException(
30
31
  while trace.tb_next is not None:
31
32
  trace = trace.tb_next
32
33
  frame = trace.tb_frame
33
- module = frame.f_code.co_filename
34
- function = frame.f_code.co_name
35
- line = frame.f_lineno
36
-
37
- home = str(path_t.home())
38
- if module.startswith(home):
39
- module = "~" + module[home.__len__() :]
40
-
41
- message = str(exception)
34
+ code = frame.f_code
35
+ module = path_t(code.co_filename)
36
+ function = code.co_name
37
+ line_number = frame.f_lineno
38
+ line_content = module.read_text().splitlines()[line_number - 1].strip()
39
+
40
+ # Format module.
41
+ home = path_t.home()
42
+ if module.is_relative_to(home):
43
+ module = path_t("~") / module.relative_to(home)
44
+
45
+ # Format line content.
46
+ if line_content.startswith("raise "):
47
+ # Do not display code of explicit exception raising.
48
+ line_content = None
49
+
50
+ # Find variables appearing in the line.
51
+ if line_content is None:
52
+ line_content = variables = ""
53
+ else:
54
+ all_variables = frame.f_locals
55
+ found_names = []
56
+ for match in r.finditer(r"[^\d\W]\w*", line_content):
57
+ name = match.group()
58
+ if name in all_variables:
59
+ found_names.append(name)
60
+ if found_names.__len__() > 0:
61
+ longest = max(map(len, found_names))
62
+ variables = map(
63
+ lambda _: f"{_:{longest}} = {all_variables[_]}", sorted(found_names)
64
+ )
65
+ variables = " " + "\n ".join(variables) + "\n"
66
+ else:
67
+ variables = ""
68
+
69
+ line_content = f" {line_content}\n"
70
+
71
+ # Format message.
72
+ message = str(exception).strip()
42
73
  if message.__len__() > 0:
43
- message = f" {message}\n"
74
+ message = f" {message[0].title()}{message[1:]}\n"
44
75
 
45
76
  document = tmpf.NamedTemporaryFile(delete=False)
46
77
 
47
78
  print(
48
79
  f"{stripe.__name__}\n"
49
- f" {module}.{function}@{line}\n"
50
- f"{message} Full report at: {document.name}",
80
+ f" {module}:{function}@{line_number}\n"
81
+ f"{line_content}"
82
+ f"{variables}"
83
+ f"{message}"
84
+ f" Full report at: {document.name}",
51
85
  file=s.stderr,
52
86
  )
53
87
 
logger_36/gpu.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
- from logger_36.catalog.logger.gpu import LogGPURelatedDetails
7
+ from logger_36.catalog.logger.gpu import LogGPURelatedDetails # noqa
8
8
 
9
9
  """
10
10
  COPYRIGHT NOTICE
logger_36/handler.py CHANGED
@@ -8,21 +8,18 @@ import logging as l
8
8
  import sys as s
9
9
  from pathlib import Path as path_t
10
10
 
11
+ from logger_36.catalog.config.optional import MISSING_RICH_MESSAGE, RICH_IS_AVAILABLE
11
12
  from logger_36.catalog.handler.console import console_handler_t
12
13
  from logger_36.catalog.handler.file import file_handler_t
13
14
  from logger_36.catalog.handler.generic import generic_handler_t, show_message_p
14
- from logger_36.constant.error import MISSING_RICH_ERROR
15
15
 
16
- try:
16
+ if RICH_IS_AVAILABLE:
17
17
  from logger_36.catalog.handler.console_rich import console_rich_handler_t
18
-
19
- _MISSING_RICH_ERROR = None
20
- except ModuleNotFoundError:
18
+ else:
21
19
  from logger_36.catalog.handler.console import (
22
20
  console_handler_t as console_rich_handler_t,
23
21
  )
24
-
25
- _MISSING_RICH_ERROR = MISSING_RICH_ERROR
22
+ _MISSING_RICH_MESSAGE = MISSING_RICH_MESSAGE
26
23
 
27
24
 
28
25
  def AddGenericHandler(
@@ -54,7 +51,7 @@ def AddGenericHandler(
54
51
  rich_kwargs=kwargs,
55
52
  ShowMessage=ShowMessage,
56
53
  )
57
- logger.AddHandler(handler, should_hold_messages)
54
+ logger.AddHandler(handler, should_hold_messages=should_hold_messages)
58
55
 
59
56
 
60
57
  def AddConsoleHandler(
@@ -76,7 +73,7 @@ def AddConsoleHandler(
76
73
  message_width=message_width,
77
74
  formatter=formatter,
78
75
  )
79
- logger.AddHandler(handler, should_hold_messages)
76
+ logger.AddHandler(handler, should_hold_messages=should_hold_messages)
80
77
 
81
78
 
82
79
  def AddRichConsoleHandler(
@@ -95,10 +92,10 @@ def AddRichConsoleHandler(
95
92
  **kwargs,
96
93
  ) -> None:
97
94
  """"""
98
- global _MISSING_RICH_ERROR
99
- if _MISSING_RICH_ERROR is not None:
100
- print(_MISSING_RICH_ERROR, file=s.stderr)
101
- _MISSING_RICH_ERROR = None
95
+ global _MISSING_RICH_MESSAGE
96
+ if _MISSING_RICH_MESSAGE is not None:
97
+ print(_MISSING_RICH_MESSAGE, file=s.stderr)
98
+ _MISSING_RICH_MESSAGE = None
102
99
 
103
100
  if console_rich_handler_t is console_handler_t:
104
101
  additional_s = {}
@@ -117,7 +114,7 @@ def AddRichConsoleHandler(
117
114
  formatter=formatter,
118
115
  **additional_s,
119
116
  )
120
- logger.AddHandler(handler, should_hold_messages)
117
+ logger.AddHandler(handler, should_hold_messages=should_hold_messages)
121
118
 
122
119
 
123
120
  def AddFileHandler(
@@ -149,7 +146,7 @@ def AddFileHandler(
149
146
  handler_args=args,
150
147
  handler_kwargs=kwargs,
151
148
  )
152
- logger.AddHandler(handler, should_hold_messages)
149
+ logger.AddHandler(handler, should_hold_messages=should_hold_messages)
153
150
 
154
151
 
155
152
  """
logger_36/memory.py CHANGED
@@ -4,14 +4,17 @@ Contributor(s): Eric Debreuve (eric.debreuve@cnrs.fr) since 2023
4
4
  SEE COPYRIGHT NOTICE BELOW
5
5
  """
6
6
 
7
- from logger_36.catalog.logger.memory import LogMaximumMemoryUsage, LogMemoryUsages
8
- from logger_36.task.format.memory import FormattedUsage as FormattedMemoryUsage
9
- from logger_36.task.format.memory import (
7
+ from logger_36.catalog.logger.memory import ( # noqa
8
+ LogMaximumMemoryUsage,
9
+ LogMemoryUsages,
10
+ )
11
+ from logger_36.task.format.memory import FormattedUsage as FormattedMemoryUsage # noqa
12
+ from logger_36.task.format.memory import ( # noqa
10
13
  FormattedUsageWithAutoUnit as FormattedMemoryUsageWithAutoUnit,
11
14
  )
12
- from logger_36.task.format.memory import UsageBar as MemoryUsageBar
13
- from logger_36.task.measure.memory import CanCheckUsage as CanCheckMemoryUsage
14
- from logger_36.task.measure.memory import CurrentUsage as CurrentMemoryUsage
15
+ from logger_36.task.format.memory import UsageBar as MemoryUsageBar # noqa
16
+ from logger_36.task.measure.memory import CanCheckUsage as CanCheckMemoryUsage # noqa
17
+ from logger_36.task.measure.memory import CurrentUsage as CurrentMemoryUsage # noqa
15
18
 
16
19
  """
17
20
  COPYRIGHT NOTICE
logger_36/storage.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
- from logger_36.task.storage import SaveLOGasHTML
7
+ from logger_36.task.storage import SaveLOGasHTML # noqa
8
8
 
9
9
  """
10
10
  COPYRIGHT NOTICE
logger_36/system.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
- from logger_36.catalog.logger.system import LogSystemDetails
7
+ from logger_36.catalog.logger.system import LogSystemDetails # noqa
8
8
 
9
9
  """
10
10
  COPYRIGHT NOTICE
@@ -4,6 +4,8 @@ Contributor(s): Eric Debreuve (eric.debreuve@cnrs.fr) since 2023
4
4
  SEE COPYRIGHT NOTICE BELOW
5
5
  """
6
6
 
7
+ from logger_36.catalog.config.optional import RICH_IS_AVAILABLE
8
+
7
9
 
8
10
  def RuleAsText(text: str | None, /) -> str:
9
11
  """"""
@@ -13,7 +15,7 @@ def RuleAsText(text: str | None, /) -> str:
13
15
  return f"---- ---- ---- ---- {text} ---- ---- ---- ----"
14
16
 
15
17
 
16
- try:
18
+ if RICH_IS_AVAILABLE:
17
19
  from rich.rule import Rule as rule_t # noqa
18
20
  from rich.text import Text as text_t # noqa
19
21
 
@@ -24,7 +26,7 @@ try:
24
26
  else:
25
27
  return rule_t(title=text_t(text, style=f"bold {color}"), style=color)
26
28
 
27
- except ModuleNotFoundError:
29
+ else:
28
30
  Rule = lambda _txt, _: RuleAsText(_txt)
29
31
 
30
32
  """
@@ -6,10 +6,10 @@ SEE COPYRIGHT NOTICE BELOW
6
6
 
7
7
  try:
8
8
  from psutil import Process as process_t # noqa
9
-
10
- _PROCESS = process_t()
11
9
  except ModuleNotFoundError:
12
10
  _PROCESS = None
11
+ else:
12
+ _PROCESS = process_t()
13
13
 
14
14
 
15
15
  def CanCheckUsage() -> bool:
logger_36/task/storage.py CHANGED
@@ -6,17 +6,19 @@ SEE COPYRIGHT NOTICE BELOW
6
6
 
7
7
  import dataclasses as d
8
8
  import logging as l
9
- import re as regx
9
+ import re as r
10
10
  from html.parser import HTMLParser as html_parser_t
11
11
  from io import IOBase as io_base_t
12
12
  from pathlib import Path as path_t
13
13
 
14
- try:
14
+ from logger_36.catalog.config.optional import RICH_IS_AVAILABLE
15
+ from logger_36.instance.logger import L
16
+
17
+ if RICH_IS_AVAILABLE:
15
18
  from rich.console import Console as console_t # noqa
16
- except ModuleNotFoundError:
19
+ else:
17
20
  console_t = None
18
21
 
19
- from logger_36.instance.logger import L
20
22
 
21
23
  _BODY_END_PATTERN = r"</[bB][oO][dD][yY]>(.|\n)*$"
22
24
 
@@ -60,7 +62,7 @@ class html_reader_t(html_parser_t):
60
62
  output[self.body_position_start[0] : (self.body_position_end[0] + 1)]
61
63
  )
62
64
  output = output[self.body_position_start[1] :]
63
- output = regx.sub(_BODY_END_PATTERN, "", output, count=1)
65
+ output = r.sub(_BODY_END_PATTERN, "", output, count=1)
64
66
 
65
67
  return output.strip()
66
68
 
logger_36/time.py CHANGED
@@ -4,8 +4,8 @@ Contributor(s): Eric Debreuve (eric.debreuve@cnrs.fr) since 2023
4
4
  SEE COPYRIGHT NOTICE BELOW
5
5
  """
6
6
 
7
- from logger_36.catalog.logger.chronos import LogElapsedTime
8
- from logger_36.task.measure.chronos import ElapsedTime, TimeStamp
7
+ from logger_36.catalog.logger.chronos import LogElapsedTime # noqa
8
+ from logger_36.task.measure.chronos import ElapsedTime, TimeStamp # noqa
9
9
 
10
10
  """
11
11
  COPYRIGHT NOTICE
logger_36/type/handler.py CHANGED
@@ -16,12 +16,31 @@ from logger_36.config.message import (
16
16
  WHERE_SEPARATOR,
17
17
  )
18
18
  from logger_36.constant.error import MEMORY_MEASURE_ERROR
19
- from logger_36.constant.handler import HANDLER_CODES
19
+ from logger_36.constant.handler import HANDLER_KINDS
20
20
  from logger_36.constant.message import NEXT_LINE_PROLOGUE
21
21
  from logger_36.task.format.message import MessageWithActualExpected
22
22
  from logger_36.task.measure.chronos import TimeStamp
23
23
  from logger_36.task.measure.memory import CanCheckUsage as CanCheckMemoryUsage
24
24
 
25
+
26
+ @h.runtime_checkable
27
+ class message_from_record_raw_p(h.Protocol):
28
+ def __call__(self, record: l.LogRecord, /) -> str: ...
29
+
30
+
31
+ @h.runtime_checkable
32
+ class message_from_record_preprocessed_p(h.Protocol):
33
+ def __call__(
34
+ self,
35
+ record: l.LogRecord,
36
+ /,
37
+ *,
38
+ PreProcessed: h.Callable[[str], str] | None = None,
39
+ ) -> str: ...
40
+
41
+
42
+ message_from_record_h = message_from_record_raw_p | message_from_record_preprocessed_p
43
+
25
44
  _MEMORY_MEASURE_ERROR = MEMORY_MEASURE_ERROR
26
45
 
27
46
 
@@ -30,7 +49,7 @@ class handler_extension_t:
30
49
  name: str | None = None
31
50
  should_store_memory_usage: bool = False
32
51
  message_width: int = -1
33
- MessageFromRecord: h.Callable[..., str] = d.field(init=False)
52
+ MessageFromRecord: message_from_record_h = d.field(init=False)
34
53
 
35
54
  handler: d.InitVar[l.Handler | None] = None
36
55
  level: d.InitVar[int] = l.NOTSET
@@ -42,12 +61,12 @@ class handler_extension_t:
42
61
  """"""
43
62
  global _MEMORY_MEASURE_ERROR
44
63
 
45
- if self.name in HANDLER_CODES:
64
+ if self.name in HANDLER_KINDS:
46
65
  raise ValueError(
47
66
  MessageWithActualExpected(
48
67
  "Invalid handler name",
49
68
  actual=self.name,
50
- expected=f"a name not in {str(HANDLER_CODES)[1:-1]}",
69
+ expected=f"a name not in {str(HANDLER_KINDS)[1:-1]}",
51
70
  )
52
71
  )
53
72
 
logger_36/type/logger.py CHANGED
@@ -24,13 +24,12 @@ from logger_36.config.message import (
24
24
  TIME_FORMAT,
25
25
  )
26
26
  from logger_36.constant.generic import NOT_PASSED
27
- from logger_36.constant.handler import ANONYMOUS
27
+ from logger_36.constant.handler import ANONYMOUS, HANDLER_KINDS, handler_codes_h
28
28
  from logger_36.constant.issue import ISSUE_LEVEL_SEPARATOR, ORDER, order_h
29
29
  from logger_36.constant.logger import (
30
30
  LOGGER_NAME,
31
31
  WARNING_LOGGER_NAME,
32
32
  WARNING_TYPE_COMPILED_PATTERN,
33
- logger_handle_h,
34
33
  )
35
34
  from logger_36.constant.memory import UNKNOWN_MEMORY_USAGE
36
35
  from logger_36.constant.message import TIME_LENGTH_m_1, expected_op_h
@@ -46,14 +45,18 @@ from logger_36.task.measure.chronos import ElapsedTime
46
45
  from logger_36.task.measure.memory import CurrentUsage as CurrentMemoryUsage
47
46
  from logger_36.type.issue import NewIssue, issue_t
48
47
 
49
- logger_base_t = l.Logger
48
+ base_t = l.Logger
49
+
50
+ logger_handle_raw_h = h.Callable[[l.LogRecord], None]
51
+ logger_handle_with_self_h = h.Callable[[l.Logger, l.LogRecord], None]
52
+ logger_handle_h = logger_handle_raw_h | logger_handle_with_self_h
50
53
 
51
54
  _DATE_TIME_ORIGIN = date_time_t.fromtimestamp(1970, None)
52
55
  _DATE_ORIGIN = _DATE_TIME_ORIGIN.date()
53
56
 
54
57
 
55
58
  @d.dataclass(slots=True, repr=False, eq=False)
56
- class logger_t(logger_base_t):
59
+ class logger_t(base_t):
57
60
  """
58
61
  intercepted_wrn_handle: When warning interception is on, this stores the original
59
62
  "handle" method of the Python warning logger.
@@ -85,9 +88,9 @@ class logger_t(logger_base_t):
85
88
  self, name_: str, level_: int, activate_wrn_interceptions: bool
86
89
  ) -> None:
87
90
  """"""
88
- logger_base_t.__init__(self, name_)
91
+ base_t.__init__(self, name_)
89
92
  self.setLevel(level_)
90
- self.propagate = False # Part of logger_base_t.
93
+ self.propagate = False # Part of base_t.
91
94
 
92
95
  for level in l.getLevelNamesMapping().values():
93
96
  self.events[level] = 0
@@ -97,6 +100,39 @@ class logger_t(logger_base_t):
97
100
  if self.exit_on_error:
98
101
  self.exit_on_critical = True
99
102
 
103
+ def SetLevel(
104
+ self,
105
+ level: int,
106
+ /,
107
+ *,
108
+ which: handler_codes_h | str = "a",
109
+ ) -> None:
110
+ """
111
+ Set level of handlers, but the logger level is not modified.
112
+
113
+ which: if not a handler_codes_h, then it corresponds to a handler name.
114
+ """
115
+ found = False
116
+ for handler in self.handlers:
117
+ if (
118
+ (which == "a")
119
+ or ((which in "cfg") and (getattr(handler, "kind", None) == which))
120
+ or (which == handler.name)
121
+ ):
122
+ handler.setLevel(level)
123
+ if which not in HANDLER_KINDS:
124
+ return
125
+ found = True
126
+
127
+ if not found:
128
+ raise ValueError(
129
+ MessageWithActualExpected(
130
+ "Handler not found",
131
+ actual=which,
132
+ expected=f"{str(HANDLER_KINDS)[1:-1]}, or a handler name",
133
+ )
134
+ )
135
+
100
136
  def MakeRich(self, *, alternating_lines: int = 2) -> None:
101
137
  """"""
102
138
  OverrideExceptionFormat()
@@ -182,10 +218,12 @@ class logger_t(logger_base_t):
182
218
 
183
219
  return "?", UNKNOWN_MEMORY_USAGE
184
220
 
185
- def AddHandler(self, handler: l.Handler, should_hold_messages: bool, /) -> None:
221
+ def AddHandler(
222
+ self, handler: l.Handler, /, *, should_hold_messages: bool = False
223
+ ) -> None:
186
224
  """"""
187
225
  self.should_hold_messages = should_hold_messages
188
- logger_base_t.addHandler(self, handler)
226
+ base_t.addHandler(self, handler)
189
227
 
190
228
  extension = getattr(handler, "extension", None)
191
229
  if extension is None:
@@ -212,7 +250,7 @@ class logger_t(logger_base_t):
212
250
 
213
251
  if (self.on_hold.__len__() > 0) and not self.should_hold_messages:
214
252
  for held in self.on_hold:
215
- logger_base_t.handle(self, held)
253
+ base_t.handle(self, held)
216
254
  self.on_hold.clear()
217
255
 
218
256
  if (date := now.date()) != self.last_message_date:
@@ -229,7 +267,7 @@ class logger_t(logger_base_t):
229
267
  if self.should_hold_messages:
230
268
  self.on_hold.append(date_record)
231
269
  else:
232
- logger_base_t.handle(self, date_record)
270
+ base_t.handle(self, date_record)
233
271
 
234
272
  # When.
235
273
  if now - self.last_message_now > LONG_ENOUGH:
@@ -271,7 +309,7 @@ class logger_t(logger_base_t):
271
309
  if self.should_hold_messages:
272
310
  self.on_hold.append(record)
273
311
  else:
274
- logger_base_t.handle(self, record)
312
+ base_t.handle(self, record)
275
313
 
276
314
  if (self.exit_on_critical and (record.levelno is l.CRITICAL)) or (
277
315
  self.exit_on_error and (record.levelno is l.ERROR)
@@ -462,10 +500,10 @@ class logger_t(logger_base_t):
462
500
  return False
463
501
 
464
502
 
465
- def _HandleForWarnings(interceptor: logger_base_t, /) -> logger_handle_h:
503
+ def _HandleForWarnings(interceptor: base_t, /) -> logger_handle_h:
466
504
  """"""
467
505
 
468
- def handle_p(_: logger_base_t, record: l.LogRecord, /) -> None:
506
+ def handle_p(_: base_t, record: l.LogRecord, /) -> None:
469
507
  pieces = WARNING_TYPE_COMPILED_PATTERN.match(record.msg)
470
508
  if pieces is None:
471
509
  # The warning message does not follow the default format.
@@ -491,11 +529,11 @@ def _HandleForWarnings(interceptor: logger_base_t, /) -> logger_handle_h:
491
529
 
492
530
 
493
531
  def _HandleForInterceptions(
494
- intercepted: logger_base_t, interceptor: logger_base_t, /
532
+ intercepted: base_t, interceptor: base_t, /
495
533
  ) -> logger_handle_h:
496
534
  """"""
497
535
 
498
- def handle_p(_: logger_base_t, record: l.LogRecord, /) -> None:
536
+ def handle_p(_: base_t, record: l.LogRecord, /) -> None:
499
537
  duplicate = l.makeLogRecord(record.__dict__)
500
538
  duplicate.msg = f"{record.msg} :{intercepted.name}:"
501
539
  interceptor.handle(duplicate)
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.5"
7
+ __version__ = "2025.6"
8
8
 
9
9
  """
10
10
  COPYRIGHT NOTICE
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.2
2
2
  Name: logger-36
3
- Version: 2025.5
3
+ Version: 2025.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
@@ -0,0 +1,52 @@
1
+ logger_36/__init__.py,sha256=3BtAgxFb14e9zzC5fXwqSQxstsd3BO0b_KVu3_wbLwg,2592
2
+ logger_36/content.py,sha256=clHYYUKa8n4qef6PVlUV4mFHRRf6fnm9wEd2fu9oagA,2381
3
+ logger_36/exception.py,sha256=YNT4S_gvz7WQUSWILFAwI01h5-BVw1d0oT97zjnw3dU,4575
4
+ logger_36/gpu.py,sha256=BOumedCAPWvCo7J-KJ3XE-jr5S0KSmgcFv_S4QKRPO8,2252
5
+ logger_36/handler.py,sha256=hEKhfsKHhg8UqSrBTVe7w0lubf9SSkuGMi81oXwjPoo,6326
6
+ logger_36/memory.py,sha256=szJVk4UTXsbYv3B-W9LFttf1F3j86GXHsKgEUOsXKl4,2743
7
+ logger_36/storage.py,sha256=sCxkHQH4xMaseweK1p2M1j0j2PxNPpy9MytPdg1sKiQ,2239
8
+ logger_36/system.py,sha256=cgOMF_OneYeIJDMbIbIDx96EZss2uAdkk8QofOC7O1U,2251
9
+ logger_36/time.py,sha256=Uw1jQtY1njsRuIPRAXX44v4nPOo84MSBu_WK_YCRzQs,2324
10
+ logger_36/version.py,sha256=eAXepMLNtMw0muvMucofZ1LJ6BBOIZKujqvtOs93Qho,2205
11
+ logger_36/api/logger.py,sha256=TE3ATbymeWX-wBKBFkVz2FxUyJnaqY7vzFwAONVsp2o,2233
12
+ logger_36/api/storage.py,sha256=KT52AGR37nsMrhKTVfG8R-Dc7lmCXjWML18cOqqCXZY,2239
13
+ logger_36/catalog/config/console_rich.py,sha256=lAa5Ev5BhXvmQzfIt1FNihMNUQJFlXaIzNanAMdgtd0,2861
14
+ logger_36/catalog/config/optional.py,sha256=HaN6mbx7gHBBppNvUw1ckhYTOrlYqb-b_r0mzPcHPjM,2398
15
+ logger_36/catalog/handler/console.py,sha256=tLMroj95xt_IC9Vra4M5TCDRKrU4mSkfvUg9GliQ_l8,4402
16
+ logger_36/catalog/handler/console_rich.py,sha256=gkRnbhwyFFrS4nGvgUn9lElh7YNCAaC2-7dAex5bHzI,8592
17
+ logger_36/catalog/handler/file.py,sha256=hCb21GahjeRbBJGtPsa2PPme7LmlZ8ftF3Q_BMKRiA8,4865
18
+ logger_36/catalog/handler/generic.py,sha256=Y6rxfKkWe9cA196ntt6p0_rcjEeESGFCKWVlo1WIzW0,9335
19
+ logger_36/catalog/logger/chronos.py,sha256=ocY13f98EfknU7wZCv0FS9Xb7pTNaWCPSusXFIEvEd4,2437
20
+ logger_36/catalog/logger/gpu.py,sha256=lzrkqrMnXsszRB_TiHFqnNNI7JhNat8qL2OSlnHDe5c,3412
21
+ logger_36/catalog/logger/memory.py,sha256=CWhr2J4BqArJxzH6tS-ZThr-rYPAQGtuLn0pP7Iryfg,4685
22
+ logger_36/catalog/logger/system.py,sha256=KXP2jdPd-ACFNdA0wWdmOLwuxt4baUvXkuChyOHyfy0,3066
23
+ logger_36/config/issue.py,sha256=G-i5p6lhZCLAOa-VTMyL9ZonvGCvhdoQ5KZdSWgP-FU,2267
24
+ logger_36/config/memory.py,sha256=yCX5phsB_KJMr5xHpVUeOHFhAA7p_8yahP3X28VndOY,2217
25
+ logger_36/config/message.py,sha256=yfbMO_Jk1IbWvT6Lp6hVpID2Tr99cuiJ-ZaMBesIFXw,2527
26
+ logger_36/config/system.py,sha256=HD8ZuwsXhEAExeZrww8YoDkQGMs4T5RDqQMb1W4qVgc,2477
27
+ logger_36/constant/error.py,sha256=LzsS_P1IoH3ct_ifNWi9LzJ-X_Y5DN1naTLwwIFzDQA,2827
28
+ logger_36/constant/generic.py,sha256=t6aRb66_NHwMhR1p7BZ4QXTU2jpLz-H5YAL4PuMtKx8,2244
29
+ logger_36/constant/handler.py,sha256=PQUehMK9Yg0_rBDcMc8xpUbAsCauCLy_eS_ntiWew1Y,2378
30
+ logger_36/constant/issue.py,sha256=01l8itRPWGS5F6gXtsXUJgGR-4lS1Eu3_YeKC-khKLw,2315
31
+ logger_36/constant/logger.py,sha256=2qRkteblpbHrq9x0aiw9MPquyXrSRd6_yMQnPEhFp2U,2468
32
+ logger_36/constant/memory.py,sha256=ZL1MwbdtNsrCrOwzEyfTsfOoOsRBTJtbbf3otHGnxXo,2343
33
+ logger_36/constant/message.py,sha256=Ys_CAyhENlT8Z3rr-AxO4hjdl1jLsKzVSPQ8wqLOCPQ,2838
34
+ logger_36/constant/record.py,sha256=9Q28lVH_s0og4v74delgwIPAJ9G28I5rBM-brXcoY80,2308
35
+ logger_36/constant/system.py,sha256=G2mzBTxRXoJMxb53TnmBaceMJC_q3WonoCG7y6nC_R8,2430
36
+ logger_36/instance/logger.py,sha256=oTw5svRzKRJKvGrrZUtutJIOjp5UISft3fl0Ze7DOBE,2241
37
+ logger_36/instance/loggers.py,sha256=RCWpC1NPAf6vXnFc9NqsSALv-x-FEzcH6k_OlxTxeQk,2251
38
+ logger_36/task/inspection.py,sha256=KZzmQyREQ6VmBWCLyNIYIOOISW9C_fC9TWTSX90zGDk,5019
39
+ logger_36/task/storage.py,sha256=2B4OU7RqpUe98-pY9fadfnW8aFwxtsLSRGKkBtGWn-k,5686
40
+ logger_36/task/format/memory.py,sha256=jpQS8tAdxy7GM_FzqEIJUU3m-6O9iX-jiyO7gx5YwR8,4266
41
+ logger_36/task/format/message.py,sha256=T2V2gUlUQqSojyRrz4I4uAHwNe6eBEsuAe6V-LTyx0k,3867
42
+ logger_36/task/format/rule.py,sha256=vkf-HivFb4VqV2GeOPVqMAp99krtziI-kXhox3UVnzw,2873
43
+ logger_36/task/measure/chronos.py,sha256=1kVhu6jZlNAtNWQQh8ZVuRwZIAC9gGz3_ul1tn0t4Yw,3055
44
+ logger_36/task/measure/memory.py,sha256=OjU5EYFH8SnzlCQKAoiXvauUlwQYOrH34jFXTVYF0jE,2517
45
+ logger_36/type/handler.py,sha256=7M8f8U-zedzo-1AR7iIxHnzRHsuDj9IM0WtrqG2GMY0,6902
46
+ logger_36/type/issue.py,sha256=2rGsFqaQJCbeml9xN08mN_nK79L8qscaS_0ws36Y0bI,3214
47
+ logger_36/type/logger.py,sha256=4cCa-u1ktDdlj96aOWz6OsDJ_WhuN7eKEEALIHDS9NY,20451
48
+ logger_36/type/loggers.py,sha256=znqxWBnfQxvkg3VUfbTUvt3S6Kq0DAzWWepxQDt9suI,2871
49
+ logger_36-2025.6.dist-info/METADATA,sha256=AQ37dDMn1ZG7E3X5x29OR4_GaeG_FWcVkjew0B9hbzw,6505
50
+ logger_36-2025.6.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
51
+ logger_36-2025.6.dist-info/top_level.txt,sha256=sM95BTMWmslEEgR_1pzwZsOeSp8C_QBiu8ImbFr0XLc,10
52
+ logger_36-2025.6.dist-info/RECORD,,
@@ -1,52 +0,0 @@
1
- logger_36/__init__.py,sha256=3BtAgxFb14e9zzC5fXwqSQxstsd3BO0b_KVu3_wbLwg,2592
2
- logger_36/content.py,sha256=ni9gdYYNZoDa91KNianWBluOBe9KxZMZtzalcBS6vhE,2357
3
- logger_36/exception.py,sha256=CDHwCeILgCq8Z9IF0xDwd37wTczxFUTUSngtO0RCs00,3415
4
- logger_36/gpu.py,sha256=YYFk6aYQrBDJfxQaDm-ar16T6SlOSL6jJWTOgvpF4EU,2244
5
- logger_36/handler.py,sha256=Lle0eHQGXw86kDKhFPAsbc6VTtKAGBRY3NbgRwb22D0,6242
6
- logger_36/memory.py,sha256=FTc3qCeMqnCNvHJ4Yds73noPENQx_U1MYB-R4LLUjVQ,2682
7
- logger_36/storage.py,sha256=TNfIXEfHcjixv75wocUyqwX62iDYsor4srRqC3FNzbc,2231
8
- logger_36/system.py,sha256=xzm6cMeTaCX9VX9ZRXUXgfqoT9oUtv3W2o_H2W0P-4Q,2243
9
- logger_36/time.py,sha256=_CtpQeUZdsUNGNfwzhoWUiUvawRgmonqwZPHouzWf5M,2308
10
- logger_36/version.py,sha256=fGumU_oHdColabh0PPq2BbbOtvjiaBGJGm7CfodTKq8,2205
11
- logger_36/api/logger.py,sha256=Wg2nzQeuRVZ4v-oy3Q2KdYsHSzF9v7a0Fk6BzLnbkYw,2225
12
- logger_36/api/storage.py,sha256=evKVqIsslA5X82LaZ2HQDxp7ltyNOn8Tr-3-Pic3eUo,2231
13
- logger_36/catalog/config/console_rich.py,sha256=hp2r1bsT_Zj4c-IzL6-sPQKe0yrIKUX7IxseK-znXTo,2845
14
- logger_36/catalog/handler/console.py,sha256=glrpWsmZsB7uZdQA0HLSKGGIz6OrvhOOiJp5XRibBNU,4226
15
- logger_36/catalog/handler/console_rich.py,sha256=09xd50E8REu2iFtTNj0rYJfUFVxBzneqwWTmSYquiM0,8355
16
- logger_36/catalog/handler/file.py,sha256=C6x58N2asQ4LDBTKyNBBOlIs719FeVg80PsaDjlDg04,4690
17
- logger_36/catalog/handler/generic.py,sha256=LE2_aEMjM2sjoPN9i7E0OEulKt6f-SYAoqYZ_ugVnZc,9123
18
- logger_36/catalog/logger/chronos.py,sha256=ocY13f98EfknU7wZCv0FS9Xb7pTNaWCPSusXFIEvEd4,2437
19
- logger_36/catalog/logger/gpu.py,sha256=dw1eiEJurjXZBE1EhrHHR2LJbcHZ9sUSB9Z_SoJk2Ts,3407
20
- logger_36/catalog/logger/memory.py,sha256=CWhr2J4BqArJxzH6tS-ZThr-rYPAQGtuLn0pP7Iryfg,4685
21
- logger_36/catalog/logger/system.py,sha256=KXP2jdPd-ACFNdA0wWdmOLwuxt4baUvXkuChyOHyfy0,3066
22
- logger_36/config/issue.py,sha256=G-i5p6lhZCLAOa-VTMyL9ZonvGCvhdoQ5KZdSWgP-FU,2267
23
- logger_36/config/logger.py,sha256=Iiox_X1N2Ty73N-Ao0XI6dsBebXqvZd0efP3h1txYjc,3691
24
- logger_36/config/memory.py,sha256=yCX5phsB_KJMr5xHpVUeOHFhAA7p_8yahP3X28VndOY,2217
25
- logger_36/config/message.py,sha256=yfbMO_Jk1IbWvT6Lp6hVpID2Tr99cuiJ-ZaMBesIFXw,2527
26
- logger_36/config/system.py,sha256=HD8ZuwsXhEAExeZrww8YoDkQGMs4T5RDqQMb1W4qVgc,2477
27
- logger_36/constant/error.py,sha256=1gdnCwUu3d3ThL4AKxzjn7ijSTBWlr2g-8cAKbubl4A,2825
28
- logger_36/constant/generic.py,sha256=t6aRb66_NHwMhR1p7BZ4QXTU2jpLz-H5YAL4PuMtKx8,2244
29
- logger_36/constant/handler.py,sha256=cBf_bPB9fceCuIpzmqj345vaas-kx17YRO-rFF3Cvms,2338
30
- logger_36/constant/issue.py,sha256=01l8itRPWGS5F6gXtsXUJgGR-4lS1Eu3_YeKC-khKLw,2315
31
- logger_36/constant/logger.py,sha256=yorhAOTQTlIKE_51LZUhXfehrBAPfiPRJ5qJ4NA4GP8,2664
32
- logger_36/constant/memory.py,sha256=ZL1MwbdtNsrCrOwzEyfTsfOoOsRBTJtbbf3otHGnxXo,2343
33
- logger_36/constant/message.py,sha256=Ys_CAyhENlT8Z3rr-AxO4hjdl1jLsKzVSPQ8wqLOCPQ,2838
34
- logger_36/constant/record.py,sha256=9Q28lVH_s0og4v74delgwIPAJ9G28I5rBM-brXcoY80,2308
35
- logger_36/constant/system.py,sha256=G2mzBTxRXoJMxb53TnmBaceMJC_q3WonoCG7y6nC_R8,2430
36
- logger_36/instance/logger.py,sha256=oTw5svRzKRJKvGrrZUtutJIOjp5UISft3fl0Ze7DOBE,2241
37
- logger_36/instance/loggers.py,sha256=RCWpC1NPAf6vXnFc9NqsSALv-x-FEzcH6k_OlxTxeQk,2251
38
- logger_36/task/inspection.py,sha256=KZzmQyREQ6VmBWCLyNIYIOOISW9C_fC9TWTSX90zGDk,5019
39
- logger_36/task/storage.py,sha256=33Fz-7Isko_e6z9Ig9IkgDJ-NQKgkPhI4Pw3w6IlH1E,5632
40
- logger_36/task/format/memory.py,sha256=jpQS8tAdxy7GM_FzqEIJUU3m-6O9iX-jiyO7gx5YwR8,4266
41
- logger_36/task/format/message.py,sha256=T2V2gUlUQqSojyRrz4I4uAHwNe6eBEsuAe6V-LTyx0k,3867
42
- logger_36/task/format/rule.py,sha256=OjNZQa_dZrH4Vhide6xm3EuV0lLC6tR1Q2_ZAxD7ito,2813
43
- logger_36/task/measure/chronos.py,sha256=1kVhu6jZlNAtNWQQh8ZVuRwZIAC9gGz3_ul1tn0t4Yw,3055
44
- logger_36/task/measure/memory.py,sha256=-V9UDFlDwmtUlfBzovcMgmsaYxwyoE1YmfXjXZ2iuNc,2512
45
- logger_36/type/handler.py,sha256=_cmOyF48nMTMUspSGH-Z1iil5AzEBW9wcEeTfC8lld8,6447
46
- logger_36/type/issue.py,sha256=2rGsFqaQJCbeml9xN08mN_nK79L8qscaS_0ws36Y0bI,3214
47
- logger_36/type/logger.py,sha256=7NI6P5VkjMVdpirEMqIAhVADh-nOpKmKgDgHOqDSF4k,19332
48
- logger_36/type/loggers.py,sha256=znqxWBnfQxvkg3VUfbTUvt3S6Kq0DAzWWepxQDt9suI,2871
49
- logger_36-2025.5.dist-info/METADATA,sha256=5nalYzhNdZDZoLfFlrBBRzRkLbnBR7U7mVqcfl_vQDs,6505
50
- logger_36-2025.5.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
51
- logger_36-2025.5.dist-info/top_level.txt,sha256=sM95BTMWmslEEgR_1pzwZsOeSp8C_QBiu8ImbFr0XLc,10
52
- logger_36-2025.5.dist-info/RECORD,,