Source code for concrete_settings.contrib.sources.python_source

import importlib.util
from pathlib import Path
from typing import Any, Tuple, Union, Type

from concrete_settings.sources import FileSource, register_source, NotFound


[docs]@register_source class PythonSource(FileSource): extensions = ['.py'] def __init__(self, path): super().__init__(path) self._data = None def read(self, setting, parents: Tuple[str, ...] = ()) -> Union[Type[NotFound], Any]: if self._data is None: self._data = self._read_file(self.path) d = self._data for key in parents: d = d[key] val = d.get(setting.name, NotFound) return val @staticmethod def _read_file(path: str): module_name = Path(path).stem spec = importlib.util.spec_from_file_location(module_name, path) module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) # type: ignore return vars(module)