Base_configuration

This module contains functionality related to the the base_configuration module for core.

Base_configuration

BaseConfiguration

Bases: BaseModel, ABC

Base abstract class for all configuration models.

Provides common functionality like hashing for configuration objects. Extend this class to create specific configuration types.

Source code in src/core/base_configuration.py
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
class BaseConfiguration(BaseModel, ABC):
    """
    Base abstract class for all configuration models.

    Provides common functionality like hashing for configuration objects.
    Extend this class to create specific configuration types.
    """

    def __hash__(self) -> int:
        """Not the most efficient way of hashing, but it works for now."""
        json = self.model_dump_json()
        return hash(json)

    @classmethod
    def _validate(
        cls,
        value: Any,
        info: ValidationInfo,
        registry: Type[ConfigurationRegistry],
    ) -> Any:
        """
        Validates the value against the type defined in the registry.

        Args:
            value (Any): The value of the field.
            info (ValidationInfo): The information about the field.
            registry (Type[ConfigurationRegistry]): The registry to use for validation.

        Returns:
            Any: The validated value.
        """
        type_adapter = TypeAdapter(registry.get_union_type())
        return type_adapter.validate_python(
            value,
            context=info.context,
        )

__hash__()

Not the most efficient way of hashing, but it works for now.

Source code in src/core/base_configuration.py
29
30
31
32
def __hash__(self) -> int:
    """Not the most efficient way of hashing, but it works for now."""
    json = self.model_dump_json()
    return hash(json)

BaseConfigurationWithSecrets

Bases: BaseConfiguration

Abstract model for configuration's secrets handling.

Provides functionality to automatically load and validate secrets from environment variables or files. Extending class has to implement secrets field with corresponding type.

Source code in src/core/base_configuration.py
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
class BaseConfigurationWithSecrets(BaseConfiguration):
    """
    Abstract model for configuration's secrets handling.

    Provides functionality to automatically load and validate secrets from
    environment variables or files. Extending class has to implement `secrets`
    field with corresponding type.
    """

    secrets: BaseSecrets = Field(
        None,
        description="`BaseSecrets` is meant for the the configuration that does not require secrets."
        "In other case `BaseSecrets` should be replaced with the corresponding secrets class.",
    )

    def model_post_init(self, context: Any) -> None:
        """
        Function is invoked after the model is initialized. It is used to initialize secrets.

        Args:
            context (Any): The context passed to the pydantic model, must contain 'secrets_file' key.
        """
        self.secrets = self._get_secrets(secrets_file=context["secrets_file"])

    def _get_secrets(self, secrets_file: str) -> BaseSettings:
        """
        Function to initialize secrets from the specified file.

        Args:
            secrets_file (str): The path to the secrets file.

        Returns:
            BaseSettings: The initialized secrets object.

        Raises:
            ValueError: If secrets are not found or cannot be loaded.
        """
        secrets_class = self.model_fields["secrets"].annotation
        secrets = secrets_class(_env_file=secrets_file)
        if secrets is None:
            raise ValueError(f"Secrets for {self.name} not found.")
        return secrets

model_post_init(context)

Function is invoked after the model is initialized. It is used to initialize secrets.

Parameters:
  • context (Any) –

    The context passed to the pydantic model, must contain 'secrets_file' key.

Source code in src/core/base_configuration.py
88
89
90
91
92
93
94
95
def model_post_init(self, context: Any) -> None:
    """
    Function is invoked after the model is initialized. It is used to initialize secrets.

    Args:
        context (Any): The context passed to the pydantic model, must contain 'secrets_file' key.
    """
    self.secrets = self._get_secrets(secrets_file=context["secrets_file"])

BaseSecrets

Bases: BaseConfiguration, BaseSettings

Base class for secrets management.

Extends both BaseConfiguration and BaseSettings to handle sensitive configuration data like API keys, passwords, etc. Uses Pydantic's BaseSettings for environment variable and file-based loading.

Source code in src/core/base_configuration.py
59
60
61
62
63
64
65
66
67
68
69
70
class BaseSecrets(BaseConfiguration, BaseSettings):
    """
    Base class for secrets management.

    Extends both BaseConfiguration and BaseSettings to handle sensitive configuration
    data like API keys, passwords, etc. Uses Pydantic's BaseSettings for environment
    variable and file-based loading.
    """

    model_config = ConfigDict(
        extra="ignore",
    )

BasicConfiguration

Bases: BaseConfiguration

Standard configuration class with metadata support.

Includes a metadata field for storing application-specific settings.

Source code in src/core/base_configuration.py
248
249
250
251
252
253
254
255
256
257
class BasicConfiguration(BaseConfiguration):
    """
    Standard configuration class with metadata support.

    Includes a metadata field for storing application-specific settings.
    """

    metadata: Optional[MetadataConfiguration] = Field(
        None, description="Metadata of the run."
    )

