Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 26 additions & 33 deletions src/configuration.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,10 @@
logger = logging.getLogger(__name__)


class LogicError(Exception):
"""Error in application logic."""

Comment on lines +28 to +30
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Verify no remaining assert in production code (repo-wide).


🏁 Script executed:

#!/bin/bash
# Find asserts outside tests and docs.
rg -nP --type=python -g '!**/tests/**' -g '!**/doc/**' -C2 '^\s*assert\b'

Length of output: 106


Verify no remaining assert in production code (repo-wide).


🏁 Script executed:

#!/bin/bash
# Find 'assert' statements outside tests and docs.
rg -nP -g '*.py' -g '!**/tests/**' -g '!**/doc/**' -g '!**/docs/**' -C2 '^\s*assert\b'

Length of output: 1892


Remove all assert statements from production code

  • scripts/generate_openapi_schema.py (lines 31–35, 86–88): replace each assert with explicit validation and raise a specific exception (e.g. ValueError or a custom error).
  • src/app/database.py (lines 118, 122): replace type-check assert with runtime checks that raise TypeError or a domain-specific exception.


class AppConfig:
"""Singleton class to load and store the configuration."""

Expand Down Expand Up @@ -55,62 +59,54 @@ def init_from_dict(self, config_dict: dict[Any, Any]) -> None:
@property
def configuration(self) -> Configuration:
"""Return the whole configuration."""
assert (
self._configuration is not None
), "logic error: configuration is not 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."""
assert (
self._configuration is not None
), "logic error: configuration is not 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."""
assert (
self._configuration is not None
), "logic error: configuration is not 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."""
assert (
self._configuration is not None
), "logic error: configuration is not 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."""
assert (
self._configuration is not None
), "logic error: configuration is not 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."""
assert (
self._configuration is not None
), "logic error: configuration is not loaded"
if self._configuration is None:
raise LogicError("logic error: configuration is not 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"
if self._configuration is None:
raise LogicError("logic error: configuration is not loaded")

if self._configuration.authorization is None:
return AuthorizationConfiguration()
Expand All @@ -120,25 +116,22 @@ 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"
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."""
assert (
self._configuration is not None
), "logic error: configuration is not 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."""
assert (
self._configuration is not None
), "logic error: configuration is not loaded"
if self._configuration is None:
raise LogicError("logic error: configuration is not loaded")
return self._configuration.database


Expand Down
3 changes: 2 additions & 1 deletion src/models/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -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


Expand Down
30 changes: 8 additions & 22 deletions tests/unit/test_configuration.py
Original file line number Diff line number Diff line change
@@ -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


Expand Down Expand Up @@ -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


Expand Down