logger-36 2025.27__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
@@ -92,6 +92,9 @@ class logger_t(base_t):
92
92
 
93
93
  history: dict[date_time_t, str] = d.field(init=False, default_factory=dict)
94
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
+ )
95
98
 
96
99
  last_message_now: date_time_t = d.field(init=False, default=DATE_TIME_ORIGIN)
97
100
  last_message_date: date_t = d.field(init=False, default=DATE_ORIGIN)
@@ -670,9 +673,13 @@ class logger_t(base_t):
670
673
  del extra[HAS_ACTUAL_EXPECTED_ATTR]
671
674
  self.staged_issues.clear()
672
675
 
676
+ def SetInstantName(self, name: str, /) -> None:
677
+ """"""
678
+ self.intermediate_times.append((name, date_time_t.now()))
679
+
673
680
  def StoragePath(self, suffix: str, /) -> path_t:
674
681
  """
675
- Use as staticmethod if needed.
682
+ Use as staticmethod if needed, passing a logger as self.
676
683
  """
677
684
  for handler in self.handlers:
678
685
  if (path := getattr(handler, "baseFilename", None)) is not None:
@@ -701,6 +708,9 @@ class logger_t(base_t):
701
708
 
702
709
  def __del__(self) -> None:
703
710
  """"""
711
+ for handler in self.handlers:
712
+ handler.flush()
713
+
704
714
  if (
705
715
  (prll.current_process is not None)
706
716
  and (prll.current_process().name == MAIN_PROCESS_NAME)
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.27"
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.27
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=qAg2mrOjz-6X7HvNM4DsgwzItwuB5XOxJLIbal9yr6E,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=0Cgq_SwI8ofiRxYS0duDWHGVYZAzmxfGuXj2KYHRIEE,27481
48
+ logger_36/type/logger.py,sha256=069yBZKImTtbABgBHieJhKgkaqdak5Pr2Q7KXu3Caho,27820
49
49
  logger_36/type/loggers.py,sha256=tFcuso9KGLDHnFfCaEJTDukUyYnbZEZrffpm59SDYO0,3067
50
- logger_36-2025.27.dist-info/METADATA,sha256=m-TedtBHSYi0asize26skN3F1qoifv22ioSnNIvNYw4,5980
51
- logger_36-2025.27.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
52
- logger_36-2025.27.dist-info/top_level.txt,sha256=sM95BTMWmslEEgR_1pzwZsOeSp8C_QBiu8ImbFr0XLc,10
53
- logger_36-2025.27.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,,