https://github.com/feluelle/airflint
Enforce Best Practices for all your Airflow DAGs. ⭐
https://github.com/feluelle/airflint
airflow best-practices dag formatter linter
Last synced: over 1 year ago
JSON representation
Enforce Best Practices for all your Airflow DAGs. ⭐
- Host: GitHub
- URL: https://github.com/feluelle/airflint
- Owner: feluelle
- License: apache-2.0
- Created: 2022-04-04T13:33:06.000Z (over 4 years ago)
- Default Branch: main
- Last Pushed: 2025-03-24T17:45:10.000Z (over 1 year ago)
- Last Synced: 2025-03-28T23:02:59.364Z (over 1 year ago)
- Topics: airflow, best-practices, dag, formatter, linter
- Language: Python
- Homepage:
- Size: 331 KB
- Stars: 98
- Watchers: 3
- Forks: 2
- Open Issues: 4
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# airflint
[](https://results.pre-commit.ci/latest/github/feluelle/airflint/main)


[](https://codecov.io/gh/feluelle/airflint)
[](https://pypi.org/project/airflint/)
[](https://github.com/feluelle/airflint/blob/main/LICENSE)
[](https://pypi.org/project/airflint/)
[](https://pypi.org/project/airflint/)
> Enforce Best Practices for all your Airflow DAGs. ⭐
⚠️ **airflint is still in alpha stage and has not been tested with real world Airflow DAGs. Please report any issues you face via [GitHub Issues](https://github.com/feluelle/airflint/issues), thank you. 🙏**
## 🧑🏫 Rules
- [x] Use function-level imports instead of top-level imports[^1][^2] (see [Top level Python Code](https://airflow.apache.org/docs/apache-airflow/stable/best-practices.html#top-level-python-code))
- [x] Use jinja template syntax instead of `Variable.get` (see [Airflow Variables](https://airflow.apache.org/docs/apache-airflow/stable/best-practices.html#airflow-variables))
[^1]: There is a PEP for [Lazy Imports](https://peps.python.org/pep-0690/) targeted to arrive in Python 3.12 which would supersede this rule.
[^2]: To remove top-level imports after running `UseFunctionLevelImports` rule, use a tool such as [autoflake](https://github.com/PyCQA/autoflake).
_based on official [Best Practices](https://airflow.apache.org/docs/apache-airflow/stable/best-practices.html)_
## Requirements
airflint is tested with:
| | Main version (dev) | Released version (0.3.2-alpha) |
|----------------|----------------------------------------|--------------------------------|
| Python | 3.9, 3.10, 3.11, 3.12.0-alpha - 3.12.0 | 3.9, 3.10 |
| Apache Airflow | >= 2.0.0 | >= 2.0.0 |
## 🚀 Get started
To install it from [PyPI](https://pypi.org/) run:
```console
pip install airflint
```
> **_NOTE:_** It is recommended to install airflint into your existing airflow environment with all your providers included. This way `UseJinjaVariableGet` rule can detect all `template_fields` and airflint works as expected.
Then just call it like this:

### pre-commit
Alternatively you can add the following repo to your `pre-commit-config.yaml`:
```yaml
- repo: https://github.com/feluelle/airflint
rev: v0.3.2-alpha
hooks:
- id: airflint
args: ["-a"] # Use -a to apply the suggestions
additional_dependencies: # Add all package dependencies you have in your dags, preferable with version spec
- apache-airflow
- apache-airflow-providers-cncf-kubernetes
```
To complete the `UseFunctionlevelImports` rule, please add the `autoflake` hook after the `airflint` hook, as below:
```yaml
- repo: https://github.com/pycqa/autoflake
rev: v1.4
hooks:
- id: autoflake
args: ["--remove-all-unused-imports", "--in-place"]
```
This will remove unused imports.
## ❤️ Contributing
I am looking for contributors who are interested in..
- testing airflint with real world Airflow DAGs and reporting issues as soon as they face them
- optimizing the ast traversing for existing rules
- adding new rules based on best practices or bottlenecks you have experienced during Airflow DAGs authoring
- documenting about what is being supported in particular by each rule
- defining supported airflow versions i.e. some rules are bound to specific Airflow features and version
For questions, please don't hesitate to open a GitHub issue.