diff --git a/src/ahriman/core/housekeeping/logs_rotation_trigger.py b/src/ahriman/core/housekeeping/logs_rotation_trigger.py index 62502621..1d662743 100644 --- a/src/ahriman/core/housekeeping/logs_rotation_trigger.py +++ b/src/ahriman/core/housekeeping/logs_rotation_trigger.py @@ -47,6 +47,7 @@ class LogsRotationTrigger(Trigger): }, }, } + REQUIRES_REPOSITORY = True def __init__(self, repository_id: RepositoryId, configuration: Configuration) -> None: """ diff --git a/src/ahriman/core/report/report_trigger.py b/src/ahriman/core/report/report_trigger.py index 6ca750cd..76866937 100644 --- a/src/ahriman/core/report/report_trigger.py +++ b/src/ahriman/core/report/report_trigger.py @@ -336,6 +336,7 @@ class ReportTrigger(Trigger): }, }, } + REQUIRES_REPOSITORY = True def __init__(self, repository_id: RepositoryId, configuration: Configuration) -> None: """ diff --git a/src/ahriman/core/support/keyring_trigger.py b/src/ahriman/core/support/keyring_trigger.py index 6d87497b..02bc0684 100644 --- a/src/ahriman/core/support/keyring_trigger.py +++ b/src/ahriman/core/support/keyring_trigger.py @@ -103,6 +103,7 @@ class KeyringTrigger(Trigger): }, }, } + REQUIRES_REPOSITORY = True def __init__(self, repository_id: RepositoryId, configuration: Configuration) -> None: """ diff --git a/src/ahriman/core/support/mirrorlist_trigger.py b/src/ahriman/core/support/mirrorlist_trigger.py index a55513c6..29734e59 100644 --- a/src/ahriman/core/support/mirrorlist_trigger.py +++ b/src/ahriman/core/support/mirrorlist_trigger.py @@ -90,6 +90,7 @@ class MirrorlistTrigger(Trigger): }, }, } + REQUIRES_REPOSITORY = True def __init__(self, repository_id: RepositoryId, configuration: Configuration) -> None: """ diff --git a/src/ahriman/core/triggers/trigger.py b/src/ahriman/core/triggers/trigger.py index 8e525d30..d4272d44 100644 --- a/src/ahriman/core/triggers/trigger.py +++ b/src/ahriman/core/triggers/trigger.py @@ -36,6 +36,7 @@ class Trigger(LazyLogging): CONFIGURATION_SCHEMA(ConfigurationSchema): (class attribute) configuration schema template CONFIGURATION_SCHEMA_FALLBACK(str | None): (class attribute) optional fallback option for defining configuration schema type used + REQUIRES_REPOSITORY(bool): (class attribute) either trigger requires loaded repository or not configuration(Configuration): configuration instance repository_id(RepositoryId): repository unique identifier @@ -59,6 +60,7 @@ class Trigger(LazyLogging): CONFIGURATION_SCHEMA: ClassVar[ConfigurationSchema] = {} CONFIGURATION_SCHEMA_FALLBACK: ClassVar[str | None] = None + REQUIRES_REPOSITORY: ClassVar[bool] = True def __init__(self, repository_id: RepositoryId, configuration: Configuration) -> None: """ @@ -79,6 +81,16 @@ class Trigger(LazyLogging): """ return self.repository_id.architecture + @property + def is_allowed_to_run(self) -> bool: + """ + whether trigger allowed to run or not + + Returns: + bool: ``True`` in case if trigger allowed to run and ``False`` otherwise + """ + return not (self.REQUIRES_REPOSITORY and self.repository_id.is_empty) + @classmethod def configuration_schema(cls, configuration: Configuration | None) -> ConfigurationSchema: """ diff --git a/src/ahriman/core/triggers/trigger_loader.py b/src/ahriman/core/triggers/trigger_loader.py index 6aac9051..d4a4db2c 100644 --- a/src/ahriman/core/triggers/trigger_loader.py +++ b/src/ahriman/core/triggers/trigger_loader.py @@ -77,8 +77,9 @@ class TriggerLoader(LazyLogging): """ instance = cls() instance.triggers = [ - instance.load_trigger(trigger, repository_id, configuration) - for trigger in instance.selected_triggers(configuration) + trigger + for trigger_name in instance.selected_triggers(configuration) + if (trigger := instance.load_trigger(trigger_name, repository_id, configuration)).is_allowed_to_run ] return instance diff --git a/src/ahriman/core/upload/upload_trigger.py b/src/ahriman/core/upload/upload_trigger.py index 3bf4056d..b7bc6ec7 100644 --- a/src/ahriman/core/upload/upload_trigger.py +++ b/src/ahriman/core/upload/upload_trigger.py @@ -160,6 +160,7 @@ class UploadTrigger(Trigger): }, }, } + REQUIRES_REPOSITORY = True def __init__(self, repository_id: RepositoryId, configuration: Configuration) -> None: """ diff --git a/tests/ahriman/core/housekeeping/test_logs_rotation_trigger.py b/tests/ahriman/core/housekeeping/test_logs_rotation_trigger.py index d32c04ae..9be90aff 100644 --- a/tests/ahriman/core/housekeeping/test_logs_rotation_trigger.py +++ b/tests/ahriman/core/housekeeping/test_logs_rotation_trigger.py @@ -7,6 +7,13 @@ from ahriman.core.status import Client from ahriman.models.result import Result +def test_requires_repository() -> None: + """ + must require repository identifier to be set to start + """ + assert LogsRotationTrigger.REQUIRES_REPOSITORY + + def test_configuration_sections(configuration: Configuration) -> None: """ must correctly parse target list diff --git a/tests/ahriman/core/report/test_report_trigger.py b/tests/ahriman/core/report/test_report_trigger.py index 9e79edc9..e1f40794 100644 --- a/tests/ahriman/core/report/test_report_trigger.py +++ b/tests/ahriman/core/report/test_report_trigger.py @@ -5,6 +5,13 @@ from ahriman.core.report import ReportTrigger from ahriman.models.result import Result +def test_requires_repository() -> None: + """ + must require repository identifier to be set to start + """ + assert ReportTrigger.REQUIRES_REPOSITORY + + def test_configuration_sections(configuration: Configuration) -> None: """ must correctly parse target list diff --git a/tests/ahriman/core/support/test_keyring_trigger.py b/tests/ahriman/core/support/test_keyring_trigger.py index 13631858..29ec7b2a 100644 --- a/tests/ahriman/core/support/test_keyring_trigger.py +++ b/tests/ahriman/core/support/test_keyring_trigger.py @@ -7,6 +7,13 @@ from ahriman.core.sign.gpg import GPG from ahriman.core.support import KeyringTrigger +def test_requires_repository() -> None: + """ + must require repository identifier to be set to start + """ + assert KeyringTrigger.REQUIRES_REPOSITORY + + def test_configuration_sections(configuration: Configuration) -> None: """ must correctly parse target list diff --git a/tests/ahriman/core/support/test_mirrorlist_trigger.py b/tests/ahriman/core/support/test_mirrorlist_trigger.py index 7f34faaa..be65fe59 100644 --- a/tests/ahriman/core/support/test_mirrorlist_trigger.py +++ b/tests/ahriman/core/support/test_mirrorlist_trigger.py @@ -4,6 +4,13 @@ from ahriman.core.configuration import Configuration from ahriman.core.support import MirrorlistTrigger +def test_requires_repository() -> None: + """ + must require repository identifier to be set to start + """ + assert MirrorlistTrigger.REQUIRES_REPOSITORY + + def test_configuration_sections(configuration: Configuration) -> None: """ must correctly parse target list diff --git a/tests/ahriman/core/triggers/test_trigger.py b/tests/ahriman/core/triggers/test_trigger.py index 9923d968..f4804d90 100644 --- a/tests/ahriman/core/triggers/test_trigger.py +++ b/tests/ahriman/core/triggers/test_trigger.py @@ -3,6 +3,7 @@ from unittest.mock import MagicMock from ahriman.core.configuration import Configuration from ahriman.core.report import ReportTrigger from ahriman.core.triggers import Trigger +from ahriman.models.repository_id import RepositoryId from ahriman.models.result import Result @@ -13,6 +14,19 @@ def test_architecture(trigger: Trigger) -> None: assert trigger.architecture == trigger.repository_id.architecture +def test_is_allowed_to_run(trigger: Trigger) -> None: + """ + must return flag correctly + """ + assert trigger.is_allowed_to_run + + trigger.repository_id = RepositoryId("", "") + assert not trigger.is_allowed_to_run + + trigger.REQUIRES_REPOSITORY = False + assert trigger.is_allowed_to_run + + def test_configuration_schema(configuration: Configuration) -> None: """ must return used configuration schema diff --git a/tests/ahriman/core/upload/test_upload_trigger.py b/tests/ahriman/core/upload/test_upload_trigger.py index f49bc02c..444b31dc 100644 --- a/tests/ahriman/core/upload/test_upload_trigger.py +++ b/tests/ahriman/core/upload/test_upload_trigger.py @@ -5,6 +5,13 @@ from ahriman.core.upload import UploadTrigger from ahriman.models.result import Result +def test_requires_repository() -> None: + """ + must require repository identifier to be set to start + """ + assert UploadTrigger.REQUIRES_REPOSITORY + + def test_configuration_sections(configuration: Configuration) -> None: """ must correctly parse target list