From 06e4c6bb410f0bc36fdf1def3d0f22fd4f60966d Mon Sep 17 00:00:00 2001 From: Pavel Tisnovsky Date: Thu, 28 Aug 2025 10:03:54 +0200 Subject: [PATCH 1/3] Remove assert from config model --- src/models/config.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/models/config.py b/src/models/config.py index 0516c661..de6cc3e2 100644 --- a/src/models/config.py +++ b/src/models/config.py @@ -372,7 +372,8 @@ def jwk_configuration(self) -> JwkConfiguration: raise ValueError( "JWK configuration is only available for JWK token authentication module" ) - assert self.jwk_config is not None, "JWK configuration should not be None" + if self.jwk_config is None: + raise ValueError("JWK configuration should not be None") return self.jwk_config From de92847207da47b2a555f9f95d942f78db9935bd Mon Sep 17 00:00:00 2001 From: Pavel Tisnovsky Date: Thu, 28 Aug 2025 10:15:11 +0200 Subject: [PATCH 2/3] Remove asserts from configuration.py --- src/configuration.py | 54 +++++++++++++++++--------------------------- 1 file changed, 21 insertions(+), 33 deletions(-) diff --git a/src/configuration.py b/src/configuration.py index 8c318454..8646541e 100644 --- a/src/configuration.py +++ b/src/configuration.py @@ -25,6 +25,10 @@ logger = logging.getLogger(__name__) +class LogicError(Exception): + """Error in application logic.""" + + class AppConfig: """Singleton class to load and store the configuration.""" @@ -52,65 +56,55 @@ def init_from_dict(self, config_dict: dict[Any, Any]) -> None: """Initialize configuration from a dictionary.""" self._configuration = Configuration(**config_dict) + def check_configuration_loaded(self): + """Check that configuration is loaded, raise exception instead.""" + if self._configuration is None: + raise LogicError("logic error: configuration is not loaded") + @property def configuration(self) -> Configuration: """Return the whole configuration.""" - assert ( - self._configuration is not None - ), "logic error: configuration is not loaded" + self.check_configuration_loaded() return self._configuration @property def service_configuration(self) -> ServiceConfiguration: """Return service configuration.""" - assert ( - self._configuration is not None - ), "logic error: configuration is not loaded" + self.check_configuration_loaded() return self._configuration.service @property def llama_stack_configuration(self) -> LlamaStackConfiguration: """Return Llama stack configuration.""" - assert ( - self._configuration is not None - ), "logic error: configuration is not loaded" + self.check_configuration_loaded() return self._configuration.llama_stack @property def user_data_collection_configuration(self) -> UserDataCollection: """Return user data collection configuration.""" - assert ( - self._configuration is not None - ), "logic error: configuration is not loaded" + self.check_configuration_loaded() return self._configuration.user_data_collection @property def mcp_servers(self) -> list[ModelContextProtocolServer]: """Return model context protocol servers configuration.""" - assert ( - self._configuration is not None - ), "logic error: configuration is not loaded" + self.check_configuration_loaded() return self._configuration.mcp_servers @property def authentication_configuration(self) -> AuthenticationConfiguration: """Return authentication configuration.""" - assert ( - self._configuration is not None - ), "logic error: configuration is not loaded" + self.check_configuration_loaded() - assert ( - self._configuration.authentication is not None - ), "logic error: authentication configuration is not loaded" + if self._configuration.authentication is None: + raise LogicError("logic error: authentication configuration is not loaded") return self._configuration.authentication @property def authorization_configuration(self) -> AuthorizationConfiguration: """Return authorization configuration or default no-op configuration.""" - assert ( - self._configuration is not None - ), "logic error: configuration is not loaded" + self.check_configuration_loaded() if self._configuration.authorization is None: return AuthorizationConfiguration() @@ -120,25 +114,19 @@ def authorization_configuration(self) -> AuthorizationConfiguration: @property def customization(self) -> Optional[Customization]: """Return customization configuration.""" - assert ( - self._configuration is not None - ), "logic error: configuration is not loaded" + self.check_configuration_loaded() return self._configuration.customization @property def inference(self) -> InferenceConfiguration: """Return inference configuration.""" - assert ( - self._configuration is not None - ), "logic error: configuration is not loaded" + self.check_configuration_loaded() return self._configuration.inference @property def database_configuration(self) -> DatabaseConfiguration: """Return database configuration.""" - assert ( - self._configuration is not None - ), "logic error: configuration is not loaded" + self.check_configuration_loaded() return self._configuration.database From c4a8c833e9a050780559fdbc5a1300d2cf642f6a Mon Sep 17 00:00:00 2001 From: Pavel Tisnovsky Date: Thu, 28 Aug 2025 10:15:25 +0200 Subject: [PATCH 3/3] Upated unit tests accordingly --- src/configuration.py | 35 ++++++++++++++++++-------------- tests/unit/test_configuration.py | 30 ++++++++------------------- 2 files changed, 28 insertions(+), 37 deletions(-) diff --git a/src/configuration.py b/src/configuration.py index 8646541e..f70fe820 100644 --- a/src/configuration.py +++ b/src/configuration.py @@ -56,45 +56,46 @@ def init_from_dict(self, config_dict: dict[Any, Any]) -> None: """Initialize configuration from a dictionary.""" self._configuration = Configuration(**config_dict) - def check_configuration_loaded(self): - """Check that configuration is loaded, raise exception instead.""" - if self._configuration is None: - raise LogicError("logic error: configuration is not loaded") - @property def configuration(self) -> Configuration: """Return the whole configuration.""" - self.check_configuration_loaded() + if self._configuration is None: + raise LogicError("logic error: configuration is not loaded") return self._configuration @property def service_configuration(self) -> ServiceConfiguration: """Return service configuration.""" - self.check_configuration_loaded() + if self._configuration is None: + raise LogicError("logic error: configuration is not loaded") return self._configuration.service @property def llama_stack_configuration(self) -> LlamaStackConfiguration: """Return Llama stack configuration.""" - self.check_configuration_loaded() + if self._configuration is None: + raise LogicError("logic error: configuration is not loaded") return self._configuration.llama_stack @property def user_data_collection_configuration(self) -> UserDataCollection: """Return user data collection configuration.""" - self.check_configuration_loaded() + if self._configuration is None: + raise LogicError("logic error: configuration is not loaded") return self._configuration.user_data_collection @property def mcp_servers(self) -> list[ModelContextProtocolServer]: """Return model context protocol servers configuration.""" - self.check_configuration_loaded() + if self._configuration is None: + raise LogicError("logic error: configuration is not loaded") return self._configuration.mcp_servers @property def authentication_configuration(self) -> AuthenticationConfiguration: """Return authentication configuration.""" - self.check_configuration_loaded() + if self._configuration is None: + raise LogicError("logic error: configuration is not loaded") if self._configuration.authentication is None: raise LogicError("logic error: authentication configuration is not loaded") @@ -104,7 +105,8 @@ def authentication_configuration(self) -> AuthenticationConfiguration: @property def authorization_configuration(self) -> AuthorizationConfiguration: """Return authorization configuration or default no-op configuration.""" - self.check_configuration_loaded() + if self._configuration is None: + raise LogicError("logic error: configuration is not loaded") if self._configuration.authorization is None: return AuthorizationConfiguration() @@ -114,19 +116,22 @@ def authorization_configuration(self) -> AuthorizationConfiguration: @property def customization(self) -> Optional[Customization]: """Return customization configuration.""" - self.check_configuration_loaded() + if self._configuration is None: + raise LogicError("logic error: configuration is not loaded") return self._configuration.customization @property def inference(self) -> InferenceConfiguration: """Return inference configuration.""" - self.check_configuration_loaded() + if self._configuration is None: + raise LogicError("logic error: configuration is not loaded") return self._configuration.inference @property def database_configuration(self) -> DatabaseConfiguration: """Return database configuration.""" - self.check_configuration_loaded() + if self._configuration is None: + raise LogicError("logic error: configuration is not loaded") return self._configuration.database diff --git a/tests/unit/test_configuration.py b/tests/unit/test_configuration.py index 22d84783..4bed5664 100644 --- a/tests/unit/test_configuration.py +++ b/tests/unit/test_configuration.py @@ -1,7 +1,7 @@ """Unit tests for functions defined in src/configuration.py.""" import pytest -from configuration import AppConfig +from configuration import AppConfig, LogicError from models.config import ModelContextProtocolServer @@ -290,63 +290,49 @@ def test_mcp_servers_property_with_servers() -> None: def test_configuration_not_loaded(): """Test that accessing configuration before loading raises an error.""" cfg = AppConfig() - with pytest.raises( - AssertionError, match="logic error: configuration is not loaded" - ): + with pytest.raises(LogicError, match="logic error: configuration is not loaded"): cfg.configuration # pylint: disable=pointless-statement def test_service_configuration_not_loaded(): """Test that accessing service_configuration before loading raises an error.""" cfg = AppConfig() - with pytest.raises( - AssertionError, match="logic error: configuration is not loaded" - ): + with pytest.raises(LogicError, match="logic error: configuration is not loaded"): cfg.service_configuration # pylint: disable=pointless-statement def test_llama_stack_configuration_not_loaded(): """Test that accessing llama_stack_configuration before loading raises an error.""" cfg = AppConfig() - with pytest.raises( - AssertionError, match="logic error: configuration is not loaded" - ): + with pytest.raises(LogicError, match="logic error: configuration is not loaded"): cfg.llama_stack_configuration # pylint: disable=pointless-statement def test_user_data_collection_configuration_not_loaded(): """Test that accessing user_data_collection_configuration before loading raises an error.""" cfg = AppConfig() - with pytest.raises( - AssertionError, match="logic error: configuration is not loaded" - ): + with pytest.raises(LogicError, match="logic error: configuration is not loaded"): cfg.user_data_collection_configuration # pylint: disable=pointless-statement def test_mcp_servers_not_loaded(): """Test that accessing mcp_servers before loading raises an error.""" cfg = AppConfig() - with pytest.raises( - AssertionError, match="logic error: configuration is not loaded" - ): + with pytest.raises(LogicError, match="logic error: configuration is not loaded"): cfg.mcp_servers # pylint: disable=pointless-statement def test_authentication_configuration_not_loaded(): """Test that accessing authentication_configuration before loading raises an error.""" cfg = AppConfig() - with pytest.raises( - AssertionError, match="logic error: configuration is not loaded" - ): + with pytest.raises(LogicError, match="logic error: configuration is not loaded"): cfg.authentication_configuration # pylint: disable=pointless-statement def test_customization_not_loaded(): """Test that accessing customization before loading raises an error.""" cfg = AppConfig() - with pytest.raises( - AssertionError, match="logic error: configuration is not loaded" - ): + with pytest.raises(LogicError, match="logic error: configuration is not loaded"): cfg.customization # pylint: disable=pointless-statement