logger-36 2024.17__py3-none-any.whl → 2024.19__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/__init__.py CHANGED
@@ -5,13 +5,6 @@ SEE COPYRIGHT NOTICE BELOW
5
5
  """
6
6
 
7
7
  from logger_36.instance.logger import LOGGER
8
- from logger_36.main import (
9
- AddConsoleHandler,
10
- AddFileHandler,
11
- AddGenericHandler,
12
- AddRichConsoleHandler,
13
- )
14
- from logger_36.task.format.message import FormattedMessage
15
8
  from logger_36.type.logger import logger_t
16
9
  from logger_36.version import __version__
17
10
 
@@ -24,6 +24,9 @@ ACTUAL_COLOR = "indian_red"
24
24
  EXPECTED_COLOR = "green"
25
25
  ELAPSED_TIME_COLOR = "green"
26
26
 
27
+ ALTERNATIVE_BACKGROUND_FOR_LIGHT = style_t(bgcolor=color_t.from_rgb(230, 230, 230))
28
+ ALTERNATIVE_BACKGROUND_FOR_DARK = style_t(bgcolor=color_t.from_rgb(25, 25, 25))
29
+
27
30
  GRAY_STYLE = style_t(color=color_t.from_rgb(150, 150, 150))
28
31
 
29
32
  """
@@ -10,6 +10,8 @@ import typing as h
10
10
 
