Source code for etcaetera.config

from collections import deque, namedtuple

from etcaetera.formatters import uppercased
from etcaetera.adapter import (
    Adapter,
    AdapterSet,
    Defaults,
    Overrides,
    Env
)


[docs]class Config(dict): def __init__(self, defaults=None, overrides=None, formatter=None, *adapters): self.formatter = formatter or uppercased self._subconfigs = {} self.adapters = AdapterSet(*adapters) if defaults is not None: self.defaults = defaults if overrides is not None: self.overrides = overrides
[docs] def register(self, *adapters): """Registers an adapter to be applied by config""" for adapter in adapters: if isinstance(adapter, Defaults): self.adapters.defaults = adapter elif isinstance(adapter, Overrides): self.adapters.overrides = adapter else: if self.adapters.overrides is not None: # If adapters contains an Overrides adapter, # insert at the index before it. self.adapters.insert(len(self.adapters) - 1, adapter) else: # Otherwise, append it self.adapters.append(adapter)
[docs] def add_subconfig(self, name, subconfig): """Attaches a sub-config to the current Config object""" if not isinstance(subconfig, Config): raise TypeError( "Subconfig has to be of Config type. " "Got {} instead".format(type(subconfig)) ) self._subconfigs[name] = subconfig setattr(self, name, subconfig)
@property def defaults(self): return self.adapters.defaults @defaults.setter
[docs] def defaults(self, value): self.adapters.defaults = value
@property def overrides(self): return self.adapters.overrides @overrides.setter
[docs] def overrides(self, value): self.adapters.overrides = value
@property def adapters(self): if not hasattr(self, '_adapters'): self._adapters = AdapterSet() return self._adapters @adapters.setter
[docs] def adapters(self, value): # Ensure adapters is a list of adapters if not isinstance(value, (list, AdapterSet)): raise TypeError("adapters value has to be a list or AdapterSet.") self._adapters = AdapterSet(*value)
[docs] def load(self): # Adapters loading for adapter in self.adapters: adapter.load(formatter=self.formatter) formatted_adapter_data = {self.formatter(k): v for k, v in adapter.data.items()} self.update(formatted_adapter_data) # Subconfigs loading for subconfig in self._subconfigs.values(): subconfig.load()

Related Topics