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

# Details: https://github.com/kaxil/boring-cyborg

labelPRBasedOnFilePath:
  provider:Google:
    - airflow/providers/google/*
    - airflow/providers/google/**/*
    - docs/howto/connection/gcp.rst
    - docs/howto/connection/gcp_sql.rst
    - docs/howto/operator/google/*
    - tests/providers/google/*
    - tests/providers/google/**/*

  provider:AWS:
    - airflow/providers/amazon/aws/**/*
    - tests/providers/amazon/aws/**/*
    - tests/providers/amazon/aws/*
    - docs/howto/connection/aws.rst
    - docs/howto/operator/amazon/aws/*

  provider:Azure:
    - airflow/providers/microsoft/azure/**/*
    - tests/providers/microsoft/azure/**/*
    - tests/providers/microsoft/azure/*
    - docs/howto/connection/azure.rst

  provider:Apache:
    - airflow/providers/apache/**/*
    - docs/howto/operator/apache/*
    - tests/providers/apache/*
    - tests/providers/apache/**/*

  area:kubernetes:
    - airflow/**/kubernetes_*.py
    - airflow/example_dags/example_kubernetes_executor.py
    - airflow/example_dags/example_kubernetes_executor_config.py
    - airflow/kubernetes/**/*
    - docs/executor/kubernetes.rst
    - docs/howto/connection/kubernetes.rst
    - docs/howto/operator/kubernetes.rst
    - docs/kubernetes.rst
    - tests/runtime/kubernetes/*

  area:API:
    - airflow/api/*
    - airflow/api/**/*
    - airflow/api_connexion/*
    - airflow/api_connexion/**/*
    - airflow/www/api/*
    - airflow/www/api/**/*
    - clients/*
    - clients/**/*
    - docs/rest-api-ref.rst
    - docs/stable-rest-api/*
    - docs/stable-rest-api/**/*
    - tests/api_connexion/*
    - tests/api_connexion/**/*
    - tests/www/api/*
    - tests/www/api/**/*

  area:dev-tools:
    - airflow/mypy/*
    - airflow/mypy/**/*
    - scripts/**/*
    - scripts/*
    - dev/**/*
    - dev/*
    - .github/**/*
    - .github/*
    - breeze
    - Dockerfile.ci
    - BREEZE.rst
    - breeze-complete
    - confirm
    - CONTRIBUTING.*
    - LOCAL_VIRTUALENV.rst
    - STATIC_CODE_CHECKS.rst
    - TESTING.rst
    - yamllint-config.yml
    - .asf.yaml
    - .bash_completion
    - .dockerignore
    - .flake8
    - .hadolint.yaml
    - .pre-commit-config.yaml
    - .rat-excludes
    - .readthedocs.yml
    - .travis.yml
    - airflow/www/.eslintignore
    - airflow/www/.eslintrc
    - airflow/www/.stylelintignore
    - airflow/www/.stylelintrc

  kind:documentation:
    - docs/**/*
    - docs/*

  area:helm-chart:
    - chart/**/*
    - chart/*

  area:Webserver:
    - airflow/cli/commands/webserver_command.py
    - airflow/www/**/*
    - airflow/www_rbac/**/*
    - tests/cli/commands/test_webserver_command.py
    - tests/www/**/*
    - tests/www/*
    - tests/www_rbac/**/*
    - tests/www_rbac/*

  area:UI:
    - airflow/www/static/**/*
    - airflow/www/static/*
    - airflow/www/templates/**/*
    - airflow/www/templates/*
    - airflow/www/.eslintignore
    - airflow/www/.eslintrc
    - airflow/www/.stylelintignore
    - airflow/www/.stylelintrc
    - airflow/www/compile_assets.sh
    - airflow/www/package.json
    - airflow/www/webpack.config.js
    - airflow/www/yarn.lock
    - docs/ui.rst

  area:CLI:
    - airflow/bin/cli.py
    - airflow/cli/**/*.py
    - tests/cli/**/*.py
    - docs/cli-and-env-variables-ref.rst
    - docs/usage-cli.rst

  area:Lineage:
    - airflow/lineage/**/*
    - airflow/lineage/*
    - tests/lineage/*
    - docs/lineage.rst

  area:Logging:
    - airflow/providers/**/log/*
    - airflow/utils/log/*
    - docs/howto/write-logs.rst
    - tests/providers/**/log/*
    - tests/utils/log/*
    - tests/utils/log/**/*

  area:Plugins:
    - airflow/cli/commands/plugins_command.py
    - airflow/plugins_manager.py
    - tests/cli/commands/test_plugins_command.py
    - tests/plugins/*
    - docs/plugins.rst

  area:Scheduler/Executor:
    - airflow/executors/*
    - airflow/jobs/*
    - airflow/task/task_runner/*
    - airflow/utils/dag_processing.py
    - docs/executor/*
    - docs/scheduler.rst
    - tests/executors/*
    - tests/jobs/*

  area:Secrets:
    - airflow/secrets/*
    - airflow/providers/**/secrets/*
    - tests/secrets/*
    - tests/providers/**/secrets/*
    - docs/howto/secrets-backend/*

  area:Serialization:
    - airflow/serialization/*
    - airflow/models/serialized_dag.py
    - tests/serialization/*
    - tests/models/test_serialized_dag.py
    - docs/dag-serialization.rst

# Various Flags to control behaviour of the "Labeler"
labelerFlags:
  # If this flag is changed to 'false', labels would only be added when the PR is first created
  # and not when existing PR is updated.
  # The default is 'true' which means the labels would be added when PR is updated even if they
  # were removed by the user
  labelOnPRUpdates: false

# Comment to be posted to welcome users when they open their first PR
firstPRWelcomeComment: >
  Congratulations on your first Pull Request and welcome to the Apache Airflow community!
  If you have any issues or are unsure about any anything please check our
  Contribution Guide (https://github.com/apache/airflow/blob/master/CONTRIBUTING.rst)

  Here are some useful points:

  - Pay attention to the quality of your code (flake8, pylint and type annotations). Our [pre-commits](
  https://github.com/apache/airflow/blob/master/STATIC_CODE_CHECKS.rst#prerequisites-for-pre-commit-hooks)
  will help you with that.

  - In case of a new feature add useful documentation (in docstrings or in `docs/` directory).
  Adding a new operator? Check this short
  [guide](https://github.com/apache/airflow/blob/master/docs/howto/custom-operator.rst)
  Consider adding an example DAG that shows how users should use it.

  - Consider using [Breeze environment](https://github.com/apache/airflow/blob/master/BREEZE.rst) for testing
  locally, it’s a heavy docker but it ships with a working Airflow and a lot of integrations.

  - Be patient and persistent. It might take some time to get a review or get the final approval from
  Committers.

  - Please follow [ASF Code of Conduct](https://www.apache.org/foundation/policies/conduct) for all
  communication including (but not limited to) comments on Pull Requests, Mailing list and Slack.

  - Be sure to read the [Airflow Coding style](
  https://github.com/apache/airflow/blob/master/CONTRIBUTING.rst#coding-style-and-best-practices).

  Apache Airflow is a community-driven project and together we are making it better 🚀.

  In case of doubts contact the developers at:

  Mailing List: dev@airflow.apache.org

  Slack: https://s.apache.org/airflow-slack

# Comment to be posted to congratulate user on their first merged PR
firstPRMergeComment: >
  Awesome work, congrats on your first merged pull request!

# Comment to be posted to on first time issues
firstIssueWelcomeComment: >
  Thanks for opening your first issue here! Be sure to follow the issue template!

checkUpToDate:
  - airflow/migrations/*
  - airflow/migrations/**/*
  - airflow/alembic.ini
