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