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