# SPDX-License-Identifier: Apache-2.0
#
# The OpenSearch Contributors require contributions made to
# this file be licensed under the Apache-2.0 license or a
# compatible open source license.
# Modifications Copyright OpenSearch Contributors. See
# GitHub history for details.
# Licensed to Elasticsearch B.V. under one or more contributor
# license agreements. See the NOTICE file distributed with
# this work for additional information regarding copyright
# ownership. Elasticsearch B.V. 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.

from os.path import join, dirname

try:
    from setuptools import setup, find_packages
except ImportError:
    print("*** Could not find setuptools. Did you install pip3? *** \n\n")
    raise


def str_from_file(name):
    with open(join(dirname(__file__), name)) as f:
        return f.read().strip()


raw_version = str_from_file("version.txt")
VERSION = raw_version.split(".")
__version__ = VERSION
__versionstr__ = raw_version

long_description = str_from_file("README.md")

# tuples of (major, minor) of supported Python versions ordered from lowest to highest
supported_python_versions = [(3, 8), (3, 9)]

################################################################################################
#
# Adapt `create-notice.sh` whenever changing dependencies here. Also, rerun
# `pip install -e .` after changing dependencies to ensure that all
# dependencies are up to date when testing in the virtual environment
#
# That script grabs all license files so we include them in the notice file.
#
################################################################################################
install_requires = [
    # License: Apache 2.0
    # transitive dependencies:
    #   urllib3: MIT
    #   aiohttp: Apache 2.0
    "opensearch-py[async]==1.0.0",
    # License: BSD
    "psutil==5.8.0",
    # License: MIT
    "py-cpuinfo==7.0.0",
    # License: MIT
    "tabulate==0.8.7",
    # License: MIT
    "jsonschema==3.1.1",
    # License: BSD
    "Jinja2==2.11.3",
    # License: BSD
    "markupsafe==2.0.1",
    # License: MIT
    "thespian==3.10.1",
    # recommended library for thespian to identify actors more easily with `ps`
    # "setproctitle==1.1.10",
    # always use the latest version, these are certificate files...
    # License: MPL 2.0
    "certifi",
    # License: Apache 2.0
    "yappi==1.2.3",
    # License: BSD
    "ijson==2.6.1",
    # License: Apache 2.0
    # transitive dependencies:
    #   google-crc32c: Apache 2.0
    "google-resumable-media==1.1.0",
    # License: Apache 2.0
    "google-auth==1.22.1"
]

s3_require = [
    # License: Apache 2.0
    # transitive dependencies:
    #   botocore: Apache 2.0
    #   jmespath: MIT
    #   s3transfer: Apache 2.0
    "boto3==1.10.32",
]

tests_require = [
    "ujson",
    "pytest==5.4.0",
    "pytest-benchmark==3.2.2",
    "pytest-asyncio==0.14.0"
]

# These packages are only required when developing Benchmark
develop_require = [
    "tox==3.14.0",
    "coverage==5.5",
    "twine==1.15.0",
    "wheel==0.33.6",
    "github3.py==1.3.0",
    "pylint==2.6.0",
    "pylint-quotes==0.2.1"
]

python_version_classifiers = ["Programming Language :: Python :: {}.{}".format(major, minor)
                              for major, minor in supported_python_versions]

first_supported_version = "{}.{}".format(supported_python_versions[0][0], supported_python_versions[0][1])
# next minor after the latest supported version
first_unsupported_version = "{}.{}".format(supported_python_versions[-1][0], supported_python_versions[-1][1] + 1)

setup(name="opensearch-benchmark",
      maintainer="Ian Hoang, Achit Ojha, Travis Benedict, Chase Engelbrecht, Govind Kamat, Phill Treddenick",
      maintainer_email="hoangia@amazon.com, achiojha@amazon.com, benedtra@amazon.com, engechas@amazon.com, govkamat@amazon.com, treddeni@amazon.com",
      version=__versionstr__,
      description="Macrobenchmarking framework for OpenSearch",
      long_description=long_description,
      long_description_content_type='text/markdown',
      url="https://github.com/opensearch-project/OpenSearch-Benchmark",
      license="Apache License, Version 2.0",
      packages=find_packages(
          where=".",
          exclude=("tests*", "benchmarks*", "it*")
      ),
      include_package_data=True,
      # supported Python versions. This will prohibit pip (> 9.0.0) from even installing Benchmark on an unsupported
      # Python version.
      # See also https://packaging.python.org/guides/distributing-packages-using-setuptools/#python-requires
      #
      # According to https://www.python.org/dev/peps/pep-0440/#version-matching, a trailing ".*" should
      # ignore patch versions:
      #
      # "additional trailing segments will be ignored when determining whether or not a version identifier matches
      # the clause"
      #
      # However, with the pattern ">=3.5.*,<=3.8.*", the version "3.8.0" is not accepted. Therefore, we match
      # the minor version after the last supported one (i.e. if 3.8 is the last supported, we'll emit "<3.9")
      python_requires=">={},<{}".format(first_supported_version, first_unsupported_version),
      package_data={"": ["*.json", "*.yml"]},
      install_requires=install_requires,
      test_suite="tests",
      tests_require=tests_require,
      extras_require={
          "develop": tests_require + develop_require + s3_require,
          "s3": s3_require
      },
      entry_points={
          "console_scripts": [
              "opensearch-benchmark=osbenchmark.benchmark:main",
              "opensearch-benchmarkd=osbenchmark.benchmarkd:main"
          ],
      },
      classifiers=[
          "Topic :: System :: Benchmark",
          "Development Status :: 5 - Production/Stable",
          "License :: OSI Approved :: Apache Software License",
          "Intended Audience :: Developers",
          "Operating System :: MacOS :: MacOS X",
          "Operating System :: POSIX",
          "Programming Language :: Python",
          "Programming Language :: Python :: 3",
      ] + python_version_classifiers,
      zip_safe=False)
