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

[metadata]
name = apache-airflow
summary = Programmatically author, schedule and monitor data pipelines
author = Apache Software Foundation
author_email = dev@airflow.apache.org
url = https://airflow.apache.org/
version = attr: airflow.__version__
long_description = file: README.md
long_description_content_type = text/markdown
license = Apache License 2.0
license_files =
   LICENSE
   NOTICE
   licenses/*.txt
classifiers =
    Development Status :: 5 - Production/Stable
    Environment :: Console
    Environment :: Web Environment
    Intended Audience :: Developers
    Intended Audience :: System Administrators
    License :: OSI Approved :: Apache Software License
    Programming Language :: Python :: 3.7
    Programming Language :: Python :: 3.8
    Programming Language :: Python :: 3.9
    Programming Language :: Python :: 3.10
    Programming Language :: Python :: 3.11
    Topic :: System :: Monitoring
    Framework :: Apache Airflow
project_urls =
    Documentation=https://airflow.apache.org/docs/
    Downloads=https://archive.apache.org/dist/airflow/
    Bug Tracker=https://github.com/apache/airflow/issues
    Source Code=https://github.com/apache/airflow
    Slack Chat=https://s.apache.org/airflow-slack
    Twitter=https://twitter.com/ApacheAirflow
    YouTube=https://www.youtube.com/channel/UCSXwxpWZQ7XZ1WL3wqevChA/

[options]
zip_safe = False
include_package_data = True
python_requires = ~=3.7
packages = find:
setup_requires =
    gitpython
    wheel
#####################################################################################################
# IMPORTANT NOTE!!!!!!!!!!!!!!!
# IF you are removing dependencies from this list, please make sure that you also increase
# DEPENDENCIES_EPOCH_NUMBER in the Dockerfile.ci
#####################################################################################################
install_requires =
    # 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
    alembic>=1.6.3, <2.0
    argcomplete>=1.10
    asgiref
    attrs>=22.1.0
    blinker
    cached_property>=1.5.0;python_version<="3.7"
    cattrs>=22.1.0
    # Colorlog 6.x merges TTYColoredFormatter into ColoredFormatter, breaking backwards compatibility with 4.x
    # Update CustomTTYColoredFormatter to remove
    colorlog>=4.0.2, <5.0
    configupdater>=3.1.1
    connexion[flask]>=2.10.0
    cron-descriptor>=1.2.24
    croniter>=0.3.17
    cryptography>=0.9.3
    deprecated>=1.2.13
    dill>=0.2.2
    # Flask 2.3 is scheduled to introduce a number of deprecation removals - some of them might be breaking
    # for our dependencies - notably `_app_ctx_stack` and `_request_ctx_stack` removals.
    # We should remove the limitation after 2.3 is released and our dependencies are updated to handle it
    flask>=2.2,<2.3
    # We are tightly coupled with FAB version because we vendored in part of FAB code related to security manager
    # This is done as part of preparation to removing FAB as dependency, but we are not ready for it yet
    # Every time we update FAB version here, please make sure that you review the classes and models in
    # `airflow/www/fab_security` with their upstream counterparts. In particular, make sure any breaking changes,
    # for example any new methods, are accounted for.
    # NOTE! When you change the value here, you also have to update flask-appbuilder[oauth] in setup.py
    flask-appbuilder==4.3.1
    flask-caching>=1.5.0
    flask-login>=0.6.2
    flask-session>=0.4.0
    flask-wtf>=0.15
    graphviz>=0.12
    gunicorn>=20.1.0
    httpx
    # Importlib-metadata 5 is breaking Celery import due to regression it introduced
    # This was tracked and fixed in https://github.com/celery/celery/pull/7785 but it is not released yet
    # We can remove the < 5.0.0 limitation when Celery 5.3.0 gets released and we bump celery to >= 5.3.0
    importlib_metadata>=1.7,<5.0.0;python_version<"3.9"
    importlib_resources>=5.2;python_version<"3.9"
    itsdangerous>=2.0
    jinja2>=3.0.0
    jsonschema>=4.0.0
    lazy-object-proxy
    linkify-it-py>=2.0.0
    lockfile>=0.12.2
    markdown>=3.0
    markdown-it-py>=2.1.0
    markupsafe>=1.1.1
    marshmallow-oneofschema>=2.0.1
    mdit-py-plugins>=0.3.0
    packaging>=14.0
    pathspec~=0.9.0
    pendulum>=2.0
    pluggy>=1.0
    psutil>=4.2.0
    pydantic>=1.10.0
    pygments>=2.0.1
    pyjwt>=2.0.0
    python-daemon>=3.0.0
    python-dateutil>=2.3
    python-nvd3>=0.15.0
    python-slugify>=5.0
    rfc3339_validator>=0.1.4
    rich>=12.4.4
    rich-argparse>=1.0.0
    setproctitle>=1.1.8
    # We use some deprecated features of sqlalchemy 2.0 and we should replace them before we can upgrade
    # See https://sqlalche.me/e/b8d9 for details of deprecated features
    # you can set environment variable SQLALCHEMY_WARN_20=1 to show all deprecation warnings.
    # The issue tracking it is https://github.com/apache/airflow/issues/28723
    sqlalchemy>=1.4,<2.0
    sqlalchemy_jsonfield>=1.0
    tabulate>=0.7.5
    tenacity>=6.2.0,!=8.2.0
    termcolor>=1.1.0
    typing-extensions>=4.0.0
    unicodecsv>=0.14.1
    werkzeug>=2.0

[options.packages.find]
include =
    airflow*

[options.package_data]
airflow=
    py.typed
    alembic.ini
    git_version
    customized_form_field_behaviours.schema.json
    provider_info.schema.json

airflow.api_connexion.openapi=*.yaml
airflow.serialization=*.json
airflow.utils=
    context.pyi

[options.data_files]
generated=
    generated/provider_dependencies.json

[options.entry_points]
console_scripts=
    airflow=airflow.__main__:main

[bdist_wheel]
python-tag=py3


[files]
packages = airflow

[easy_install]

[mypy]
ignore_missing_imports = True
no_implicit_optional = True
warn_redundant_casts = True
warn_unused_ignores = False
plugins =
  dev.mypy.plugin.decorators,
  dev.mypy.plugin.outputs
pretty = True
show_error_codes = True
# Mypy since 0.991 warns about type annotations being present in an untyped
# function since they are not checked and technically meaningless. Ideally we
# should make them meaningful by setting check_untyped_defs = True, but there
# are too many issues in those currently unchecked functions to make it viable
# in the short term, so this error is simply ignored for now.
disable_error_code = annotation-unchecked

[mypy-airflow.config_templates.default_webserver_config]
# This file gets written to user installs, so lets not litter it with type comments
disable_error_code = var-annotated

[mypy-airflow.migrations.*]
ignore_errors = True

# Let's assume all google.cloud packages have no implicit optional
# Most of them don't but even if they do, it does not matter
[mypy-google.cloud.*]
no_implicit_optional = False

# Let's assume all azure packages have no implicit optional
[mypy-azure.*]
no_implicit_optional = False
