logger-36 2025.26__tar.gz → 2025.28__tar.gz
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-2025.26 → logger_36-2025.28}/PKG-INFO +1 -1
- {logger_36-2025.26 → logger_36-2025.28}/documentation/wiki/description.asciidoc +1 -15
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36/catalog/logger/chronos.py +30 -6
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36/task/measure/chronos.py +7 -2
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36/type/logger.py +25 -24
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36/version.py +1 -1
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36.egg-info/PKG-INFO +1 -1
- {logger_36-2025.26 → logger_36-2025.28}/MANIFEST.in +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/README-COPYRIGHT-utf8.txt +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/README-LICENCE-utf8.txt +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/README.rst +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36/__init__.py +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36/api/chronos.py +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36/api/logger.py +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36/api/memory.py +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36/api/message.py +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36/api/storage.py +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36/catalog/config/console_rich.py +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36/catalog/config/optional.py +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36/catalog/handler/console.py +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36/catalog/handler/console_rich.py +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36/catalog/handler/file.py +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36/catalog/handler/generic.py +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36/catalog/handler/memory.py +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36/catalog/logger/gpu.py +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36/catalog/logger/memory.py +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36/catalog/logger/system.py +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36/config/issue.py +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36/config/memory.py +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36/config/message.py +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36/config/rule.py +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36/config/system.py +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36/constant/chronos.py +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36/constant/error.py +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36/constant/html.py +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36/constant/issue.py +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36/constant/logger.py +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36/constant/memory.py +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36/constant/message.py +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36/constant/path.py +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36/constant/record.py +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36/constant/rule.py +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36/constant/system.py +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36/extension/file.py +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36/extension/inspection.py +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36/extension/line.py +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36/extension/sentinel.py +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36/instance/logger.py +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36/instance/loggers.py +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36/task/format/memory.py +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36/task/format/message.py +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36/task/measure/memory.py +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36/task/storage.py +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36/type/handler.py +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36/type/issue.py +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36/type/loggers.py +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36.egg-info/SOURCES.txt +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36.egg-info/dependency_links.txt +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/package/logger_36.egg-info/top_level.txt +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/pyproject.toml +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/setup.cfg +0 -0
- {logger_36-2025.26 → logger_36-2025.28}/setup.py +0 -0
@@ -1,4 +1,4 @@
|
|
1
|
-
// Copyright CNRS/
|
1
|
+
// Copyright CNRS (https://www.cnrs.fr/index.php/en)
|
2
2
|
// Contributor(s): Eric Debreuve (eric.debreuve@cnrs.fr) since 2023
|
3
3
|
// SEE COPYRIGHT NOTICE BELOW
|
4
4
|
|
@@ -59,17 +59,3 @@
|
|
59
59
|
// knowledge of the CeCILL license and that you accept its terms.
|
60
60
|
//
|
61
61
|
// SEE LICENCE NOTICE: file README-LICENCE-utf8.txt at project source root.
|
62
|
-
//
|
63
|
-
// This software is being developed by Eric Debreuve, a CNRS employee and
|
64
|
-
// member of team Morpheme.
|
65
|
-
// Team Morpheme is a joint team between Inria, CNRS, and UniCA.
|
66
|
-
// It is hosted by the Centre Inria d'Université Côte d'Azur, Laboratory
|
67
|
-
// I3S, and Laboratory iBV.
|
68
|
-
//
|
69
|
-
// CNRS: https://www.cnrs.fr/index.php/en
|
70
|
-
// Inria: https://www.inria.fr/en/
|
71
|
-
// UniCA: https://univ-cotedazur.eu/
|
72
|
-
// Centre Inria d'Université Côte d'Azur: https://www.inria.fr/en/centre/sophia/
|
73
|
-
// I3S: https://www.i3s.unice.fr/en/
|
74
|
-
// iBV: http://ibv.unice.fr/
|
75
|
-
// Team Morpheme: https://team.inria.fr/morpheme/
|
@@ -6,8 +6,8 @@ SEE COPYRIGHT NOTICE BELOW
|
|
6
6
|
|
7
7
|
from datetime import datetime as date_time_t
|
8
8
|
|
9
|
-
from logger_36.constant.chronos import FORMATTED_START_DATE_TIME
|
10
|
-
from logger_36.constant.record import SHOW_WHEN_ATTR
|
9
|
+
from logger_36.constant.chronos import FORMATTED_START_DATE_TIME, START_DATE_TIME
|
10
|
+
from logger_36.constant.record import SHOW_WHEN_ATTR, SHOW_WHERE_ATTR
|
11
11
|
from logger_36.instance.logger import L
|
12
12
|
from logger_36.task.measure.chronos import FormattedElapsedTime
|
13
13
|
from logger_36.type.logger import logger_t
|
@@ -15,11 +15,35 @@ from logger_36.type.logger import logger_t
|
|
15
15
|
|
16
16
|
def LogElapsedTime(*, logger: logger_t = L) -> None:
|
17
17
|
""""""
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
18
|
+
now = date_time_t.now()
|
19
|
+
|
20
|
+
message = (
|
21
|
+
f"Elapsed Time: {FormattedElapsedTime(now, with_separator=False)} "
|
22
|
+
f"(since {FORMATTED_START_DATE_TIME})"
|
22
23
|
)
|
24
|
+
if logger.intermediate_times.__len__() > 0:
|
25
|
+
intermediate_e_times = []
|
26
|
+
for (start_name, start_time), (end_name, end_time) in zip(
|
27
|
+
[("START", START_DATE_TIME)] + logger.intermediate_times,
|
28
|
+
logger.intermediate_times + [("END", now)],
|
29
|
+
strict=True,
|
30
|
+
):
|
31
|
+
intermediate_e_times.append(
|
32
|
+
(
|
33
|
+
f"{start_name} → {end_name}",
|
34
|
+
FormattedElapsedTime(
|
35
|
+
end_time, reference=start_time, with_separator=False
|
36
|
+
),
|
37
|
+
)
|
38
|
+
)
|
39
|
+
max_length = max(map(len, (_[0] for _ in intermediate_e_times)))
|
40
|
+
intermediate_e_times = "\n ".join(
|
41
|
+
f"{_: <{max_length}} +{__}" for _, __ in intermediate_e_times
|
42
|
+
)
|
43
|
+
message += "\n " + intermediate_e_times
|
44
|
+
logger.intermediate_times.clear()
|
45
|
+
|
46
|
+
logger.info(message, extra={SHOW_WHEN_ATTR: False, SHOW_WHERE_ATTR: False})
|
23
47
|
|
24
48
|
|
25
49
|
"""
|
@@ -24,7 +24,11 @@ def TimeStamp(*, precision: str = "microseconds") -> str:
|
|
24
24
|
|
25
25
|
|
26
26
|
def FormattedElapsedTime(
|
27
|
-
now: date_time_t,
|
27
|
+
now: date_time_t,
|
28
|
+
/,
|
29
|
+
*,
|
30
|
+
reference: date_time_t = START_DATE_TIME,
|
31
|
+
with_separator: bool = True,
|
28
32
|
) -> str:
|
29
33
|
""""""
|
30
34
|
output = str(now - reference)
|
@@ -36,7 +40,8 @@ def FormattedElapsedTime(
|
|
36
40
|
if output[0] == "0":
|
37
41
|
output = output[1:]
|
38
42
|
|
39
|
-
|
43
|
+
if with_separator:
|
44
|
+
output = ELAPSED_TIME_SEPARATOR + output
|
40
45
|
|
41
46
|
if output.__len__() > TIME_LENGTH:
|
42
47
|
return output[:TIME_LENGTH]
|
@@ -9,7 +9,6 @@ import inspect as e
|
|
9
9
|
import logging as l
|
10
10
|
import multiprocessing as prll
|
11
11
|
import sys as s
|
12
|
-
import textwrap as text
|
13
12
|
import threading as thrd
|
14
13
|
import traceback as tcbk
|
15
14
|
import types as t
|
@@ -41,7 +40,7 @@ from logger_36.constant.chronos import DATE_ORIGIN, DATE_TIME_ORIGIN
|
|
41
40
|
from logger_36.constant.issue import ISSUE_LEVEL_SEPARATOR, ORDER, order_h
|
42
41
|
from logger_36.constant.logger import WARNING_LOGGER_NAME, WARNING_TYPE_COMPILED_PATTERN
|
43
42
|
from logger_36.constant.memory import UNKNOWN_MEMORY_USAGE
|
44
|
-
from logger_36.constant.message import
|
43
|
+
from logger_36.constant.message import expected_op_h
|
45
44
|
from logger_36.constant.path import USER_FOLDER, LAUNCH_ROOT_FILE_relative
|
46
45
|
from logger_36.constant.record import (
|
47
46
|
HAS_ACTUAL_EXPECTED_ATTR,
|
@@ -56,7 +55,6 @@ from logger_36.extension.sentinel import NOT_PASSED
|
|
56
55
|
from logger_36.task.format.message import MessageWithActualExpected
|
57
56
|
from logger_36.task.measure.chronos import FormattedElapsedTime
|
58
57
|
from logger_36.task.measure.memory import CurrentUsage as CurrentMemoryUsage
|
59
|
-
from logger_36.type.handler import extension_t as handler_extension_t
|
60
58
|
from logger_36.type.handler import handler_h as base_handler_h
|
61
59
|
from logger_36.type.issue import NewIssue, issue_t
|
62
60
|
|
@@ -94,6 +92,9 @@ class logger_t(base_t):
|
|
94
92
|
|
95
93
|
history: dict[date_time_t, str] = d.field(init=False, default_factory=dict)
|
96
94
|
n_events: dict[int, int] = d.field(init=False, default_factory=dict)
|
95
|
+
intermediate_times: list[tuple[str, date_time_t]] = d.field(
|
96
|
+
init=False, default_factory=list
|
97
|
+
)
|
97
98
|
|
98
99
|
last_message_now: date_time_t = d.field(init=False, default=DATE_TIME_ORIGIN)
|
99
100
|
last_message_date: date_t = d.field(init=False, default=DATE_ORIGIN)
|
@@ -449,7 +450,7 @@ class logger_t(base_t):
|
|
449
450
|
"""
|
450
451
|
For a print-like calling for print-based debugging.
|
451
452
|
"""
|
452
|
-
separator = kwargs.
|
453
|
+
separator = kwargs.pop("separator", " ")
|
453
454
|
|
454
455
|
frame = e.stack(context=0)[1][0] # 1=caller.
|
455
456
|
details = e.getframeinfo(frame, context=0)
|
@@ -458,7 +459,10 @@ class logger_t(base_t):
|
|
458
459
|
path = path.relative_to(USER_FOLDER)
|
459
460
|
where = f"{str(path.with_suffix(''))}:{details.function}:{details.lineno}"
|
460
461
|
|
461
|
-
self.info(
|
462
|
+
self.info(
|
463
|
+
separator.join(map(str, args)) + f"\n{WHERE_SEPARATOR} " + where,
|
464
|
+
extra=kwargs,
|
465
|
+
)
|
462
466
|
|
463
467
|
def Log(
|
464
468
|
self,
|
@@ -471,6 +475,7 @@ class logger_t(base_t):
|
|
471
475
|
expected_is_choices: bool = False,
|
472
476
|
expected_op: expected_op_h = "=",
|
473
477
|
with_final_dot: bool = True,
|
478
|
+
**extra,
|
474
479
|
) -> None:
|
475
480
|
""""""
|
476
481
|
if isinstance(level, str):
|
@@ -483,25 +488,12 @@ class logger_t(base_t):
|
|
483
488
|
expected_op=expected_op,
|
484
489
|
with_final_dot=with_final_dot,
|
485
490
|
)
|
486
|
-
|
487
|
-
extra = {HAS_ACTUAL_EXPECTED_ATTR: True}
|
488
|
-
else:
|
489
|
-
extra = {}
|
491
|
+
extra[HAS_ACTUAL_EXPECTED_ATTR] = has_actual_expected
|
490
492
|
self.log(level, message, extra=extra)
|
491
493
|
|
492
|
-
def LogAsIs(self, message: str,
|
494
|
+
def LogAsIs(self, message: str, /) -> None:
|
493
495
|
""""""
|
494
|
-
|
495
|
-
message = text.indent(message, LINE_INDENT)
|
496
|
-
|
497
|
-
emit_message_name = handler_extension_t.EmitMessage.__name__
|
498
|
-
FallbackEmitMessage = print
|
499
|
-
for handler in self.handlers:
|
500
|
-
EmitMessage = getattr(handler, emit_message_name, FallbackEmitMessage)
|
501
|
-
if EmitMessage is not None:
|
502
|
-
EmitMessage(message)
|
503
|
-
if EmitMessage is print:
|
504
|
-
FallbackEmitMessage = None
|
496
|
+
self.log(l.INFO, message, extra={SHOW_WHEN_ATTR: False, SHOW_WHERE_ATTR: False})
|
505
497
|
|
506
498
|
info_raw = LogAsIs # To follow the convention of the logging methods info, error...
|
507
499
|
|
@@ -681,9 +673,13 @@ class logger_t(base_t):
|
|
681
673
|
del extra[HAS_ACTUAL_EXPECTED_ATTR]
|
682
674
|
self.staged_issues.clear()
|
683
675
|
|
676
|
+
def SetInstantName(self, name: str, /) -> None:
|
677
|
+
""""""
|
678
|
+
self.intermediate_times.append((name, date_time_t.now()))
|
679
|
+
|
684
680
|
def StoragePath(self, suffix: str, /) -> path_t:
|
685
681
|
"""
|
686
|
-
Use as staticmethod if needed.
|
682
|
+
Use as staticmethod if needed, passing a logger as self.
|
687
683
|
"""
|
688
684
|
for handler in self.handlers:
|
689
685
|
if (path := getattr(handler, "baseFilename", None)) is not None:
|
@@ -712,8 +708,13 @@ class logger_t(base_t):
|
|
712
708
|
|
713
709
|
def __del__(self) -> None:
|
714
710
|
""""""
|
715
|
-
|
716
|
-
|
711
|
+
for handler in self.handlers:
|
712
|
+
handler.flush()
|
713
|
+
|
714
|
+
if (
|
715
|
+
(prll.current_process is not None)
|
716
|
+
and (prll.current_process().name == MAIN_PROCESS_NAME)
|
717
|
+
and (self.log_server is not None)
|
717
718
|
):
|
718
719
|
self.log_server.stop()
|
719
720
|
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|