AVD Ecosystem - Jinja2 Linter
The goal of this project is to build a Jinja2 linter that will provide the following capabilities:
- Validate syntax according to AVD style guide: https://avd.sh/en/latest/docs/contribution/style-guide.html
- Develop extension that works with VSCode and potentianly others IDEs i.e PyCharm
- if supporting multiple IDEs adds to much complexity, support for VSCode will take priority
- Capability to run as a GitHub Action and used to enforce style in our CI pipeline
Syntax and code style issues detected by Jinja2 Linter are:
- S0 Jinja2 syntax should be correct
- S1 A single space shall be added between Jinja2 curly brackets and a variable’s name
- S2 When variables are used in combination with a filter, | shall be enclosed by space
- S3 Nested jinja code block shall follow next rules:
- All J2 statements must be enclosed by 1 space
- All J2 statements must be indented by 4 more spaces within jinja delimiter
- To close a control, end tag must have same indentation level
- Indentation are 4 spaces and NOT tabulation
- S7 Jinja statements should be on separate lines
- S8 Jinja statements should not have {%- or {%+ or -%} as delimeters
- VAR-1 All variables shall use lower case
- VAR-2 If variable is multi-words, underscore _ shall be used as a separator
To get started, clone the Jinja2 Linter project on your system:
git clone https://gitlab.aristanetworks.com/ansible-team/jinja2-linter
- Python version 3.6+
- Create a virtual environment and activate it
python3 -m venv myenv
source myenv/bin/activate
- Install pip, jinja2 and jinja2-linter
sudo apt-get install python3-pip
pip3 install jinja2
cd jinja2-linter
python setup.py install
j2lint <path-to-directory-of-templates>
j2lint <path-to-directory-of-templates>/template.j2
j2lint --list
j2lint <path-to-directory-of-templates> --verbose
j2lint <path-to-directory-of-templates> --log
To enable debug logs, use both options:
j2lint <path-to-directory-of-templates> --log --debug
j2lint <path-to-directory-of-templates> --json
- The --ignore option can have one or more of these values: syntax-error, single-space-decorator, filter-enclosed-by-spaces, jinja-statement-single-space, jinja-statements-indentation, no-tabs, single-statement-per-line, jinja-delimeter, jinja-variable-lower-case, jinja-variable-format.
- If multiple rules are to be ignored, use the --ignore option along with rule descriptions separated by space.
j2lint <path-to-directory-of-templates> --ignore <rule_description1> <rule_desc>
- If one or more linting rules are to be ignored only for a specific jinja template file, add a Jinja comment at the top of the file. The rule can be disabled using the short description of the rule or the id of the rule.
{# j2lint: disable=S8}
OR
{# j2lint: disable=jinja-delimeter #}
- Disabling multiple rules
{# j2lint: disable=jinja-delimeter j2lint: disable=S1 #}
- Create a new rules directory under j2lint folder.
- Add custom rule classes which are similar to classes in j2lint/rules directory.
- Run the jinja2 linter using --rules-dir option
j2lint <path-to-directory-of-templates> --rules_dir <custom-rules-directory>
Note: This runs the custom linting rules in addition to the default linting rules.
j2lint --help
j2lint --stdin