json.py 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. """JSON file settings source."""
  2. from __future__ import annotations as _annotations
  3. import json
  4. from pathlib import Path
  5. from typing import (
  6. TYPE_CHECKING,
  7. Any,
  8. )
  9. from ..base import ConfigFileSourceMixin, InitSettingsSource
  10. from ..types import DEFAULT_PATH, PathType
  11. if TYPE_CHECKING:
  12. from pydantic_settings.main import BaseSettings
  13. class JsonConfigSettingsSource(InitSettingsSource, ConfigFileSourceMixin):
  14. """
  15. A source class that loads variables from a JSON file
  16. """
  17. def __init__(
  18. self,
  19. settings_cls: type[BaseSettings],
  20. json_file: PathType | None = DEFAULT_PATH,
  21. json_file_encoding: str | None = None,
  22. ):
  23. self.json_file_path = json_file if json_file != DEFAULT_PATH else settings_cls.model_config.get('json_file')
  24. self.json_file_encoding = (
  25. json_file_encoding
  26. if json_file_encoding is not None
  27. else settings_cls.model_config.get('json_file_encoding')
  28. )
  29. self.json_data = self._read_files(self.json_file_path)
  30. super().__init__(settings_cls, self.json_data)
  31. def _read_file(self, file_path: Path) -> dict[str, Any]:
  32. with open(file_path, encoding=self.json_file_encoding) as json_file:
  33. return json.load(json_file)
  34. def __repr__(self) -> str:
  35. return f'{self.__class__.__name__}(json_file={self.json_file_path})'
  36. __all__ = ['JsonConfigSettingsSource']