Source code for concrete_settings.contrib.sources.json_source

import json

from typing import Any, Tuple, Union, Type

from concrete_settings.exceptions import ConcreteSettingsError
from concrete_settings.sources import FileSource, register_source, NotFound


[docs]@register_source class JsonSource(FileSource): extensions = ['.json', '.js'] 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): try: with open(path) as f: raw_data = f.read() return json.loads(raw_data) except FileNotFoundError as e: raise ConcreteSettingsError(f"Source file {path} was not found") from e except json.decoder.JSONDecodeError as e: raise ConcreteSettingsError(f"Error parsing JSON from {path}: {e}") from e