# Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. --- default_stages: [commit, push] default_language_version: # force all unspecified python hooks to run python3 python: python3 minimum_pre_commit_version: "1.20.0" repos: - repo: meta hooks: - id: identity - id: check-hooks-apply - repo: https://github.com/Lucas-C/pre-commit-hooks rev: v1.1.9 hooks: - id: forbid-tabs exclude: ^docs/Makefile$|^clients/gen/go.sh|\.gitmodules$ - id: insert-license name: Add license for all SQL files files: \.sql$ exclude: ^\.github/.*$ args: - --comment-style - "/*||*/" - --license-filepath - license-templates/LICENSE.txt - --fuzzy-match-generates-todo - id: insert-license name: Add license for all other files exclude: ^\.github/.*$ args: - --comment-style - "|#|" - --license-filepath - license-templates/LICENSE.txt - --fuzzy-match-generates-todo files: > \.properties$|\.cfg$|\.conf$|\.ini$|\.ldif$|\.readthedocs$|\.service$|\.tf$|Dockerfile.*$ - id: insert-license name: Add license for all rst files exclude: ^\.github/.*$ args: - --comment-style - "||" - --license-filepath - license-templates/LICENSE.rst - --fuzzy-match-generates-todo files: \.rst$ - id: insert-license name: Add license for all JS/CSS/PUML files files: \.(js|css|puml)$ exclude: ^\.github/.*$ args: - --comment-style - "/*!| *| */" - --license-filepath - license-templates/LICENSE.txt - --fuzzy-match-generates-todo - id: insert-license name: Add license for all JINJA template files files: "^airflow/www/templates/.*\\.html$|^docs/templates/.*\\.html$.*\\.jinja2" exclude: ^\.github/.*$ args: - --comment-style - "{#||#}" - --license-filepath - license-templates/LICENSE.txt - --fuzzy-match-generates-todo - id: insert-license name: Add license for all shell files exclude: ^\.github/.*$ files: ^breeze$|^breeze-complete$|\.sh$|\.bash$|\.bats$ args: - --comment-style - "|#|" - --license-filepath - license-templates/LICENSE.txt - --fuzzy-match-generates-todo - id: insert-license name: Add license for all python files exclude: ^\.github/.*$ types: [python] args: - --comment-style - "|#|" - --license-filepath - license-templates/LICENSE.txt - --fuzzy-match-generates-todo - id: insert-license name: Add license for all XML files exclude: ^\.github/.*$ files: \.xml$ args: - --comment-style - "" - --license-filepath - license-templates/LICENSE.txt - --fuzzy-match-generates-todo - id: insert-license name: Add license for all yaml files exclude: ^\.github/.*$ types: [yaml] files: \.yml$|\.yaml$ args: - --comment-style - "|#|" - --license-filepath - license-templates/LICENSE.txt - --fuzzy-match-generates-todo - id: insert-license name: Add license for all md files files: \.md$ exclude: ^\.github/.*$|PROVIDER_CHANGES.*\.md args: - --comment-style - "" - --license-filepath - license-templates/LICENSE.txt - --fuzzy-match-generates-todo - id: insert-license name: Add license for all mermaid files args: - --comment-style - "|%%|" - --license-filepath - license-templates/LICENSE.txt - --fuzzy-match-generates-todo files: \.mermaid$ - repo: https://github.com/thlorenz/doctoc.git rev: v2.0.0 hooks: - id: doctoc name: Add TOC for md files files: ^README\.md$|^CONTRIBUTING\.md$|^UPDATING.*.md$|^dev/.*.md$ args: - "--maxlevel" - "2" - repo: https://github.com/psf/black rev: 20.8b1 hooks: - id: black args: [--config=./pyproject.toml] - repo: https://github.com/pre-commit/pre-commit-hooks rev: v3.4.0 hooks: - id: check-merge-conflict - id: debug-statements - id: check-builtin-literals - id: detect-private-key - id: end-of-file-fixer - id: mixed-line-ending - id: check-executables-have-shebangs - id: check-xml - id: trailing-whitespace - id: fix-encoding-pragma args: - --remove - repo: https://github.com/asottile/pyupgrade rev: v2.7.4 hooks: - id: pyupgrade args: ["--py36-plus"] - repo: https://github.com/pre-commit/pygrep-hooks rev: v1.7.0 hooks: - id: rst-backticks - id: python-no-log-warn - repo: https://github.com/adrienverge/yamllint rev: v1.25.0 hooks: - id: yamllint name: Check yaml files with yamllint entry: yamllint -c yamllint-config.yml --strict types: [yaml] exclude: ^.*init_git_sync\.template\.yaml$|^.*airflow\.template\.yaml$|^chart/(?:templates|files)/.*\.yaml - repo: https://github.com/timothycrosley/isort rev: 5.6.4 hooks: - id: isort name: Run isort to sort imports files: \.py$ # To keep consistent with the global isort skip config defined in setup.cfg exclude: ^build/.*$|^.tox/.*$|^venv/.*$ - repo: https://github.com/pycqa/pydocstyle rev: 5.1.1 hooks: - id: pydocstyle name: Run pydocstyle args: - --convention=pep257 - --add-ignore=D100,D102,D104,D105,D107,D205,D400,D401 exclude: | (?x) ^tests/.*\.py$| ^scripts/.*\.py$| ^dev| ^provider_packages| ^kubernetes_tests| .*example_dags/.*| ^chart/.*\.py$ - repo: local hooks: - id: lint-openapi name: Lint OpenAPI using spectral language: docker_image entry: stoplight/spectral lint -r ./scripts/ci/spectral_rules/connexion.yml files: ^airflow/api_connexion/openapi/ - id: lint-openapi name: Lint OpenAPI using openapi-spec-validator entry: openapi-spec-validator --schema 3.0.0 language: python additional_dependencies: ['openapi-spec-validator'] files: ^airflow/api_connexion/openapi/ - id: lint-dockerfile name: Lint dockerfile language: system entry: "./scripts/ci/pre_commit/pre_commit_lint_dockerfile.sh" files: Dockerfile.*$ pass_filenames: true - id: setup-order name: Check order of dependencies in setup.py and setup.cfg language: python files: ^setup.py$|^setup.cfg$ pass_filenames: false entry: ./scripts/ci/pre_commit/pre_commit_check_order_setup.py additional_dependencies: ['rich'] - id: setup-extra-packages name: Checks setup extra packages description: Checks if all the libraries in setup.py are listed in extra-packages-ref.rst file language: python files: ^setup.py$|^docs/apache-airflow/extra-packages-ref.rst$ pass_filenames: false entry: ./scripts/ci/pre_commit/pre_commit_check_setup_extra_packages_ref.py additional_dependencies: ['rich==9.2.0'] - id: update-breeze-file name: Update output of breeze command in BREEZE.rst entry: "./scripts/ci/pre_commit/pre_commit_breeze_cmd_line.sh" language: system files: ^BREEZE.rst$|^breeze$|^breeze-complete$ pass_filenames: false - id: update-local-yml-file name: Update mounts in the local yml file entry: "./scripts/ci/pre_commit/pre_commit_local_yml_mounts.sh" language: system files: ^scripts/ci/libraries/_local_mounts.sh$|s^scripts/ci/docker_compose/local.yml" pass_filenames: false - id: update-setup-cfg-file name: Update setup.cfg file with all licenses entry: "./scripts/ci/pre_commit/pre_commit_setup_cfg_file.sh" language: system files: ^setup.cfg$ pass_filenames: false - id: build-providers-dependencies name: Build cross-dependencies for providers packages entry: "./scripts/ci/pre_commit/pre_commit_build_providers_dependencies.sh" language: system files: ^airflow/providers/.*\.py$|^tests/providers/.*\.py$ pass_filenames: false - id: update-extras name: Update extras in documentation entry: ./scripts/ci/pre_commit/pre_commit_insert_extras.py language: python files: ^setup.py$|^INSTALL$|^CONTRIBUTING.rst$ pass_filenames: false - id: pydevd language: pygrep name: Check for pydevd debug statements accidentally left entry: "pydevd.*settrace\\(" pass_filenames: true files: \.py$ - id: dont-use-safe-filter language: pygrep name: Don't use safe in templates description: the Safe filter is error-prone, use Markup() in code instead entry: "\\|\\s*safe" files: \.html$ pass_filenames: true - id: no-providers-in-core-examples language: pygrep name: No providers imports in core example DAGs description: The core example DAGs have no dependencies other than core Airflow entry: "^\\s*from airflow\\.providers.*" pass_filenames: true files: ^airflow/example_dags/.*\.py$ - id: no-relative-imports language: pygrep name: No relative imports description: Airflow style is to use absolute imports only entry: "^\\s*from\\s+\\." pass_filenames: true files: \.py$ exclude: ^tests/ - id: language-matters language: pygrep name: Check for language that we do not accept as community description: Please use "deny_list" or "allow_list" instead. entry: "(?i)(black|white)[_-]?list" pass_filenames: true exclude: > (?x) ^airflow/providers/apache/cassandra/hooks/cassandra.py$| ^airflow/providers/apache/hive/operators/hive_stats.py$| ^airflow/providers/apache/hive/.*PROVIDER_CHANGES_*| ^airflow/providers/apache/hive/.*README.md$| ^tests/providers/apache/cassandra/hooks/test_cassandra.py$| ^docs/apache-airflow-providers-apache-cassandra/connections/cassandra.rst$| ^CHANGELOG.txt$ - id: consistent-pylint language: pygrep name: Check for inconsistent pylint disable/enable without space entry: "pylint:disable|pylint:enable" pass_filenames: true files: \.py$ - id: base-operator language: pygrep name: Check BaseOperator[Link] core imports description: Make sure BaseOperator[Link] is imported from airflow.models.baseoperator in core entry: "from airflow\\.models import.* BaseOperator" files: \.py$ pass_filenames: true exclude: > (?x) ^airflow/gcp/.*$| ^airflow/hooks/.*$| ^airflow/operators/.*$| ^airflow/sensors/.*$| ^airflow/providers/.*$| ^dev/provider_packages/.*$ - id: base-operator language: pygrep name: Check BaseOperator[Link] other imports description: Make sure BaseOperator[Link] is imported from airflow.models outside of core entry: "from airflow\\.models\\.baseoperator import.* BaseOperator" pass_filenames: true files: > (?x) ^airflow/gcp/.*$| ^airflow/hooks/.*$| ^airflow/operators/.*$| ^airflow/sensors/.*$| ^airflow/providers/.*\.py$ - id: provide-create-sessions language: pygrep name: Check provide_session and create_session imports description: provide_session and create_session should be imported from airflow.utils.session to avoid import cycles. entry: "from airflow\\.utils\\.db import.* (provide_session|create_session)" files: \.py$ pass_filenames: true - id: incorrect-use-of-LoggingMixin language: pygrep name: Make sure LoggingMixin is not used alone entry: "LoggingMixin\\(\\)" files: \.py$ pass_filenames: true - id: daysago-import-check language: pygrep name: Make sure days_ago is imported from airflow.utils.dates entry: "(airflow\\.){0,1}utils\\.dates\\.days_ago" files: \.py$ pass_filenames: true - id: restrict-start_date language: pygrep name: "'start_date' should not be defined in default_args in example_dags" entry: "default_args\\s*=\\s*{\\s*(\"|')start_date(\"|')|(\"|')start_date(\"|'):" files: \.*example_dags.*.py$ pass_filenames: true - id: check-integrations name: Check if integration list is aligned entry: ./scripts/ci/pre_commit/pre_commit_check_integrations.sh language: system pass_filenames: false files: ^common/_common_values.sh$|^breeze-complete$ - id: check-apache-license name: Check if licenses are OK for Apache entry: "./scripts/ci/pre_commit/pre_commit_check_license.sh" language: system files: ^.*LICENSE.*$|^.*LICENCE.*$ pass_filenames: false - id: airflow-config-yaml name: Checks for consistency between config.yml and default_config.cfg language: python entry: ./scripts/ci/pre_commit/pre_commit_yaml_to_cfg.py files: "config.yml$|default_airflow.cfg$|default.cfg$" pass_filenames: false require_serial: true additional_dependencies: ['pyyaml'] - id: sort-in-the-wild name: Sort INTHEWILD.md alphabetically entry: ./scripts/ci/pre_commit/pre_commit_sort_in_the_wild.sh language: system files: ^.pre-commit-config.yaml$|^INTHEWILD.md$ require_serial: true - id: helm-lint name: Lint Helm Chart entry: ./scripts/ci/pre_commit/pre_commit_helm_lint.sh language: system pass_filenames: false files: ^chart require_serial: true - id: shellcheck name: Check Shell scripts syntax correctness language: docker_image entry: koalaman/shellcheck:stable -x -a files: ^breeze$|^breeze-complete$|\.sh$|^hooks/build$|^hooks/push$|\.bash$|\.bats$ - id: bats-tests name: Run BATS bash tests for changed Breeze bash files language: system entry: "./scripts/ci/pre_commit/pre_commit_bat_tests.sh tests/bats/breeze/" files: ^breeze$|^breeze-complete$|^tests/bats/breeze pass_filenames: false - id: bats-tests name: Run BATS bash tests for changed bash files language: system entry: "./scripts/ci/pre_commit/pre_commit_bat_tests.sh" files: \.sh$|\.bash$|\.bats$ exclude: ^tests/bats/in_container|^scripts/in_container|^tests/bats/breeze pass_filenames: true require_serial: true - id: stylelint name: stylelint entry: "stylelint" language: node files: ^airflow/www/.*\.(css|scss|sass)$ # Keep dependency versions in sync w/ airflow/www/package.json additional_dependencies: ['stylelint@13.3.1', 'stylelint-config-standard@20.0.0'] - id: providers-init-file name: Provider init file pass_filenames: false always_run: true entry: ./scripts/ci/pre_commit/pre_commit_check_providers_init.sh language: system - id: provider-yamls name: Validate providers.yaml files pass_filenames: false entry: ./scripts/ci/pre_commit/pre_commit_check_provider_yaml_files.py language: python require_serial: true files: provider.yaml$|scripts/ci/pre_commit/pre_commit_check_provider_yaml_files.py$|^docs/ additional_dependencies: ['PyYAML==5.3.1', 'jsonschema==3.2.0', 'tabulate==0.8.7'] - id: mermaid name: Generate mermaid images entry: ./scripts/ci/pre_commit/pre_commit_mermaid.sh language: system files: \.mermaid$ require_serial: true - id: pre-commit-descriptions name: Check if pre-commits are described entry: ./scripts/ci/pre_commit/pre_commit_check_pre_commits.sh language: system files: ^.pre-commit-config.yaml$|^STATIC_CODE_CHECKS.rst|^breeze-complete$ require_serial: true - id: pre-commit-hook-names name: Ensure hook ids are not overly long entry: ./scripts/ci/pre_commit/pre_commit_check_pre_commit_hook_names.py args: - --max-length=70 language: python files: ^.pre-commit-config.yaml$ additional_dependencies: ['pyyaml'] require_serial: true pass_filenames: false - id: airflow-providers-available name: Checks providers available when declared by extras in setup.py language: python entry: ./scripts/ci/pre_commit/pre_commit_check_extras_have_providers.py files: "setup.py|^airflow/providers/.*.py" pass_filenames: false require_serial: true additional_dependencies: ['rich'] - id: markdownlint name: Run markdownlint description: "Checks the style of Markdown files." entry: markdownlint language: node types: [markdown] files: \.(md|mdown|markdown)$ additional_dependencies: ['markdownlint-cli'] - id: json-schema name: Lint JSON Schema files with JSON Schema entry: ./scripts/ci/pre_commit/pre_commit_json_schema.py args: - --spec-url - https://json-schema.org/draft-07/schema language: python pass_filenames: true files: .*\.schema\.json$ require_serial: true additional_dependencies: ['jsonschema==3.2.0', 'PyYAML==5.3.1', 'requests==2.25.0'] - id: json-schema name: Lint JSON Schema files with JSON Schema entry: ./scripts/ci/pre_commit/pre_commit_json_schema.py args: - --spec-url - https://raw.githubusercontent.com/instrumenta/kubernetes-json-schema/master/v1.14.9/service-v1.json language: python pass_filenames: true files: scripts/ci/kubernetes/nodeport.yaml require_serial: true additional_dependencies: ['jsonschema==3.2.0', 'PyYAML==5.3.1', 'requests==2.25.0'] - id: json-schema name: Lint Docker compose files with JSON Schema entry: ./scripts/ci/pre_commit/pre_commit_json_schema.py args: - --spec-url - https://raw.githubusercontent.com/compose-spec/compose-spec/master/schema/compose-spec.json language: python pass_filenames: true files: scripts/ci/docker-compose/.+.yml require_serial: true additional_dependencies: ['jsonschema==3.2.0', 'PyYAML==5.3.1', 'requests==2.25.0'] - id: json-schema name: Lint chart/values.yaml file with JSON Schema entry: ./scripts/ci/pre_commit/pre_commit_json_schema.py args: - --spec-file - chart/values.schema.json language: python pass_filenames: true files: chart/values.yaml$ require_serial: true additional_dependencies: ['jsonschema==3.2.0', 'PyYAML==5.3.1', 'requests==2.25.0'] - id: json-schema name: Lint airflow/config_templates/config.yml file with JSON Schema entry: ./scripts/ci/pre_commit/pre_commit_json_schema.py args: - --spec-file - airflow/config_templates/config.yml.schema.json language: python pass_filenames: true files: airflow/config_templates/config.yml$ require_serial: true additional_dependencies: ['jsonschema==3.2.0', 'PyYAML==5.3.1', 'requests==2.25.0'] ## ADD MOST PRE-COMMITS ABOVE THAT LINE # The below pre-commits are those requiring CI image to be built - id: build name: Check if image build is needed entry: ./scripts/ci/pre_commit/pre_commit_ci_build.sh 3.6 false language: system always_run: true pass_filenames: false - id: mypy name: Run mypy language: system entry: "./scripts/ci/pre_commit/pre_commit_mypy.sh" files: \.py$ exclude: ^dev|^provider_packages|^chart|^docs - id: mypy name: Run mypy for helm chart tests language: system entry: "./scripts/ci/pre_commit/pre_commit_mypy.sh" files: ^chart/.*\.py$ require_serial: true - id: mypy name: Run mypy for /docs/ folder language: system entry: "./scripts/ci/pre_commit/pre_commit_mypy.sh" files: ^docs/.*\.py$ exclude: rtd-deprecation require_serial: true - id: pylint name: Run pylint language: system entry: "./scripts/ci/pre_commit/pre_commit_pylint.sh" files: \.py$ exclude: ^scripts/.*\.py$|^dev|^provider_packages|^chart pass_filenames: true require_serial: true - id: pylint name: Run pylint for helm chart tests language: system entry: "./scripts/ci/pre_commit/pre_commit_pylint.sh" files: ^chart/.*\.py$ pass_filenames: true require_serial: true - id: flake8 name: Run flake8 language: system entry: "./scripts/ci/pre_commit/pre_commit_flake8.sh" files: \.py$ pass_filenames: true - id: bats-in-container-tests name: Run in container bats tests language: system entry: "./scripts/ci/pre_commit/pre_commit_in_container_bats_test.sh" files: ^tests/bats/in_container/.*.bats$|^scripts/in_container/.*sh pass_filenames: false ## ONLY ADD PRE-COMMITS HERE THAT REQUIRE CI IMAGE