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