# 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.
import io
import json
import os
import subprocess
import sys

from setuptools import find_packages, setup

BASE_DIR = os.path.abspath(os.path.dirname(__file__))
PACKAGE_JSON = os.path.join(BASE_DIR, "superset-frontend", "package.json")

with open(PACKAGE_JSON, "r") as package_file:
    version_string = json.load(package_file)["version"]

with io.open("README.md", "r", encoding="utf-8") as f:
    long_description = f.read()


def get_git_sha() -> str:
    try:
        s = subprocess.check_output(["git", "rev-parse", "HEAD"])
        return s.decode().strip()
    except Exception:
        return ""


GIT_SHA = get_git_sha()
version_info = {"GIT_SHA": GIT_SHA, "version": version_string}
print("-==-" * 15)
print("VERSION: " + version_string)
print("GIT SHA: " + GIT_SHA)
print("-==-" * 15)

VERSION_INFO_FILE = os.path.join(BASE_DIR, "superset", "static", "version_info.json")

with open(VERSION_INFO_FILE, "w") as version_file:
    json.dump(version_info, version_file)


setup(
    name="apache-superset",
    description="A modern, enterprise-ready business intelligence web application",
    long_description=long_description,
    long_description_content_type="text/markdown",
    version=version_string,
    packages=find_packages(),
    include_package_data=True,
    zip_safe=False,
    entry_points={
        "console_scripts": ["superset=superset.cli.main:superset"],
        # the `postgres` and `postgres+psycopg2://` schemes were removed in SQLAlchemy 1.4
        # add an alias here to prevent breaking existing databases
        "sqlalchemy.dialects": [
            "postgres.psycopg2 = sqlalchemy.dialects.postgresql:dialect",
            "postgres = sqlalchemy.dialects.postgresql:dialect",
        ],
    },
    install_requires=[
        "backoff>=1.8.0",
        "bleach>=3.0.2, <4.0.0",
        "cachelib>=0.4.1,<0.5",
        "celery>=5.2.2, <6.0.0",
        "click>=8.0.3",
        "colorama",
        "croniter>=0.3.28",
        "cron-descriptor",
        "cryptography>=39.0.0,<40",
        "deprecation>=2.1.0, <2.2.0",
        "flask>=2.1.3, <2.2",
        "flask-appbuilder>=4.3.0, <5.0.0",
        "flask-caching>=1.10.1, <1.11",
        "flask-compress>=1.13, <2.0",
        "flask-talisman>=1.0.0, <2.0",
        "flask-login==0.6.0",
        "flask-migrate>=3.1.0, <4.0",
        "flask-wtf>=1.0.1, <1.1",
        "func_timeout",
        "geopy",
        "graphlib-backport",
        "gunicorn>=20.1.0; sys_platform != 'win32'",
        "hashids>=1.3.1, <2",
        "holidays>=0.17.2, <0.18",
        "humanize",
        "isodate",
        "markdown>=3.0",
        "msgpack>=1.0.0, <1.1",
        "numpy==1.23.5",
        "pandas>=1.5.3, <1.6",
        "parsedatetime",
        "pgsanity",
        "polyline",
        "pyparsing>=3.0.6, <4",
        "python-dateutil",
        "python-dotenv",
        "python-geohash",
        "pyarrow>=10.0.1, <11",
        "pyyaml>=5.4",
        "PyJWT>=2.4.0, <3.0",
        "redis",
        "selenium>=3.141.0",
        "sshtunnel>=0.4.0, <0.5",
        "simplejson>=3.15.0",
        "slack_sdk>=3.1.1, <4",
        "sqlalchemy>=1.4, <2",
        "sqlalchemy-utils>=0.38.3, <0.39",
        "sqlparse>=0.4.3, <0.5",
        "tabulate>=0.8.9, <0.9",
        "typing-extensions>=4, <5",
        "waitress; sys_platform == 'win32'",
        "wtforms>=2.3.3, <2.4",
        "wtforms-json",
        "xlsxwriter>=3.0.7, <3.1",
    ],
    extras_require={
        "athena": ["pyathena[pandas]>=2, <3"],
        "aurora-data-api": ["preset-sqlalchemy-aurora-data-api>=0.2.8,<0.3"],
        "bigquery": [
            "pandas-gbq>=0.18.1",
            "sqlalchemy-bigquery>=1.5.0",
            "google-cloud-bigquery>=3.4.0",
        ],
        "clickhouse": ["clickhouse-connect>=0.4.6, <0.5"],
        "cockroachdb": ["cockroachdb>=0.3.5, <0.4"],
        "cors": ["flask-cors>=2.0.0"],
        "crate": ["crate[sqlalchemy]>=0.26.0, <0.27"],
        "databricks": [
            "databricks-sql-connector>=2.0.2, <3",
            "sqlalchemy-databricks>=0.2.0",
        ],
        "db2": ["ibm-db-sa>=0.3.5, <0.4"],
        "dremio": ["sqlalchemy-dremio>=1.1.5, <1.3"],
        "drill": ["sqlalchemy-drill==0.1.dev"],
        "druid": ["pydruid>=0.6.5,<0.7"],
        "dynamodb": ["pydynamodb>=0.4.2"],
        "solr": ["sqlalchemy-solr >= 0.2.0"],
        "elasticsearch": ["elasticsearch-dbapi>=0.2.9, <0.3.0"],
        "exasol": ["sqlalchemy-exasol >= 2.4.0, <3.0"],
        "excel": ["xlrd>=1.2.0, <1.3"],
        "firebird": ["sqlalchemy-firebird>=0.7.0, <0.8"],
        "firebolt": ["firebolt-sqlalchemy>=0.0.1"],
        "gsheets": ["shillelagh[gsheetsapi]>=1.0.14, <2"],
        "hana": ["hdbcli==2.4.162", "sqlalchemy_hana==0.4.0"],
        "hive": ["pyhive[hive]>=0.6.5", "tableschema", "thrift>=0.14.1, <1.0.0"],
        "impala": ["impyla>0.16.2, <0.17"],
        "kusto": ["sqlalchemy-kusto>=2.0.0, <3"],
        "kylin": ["kylinpy>=2.8.1, <2.9"],
        "mssql": ["pymssql>=2.1.4, <2.2"],
        "mysql": ["mysqlclient>=2.1.0, <3"],
        "oracle": ["cx-Oracle>8.0.0, <8.1"],
        "pinot": ["pinotdb>=0.3.3, <0.4"],
        "postgres": ["psycopg2-binary==2.9.5"],
        "presto": ["pyhive[presto]>=0.6.5"],
        "trino": ["trino>=0.319.0"],
        "prophet": ["prophet>=1.0.1, <1.1", "pystan<3.0"],
        "redshift": ["sqlalchemy-redshift>=0.8.1, < 0.9"],
        "rockset": ["rockset>=0.8.10, <0.9"],
        "shillelagh": [
            "shillelagh[datasetteapi,gsheetsapi,socrata,weatherapi]>=1.1.1, <2"
        ],
        "snowflake": ["snowflake-sqlalchemy>=1.2.4, <2"],
        "spark": ["pyhive[hive]>=0.6.5", "tableschema", "thrift>=0.14.1, <1.0.0"],
        "teradata": ["teradatasql>=16.20.0.23"],
        "thumbnails": ["Pillow>=9.3.0, <10.0.0"],
        "vertica": ["sqlalchemy-vertica-python>=0.5.9, < 0.6"],
        "netezza": ["nzalchemy>=11.0.2"],
    },
    python_requires="~=3.8",
    author="Apache Software Foundation",
    author_email="dev@superset.apache.org",
    url="https://superset.apache.org/",
    download_url="https://www.apache.org/dist/superset/" + version_string,
    classifiers=[
        "Programming Language :: Python :: 3.8",
        "Programming Language :: Python :: 3.9",
        "Programming Language :: Python :: 3.10",
        "Programming Language :: Python :: 3.11",
    ],
)
