# 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.2",
    "pathspec==1.1.1",
    "pluggy==1.6.0",
    "tomli==2.4.1; python_version < '3.11'",
    "trove-classifiers==2026.5.20.19",
]
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.15"
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",
    "Programming Language :: Python :: 3.14",
    "Topic :: System :: Monitoring",
]

# Version is defined in src/airflow/__init__.py and it is automatically synchronized by prek
version = "3.2.2"

dependencies = [
    "apache-airflow-task-sdk==1.2.2",
    "apache-airflow-core==3.2.2",
]

packages = []

[project.scripts]
# Definition allowing direct execution via `uvx apache-airflow ...`
apache-airflow = "airflow.__main__:main"

[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; python_version !=\"3.14\""
]
"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"
]
"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>=3.6.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.9.0" # Set from MIN_VERSION_OVERRIDE in update_airflow_pyproject_toml.py
]
"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; python_version !=\"3.14\"",
    "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",
    "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>=3.6.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.9.0", # Set from MIN_VERSION_OVERRIDE in update_airflow_pyproject_toml.py
    "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.11.16",
]

[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
    "SIM105", # Use contextlib.suppress({exception}) instead of try-except-pass
    "PTH206", # Checks for uses of .split(os.sep)
]
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
]
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"]
"scripts/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 = [
    "airflow_mypy.plugins.decorators",
    "airflow_mypy.plugins.outputs",
]
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-scripts",
    "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-serialization",
    "apache-airflow-shared-template-rendering",
    "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]
# Bump this only when the project actually relies on a newer uv feature/fix. It is a
# minimum contributors must install, NOT the uv CI pins to — keeping it in lockstep
# with AIRFLOW_UV_VERSION would force everyone to upgrade uv on every release. The
# breeze/prek uv version checks read this value dynamically and tolerate a stale
# floor; `scripts/ci/prek/upgrade_important_versions.py` deliberately skips it.
required-version = ">=0.11.8"
no-build-isolation-package = ["sphinx-redoc"]
# Synchroonize with scripts/ci/prek/upgrade_important_versions.py
exclude-newer = "4 days"

