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

Contributors' guide
===================

Contributions are welcome and are greatly appreciated! Every little bit helps,
and credit will always be given.

This index of linked documents aims to explain the subject of contributions if you have not contributed to
any Open Source project, but it will also help people who have contributed to other projects learn about the
rules of that community.

.. contents:: :local:

New Contributor
---------------

If you are a new contributor, please follow the `Contributors Quick Start <03_contributors_quick_start.rst>`__
guide to get a gentle step-by-step introduction to setting up the development environment and making your
first contribution.

If you are new to the project, you might need some help in understanding how the dynamics
of the community works and you might need to get some mentorship from other members of the
community - mostly Airflow committers (maintainers). Mentoring new members of the community is part of
maintainers job so do not be afraid of asking them to help you. You can do it
via comments in your PR, asking on a devlist or via Slack. For your convenience,
we have a dedicated ``#new-contributors`` Slack channel where you can ask any questions
about making your first Pull Request (PR) contribution to the Airflow codebase - it's a safe space
where it is expected that people asking questions do not know a lot Airflow (yet!).
If you need help with Airflow see the Slack channel ``#user-troubleshooting``.

To check on how mentoring works for the projects under Apache Software Foundation's
`Apache Community Development - Mentoring <https://community.apache.org/mentoring/>`_.

Basic contributing tasks
------------------------

You can learn about various roles and communication channels in the Airflow project,

* `Roles in Airflow Project <01_roles_in_airflow_project.rst>`__ describes
  the roles in the Airflow project and how they relate to each other.

* `How to communicate <02_how_to_communicate.rst>`__
  describes how to communicate with the community and how to get help.

You can learn how to setup your environment for development and how to develop and test code:

* `Contributors quick start <03_contributors_quick_start.rst>`__ describes
  how to set up your development environment and make your first contribution. There are also more
  detailed documents describing how to set up your development environment for specific IDE/environment:

* `How to contribute <04_how_to_contribute.rst>`__ describes various ways how you can contribute to Airflow.

* `Pull requests <05_pull_requests.rst>`__ describes how you can create pull requests and you can learn
  there what are the pull request guidelines and coding standards.

* `Development environment <06_development_environments.rst>`__ describes the developments environment
  used in Airflow.

  * `Local virtualenv <07_local_virtualenv.rst>`__ describes the setup and details of the local virtualenv
    development environment.

  * `Breeze <../dev/breeze/doc/README.rst>`__ describes the setup and details of the Breeze development environment.

* `Static code checks <08_static_code_checks.rst>`__ describes the static code checks used in Airflow.

* `Testing <09_testing.rst>`__ describes what kind of tests we have and how to run them.

* `Building documentation <../docs/README.rst>`__ describes how to build the documentation locally.

* `Working with Git <10_working_with_git.rst>`__ describes the Git branches used in Airflow,
  how to sync your fork and how to rebase your PR.

Developing providers
--------------------

You can learn how Airflow repository is a monorepo split into airflow and provider packages,
and how to contribute to the providers:

* `Provider packages <11_provider_packages.rst>`__ describes the provider packages and how they
  are used in Airflow.


Deep dive into specific topics
------------------------------

Once you can also dive deeper into specific areas that are important for contributing to Airflow:

* `Airflow dependencies and extras <12_airflow_dependencies_and_extras.rst>`__ describes
  the dependencies - both required and optional (extras) used in Airflow.

* `Metadata database updates <13_metadata_database_updates.rst>`__ describes
  how to make changes in the metadata database.

* `Node environment setup <14_node_environment_setup.rst>`__ describes how to set up
  the node environment for Airflow UI.

* `Architecture diagram <15_architecture_diagrams.rst>`__ describes how to create and
  update the architecture diagrams embedded in Airflow documentation.

Finally there is an overview of the overall contribution workflow that you should follow

* `Contribution workflow <16_contribution_workflow.rst>`__ describes the workflow of contributing to Airflow.
