summaryrefslogtreecommitdiffstats
path: root/src/ansiblelint/rules/playbook_extension.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/ansiblelint/rules/playbook_extension.py')
-rw-r--r--src/ansiblelint/rules/playbook_extension.py55
1 files changed, 55 insertions, 0 deletions
diff --git a/src/ansiblelint/rules/playbook_extension.py b/src/ansiblelint/rules/playbook_extension.py
new file mode 100644
index 0000000..b4ca41c
--- /dev/null
+++ b/src/ansiblelint/rules/playbook_extension.py
@@ -0,0 +1,55 @@
+"""Implementation of playbook-extension rule."""
+# Copyright (c) 2016, Tsukinowa Inc. <info@tsukinowa.jp>
+# Copyright (c) 2018, Ansible Project
+from __future__ import annotations
+
+import sys
+from typing import TYPE_CHECKING
+
+from ansiblelint.file_utils import Lintable
+from ansiblelint.rules import AnsibleLintRule
+from ansiblelint.runner import Runner
+
+if TYPE_CHECKING:
+ from ansiblelint.errors import MatchError
+
+
+class PlaybookExtensionRule(AnsibleLintRule):
+ """Use ".yml" or ".yaml" playbook extension."""
+
+ id = "playbook-extension"
+ description = 'Playbooks should have the ".yml" or ".yaml" extension'
+ severity = "MEDIUM"
+ tags = ["formatting"]
+ done: list[str] = []
+ version_added = "v4.0.0"
+
+ def matchyaml(self, file: Lintable) -> list[MatchError]:
+ result: list[MatchError] = []
+ if file.kind != "playbook":
+ return result
+ path = str(file.path)
+ ext = file.path.suffix
+ if ext not in [".yml", ".yaml"] and path not in self.done:
+ self.done.append(path)
+ result.append(self.create_matcherror(filename=file))
+ return result
+
+
+if "pytest" in sys.modules:
+ import pytest
+
+ from ansiblelint.rules import RulesCollection # pylint: disable=ungrouped-imports
+
+ @pytest.mark.parametrize(
+ ("file", "expected"),
+ (pytest.param("examples/playbooks/play-without-extension", 1, id="fail"),),
+ )
+ def test_playbook_extension(file: str, expected: int) -> None:
+ """The ini_file module does not accept preserve mode."""
+ rules = RulesCollection()
+ rules.register(PlaybookExtensionRule())
+ results = Runner(Lintable(file, kind="playbook"), rules=rules).run()
+ assert len(results) == expected
+ for result in results:
+ assert result.tag == "playbook-extension"