# 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/
long_description = file: README.md
long_description_content_type = text/markdown
license = Apache License 2.0
license_files =
   LICENSE
   NOTICE
# Start of licenses generated automatically
   licenses/LICENSE-bootstrap.txt
   licenses/LICENSE-bootstrap3-typeahead.txt
   licenses/LICENSE-connexion.txt
   licenses/LICENSE-d3-shape.txt
   licenses/LICENSE-d3-tip.txt
   licenses/LICENSE-d3js.txt
   licenses/LICENSE-dagre-d3.txt
   licenses/LICENSE-datatables.txt
   licenses/LICENSE-elasticmock.txt
   licenses/LICENSE-eonasdan-bootstrap-datetimepicker.txt
   licenses/LICENSE-flask-kerberos.txt
   licenses/LICENSE-hue.txt
   licenses/LICENSE-jqclock.txt
   licenses/LICENSE-jquery.txt
   licenses/LICENSE-moment-strftime.txt
   licenses/LICENSE-moment.txt
   licenses/LICENSE-normalize.txt
# End of licences generated automatically
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.6
    Programming Language :: Python :: 3.7
    Programming Language :: Python :: 3.8
    Topic :: System :: Monitoring
project_urls =
    Documentation=https://airflow.apache.org/docs/
    Bug Tracker=https://github.com/apache/airflow/issues
    Source Code=https://github.com/apache/airflow

[options]
zip_safe = False
include_package_data = True
python_requires = ~=3.6
packages = find:
setup_requires =
    bowler
    docutils
    gitpython
    setuptools
    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>=1.2, <2.0
    argcomplete~=1.10
    attrs>=20.0, <21.0
    blinker
    cached_property~=1.5;python_version<="3.7"
    # cattrs >= 1.1.0 dropped support for Python 3.6
    cattrs>=1.0, <1.1.0;python_version<="3.6"
    cattrs~=1.1;python_version>"3.6"
    # Required by vendored-in connexion
    clickclick>=1.2
    colorlog>=4.0.2
    croniter>=0.3.17, <1.1
    cryptography>=0.9.3
    dataclasses;python_version<"3.7"
    dill>=0.2.2, <0.4
    flask>=1.1.0, <2.0
    flask-appbuilder~=3.3
    flask-caching>=1.5.0, <2.0.0
    flask-login>=0.3, <0.5
    flask-wtf>=0.14.3, <0.15
    graphviz>=0.12
    gunicorn>=19.5.0
    httpx
    importlib_metadata~=1.7;python_version<"3.9" # We could work with 3.1, but argparse needs <2
    importlib_resources~=1.4
    # Required by vendored-in connexion
    inflection>=0.3.1
    iso8601>=0.1.12
    # Logging is broken with itsdangerous > 2
    itsdangerous>=1.1.0, <2.0
    jinja2>=2.10.1, <2.12.0
    jsonschema~=3.0
    lazy-object-proxy
    lockfile>=0.12.2
    markdown>=2.5.2, <4.0
    markupsafe>=1.1.1, <2.0
    marshmallow-oneofschema>=2.0.1
    # Numpy stopped releasing 3.6 binaries for 1.20.* series.
    numpy<1.20;python_version<"3.7"
    numpy;python_version>="3.7"
    # Required by vendored-in connexion
    openapi-spec-validator>=0.2.4
    # Pandas stopped releasing 3.6 binaries for 1.2.* series.
    pandas>=0.17.1, <1.2;python_version<"3.7"
    pandas>=0.17.1, <2.0;python_version>="3.7"
    pendulum~=2.0
    pep562~=1.0;python_version<"3.7"
    psutil>=4.2.0, <6.0.0
    pygments>=2.0.1, <3.0
    # Required for flask-jwt-extended and msal
    pyjwt<2
    # python daemon crashes with 'socket operation on non-socket' for python 3.8+ in version < 2.2.4
    # https://pagure.io/python-daemon/issue/34
    python-daemon>=2.2.4
    python-dateutil>=2.3, <3
    python-nvd3~=0.15.0
    python-slugify>=3.0.0,<5.0
    # Required for flask-openID which comes with flask-appbuilder in case of poetry installation
    # earlier versions of the dependency are installed but they do not work for Python 3
    # (pip installs the right version).
    # More info: https://github.com/apache/airflow/issues/13149#issuecomment-748705193
    python3-openid~=3.2
    # Required by vendored-in connexion
    pyyaml>=5.1
    rich>=9.2.0
    setproctitle>=1.1.8, <2
    # SQLAlchemy 1.4 breaks sqlalchemy-utils https://github.com/kvesteri/sqlalchemy-utils/issues/505
    sqlalchemy>=1.3.18, <1.4
    sqlalchemy_jsonfield~=1.0
    # Required by vendored-in connexion
    swagger-ui-bundle>=0.0.2
    tabulate>=0.7.5, <0.9
    tenacity~=6.2.0
    termcolor>=1.1.0
    typing-extensions>=3.7.4;python_version<"3.8"
    unicodecsv>=0.14.1
    werkzeug~=1.0, >=1.0.1

[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

[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 =
  airflow.mypy.plugin.decorators
pretty = True

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

[isort]
line_length=110
combine_as_imports = true
default_section = THIRDPARTY
known_first_party=airflow,tests
# Need to be consistent with the exclude config defined in pre-commit-config.yaml
skip=build,.tox,venv
profile = black
