diff --git a/src/ahriman/application/handlers/validate.py b/src/ahriman/application/handlers/validate.py index 6728bf9f..ae518d9a 100644 --- a/src/ahriman/application/handlers/validate.py +++ b/src/ahriman/application/handlers/validate.py @@ -52,7 +52,7 @@ class Validate(Handler): """ from ahriman.core.configuration.validator import Validator - schema = Validate.schema(repository_id, configuration) + schema = Validate.schema(configuration) validator = Validator(configuration=configuration, schema=schema) if validator.validate(configuration.dump()): @@ -83,12 +83,11 @@ class Validate(Handler): return parser @staticmethod - def schema(repository_id: RepositoryId, configuration: Configuration) -> ConfigurationSchema: + def schema(configuration: Configuration) -> ConfigurationSchema: """ get schema with triggers Args: - repository_id(RepositoryId): repository unique identifier configuration(Configuration): configuration instance Returns: @@ -107,12 +106,12 @@ class Validate(Handler): continue # default settings if any - for schema_name, schema in trigger_class.configuration_schema(repository_id, None).items(): + for schema_name, schema in trigger_class.configuration_schema(None).items(): erased = Validate.schema_erase_required(copy.deepcopy(schema)) root[schema_name] = Validate.schema_merge(root.get(schema_name, {}), erased) # settings according to enabled triggers - for schema_name, schema in trigger_class.configuration_schema(repository_id, configuration).items(): + for schema_name, schema in trigger_class.configuration_schema(configuration).items(): root[schema_name] = Validate.schema_merge(root.get(schema_name, {}), copy.deepcopy(schema)) return root diff --git a/src/ahriman/core/triggers/trigger.py b/src/ahriman/core/triggers/trigger.py index 8ae0ae13..8e525d30 100644 --- a/src/ahriman/core/triggers/trigger.py +++ b/src/ahriman/core/triggers/trigger.py @@ -80,8 +80,7 @@ class Trigger(LazyLogging): return self.repository_id.architecture @classmethod - def configuration_schema(cls, repository_id: RepositoryId, - configuration: Configuration | None) -> ConfigurationSchema: + def configuration_schema(cls, configuration: Configuration | None) -> ConfigurationSchema: """ configuration schema based on supplied service configuration @@ -89,7 +88,6 @@ class Trigger(LazyLogging): Schema must be in cerberus format, for details and examples you can check built-in triggers. Args: - repository_id(str): repository unique identifier configuration(Configuration | None): configuration instance. If set to None, the default schema should be returned @@ -101,13 +99,15 @@ class Trigger(LazyLogging): result: ConfigurationSchema = {} for target in cls.configuration_sections(configuration): - if not configuration.has_section(target): - continue - section, schema_name = configuration.gettype( - target, repository_id, fallback=cls.CONFIGURATION_SCHEMA_FALLBACK) - if schema_name not in cls.CONFIGURATION_SCHEMA: - continue - result[section] = cls.CONFIGURATION_SCHEMA[schema_name] + for section in configuration.sections(): + if not (section == target or section.startswith(f"{target}:")): + # either repository specific or exact name + continue + schema_name = configuration.get(section, "type", fallback=section) + + if schema_name not in cls.CONFIGURATION_SCHEMA: + continue + result[section] = cls.CONFIGURATION_SCHEMA[schema_name] return result diff --git a/tests/ahriman/application/handlers/test_handler_validate.py b/tests/ahriman/application/handlers/test_handler_validate.py index 7d2bea99..16d5a7f4 100644 --- a/tests/ahriman/application/handlers/test_handler_validate.py +++ b/tests/ahriman/application/handlers/test_handler_validate.py @@ -2,6 +2,7 @@ import argparse import json import pytest +from pathlib import Path from pytest_mock import MockerFixture from ahriman.application.handlers.validate import Validate @@ -53,12 +54,50 @@ def test_run_skip(args: argparse.Namespace, configuration: Configuration, mocker print_mock.assert_not_called() +def test_run_default(args: argparse.Namespace, configuration: Configuration) -> None: + """ + must run on default configuration without errors + """ + args.exit_code = True + _, repository_id = configuration.check_loaded() + + default = Configuration.from_path(Configuration.SYSTEM_CONFIGURATION_PATH, repository_id) + # copy autogenerated values + for section, key in (("build", "build_command"), ("repository", "root")): + value = configuration.get(section, key) + default.set_option(section, key, value) + + Validate.run(args, repository_id, default, report=False) + + +def test_run_repo_specific_triggers(args: argparse.Namespace, configuration: Configuration, + resource_path_root: Path) -> None: + """ + must correctly insert repo specific triggers + """ + args.exit_code = True + _, repository_id = configuration.check_loaded() + + # remove unused sections + for section in ("customs3", "github:x86_64", "logs-rotation", "mirrorlist"): + configuration.remove_section(section) + + configuration.set_option("report", "target", "test") + for section in ("test", "test:i686", "test:another-repo:x86_64"): + configuration.set_option(section, "type", "html") + configuration.set_option(section, "link_path", "http://link_path") + configuration.set_option(section, "path", "path") + configuration.set_option(section, "template", "template") + configuration.set_option(section, "templates", str(resource_path_root)) + + Validate.run(args, repository_id, configuration, report=False) + + def test_schema(configuration: Configuration) -> None: """ must generate full schema correctly """ - _, repository_id = configuration.check_loaded() - schema = Validate.schema(repository_id, configuration) + schema = Validate.schema(configuration) # defaults assert schema.pop("console") @@ -91,9 +130,7 @@ def test_schema_invalid_trigger(configuration: Configuration) -> None: """ configuration.set_option("build", "triggers", "some.invalid.trigger.path.Trigger") configuration.remove_option("build", "triggers_known") - _, repository_id = configuration.check_loaded() - - assert Validate.schema(repository_id, configuration) == CONFIGURATION_SCHEMA + assert Validate.schema(configuration) == CONFIGURATION_SCHEMA def test_schema_erase_required() -> None: diff --git a/tests/ahriman/core/triggers/test_trigger.py b/tests/ahriman/core/triggers/test_trigger.py index 73424e94..9923d968 100644 --- a/tests/ahriman/core/triggers/test_trigger.py +++ b/tests/ahriman/core/triggers/test_trigger.py @@ -19,10 +19,9 @@ def test_configuration_schema(configuration: Configuration) -> None: """ section = "console" configuration.set_option("report", "target", section) - _, repository_id = configuration.check_loaded() expected = {section: ReportTrigger.CONFIGURATION_SCHEMA[section]} - assert ReportTrigger.configuration_schema(repository_id, configuration) == expected + assert ReportTrigger.configuration_schema(configuration) == expected def test_configuration_schema_no_section(configuration: Configuration) -> None: @@ -31,9 +30,7 @@ def test_configuration_schema_no_section(configuration: Configuration) -> None: """ section = "abracadabra" configuration.set_option("report", "target", section) - _, repository_id = configuration.check_loaded() - - assert ReportTrigger.configuration_schema(repository_id, configuration) == {} + assert ReportTrigger.configuration_schema(configuration) == {} def test_configuration_schema_no_schema(configuration: Configuration) -> None: @@ -43,17 +40,15 @@ def test_configuration_schema_no_schema(configuration: Configuration) -> None: section = "abracadabra" configuration.set_option("report", "target", section) configuration.set_option(section, "key", "value") - _, repository_id = configuration.check_loaded() - assert ReportTrigger.configuration_schema(repository_id, configuration) == {} + assert ReportTrigger.configuration_schema(configuration) == {} def test_configuration_schema_empty(configuration: Configuration) -> None: """ must return default schema if no configuration set """ - _, repository_id = configuration.check_loaded() - assert ReportTrigger.configuration_schema(repository_id, None) == ReportTrigger.CONFIGURATION_SCHEMA + assert ReportTrigger.configuration_schema(None) == ReportTrigger.CONFIGURATION_SCHEMA def test_configuration_schema_variables() -> None: