Source code for gcip2.project_config

 1import pathlib
 2import tomllib
 3import typing
 4
 5from pydantic import BaseModel, ConfigDict, Field
 6
 7from gcip2.logging import logger as LOGGER
 8from gcip2.project_config.compose import Compose
 9from gcip2.project_config.vault_config import VaultConfig
10
11
[docs] 12class Secrets(BaseModel): 13 vault: dict[str, VaultConfig] = Field(default_factory=dict)
14 15
[docs] 16class System(BaseModel): 17 tasks_module: typing.Optional[str] = None 18 compose_path: typing.Optional[str] = None
19 20
[docs] 21class Extra(BaseModel): 22 model_config = ConfigDict(extra="allow") 23 24 secrets: Secrets = Field(default_factory=Secrets) 25 26 system: System = Field(default_factory=System) 27 28 def __getitem__(self, key: str) -> typing.Any: 29 if key == "secrets": 30 return self.secrets 31 32 if self.model_extra is None: 33 raise KeyError(key) 34 35 return self.model_extra[key] 36
[docs] 37 def get(self, key: str, default: typing.Any = None) -> typing.Any: 38 if key == "secrets": 39 return self.secrets 40 41 return (self.model_extra or {}).get(key, default)
42 43
[docs] 44class ProjectConfig(BaseModel):
[docs] 45 @classmethod 46 def from_file( 47 cls, 48 path: pathlib.Path = pathlib.Path("environment.toml"), 49 ) -> "ProjectConfig": 50 if not path.exists(): 51 LOGGER.debug("ProjectConfig is not provided: file is not exists") 52 data = {} 53 else: 54 data = tomllib.loads(path.read_text()) 55 56 _cfg = cls.model_validate(data) 57 58 compose_path = _cfg.extra.system.compose_path or "docker-compose.yml" 59 _cfg.compose = Compose.load(pathlib.Path(compose_path)) 60 61 return _cfg
62 63 compose: Compose = Field(default_factory=Compose) 64 65 extra: Extra = Field(default_factory=Extra)