11
11
  from logger_36.catalog.config.console_rich import (
12
12
  ACTUAL_COLOR,
13
+ ALTERNATIVE_BACKGROUND_FOR_DARK,
14
+ ALTERNATIVE_BACKGROUND_FOR_LIGHT,
13
15
  DATE_TIME_COLOR,
14
16
  ELAPSED_TIME_COLOR,
15
17
  EXPECTED_COLOR,
@@ -49,9 +51,20 @@ _EXCLUSIVE_TRACEBACK_ARGUMENTS = (
49
51
 
50
52
  @d.dataclass(slots=True, repr=False, eq=False)
51
53
  class console_rich_handler_t(lggg.Handler):
54
+ """
55
+ alternating_lines:
56
+ - Initial value:
57
+ - 1: enabled for dark background
58
+ - 2: enabled for light background
59
+ - anything else: disabled
60
+ - Runtime value: 0/1=do not/do highlight next time.
61
+ """
62
+
52
63
  extension: handler_extension_t = d.field(init=False)
53
64
  console: console_t = d.field(init=False)
54
65
  FormattedLines: h.Callable[..., tuple[str, str | None]] = d.field(init=False)
66
+ alternating_lines: int = 0
67
+ background_is_light: bool = True
55
68
 
56
69
  name: d.InitVar[str | None] = None
57
70
  level: d.InitVar[int] = lggg.NOTSET
@@ -60,6 +73,7 @@ class console_rich_handler_t(lggg.Handler):
60
73
  message_width: d.InitVar[int] = -1
61
74
  formatter: d.InitVar[lggg.Formatter | None] = None
62
75
  should_install_traceback: d.InitVar[bool] = False
76
+ should_record: d.InitVar[bool] = False
63
77
 
64
78
  rich_kwargs: d.InitVar[dict[str, h.Any] | None] = None
65
79
 
@@ -72,6 +86,7 @@ class console_rich_handler_t(lggg.Handler):
72
86
  message_width: int,
73
87
  formatter: lggg.Formatter | None,
74
88
  should_install_traceback: bool,
89
+ should_record: bool,
75
90
  rich_kwargs: dict[str, h.Any] | None,
76
91
  ) -> None:
77
92
  """"""
@@ -103,7 +118,7 @@ class console_rich_handler_t(lggg.Handler):
103
118
  self.console = console_t(
104
119
  highlight=False,
105
120
  force_terminal=True,
106
- record=True,
121
+ record=should_record,
107
122
  **rich_console_kwargs,
108
123
  )
109
124
  if should_install_traceback:
@@ -111,52 +126,83 @@ class console_rich_handler_t(lggg.Handler):
111
126
  InstallTracebackHandler(**rich_traceback_kwargs)
112
127
 
113
128
  self.FormattedLines = self.extension.FormattedLines
129
+ if self.alternating_lines == 1:
130
+ self.alternating_lines = 0
131
+ self.background_is_light = False
132
+ elif self.alternating_lines == 2:
133
+ self.alternating_lines = 0
134
+ self.background_is_light = True
135
+ else:
136
+ self.alternating_lines = -1
114
137
 
115
138
  def emit(self, record: lggg.LogRecord, /) -> None:
116
139
  """"""
117
- cls = self.__class__
118
140
  if hasattr(record, SHOW_W_RULE_ATTR):
119
141
  richer = Rule(record.msg, DATE_TIME_COLOR)
120
142
  else:
121
143
  first, next_s = self.FormattedLines(record, PreProcessed=EscapedForRich)
122
- richer = cls.HighlightedVersion(first, next_s, record.levelno)
144
+ should_highlight_back = self.alternating_lines == 1
145
+ if self.alternating_lines >= 0:
146
+ self.alternating_lines = (self.alternating_lines + 1) % 2
147
+ richer = HighlightedVersion(
148
+ self.console,
149
+ first,
150
+ next_s,
151
+ record.levelno,
152
+ should_highlight_back=should_highlight_back,
153
+ background_is_light=self.background_is_light,
154
+ )
123
155
  self.console.print(richer, crop=False, overflow="ignore")
124
156
 
125
157
  def ShowMessage(self, message: str, /) -> None:
126
158
  """"""
127
159
  self.console.print(message, crop=False, overflow="ignore")
128
160
 
129
- @classmethod
130
- def HighlightedVersion(
131
- cls, first_line: str, next_lines: str | None, log_level: int, /
132
- ) -> renderable_t:
133
- """"""
134
- output = text_t(first_line)
135
-
136
- # Used instead of _CONTEXT_LENGTH which might include \t, thus creating a
137
- # mismatch between character length and length when displayed in console.
138
- context_end = first_line.find(LEVEL_CLOSING)
139
- elapsed_time_separator = first_line.rfind(ELAPSED_TIME_SEPARATOR)
140
- where_separator = first_line.rfind(
141
- WHERE_SEPARATOR, context_end, elapsed_time_separator
142
- )
143
-
144
- output.stylize(DATE_TIME_COLOR, end=TIME_LENGTH)
145
- output.stylize(
146
- LEVEL_COLOR[log_level],
147
- start=TIME_LENGTH,
148
- end=context_end + 1,
149
- )
150
- output.stylize(GRAY_STYLE, start=where_separator, end=elapsed_time_separator)
151
- output.stylize(ELAPSED_TIME_COLOR, start=elapsed_time_separator)
152
-
153
- if next_lines is not None:
154
- output.append(next_lines)
155
161
 
156
- _ = output.highlight_regex(ACTUAL_PATTERNS, style=ACTUAL_COLOR)
157
- _ = output.highlight_regex(EXPECTED_PATTERNS, style=EXPECTED_COLOR)
162
+ def HighlightedVersion(
163
+ _: console_t,
164
+ first_line: str,
165
+ next_lines: str | None,
166
+ log_level: int,
167
+ /,
168
+ *,
169
+ should_highlight_back: bool = False,
170
+ background_is_light: bool = True,
171
+ ) -> renderable_t:
172
+ """"""
173
+ output = text_t(first_line)
174
+
175
+ # Used instead of _CONTEXT_LENGTH which might include \t, thus creating a
176
+ # mismatch between character length and length when displayed in console.
177
+ context_end = first_line.find(LEVEL_CLOSING)
178
+ elapsed_time_separator = first_line.rfind(ELAPSED_TIME_SEPARATOR)
179
+ where_separator = first_line.rfind(
180
+ WHERE_SEPARATOR, context_end, elapsed_time_separator
181
+ )
182
+
183
+ output.stylize(DATE_TIME_COLOR, end=TIME_LENGTH)
184
+ output.stylize(
185
+ LEVEL_COLOR[log_level],
186
+ start=TIME_LENGTH,
187
+ end=context_end + 1,
188
+ )
189
+ output.stylize(GRAY_STYLE, start=where_separator, end=elapsed_time_separator)
190
+ output.stylize(ELAPSED_TIME_COLOR, start=elapsed_time_separator)
191
+
192
+ if next_lines is not None:
193
+ output.append(next_lines)
194
+
195
+ _ = output.highlight_regex(ACTUAL_PATTERNS, style=ACTUAL_COLOR)
196
+ _ = output.highlight_regex(EXPECTED_PATTERNS, style=EXPECTED_COLOR)
197
+
198
+ if should_highlight_back:
199
+ if background_is_light:
200
+ style = ALTERNATIVE_BACKGROUND_FOR_LIGHT
201
+ else:
202
+ style = ALTERNATIVE_BACKGROUND_FOR_DARK
203
+ output.stylize(style)
158
204
 
159
- return output
205
+ return output
160
206
 
161
207
 
162
208
  """
@@ -10,7 +10,7 @@ import typing as h
10
10
 
11
11
  try:
12
12
  from logger_36.catalog.config.console_rich import DATE_TIME_COLOR
13
- from logger_36.catalog.handler.console_rich import console_rich_handler_t
13
+ from logger_36.catalog.handler.console_rich import HighlightedVersion
14
14
  from rich.console import Console as console_t
15
15
  from rich.console import ConsoleOptions as console_options_t
16
16
  from rich.markup import escape as EscapedForRich
@@ -32,11 +32,21 @@ interface_h = can_show_message_p | h.Callable[[str], None]
32
32
 
33
33
  @d.dataclass(slots=True, repr=False, eq=False)
34
34
  class generic_handler_t(lggg.Handler):
35
+ """
36
+ alternating_lines:
37
+ - Initial value:
38
+ - 1: enabled for dark background
39
+ - 2: enabled for light background
40
+ - anything else: disabled
41
+ - Runtime value: 0/1=do not/do highlight next time.
42
+ """
35
43
 
36
44
  extension: handler_extension_t = d.field(init=False)
37
45
  console: console_t = None
38
46
  console_options: console_options_t = None
39
47
  FormattedLines: h.Callable[..., tuple[str, str | None]] = d.field(init=False)
48
+ alternating_lines: int = 0
49
+ background_is_light: bool = True
40
50
  ShowMessage: h.Callable[[str], None] = lambda _arg: None
41
51
 
42
52
  name: d.InitVar[str | None] = None
@@ -47,6 +57,7 @@ class generic_handler_t(lggg.Handler):
47
57
  formatter: d.InitVar[lggg.Formatter | None] = None
48
58
 
49
59
  supports_html: d.InitVar[bool] = False
60
+ should_record: d.InitVar[bool] = (False,)
50
61
  rich_kwargs: d.InitVar[dict[str, h.Any] | None] = None
51
62
  interface: d.InitVar[interface_h | None] = None # Cannot be None actually.
52
63
 
@@ -59,6 +70,7 @@ class generic_handler_t(lggg.Handler):
59
70
  message_width: int,
60
71
  formatter: lggg.Formatter | None,
61
72
  supports_html: bool,
73
+ should_record: bool,
62
74
  rich_kwargs: dict[str, h.Any] | None,
63
75
  interface: interface_h | None,
64
76
  ) -> None:
@@ -81,6 +93,7 @@ class generic_handler_t(lggg.Handler):
81
93
  self.console = console_t(
82
94
  highlight=False,
83
95
  force_terminal=True,
96
+ record=should_record,
84
97
  **rich_kwargs,
85
98
  )
86
99
  self.console_options = self.console.options.update(
@@ -88,6 +101,14 @@ class generic_handler_t(lggg.Handler):
88
101
  )
89
102
 
90
103
  self.FormattedLines = self.extension.FormattedLines
104
+ if self.alternating_lines == 1:
105
+ self.alternating_lines = 0
106
+ self.background_is_light = False
107
+ elif self.alternating_lines == 2:
108
+ self.alternating_lines = 0
109
+ self.background_is_light = True
110
+ else:
111
+ self.alternating_lines = -1
91
112
 
92
113
  self.ShowMessage = getattr(
93
114
  interface, can_show_message_p.ShowMessage.__name__, interface
@@ -105,8 +126,16 @@ class generic_handler_t(lggg.Handler):
105
126
  richer = Rule(record.msg, DATE_TIME_COLOR)
106
127
  else:
107
128
  first, next_s = self.FormattedLines(record, PreProcessed=EscapedForRich)
108
- richer = console_rich_handler_t.HighlightedVersion(
109
- first, next_s, record.levelno
129
+ should_highlight_back = self.alternating_lines == 1
130
+ if self.alternating_lines >= 0:
131
+ self.alternating_lines = (self.alternating_lines + 1) % 2
132
+ richer = HighlightedVersion(
133
+ self.console,
134
+ first,
135
+ next_s,
136
+ record.levelno,
137
+ should_highlight_back=should_highlight_back,
138
+ background_is_light=self.background_is_light,
110
139
  )
111
140
  segments = self.console.render(richer, options=self.console_options)
112
141
 
@@ -0,0 +1,103 @@
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 lggg
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 LOGGER
15
+ from logger_36.task.format.message import FormattedMessage
16
+
17
+
18
+ def SetLOGLevel(
19
+ level: int,
20
+ /,
21
+ *,
22
+ logger: lggg.Logger | None = None,
23
+ which: handler_codes_h | str = "a",
24
+ ) -> None:
25
+ """
26
+ which: g=generic, c=console, f=file, a=all, str=name.
27
+ """
28
+ if logger is None:
29
+ logger = LOGGER
30
+
31
+ which_is_name = which not in HANDLER_CODES
32
+ found = False
33
+ for handler in logger.handlers:
34
+ if (
35
+ (which == "a")
36
+ or ((which == "g") and isinstance(handler, generic_handler_t))
37
+ or (
38
+ (which == "c")
39
+ and isinstance(handler, (console_handler_t, console_rich_handler_t))
40
+ )
41
+ or ((which == "f") and isinstance(handler, file_handler_t))
42
+ or (which == handler.name)
43
+ ):
44
+ handler.setLevel(level)
45
+ if which_is_name:
46
+ return
47
+ found = True
48
+
49
+ if not found:
50
+ raise ValueError(
51
+ FormattedMessage(
52
+ "Handler not found",
53
+ actual=which,
54
+ expected=f"{str(HANDLER_CODES)[1:-1]}, or a handler name",
55
+ )
56
+ )
57
+
58
+
59
+ """
60
+ COPYRIGHT NOTICE
61
+
62
+ This software is governed by the CeCILL license under French law and
63
+ abiding by the rules of distribution of free software. You can use,
64
+ modify and/ or redistribute the software under the terms of the CeCILL
65
+ license as circulated by CEA, CNRS and INRIA at the following URL
66
+ "http://www.cecill.info".
67
+
68
+ As a counterpart to the access to the source code and rights to copy,
69
+ modify and redistribute granted by the license, users are provided only
70
+ with a limited warranty and the software's author, the holder of the
71
+ economic rights, and the successive licensors have only limited
72
+ liability.
73
+
74
+ In this respect, the user's attention is drawn to the risks associated
75
+ with loading, using, modifying and/or developing or reproducing the
76
+ software by the user in light of its specific status of free software,
77
+ that may mean that it is complicated to manipulate, and that also
78
+ therefore means that it is reserved for developers and experienced
79
+ professionals having in-depth computer knowledge. Users are therefore
80
+ encouraged to load and test the software's suitability as regards their
81
+ requirements in conditions enabling the security of their systems and/or
82
+ data to be ensured and, more generally, to use and operate it in the
83
+ same conditions as regards security.
84
+
85
+ The fact that you are presently reading this means that you have had
86
+ knowledge of the CeCILL license and that you accept its terms.
87
+
88
+ SEE LICENCE NOTICE: file README-LICENCE-utf8.txt at project source root.
89
+
90
+ This software is being developed by Eric Debreuve, a CNRS employee and
91
+ member of team Morpheme.
92
+ Team Morpheme is a joint team between Inria, CNRS, and UniCA.
93
+ It is hosted by the Centre Inria d'Université Côte d'Azur, Laboratory
94
+ I3S, and Laboratory iBV.
95
+
96
+ CNRS: https://www.cnrs.fr/index.php/en
97
+ Inria: https://www.inria.fr/en/
98
+ UniCA: https://univ-cotedazur.eu/
99
+ Centre Inria d'Université Côte d'Azur: https://www.inria.fr/en/centre/sophia/
100
+ I3S: https://www.i3s.unice.fr/en/
101
+ iBV: http://ibv.unice.fr/
102
+ Team Morpheme: https://team.inria.fr/morpheme/
103
+ """
logger_36/format.py ADDED
@@ -0,0 +1,59 @@
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
+ from logger_36.task.format.memory import FormattedUsage as FormattedMemoryUsage
8
+ from logger_36.task.format.memory import (
9
+ FormattedUsageWithAutoUnit as FormattedMemoryUsageWithAutoUnit,
10
+ )
11
+ from logger_36.task.format.memory import UsageBar as MemoryUsageBar
12
+ from logger_36.task.format.message import FormattedMessage
13
+ from logger_36.task.format.rule import Rule, RuleAsText
14
+
15
+ """
16
+ COPYRIGHT NOTICE
17
+
18
+ This software is governed by the CeCILL license under French law and
19
+ abiding by the rules of distribution of free software. You can use,
20
+ modify and/ or redistribute the software under the terms of the CeCILL
21
+ license as circulated by CEA, CNRS and INRIA at the following URL
22
+ "http://www.cecill.info".
23
+
24
+ As a counterpart to the access to the source code and rights to copy,
25
+ modify and redistribute granted by the license, users are provided only
26
+ with a limited warranty and the software's author, the holder of the
27
+ economic rights, and the successive licensors have only limited
28
+ liability.
29
+
30
+ In this respect, the user's attention is drawn to the risks associated
31
+ with loading, using, modifying and/or developing or reproducing the
32
+ software by the user in light of its specific status of free software,
33
+ that may mean that it is complicated to manipulate, and that also
34
+ therefore means that it is reserved for developers and experienced
35
+ professionals having in-depth computer knowledge. Users are therefore
36
+ encouraged to load and test the software's suitability as regards their
37
+ requirements in conditions enabling the security of their systems and/or
38
+ data to be ensured and, more generally, to use and operate it in the
39
+ same conditions as regards security.
40
+
41
+ The fact that you are presently reading this means that you have had
42
+ knowledge of the CeCILL license and that you accept its terms.
43
+
44
+ SEE LICENCE NOTICE: file README-LICENCE-utf8.txt at project source root.
45
+
46
+ This software is being developed by Eric Debreuve, a CNRS employee and
47
+ member of team Morpheme.
48
+ Team Morpheme is a joint team between Inria, CNRS, and UniCA.
49
+ It is hosted by the Centre Inria d'Université Côte d'Azur, Laboratory
50
+ I3S, and Laboratory iBV.
51
+
52
+ CNRS: https://www.cnrs.fr/index.php/en
53
+ Inria: https://www.inria.fr/en/
54
+ UniCA: https://univ-cotedazur.eu/
55
+ Centre Inria d'Université Côte d'Azur: https://www.inria.fr/en/centre/sophia/
56
+ I3S: https://www.i3s.unice.fr/en/
57
+ iBV: http://ibv.unice.fr/
58
+ Team Morpheme: https://team.inria.fr/morpheme/
59
+ """
@@ -12,9 +12,7 @@ from logger_36.catalog.handler.console import console_handler_t
12
12
  from logger_36.catalog.handler.file import file_handler_t
13
13
  from logger_36.catalog.handler.generic import generic_handler_t, interface_h
14
14
  from logger_36.constant.error import MISSING_RICH_ERROR
15
- from logger_36.constant.handler import HANDLER_CODES, handler_codes_h
16
15
  from logger_36.instance.logger import LOGGER
17
- from logger_36.task.format.message import FormattedMessage
18
16
 
19
17
  try:
20
18
  from logger_36.catalog.handler.console_rich import console_rich_handler_t
@@ -40,6 +38,8 @@ def AddGenericHandler(
40
38
  message_width: int = -1,
41
39
  formatter: lggg.Formatter | None = None,
42
40
  supports_html: bool = False,
41
+ alternating_lines: int = 2,
42
+ should_record: bool = False,
43
43
  should_hold_messages: bool = False,
44
44
  **kwargs,
45
45
  ) -> None:
@@ -55,6 +55,8 @@ def AddGenericHandler(
55
55
  message_width=message_width,
56
56
  formatter=formatter,
57
57
  supports_html=supports_html,
58
+ alternating_lines=alternating_lines,
59
+ should_record=should_record,
58
60
  rich_kwargs=kwargs,
59
61
  interface=interface,
60
62
  )
@@ -96,8 +98,10 @@ def AddRichConsoleHandler(
96
98
  show_memory_usage: bool = False,
97
99
  message_width: int = -1,
98
100
  formatter: lggg.Formatter | None = None,
101
+ alternating_lines: int = 2,
99
102
  should_hold_messages: bool = False,
100
103
  should_install_traceback: bool = False,
104
+ should_record: bool = False,
101
105
  **kwargs,
102
106
  ) -> None:
103
107
  """"""
@@ -113,7 +117,9 @@ def AddRichConsoleHandler(
113
117
  additional_s = {}
114
118
  else:
115
119
  additional_s = {
120
+ "alternating_lines": alternating_lines,
116
121
  "should_install_traceback": should_install_traceback,
122
+ "should_record": should_record,
117
123
  "rich_kwargs": kwargs,
118
124
  }
119
125
  handler = console_rich_handler_t(
@@ -164,47 +170,6 @@ def AddFileHandler(
164
170
  logger.AddHandler(handler, should_hold_messages)
165
171
 
166
172
 
167
- def SetLOGLevel(
168
- level: int,
169
- /,
170
- *,
171
- logger: lggg.Logger | None = None,
172
- which: handler_codes_h | str = "a",
173
- ) -> None:
174
- """
175
- which: g=generic, c=console, f=file, a=all, str=name.
176
- """
177
- if logger is None:
178
- logger = LOGGER
179
-
180
- which_is_name = which not in HANDLER_CODES
181
- found = False
182
- for handler in logger.handlers:
183
- if (
184
- (which == "a")
185
- or ((which == "g") and isinstance(handler, generic_handler_t))
186
- or (
187
- (which == "c")
188
- and isinstance(handler, (console_handler_t, console_rich_handler_t))
189
- )
190
- or ((which == "f") and isinstance(handler, file_handler_t))
191
- or (which == handler.name)
192
- ):
193
- handler.setLevel(level)
194
- if which_is_name:
195
- return
196
- found = True
197
-
198
- if not found:
199
- raise ValueError(
200
- FormattedMessage(
201
- "Handler not found",
202
- actual=which,
203
- expected=f"{str(HANDLER_CODES)[1:-1]}, or a handler name",
204
- )
205
- )
206
-
207
-
208
173
  """
209
174
  COPYRIGHT NOTICE
210
175
 
logger_36/logger.py ADDED
@@ -0,0 +1,56 @@
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
+ from logger_36.catalog.logger.chronos import LogElapsedTime
8
+ from logger_36.catalog.logger.exception import LogException
9
+ from logger_36.catalog.logger.memory import LogMaximumMemoryUsage, LogMemoryUsages
10
+ from logger_36.catalog.logger.system import LogSystemDetails
11
+
12
+ """
13
+ COPYRIGHT NOTICE
14
+
15
+ This software is governed by the CeCILL license under French law and
16
+ abiding by the rules of distribution of free software. You can use,
17
+ modify and/ or redistribute the software under the terms of the CeCILL
18
+ license as circulated by CEA, CNRS and INRIA at the following URL
19
+ "http://www.cecill.info".
20
+
21
+ As a counterpart to the access to the source code and rights to copy,
22
+ modify and redistribute granted by the license, users are provided only
23
+ with a limited warranty and the software's author, the holder of the
24
+ economic rights, and the successive licensors have only limited
25
+ liability.
26
+
27
+ In this respect, the user's attention is drawn to the risks associated
28
+ with loading, using, modifying and/or developing or reproducing the
29
+ software by the user in light of its specific status of free software,
30
+ that may mean that it is complicated to manipulate, and that also
31
+ therefore means that it is reserved for developers and experienced
32
+ professionals having in-depth computer knowledge. Users are therefore
33
+ encouraged to load and test the software's suitability as regards their
34
+ requirements in conditions enabling the security of their systems and/or
35
+ data to be ensured and, more generally, to use and operate it in the
36
+ same conditions as regards security.
37
+
38
+ The fact that you are presently reading this means that you have had
39
+ knowledge of the CeCILL license and that you accept its terms.
40
+
41
+ SEE LICENCE NOTICE: file README-LICENCE-utf8.txt at project source root.
42
+
43
+ This software is being developed by Eric Debreuve, a CNRS employee and
44
+ member of team Morpheme.
45
+ Team Morpheme is a joint team between Inria, CNRS, and UniCA.
46
+ It is hosted by the Centre Inria d'Université Côte d'Azur, Laboratory
47
+ I3S, and Laboratory iBV.
48
+
49
+ CNRS: https://www.cnrs.fr/index.php/en
50
+ Inria: https://www.inria.fr/en/
51
+ UniCA: https://univ-cotedazur.eu/
52
+ Centre Inria d'Université Côte d'Azur: https://www.inria.fr/en/centre/sophia/
53
+ I3S: https://www.i3s.unice.fr/en/
54
+ iBV: http://ibv.unice.fr/
55
+ Team Morpheme: https://team.inria.fr/morpheme/
56
+ """
@@ -0,0 +1,53 @@
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
+ from logger_36.catalog.logger.gpu import LogGPURelatedDetails
8
+
9
+ """
10
+ COPYRIGHT NOTICE
11
+
12
+ This software is governed by the CeCILL license under French law and
13
+ abiding by the rules of distribution of free software. You can use,
14
+ modify and/ or redistribute the software under the terms of the CeCILL
15
+ license as circulated by CEA, CNRS and INRIA at the following URL
16
+ "http://www.cecill.info".
17
+
18
+ As a counterpart to the access to the source code and rights to copy,
19
+ modify and redistribute granted by the license, users are provided only
20
+ with a limited warranty and the software's author, the holder of the
21
+ economic rights, and the successive licensors have only limited
22
+ liability.
23
+
24
+ In this respect, the user's attention is drawn to the risks associated
25
+ with loading, using, modifying and/or developing or reproducing the
26
+ software by the user in light of its specific status of free software,
27
+ that may mean that it is complicated to manipulate, and that also
28
+ therefore means that it is reserved for developers and experienced
29
+ professionals having in-depth computer knowledge. Users are therefore
30
+ encouraged to load and test the software's suitability as regards their
31
+ requirements in conditions enabling the security of their systems and/or
32
+ data to be ensured and, more generally, to use and operate it in the
33
+ same conditions as regards security.
34
+
35
+ The fact that you are presently reading this means that you have had
36
+ knowledge of the CeCILL license and that you accept its terms.
37
+
38
+ SEE LICENCE NOTICE: file README-LICENCE-utf8.txt at project source root.
39
+
40
+ This software is being developed by Eric Debreuve, a CNRS employee and
41
+ member of team Morpheme.
42
+ Team Morpheme is a joint team between Inria, CNRS, and UniCA.
43
+ It is hosted by the Centre Inria d'Université Côte d'Azur, Laboratory
44
+ I3S, and Laboratory iBV.
45
+
46
+ CNRS: https://www.cnrs.fr/index.php/en
47
+ Inria: https://www.inria.fr/en/
48
+ UniCA: https://univ-cotedazur.eu/
49
+ Centre Inria d'Université Côte d'Azur: https://www.inria.fr/en/centre/sophia/
50
+ I3S: https://www.i3s.unice.fr/en/
51
+ iBV: http://ibv.unice.fr/
52
+ Team Morpheme: https://team.inria.fr/morpheme/
53
+ """
logger_36/measure.py ADDED
@@ -0,0 +1,55 @@
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
+ from logger_36.task.measure.chronos import ElapsedTime, TimeStamp
8
+ from logger_36.task.measure.memory import CanCheckUsage as CanCheckMemoryUsage
9
+ from logger_36.task.measure.memory import CurrentUsage as CurrentMemoryUsage
10
+
11
+ """
12
+ COPYRIGHT NOTICE
13
+
14
+ This software is governed by the CeCILL license under French law and
15
+ abiding by the rules of distribution of free software. You can use,
16
+ modify and/ or redistribute the software under the terms of the CeCILL
17
+ license as circulated by CEA, CNRS and INRIA at the following URL
18
+ "http://www.cecill.info".
19
+
20
+ As a counterpart to the access to the source code and rights to copy,
21
+ modify and redistribute granted by the license, users are provided only
22
+ with a limited warranty and the software's author, the holder of the
23
+ economic rights, and the successive licensors have only limited
24
+ liability.
25
+
26
+ In this respect, the user's attention is drawn to the risks associated
27
+ with loading, using, modifying and/or developing or reproducing the
28
+ software by the user in light of its specific status of free software,
29
+ that may mean that it is complicated to manipulate, and that also
30
+ therefore means that it is reserved for developers and experienced
31
+ professionals having in-depth computer knowledge. Users are therefore
32
+ encouraged to load and test the software's suitability as regards their
33
+ requirements in conditions enabling the security of their systems and/or
34
+ data to be ensured and, more generally, to use and operate it in the
35
+ same conditions as regards security.
36
+
37
+ The fact that you are presently reading this means that you have had
38
+ knowledge of the CeCILL license and that you accept its terms.
39
+
40
+ SEE LICENCE NOTICE: file README-LICENCE-utf8.txt at project source root.
41
+
42
+ This software is being developed by Eric Debreuve, a CNRS employee and
43
+ member of team Morpheme.
44
+ Team Morpheme is a joint team between Inria, CNRS, and UniCA.
45
+ It is hosted by the Centre Inria d'Université Côte d'Azur, Laboratory
46
+ I3S, and Laboratory iBV.
47
+
48
+ CNRS: https://www.cnrs.fr/index.php/en
49
+ Inria: https://www.inria.fr/en/
50
+ UniCA: https://univ-cotedazur.eu/
51
+ Centre Inria d'Université Côte d'Azur: https://www.inria.fr/en/centre/sophia/
52
+ I3S: https://www.i3s.unice.fr/en/
53
+ iBV: http://ibv.unice.fr/
54
+ Team Morpheme: https://team.inria.fr/morpheme/
55
+ """
logger_36/storage.py ADDED
@@ -0,0 +1,53 @@
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
+ from logger_36.task.storage import SaveLOGasHTML, html_reader_t
8
+
9
+ """
10
+ COPYRIGHT NOTICE
11
+
12
+ This software is governed by the CeCILL license under French law and
13
+ abiding by the rules of distribution of free software. You can use,
14
+ modify and/ or redistribute the software under the terms of the CeCILL
15
+ license as circulated by CEA, CNRS and INRIA at the following URL
16
+ "http://www.cecill.info".
17
+
18
+ As a counterpart to the access to the source code and rights to copy,
19
+ modify and redistribute granted by the license, users are provided only
20
+ with a limited warranty and the software's author, the holder of the
21
+ economic rights, and the successive licensors have only limited
22
+ liability.
23
+
24
+ In this respect, the user's attention is drawn to the risks associated
25
+ with loading, using, modifying and/or developing or reproducing the
26
+ software by the user in light of its specific status of free software,
27
+ that may mean that it is complicated to manipulate, and that also
28
+ therefore means that it is reserved for developers and experienced
29
+ professionals having in-depth computer knowledge. Users are therefore
30
+ encouraged to load and test the software's suitability as regards their
31
+ requirements in conditions enabling the security of their systems and/or
32
+ data to be ensured and, more generally, to use and operate it in the
33
+ same conditions as regards security.
34
+
35
+ The fact that you are presently reading this means that you have had
36
+ knowledge of the CeCILL license and that you accept its terms.
37
+
38
+ SEE LICENCE NOTICE: file README-LICENCE-utf8.txt at project source root.
39
+
40
+ This software is being developed by Eric Debreuve, a CNRS employee and
41
+ member of team Morpheme.
42
+ Team Morpheme is a joint team between Inria, CNRS, and UniCA.
43
+ It is hosted by the Centre Inria d'Université Côte d'Azur, Laboratory
44
+ I3S, and Laboratory iBV.
45
+
46
+ CNRS: https://www.cnrs.fr/index.php/en
47
+ Inria: https://www.inria.fr/en/
48
+ UniCA: https://univ-cotedazur.eu/
49
+ Centre Inria d'Université Côte d'Azur: https://www.inria.fr/en/centre/sophia/
50
+ I3S: https://www.i3s.unice.fr/en/
51
+ iBV: http://ibv.unice.fr/
52
+ Team Morpheme: https://team.inria.fr/morpheme/
53
+ """
@@ -12,7 +12,7 @@ except ModuleNotFoundError:
12
12
  _PROCESS = None
13
13
 
14
14
 
15
- def CanCheckMemory() -> bool:
15
+ def CanCheckUsage() -> bool:
16
16
  """"""
17
17
  return _PROCESS is not None
18
18
 
logger_36/task/storage.py CHANGED
@@ -101,22 +101,20 @@ def SaveLOGasHTML(path: str | path_t | h.TextIO = None) -> None:
101
101
  LOGGER.warning(f'{cannot_save}: File "{path}" already exists.')
102
102
  return
103
103
 
104
- console = None
105
- found = False
106
104
  for handler in LOGGER.handlers:
107
105
  console = getattr(handler, "console", None)
108
- if found := isinstance(console, console_t):
106
+ if isinstance(console, console_t) and console.record:
107
+ html = console.export_html()
108
+ if actual_file:
109
+ with open(path, "w") as accessor:
110
+ accessor.write(html)
111
+ else:
112
+ path.write(html)
109
113
  break
110
-
111
- if found:
112
- html = console.export_html()
113
- if actual_file:
114
- with open(path, "w") as accessor:
115
- accessor.write(html)
116
- else:
117
- path.write(html)
118
114
  else:
119
- LOGGER.warning(f"{cannot_save}: No handler has a RICH console.")
115
+ LOGGER.warning(
116
+ f"{cannot_save}: No handler has a RICH console with recording ON."
117
+ )
120
118
 
121
119
 
122
120
  """
logger_36/type/handler.py CHANGED
@@ -18,7 +18,7 @@ from logger_36.constant.message import NEXT_LINE_PROLOGUE
18
18
  from logger_36.constant.record import HIDE_WHERE_ATTR, SHOW_WHERE_ATTR
19
19
  from logger_36.task.format.message import FormattedMessage, MessageFormat
20
20
  from logger_36.task.measure.chronos import TimeStamp
21
- from logger_36.task.measure.memory import CanCheckMemory
21
+ from logger_36.task.measure.memory import CanCheckUsage as CanCheckMemoryUsage
22
22
 
23
23
  _MEMORY_MEASURE_ERROR = MEMORY_MEASURE_ERROR
24
24
 
@@ -53,7 +53,7 @@ class handler_extension_t:
53
53
  if self.name is None:
54
54
  self.name = TimeStamp()
55
55
 
56
- if self.show_memory_usage and not CanCheckMemory():
56
+ if self.show_memory_usage and not CanCheckMemoryUsage():
57
57
  self.show_memory_usage = False
58
58
  if _MEMORY_MEASURE_ERROR is not None:
59
59
  print(_MEMORY_MEASURE_ERROR, file=sstm.stderr)
logger_36/type/logger.py CHANGED
@@ -40,9 +40,10 @@ from logger_36.type.issue import NewIssue, issue_t
40
40
  @d.dataclass(slots=True, repr=False, eq=False)
41
41
  class logger_t(lggg.Logger):
42
42
  name_: d.InitVar[str] = LOGGER_NAME
43
- level: d.InitVar[int] = lggg.NOTSET
43
+ level_: d.InitVar[int] = lggg.NOTSET
44
44
  activate_wrn_interceptions: d.InitVar[bool] = True
45
- exit_on_error: bool = False
45
+ exit_on_error: bool = False # Implies exit_on_critical.
46
+ exit_on_critical: bool = False
46
47
  # Must not be False until at least one handler has been added.
47
48
  should_hold_messages: bool = True
48
49
 
@@ -58,15 +59,17 @@ class logger_t(lggg.Logger):
58
59
  )
59
60
 
60
61
  def __post_init__(
61
- self, name_: str, level: int, activate_wrn_interceptions: bool
62
+ self, name_: str, level_: int, activate_wrn_interceptions: bool
62
63
  ) -> None:
63
64
  """"""
64
65
  lggg.Logger.__init__(self, name_)
65
- self.setLevel(level)
66
- self.propagate = False
66
+ self.setLevel(level_)
67
+ self.propagate = False # Part of lggg.Logger.
67
68
 
68
69
  if activate_wrn_interceptions:
69
70
  self._ActivateWarningInterceptions()
71
+ if self.exit_on_error:
72
+ self.exit_on_critical = True
70
73
 
71
74
  def _ActivateWarningInterceptions(self) -> None:
72
75
  """
@@ -211,7 +214,11 @@ class logger_t(lggg.Logger):
211
214
  else:
212
215
  lggg.Logger.handle(self, record)
213
216
 
214
- if self.exit_on_error and (record.levelno in (lggg.ERROR, lggg.CRITICAL)):
217
+ if (self.exit_on_critical and (record.levelno is lggg.CRITICAL)) or (
218
+ self.exit_on_error and (record.levelno is lggg.ERROR)
219
+ ):
220
+ # Also works if self.exit_on_error and record.levelno is lggg.CRITICAL since
221
+ # __post_init__ set self.exit_on_critical if self.exit_on_error.
215
222
  sstm.exit(1)
216
223
 
217
224
  def AddContextLevel(self, new_level: str, /) -> None:
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__ = "2024.17"
7
+ __version__ = "2024.19"
8
8
 
9
9
  """
10
10
  COPYRIGHT NOTICE
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: logger-36
3
- Version: 2024.17
3
+ Version: 2024.19
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,17 +1,23 @@
1
- logger_36/__init__.py,sha256=4YRMxJfQXMIfOXRBfAlXj8B-uBg1lVnC4nmTul7xsxs,2495
2
- logger_36/main.py,sha256=kDL0cWE0nQXt4cL12fupCWRvbmbd-Kf8rydeSUo-u7o,7619
3
- logger_36/version.py,sha256=_uTdjuPgV7LMjSvW8t8CUtF9I0L3TsQR8ml78S0vPvo,2206
4
- logger_36/catalog/config/console_rich.py,sha256=1FWbfJK_DTmnnf1qytJ8O949dh5Bmkjb8MqbkaGN-AY,2718
1
+ logger_36/__init__.py,sha256=jHidpp6dmfJVdoiHkwTXBn1_u1HRaZj3BHS8jq71ZOE,2312
2
+ logger_36/format.py,sha256=mox36RRkNUWbeHo3XkGGlik2CoyswDvDehRDtZkrnD0,2558
3
+ logger_36/handler.py,sha256=wHMj4OyQrUdhAxk_MCvPTBT1Ig3BYpfbqxHYfp91fOU,6697
4
+ logger_36/logger.py,sha256=flRcn5-2L7yGfJusfnkQXzFQcX3Ljt-1_KWnA_I0new,2446
5
+ logger_36/logger_gpu.py,sha256=YYFk6aYQrBDJfxQaDm-ar16T6SlOSL6jJWTOgvpF4EU,2244
6
+ logger_36/measure.py,sha256=P507VNbVKAf4jYGnGX-3rlDrVbrYP0ZD3nxFmAFvhyI,2404
7
+ logger_36/storage.py,sha256=O8pDmiL0B3LJpKrhi8a9IMBXs6MwW6r1bMUn_cSDAaY,2246
8
+ logger_36/version.py,sha256=pk3jW0gVcV0DVsZOCeVxbuluEwh3R_zjxpQerFhYt0Q,2206
9
+ logger_36/catalog/config/console_rich.py,sha256=QDkgSs3I7ZULvkd1q4J1hdvgyB857JJcJWxM9fdL51Y,2883
5
10
  logger_36/catalog/handler/console.py,sha256=1WLtmxZCBj0AxLu5xey3VIVBKm02bp-Rc-eZOiFtXnU,3893
6
- logger_36/catalog/handler/console_rich.py,sha256=0qLbG2spohHT9K-mxpUNurSI4ct8o8F3QWI3PweLKtM,7347
11
+ logger_36/catalog/handler/console_rich.py,sha256=v57EFAvCaH5ABoZ24lFn1ObCe_EntHpqzW7RJLs6Lik,8681
7
12
  logger_36/catalog/handler/file.py,sha256=GS5nsfp0j0mzPak7vz8E7U4e5H95os_qfDjdM1Ywf0g,4345
8
- logger_36/catalog/handler/generic.py,sha256=COBZfZ-WqikLvnHVnqwabLoeAhVQrQTHIkMUiYqSJnU,7036
9
- logger_36/catalog/logging/chronos.py,sha256=eLqQw8N9vaGO23OCf5RrYDPbUeu7epUvDt9rH-dN7i0,2522
10
- logger_36/catalog/logging/exception.py,sha256=sL7sZ_bjNoof2xgOXvBzAi2xHrj7Pmjfkfhjzuy6NGs,2708
11
- logger_36/catalog/logging/gpu.py,sha256=vUFSP17e7U4nenMi5IMlDiP3cZvXe6nqEDpoqzTavdg,3490
12
- logger_36/catalog/logging/memory.py,sha256=Zel_UCnHqGAqf_YuKpvjt0OIOo9vwKYpFM9g_2bjir0,4790
13
- logger_36/catalog/logging/system.py,sha256=FQ3w1zIN1ab6y8QYtcYDULhyJYy4iwTwHoDs8Mi2IdQ,3159
13
+ logger_36/catalog/handler/generic.py,sha256=IwHOE_KhviuJJKCp8-LU86X90Mp0HJO5V5fhiOhfN98,8126
14
+ logger_36/catalog/logger/chronos.py,sha256=eLqQw8N9vaGO23OCf5RrYDPbUeu7epUvDt9rH-dN7i0,2522
15
+ logger_36/catalog/logger/exception.py,sha256=sL7sZ_bjNoof2xgOXvBzAi2xHrj7Pmjfkfhjzuy6NGs,2708
16
+ logger_36/catalog/logger/gpu.py,sha256=vUFSP17e7U4nenMi5IMlDiP3cZvXe6nqEDpoqzTavdg,3490
17
+ logger_36/catalog/logger/memory.py,sha256=Zel_UCnHqGAqf_YuKpvjt0OIOo9vwKYpFM9g_2bjir0,4790
18
+ logger_36/catalog/logger/system.py,sha256=FQ3w1zIN1ab6y8QYtcYDULhyJYy4iwTwHoDs8Mi2IdQ,3159
14
19
  logger_36/config/issue.py,sha256=G-i5p6lhZCLAOa-VTMyL9ZonvGCvhdoQ5KZdSWgP-FU,2267
20
+ logger_36/config/logger.py,sha256=1uzuguWShCU13LtPBPs7tgP_iSnl3SE5hF-iqieaBYQ,3742
15
21
  logger_36/config/memory.py,sha256=yCX5phsB_KJMr5xHpVUeOHFhAA7p_8yahP3X28VndOY,2217
16
22
  logger_36/config/message.py,sha256=SP5hq83WU2gr1G4drne-HLRwArH_ciLzE8ffUGLutc0,2649
17
23
  logger_36/config/system.py,sha256=HD8ZuwsXhEAExeZrww8YoDkQGMs4T5RDqQMb1W4qVgc,2477
@@ -27,17 +33,17 @@ logger_36/constant/system.py,sha256=G2mzBTxRXoJMxb53TnmBaceMJC_q3WonoCG7y6nC_R8,
27
33
  logger_36/instance/logger.py,sha256=ttKjl9MD7FUjqCWjv5w2hmmpDYxgaORcYf9NaaE9W_M,2246
28
34
  logger_36/instance/loggers.py,sha256=RCWpC1NPAf6vXnFc9NqsSALv-x-FEzcH6k_OlxTxeQk,2251
29
35
  logger_36/task/inspection.py,sha256=f9VkVrwMJ_ixV9rFu3XUNpmCbEgoo1tssqd2nMeGYLI,5028
30
- logger_36/task/storage.py,sha256=yxpdAVbN6l4Drn3RFk1ESlKVBYTkliBNgxAR91eGRYs,5646
36
+ logger_36/task/storage.py,sha256=XaSeu-iBCa0N8HNpwCV7cLprj-lbOJocpTIKUgSOvsc,5668
31
37
  logger_36/task/format/memory.py,sha256=ECOdHjdxIqXivOwtcmwpLDMYUrutIeOTCn1L4d3-U8k,4241
32
38
  logger_36/task/format/message.py,sha256=X9qtXPxhXgCIjnRYBJn93vj4rW4I-7dJP6LaXD5Qu2o,4142
33
39
  logger_36/task/format/rule.py,sha256=YEe8wG_QLy9vRZqmT2bWlvKT-Dxp4pGaZVmEuwwODyE,2598
34
40
  logger_36/task/measure/chronos.py,sha256=t-y0bVm1SmF-3wI9pR9Bp6-qzVlsE94fZTZr5a_hZUA,2884
35
- logger_36/task/measure/memory.py,sha256=CW6RDkdBOjoTeNjkg9g1laqsMSaunBnr-6qsxZ76CkA,2505
36
- logger_36/type/handler.py,sha256=baBJGen9MyQmoTMibSSy6PGyCxLv4Hbq5akIyhkt0u4,8284
41
+ logger_36/task/measure/memory.py,sha256=eVw5WOYLyn8o4O4mMArdX2MzsVuhhNDovjYEkk-MIaU,2504
42
+ logger_36/type/handler.py,sha256=BXpevZhLq5V_IdUfi_LZA4czzlH2SGLpgvbqUBe5X10,8311
37
43
  logger_36/type/issue.py,sha256=cB8pSSJg9aqFPQ6yJr4TC2kJbngKGK8Hyq4ATBm6jAc,2973
38
- logger_36/type/logger.py,sha256=TpE8OBS5YvnI6OO-aWwUWnjwEnuGW9toleVQs3pfhnk,14268
44
+ logger_36/type/logger.py,sha256=GaZQQDy6B0_5x2yOrV7r3W9ib7egSRQJCFRE_DpALYw,14669
39
45
  logger_36/type/loggers.py,sha256=znqxWBnfQxvkg3VUfbTUvt3S6Kq0DAzWWepxQDt9suI,2871
40
- logger_36-2024.17.dist-info/METADATA,sha256=nA79XRLBjLRoalW11NdBz_8xp1SyalDl15VDY2hvC68,6276
41
- logger_36-2024.17.dist-info/WHEEL,sha256=y4mX-SOX4fYIkonsAGA5N0Oy-8_gI4FXw5HNI1xqvWg,91
42
- logger_36-2024.17.dist-info/top_level.txt,sha256=sM95BTMWmslEEgR_1pzwZsOeSp8C_QBiu8ImbFr0XLc,10
43
- logger_36-2024.17.dist-info/RECORD,,
46
+ logger_36-2024.19.dist-info/METADATA,sha256=p3u2INogEHx1jOHYVd6Qja2EmVeA-qe5dM2rcVuOfXc,6276
47
+ logger_36-2024.19.dist-info/WHEEL,sha256=-oYQCr74JF3a37z2nRlQays_SX2MqOANoqVjBBAP2yE,91
48
+ logger_36-2024.19.dist-info/top_level.txt,sha256=sM95BTMWmslEEgR_1pzwZsOeSp8C_QBiu8ImbFr0XLc,10
49
+ logger_36-2024.19.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (70.2.0)
2
+ Generator: setuptools (71.0.3)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
File without changes
File without changes
File without changes
File without changes
File without changes