From 358e3dc4d25930f736e4c0243063b4d5f79c6dde Mon Sep 17 00:00:00 2001 From: Evgenii Alekseev Date: Thu, 31 Jul 2025 14:14:22 +0300 Subject: [PATCH] feat: expose repository name and architecure in configuration if available In some cases there are reference to current repository settings. In order to handle it correctly two ro options have been added Related to #154 --- docs/configuration.rst | 2 ++ .../core/configuration/configuration.py | 29 ++++++++++++++-- src/ahriman/core/configuration/schema.py | 4 +++ .../core/configuration/test_configuration.py | 34 +++++++++++++++++++ 4 files changed, 67 insertions(+), 2 deletions(-) diff --git a/docs/configuration.rst b/docs/configuration.rst index 60e2b560..cf5600fd 100644 --- a/docs/configuration.rst +++ b/docs/configuration.rst @@ -139,6 +139,8 @@ Build related configuration. Group name can refer to architecture, e.g. ``build: Base repository settings. +* ``architecture`` - repository architecture, string. This field is read-only and generated automatically from run options if possible. +* ``name`` - repository name, string. This field is read-only and generated automatically from run options if possible. * ``root`` - root path for application, string, required. ``sign:*`` groups diff --git a/src/ahriman/core/configuration/configuration.py b/src/ahriman/core/configuration/configuration.py index 5b1ce2d5..f5c76ea4 100644 --- a/src/ahriman/core/configuration/configuration.py +++ b/src/ahriman/core/configuration/configuration.py @@ -43,7 +43,6 @@ class Configuration(configparser.RawConfigParser): SYSTEM_CONFIGURATION_PATH(Path): (class attribute) default system configuration path distributed by package includes(list[Path]): list of includes which were read path(Path | None): path to root configuration file - repository_id(RepositoryId | None): repository unique identifier Examples: Configuration class provides additional method in order to handle application configuration. Since this class is @@ -94,7 +93,7 @@ class Configuration(configparser.RawConfigParser): }, ) - self.repository_id: RepositoryId | None = None + self._repository_id: RepositoryId | None = None self.path: Path | None = None self.includes: list[Path] = [] @@ -129,6 +128,32 @@ class Configuration(configparser.RawConfigParser): """ return self.getpath("settings", "logging") + @property + def repository_id(self) -> RepositoryId | None: + """ + repository identifier + + Returns: + RepositoryId: repository unique identifier + """ + return self._repository_id + + @repository_id.setter + def repository_id(self, repository_id: RepositoryId | None) -> None: + """ + setter for repository identifier + + Args: + repository_id(RepositoryId | None): repository unique identifier + """ + self._repository_id = repository_id + if repository_id is None or repository_id.is_empty: + self.remove_option("repository", "name") + self.remove_option("repository", "architecture") + else: + self.set_option("repository", "name", repository_id.name) + self.set_option("repository", "architecture", repository_id.architecture) + @property def repository_name(self) -> str: """ diff --git a/src/ahriman/core/configuration/schema.py b/src/ahriman/core/configuration/schema.py index 57eafc23..f179270c 100644 --- a/src/ahriman/core/configuration/schema.py +++ b/src/ahriman/core/configuration/schema.py @@ -249,6 +249,10 @@ CONFIGURATION_SCHEMA: ConfigurationSchema = { "repository": { "type": "dict", "schema": { + "architecture": { + "type": "string", + "empty": False, + }, "name": { "type": "string", "empty": False, diff --git a/tests/ahriman/core/configuration/test_configuration.py b/tests/ahriman/core/configuration/test_configuration.py index de2a0add..86b638e0 100644 --- a/tests/ahriman/core/configuration/test_configuration.py +++ b/tests/ahriman/core/configuration/test_configuration.py @@ -20,6 +20,40 @@ def test_architecture(configuration: Configuration) -> None: assert configuration.architecture == "x86_64" +def test_repository_id(configuration: Configuration, repository_id: RepositoryId) -> None: + """ + must return repository identifier + """ + assert configuration.repository_id == repository_id + assert configuration.get("repository", "name") == repository_id.name + assert configuration.get("repository", "architecture") == repository_id.architecture + + +def test_repository_id_erase(configuration: Configuration) -> None: + """ + must remove repository identifier properties if empty identifier supplied + """ + configuration.repository_id = None + assert configuration.get("repository", "name", fallback=None) is None + assert configuration.get("repository", "architecture", fallback=None) is None + + configuration.repository_id = RepositoryId("", "") + assert configuration.get("repository", "name", fallback=None) is None + assert configuration.get("repository", "architecture", fallback=None) is None + + +def test_repository_id_update(configuration: Configuration, repository_id: RepositoryId) -> None: + """ + must update repository identifier and related configuration options + """ + repository_id = RepositoryId("i686", repository_id.name) + + configuration.repository_id = repository_id + assert configuration.repository_id == repository_id + assert configuration.get("repository", "name") == repository_id.name + assert configuration.get("repository", "architecture") == repository_id.architecture + + def test_repository_name(configuration: Configuration) -> None: """ must return valid repository name