def __getattr__(self, attr: str) -> Any: """Get an option or a new ConfigContainer with the added prefix. If we get an option which exists, we return the value for it. If we get a part of an option name, we return a new ConfigContainer. Those two never overlap as configdata.py ensures there are no shadowing options. """ if attr.startswith('_'): return self.__getattribute__(attr) name = self._join(attr) if configdata.is_valid_prefix(name): return self._with_prefix(name) with self._handle_error('getting', name): if self._configapi is None: # access from Python code return self._config.get(name) else: # access from config.py return self._config.get_mutable_obj(name, pattern=self._pattern) # If we arrived here, there was an error while getting the config option. Most # likely, someone did something like "c.content.host_blocking.lists" but # "c.content.host_blocking" doesn't actually exist. To avoid an AttributeError # which leads to a confusing error message, return another ConfigContainer so # that the chain can keep going. return self._with_prefix(name) # type: ignore[unreachable]
def __getattr__(self, attr): """Get an option or a new ConfigContainer with the added prefix. If we get an option which exists, we return the value for it. If we get a part of an option name, we return a new ConfigContainer. Those two never overlap as configdata.py ensures there are no shadowing options. """ if attr.startswith('_'): return self.__getattribute__(attr) name = self._join(attr) if configdata.is_valid_prefix(name): return ConfigContainer(config=self._config, configapi=self._configapi, prefix=name) with self._handle_error('getting', name): if self._configapi is None: # access from Python code return self._config.get(name) else: # access from config.py return self._config.get_obj(name)
def validate(self) -> None: """Make sure the configured option or prefix exists. We can't do this in __init__ as configdata isn't ready yet. """ if (self._option not in configdata.DATA and not configdata.is_valid_prefix(self._option)): raise configexc.NoOptionError(self._option)
def validate(self): """Make sure the configured option or prefix exists. We can't do this in __init__ as configdata isn't ready yet. """ if (self._option not in configdata.DATA and not configdata.is_valid_prefix(self._option)): raise configexc.NoOptionError(self._option)
def test_is_valid_prefix(monkeypatch): monkeypatch.setattr(configdata, 'DATA', ['foo.bar']) assert configdata.is_valid_prefix('foo') assert not configdata.is_valid_prefix('foo.bar') assert not configdata.is_valid_prefix('foa')