disallow no values in configuration

This option could lead to missing warnings about missing or invalid
configuration values because code usually expects that values are exists
and not empty unless it is explicitly specified.

However, pacman configuration still requires this option in order to be
able to deal with boolean values
This commit is contained in:
Evgenii Alekseev 2022-10-18 02:13:01 +03:00
parent a5ce6b78dd
commit f2ddcc6d23
6 changed files with 16 additions and 10 deletions

View File

@ -133,7 +133,9 @@ class Setup(Handler):
repository(str): repository name repository(str): repository name
paths(RepositoryPaths): repository paths instance paths(RepositoryPaths): repository paths instance
""" """
configuration = Configuration() # allow_no_value=True is required because pacman uses boolean configuration in which just keys present
# (e.g. NoProgressBar) which will lead to exception
configuration = Configuration(allow_no_value=True)
# preserve case # preserve case
# stupid mypy thinks that it is impossible # stupid mypy thinks that it is impossible
configuration.optionxform = lambda key: key # type: ignore configuration.optionxform = lambda key: key # type: ignore

View File

@ -70,11 +70,15 @@ class Configuration(configparser.RawConfigParser):
ARCHITECTURE_SPECIFIC_SECTIONS = ["build", "sign", "web"] ARCHITECTURE_SPECIFIC_SECTIONS = ["build", "sign", "web"]
SYSTEM_CONFIGURATION_PATH = Path(sys.prefix) / "share" / "ahriman" / "settings" / "ahriman.ini" SYSTEM_CONFIGURATION_PATH = Path(sys.prefix) / "share" / "ahriman" / "settings" / "ahriman.ini"
def __init__(self) -> None: def __init__(self, allow_no_value: bool = False) -> None:
""" """
default constructor. In the most cases must not be called directly default constructor. In the most cases must not be called directly
Args:
allow_no_value(bool): copies ``configparser.RawConfigParser`` behaviour. In case if it is set to ``True``,
the keys without values will be allowed
""" """
configparser.RawConfigParser.__init__(self, allow_no_value=True, converters={ configparser.RawConfigParser.__init__(self, allow_no_value=allow_no_value, converters={
"list": self.__convert_list, "list": self.__convert_list,
"path": self.__convert_path, "path": self.__convert_path,
}) })

View File

@ -43,7 +43,7 @@ class ReportTrigger(Trigger):
configuration(Configuration): configuration instance configuration(Configuration): configuration instance
""" """
Trigger.__init__(self, architecture, configuration) Trigger.__init__(self, architecture, configuration)
self.targets = configuration.getlist("report", "target") self.targets = configuration.getlist("report", "target", fallback=[])
def on_result(self, result: Result, packages: Iterable[Package]) -> None: def on_result(self, result: Result, packages: Iterable[Package]) -> None:
""" """

View File

@ -97,7 +97,7 @@ class GPG(LazyLogging):
Tuple[Set[SignSettings], Optional[str]]: tuple of sign targets and default PGP key Tuple[Set[SignSettings], Optional[str]]: tuple of sign targets and default PGP key
""" """
targets: Set[SignSettings] = set() targets: Set[SignSettings] = set()
for option in configuration.getlist("sign", "target"): for option in configuration.getlist("sign", "target", fallback=[]):
target = SignSettings.from_option(option) target = SignSettings.from_option(option)
if target == SignSettings.Disabled: if target == SignSettings.Disabled:
continue continue

View File

@ -33,7 +33,7 @@ class HttpUpload(Upload):
helper for the http based uploads helper for the http based uploads
Attributes: Attributes:
auth(Tuple[str, str]): HTTP auth object auth(Optional[Tuple[str, str]]): HTTP auth object if set
timeout(int): HTTP request timeout in seconds timeout(int): HTTP request timeout in seconds
""" """
@ -47,9 +47,9 @@ class HttpUpload(Upload):
section(str): configuration section name section(str): configuration section name
""" """
Upload.__init__(self, architecture, configuration) Upload.__init__(self, architecture, configuration)
password = configuration.get(section, "password") password = configuration.get(section, "password", fallback=None)
username = configuration.get(section, "username") username = configuration.get(section, "username", fallback=None)
self.auth = (password, username) self.auth = (password, username) if password and username else None
self.timeout = configuration.getint(section, "timeout", fallback=30) self.timeout = configuration.getint(section, "timeout", fallback=30)
@staticmethod @staticmethod

View File

@ -43,7 +43,7 @@ class UploadTrigger(Trigger):
configuration(Configuration): configuration instance configuration(Configuration): configuration instance
""" """
Trigger.__init__(self, architecture, configuration) Trigger.__init__(self, architecture, configuration)
self.targets = configuration.getlist("upload", "target") self.targets = configuration.getlist("upload", "target", fallback=[])
def on_result(self, result: Result, packages: Iterable[Package]) -> None: def on_result(self, result: Result, packages: Iterable[Package]) -> None:
""" """