logger-36 2025.27__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.
Files changed (62) hide show
  1. {logger_36-2025.27 → logger_36-2025.28}/PKG-INFO +1 -1
  2. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36/catalog/logger/chronos.py +30 -6
  3. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36/task/measure/chronos.py +7 -2
  4. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36/type/logger.py +11 -1
  5. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36/version.py +1 -1
  6. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36.egg-info/PKG-INFO +1 -1
  7. {logger_36-2025.27 → logger_36-2025.28}/MANIFEST.in +0 -0
  8. {logger_36-2025.27 → logger_36-2025.28}/README-COPYRIGHT-utf8.txt +0 -0
  9. {logger_36-2025.27 → logger_36-2025.28}/README-LICENCE-utf8.txt +0 -0
  10. {logger_36-2025.27 → logger_36-2025.28}/README.rst +0 -0
  11. {logger_36-2025.27 → logger_36-2025.28}/documentation/wiki/description.asciidoc +0 -0
  12. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36/__init__.py +0 -0
  13. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36/api/chronos.py +0 -0
  14. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36/api/logger.py +0 -0
  15. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36/api/memory.py +0 -0
  16. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36/api/message.py +0 -0
  17. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36/api/storage.py +0 -0
  18. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36/catalog/config/console_rich.py +0 -0
  19. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36/catalog/config/optional.py +0 -0
  20. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36/catalog/handler/console.py +0 -0
  21. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36/catalog/handler/console_rich.py +0 -0
  22. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36/catalog/handler/file.py +0 -0
  23. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36/catalog/handler/generic.py +0 -0
  24. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36/catalog/handler/memory.py +0 -0
  25. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36/catalog/logger/gpu.py +0 -0
  26. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36/catalog/logger/memory.py +0 -0
  27. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36/catalog/logger/system.py +0 -0
  28. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36/config/issue.py +0 -0
  29. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36/config/memory.py +0 -0
  30. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36/config/message.py +0 -0
  31. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36/config/rule.py +0 -0
  32. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36/config/system.py +0 -0
  33. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36/constant/chronos.py +0 -0
  34. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36/constant/error.py +0 -0
  35. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36/constant/html.py +0 -0
  36. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36/constant/issue.py +0 -0
  37. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36/constant/logger.py +0 -0
  38. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36/constant/memory.py +0 -0
  39. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36/constant/message.py +0 -0
  40. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36/constant/path.py +0 -0
  41. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36/constant/record.py +0 -0
  42. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36/constant/rule.py +0 -0
  43. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36/constant/system.py +0 -0
  44. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36/extension/file.py +0 -0
  45. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36/extension/inspection.py +0 -0
  46. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36/extension/line.py +0 -0
  47. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36/extension/sentinel.py +0 -0
  48. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36/instance/logger.py +0 -0
  49. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36/instance/loggers.py +0 -0
  50. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36/task/format/memory.py +0 -0
  51. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36/task/format/message.py +0 -0
  52. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36/task/measure/memory.py +0 -0
  53. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36/task/storage.py +0 -0
  54. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36/type/handler.py +0 -0
  55. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36/type/issue.py +0 -0
  56. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36/type/loggers.py +0 -0
  57. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36.egg-info/SOURCES.txt +0 -0
  58. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36.egg-info/dependency_links.txt +0 -0
  59. {logger_36-2025.27 → logger_36-2025.28}/package/logger_36.egg-info/top_level.txt +0 -0
  60. {logger_36-2025.27 → logger_36-2025.28}/pyproject.toml +0 -0
  61. {logger_36-2025.27 → logger_36-2025.28}/setup.cfg +0 -0
  62. {logger_36-2025.27 → logger_36-2025.28}/setup.py +0 -0
@@ -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
@@ -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]
@@ -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)
@@ -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
File without changes
File without changes
File without changes
File without changes
File without changes