# 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-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
   licenses/LICENSE-python-nvd3.txt
   licenses/LICENSE-python-slugify.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
    # 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"
    colorlog>=4.0.2
    connexion[swagger-ui,flask]>=2.6.0,<3
    croniter>=0.3.17, <0.4
    cryptography>=0.9.3
    dill>=0.2.2, <0.4
    flask>=1.1.0, <2.0
    flask-appbuilder~=3.1,>=3.1.1
    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, <20.0
    importlib_metadata~=1.7;python_version<"3.9" # We could work with 3.1, but argparse needs <2
    importlib_resources~=1.4
    iso8601>=0.1.12
    itsdangerous>=1.1.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"
    # 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
    requests>=2.20.0
    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
    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
