Source code for cfglib.sources.args

from collections import abc as collections_abc
from typing import *

from ..config import ConfigProjection, ProjectedConfig, ProxyConfig
from ..spec import MISSING


# pylint: disable=too-many-ancestors
[docs]class ArgsNamespaceConfig(ProjectedConfig): """A config that takes its contents from the environment.""" def __init__( self, args: object, uppercase: bool = False, relevant_keys: Optional[Iterable[str]] = None, ): projection = ArgsNamespaceConfigProjection(uppercase, relevant_keys) args_data = {k: v for k, v in args.__dict__.items() if v is not MISSING} super().__init__(ProxyConfig(args_data), projection)
class _Universe(collections_abc.Container): def __contains__(self, item): return True
[docs]class ArgsNamespaceConfigProjection(ConfigProjection): """A commonly used projection for cmdline args variables: filter and optionally uppercase keys. """ def __init__( self, uppercase: bool = False, relevant_keys: Optional[Iterable[str]] = None, ): self.uppercase = uppercase self.relevant_keys: Container = ( frozenset(relevant_keys) if relevant_keys is not None else _Universe() )
[docs] def is_relevant_key(self, key: str) -> bool: if self.uppercase and not key.isupper(): return False return self.is_relevant_sourcekey(self.key_to_sourcekey(key))
[docs] def is_relevant_sourcekey(self, sourcekey: str) -> bool: if self.uppercase and not sourcekey.islower(): return False return sourcekey in self.relevant_keys
[docs] def key_to_sourcekey(self, key: str) -> str: if self.uppercase: key = key.lower() return key
[docs] def sourcekey_to_key(self, sourcekey: str) -> str: if self.uppercase: sourcekey = sourcekey.upper() return sourcekey