diff --git a/examples/playbooks/var-spacing.yml b/examples/playbooks/var-spacing.yml index 3b88a649b8..0eb23b48c5 100644 --- a/examples/playbooks/var-spacing.yml +++ b/examples/playbooks/var-spacing.yml @@ -8,6 +8,12 @@ - name: good variable format ansible.builtin.debug: msg: "Value: {{ good_format }}" + - name: good variable filter format + ansible.builtin.debug: + msg: "{{ good_format | filter }}" + - name: good variable filter format + ansible.builtin.debug: + msg: "Value: {{ good_format | filter }}" - name: jinja escaping allowed ansible.builtin.debug: msg: "{{ '{{' }}" @@ -30,6 +36,15 @@ - name: bad variable format ansible.builtin.debug: msg: "{{bad_format }}" + - name: bad variable filter format + ansible.builtin.debug: + msg: "{{ bad_format|filter }}" + - name: bad variable filter format + ansible.builtin.debug: + msg: "Value: {{ bad_format |filter }}" + - name: bad variable filter format + ansible.builtin.debug: + msg: "{{ bad_format| filter }}" - name: not a jinja variable # noqa var-spacing ansible.builtin.debug: # spell-checker: disable-next-line diff --git a/examples/playbooks/vars/var-spacing.yml b/examples/playbooks/vars/var-spacing.yml index d894a91dcb..aaaf929e68 100644 --- a/examples/playbooks/vars/var-spacing.yml +++ b/examples/playbooks/vars/var-spacing.yml @@ -3,6 +3,8 @@ # ".bad_var_1", ".bad_var_2", ".bad_var_3", ".invalid_multiline_nested_json", ".invalid_nested_json" good_var_1: "{{ good_format }}" good_var_2: "Value: {{ good_format }}" +good_var_3: "{{ good_format | filter }}" +good_var_4: "Value: {{ good_format | filter }}" jinja_escape_1: "{{ '{{' }}" jinja_escape_2: docker info --format '{{ '{{' }}json .Swarm.LocalNodeState{{ '}}' }}' | tr -d '"' jinja_whitespace_control: | @@ -12,6 +14,9 @@ jinja_whitespace_control: | bad_var_1: "{{bad_format}}" bad_var_2: "Value: {{ bad_format}}" bad_var_3: "{{bad_format }}" +bad_var_4: "{{ bad_format|filter }}" +bad_var_5: "Value: {{ bad_format |filter }}" +bad_var_6: "{{ bad_format| filter }}" # spell-checker: disable-next-line non_jinja_var: "data = ${lookup{$local_part}lsearch{/etc/aliases}}" # noqa: var-spacing json_inside_jinja: "{{ {'test': {'subtest': variable}} }}" diff --git a/src/ansiblelint/rules/var_spacing.py b/src/ansiblelint/rules/var_spacing.py index ec2a93f80c..1d9cad7268 100644 --- a/src/ansiblelint/rules/var_spacing.py +++ b/src/ansiblelint/rules/var_spacing.py @@ -19,16 +19,19 @@ class VariableHasSpacesRule(AnsibleLintRule): - """Variables should have spaces before and after: {{ var_name }}.""" + """Variables should have spaces before and after: {{ var_name }}. Filters should have spaces before and after: {{ var_name | filter }}.""" id = "var-spacing" - description = "Variables should have spaces before and after: ``{{ var_name }}``" + description = "Variables should have spaces before and after: ``{{ var_name }}``. Filters should have spaces before and after: ``{{ var_name | filter }}.``" severity = "LOW" tags = ["formatting"] version_added = "v4.0.0" bracket_regex = re.compile(r"{{[^{\n' -]|[^ '\n}-]}}", re.MULTILINE | re.DOTALL) exclude_json_re = re.compile(r"[^{]{'\w+': ?[^{]{.*?}}", re.MULTILINE | re.DOTALL) + pipe_spacing_regex = re.compile( + r"{{.*(?<=[^ \n\t])[|].*|.*[|](?=[^ \n\t]).*}}", re.MULTILINE | re.DOTALL + ) def matchtask( self, task: Dict[str, Any], file: Optional[Lintable] = None @@ -36,7 +39,9 @@ def matchtask( for _, v, _ in nested_items_path(task): if isinstance(v, str): cleaned = self.exclude_json_re.sub("", v) - if bool(self.bracket_regex.search(cleaned)): + if bool(self.bracket_regex.search(cleaned)) or bool( + self.pipe_spacing_regex.search(cleaned) + ): return self.shortdesc.format(var_name=v) return False @@ -51,7 +56,9 @@ def matchyaml(self, file: Lintable) -> List["MatchError"]: for k, v, path in nested_items_path(data): if isinstance(v, AnsibleUnicode): cleaned = self.exclude_json_re.sub("", v) - if bool(self.bracket_regex.search(cleaned)): + if bool(self.bracket_regex.search(cleaned)) or bool( + self.pipe_spacing_regex.search(cleaned) + ): path_elem = [ f"[{i}]" if isinstance(i, int) else i for i in path + [k] ] @@ -85,7 +92,7 @@ def matchyaml(self, file: Lintable) -> List["MatchError"]: @pytest.fixture(name="error_expected_lines") def fixture_error_expected_lines() -> List[int]: """Return list of expected error lines.""" - return [24, 27, 30, 56, 67] + return [30, 33, 36, 39, 42, 45, 71, 82] @pytest.fixture(name="test_playbook") def fixture_test_playbook() -> str: @@ -119,6 +126,9 @@ def fixture_error_expected_details_varsfile() -> List[str]: ".bad_var_1", ".bad_var_2", ".bad_var_3", + ".bad_var_4", + ".bad_var_5", + ".bad_var_6", ".invalid_multiline_nested_json", ".invalid_nested_json", ] @@ -126,7 +136,7 @@ def fixture_error_expected_details_varsfile() -> List[str]: @pytest.fixture(name="error_expected_lines_varsfile") def fixture_error_expected_lines_varsfile() -> List[int]: """Return list of expected error lines.""" - return [12, 13, 14, 27, 33] + return [14, 15, 16, 17, 18, 19, 32, 38] @pytest.fixture(name="test_varsfile_path") def fixture_test_varsfile_path() -> str: