Standardise iteration over configration values

This commit is contained in:
Adam Turner 2023-12-29 16:15:47 +00:00
parent 134d1341dd
commit 90ebd881fa

View File

@ -254,20 +254,20 @@ class Config:
def init_values(self) -> None: def init_values(self) -> None:
config = self._raw_config config = self._raw_config
for valname, value in self.overrides.items(): for name, value in self.overrides.items():
try: try:
if '.' in valname: if '.' in name:
realvalname, key = valname.split('.', 1) real_name, key = name.split('.', 1)
config.setdefault(realvalname, {})[key] = value config.setdefault(real_name, {})[key] = value
continue continue
if valname not in self.values: if name not in self.values:
logger.warning(__('unknown config value %r in override, ignoring'), logger.warning(__('unknown config value %r in override, ignoring'),
valname) name)
continue continue
if isinstance(value, str): if isinstance(value, str):
config[valname] = self.convert_overrides(valname, value) config[name] = self.convert_overrides(name, value)
else: else:
config[valname] = value config[name] = value
except ValueError as exc: except ValueError as exc:
logger.warning("%s", exc) logger.warning("%s", exc)
for name in config: for name in config:
@ -319,7 +319,7 @@ class Config:
def filter(self, rebuild: str | Sequence[str]) -> Iterator[ConfigValue]: def filter(self, rebuild: str | Sequence[str]) -> Iterator[ConfigValue]:
if isinstance(rebuild, str): if isinstance(rebuild, str):
rebuild = [rebuild] return (value for value in self if value.rebuild == rebuild)
return (value for value in self if value.rebuild in rebuild) return (value for value in self if value.rebuild in rebuild)
def __getstate__(self) -> dict: def __getstate__(self) -> dict:
@ -478,8 +478,8 @@ def check_confval_types(app: Sphinx | None, config: Config) -> None:
"""Check all values for deviation from the default value's type, since """Check all values for deviation from the default value's type, since
that can result in TypeErrors all over the place NB. that can result in TypeErrors all over the place NB.
""" """
for confval in config: for name, (default, _rebuild, valid_types) in config.values.items():
default, rebuild, valid_types = config.values[confval.name] value = getattr(config, name)
if callable(default): if callable(default):
default = default(config) # evaluate default value default = default(config) # evaluate default value
@ -490,19 +490,19 @@ def check_confval_types(app: Sphinx | None, config: Config) -> None:
# any type of value is accepted # any type of value is accepted
pass pass
elif isinstance(valid_types, ENUM): elif isinstance(valid_types, ENUM):
if not valid_types.match(confval.value): if not valid_types.match(value):
msg = __("The config value `{name}` has to be a one of {candidates}, " msg = __("The config value `{name}` has to be a one of {candidates}, "
"but `{current}` is given.") "but `{current}` is given.")
logger.warning(msg.format(name=confval.name, logger.warning(msg.format(name=name,
current=confval.value, current=value,
candidates=valid_types.candidates), once=True) candidates=valid_types.candidates), once=True)
else: else:
if type(confval.value) is type(default): if type(value) is type(default):
continue continue
if type(confval.value) in valid_types: if type(value) in valid_types:
continue continue
common_bases = (set(type(confval.value).__bases__ + (type(confval.value),)) & common_bases = (set(type(value).__bases__ + (type(value),)) &
set(type(default).__bases__)) set(type(default).__bases__))
common_bases.discard(object) common_bases.discard(object)
if common_bases: if common_bases:
@ -517,14 +517,14 @@ def check_confval_types(app: Sphinx | None, config: Config) -> None:
+ f", or {wrapped_valid_types[-1]}") + f", or {wrapped_valid_types[-1]}")
else: else:
permitted = " or ".join(wrapped_valid_types) permitted = " or ".join(wrapped_valid_types)
logger.warning(msg.format(name=confval.name, logger.warning(msg.format(name=name,
current=type(confval.value), current=type(value),
permitted=permitted), once=True) permitted=permitted), once=True)
else: else:
msg = __("The config value `{name}' has type `{current.__name__}', " msg = __("The config value `{name}' has type `{current.__name__}', "
"defaults to `{default.__name__}'.") "defaults to `{default.__name__}'.")
logger.warning(msg.format(name=confval.name, logger.warning(msg.format(name=name,
current=type(confval.value), current=type(value),
default=type(default)), once=True) default=type(default)), once=True)