PK!  figga/__init__.pyimport os from pathlib import Path from inspect import isclass from configparser import ConfigParser, DEFAULTSECT from typing import Sequence, ItemsView, Union class Configuration: def __init__(self, config: dict, default=None): self._config = {key.lower(): value for key, value in config.items()} self._default = default def __getattr__(self, item: str): return self.get(item) def get(self, item: str, **kwargs): """ Retrieves a single configuration value. """ default = kwargs.get('default', self._default) value = self._config.get(item.lower(), default) if isclass(value) and issubclass(value, BaseException): raise value(f'{item} is not defined') if callable(value): return value(item) return value def items(self) -> ItemsView: """ Returns a dict containing all configuration values. """ return self._config.items() @classmethod def from_environ(cls, prefix: str, remove_prefix: bool=False, default=None) -> 'Configuration': """ Constructs a Configuration instance from a set of environment variables sharing the same prefix. Optionally, the prefix can be removed from the configuration values. """ prefix_length = len(prefix) config = { key[prefix_length:] if remove_prefix else key: value for key, value in os.environ.items() if key.startswith(prefix) } return cls(config, default=default) @classmethod def from_files(cls, files: Sequence[Union[str, os.PathLike]], section: str=DEFAULTSECT, default=None) -> 'Configuration': """ Constructs a Configuration instance from one or more INI files. """ config = ConfigParser(default_section=section) for file_path in files: file_path = Path(file_path) if not file_path.is_absolute(): file_path = Path.cwd() / file_path if file_path.exists(): config.read(file_path) config = { key: value for key, value in config[section].items() } return cls(config, default=default) @classmethod def from_file(cls, file: Union[str, os.PathLike], section: str=DEFAULTSECT, default=None) -> 'Configuration': """ Constructs a Configuration instance from a single INI file. """ return cls.from_files([file], section=section, default=default) PK!H$'qTSfigga-0.1.2.dist-info/WHEEL HM K-*ϳR03rOK-J,/R(O-)T0г3 /, (-JLR()*M IL4KM̫PK!H=_S$figga-0.1.2.dist-info/METADATAWmo6_leX4 4@1-6WHʎ:9K-Oy=s+xcV;J ^bAz%o؄YYե`Vl w0cW|! kîZ*MЕXҹfBe3Ks]gH[Uks ea:Kkm dسx;HT\JFQ_Oq4=HHӒ[+REŲ]9c6z% n{ȕ ëJ;jрNڧOsas#k"ntʍ;qBUq3y}{ (:چs&e OEW9 މړqzڨ*z)"C_Gt %7wW1q~5>ͺ 0S:uV3o6-5/;Pۄ#=[#3告ҊR2gn \bDH3n%XN-ߕt46%QEmrHYޭxqIœ6E,eL{=<RJ'WPitCvSu\:CY`h0Xَt#hLMQ"ޖ/jM-6>̢!iui@(DLH1ޠ`M(\o!3iT#L;-@CAEt[ RL,!Tt X*m$[)ⰹXL]\3%|/nET"6 ۜ܄.}!v$-ϲ}hJ0sa5 j=&1)_'f|fӔ.d ^P+y<jnʁ5.)_j iW$/I^쌼n`I=H*tx3c=33t}j _/ڦmד;ɳPouݗFbJEds #$ uAҳ &Zu FT:)ot/a,.\/"A-tЙx)N]<^  }*:\YJq)4x>]P05R?QpM4;68߭!s,n$b̬.'~)c+WFZ|2)1mڔ]w i%O&>-PK!Hϴfigga-0.1.2.dist-info/RECORDu̽R0hLF)GՄH OITBzW0 r[7c;+Uـjh6suWNStGCNOoldit/=O(}`mP-nyӘOSZ}lw#>2 IXt/E$ٺo3/g<s>.mJ8^i FPK!  figga/__init__.pyPK!H$'qTS3 figga-0.1.2.dist-info/WHEELPK!H=_S$ figga-0.1.2.dist-info/METADATAPK!Hϴfigga-0.1.2.dist-info/RECORDPK