# Copyright 2017 Hynek Schlawack

# Licensed 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 codecs
import os
import re

from setuptools import find_packages, setup


###############################################################################

NAME = "environ-config"
KEYWORDS = ["app", "config", "env", "cfg"]
PROJECT_URLS = {
    "Changelog": "https://environ-config.rtfd.io/en/stable/changelog.html",
    "Bug Tracker": "https://github.com/hynek/environ-config/issues",
    "Source Code": "https://github.com/hynek/environ-config",
    "Funding": "https://github.com/sponsors/hynek",
    "Ko-fi": "https://ko-fi.com/the_hynek",
}

META_PATH = os.path.join("src", "environ", "__init__.py")
CLASSIFIERS = [
    "Development Status :: 5 - Production/Stable",
    "Intended Audience :: Developers",
    "Natural Language :: English",
    "License :: OSI Approved :: Apache Software License",
    "Operating System :: OS Independent",
    "Programming Language :: Python",
    "Programming Language :: Python :: 3",
    "Programming Language :: Python :: 3.7",
    "Programming Language :: Python :: 3.8",
    "Programming Language :: Python :: 3.9",
    "Programming Language :: Python :: 3.10",
    "Programming Language :: Python :: Implementation :: CPython",
    "Programming Language :: Python :: Implementation :: PyPy",
    "Topic :: Software Development :: Libraries :: Python Modules",
]
PYTHON_REQUIRES = ">=3.7"
INSTALL_REQUIRES = ["attrs>=17.4.0"]
EXTRAS_REQUIRE = {
    "tests": ["pytest", "coverage[toml]", "moto"],
    "docs": ["sphinx", "furo"],
    "aws": ["boto3"],
}
EXTRAS_REQUIRE["dev"] = (
    EXTRAS_REQUIRE["aws"]
    + EXTRAS_REQUIRE["tests"]
    + EXTRAS_REQUIRE["docs"]
    + ["pre-commit"]
)

###############################################################################

HERE = os.path.abspath(os.path.dirname(__file__))


def read(*parts):
    """
    Build an absolute path from *parts* and and return the contents of the
    resulting file.  Assume UTF-8 encoding.
    """
    with codecs.open(os.path.join(HERE, *parts), "rb", "utf-8") as f:
        return f.read()


try:
    PACKAGES
except NameError:
    PACKAGES = find_packages(where="src")
try:
    META_PATH
except NameError:
    META_PATH = os.path.join(
        HERE, "src", NAME.replace("-", "_"), "__init__.py"
    )
finally:
    META_FILE = read(META_PATH)


def find_meta(meta):
    """
    Extract __*meta*__ from META_FILE.
    """
    meta_match = re.search(
        rf"^__{meta}__ = ['\"]([^'\"]*)['\"]", META_FILE, re.M
    )
    if meta_match:
        return meta_match.group(1)
    raise RuntimeError(f"Unable to find __{meta}__ string.")


VERSION = find_meta("version")
URI = find_meta("uri")
LONG = (
    read("README.rst")
    + "\n\n"
    + "Release Information\n"
    + "===================\n\n"
    + re.search(
        r"(\d+.\d.\d \(.*?\)\r?\n.*?)\r?\n\r?\n\r?\n----\r?\n\r?\n\r?\n",
        read("CHANGELOG.rst"),
        re.S,
    ).group(1)
    + (
        "\n\n`Full changelog <"
        "https://github.com/hynek/environ-config/blob/main/CHANGELOG.rst"
        ">`_.\n\n"
    )
    + read("AUTHORS.rst")
)


if __name__ == "__main__":
    setup(
        name=NAME,
        description=find_meta("description"),
        license=find_meta("license"),
        url=URI,
        project_urls=PROJECT_URLS,
        version=VERSION,
        author=find_meta("author"),
        author_email=find_meta("email"),
        maintainer=find_meta("author"),
        maintainer_email=find_meta("email"),
        keywords=KEYWORDS,
        long_description=LONG,
        long_description_content_type="text/x-rst",
        packages=PACKAGES,
        package_dir={"": "src"},
        zip_safe=False,
        classifiers=CLASSIFIERS,
        python_requires=PYTHON_REQUIRES,
        install_requires=INSTALL_REQUIRES,
        extras_require=EXTRAS_REQUIRE,
        options={"bdist_wheel": {"universal": "1"}},
    )
