Source code for byoc.configs.attrs

#!/usr/bin/env python3

from .. import model
from ..model import _is_selected_by_cls
from ..errors import NoValueFound, Log
from operator import attrgetter

class config_attr:

[docs] def __init__(self, config_cls=None, *, getter=None): self.config_cls = config_cls self.getter = getter
[docs] def __set_name__(self, cls, name): self.name = name
[docs] def __get__(self, obj, cls=None): model.init(obj) configs = [x.config for x in model.get_wrapped_configs(obj)] getter = self.getter or attrgetter(self.name) log = Log() log += f"getting '{self.name}' config_attr for {obj!r}" for config in configs: if not _is_selected_by_cls(config, self.config_cls): log += f"skipped {config}: not derived from {self.config_cls.__name__}" continue try: return getter(config) except AttributeError as err: log += ( f"skipped {config}: {getter} raised {err.__class__.__name__}: {err}" if self.getter else f"skipped {config}: {err}" ) continue raise NoValueFound("can't find config attribute", log)