| # 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 = [ |
| "GitPython==3.1.45", |
| "gitdb==4.0.12", |
| "hatchling==1.27.0", |
| "packaging==25.0", |
| "pathspec==0.12.1", |
| "pluggy==1.6.0", |
| "smmap==5.0.2", |
| "tomli==2.2.1; python_version < '3.11'", |
| "trove-classifiers==2025.9.11.17", |
| ] |
| build-backend = "hatchling.build" |
| |
| |
| [project] |
| name = "apache-airflow-core" |
| description = "Core packages for Apache Airflow, schedule and API server" |
| readme = { file = "README.md", content-type = "text/markdown" } |
| license-files.globs = ["LICENSE", "3rd-party-licenses/*.txt", "NOTICE"] |
| # We know that it will take a while before we can support Python 3.14 because of all our dependencies |
| # It takes about 4-7 months after Python release before we can support it, so we limit it to <3.14 |
| # proactively. This way we also have a chance to test it with Python 3.14 and bump the upper binding |
| # and manually mark providers that do not support it yet with !-3.14 - until they support it - which will |
| # also exclude resolving uv workspace dependencies for those providers. |
| 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", |
| "License :: OSI Approved :: Apache Software License", |
| "Programming Language :: Python :: 3.10", |
| "Programming Language :: Python :: 3.11", |
| "Programming Language :: Python :: 3.12", |
| "Topic :: System :: Monitoring", |
| ] |
| |
| # Version is defined in src/airflow/__init__.py and it is automatically synchronized by prek hook |
| version = "3.2.0" |
| |
| dependencies = [ |
| "a2wsgi>=1.10.8", |
| "aiosqlite>=0.20.0", |
| # Alembic is important to handle our migrations in predictable and performant way. It is developed |
| # together with SQLAlchemy. Our experience with Alembic is that it very stable in minor version |
| # The 1.13.0 of alembic marked some migration code as SQLAlchemy 2+ only so we limit it to 1.13.1 |
| "alembic>=1.13.1, <2.0", |
| "argcomplete>=1.10", |
| "asgiref>=2.3.0", |
| "attrs>=22.1.0, !=25.2.0", |
| "cadwyn>=5.2.1", |
| "colorlog>=6.8.2", |
| "cron-descriptor>=1.2.24", |
| "croniter>=2.0.2", |
| "cryptography>=41.0.0", |
| "deprecated>=1.2.13", |
| "dill>=0.2.2", |
| "fastapi[standard-no-fastapi-cloud-cli]>=0.116.0,<0.118.0", |
| "starlette>=0.45.0", |
| "httpx>=0.25.0", |
| 'importlib_metadata>=6.5;python_version<"3.12"', |
| 'importlib_metadata>=7.0;python_version>="3.12"', |
| "itsdangerous>=2.0", |
| "jinja2>=3.1.5", |
| "jsonschema>=4.19.1", |
| "lazy-object-proxy>=1.2.0", |
| 'libcst >=1.8.2', |
| "linkify-it-py>=2.0.0", |
| "lockfile>=0.12.2", |
| "methodtools>=0.4.7", |
| "natsort>=8.4.0", |
| "opentelemetry-api>=1.27.0", |
| "opentelemetry-exporter-otlp>=1.27.0", |
| # opentelemetry-proto is a transitive dependency of |
| # opentelemetry-exporter-otlp and other OpenTelemetry packages. |
| # opentelemetry-proto adds a very restrictive dependency on |
| # protobuf, causing conflicts with other packages, so to help |
| # the pip resolver we add it as a direct dependency with an upper |
| # bound, which signals to the pip resolver it is a problematic |
| # dependency and should be resolved as early as possible. |
| # This may be removed when future versions of pip are able |
| # to handle this dependency resolution automatically. |
| "opentelemetry-proto<9999,>=1.27.0", |
| "packaging>=25.0", |
| "pathspec>=0.9.0", |
| 'pendulum>=3.1.0', |
| "pluggy>=1.5.0", |
| "psutil>=5.8.0", |
| "pydantic>=2.11.0", |
| # Pygments 2.19.0 improperly renders .ini files with dictionaries as values |
| # See https://github.com/pygments/pygments/issues/2834 |
| "pygments>=2.0.1,!=2.19.0", |
| "pyjwt>=2.10.0", |
| "python-daemon>=3.0.0", |
| "python-dateutil>=2.7.0", |
| "python-slugify>=5.0", |
| # Requests 3 if it will be released, will be heavily breaking. |
| "requests>=2.32.0,<3", |
| "rich-argparse>=1.0.0", |
| "rich>=13.6.0", |
| "setproctitle>=1.3.3", |
| # The issue tracking deprecations for sqlalchemy 2 is https://github.com/apache/airflow/issues/28723 |
| "sqlalchemy[asyncio]>=1.4.49", |
| "sqlalchemy-jsonfield>=1.0", |
| "sqlalchemy-utils>=0.41.2", |
| "svcs>=25.1.0", |
| "tabulate>=0.9.0", |
| "tenacity>=8.3.0", |
| "termcolor>=3.0.0", |
| "typing-extensions>=4.14.1", |
| # https://github.com/apache/airflow/issues/56369 , rework universal-pathlib usage |
| "universal-pathlib>=0.2.6,<0.3.0", |
| "uuid6>=2024.7.10", |
| "apache-airflow-task-sdk<1.3.0,>=1.1.0", |
| # pre-installed providers |
| "apache-airflow-providers-common-compat>=1.7.4", |
| "apache-airflow-providers-common-io>=1.6.3", |
| "apache-airflow-providers-common-sql>=1.28.1", |
| "apache-airflow-providers-smtp>=2.3.1", |
| "apache-airflow-providers-standard>=1.9.0", |
| # Start of shared logging dependencies |
| "msgspec>=0.19.0", |
| "pygtrie>=2.5.0", |
| "structlog>=25.4.0", |
| # End of shared logging dependencies |
| ] |
| |
| |
| [project.optional-dependencies] |
| "async" = [ |
| "eventlet>=0.37.0", |
| "gevent>=25.4.1", |
| "greenlet>=3.1.0", |
| "greenback>=1.2.1", |
| ] |
| "graphviz" = [ |
| # The graphviz package creates friction when installing on MacOS as it needs graphviz system package to |
| # be installed, and it's really only used for very obscure features of Airflow, so we can skip it on MacOS |
| # Instead, if someone attempts to use it on MacOS, they will get explanatory error on how to install it |
| "graphviz>=0.20; sys_platform != 'darwin'", |
| ] |
| "kerberos" = [ |
| "pykerberos>=1.1.13", |
| "requests-kerberos>=0.14.0", |
| "thrift-sasl>=0.4.2", |
| ] |
| "otel" = [ |
| "opentelemetry-exporter-prometheus>=0.47b0", |
| ] |
| "sentry" = [ |
| "blinker>=1.1", |
| # Apparently sentry needs flask to be installed to work properly |
| "sentry-sdk[flask]>=2.30.0", |
| ] |
| "statsd" = [ |
| "statsd>=3.3.0", |
| ] |
| "all" = [ |
| "apache-airflow-core[graphviz,kerberos,otel,sentry,statsd]" |
| ] |
| |
| [project.scripts] |
| airflow = "airflow.__main__:main" |
| |
| [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.version] |
| path = "src/airflow/__init__.py" |
| |
| [tool.hatch.build.targets.sdist] |
| include = [ |
| "src/airflow", |
| "NOTICE" |
| ] |
| exclude = [ |
| "src/airflow/ui/node_modules/", |
| "src/airflow/api_fastapi/auth/managers/simple/ui/node_modules", |
| "src/airflow/ui/openapi.merged.json", |
| ] |
| |
| [tool.hatch.build.targets.sdist.force-include] |
| "../shared/logging/src/airflow_shared/logging" = "src/airflow/_shared/logging" |
| "../shared/secrets_masker/src/airflow_shared/secrets_masker" = "src/airflow/_shared/secrets_masker" |
| "../shared/timezones/src/airflow_shared/timezones" = "src/airflow/_shared/timezones" |
| |
| [tool.hatch.build.targets.custom] |
| path = "./hatch_build.py" |
| |
| artifacts = [ |
| "src/airflow/ui/dist/", |
| "src/airflow/api_fastapi/auth/managers/simple/ui/dist/", |
| "src/airflow/git_version", |
| "generated/", |
| ] |
| |
| [tool.hatch.build.targets.wheel] |
| packages = ['src/airflow'] |
| artifacts = [ |
| "src/airflow/ui/dist/", |
| "src/airflow/api_fastapi/auth/managers/simple/ui/dist/", |
| "src/airflow/git_version" |
| ] |
| exclude = [ |
| "src/airflow/ui/node_modules/", |
| "src/airflow/api_fastapi/auth/managers/simple/ui/node_modules", |
| "src/airflow/ui/openapi.merged.json", |
| ] |
| |
| [dependency-groups] |
| dev = [ |
| "apache-airflow-core[all]", |
| "apache-airflow-ctl", |
| "apache-airflow-devel-common", |
| "apache-airflow-task-sdk", |
| # TODO(potiuk): eventually we do not want any providers nor apache-airflow extras to be needed for |
| # airflow-core tests |
| "apache-airflow[pandas,polars]", |
| "apache-airflow-providers-amazon", |
| "apache-airflow-providers-celery", |
| "apache-airflow-providers-cncf-kubernetes", |
| "apache-airflow-providers-fab>=2.2.0; python_version < '3.13'", |
| "apache-airflow-providers-git", |
| "apache-airflow-providers-ftp", |
| ] |
| |
| # 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]" |
| ] |
| |
| |
| [tool.uv] |
| required-version = ">=0.6.3" |
| |
| [tool.uv.sources] |
| apache-airflow-core = {workspace = true} |
| apache-airflow-devel-common = { workspace = true } |
| |
| [tool.airflow] |
| shared_distributions = [ |
| "apache-airflow-shared-logging", |
| "apache-airflow-shared-secrets-masker", |
| "apache-airflow-shared-timezones", |
| ] |