mirror of
https://github.com/arcan1s/ahriman.git
synced 2025-08-17 15:09:57 +00:00
fix: correctly process trigger repo specific settings in validator (see #154)
This commit is contained in:
@ -52,7 +52,7 @@ class Validate(Handler):
|
|||||||
"""
|
"""
|
||||||
from ahriman.core.configuration.validator import Validator
|
from ahriman.core.configuration.validator import Validator
|
||||||
|
|
||||||
schema = Validate.schema(repository_id, configuration)
|
schema = Validate.schema(configuration)
|
||||||
validator = Validator(configuration=configuration, schema=schema)
|
validator = Validator(configuration=configuration, schema=schema)
|
||||||
|
|
||||||
if validator.validate(configuration.dump()):
|
if validator.validate(configuration.dump()):
|
||||||
@ -83,12 +83,11 @@ class Validate(Handler):
|
|||||||
return parser
|
return parser
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def schema(repository_id: RepositoryId, configuration: Configuration) -> ConfigurationSchema:
|
def schema(configuration: Configuration) -> ConfigurationSchema:
|
||||||
"""
|
"""
|
||||||
get schema with triggers
|
get schema with triggers
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
repository_id(RepositoryId): repository unique identifier
|
|
||||||
configuration(Configuration): configuration instance
|
configuration(Configuration): configuration instance
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
@ -107,12 +106,12 @@ class Validate(Handler):
|
|||||||
continue
|
continue
|
||||||
|
|
||||||
# default settings if any
|
# 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))
|
erased = Validate.schema_erase_required(copy.deepcopy(schema))
|
||||||
root[schema_name] = Validate.schema_merge(root.get(schema_name, {}), erased)
|
root[schema_name] = Validate.schema_merge(root.get(schema_name, {}), erased)
|
||||||
|
|
||||||
# settings according to enabled triggers
|
# 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))
|
root[schema_name] = Validate.schema_merge(root.get(schema_name, {}), copy.deepcopy(schema))
|
||||||
|
|
||||||
return root
|
return root
|
||||||
|
@ -80,8 +80,7 @@ class Trigger(LazyLogging):
|
|||||||
return self.repository_id.architecture
|
return self.repository_id.architecture
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def configuration_schema(cls, repository_id: RepositoryId,
|
def configuration_schema(cls, configuration: Configuration | None) -> ConfigurationSchema:
|
||||||
configuration: Configuration | None) -> ConfigurationSchema:
|
|
||||||
"""
|
"""
|
||||||
configuration schema based on supplied service configuration
|
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.
|
Schema must be in cerberus format, for details and examples you can check built-in triggers.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
repository_id(str): repository unique identifier
|
|
||||||
configuration(Configuration | None): configuration instance. If set to None, the default schema
|
configuration(Configuration | None): configuration instance. If set to None, the default schema
|
||||||
should be returned
|
should be returned
|
||||||
|
|
||||||
@ -101,13 +99,15 @@ class Trigger(LazyLogging):
|
|||||||
|
|
||||||
result: ConfigurationSchema = {}
|
result: ConfigurationSchema = {}
|
||||||
for target in cls.configuration_sections(configuration):
|
for target in cls.configuration_sections(configuration):
|
||||||
if not configuration.has_section(target):
|
for section in configuration.sections():
|
||||||
continue
|
if not (section == target or section.startswith(f"{target}:")):
|
||||||
section, schema_name = configuration.gettype(
|
# either repository specific or exact name
|
||||||
target, repository_id, fallback=cls.CONFIGURATION_SCHEMA_FALLBACK)
|
continue
|
||||||
if schema_name not in cls.CONFIGURATION_SCHEMA:
|
schema_name = configuration.get(section, "type", fallback=section)
|
||||||
continue
|
|
||||||
result[section] = cls.CONFIGURATION_SCHEMA[schema_name]
|
if schema_name not in cls.CONFIGURATION_SCHEMA:
|
||||||
|
continue
|
||||||
|
result[section] = cls.CONFIGURATION_SCHEMA[schema_name]
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
@ -2,6 +2,7 @@ import argparse
|
|||||||
import json
|
import json
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
from pytest_mock import MockerFixture
|
from pytest_mock import MockerFixture
|
||||||
|
|
||||||
from ahriman.application.handlers.validate import Validate
|
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()
|
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:
|
def test_schema(configuration: Configuration) -> None:
|
||||||
"""
|
"""
|
||||||
must generate full schema correctly
|
must generate full schema correctly
|
||||||
"""
|
"""
|
||||||
_, repository_id = configuration.check_loaded()
|
schema = Validate.schema(configuration)
|
||||||
schema = Validate.schema(repository_id, configuration)
|
|
||||||
|
|
||||||
# defaults
|
# defaults
|
||||||
assert schema.pop("console")
|
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.set_option("build", "triggers", "some.invalid.trigger.path.Trigger")
|
||||||
configuration.remove_option("build", "triggers_known")
|
configuration.remove_option("build", "triggers_known")
|
||||||
_, repository_id = configuration.check_loaded()
|
assert Validate.schema(configuration) == CONFIGURATION_SCHEMA
|
||||||
|
|
||||||
assert Validate.schema(repository_id, configuration) == CONFIGURATION_SCHEMA
|
|
||||||
|
|
||||||
|
|
||||||
def test_schema_erase_required() -> None:
|
def test_schema_erase_required() -> None:
|
||||||
|
@ -19,10 +19,9 @@ def test_configuration_schema(configuration: Configuration) -> None:
|
|||||||
"""
|
"""
|
||||||
section = "console"
|
section = "console"
|
||||||
configuration.set_option("report", "target", section)
|
configuration.set_option("report", "target", section)
|
||||||
_, repository_id = configuration.check_loaded()
|
|
||||||
|
|
||||||
expected = {section: ReportTrigger.CONFIGURATION_SCHEMA[section]}
|
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:
|
def test_configuration_schema_no_section(configuration: Configuration) -> None:
|
||||||
@ -31,9 +30,7 @@ def test_configuration_schema_no_section(configuration: Configuration) -> None:
|
|||||||
"""
|
"""
|
||||||
section = "abracadabra"
|
section = "abracadabra"
|
||||||
configuration.set_option("report", "target", section)
|
configuration.set_option("report", "target", section)
|
||||||
_, repository_id = configuration.check_loaded()
|
assert ReportTrigger.configuration_schema(configuration) == {}
|
||||||
|
|
||||||
assert ReportTrigger.configuration_schema(repository_id, configuration) == {}
|
|
||||||
|
|
||||||
|
|
||||||
def test_configuration_schema_no_schema(configuration: Configuration) -> None:
|
def test_configuration_schema_no_schema(configuration: Configuration) -> None:
|
||||||
@ -43,17 +40,15 @@ def test_configuration_schema_no_schema(configuration: Configuration) -> None:
|
|||||||
section = "abracadabra"
|
section = "abracadabra"
|
||||||
configuration.set_option("report", "target", section)
|
configuration.set_option("report", "target", section)
|
||||||
configuration.set_option(section, "key", "value")
|
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:
|
def test_configuration_schema_empty(configuration: Configuration) -> None:
|
||||||
"""
|
"""
|
||||||
must return default schema if no configuration set
|
must return default schema if no configuration set
|
||||||
"""
|
"""
|
||||||
_, repository_id = configuration.check_loaded()
|
assert ReportTrigger.configuration_schema(None) == ReportTrigger.CONFIGURATION_SCHEMA
|
||||||
assert ReportTrigger.configuration_schema(repository_id, None) == ReportTrigger.CONFIGURATION_SCHEMA
|
|
||||||
|
|
||||||
|
|
||||||
def test_configuration_schema_variables() -> None:
|
def test_configuration_schema_variables() -> None:
|
||||||
|
Reference in New Issue
Block a user