Skip to main content

Command-line utility that validates jinja2 syntax according to Arista's AVD style guide.

Project description

GitHub license PyPI version fury.io PyPI pyversions PyPI status Maintenance codecov Quality Gate Status

Jinja2-Linter

AVD Ecosystem - Jinja2 Linter

Project Goals

Build a Jinja2 linter that will provide the following capabilities:

  • Validate syntax according to AVD style guide.
  • Capability to run as part of a CI pipeline to enforce j2lint rules.
  • Develop an extension that works with VSCode and potentially other IDEs i.e PyCharm.

Syntax and code style issues

Code Short Description Description
S0 jinja-syntax-error Jinja2 syntax should be correct
S1 single-space-decorator A single space should be added between Jinja2 curly brackets and a variable's name
S2 operator-enclosed-by-spaces When variables are used in combination with an operator, the operator shall be enclosed by space
S3 jinja-statements-indentation Nested jinja code block should 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
S4 jinja-statements-single-space Jinja statement should have at least a single space after '{%' and a single space before '%}'
S5 jinja-statements-no-tabs Indentation should not use tabulation but 4 spaces
S6 jinja-statements-delimiter Jinja statements should not have {%- or {%+ or -%} as delimiters
S7 single-statement-per-line Jinja statements should be on separate lines, ignoring raw block contents
V1 jinja-variable-lower-case All variables should use lower case
V2 jinja-variable-format If variable is multi-words, underscore _ should be used as a separator

Getting Started

Requirements

Minimum Python version: 3.10

Install with pip

To get started, you can use Python pip to install j2lint:

Install the latest stable version:

pip3 install j2lint

Install the latest development version:

pip3 install git+https://github.com/aristanetworks/j2lint.git

Install For Development

Create a virtual environment, then install the project in editable mode with the dependency groups you need:

python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install -e . --group dev --group test --group lint --group type

If you only need a subset of the contributor tooling, install only the relevant groups.

Common Contributor Commands

pytest
tox -e lint
tox -e type
pre-commit run --all-files

Running the linter

j2lint <path-to-directory-of-templates>

Running the linter on a specific file

j2lint <path-to-directory-of-templates>/template.j2

Listing linting rules

j2lint --list

Running the linter with verbose linter error output

j2lint <path-to-directory-of-templates> --verbose

Running the linter with custom file extensions

j2lint <path-to-directory-of-templates> --extensions j2,html,yml

Running the linter with logs enabled. Logs saved in jinja2-linter.log in the current directory

j2lint <path-to-directory-of-templates> --log

To enable debug logs, use both options:

j2lint <path-to-directory-of-templates> --log --debug

Running the linter with JSON format for linter error output

j2lint <path-to-directory-of-templates> --json

Ignoring rules

  1. The --ignore option can have one or more rule IDs or short descriptions: S0, S1, S2, S3, S4, S5, S6, S7, V1, V2, jinja-syntax-error, single-space-decorator, operator-enclosed-by-spaces, jinja-statements-single-space, jinja-statements-indentation, jinja-statements-no-tabs, single-statement-per-line, jinja-statements-delimiter, jinja-variable-lower-case, jinja-variable-format.

  2. 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>
    

Note When using the -i/--ignore or -w/--warn options, the arguments MUST either:

  • Be entered at the end of the CLI as in the example above

  • Be entered as the last options before the <path-to-directory-of-templates> with -- separator. e.g.

    j2lint --ignore <rule_description1> <rule_desc> -- <path-to-directory-of-templates>
    
  1. 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=S6 #}
    
    # OR
    {# j2lint: disable=jinja-statements-delimiter #}
    
  2. Disabling multiple rules

    {# j2lint: disable=jinja-statements-delimiter j2lint: disable=S1 #}
    

Adding custom rules

  1. Create a new rules directory under j2lint folder.

  2. Add custom rule classes which are similar to classes in j2lint/rules directory: The file name of rules should be in snake_case and the class name should be the PascalCase version of the file name. For example:

    • File name: jinja_operator_has_spaces_rule.py
    • Class name: JinjaOperatorHasSpacesRule
  3. Run the jinja2 linter using the -r or --rules_dir option

    j2lint <path-to-directory-of-templates> -r <custom-rules-directory>
    

Note This runs the custom linting rules in addition to the default linting rules.

Running jinja2 linter help command

j2lint --help

Running jinja2 linter on STDIN template. This option can be used with VS Code

j2lint --stdin

Using j2lint as a pre-commit-hook

  1. Add j2lint pre-commit hook inside your repository in .pre-commit-config.yaml.

    - repo: https://github.com/aristanetworks/j2lint.git
        rev: <release_tag/sha>
        hooks:
        - id: j2lint
    
  2. Run pre-commit -> pre-commit run --all-files

Note When using -i/--ignore or -w/--warn argument in pre-commit, use the following syntax

- repo: https://github.com/aristanetworks/j2lint.git
    rev: <release_tag/sha>
    hooks:
    - id: j2lint
    # Using -- to separate the end of ignore from the positional arguments
    # passed to j2lint
      args: [--ignore, S3, jinja-statements-single-space, --]

Acknowledgments

This project is based on salt-lint and jinjalint

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

j2lint-1.3.0.tar.gz (34.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

j2lint-1.3.0-py3-none-any.whl (35.7 kB view details)

Uploaded Python 3

File details

Details for the file j2lint-1.3.0.tar.gz.

File metadata

  • Download URL: j2lint-1.3.0.tar.gz
  • Upload date:
  • Size: 34.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for j2lint-1.3.0.tar.gz
Algorithm Hash digest
SHA256 d6dd95fd4045efc71b1586a321163ae5988b6b0724ca51a1e2e7eeefa8cc9638
MD5 3d30c2d99e1c55e86de8e549b02d6b6b
BLAKE2b-256 569db92e24a651013e8862ca6d3571d4f63bc98b870d40c965434735ff04eb35

See more details on using hashes here.

Provenance

The following attestation bundles were made for j2lint-1.3.0.tar.gz:

Publisher: release.yml on aristanetworks/j2lint

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file j2lint-1.3.0-py3-none-any.whl.

File metadata

  • Download URL: j2lint-1.3.0-py3-none-any.whl
  • Upload date:
  • Size: 35.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for j2lint-1.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 fe552eb1184083f28acc72cf070c57caa7db67029f4869b4e096a9f4e253649f
MD5 ba1fe3f5c1dfb51966c71cff2bad3a18
BLAKE2b-256 bcbe4532ef928bf8df39813e38395598d24a1b0d276750156819d719a2e972e1

See more details on using hashes here.

Provenance

The following attestation bundles were made for j2lint-1.3.0-py3-none-any.whl:

Publisher: release.yml on aristanetworks/j2lint

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page