Coverage for src/configuraptor/loaders/__init__.py: 100%
17 statements
« prev ^ index » next coverage.py v7.6.10, created at 2025-01-09 20:07 +0100
« prev ^ index » next coverage.py v7.6.10, created at 2025-01-09 20:07 +0100
1"""
2Loads loaders based on Python version.
3"""
5import typing
7# tomli used for every Python version now.
8from .loaders_shared import dotenv, ini, json, toml, yaml
9from .register import LOADERS, T_loader, register_loader
12@typing.overload
13def get(extension: str, default: T_loader) -> T_loader:
14 """
15 When setting a loader function as default, a loader will always be returned.
16 """
19@typing.overload
20def get(extension: str, default: None) -> T_loader | None:
21 """
22 When setting None as the default, either a loader or none will be returned.
23 """
26@typing.overload
27def get(extension: str, default: typing.Type[Exception] = ValueError) -> T_loader:
28 """
29 When not setting a default, a loader will be returned or an exception will be thrown.
30 """
33def get(extension: str, default: T_loader | None | typing.Type[Exception] = ValueError) -> T_loader | None:
34 """
35 Get the right loader for a specific extension.
36 """
37 extension = extension.removeprefix(".")
39 if loader := LOADERS.get(extension):
40 return loader
41 elif default and isinstance(default, type) and issubclass(default, Exception):
42 raise default(f"Invalid extension {extension}")
43 else:
44 # can't be an exeption because the above clause makes sure of that. So tell mypy with cast:
45 return typing.cast(typing.Optional[T_loader], default)
48__all__ = ["get", "toml", "json", "yaml", "dotenv", "ini", "register_loader"]