| # 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. |
| |
| [build-system] |
| requires = [ |
| "hatchling==1.29.0", |
| "packaging==26.0", |
| "pathspec==1.0.4", |
| "pluggy==1.6.0", |
| "tomli==2.4.0; python_version < '3.11'", |
| "trove-classifiers==2026.1.14.14", |
| ] |
| build-backend = "hatchling.build" |
| |
| [project] |
| name = "apache-airflow" |
| description = "Programmatically author, schedule and monitor data pipelines" |
| readme = { file = "generated/PYPI_README.md", content-type = "text/markdown" } |
| license = "Apache-2.0" |
| license-files = ["LICENSE", "NOTICE"] |
| requires-python = ">=3.10,!=3.14" |
| authors = [ |
| { name = "Apache Software Foundation", email = "dev@airflow.apache.org" }, |
| ] |
| maintainers = [ |
| { name = "Apache Software Foundation", email="dev@airflow.apache.org" }, |
| ] |
| keywords = [ "airflow", "orchestration", "workflow", "dag", "pipelines", "automation", "data" ] |
| classifiers = [ |
| "Development Status :: 5 - Production/Stable", |
| "Environment :: Console", |
| "Environment :: Web Environment", |
| "Framework :: Apache Airflow", |
| "Intended Audience :: Developers", |
| "Intended Audience :: System Administrators", |
| "Programming Language :: Python :: 3.10", |
| "Programming Language :: Python :: 3.11", |
| "Programming Language :: Python :: 3.12", |
| "Programming Language :: Python :: 3.13", |
| "Topic :: System :: Monitoring", |
| ] |
| |
| # Version is defined in src/airflow/__init__.py and it is automatically synchronized by prek |
| version = "3.2.0" |
| |
| dependencies = [ |
| "apache-airflow-task-sdk<1.3.0,>=1.2.0", |
| "apache-airflow-core==3.2.0", |
| ] |
| |
| packages = [] |
| |
| [project.optional-dependencies] |
| # Automatically generated airflow optional dependencies (update_airflow_pyproject_toml.py) |
| "all-core" = [ |
| "apache-airflow-core[all]" |
| ] |
| "async" = [ |
| "apache-airflow-core[async]" |
| ] |
| "graphviz" = [ |
| "apache-airflow-core[graphviz]" |
| ] |
| "gunicorn" = [ |
| "apache-airflow-core[gunicorn]" |
| ] |
| "kerberos" = [ |
| "apache-airflow-core[kerberos]" |
| ] |
| "memray" = [ |
| "apache-airflow-core[memray]" |
| ] |
| "otel" = [ |
| "apache-airflow-core[otel]" |
| ] |
| "statsd" = [ |
| "apache-airflow-core[statsd]" |
| ] |
| "all-task-sdk" = [ |
| "apache-airflow-task-sdk[all]" |
| ] |
| "airbyte" = [ |
| "apache-airflow-providers-airbyte>=5.0.0" |
| ] |
| "alibaba" = [ |
| "apache-airflow-providers-alibaba>=3.0.0" |
| ] |
| "amazon" = [ |
| "apache-airflow-providers-amazon>=9.0.0" |
| ] |
| "apache.cassandra" = [ |
| "apache-airflow-providers-apache-cassandra>=3.7.0" |
| ] |
| "apache.drill" = [ |
| "apache-airflow-providers-apache-drill>=2.8.1" |
| ] |
| "apache.druid" = [ |
| "apache-airflow-providers-apache-druid>=3.12.0" |
| ] |
| "apache.flink" = [ |
| "apache-airflow-providers-apache-flink>=1.6.0" |
| ] |
| "apache.hdfs" = [ |
| "apache-airflow-providers-apache-hdfs>=4.6.0" |
| ] |
| "apache.hive" = [ |
| "apache-airflow-providers-apache-hive>=8.2.1" |
| ] |
| "apache.iceberg" = [ |
| "apache-airflow-providers-apache-iceberg>=1.2.0" |
| ] |
| "apache.impala" = [ |
| "apache-airflow-providers-apache-impala>=1.5.2" |
| ] |
| "apache.kafka" = [ |
| "apache-airflow-providers-apache-kafka>=1.6.1" |
| ] |
| "apache.kylin" = [ |
| "apache-airflow-providers-apache-kylin>=3.8.0" |
| ] |
| "apache.livy" = [ |
| "apache-airflow-providers-apache-livy>=3.9.2" |
| ] |
| "apache.pig" = [ |
| "apache-airflow-providers-apache-pig>=4.6.0" |
| ] |
| "apache.pinot" = [ |
| "apache-airflow-providers-apache-pinot>=4.5.1" |
| ] |
| "apache.spark" = [ |
| "apache-airflow-providers-apache-spark>=4.11.1" |
| ] |
| "apache.tinkerpop" = [ |
| "apache-airflow-providers-apache-tinkerpop>=1.0.0" |
| ] |
| "apprise" = [ |
| "apache-airflow-providers-apprise>=1.4.1" |
| ] |
| "arangodb" = [ |
| "apache-airflow-providers-arangodb>=2.7.0" |
| ] |
| "asana" = [ |
| "apache-airflow-providers-asana>=2.7.0" |
| ] |
| "atlassian.jira" = [ |
| "apache-airflow-providers-atlassian-jira>=2.7.1" |
| ] |
| "celery" = [ |
| "apache-airflow-providers-celery>=3.8.3" |
| ] |
| "cloudant" = [ |
| "apache-airflow-providers-cloudant>=4.0.1" |
| ] |
| "cncf.kubernetes" = [ |
| "apache-airflow-providers-cncf-kubernetes>=9.0.0" |
| ] |
| "cohere" = [ |
| "apache-airflow-providers-cohere>=1.4.0" |
| ] |
| "common.ai" = [ |
| "apache-airflow-providers-common-ai>=0.0.1" # Set from local provider pyproject.toml |
| ] |
| "common.compat" = [ |
| "apache-airflow-providers-common-compat>=1.2.1" |
| ] |
| "common.io" = [ |
| "apache-airflow-providers-common-io>=1.4.2" |
| ] |
| "common.messaging" = [ |
| "apache-airflow-providers-common-messaging>=2.0.0" # Set from MIN_VERSION_OVERRIDE in update_airflow_pyproject_toml.py |
| ] |
| "common.sql" = [ |
| "apache-airflow-providers-common-sql>=1.18.0" |
| ] |
| "databricks" = [ |
| "apache-airflow-providers-databricks>=6.11.0" |
| ] |
| "datadog" = [ |
| "apache-airflow-providers-datadog>=3.8.0" |
| ] |
| "dbt.cloud" = [ |
| "apache-airflow-providers-dbt-cloud>=3.11.0" |
| ] |
| "dingding" = [ |
| "apache-airflow-providers-dingding>=3.7.0" |
| ] |
| "discord" = [ |
| "apache-airflow-providers-discord>=3.9.0" |
| ] |
| "docker" = [ |
| "apache-airflow-providers-docker>=3.14.1" |
| ] |
| "edge3" = [ |
| "apache-airflow-providers-edge3>=1.0.0" |
| ] |
| "elasticsearch" = [ |
| "apache-airflow-providers-elasticsearch>=6.5.0" # Set from MIN_VERSION_OVERRIDE in update_airflow_pyproject_toml.py |
| ] |
| "exasol" = [ |
| "apache-airflow-providers-exasol>=4.6.1" |
| ] |
| "fab" = [ |
| "apache-airflow-providers-fab>=2.2.0" # Set from MIN_VERSION_OVERRIDE in update_airflow_pyproject_toml.py |
| ] |
| "facebook" = [ |
| "apache-airflow-providers-facebook>=3.7.0" |
| ] |
| "ftp" = [ |
| "apache-airflow-providers-ftp>=3.12.0" |
| ] |
| "git" = [ |
| "apache-airflow-providers-git>=0.0.2" # Set from MIN_VERSION_OVERRIDE in update_airflow_pyproject_toml.py |
| ] |
| "github" = [ |
| "apache-airflow-providers-github>=2.8.0" |
| ] |
| "google" = [ |
| "apache-airflow-providers-google>=10.24.0" |
| ] |
| "grpc" = [ |
| "apache-airflow-providers-grpc>=3.7.0" |
| ] |
| "hashicorp" = [ |
| "apache-airflow-providers-hashicorp>=4.0.0" |
| ] |
| "http" = [ |
| "apache-airflow-providers-http>=4.13.2" |
| ] |
| "imap" = [ |
| "apache-airflow-providers-imap>=3.8.0" |
| ] |
| "influxdb" = [ |
| "apache-airflow-providers-influxdb>=2.8.0" |
| ] |
| "informatica" = [ |
| "apache-airflow-providers-informatica>=0.1.1" |
| ] |
| "jdbc" = [ |
| "apache-airflow-providers-jdbc>=4.5.2" |
| ] |
| "jenkins" = [ |
| "apache-airflow-providers-jenkins>=3.7.2" |
| ] |
| "keycloak" = [ |
| "apache-airflow-providers-keycloak>=0.0.1" |
| ] |
| "microsoft.azure" = [ |
| "apache-airflow-providers-microsoft-azure>=10.5.1" |
| ] |
| "microsoft.mssql" = [ |
| "apache-airflow-providers-microsoft-mssql>=3.9.2" |
| ] |
| "microsoft.psrp" = [ |
| "apache-airflow-providers-microsoft-psrp>=3.0.0" |
| ] |
| "microsoft.winrm" = [ |
| "apache-airflow-providers-microsoft-winrm>=3.6.1" |
| ] |
| "mongo" = [ |
| "apache-airflow-providers-mongo>=4.2.2" |
| ] |
| "mysql" = [ |
| "apache-airflow-providers-mysql>=5.7.2" |
| ] |
| "neo4j" = [ |
| "apache-airflow-providers-neo4j>=3.8.0" |
| ] |
| "odbc" = [ |
| "apache-airflow-providers-odbc>=4.8.0" |
| ] |
| "openai" = [ |
| "apache-airflow-providers-openai>=1.5.0" |
| ] |
| "openfaas" = [ |
| "apache-airflow-providers-openfaas>=3.7.0" |
| ] |
| "openlineage" = [ |
| "apache-airflow-providers-openlineage>=2.3.0" # Set from MIN_VERSION_OVERRIDE in update_airflow_pyproject_toml.py |
| ] |
| "opensearch" = [ |
| "apache-airflow-providers-opensearch>=1.5.0" |
| ] |
| "opsgenie" = [ |
| "apache-airflow-providers-opsgenie>=5.8.0" |
| ] |
| "oracle" = [ |
| "apache-airflow-providers-oracle>=3.12.0" |
| ] |
| "pagerduty" = [ |
| "apache-airflow-providers-pagerduty>=3.8.1" |
| ] |
| "papermill" = [ |
| "apache-airflow-providers-papermill>=3.8.2" |
| ] |
| "pgvector" = [ |
| "apache-airflow-providers-pgvector>=1.4.0" |
| ] |
| "pinecone" = [ |
| "apache-airflow-providers-pinecone>=2.1.1" |
| ] |
| "postgres" = [ |
| "apache-airflow-providers-postgres>=5.13.1" |
| ] |
| "presto" = [ |
| "apache-airflow-providers-presto>=5.7.0" |
| ] |
| "qdrant" = [ |
| "apache-airflow-providers-qdrant>=1.3.0" |
| ] |
| "redis" = [ |
| "apache-airflow-providers-redis>=4.0.0" |
| ] |
| "salesforce" = [ |
| "apache-airflow-providers-salesforce>=5.9.0" |
| ] |
| "samba" = [ |
| "apache-airflow-providers-samba>=4.9.0" |
| ] |
| "segment" = [ |
| "apache-airflow-providers-segment>=3.7.0" |
| ] |
| "sendgrid" = [ |
| "apache-airflow-providers-sendgrid>=4.0.0" |
| ] |
| "sftp" = [ |
| "apache-airflow-providers-sftp>=5.0.0" |
| ] |
| "singularity" = [ |
| "apache-airflow-providers-singularity>=3.7.0" |
| ] |
| "slack" = [ |
| "apache-airflow-providers-slack>=8.9.1" |
| ] |
| "smtp" = [ |
| "apache-airflow-providers-smtp>=1.8.1" |
| ] |
| "snowflake" = [ |
| "apache-airflow-providers-snowflake>=5.8.0" |
| ] |
| "sqlite" = [ |
| "apache-airflow-providers-sqlite>=3.9.1" |
| ] |
| "ssh" = [ |
| "apache-airflow-providers-ssh>=3.14.0" |
| ] |
| "standard" = [ |
| "apache-airflow-providers-standard>=0.0.1" |
| ] |
| "tableau" = [ |
| "apache-airflow-providers-tableau>=5.0.0" |
| ] |
| "telegram" = [ |
| "apache-airflow-providers-telegram>=4.7.0" |
| ] |
| "teradata" = [ |
| "apache-airflow-providers-teradata>=2.6.1" |
| ] |
| "trino" = [ |
| "apache-airflow-providers-trino>=5.8.1" |
| ] |
| "vertica" = [ |
| "apache-airflow-providers-vertica>=3.9.1" |
| ] |
| "weaviate" = [ |
| "apache-airflow-providers-weaviate>=3.0.0" |
| ] |
| "yandex" = [ |
| "apache-airflow-providers-yandex>=4.0.0" |
| ] |
| "ydb" = [ |
| "apache-airflow-providers-ydb>=1.4.0" |
| ] |
| "zendesk" = [ |
| "apache-airflow-providers-zendesk>=4.9.0" |
| ] |
| "all" = [ |
| "apache-airflow[aiobotocore,amazon-aws-auth,apache-atlas,apache-webhdfs,async,cloudpickle,github-enterprise,google-auth,graphviz,gunicorn,kerberos,ldap,memray,otel,pandas,polars,rabbitmq,s3fs,sentry,statsd,uv]", |
| "apache-airflow-core[all]", |
| "apache-airflow-providers-airbyte>=5.0.0", |
| "apache-airflow-providers-alibaba>=3.0.0", |
| "apache-airflow-providers-amazon>=9.0.0", |
| "apache-airflow-providers-apache-cassandra>=3.7.0", |
| "apache-airflow-providers-apache-drill>=2.8.1", |
| "apache-airflow-providers-apache-druid>=3.12.0", |
| "apache-airflow-providers-apache-flink>=1.6.0", |
| "apache-airflow-providers-apache-hdfs>=4.6.0", |
| "apache-airflow-providers-apache-hive>=8.2.1", |
| "apache-airflow-providers-apache-iceberg>=1.2.0", |
| "apache-airflow-providers-apache-impala>=1.5.2", |
| "apache-airflow-providers-apache-kafka>=1.6.1", |
| "apache-airflow-providers-apache-kylin>=3.8.0", |
| "apache-airflow-providers-apache-livy>=3.9.2", |
| "apache-airflow-providers-apache-pig>=4.6.0", |
| "apache-airflow-providers-apache-pinot>=4.5.1", |
| "apache-airflow-providers-apache-spark>=4.11.1", |
| "apache-airflow-providers-apache-tinkerpop>=1.0.0", |
| "apache-airflow-providers-apprise>=1.4.1", |
| "apache-airflow-providers-arangodb>=2.7.0", |
| "apache-airflow-providers-asana>=2.7.0", |
| "apache-airflow-providers-atlassian-jira>=2.7.1", |
| "apache-airflow-providers-celery>=3.8.3", |
| "apache-airflow-providers-cloudant>=4.0.1", |
| "apache-airflow-providers-cncf-kubernetes>=9.0.0", |
| "apache-airflow-providers-cohere>=1.4.0", |
| "apache-airflow-providers-common-ai>=0.0.1", # Set from local provider pyproject.toml |
| "apache-airflow-providers-common-compat>=1.2.1", |
| "apache-airflow-providers-common-io>=1.4.2", |
| "apache-airflow-providers-common-messaging>=2.0.0", # Set from MIN_VERSION_OVERRIDE in update_airflow_pyproject_toml.py |
| "apache-airflow-providers-common-sql>=1.18.0", |
| "apache-airflow-providers-databricks>=6.11.0", |
| "apache-airflow-providers-datadog>=3.8.0", |
| "apache-airflow-providers-dbt-cloud>=3.11.0", |
| "apache-airflow-providers-dingding>=3.7.0", |
| "apache-airflow-providers-discord>=3.9.0", |
| "apache-airflow-providers-docker>=3.14.1", |
| "apache-airflow-providers-edge3>=1.0.0", |
| "apache-airflow-providers-elasticsearch>=6.5.0", # Set from MIN_VERSION_OVERRIDE in update_airflow_pyproject_toml.py |
| "apache-airflow-providers-exasol>=4.6.1", |
| "apache-airflow-providers-fab>=2.2.0", # Set from MIN_VERSION_OVERRIDE in update_airflow_pyproject_toml.py |
| "apache-airflow-providers-facebook>=3.7.0", |
| "apache-airflow-providers-ftp>=3.12.0", |
| "apache-airflow-providers-git>=0.0.2", # Set from MIN_VERSION_OVERRIDE in update_airflow_pyproject_toml.py |
| "apache-airflow-providers-github>=2.8.0", |
| "apache-airflow-providers-google>=10.24.0", |
| "apache-airflow-providers-grpc>=3.7.0", |
| "apache-airflow-providers-hashicorp>=4.0.0", |
| "apache-airflow-providers-http>=4.13.2", |
| "apache-airflow-providers-imap>=3.8.0", |
| "apache-airflow-providers-influxdb>=2.8.0", |
| "apache-airflow-providers-informatica>=0.1.1", |
| "apache-airflow-providers-jdbc>=4.5.2", |
| "apache-airflow-providers-jenkins>=3.7.2", |
| "apache-airflow-providers-keycloak>=0.0.1", |
| "apache-airflow-providers-microsoft-azure>=10.5.1", |
| "apache-airflow-providers-microsoft-mssql>=3.9.2", |
| "apache-airflow-providers-microsoft-psrp>=3.0.0", |
| "apache-airflow-providers-microsoft-winrm>=3.6.1", |
| "apache-airflow-providers-mongo>=4.2.2", |
| "apache-airflow-providers-mysql>=5.7.2", |
| "apache-airflow-providers-neo4j>=3.8.0", |
| "apache-airflow-providers-odbc>=4.8.0", |
| "apache-airflow-providers-openai>=1.5.0", |
| "apache-airflow-providers-openfaas>=3.7.0", |
| "apache-airflow-providers-openlineage>=2.3.0", # Set from MIN_VERSION_OVERRIDE in update_airflow_pyproject_toml.py |
| "apache-airflow-providers-opensearch>=1.5.0", |
| "apache-airflow-providers-opsgenie>=5.8.0", |
| "apache-airflow-providers-oracle>=3.12.0", |
| "apache-airflow-providers-pagerduty>=3.8.1", |
| "apache-airflow-providers-papermill>=3.8.2", |
| "apache-airflow-providers-pgvector>=1.4.0", |
| "apache-airflow-providers-pinecone>=2.1.1", |
| "apache-airflow-providers-postgres>=5.13.1", |
| "apache-airflow-providers-presto>=5.7.0", |
| "apache-airflow-providers-qdrant>=1.3.0", |
| "apache-airflow-providers-redis>=4.0.0", |
| "apache-airflow-providers-salesforce>=5.9.0", |
| "apache-airflow-providers-samba>=4.9.0", |
| "apache-airflow-providers-segment>=3.7.0", |
| "apache-airflow-providers-sendgrid>=4.0.0", |
| "apache-airflow-providers-sftp>=5.0.0", |
| "apache-airflow-providers-singularity>=3.7.0", |
| "apache-airflow-providers-slack>=8.9.1", |
| "apache-airflow-providers-smtp>=1.8.1", |
| "apache-airflow-providers-snowflake>=5.8.0", |
| "apache-airflow-providers-sqlite>=3.9.1", |
| "apache-airflow-providers-ssh>=3.14.0", |
| "apache-airflow-providers-standard>=0.0.1", |
| "apache-airflow-providers-tableau>=5.0.0", |
| "apache-airflow-providers-telegram>=4.7.0", |
| "apache-airflow-providers-teradata>=2.6.1", |
| "apache-airflow-providers-trino>=5.8.1", |
| "apache-airflow-providers-vertica>=3.9.1", |
| "apache-airflow-providers-weaviate>=3.0.0", |
| "apache-airflow-providers-yandex>=4.0.0", |
| "apache-airflow-providers-ydb>=1.4.0", |
| "apache-airflow-providers-zendesk>=4.9.0", |
| ] |
| # End of automatically generated airflow optional dependencies |
| # Aiobotocore required for AWS deferrable operators. |
| # There is conflict between boto3 and aiobotocore dependency botocore. |
| # TODO: We can remove it once boto3 and aiobotocore both have compatible botocore version or |
| # boto3 have native aync support and we move away from aio aiobotocore |
| "aiobotocore" = [ |
| "apache-airflow-providers-amazon[aiobotocore]>=9.6.0", |
| ] |
| "apache-atlas" = [ |
| "atlasclient>=0.1.2", |
| ] |
| "apache-webhdfs" = [ |
| "apache-airflow-providers-apache-hdfs", |
| ] |
| "amazon-aws-auth" = [ |
| "apache-airflow-providers-amazon[python3-saml]", |
| ] |
| "cloudpickle" = [ |
| "cloudpickle>=2.2.1", |
| ] |
| "github-enterprise" = [ |
| "apache-airflow-providers-fab>=2.2.0", |
| "authlib>=1.0.0", |
| ] |
| "google-auth" = [ |
| "apache-airflow-providers-fab>=2.2.0", |
| "authlib>=1.0.0", |
| ] |
| "ldap" = [ |
| "python-ldap>=3.4.4", |
| ] |
| "pandas" = [ |
| "apache-airflow-providers-common-sql[pandas]", |
| ] |
| "polars" = [ |
| "apache-airflow-providers-common-sql[polars]", |
| ] |
| "rabbitmq" = [ |
| "amqp>=5.2.0", |
| ] |
| "sentry" = [ |
| "sentry-sdk>=2.30.0", |
| ] |
| "s3fs" = [ |
| # This is required for support of S3 file system which uses aiobotocore |
| # which can have a conflict with boto3 as mentioned in aiobotocore extra |
| "apache-airflow-providers-amazon[s3fs]", |
| ] |
| "uv" = [ |
| "uv>=0.10.9", |
| ] |
| |
| [project.urls] |
| "Bug Tracker" = "https://github.com/apache/airflow/issues" |
| Documentation = "https://airflow.apache.org/docs/" |
| Downloads = "https://archive.apache.org/dist/airflow/" |
| Homepage = "https://airflow.apache.org/" |
| "Release Notes" = "https://airflow.apache.org/docs/apache-airflow/stable/release_notes.html" |
| "Slack Chat" = "https://s.apache.org/airflow-slack" |
| "Source Code" = "https://github.com/apache/airflow" |
| LinkedIn = "https://www.linkedin.com/company/apache-airflow/" |
| Mastodon = "https://fosstodon.org/@airflow" |
| Bluesky = "https://bsky.app/profile/apache-airflow.bsky.social" |
| YouTube = "https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/" |
| |
| [tool.hatch.build.targets.sdist] |
| exclude = ["*"] |
| |
| [tool.hatch.build.targets.wheel] |
| bypass-selection = true |
| |
| ## black settings ## |
| # Used to format code examples inside .rst doc files |
| # Needed until https://github.com/astral-sh/ruff/issues/8237 is available. |
| [tool.black] |
| line-length = 110 |
| |
| ## ruff settings ## |
| [tool.ruff] |
| line-length = 110 |
| extend-exclude = [ |
| ".eggs", |
| "*/_vendor/*", |
| "airflow-core/tests/unit/dags/test_imports.py", |
| ] |
| |
| [tool.ruff.lint] |
| typing-modules = ["airflow.typing_compat"] |
| extend-select = [ |
| # Enable entire ruff rule section |
| "I", # Missing required import (auto-fixable) |
| "UP", # Pyupgrade |
| "ASYNC", # subset of flake8-async rules |
| "ISC", # Checks for implicit literal string concatenation (auto-fixable) |
| "TC", # Rules around TYPE_CHECKING blocks |
| "G", # flake8-logging-format rules |
| "LOG", # flake8-logging rules, most of them autofixable |
| "PT", # flake8-pytest-style rules |
| "TID25", # flake8-tidy-imports rules |
| "E", # pycodestyle rules |
| "W", # pycodestyle rules |
| # Warning (PLW) re-implemented in ruff from Pylint |
| "PLW0120", # else clause on loop without a break statement; remove the else and dedent its contents |
| "PLW0127", # Self-assignment of variable |
| "PLW0128", # Redeclared variable {name} in assignment |
| "PLW0129", # Asserting on an empty string literal will never pass |
| "PLW0131", # Named expression used without context |
| "PLW0133", # Missing raise statement on exception |
| "PLW0177", # Comparing against a NaN value; use math.isnan instead |
| "PLW0211", # First argument of a static method should not be named {argument_name} |
| "PLW0245", # super call is missing parentheses |
| "PLW0406", # Module {name} imports itself |
| "PLW0602", # Using global for {name} but no assignment is done |
| "PLW0604", # global at module level is redundant |
| "PLW0642", # Reassigned {} variable in {method_type} method |
| "PLW0711", # Exception to catch is the result of a binary and operation |
| "PLW1501", # {mode} is not a valid mode for open |
| "PLW1507", # Shallow copy of os.environ via copy.copy(os.environ) |
| "PLW1508", # Invalid type for environment variable default; expected str or None |
| "PLW1509", # preexec_fn argument is unsafe when using threads |
| "PLW1510", # subprocess.run without explicit check argument |
| "PLW1641", # Object does not implement __hash__ method |
| "PLW2101", # Threading lock directly created in with statement has no effect |
| "PLW2901", # Outer {outer_kind} variable {name} overwritten by inner {inner_kind} target |
| "PLW3301", # Nested {func} calls can be flattened |
| # Per rule enables |
| "RUF006", # Checks for asyncio dangling task |
| "RUF015", # Checks for unnecessary iterable allocation for first element |
| "RUF019", # Checks for unnecessary key check |
| "RUF100", # Unused noqa (auto-fixable) |
| # We ignore more pydocstyle than we enable, so be more selective at what we enable |
| "D1", |
| "D2", |
| "D213", # Conflicts with D212. Both can not be enabled. |
| "D3", |
| "D400", |
| "D401", |
| "D402", |
| "D403", |
| "D412", |
| "D419", |
| "PGH004", # Use specific rule codes when using noqa |
| "PGH005", # Invalid unittest.mock.Mock methods/attributes/properties |
| "S101", # Checks use `assert` outside the test cases, test cases should be added into the exclusions |
| "SIM107", # Don't use `return` in `try`-`except` and `finally` |
| "SIM300", # Checks for conditions that position a constant on the left-hand side of the comparison |
| # operator, rather than the right-hand side. |
| "B004", # Checks for use of hasattr(x, "__call__") and replaces it with callable(x) |
| "B006", # Checks for uses of mutable objects as function argument defaults. |
| "B007", # Checks for unused variables in the loop |
| "B012", # Checks for `break`, `continue`, and `return` statements in `finally` blocks |
| "B017", # Checks for pytest.raises context managers that catch Exception or BaseException. |
| "B019", # Use of functools.lru_cache or functools.cache on methods can lead to memory leaks |
| "B028", # No explicit stacklevel keyword argument found |
| "TRY002", # Prohibit use of `raise Exception`, use specific exceptions instead. |
| "RET505", # Unnecessary {branch} after return statement |
| "RET506", # Unnecessary {branch} after raise statement |
| "RET507", # Unnecessary {branch} after continue statement |
| "RET508", # Unnecessary {branch} after break statement |
| ] |
| ignore = [ |
| "D100", # Unwanted; Docstring at the top of every file. |
| "D102", # Unwanted; Missing docstring in public method |
| "D103", # Unwanted; Missing docstring in public function |
| "D104", # Unwanted; Docstring at the top of every `__init__.py` file. |
| "D105", # Unwanted; See https://lists.apache.org/thread/8jbg1dd2lr2cfydtqbjxsd6pb6q2wkc3 |
| "D107", # Unwanted; Docstring in every constructor is unnecessary if the class has a docstring. |
| "D203", # Conflicts with D211. Both can not be enabled. |
| "D212", # Conflicts with D213. Both can not be enabled. |
| "E731", # Do not assign a lambda expression, use a def |
| "TC003", # Do not move imports from stdlib to TYPE_CHECKING block |
| "PT007", # Wrong type of values in @pytest.mark.parametrize |
| "PT013", # silly rule prohibiting e.g. `from pytest import param` |
| "PT019", # fixture without value is injected as parameter, use @pytest.mark.usefixtures instead |
| # Rules below explicitly set off which could overlap with Ruff's formatter |
| # as it recommended by https://docs.astral.sh/ruff/formatter/#conflicting-lint-rules |
| # Except ISC rules |
| "W191", |
| "E111", |
| "E114", |
| "E117", |
| "D206", |
| "D300", |
| "Q000", |
| "Q001", |
| "Q002", |
| "Q003", |
| "COM812", |
| "COM819", |
| "E501", # Formatted code may exceed the line length, leading to line-too-long (E501) errors. |
| "ASYNC110", # TODO: Use `anyio.Event` instead of awaiting `anyio.sleep` in a `while` loop |
| "SIM105", # Use contextlib.suppress({exception}) instead of try-except-pass |
| ] |
| unfixable = [ |
| # PT022 replace empty `yield` to empty `return`. Might be fixed with a combination of PLR1711 |
| # In addition, it can't do anything with invalid typing annotations, protected by mypy. |
| "PT022", |
| ] |
| |
| [tool.ruff.format] |
| docstring-code-format = true |
| |
| [tool.ruff.lint.isort] |
| required-imports = ["from __future__ import annotations"] |
| combine-as-imports = true |
| |
| |
| section-order = [ |
| "future", |
| "standard-library", |
| "third-party", |
| "first-party", |
| "local-folder", |
| "testing" |
| ] |
| |
| known-first-party = ["airflow", "airflow_shared", "airflow_shared.*"] |
| |
| # Make sure we put the "dev" imports at the end, not as a third-party module |
| [tool.ruff.lint.isort.sections] |
| testing = ["dev", "providers.tests", "tests_common", "tests", "system", "unit", "integration"] |
| |
| [tool.ruff.lint.extend-per-file-ignores] |
| "airflow-core/src/airflow/__init__.py" = ["F401", "TC004", "I002"] |
| "airflow-core/src/airflow/models/__init__.py" = ["F401", "TC004"] |
| "airflow-core/src/airflow/models/sqla_models.py" = ["F401"] |
| "airflow-core/src/airflow/cli/api/datamodels/_generated.py" = ["UP007", "D101", "D200"] |
| |
| # Those are needed so that __init__.py chaining of packages properly works for IDEs |
| # the first non-comment line of such empty __init__.py files should be: |
| # |
| "airflow-core/tests/unit/__init__.py" = ["I002"] |
| "airflow-core/tests/system/__init__.py" = ["I002"] |
| "airflow-core/tests/integration/__init__.py" = ["I002"] |
| "providers/*/tests/*/__init__.py" = ["I002"] |
| "providers/*/*/tests/*/*/__init__.py" = ["I002"] |
| "providers/*/src/airflow/__init__.py" = ["I002"] |
| "providers/*/src/airflow/providers/*/__init__.py" = ["I002"] |
| "providers/*/src/airflow/providers/__init__.py" = ["I002"] |
| "providers/*/*/src/airflow/providers/__init__.py" = ["I002"] |
| "providers/apache/*/src/airflow/providers/apache/__init__.py" = ["I002"] |
| "providers/atlassian/*/src/airflow/providers/atlassian/__init__.py" = ["I002"] |
| "providers/common/*/src/airflow/providers/common/__init__.py" = ["I002"] |
| "providers/cncf/*/src/airflow/providers/cncf/__init__.py" = ["I002"] |
| "providers/dbt/*/src/airflow/providers/dbt/__init__.py" = ["I002"] |
| "providers/microsoft/*/src/airflow/providers/microsoft/__init__.py" = ["I002"] |
| |
| # The test_python.py is needed because adding __future__.annotations breaks runtime checks that are |
| # needed for the test to work |
| "providers/standard/tests/unit/standard/decorators/test_python.py" = ["I002"] |
| |
| # The Pydantic representations of SqlAlchemy Models are not parsed well with Pydantic |
| # when __future__.annotations is used so we need to skip them from upgrading |
| # Pydantic also require models to be imported during execution |
| "airflow-core/src/airflow/serialization/pydantic/*.py" = ["I002", "UP007", "TC001"] |
| |
| # The FastAPI models are not parsed well with Pydantic when __future__.annotations is used |
| # It is forcing for Union to replace with `|` pipe instead |
| "airflow-core/src/airflow/api_fastapi/core_api/datamodels/common.py" = ["UP007"] |
| |
| # Provider's get_provider_info.py files are generated and do not need "from __future__ import annotations" |
| "providers/**/get_provider_info.py" = ["I002"] |
| |
| # Failing to detect types and functions used in `Annotated[...]` syntax as required at runtime. |
| # Annotated is central for FastAPI dependency injection, skipping rules for FastAPI folders. |
| "airflow-core/src/airflow/api_fastapi/*" = ["TC001", "TC002"] |
| "airflow-core/tests/unit/api_fastapi/*" = ["T001", "TC002"] |
| "providers/fab/src/airflow/providers/fab/auth_manager/api_fastapi/*" = ["TC001", "TC002"] |
| |
| # Ignore pydoc style from these |
| "*.pyi" = ["D"] |
| "scripts/*" = ["D", "PT"] # In addition ignore pytest specific rules |
| "docs/*" = ["D"] |
| "airflow-core/docs/*" = ["D"] |
| "*/example_dags/*" = ["D"] |
| "chart/*" = ["D"] |
| "dev/*" = ["D"] |
| "devel-common/*" = ["D"] |
| # In addition, ignore in tests |
| # TID253: Banned top level imports, e.g. pandas, numpy |
| # S101: Use `assert` |
| # TRY002: Use `raise Exception` |
| "dev/perf/*" = ["TID253"] |
| "dev/check_files.py" = ["S101"] |
| "dev/breeze/tests/*" = ["TID253", "S101", "TRY002"] |
| "devel-common/tests/*" = ["S101"] |
| "airflow-core/tests/*" = ["D", "TID253", "S101", "TRY002"] |
| "airflow-ctl-tests/tests/*" = ["D", "TID253", "S101", "TRY002"] |
| "airflow-e2e-tests/tests/*" = ["D", "TID253", "S101", "TRY002"] |
| "docker-tests/*" = ["D", "TID253", "S101", "TRY002"] |
| "task-sdk-integration-tests/*" = ["D", "TID253", "S101", "TRY002"] |
| "kubernetes-tests/*" = ["D", "TID253", "S101", "TRY002"] |
| "helm-tests/*" = ["D", "TID253", "S101", "TRY002"] |
| "providers/**/tests/*" = ["D", "TID253", "S101", "TRY002"] |
| "performance/tests/*" = ["S101"] |
| "dev/registry/tests/*" = ["S101"] |
| |
| # Shared distributions SHOULD use relative imports when referencing each other |
| # This one disables 'ban-relative-imports'. |
| "shared/*/src/**" = ["TID252"] |
| |
| # All the modules which have an extra license header (i.e. that we copy from another project) need to |
| # ignore E402 -- module level import not at top level |
| "scripts/ci/prek/*.py" = [ "E402" ] |
| "airflow-core/src/airflow/api/auth/backend/kerberos_auth.py" = [ "E402" ] |
| "airflow-core/src/airflow/security/kerberos.py" = [ "E402" ] |
| "airflow-core/src/airflow/security/utils.py" = [ "E402" ] |
| "airflow-core/tests/unit/always/test_connection.py" = [ "E402" ] |
| "airflow-core/tests/unit/always/test_providers_manager.py" = [ "E402" ] |
| "providers/google/tests/unit/google/cloud/hooks/vertex_ai/test_auto_ml.py" = [ "E402"] |
| "providers/google/tests/unit/google/cloud/hooks/vertex_ai/test_batch_prediction_job.py" = [ "E402"] |
| "providers/google/tests/unit/google/cloud/hooks/vertex_ai/test_custom_job.py" = [ "E402"] |
| "providers/google/tests/unit/google/cloud/hooks/vertex_ai/test_dataset.py" = [ "E402"] |
| "providers/google/tests/unit/google/cloud/hooks/vertex_ai/test_endpoint_service.py" = [ "E402"] |
| "providers/google/tests/unit/google/cloud/hooks/vertex_ai/test_generative_model.py" = [ "E402"] |
| "providers/google/tests/unit/google/cloud/hooks/vertex_ai/test_hyperparameter_tuning_job.py" = [ "E402"] |
| "providers/google/tests/unit/google/cloud/hooks/vertex_ai/test_model_service.py" = [ "E402"] |
| "providers/google/tests/unit/google/cloud/hooks/vertex_ai/test_pipeline_job.py" = [ "E402"] |
| "providers/google/tests/unit/google/cloud/hooks/vertex_ai/test_prediction_service.py" = [ "E402"] |
| "providers/google/tests/unit/google/cloud/hooks/vertex_ai/test_ray.py" = [ "E402" ] |
| "providers/google/tests/unit/google/cloud/links/test_translate.py" = [ "E402"] |
| "providers/google/tests/unit/google/cloud/operators/test_automl.py" = [ "E402"] |
| "providers/google/tests/unit/google/cloud/operators/test_vertex_ai.py" = [ "E402"] |
| "providers/google/tests/unit/google/cloud/operators/vertex_ai/test_generative_model.py" = [ "E402"] |
| "providers/google/tests/unit/google/cloud/triggers/test_vertex_ai.py" = [ "E402"] |
| "providers/google/tests/unit/google/cloud/sensors/test_vertex_ai.py" = [ "E402"] |
| "providers/microsoft/azure/tests/conftest.py" = ["E402"] |
| "providers/qdrant/tests/unit/qdrant/hooks/test_qdrant.py" = ["E402"] |
| "providers/qdrant/tests/unit/qdrant/operators/test_qdrant.py" = ["E402"] |
| "providers/yandex/tests/unit/yandex/hooks/test_yandex.py" = ["E402"] |
| "providers/yandex/tests/unit/yandex/hooks/test_yq.py" = ["E402"] |
| "providers/yandex/tests/unit/yandex/operators/test_dataproc.py" = ["E402"] |
| "providers/yandex/tests/unit/yandex/operators/test_yq.py" = ["E402"] |
| "providers/yandex/tests/unit/yandex/secrets/test_lockbox.py" = ["E402"] |
| "providers/ydb/tests/unit/ydb/hooks/test_ydb.py" = ["E402"] |
| "providers/ydb/tests/unit/ydb/operators/test_ydb.py" = ["E402"] |
| "providers/ydb/tests/unit/ydb/utils/test_credentials.py" = ["E402"] |
| |
| # Remove some docstring rules from files that do not need docstrings |
| "providers/apache/hdfs/src/airflow/providers/apache/hdfs/sensors/hdfs.py" = ["D101"] |
| |
| "devel-common/src/sphinx_exts/exampleinclude.py" = ["E402", 'F401', ] |
| |
| # All the modules which do not follow B028 yet: https://docs.astral.sh/ruff/rules/no-explicit-stacklevel/ |
| "helm-tests/tests/helm_tests/airflow_aux/test_basic_helm_chart.py" = ["B028"] |
| |
| # While pandas import is banned, sql.pyi should be excluded from it as it does not have a TYPE_CHECKING |
| # mechanism and whole .pyi is really "type-checking" only |
| "providers/common/sql/src/airflow/providers/common/sql/hooks/sql.pyi" = ["TID253"] |
| |
| [tool.ruff.lint.flake8-tidy-imports] |
| # Disallow all relative imports. |
| ban-relative-imports = "all" |
| # Ban certain modules from being imported at module level, instead requiring |
| # that they're imported lazily (e.g., within a function definition). |
| banned-module-level-imports = ["numpy", "pandas", "polars"] |
| |
| |
| [tool.ruff.lint.flake8-tidy-imports.banned-api] |
| |
| # Direct import from the airflow package modules and constraints |
| "airflow.AirflowException".msg = "Use airflow.exceptions.AirflowException instead." |
| |
| # Deprecated imports |
| "airflow.models.errors.ImportError".msg = "Use airflow.models.errors.ParseImportError" |
| "airflow.models.ImportError".msg = "Use airflow.models.errors.ParseImportError" |
| |
| # Note: we have to specify these all here (not in sub pyproject.toml files), else we'd have to duplicate these |
| # all rules in each project https://github.com/astral-sh/ruff/issues/18723 |
| # Add this once providers are sorted |
| # "airflow.utils.timezone".msg = "Use airflow.sdk.timezone (or airflow._shared.timezones.timezone from within airflow-core)" |
| # "airflow_shared".msg = "Use airflow._shared or airflow.sdk._shared instead" |
| |
| # Deprecated in Python 3.11, Pending Removal in Python 3.15: https://github.com/python/cpython/issues/90817 |
| # Deprecation warning in Python 3.11 also recommends using locale.getencoding but it available in Python 3.11 |
| "locale.getdefaultlocale".msg = "Use locale.setlocale() and locale.getlocale() instead." |
| # Deprecated in Python 3.12: https://github.com/python/cpython/issues/103857 |
| "datetime.datetime.utcnow".msg = "Use airflow.sdk.timezone.utcnow or datetime.datetime.now(tz=datetime.timezone.utc)" |
| "datetime.datetime.utcfromtimestamp".msg = "Use airflow.sdk.timezone.from_timestamp or datetime.datetime.fromtimestamp(tz=datetime.timezone.utc)" |
| # Uses deprecated in Python 3.12 `datetime.datetime.utcfromtimestamp` |
| "pendulum.from_timestamp".msg = "Use airflow.sdk.timezone.from_timestamp" |
| # Flask deprecations, worthwhile to keep it until we migrate to Flask 3.0+ |
| "flask._app_ctx_stack".msg = "Deprecated in Flask 2.2, removed in Flask 3.0" |
| "flask._request_ctx_stack".msg = "Deprecated in Flask 2.2, removed in Flask 3.0" |
| "flask.escape".msg = "Use markupsafe.escape instead. Deprecated in Flask 2.3, removed in Flask 3.0" |
| "flask.Markup".msg = "Use markupsafe.Markup instead. Deprecated in Flask 2.3, removed in Flask 3.0" |
| "flask.signals_available".msg = "Signals are always available. Deprecated in Flask 2.3, removed in Flask 3.0" |
| # Use root logger by a mistake / IDE autosuggestion |
| # If for some reason root logger required it could obtained by logging.getLogger("root") |
| "logging.debug".msg = "Use structlog instead" |
| "logging.info".msg = "Use structlog instead" |
| "logging.warning".msg = "Use structlog instead" |
| "logging.error".msg = "Use structlog instead" |
| "logging.exception".msg = "Use structlog instead" |
| "logging.fatal".msg = "Use structlog instead" |
| "logging.critical".msg = "Use structlog instead" |
| "logging.log".msg = "Use structlog instead" |
| # unittest related restrictions |
| "unittest.TestCase".msg = "Use pytest compatible classes: https://docs.pytest.org/en/stable/getting-started.html#group-multiple-tests-in-a-class" |
| "unittest.skip".msg = "Use `pytest.mark.skip` instead: https://docs.pytest.org/en/stable/reference/reference.html#marks" |
| "unittest.skipIf".msg = "Use `pytest.mark.skipif` instead: https://docs.pytest.org/en/stable/reference/reference.html#marks" |
| "unittest.skipUnless".msg = "Use `pytest.mark.skipif` instead: https://docs.pytest.org/en/stable/reference/reference.html#marks" |
| "unittest.expectedFailure".msg = "Use `pytest.mark.xfail` instead: https://docs.pytest.org/en/stable/reference/reference.html#marks" |
| # Moved in SQLAlchemy 2.0 |
| "sqlalchemy.ext.declarative.declarative_base".msg = "Use `sqlalchemy.orm.declarative_base`. Moved in SQLAlchemy 2.0" |
| "sqlalchemy.ext.declarative.as_declarative".msg = "Use `sqlalchemy.orm.as_declarative`. Moved in SQLAlchemy 2.0" |
| "sqlalchemy.ext.declarative.has_inherited_table".msg = "Use `sqlalchemy.orm.has_inherited_table`. Moved in SQLAlchemy 2.0" |
| "sqlalchemy.ext.declarative.synonym_for".msg = "Use `sqlalchemy.orm.synonym_for`. Moved in SQLAlchemy 2.0" |
| "providers".msg = "You should not import 'providers' as a Python module. Imports in providers should be done starting from 'src' or `tests' folders, for example 'from airflow.providers.airbyte' or 'from unit.airbyte' or 'from system.airbyte'" |
| |
| [tool.ruff.lint.flake8-type-checking] |
| exempt-modules = ["typing", "typing_extensions", "sqlalchemy.orm.Mapped"] |
| |
| [tool.ruff.lint.flake8-pytest-style] |
| mark-parentheses = false |
| fixture-parentheses = false |
| |
| ## pytest settings ## |
| [tool.pytest] |
| addopts = [ |
| "--tb=short", |
| "-rasl", |
| "--verbosity=2", |
| # Disable `flaky` plugin for pytest. This plugin conflicts with `rerunfailures` because provide the same marker. |
| "-p", "no:flaky", |
| # Disable `nose` builtin plugin for pytest. This feature is deprecated in 7.2 and will be removed in pytest>=8 |
| "-p", "no:nose", |
| # Disable support of a legacy `LocalPath` in favor of stdlib `pathlib.Path`. |
| "-p", "no:legacypath", |
| # Disable warnings summary, because we use our warning summary. |
| "--disable-warnings", |
| "--asyncio-mode=strict", |
| "--ignore-glob=**/tests/system/*", |
| "--ignore-glob=tests/system/*", |
| ] |
| |
| norecursedirs = [ |
| ".eggs", |
| "airflow", |
| "airflow-core/tests/unit/_internals", |
| "airflow-core/tests/unit/dags_with_system_exit", |
| "airflow-core/tests/unit/dags_corrupted", |
| "airflow-core/tests/unit/dags", |
| "providers/google/tests/system/google/cloud/dataproc/resources", |
| "providers/google/tests/system/google/cloud/gcs/resources", |
| ] |
| log_level = "INFO" |
| filterwarnings = [ |
| "error::pytest.PytestCollectionWarning", |
| # Avoid building cartesian product which might impact performance |
| "error:SELECT statement has a cartesian product between FROM:sqlalchemy.exc.SAWarning:airflow", |
| 'error:Coercing Subquery object into a select\(\) for use in IN\(\):sqlalchemy.exc.SAWarning:airflow', |
| 'error:Class.*will not make use of SQL compilation caching', |
| "ignore::DeprecationWarning:flask_appbuilder.filemanager", |
| "ignore::DeprecationWarning:flask_appbuilder.widgets", |
| # FAB do not support SQLAlchemy 2 |
| "ignore::sqlalchemy.exc.MovedIn20Warning:flask_appbuilder", |
| # https://github.com/dpgaspar/Flask-AppBuilder/issues/2194 |
| "ignore::DeprecationWarning:marshmallow_sqlalchemy.convert", |
| # https://github.com/dpgaspar/Flask-AppBuilder/pull/1940 |
| "ignore::DeprecationWarning:flask_sqlalchemy", |
| # https://github.com/dpgaspar/Flask-AppBuilder/pull/1903 |
| "ignore::DeprecationWarning:apispec.utils", |
| ] |
| # We cannot add warnings from the airflow package into `filterwarnings`, |
| # because it invokes import airflow before we set up test environment which breaks the tests. |
| # Instead of that, we use a separate parameter and dynamically add it into `filterwarnings` marker. |
| # Add airflow.exceptions.RemovedInAirflow4Warning when min provider version for providers is 3.0 |
| forbidden_warnings = [ |
| "airflow.exceptions.AirflowProviderDeprecationWarning", |
| ] |
| python_files = [ |
| "test_*.py", |
| "example_*.py", |
| ] |
| # We need to make sure airflow-core sources are first in the pythonpath, because uv sync adds sources to |
| # pythonpath in basically random order and pytest does not understand legacy namespace packages and cannot |
| # use namespace packages effectively when collecting tests. |
| pythonpath = [ |
| "airflow-core/src", |
| "airflow-core/tests" |
| ] |
| testpaths = [ |
| "tests", |
| ] |
| asyncio_default_fixture_loop_scope = "function" |
| |
| # Keep temporary directories (created by `tmp_path`) for 2 recent runs only failed tests. |
| tmp_path_retention_count = "2" |
| tmp_path_retention_policy = "failed" |
| |
| |
| ## coverage.py settings ## |
| [tool.coverage.run] |
| branch = true |
| relative_files = true |
| omit = [ |
| "airflow-core/src/airflow/_vendor/**", |
| "airflow-core/src/airflow/contrib/**", |
| "airflow-core/src/airflow/example_dags/**", |
| "airflow-core/src/airflow/migrations/**", |
| "providers/google/src/airflow/providers/**/example_dags/**", |
| "providers/google/src/airflow/providers/google/ads/_vendor/**", |
| ] |
| |
| [tool.coverage.report] |
| skip_empty = true |
| exclude_also = [ |
| "def __repr__", |
| "raise AssertionError", |
| "raise NotImplementedError", |
| "if __name__ == .__main__.:", |
| "@(abc\\.)?abstractmethod", |
| "@(typing(_extensions)?\\.)?overload", |
| "if (typing(_extensions)?\\.)?TYPE_CHECKING:" |
| ] |
| |
| |
| ## mypy settings ## |
| [tool.mypy] |
| ignore_missing_imports = true |
| no_implicit_optional = true |
| warn_redundant_casts = true |
| warn_unused_ignores = false |
| plugins = [ |
| "dev/airflow_mypy/plugin/decorators.py", |
| "dev/airflow_mypy/plugin/outputs.py", |
| ] |
| pretty = true |
| show_error_codes = true |
| disable_error_code = [ |
| "annotation-unchecked", |
| ] |
| namespace_packages = true |
| explicit_package_bases = true |
| exclude = [ |
| ".*/node_modules/.*", |
| # Exclude hidden files and directories |
| ".*/\\..*" |
| ] |
| mypy_path = [ |
| "$MYPY_CONFIG_FILE_DIR/airflow-core/src", |
| "$MYPY_CONFIG_FILE_DIR/airflow-core/tests", |
| "$MYPY_CONFIG_FILE_DIR/task-sdk/src", |
| "$MYPY_CONFIG_FILE_DIR/task-sdk/tests", |
| "$MYPY_CONFIG_FILE_DIR/airflow-ctl/src", |
| "$MYPY_CONFIG_FILE_DIR/airflow-ctl/tests", |
| "$MYPY_CONFIG_FILE_DIR/airflow-ctl-tests/tests", |
| "$MYPY_CONFIG_FILE_DIR/dev", |
| "$MYPY_CONFIG_FILE_DIR/devel-common/src", |
| "$MYPY_CONFIG_FILE_DIR/helm-tests/tests", |
| "$MYPY_CONFIG_FILE_DIR/kubernetes-tests/tests", |
| "$MYPY_CONFIG_FILE_DIR/docker-tests/tests", |
| "$MYPY_CONFIG_FILE_DIR/task-sdk-integration-tests/tests", |
| # Automatically generated mypy paths (update_airflow_pyproject_toml.py) |
| "$MYPY_CONFIG_FILE_DIR/providers/airbyte/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/airbyte/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/alibaba/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/alibaba/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/amazon/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/amazon/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/apache/cassandra/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/apache/cassandra/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/apache/drill/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/apache/drill/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/apache/druid/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/apache/druid/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/apache/flink/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/apache/flink/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/apache/hdfs/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/apache/hdfs/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/apache/hive/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/apache/hive/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/apache/iceberg/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/apache/iceberg/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/apache/impala/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/apache/impala/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/apache/kafka/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/apache/kafka/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/apache/kylin/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/apache/kylin/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/apache/livy/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/apache/livy/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/apache/pig/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/apache/pig/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/apache/pinot/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/apache/pinot/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/apache/spark/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/apache/spark/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/apache/tinkerpop/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/apache/tinkerpop/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/apprise/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/apprise/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/arangodb/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/arangodb/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/asana/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/asana/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/atlassian/jira/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/atlassian/jira/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/celery/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/celery/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/cloudant/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/cloudant/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/cncf/kubernetes/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/cncf/kubernetes/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/cohere/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/cohere/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/common/ai/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/common/ai/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/common/compat/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/common/compat/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/common/io/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/common/io/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/common/messaging/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/common/messaging/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/common/sql/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/common/sql/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/databricks/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/databricks/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/datadog/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/datadog/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/dbt/cloud/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/dbt/cloud/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/dingding/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/dingding/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/discord/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/discord/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/docker/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/docker/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/edge3/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/edge3/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/elasticsearch/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/elasticsearch/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/exasol/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/exasol/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/fab/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/fab/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/facebook/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/facebook/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/ftp/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/ftp/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/git/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/git/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/github/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/github/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/google/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/google/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/grpc/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/grpc/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/hashicorp/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/hashicorp/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/http/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/http/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/imap/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/imap/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/influxdb/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/influxdb/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/informatica/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/informatica/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/jdbc/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/jdbc/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/jenkins/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/jenkins/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/keycloak/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/keycloak/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/microsoft/azure/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/microsoft/azure/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/microsoft/mssql/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/microsoft/mssql/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/microsoft/psrp/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/microsoft/psrp/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/microsoft/winrm/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/microsoft/winrm/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/mongo/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/mongo/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/mysql/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/mysql/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/neo4j/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/neo4j/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/odbc/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/odbc/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/openai/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/openai/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/openfaas/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/openfaas/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/openlineage/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/openlineage/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/opensearch/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/opensearch/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/opsgenie/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/opsgenie/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/oracle/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/oracle/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/pagerduty/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/pagerduty/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/papermill/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/papermill/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/pgvector/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/pgvector/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/pinecone/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/pinecone/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/postgres/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/postgres/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/presto/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/presto/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/qdrant/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/qdrant/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/redis/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/redis/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/salesforce/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/salesforce/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/samba/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/samba/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/segment/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/segment/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/sendgrid/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/sendgrid/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/sftp/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/sftp/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/singularity/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/singularity/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/slack/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/slack/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/smtp/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/smtp/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/snowflake/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/snowflake/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/sqlite/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/sqlite/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/ssh/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/ssh/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/standard/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/standard/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/tableau/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/tableau/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/telegram/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/telegram/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/teradata/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/teradata/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/trino/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/trino/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/vertica/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/vertica/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/weaviate/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/weaviate/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/yandex/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/yandex/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/ydb/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/ydb/tests", |
| "$MYPY_CONFIG_FILE_DIR/providers/zendesk/src", |
| "$MYPY_CONFIG_FILE_DIR/providers/zendesk/tests", |
| # End of automatically generated mypy paths |
| ] |
| |
| [[tool.mypy.overrides]] |
| module="airflow.config_templates.default_webserver_config" |
| disable_error_code = [ |
| "var-annotated", |
| ] |
| |
| [[tool.mypy.overrides]] |
| module="airflow.migrations.*" |
| ignore_errors = true |
| |
| [[tool.mypy.overrides]] |
| module="airflow.*._vendor.*" |
| ignore_errors = true |
| |
| [[tool.mypy.overrides]] |
| module= [ |
| "google.cloud.*", |
| "azure.*", |
| ] |
| no_implicit_optional = false |
| |
| [[tool.mypy.overrides]] |
| module = "google.api_core.gapic_v1" |
| ignore_errors = true |
| |
| [[tool.mypy.overrides]] |
| module=[ |
| "referencing.*", |
| # Beam has some old type annotations, and they introduced an error recently with bad signature of |
| # a function. This is captured in https://github.com/apache/beam/issues/29927 |
| # and we should remove this exclusion when it is fixed. |
| "apache_beam.*" |
| ] |
| ignore_errors = true |
| |
| # airflowctl autogenered datamodels |
| [[tool.mypy.overrides]] |
| module="airflowctl.api.datamodels.*" |
| ignore_errors = true |
| |
| [dependency-groups] |
| dev = [ |
| "apache-airflow[all]", |
| "apache-airflow-breeze", |
| "apache-airflow-dev", |
| "apache-airflow-devel-common[no-doc]", |
| "apache-airflow-docker-tests", |
| "apache-airflow-task-sdk-integration-tests", |
| "apache-airflow-helm-tests", |
| "apache-airflow-kubernetes-tests", |
| "apache-airflow-task-sdk[all]", |
| "apache-airflow-ctl", |
| "apache-airflow-ctl-tests", |
| "apache-airflow-shared-configuration", |
| "apache-airflow-shared-dagnode", |
| "apache-airflow-shared-listeners", |
| "apache-airflow-shared-logging", |
| "apache-airflow-shared-module-loading", |
| "apache-airflow-shared-observability", |
| "apache-airflow-shared-plugins-manager", |
| "apache-airflow-shared-providers-discovery", |
| "apache-airflow-shared-secrets-backend", |
| "apache-airflow-shared-secrets-masker", |
| "apache-airflow-shared-timezones", |
| ] |
| |
| # To build docs: |
| # |
| # uv run --group docs build-docs |
| # |
| # To enable auto-refreshing build with server: |
| # |
| # uv run --group docs build-docs --autobuild |
| # |
| # To see more options: |
| # |
| # uv run --group docs build-docs --help |
| # |
| docs = [ |
| "apache-airflow-devel-common[docs]" |
| ] |
| docs-gen = [ |
| "apache-airflow-devel-common[docs-gen]" |
| ] |
| # special case for google's leveldb dependency that is notriously difficult to install |
| # we are not installing it by default we only install it in CI image when image is built |
| leveldb = [ |
| "plyvel>=1.5.1" |
| ] |
| |
| [tool.uv] |
| required-version = ">=0.6.3" |
| no-build-isolation-package = ["sphinx-redoc"] |
| |
| [tool.uv.sources] |
| # These names must match the names as defined in the pyproject.toml of the workspace items, |
| # *not* the workspace folder paths |
| apache-airflow = {workspace = true} |
| apache-airflow-breeze = {workspace = true} |
| apache-airflow-dev = {workspace = true} |
| apache-airflow-core = {workspace = true} |
| apache-airflow-ctl = {workspace = true} |
| apache-airflow-ctl-tests = {workspace = true} |
| apache-airflow-task-sdk = { workspace = true } |
| apache-airflow-devel-common = { workspace = true } |
| apache-airflow-docker-tests = { workspace = true } |
| apache-airflow-e2e-tests = { workspace = true } |
| apache-airflow-task-sdk-integration-tests = { workspace = true } |
| apache-airflow-helm-tests = { workspace = true } |
| apache-airflow-kubernetes-tests = { workspace = true } |
| apache-airflow-providers = { workspace = true } |
| apache-aurflow-docker-stack = { workspace = true } |
| apache-airflow-shared-configuration = { workspace = true } |
| apache-airflow-shared-dagnode = { workspace = true } |
| apache-airflow-shared-listeners = { workspace = true } |
| apache-airflow-shared-logging = { workspace = true } |
| apache-airflow-shared-module-loading = { workspace = true } |
| apache-airflow-shared-observability = { workspace = true } |
| apache-airflow-shared-plugins-manager = { workspace = true } |
| apache-airflow-shared-providers-discovery = { workspace = true } |
| apache-airflow-shared-secrets-backend = { workspace = true } |
| apache-airflow-shared-secrets-masker = { workspace = true } |
| apache-airflow-shared-timezones = { workspace = true } |
| # Automatically generated provider workspace items (update_airflow_pyproject_toml.py) |
| apache-airflow-providers-airbyte = { workspace = true } |
| apache-airflow-providers-alibaba = { workspace = true } |
| apache-airflow-providers-amazon = { workspace = true } |
| apache-airflow-providers-apache-cassandra = { workspace = true } |
| apache-airflow-providers-apache-drill = { workspace = true } |
| apache-airflow-providers-apache-druid = { workspace = true } |
| apache-airflow-providers-apache-flink = { workspace = true } |
| apache-airflow-providers-apache-hdfs = { workspace = true } |
| apache-airflow-providers-apache-hive = { workspace = true } |
| apache-airflow-providers-apache-iceberg = { workspace = true } |
| apache-airflow-providers-apache-impala = { workspace = true } |
| apache-airflow-providers-apache-kafka = { workspace = true } |
| apache-airflow-providers-apache-kylin = { workspace = true } |
| apache-airflow-providers-apache-livy = { workspace = true } |
| apache-airflow-providers-apache-pig = { workspace = true } |
| apache-airflow-providers-apache-pinot = { workspace = true } |
| apache-airflow-providers-apache-spark = { workspace = true } |
| apache-airflow-providers-apache-tinkerpop = { workspace = true } |
| apache-airflow-providers-apprise = { workspace = true } |
| apache-airflow-providers-arangodb = { workspace = true } |
| apache-airflow-providers-asana = { workspace = true } |
| apache-airflow-providers-atlassian-jira = { workspace = true } |
| apache-airflow-providers-celery = { workspace = true } |
| apache-airflow-providers-cloudant = { workspace = true } |
| apache-airflow-providers-cncf-kubernetes = { workspace = true } |
| apache-airflow-providers-cohere = { workspace = true } |
| apache-airflow-providers-common-ai = { workspace = true } |
| apache-airflow-providers-common-compat = { workspace = true } |
| apache-airflow-providers-common-io = { workspace = true } |
| apache-airflow-providers-common-messaging = { workspace = true } |
| apache-airflow-providers-common-sql = { workspace = true } |
| apache-airflow-providers-databricks = { workspace = true } |
| apache-airflow-providers-datadog = { workspace = true } |
| apache-airflow-providers-dbt-cloud = { workspace = true } |
| apache-airflow-providers-dingding = { workspace = true } |
| apache-airflow-providers-discord = { workspace = true } |
| apache-airflow-providers-docker = { workspace = true } |
| apache-airflow-providers-edge3 = { workspace = true } |
| apache-airflow-providers-elasticsearch = { workspace = true } |
| apache-airflow-providers-exasol = { workspace = true } |
| apache-airflow-providers-fab = { workspace = true } |
| apache-airflow-providers-facebook = { workspace = true } |
| apache-airflow-providers-ftp = { workspace = true } |
| apache-airflow-providers-git = { workspace = true } |
| apache-airflow-providers-github = { workspace = true } |
| apache-airflow-providers-google = { workspace = true } |
| apache-airflow-providers-grpc = { workspace = true } |
| apache-airflow-providers-hashicorp = { workspace = true } |
| apache-airflow-providers-http = { workspace = true } |
| apache-airflow-providers-imap = { workspace = true } |
| apache-airflow-providers-influxdb = { workspace = true } |
| apache-airflow-providers-informatica = { workspace = true } |
| apache-airflow-providers-jdbc = { workspace = true } |
| apache-airflow-providers-jenkins = { workspace = true } |
| apache-airflow-providers-keycloak = { workspace = true } |
| apache-airflow-providers-microsoft-azure = { workspace = true } |
| apache-airflow-providers-microsoft-mssql = { workspace = true } |
| apache-airflow-providers-microsoft-psrp = { workspace = true } |
| apache-airflow-providers-microsoft-winrm = { workspace = true } |
| apache-airflow-providers-mongo = { workspace = true } |
| apache-airflow-providers-mysql = { workspace = true } |
| apache-airflow-providers-neo4j = { workspace = true } |
| apache-airflow-providers-odbc = { workspace = true } |
| apache-airflow-providers-openai = { workspace = true } |
| apache-airflow-providers-openfaas = { workspace = true } |
| apache-airflow-providers-openlineage = { workspace = true } |
| apache-airflow-providers-opensearch = { workspace = true } |
| apache-airflow-providers-opsgenie = { workspace = true } |
| apache-airflow-providers-oracle = { workspace = true } |
| apache-airflow-providers-pagerduty = { workspace = true } |
| apache-airflow-providers-papermill = { workspace = true } |
| apache-airflow-providers-pgvector = { workspace = true } |
| apache-airflow-providers-pinecone = { workspace = true } |
| apache-airflow-providers-postgres = { workspace = true } |
| apache-airflow-providers-presto = { workspace = true } |
| apache-airflow-providers-qdrant = { workspace = true } |
| apache-airflow-providers-redis = { workspace = true } |
| apache-airflow-providers-salesforce = { workspace = true } |
| apache-airflow-providers-samba = { workspace = true } |
| apache-airflow-providers-segment = { workspace = true } |
| apache-airflow-providers-sendgrid = { workspace = true } |
| apache-airflow-providers-sftp = { workspace = true } |
| apache-airflow-providers-singularity = { workspace = true } |
| apache-airflow-providers-slack = { workspace = true } |
| apache-airflow-providers-smtp = { workspace = true } |
| apache-airflow-providers-snowflake = { workspace = true } |
| apache-airflow-providers-sqlite = { workspace = true } |
| apache-airflow-providers-ssh = { workspace = true } |
| apache-airflow-providers-standard = { workspace = true } |
| apache-airflow-providers-tableau = { workspace = true } |
| apache-airflow-providers-telegram = { workspace = true } |
| apache-airflow-providers-teradata = { workspace = true } |
| apache-airflow-providers-trino = { workspace = true } |
| apache-airflow-providers-vertica = { workspace = true } |
| apache-airflow-providers-weaviate = { workspace = true } |
| apache-airflow-providers-yandex = { workspace = true } |
| apache-airflow-providers-ydb = { workspace = true } |
| apache-airflow-providers-zendesk = { workspace = true } |
| # End of automatically generated provider workspace items |
| |
| [tool.uv.workspace] |
| members = [ |
| ".", |
| "airflow-core", |
| "airflow-e2e-tests", |
| "dev/breeze", |
| "dev/registry", |
| "airflow-ctl", |
| "airflow-ctl-tests", |
| "dev", |
| "devel-common", |
| "docker-tests", |
| "task-sdk-integration-tests", |
| "helm-tests", |
| "kubernetes-tests", |
| "task-sdk", |
| "providers-summary-docs", |
| "docker-stack-docs", |
| "shared/configuration", |
| "shared/dagnode", |
| "shared/listeners", |
| "shared/logging", |
| "shared/module_loading", |
| "shared/observability", |
| "shared/plugins_manager", |
| "shared/providers_discovery", |
| "shared/secrets_backend", |
| "shared/secrets_masker", |
| "shared/timezones", |
| # Automatically generated provider workspace members (update_airflow_pyproject_toml.py) |
| "providers/airbyte", |
| "providers/alibaba", |
| "providers/amazon", |
| "providers/apache/cassandra", |
| "providers/apache/drill", |
| "providers/apache/druid", |
| "providers/apache/flink", |
| "providers/apache/hdfs", |
| "providers/apache/hive", |
| "providers/apache/iceberg", |
| "providers/apache/impala", |
| "providers/apache/kafka", |
| "providers/apache/kylin", |
| "providers/apache/livy", |
| "providers/apache/pig", |
| "providers/apache/pinot", |
| "providers/apache/spark", |
| "providers/apache/tinkerpop", |
| "providers/apprise", |
| "providers/arangodb", |
| "providers/asana", |
| "providers/atlassian/jira", |
| "providers/celery", |
| "providers/cloudant", |
| "providers/cncf/kubernetes", |
| "providers/cohere", |
| "providers/common/ai", |
| "providers/common/compat", |
| "providers/common/io", |
| "providers/common/messaging", |
| "providers/common/sql", |
| "providers/databricks", |
| "providers/datadog", |
| "providers/dbt/cloud", |
| "providers/dingding", |
| "providers/discord", |
| "providers/docker", |
| "providers/edge3", |
| "providers/elasticsearch", |
| "providers/exasol", |
| "providers/fab", |
| "providers/facebook", |
| "providers/ftp", |
| "providers/git", |
| "providers/github", |
| "providers/google", |
| "providers/grpc", |
| "providers/hashicorp", |
| "providers/http", |
| "providers/imap", |
| "providers/influxdb", |
| "providers/informatica", |
| "providers/jdbc", |
| "providers/jenkins", |
| "providers/keycloak", |
| "providers/microsoft/azure", |
| "providers/microsoft/mssql", |
| "providers/microsoft/psrp", |
| "providers/microsoft/winrm", |
| "providers/mongo", |
| "providers/mysql", |
| "providers/neo4j", |
| "providers/odbc", |
| "providers/openai", |
| "providers/openfaas", |
| "providers/openlineage", |
| "providers/opensearch", |
| "providers/opsgenie", |
| "providers/oracle", |
| "providers/pagerduty", |
| "providers/papermill", |
| "providers/pgvector", |
| "providers/pinecone", |
| "providers/postgres", |
| "providers/presto", |
| "providers/qdrant", |
| "providers/redis", |
| "providers/salesforce", |
| "providers/samba", |
| "providers/segment", |
| "providers/sendgrid", |
| "providers/sftp", |
| "providers/singularity", |
| "providers/slack", |
| "providers/smtp", |
| "providers/snowflake", |
| "providers/sqlite", |
| "providers/ssh", |
| "providers/standard", |
| "providers/tableau", |
| "providers/telegram", |
| "providers/teradata", |
| "providers/trino", |
| "providers/vertica", |
| "providers/weaviate", |
| "providers/yandex", |
| "providers/ydb", |
| "providers/zendesk", |
| # End of automatically generated provider workspace members |
| ] |