diff --git a/packages/data-designer-config/src/data_designer/logging.py b/packages/data-designer-config/src/data_designer/logging.py index 3a280eae7..a514e770d 100644 --- a/packages/data-designer-config/src/data_designer/logging.py +++ b/packages/data-designer-config/src/data_designer/logging.py @@ -114,7 +114,11 @@ def working() -> str: return random.choice(["⚙️", "🔧", "🔨", "⚒️", "🛠️", "💼", "👷", "🏗️", "🪛", "👨‍💻"]) +_configured = False + + def configure_logging(config: LoggingConfig | None = None) -> None: + global _configured config = config or LoggingConfig.default() root_logger = logging.getLogger() @@ -137,6 +141,8 @@ def configure_logging(config: LoggingConfig | None = None) -> None: for name in config.to_silence: quiet_noisy_logger(name) + _configured = True + def quiet_noisy_logger(name: str) -> None: logger = logging.getLogger(name) diff --git a/packages/data-designer-config/tests/test_logging.py b/packages/data-designer-config/tests/test_logging.py index e52c0f1e1..2eaa9d6a2 100644 --- a/packages/data-designer-config/tests/test_logging.py +++ b/packages/data-designer-config/tests/test_logging.py @@ -17,6 +17,14 @@ quiet_noisy_logger, ) +import data_designer.logging as _logging_mod + +@pytest.fixture(autouse=True) +def reset_configured_flag(): + original = _logging_mod._configured + yield + _logging_mod._configured = original + @pytest.fixture def stub_default_logging_config(): diff --git a/packages/data-designer/src/data_designer/interface/data_designer.py b/packages/data-designer/src/data_designer/interface/data_designer.py index 58dcb3f8b..be7979175 100644 --- a/packages/data-designer/src/data_designer/interface/data_designer.py +++ b/packages/data-designer/src/data_designer/interface/data_designer.py @@ -77,7 +77,9 @@ def _initialize_interface_runtime() -> None: global _interface_runtime_initialized if _interface_runtime_initialized: return - configure_logging() + from data_designer import logging as _logging_mod + if not _logging_mod._configured: + configure_logging() resolve_seed_default_model_settings() _interface_runtime_initialized = True diff --git a/packages/data-designer/tests/interface/test_data_designer.py b/packages/data-designer/tests/interface/test_data_designer.py index f3a517383..c6eb83236 100644 --- a/packages/data-designer/tests/interface/test_data_designer.py +++ b/packages/data-designer/tests/interface/test_data_designer.py @@ -455,6 +455,9 @@ def test_validate_raises_error_when_seed_collides( def test_initialize_interface_runtime_runs_once(monkeypatch: pytest.MonkeyPatch) -> None: """_initialize_interface_runtime only runs initialization once.""" monkeypatch.setattr(dd_mod, "_interface_runtime_initialized", False) + + from data_designer import logging as _logging_mod + monkeypatch.setattr(_logging_mod, "_configured", False) with ( patch("data_designer.interface.data_designer.configure_logging") as mock_logging, @@ -464,3 +467,19 @@ def test_initialize_interface_runtime_runs_once(monkeypatch: pytest.MonkeyPatch) dd_mod._initialize_interface_runtime() mock_logging.assert_called_once() mock_resolve.assert_called_once() + + +def test_initialize_interface_runtime_skips_logging_if_already_configured(monkeypatch: pytest.MonkeyPatch) -> None: + """_initialize_interface_runtime skips logging config if user already configured it.""" + monkeypatch.setattr(dd_mod, "_interface_runtime_initialized", False) + + from data_designer import logging as _logging_mod + monkeypatch.setattr(_logging_mod, "_configured", True) + + with ( + patch("data_designer.interface.data_designer.configure_logging") as mock_logging, + patch("data_designer.interface.data_designer.resolve_seed_default_model_settings") as mock_resolve, + ): + dd_mod._initialize_interface_runtime() + mock_logging.assert_not_called() + mock_resolve.assert_called_once()