diff --git a/examples/playbooks/name_case_notify_fail.yml b/examples/playbooks/name_case_notify_fail.yml index 642152bd49..d7a2acaa2f 100644 --- a/examples/playbooks/name_case_notify_fail.yml +++ b/examples/playbooks/name_case_notify_fail.yml @@ -16,6 +16,14 @@ - my handler - my other handler + - name: Only one of these is invalid + ansible.builtin.debug: + msg: foo + changed_when: true + notify: + - "role_name : lowercase handler" + - "role_name : Uppercase handler" + handlers: - name: My handler ansible.builtin.debug: diff --git a/src/ansiblelint/rules/name.py b/src/ansiblelint/rules/name.py index f7cc1bf841..52c649a6ed 100644 --- a/src/ansiblelint/rules/name.py +++ b/src/ansiblelint/rules/name.py @@ -97,6 +97,7 @@ def matchtask( if notify: if isinstance(notify, str): notify = [notify] + results.extend( [ self.create_matcherror( @@ -106,9 +107,7 @@ def matchtask( filename=file, ) for handler in notify - if handler[0].isalpha() - and handler[0].islower() - and not handler[0].isupper() + if check_handler_case(handler) ], ) return results @@ -280,6 +279,14 @@ def update_task_name(task_name: str) -> str: match.fixed = True +def check_handler_case(handler: str) -> bool: + """Check the casing of a handler.""" + # Handlers may be prefixed with "role_name : " to indicate a handler from a specific role + # Strip this before checking + handler = handler.split(" : ", 1)[-1] + return handler[0].isalpha() and handler[0].islower() and not handler[0].isupper() + + if "pytest" in sys.modules: from ansiblelint.rules import RulesCollection from ansiblelint.runner import Runner @@ -379,15 +386,9 @@ def test_rule_notify_lowercase() -> None: failure = "examples/playbooks/name_case_notify_fail.yml" bad_runner = Runner(failure, rules=collection) errs = bad_runner.run() - assert len(errs) == 4 - assert errs[0].tag == "name[casing]" - assert errs[1].tag == "name[casing]" - assert errs[2].tag == "name[casing]" - assert errs[3].tag == "name[casing]" - assert errs[0].rule.id == "name" - assert errs[1].rule.id == "name" - assert errs[2].rule.id == "name" - assert errs[3].rule.id == "name" + assert len(errs) == 5 + assert all(err.tag == "name[casing]" for err in errs) + assert all(err.rule.id == "name" for err in errs) def test_name_play() -> None: """Positive test for name[play]."""