[tool.uv.exclude-newer-package]
# Automatically generated exclude-newer-package entries (update_airflow_pyproject_toml.py)
apache-airflow = false
apache-airflow-breeze = false
apache-airflow-core = false
apache-airflow-ctl = false
apache-airflow-ctl-tests = false
apache-airflow-dev = false
apache-airflow-devel-common = false
apache-airflow-docker-tests = false
apache-airflow-e2e-tests = false
apache-airflow-helm-tests = false
apache-airflow-kubernetes-tests = false
apache-airflow-mypy = false
apache-airflow-providers = false
apache-airflow-providers-airbyte = false
apache-airflow-providers-alibaba = false
apache-airflow-providers-amazon = false
apache-airflow-providers-apache-cassandra = false
apache-airflow-providers-apache-drill = false
apache-airflow-providers-apache-druid = false
apache-airflow-providers-apache-flink = false
apache-airflow-providers-apache-hdfs = false
apache-airflow-providers-apache-hive = false
apache-airflow-providers-apache-iceberg = false
apache-airflow-providers-apache-impala = false
apache-airflow-providers-apache-kafka = false
apache-airflow-providers-apache-kylin = false
apache-airflow-providers-apache-livy = false
apache-airflow-providers-apache-pig = false
apache-airflow-providers-apache-pinot = false
apache-airflow-providers-apache-spark = false
apache-airflow-providers-apache-tinkerpop = false
apache-airflow-providers-apprise = false
apache-airflow-providers-arangodb = false
apache-airflow-providers-asana = false
apache-airflow-providers-atlassian-jira = false
apache-airflow-providers-celery = false
apache-airflow-providers-cloudant = false
apache-airflow-providers-cncf-kubernetes = false
apache-airflow-providers-cohere = false
apache-airflow-providers-common-ai = false
apache-airflow-providers-common-compat = false
apache-airflow-providers-common-io = false
apache-airflow-providers-common-messaging = false
apache-airflow-providers-common-sql = false
apache-airflow-providers-databricks = false
apache-airflow-providers-datadog = false
apache-airflow-providers-dbt-cloud = false
apache-airflow-providers-dingding = false
apache-airflow-providers-discord = false
apache-airflow-providers-docker = false
apache-airflow-providers-edge3 = false
apache-airflow-providers-elasticsearch = false
apache-airflow-providers-exasol = false
apache-airflow-providers-fab = false
apache-airflow-providers-facebook = false
apache-airflow-providers-ftp = false
apache-airflow-providers-git = false
apache-airflow-providers-github = false
apache-airflow-providers-google = false
apache-airflow-providers-grpc = false
apache-airflow-providers-hashicorp = false
apache-airflow-providers-http = false
apache-airflow-providers-imap = false
apache-airflow-providers-influxdb = false
apache-airflow-providers-informatica = false
apache-airflow-providers-jdbc = false
apache-airflow-providers-jenkins = false
apache-airflow-providers-keycloak = false
apache-airflow-providers-microsoft-azure = false
apache-airflow-providers-microsoft-mssql = false
apache-airflow-providers-microsoft-psrp = false
apache-airflow-providers-microsoft-winrm = false
apache-airflow-providers-mongo = false
apache-airflow-providers-mysql = false
apache-airflow-providers-neo4j = false
apache-airflow-providers-odbc = false
apache-airflow-providers-openai = false
apache-airflow-providers-openfaas = false
apache-airflow-providers-openlineage = false
apache-airflow-providers-opensearch = false
apache-airflow-providers-opsgenie = false
apache-airflow-providers-oracle = false
apache-airflow-providers-pagerduty = false
apache-airflow-providers-papermill = false
apache-airflow-providers-pgvector = false
apache-airflow-providers-pinecone = false
apache-airflow-providers-postgres = false
apache-airflow-providers-presto = false
apache-airflow-providers-qdrant = false
apache-airflow-providers-redis = false
apache-airflow-providers-salesforce = false
apache-airflow-providers-samba = false
apache-airflow-providers-segment = false
apache-airflow-providers-sendgrid = false
apache-airflow-providers-sftp = false
apache-airflow-providers-singularity = false
apache-airflow-providers-slack = false
apache-airflow-providers-smtp = false
apache-airflow-providers-snowflake = false
apache-airflow-providers-sqlite = false
apache-airflow-providers-ssh = false
apache-airflow-providers-standard = false
apache-airflow-providers-tableau = false
apache-airflow-providers-telegram = false
apache-airflow-providers-teradata = false
apache-airflow-providers-trino = false
apache-airflow-providers-vertica = false
apache-airflow-providers-weaviate = false
apache-airflow-providers-yandex = false
apache-airflow-providers-ydb = false
apache-airflow-providers-zendesk = false
apache-airflow-scripts = false
apache-airflow-shared-configuration = false
apache-airflow-shared-dagnode = false
apache-airflow-shared-listeners = false
apache-airflow-shared-logging = false
apache-airflow-shared-module-loading = false
apache-airflow-shared-observability = false
apache-airflow-shared-plugins-manager = false
apache-airflow-shared-providers-discovery = false
apache-airflow-shared-secrets-backend = false
apache-airflow-shared-secrets-masker = false
apache-airflow-shared-serialization = false
apache-airflow-shared-template-rendering = false
apache-airflow-shared-timezones = false
apache-airflow-task-sdk = false
apache-airflow-task-sdk-integration-tests = false
apache-aurflow-docker-stack = false
# End of automatically generated exclude-newer-package entries

# Manual overrides (kept outside the auto-generated block above so the
# update_airflow_pyproject_toml.py script doesn't clobber them).
# Starlette 1.0.1 carries a Host-header parsing fix that prevents
# `request.url.path` from diverging from `scope["path"]` when the Host header
# contains characters invalid per RFC 9110 §7.2. The fix landed too recently
# to be admitted by the global 4-day cooldown; this override lets the floor
# bump in `airflow-core/pyproject.toml` resolve.
# REMOVE BY 2026-05-26 — once 1.0.1 is older than the global 4-day cooldown
# this override is redundant and should be deleted along with the line below.
starlette = "6 hours"

[tool.uv.pip]
# Synchroonize with scripts/ci/prek/upgrade_important_versions.py
exclude-newer = "4 days"

