Source code for varlord.sources.toml
"""
TOML source.
Loads configuration from TOML files.
Only loads keys that map to fields defined in the model.
"""
from __future__ import annotations
import sys
from typing import Any, Optional, Type
try:
if sys.version_info >= (3, 11):
import tomllib
else:
import tomli as tomllib
except ImportError:
tomllib = None # type: ignore
from varlord.sources.file_base import FileSource
[docs]
class TOML(FileSource):
"""Source that loads configuration from TOML files.
Requires the 'toml' extra for Python < 3.11: pip install varlord[toml]
Python 3.11+ has built-in tomllib support.
Only loads keys that map to fields defined in the model.
Model is required and will be auto-injected by Config.
Example:
>>> @dataclass
... class Config:
... host: str = field()
>>> # config.toml: host = "0.0.0.0"
>>> source = TOML("config.toml", model=Config)
>>> source.load()
{'host': '0.0.0.0'}
"""
[docs]
def __init__(
self,
file_path: str,
model: Optional[Type[Any]] = None,
source_id: Optional[str] = None,
required: bool = False,
):
"""Initialize TOML source.
Args:
file_path: Path to TOML file
model: Optional model for field filtering
source_id: Optional unique identifier (default: auto-generated from path)
required: If True, raise error when file not found
Raises:
ImportError: If tomli is not installed (Python < 3.11)
"""
if tomllib is None:
raise ImportError(
"tomli is required for TOML source (Python < 3.11). "
"Install it with: pip install varlord[toml]"
)
super().__init__(file_path, model=model, source_id=source_id, required=required)
@property
def name(self) -> str:
"""Return source name."""
return "toml"
def _load_file_content(self) -> Any:
"""Load and parse TOML file.
Returns:
Parsed TOML content (dict)
Raises:
FileNotFoundError: If file not found
tomllib.TOMLDecodeError: If TOML is invalid
"""
with open(self._file_path, "rb") as f:
return tomllib.load(f) or {}