EnvironmentName

Bases: str, Enum

Enumeration of available environments.

Defines the possible runtime environments for the application.

Source code in src/core/base_configuration.py
137
138
139
140
141
142
143
144
145
146
147
148
class EnvironmentName(str, Enum):
    """
    Enumeration of available environments.

    Defines the possible runtime environments for the application.
    """

    DEFAULT = "default"
    LOCAL = "local"
    DEV = "dev"
    TEST = "test"
    PROD = "prod"

LogLevelName

Bases: str, Enum

Enumeration of available logging levels.

Provides a mapping between string log levels and their corresponding logging constants.

Source code in src/core/base_configuration.py
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
class LogLevelName(str, Enum):
    """
    Enumeration of available logging levels.

    Provides a mapping between string log levels and their corresponding
    logging constants.
    """

    DEBUG = "debug"
    INFO = "info"
    WARNING = "warning"
    ERROR = "error"
    CRITICAL = "critical"

    @property
    def value_as_int(self) -> int:
        """Convert string log level to the corresponding logging constant."""
        return logging._nameToLevel[self.value.upper()]

value_as_int property

Convert string log level to the corresponding logging constant.

MetadataConfiguration

Bases: BaseConfiguration

Configuration for application metadata. Fields are read from the command line arguments.

Source code in src/core/base_configuration.py
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
class MetadataConfiguration(BaseConfiguration):
    """
    Configuration for application metadata. Fields are read from the command line arguments.
    """

    environment: EnvironmentName = Field(
        EnvironmentName.LOCAL,
        description="The environment of the application.",
    )
    build_name: Optional[str] = Field(
        None,
        description="The name of the build.",
    )
    log_level: LogLevelName = Field(
        LogLevelName.INFO, description="The log level of the application."
    )
    on_prem_config: bool = Field(
        False,
        description="If set, then the configuration will be read from on premise configuration."
        "Otherwise from the orchestrator service.",
    )

    @model_validator(mode="before")
    @classmethod
    def validate_from_args(cls, data: dict) -> dict:
        """
        Validate configuration data from command-line arguments.

        Parses known arguments and validates them against the model fields.

        Args:
            data (dict): The configuration data.

        Returns:
            dict: The validated configuration data.
        """
        parser = cls._get_parser()
        args, _ = parser.parse_known_args()
        return cls._get_data(data=data, args=args)

    @classmethod
    def _get_data(cls, data: dict, args: argparse.Namespace) -> dict:
        """
        Function to parse the arguments.

        Returns:
            argparse.Namespace: The parsed arguments.
        """
        if args.env:
            data["environment"] = EnvironmentName(args.env)
        if args.build_name:
            data["build_name"] = args.build_name
        if args.on_prem_config:
            data["on_prem_config"] = args.on_prem_config
        if args.log_level:
            data["log_level"] = args.log_level

        return data

    @classmethod
    def _get_parser(cls) -> argparse.ArgumentParser:
        """
        Function to initialize the argument parser to read arguments from command line.

        Returns:
            argparse.ArgumentParser: The argument parser.
        """
        parser = argparse.ArgumentParser()
        parser.add_argument(
            "--env",
            type=EnvironmentName,
            help="Runtime environment.",
            default=EnvironmentName.LOCAL,
            choices=[env.value for env in EnvironmentName],
        )
        parser.add_argument(
            "--build-name",
            type=str,
            help="The name of the build.",
            default=f"build-local-{time.time()}",
        )
        parser.add_argument(
            "--on-prem-config",
            help="If set, then the configuration will be read from on premise configuration."
            "Otherwise from the orchestrator service.",
            action="store_true",
        )
        parser.add_argument(
            "--log-level",
            type=LogLevelName,
            help="Log level.",
            default=LogLevelName.INFO,
            choices=[level.value for level in LogLevelName],
        )
        return parser

validate_from_args(data) classmethod

Validate configuration data from command-line arguments.

Parses known arguments and validates them against the model fields.

Parameters:
  • data (dict) –

    The configuration data.

Returns:
  • dict( dict ) –

    The validated configuration data.

Source code in src/core/base_configuration.py
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
@model_validator(mode="before")
@classmethod
def validate_from_args(cls, data: dict) -> dict:
    """
    Validate configuration data from command-line arguments.

    Parses known arguments and validates them against the model fields.

    Args:
        data (dict): The configuration data.

    Returns:
        dict: The validated configuration data.
    """
    parser = cls._get_parser()
    args, _ = parser.parse_known_args()
    return cls._get_data(data=data, args=args)