summaryrefslogtreecommitdiffstats
path: root/src/ansiblelint/rules/yaml_rule.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/ansiblelint/rules/yaml_rule.py')
-rw-r--r--src/ansiblelint/rules/yaml_rule.py48
1 files changed, 41 insertions, 7 deletions
diff --git a/src/ansiblelint/rules/yaml_rule.py b/src/ansiblelint/rules/yaml_rule.py
index 4da4d41..3ec5b59 100644
--- a/src/ansiblelint/rules/yaml_rule.py
+++ b/src/ansiblelint/rules/yaml_rule.py
@@ -1,27 +1,29 @@
"""Implementation of yaml linting rule (yamllint integration)."""
+
from __future__ import annotations
import logging
import sys
-from collections.abc import Iterable
+from collections.abc import Iterable, MutableMapping, MutableSequence
from typing import TYPE_CHECKING
from yamllint.linter import run as run_yamllint
from ansiblelint.constants import LINE_NUMBER_KEY, SKIPPED_RULES_KEY
from ansiblelint.file_utils import Lintable
-from ansiblelint.rules import AnsibleLintRule
+from ansiblelint.rules import AnsibleLintRule, TransformMixin
from ansiblelint.yaml_utils import load_yamllint_config
if TYPE_CHECKING:
from typing import Any
+ from ansiblelint.config import Options
from ansiblelint.errors import MatchError
_logger = logging.getLogger(__name__)
-class YamllintRule(AnsibleLintRule):
+class YamllintRule(AnsibleLintRule, TransformMixin):
"""Violations reported by yamllint."""
id = "yaml"
@@ -73,6 +75,12 @@ class YamllintRule(AnsibleLintRule):
self.severity = "VERY_LOW"
if problem.level == "error":
self.severity = "MEDIUM"
+ # Ignore truthy violation with github workflows ("on:" keys)
+ if problem.rule == "truthy" and file.path.parent.parts[-2:] == (
+ ".github",
+ "workflows",
+ ):
+ continue
matches.append(
self.create_matcherror(
# yamllint does return lower-case sentences
@@ -85,6 +93,22 @@ class YamllintRule(AnsibleLintRule):
)
return matches
+ def transform(
+ self: YamllintRule,
+ match: MatchError,
+ lintable: Lintable,
+ data: MutableMapping[str, Any] | MutableSequence[Any] | str,
+ ) -> None:
+ """Transform yaml.
+
+ :param match: MatchError instance
+ :param lintable: Lintable instance
+ :param data: data to transform
+ """
+ # This method does nothing because the YAML reformatting is implemented
+ # in data dumper. Still presence of this method helps us with
+ # documentation generation.
+
def _combine_skip_rules(data: Any) -> set[str]:
"""Return a consolidated list of skipped rules."""
@@ -107,7 +131,7 @@ def _fetch_skips(data: Any, collector: dict[int, set[str]]) -> dict[int, set[str
collector[data.get(LINE_NUMBER_KEY)].update(rules)
if isinstance(data, Iterable) and not isinstance(data, str):
if isinstance(data, dict):
- for _entry, value in data.items():
+ for value in data.values():
_fetch_skips(value, collector)
else: # must be some kind of list
for entry in data:
@@ -128,7 +152,6 @@ if "pytest" in sys.modules:
import pytest
# pylint: disable=ungrouped-imports
- from ansiblelint.config import options
from ansiblelint.rules import RulesCollection
from ansiblelint.runner import Runner
@@ -180,15 +203,26 @@ if "pytest" in sys.modules:
[],
id="rule-yaml-pass",
),
+ pytest.param(
+ "examples/yamllint/.github/workflows/ci.yml",
+ "yaml",
+ [],
+ id="rule-yaml-github-workflow",
+ ),
),
)
@pytest.mark.filterwarnings("ignore::ansible_compat.runtime.AnsibleWarning")
- def test_yamllint(file: str, expected_kind: str, expected: list[str]) -> None:
+ def test_yamllint(
+ file: str,
+ expected_kind: str,
+ expected: list[str],
+ config_options: Options,
+ ) -> None:
"""Validate parsing of ansible output."""
lintable = Lintable(file)
assert lintable.kind == expected_kind
- rules = RulesCollection(options=options)
+ rules = RulesCollection(options=config_options)
rules.register(YamllintRule())
results = Runner(lintable, rules=rules).run()