From 513c58cba33a2a838f38dde29c518c09f330b8c6 Mon Sep 17 00:00:00 2001
From: DEBREUVE Eric <eric.debreuve@cnrs.fr>
Date: Thu, 13 Feb 2025 11:36:59 +0100
Subject: [PATCH] alternating logs now defaults to 0 (disabled), improved
 alternating logs implementation

---
 .../logger_36/catalog/handler/console_rich.py | 51 ++++++++-----------
 package/logger_36/catalog/handler/generic.py  | 31 ++++-------
 package/logger_36/handler.py                  |  8 +--
 package/logger_36/type/logger.py              |  4 +-
 package/logger_36/version.py                  |  2 +-
 test/main.py                                  |  2 +-
 6 files changed, 38 insertions(+), 60 deletions(-)

diff --git a/package/logger_36/catalog/handler/console_rich.py b/package/logger_36/catalog/handler/console_rich.py
index 752853c..e5c9fb4 100644
--- a/package/logger_36/catalog/handler/console_rich.py
+++ b/package/logger_36/catalog/handler/console_rich.py
@@ -48,21 +48,15 @@ class console_rich_handler_t(l.Handler):
     """
     kind: See logger_36.constant.handler.handler_codes_h.
 
-    alternating_lines:
-    - Initial value:
-        - 1: enabled for dark background
-        - 2: enabled for light background
-        - anything else: disabled
-    - Runtime value: 0/1=do not/do highlight next time.
+    alternating_logs:
+    - 0: disabled
+    - 1: enabled for dark background
+    - 2: enabled for light background
     """
 
     kind: h.ClassVar[str] = "c"
 
-    extension: handler_extension_t = d.field(init=False)
-    console: console_t = d.field(init=False)
-    MessageFromRecord: MessageFromRecordPreprocessed_p = d.field(init=False)
-    alternating_lines: int = 0
-    background_is_light: bool = True
+    alternating_logs: int = 0
 
     name: d.InitVar[str | None] = None
     level: d.InitVar[int] = l.NOTSET
@@ -74,6 +68,11 @@ class console_rich_handler_t(l.Handler):
     should_record: d.InitVar[bool] = False
     rich_kwargs: d.InitVar[dict[str, h.Any] | None] = None
 
+    extension: handler_extension_t = d.field(init=False)
+    console: console_t = d.field(init=False)
+    MessageFromRecord: MessageFromRecordPreprocessed_p = d.field(init=False)
+    log_parity: bool = d.field(init=False, default=False)
+
     @property
     def past_logs_as_HTML(self) -> str | None:
         """"""
@@ -130,14 +129,7 @@ class console_rich_handler_t(l.Handler):
             InstallTracebackHandler(**rich_traceback_kwargs)
 
         self.MessageFromRecord = self.extension.MessageFromRecord
-        if self.alternating_lines == 1:
-            self.alternating_lines = 0
-            self.background_is_light = False
-        elif self.alternating_lines == 2:
-            self.alternating_lines = 0
-            self.background_is_light = True
-        else:
-            self.alternating_lines = -1
+        assert self.alternating_logs in (0, 1, 2)
 
     def emit(self, record: l.LogRecord, /) -> None:
         """"""
@@ -145,17 +137,15 @@ class console_rich_handler_t(l.Handler):
             richer = Rule(record.msg, DATE_TIME_COLOR)
         else:
             message = self.MessageFromRecord(record, PreProcessed=EscapedVersion)
-            should_highlight_back = self.alternating_lines == 1
-            if self.alternating_lines >= 0:
-                self.alternating_lines = (self.alternating_lines + 1) % 2
             richer = HighlightedVersion(
                 self.console,
                 message,
                 record.levelno,
-                should_highlight_back=should_highlight_back,
-                background_is_light=self.background_is_light,
+                self.alternating_logs,
+                self.log_parity,
             )
         self.console.print(richer, crop=False, overflow="ignore")
+        self.log_parity = not self.log_parity
 
     def LogAsIs(self, message: str | renderable_t, /) -> None:
         """
@@ -173,10 +163,9 @@ def HighlightedVersion(
     _: console_t,
     message: str,
     log_level: int,
+    alternating_logs: int,
+    should_tint_background: bool,
     /,
-    *,
-    should_highlight_back: bool = False,
-    background_is_light: bool = True,
 ) -> renderable_t:
     """"""
     output = text_t(message, WHITE_COLOR)
@@ -188,11 +177,11 @@ def HighlightedVersion(
     _ = output.highlight_words(ACTUAL_PATTERNS, style=ACTUAL_COLOR)
     _ = output.highlight_regex(EXPECTED_PATTERNS, style=EXPECTED_COLOR)
 
-    if should_highlight_back:
-        if background_is_light:
-            style = ALTERNATIVE_BACKGROUND_FOR_LIGHT
-        else:
+    if should_tint_background and (alternating_logs > 0):
+        if alternating_logs == 1:
             style = ALTERNATIVE_BACKGROUND_FOR_DARK
+        else:
+            style = ALTERNATIVE_BACKGROUND_FOR_LIGHT
         output.stylize(style)
 
     return output
diff --git a/package/logger_36/catalog/handler/generic.py b/package/logger_36/catalog/handler/generic.py
index 607339b..8e7ee35 100644
--- a/package/logger_36/catalog/handler/generic.py
+++ b/package/logger_36/catalog/handler/generic.py
@@ -39,12 +39,10 @@ class generic_handler_t(l.Handler):
     """
     kind: See logger_36.constant.handler.handler_codes_h.
 
-    alternating_lines:
-        - Initial value:
-            - 1: enabled for dark background
-            - 2: enabled for light background
-            - anything else: disabled
-        - Runtime value: 0/1=do not/do highlight next time.
+    alternating_logs:
+    - 0: disabled
+    - 1: enabled for dark background
+    - 2: enabled for light background
 
     LogAsIs:
         Log a message as is, i.e. without formatting. If this is a method, it should
