11import logging
22import os
33import time
4+ from collections .abc import Mapping
45
56import click
67from rich .traceback import install as rich_traceback_install
@@ -40,6 +41,56 @@ def validate_test_configuration(
4041
4142
4243
44+ class EnvInjector :
45+ """Manage temporary overrides for ERS-related environment variables."""
46+
47+ def __init__ (self , ers_envs : Mapping [str , str ]) -> None :
48+ """Initialize handler state and capture original environment values.
49+
50+ Args:
51+ ers_envs (Mapping[str, str]): Environment variables and values to inject.
52+ """
53+ self .update_ers_envs (ers_envs )
54+ self .update_original_envs ()
55+
56+ def return_original_envs (self ) -> dict [str , str | None ]:
57+ """Return current values for tracked environment variables.
58+
59+ Returns:
60+ dict[str, str | None]: Mapping of variable names to their current values,
61+ or None if unset.
62+ """
63+ return {
64+ key : os .environ .get (key )
65+ for key in self .ers_envs
66+ }
67+
68+ def update_original_envs (self ) -> None :
69+ """Store a snapshot of current values for tracked environment variables."""
70+ self .ori_envs = self .return_original_envs ()
71+
72+ def update_ers_envs (self , ers_envs : Mapping [str , str ]) -> None :
73+ """Update the environment variables managed by this handler.
74+
75+ Args:
76+ ers_envs (Mapping[str, str]): Variables and values to manage.
77+ """
78+ self .ers_envs = dict (ers_envs )
79+
80+ def inject_ers_envs (self ) -> None :
81+ """Inject managed environment variable values into process environment."""
82+ for key , value in self .ers_envs .items ():
83+ os .environ [key ] = value
84+
85+ def restore_original_envs (self ) -> None :
86+ """Restore tracked environment variables to their original values."""
87+ for var_name , original_value in self .ori_envs .items ():
88+ if original_value is None :
89+ os .environ .pop (var_name , None )
90+ else :
91+ os .environ [var_name ] = original_value
92+
93+
4394def test_main_functions (main_logger :logging .Logger ) -> None :
4495 """Demonstrates the main functionality of the daqpytools logger.
4596
@@ -193,17 +244,20 @@ def test_handlerconf(main_logger: logging.Logger) -> None:
193244 main_logger .warning ("Handlerconf Base" , extra = handlerconf .Base )
194245 main_logger .warning ("Handlerconf Opmon" , extra = handlerconf .Opmon )
195246
196- #* Interlude: Inject sample environment variables
197- os .environ ["DUNEDAQ_ERS_WARNING" ] = "erstrace,throttle,lstdout"
198- os .environ ["DUNEDAQ_ERS_INFO" ] = "erstrace,throttle,lstdout"
199- os .environ ["DUNEDAQ_ERS_FATAL" ] = "erstrace,lstdout"
200- os .environ ["DUNEDAQ_ERS_ERROR" ] = (
201- "erstrace,"
202- "throttle,"
203- "lstdout,"
204- "protobufstream(monkafka.cern.ch:30092)"
205- )
206-
247+ ers_envs = {
248+ "DUNEDAQ_ERS_WARNING" : "erstrace,throttle,lstdout" ,
249+ "DUNEDAQ_ERS_INFO" : "erstrace,throttle,lstdout" ,
250+ "DUNEDAQ_ERS_FATAL" : "erstrace,lstdout" ,
251+ "DUNEDAQ_ERS_ERROR" : (
252+ "erstrace,"
253+ "throttle,"
254+ "lstdout,"
255+ "protobufstream(monkafka.cern.ch:30092)"
256+ )
257+ }
258+ env_injector = EnvInjector (ers_envs )
259+ env_injector .inject_ers_envs ()
260+
207261 info_out = f"{ os .getenv ('DUNEDAQ_ERS_ERROR' )= } "
208262 main_logger .info (info_out )
209263 critical_out = f"{ os .getenv ('DUNEDAQ_ERS_CRITICAL' )= } "
@@ -226,6 +280,8 @@ def test_handlerconf(main_logger: logging.Logger) -> None:
226280 extra = handlerconf .ERS
227281 )
228282
283+ env_injector .restore_original_envs ()
284+
229285
230286def test_fallback_handlers (log_level : str ) -> None :
231287 """Demonstrate fallback handler behavior for a logger.
@@ -280,6 +336,15 @@ def test_ers_handler_configuration(log_level: str) -> None:
280336 os .environ ["DUNEDAQ_ERS_FATAL" ] = "lstderr,rich"
281337 os .environ ["DUNEDAQ_ERS_ERROR" ] = "rich"
282338
339+ ers_envs = {
340+ "DUNEDAQ_ERS_WARNING" : "rich" ,
341+ "DUNEDAQ_ERS_INFO" : "lstdout" ,
342+ "DUNEDAQ_ERS_FATAL" : "lstderr,rich" ,
343+ "DUNEDAQ_ERS_ERROR" : "rich"
344+ }
345+ env_injector = EnvInjector (ers_envs )
346+ env_injector .inject_ers_envs ()
347+
283348 ers_logger : logging .Logger = get_daq_logger (
284349 logger_name = "ers_logger" ,
285350 log_level = log_level ,
@@ -294,9 +359,11 @@ def test_ers_handler_configuration(log_level: str) -> None:
294359
295360 ers_hc = LogHandlerConf (init_ers = True )
296361 ers_logger .info ("ERS Info lstdout " , extra = ers_hc .ERS )
297- ers_logger .warning ("ERS error lstdout " , extra = ers_hc .ERS )
362+ ers_logger .warning ("ERS error rich " , extra = ers_hc .ERS )
298363 ers_logger .critical ("ERS critical lstderr + rich" , extra = ers_hc .ERS )
299364
365+ env_injector .restore_original_envs ()
366+
300367
301368class AllOptionsCommand (click .Command ):
302369 """Parse the arguments passed and validate they are acceptable, otherwise print the
0 commit comments