import os from logging import Logger from typing import Any, Tuple, Union from apollo_utils.core.utils.ext_enum import ExtEnum from apollo_utils.core.utils.singleton import SingleValue NO_DATA = SingleValue() LOADED_ATTRS = ("host", "apikey") LOADED_DEFAULT_ATTRS = ("schema", "timeout", "retry_count", "retry_delay") class BaseConfig: service: ExtEnum = None logger: Logger = None _loaded_attrs: Tuple = LOADED_ATTRS _loaded_default_attrs: Tuple = LOADED_DEFAULT_ATTRS _api: str = "api" _auth_name: str = "Authorization" _schema: str = "https" _timeout: int = 60 _retry_count: int = 3 _retry_delay: int = 1 def _get_names(self, item: Union[str, tuple, list, set]) -> Tuple[str, str]: if isinstance(item, str): return item, item elif isinstance(item, (tuple, list, set)) and len(item) == 2: return item def _get_attr(self, name: str) -> Any: return os.environ.get(f"{self.service.value.upper()}{self._api.upper()}_{name.upper()}", NO_DATA) def _set_attr(self, name: str, value: Any): setattr(self, f"_{name}", value) def _load_attr(self, item: Union[str, tuple, list, set], try_load_orig: bool = False): source_attr, dest_attr = self._get_names(item) v = self._get_attr(source_attr) if v is NO_DATA: if try_load_orig: v = os.environ.get(source_attr.upper(), NO_DATA) else: raise RuntimeError(f"{self.service.value}{self._api.upper()}: {source_attr.upper()} is not set.") if v is not NO_DATA: self._set_attr(dest_attr, v) def _load_attrs(self): for item in self._loaded_attrs: self._load_attr(item, try_load_orig=False) for item in self._loaded_default_attrs: self._load_attr(item, try_load_orig=True)