@@ -63,12 +61,12 @@ class generic_handler_t(l.Handler):
     # "None -> h.Any" (twice below) since None | None is invalid.
     console: console_t | h.Any = None
     console_options: console_options_t | h.Any = None
-    alternating_lines: int = 0
-    background_is_light: bool = True
+    alternating_logs: int = 0
 
     DisplayRule: DisplayRule_p = d.field(init=False)
     extension: handler_extension_t = d.field(init=False)
     MessageFromRecord: MessageFromRecord_h = d.field(init=False)
+    log_parity: bool = d.field(init=False, default=False)
 
     name: d.InitVar[str | None] = None
     level: d.InitVar[int] = l.NOTSET
@@ -120,14 +118,7 @@ class generic_handler_t(l.Handler):
             self.DisplayRule = self._DisplayRuleAsText
 
         self.MessageFromRecord = self.extension.MessageFromRecord
-        if self.alternating_lines == 1:
-            self.alternating_lines = 0
-            self.background_is_light = False
-        elif self.alternating_lines == 2:
-            self.alternating_lines = 0
-            self.background_is_light = True
-        else:
-            self.alternating_lines = -1
+        assert self.alternating_logs in (0, 1, 2)
 
     def emit(self, record: l.LogRecord, /) -> None:
         """"""
@@ -141,15 +132,12 @@ class generic_handler_t(l.Handler):
                 richer = Rule(record.msg, DATE_TIME_COLOR)
             else:
                 message = self.MessageFromRecord(record, PreProcessed=EscapedForRich)
-                should_highlight_back = self.alternating_lines == 1
-                if self.alternating_lines >= 0:
-                    self.alternating_lines = (self.alternating_lines + 1) % 2
                 richer = HighlightedVersion(
                     self.console,
                     message,
                     record.levelno,
-                    should_highlight_back=should_highlight_back,
-                    background_is_light=self.background_is_light,
+                    self.alternating_logs,
+                    self.log_parity,
                 )
             segments = self.console.render(richer, options=self.console_options)
 
@@ -176,6 +164,7 @@ class generic_handler_t(l.Handler):
             )
 
         self.LogAsIs(message)
+        self.log_parity = not self.log_parity
 
     def _DisplayRuleAsText(
         self, /, *, text: str | None = None, color: str = "white"
diff --git a/package/logger_36/handler.py b/package/logger_36/handler.py
index 33e0b87..769f2b0 100644
--- a/package/logger_36/handler.py
+++ b/package/logger_36/handler.py
@@ -33,7 +33,7 @@ def AddGenericHandler(
     message_width: int = -1,
     formatter: l.Formatter | None = None,
     supports_html: bool = False,
-    alternating_lines: int = 2,
+    alternating_logs: int = 0,
     should_record: bool = False,
     should_hold_messages: bool = False,
     **kwargs,
@@ -46,7 +46,7 @@ def AddGenericHandler(
         message_width=message_width,
         formatter=formatter,
         supports_html=supports_html,
-        alternating_lines=alternating_lines,
+        alternating_logs=alternating_logs,
         should_record=should_record,
         rich_kwargs=kwargs,
         LogAsIs=LogAsIs,
@@ -85,7 +85,7 @@ def AddRichConsoleHandler(
     should_store_memory_usage: bool = False,
     message_width: int = -1,
     formatter: l.Formatter | None = None,
-    alternating_lines: int = 2,
+    alternating_logs: int = 0,
     should_hold_messages: bool = False,
     should_install_traceback: bool = False,
     should_record: bool = False,
@@ -101,7 +101,7 @@ def AddRichConsoleHandler(
         additional_s = {}
     else:
         additional_s = {
-            "alternating_lines": alternating_lines,
+            "alternating_logs": alternating_logs,
             "should_install_traceback": should_install_traceback,
             "should_record": should_record,
             "rich_kwargs": kwargs,
diff --git a/package/logger_36/type/logger.py b/package/logger_36/type/logger.py
index 63c6d1a..69fafc9 100644
--- a/package/logger_36/type/logger.py
+++ b/package/logger_36/type/logger.py
@@ -283,10 +283,10 @@ class logger_t(base_t):
         OverrideExceptionFormat()
         AddConsoleHandler(self)
 
-    def MakeRich(self, *, alternating_lines: int = 2) -> None:
+    def MakeRich(self, *, alternating_logs: int = 0) -> None:
         """"""
         OverrideExceptionFormat()
-        AddRichConsoleHandler(self, alternating_lines=alternating_lines)
+        AddRichConsoleHandler(self, alternating_logs=alternating_logs)
 
     def MakePermanent(self, path: str | path_t, /) -> None:
         """"""
diff --git a/package/logger_36/version.py b/package/logger_36/version.py
index 7721b71..710c4f3 100644
--- a/package/logger_36/version.py
+++ b/package/logger_36/version.py
@@ -4,7 +4,7 @@ Contributor(s): Eric Debreuve (eric.debreuve@cnrs.fr) since 2023
 SEE COPYRIGHT NOTICE BELOW
 """
 
-__version__ = "2025.9"
+__version__ = "2025.10"
 
 """
 COPYRIGHT NOTICE
diff --git a/test/main.py b/test/main.py
index a4a5f80..491c03e 100644
--- a/test/main.py
+++ b/test/main.py
@@ -75,7 +75,7 @@ def Main() -> None:
             should_store_memory_usage=True,
             should_hold_messages=True,
             should_record=True,
-            alternating_lines=1,
+            alternating_logs=1,
         )
         AddGenericHandler(
             L,
-- 
GitLab