logger-36 2025.26__py3-none-any.whl → 2025.28__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.
@@ -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
- logger.info(
19
- f"Elapsed Time: {FormattedElapsedTime(date_time_t.now())[1:]} "
20
- f"(since {FORMATTED_START_DATE_TIME})",
21
- extra={SHOW_WHEN_ATTR: False},
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, /, *, reference: date_time_t = START_DATE_TIME
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
- output = ELAPSED_TIME_SEPARATOR + output
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]
logger_36/type/logger.py CHANGED
@@ -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 LINE_INDENT, expected_op_h
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.get("separator", " ")
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(separator.join(map(str, args)) + f"\n{WHERE_SEPARATOR} " + where)
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
- if has_actual_expected:
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, /, *, indented: bool = False) -> None:
494
+ def LogAsIs(self, message: str, /) -> None:
493
495
  """"""
494
- if indented:
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
- if (prll.current_process().name == MAIN_PROCESS_NAME) and (
716
- self.log_server is not None
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
 
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.26"
7
+ __version__ = "2025.28"
8
8
 
9
9
  """
10
10
  COPYRIGHT NOTICE
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: logger-36
3
- Version: 2025.26
3
+ Version: 2025.28
4
4
  Summary: Simple logger with a catalog of handlers
5
5
  Home-page: https://src.koda.cnrs.fr/eric.debreuve/logger-36/
6
6
  Author: Eric Debreuve
@@ -1,5 +1,5 @@
1
1
  logger_36/__init__.py,sha256=mK6AD0eWI2Sk42oxleTvsxzYJ28FbHK5WNkpLgAhnNE,2129
2
- logger_36/version.py,sha256=fBTfEcPCSuwkL8x5pbreTgXkwh6f9ZP8qTnT8-3kU0s,1680
2
+ logger_36/version.py,sha256=M8fpBaTd8kBwBG4nMFWglaJivCiPj_h78PHrwTU20B0,1680
3
3
  logger_36/api/chronos.py,sha256=o_UMZbeExjb01aNURmzIjOMAHhI9e90nyvJJYcJR6VQ,1739
4
4
  logger_36/api/logger.py,sha256=eLZ2yuH-sYeh4Z2KnAwTRJEbmkmgzBPMncdqXfFUTG8,1760
5
5
  logger_36/api/memory.py,sha256=U4mMEkx8WRHk9q2d3SCFGt2EJaBuflOXw2bGbAxOnSc,1828
@@ -12,7 +12,7 @@ logger_36/catalog/handler/console_rich.py,sha256=PSHsul03HNjQR8GmQVU3Z0DNNaudOYN
12
12
  logger_36/catalog/handler/file.py,sha256=5GR_aACDEBXuZ-pUH9P0OCaXbCf-aLPmsz-XrGCAIgE,2434
13
13
  logger_36/catalog/handler/generic.py,sha256=HhBtM3JZBJjW2OLALnxdoWLsFs6J-AMzyFwwUs-woIA,7046
14
14
  logger_36/catalog/handler/memory.py,sha256=pJwKOlCm8Ej8ipDI00-FfX4qJjMPXJb-DucD1ukIQOU,4057
15
- logger_36/catalog/logger/chronos.py,sha256=MDAx_NRRcRZcQYDDjVCRcu87SDP-rPYjX0-10KNcMnk,2216
15
+ logger_36/catalog/logger/chronos.py,sha256=OTXM_Ltrn-5g-g09jDHfCROPLxA5D7Z9wX1XVe1rNkM,3215
16
16
  logger_36/catalog/logger/gpu.py,sha256=Py5YY0nD_pqJzJsEKQYoOGHcPqyNVJ3J2noOS3hDL6g,2890
17
17
  logger_36/catalog/logger/memory.py,sha256=pa-9pkvDGdf52giwL3Zi1mjWNFE_NVzBGdjwcfeIDNc,4256
18
18
  logger_36/catalog/logger/system.py,sha256=zEbHirATqZAVYFmHLd0pppeuRhka1ucWwyHRq0afQNE,2593
@@ -41,13 +41,13 @@ logger_36/instance/loggers.py,sha256=inBk4KKrQ-z3szaopQ29-qQwh1iSc842sWo5J6zJoiM
41
41
  logger_36/task/storage.py,sha256=L93v5w9p_7MoiagEr3d6QSYEQxX42DxmZ-BJTCuLpgQ,3915
42
42
  logger_36/task/format/memory.py,sha256=xcWwbUnl1BxH7RVBHyhp1RlbT2n370PzoFLLLd3dtlU,3726
43
43
  logger_36/task/format/message.py,sha256=Q9QkyUAU47Nj606zsvq0gNyso8Vk9G9OaqG9Em5FjKg,3575
44
- logger_36/task/measure/chronos.py,sha256=fZKK16LwlLzRRAP-gfF1uy6gFCL33gR7LZ4Xs_nXdVY,2612
44
+ logger_36/task/measure/chronos.py,sha256=nlyPUebI_cJSU_aUvbunE1gs7ozP5lZg9D_yJ_i06qI,2685
45
45
  logger_36/task/measure/memory.py,sha256=kkPHEIUTUhkCOLrAt01eLJLnsnkl0nFPNhFZdIB_JAw,1991
46
46
  logger_36/type/handler.py,sha256=8ufQEjfIIk63rBTu0B-LF67x_UKDuFvnzC3g7CnfK18,6666
47
47
  logger_36/type/issue.py,sha256=M2KeQwzDG9yqgdtbyWk5Y-ier7c71TuAKlNCf5QCGzY,2770
48
- logger_36/type/logger.py,sha256=1cCCzD94GUhE4dkwUi7JTXrkSY_Hl0gBJsf77R74NUU,27924
48
+ logger_36/type/logger.py,sha256=069yBZKImTtbABgBHieJhKgkaqdak5Pr2Q7KXu3Caho,27820
49
49
  logger_36/type/loggers.py,sha256=tFcuso9KGLDHnFfCaEJTDukUyYnbZEZrffpm59SDYO0,3067
50
- logger_36-2025.26.dist-info/METADATA,sha256=OVtkqyYNXVn4vKqCQVbz3CkP5_8HgZZdPX7j2F2JpD0,5980
51
- logger_36-2025.26.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
52
- logger_36-2025.26.dist-info/top_level.txt,sha256=sM95BTMWmslEEgR_1pzwZsOeSp8C_QBiu8ImbFr0XLc,10
53
- logger_36-2025.26.dist-info/RECORD,,
50
+ logger_36-2025.28.dist-info/METADATA,sha256=YyGRwdDyWtK2k3HRWOkvA_4Z1T4Yq4npNmHzFLP9Ru8,5980
51
+ logger_36-2025.28.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
52
+ logger_36-2025.28.dist-info/top_level.txt,sha256=sM95BTMWmslEEgR_1pzwZsOeSp8C_QBiu8ImbFr0XLc,10
53
+ logger_36-2025.28.dist-info/RECORD,,