[tool.uv.pip.exclude-newer-package]
# Automatically generated exclude-newer-package-pip entries (update_airflow_pyproject_toml.py)
apache-airflow = false
apache-airflow-breeze = false
apache-airflow-core = false
apache-airflow-ctl = false
apache-airflow-ctl-tests = false
apache-airflow-dev = false
apache-airflow-devel-common = false
apache-airflow-docker-tests = false
apache-airflow-e2e-tests = false
apache-airflow-helm-tests = false
apache-airflow-kubernetes-tests = false
apache-airflow-mypy = false
apache-airflow-providers = false
apache-airflow-providers-airbyte = false
apache-airflow-providers-alibaba = false
apache-airflow-providers-amazon = false
apache-airflow-providers-apache-cassandra = false
apache-airflow-providers-apache-drill = false
apache-airflow-providers-apache-druid = false
apache-airflow-providers-apache-flink = false
apache-airflow-providers-apache-hdfs = false
apache-airflow-providers-apache-hive = false
apache-airflow-providers-apache-iceberg = false
apache-airflow-providers-apache-impala = false
apache-airflow-providers-apache-kafka = false
apache-airflow-providers-apache-kylin = false
apache-airflow-providers-apache-livy = false
apache-airflow-providers-apache-pig = false
apache-airflow-providers-apache-pinot = false
apache-airflow-providers-apache-spark = false
apache-airflow-providers-apache-tinkerpop = false
apache-airflow-providers-apprise = false
apache-airflow-providers-arangodb = false
apache-airflow-providers-asana = false
apache-airflow-providers-atlassian-jira = false
apache-airflow-providers-celery = false
apache-airflow-providers-cloudant = false
apache-airflow-providers-cncf-kubernetes = false
apache-airflow-providers-cohere = false
apache-airflow-providers-common-ai = false
apache-airflow-providers-common-compat = false
apache-airflow-providers-common-io = false
apache-airflow-providers-common-messaging = false
apache-airflow-providers-common-sql = false
apache-airflow-providers-databricks = false
apache-airflow-providers-datadog = false
apache-airflow-providers-dbt-cloud = false
apache-airflow-providers-dingding = false
apache-airflow-providers-discord = false
apache-airflow-providers-docker = false
apache-airflow-providers-edge3 = false
apache-airflow-providers-elasticsearch = false
apache-airflow-providers-exasol = false
apache-airflow-providers-fab = false
apache-airflow-providers-facebook = false
apache-airflow-providers-ftp = false
apache-airflow-providers-git = false
apache-airflow-providers-github = false
apache-airflow-providers-google = false
apache-airflow-providers-grpc = false
apache-airflow-providers-hashicorp = false
apache-airflow-providers-http = false
apache-airflow-providers-imap = false
apache-airflow-providers-influxdb = false
apache-airflow-providers-informatica = false
apache-airflow-providers-jdbc = false
apache-airflow-providers-jenkins = false
apache-airflow-providers-keycloak = false
apache-airflow-providers-microsoft-azure = false
apache-airflow-providers-microsoft-mssql = false
apache-airflow-providers-microsoft-psrp = false
apache-airflow-providers-microsoft-winrm = false
apache-airflow-providers-mongo = false
apache-airflow-providers-mysql = false
apache-airflow-providers-neo4j = false
apache-airflow-providers-odbc = false
apache-airflow-providers-openai = false
apache-airflow-providers-openfaas = false
apache-airflow-providers-openlineage = false
apache-airflow-providers-opensearch = false
apache-airflow-providers-opsgenie = false
apache-airflow-providers-oracle = false
apache-airflow-providers-pagerduty = false
apache-airflow-providers-papermill = false
apache-airflow-providers-pgvector = false
apache-airflow-providers-pinecone = false
apache-airflow-providers-postgres = false
apache-airflow-providers-presto = false
apache-airflow-providers-qdrant = false
apache-airflow-providers-redis = false
apache-airflow-providers-salesforce = false
apache-airflow-providers-samba = false
apache-airflow-providers-segment = false
apache-airflow-providers-sendgrid = false
apache-airflow-providers-sftp = false
apache-airflow-providers-singularity = false
apache-airflow-providers-slack = false
apache-airflow-providers-smtp = false
apache-airflow-providers-snowflake = false
apache-airflow-providers-sqlite = false
apache-airflow-providers-ssh = false
apache-airflow-providers-standard = false
apache-airflow-providers-tableau = false
apache-airflow-providers-telegram = false
apache-airflow-providers-teradata = false
apache-airflow-providers-trino = false
apache-airflow-providers-vertica = false
apache-airflow-providers-weaviate = false
apache-airflow-providers-yandex = false
apache-airflow-providers-ydb = false
apache-airflow-providers-zendesk = false
apache-airflow-scripts = false
apache-airflow-shared-configuration = false
apache-airflow-shared-dagnode = false
apache-airflow-shared-listeners = false
apache-airflow-shared-logging = false
apache-airflow-shared-module-loading = false
apache-airflow-shared-observability = false
apache-airflow-shared-plugins-manager = false
apache-airflow-shared-providers-discovery = false
apache-airflow-shared-secrets-backend = false
apache-airflow-shared-secrets-masker = false
apache-airflow-shared-serialization = false
apache-airflow-shared-template-rendering = false
apache-airflow-shared-timezones = false
apache-airflow-task-sdk = false
apache-airflow-task-sdk-integration-tests = false
apache-aurflow-docker-stack = false
# End of automatically generated exclude-newer-package-pip entries

# Manual overrides — see the matching block under
# `[tool.uv.exclude-newer-package]` above for rationale.
# REMOVE BY 2026-05-26 along with the matching entry above.
starlette = "6 hours"


[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-mypy = {workspace = true}
apache-airflow-scripts = {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-serialization = { workspace = true }
apache-airflow-shared-template-rendering = { 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/mypy",
    "dev/registry",
    "airflow-ctl",
    "airflow-ctl-tests",
    "dev",
    "devel-common",
    "scripts",
    "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/serialization",
    "shared/template_rendering",
    "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
]
