Source code for stdlibx.config.loaders.env
1from __future__ import annotations
2
3import os
4from typing import Any, Mapping
5
6
[docs]
7class EnvLoader:
8 def __init__(
9 self,
10 environ: Mapping[str, str] | None = None,
11 env_prefix: str = "STDLIBX_",
12 env_nested_delimiter: str = "__",
13 ) -> None:
14 self.__environ = environ
15 self.__env_prefix = env_prefix
16 self.__env_nested_delimiter = env_nested_delimiter
17
[docs]
18 def load(self) -> Mapping[str, Any]:
19 _environ = self.__environ or os.environ
20
21 _ret = {}
22 for key, value in (
23 (key.upper().strip(self.__env_prefix + "_").lower(), value)
24 for key, value in _environ.items()
25 if key.upper().startswith(self.__env_prefix)
26 ):
27 if self.__env_nested_delimiter not in key:
28 _ret[key] = value
29 else:
30 keys = key.split(self.__env_nested_delimiter)
31
32 _value = _ret
33 for _key in keys[:-1]:
34 if _key not in _value:
35 _value[_key] = {}
36 _value = _value[_key]
37 _value[keys[-1]] = value
38
39 return _ret