# Copyright 2020 Google LLC.
#
# 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.

"""Setup for DP Accounting package."""

import os
import setuptools

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


def _get_version():
  """Parses the version number from VERSION file."""
  with open(os.path.join(here, "VERSION")) as f:
    try:
      version_line = next(
          line for line in f if not line.startswith("\"\"\""))
    except StopIteration:
      raise ValueError("Version not defined in VERSION")
    else:
      return version_line.strip('\n \'"')


def _parse_requirements(path):
  """Parses requirements from file."""
  with open(os.path.join(here, path)) as f:
    deps = []
    for line in f:
      if line.startswith("dataclasses"):
        # For python version 3.7 onwards, dataclasses module is already included
        # as part of the core library.
        deps.append("dataclasses; python_version < \'3.7\'")
      elif not (line.isspace() or line.startswith("#")):
        deps.append(line.rstrip())
    return deps


def _read_description(path):
  """Read the description from README file."""
  # Exclude example from package description.
  return open(os.path.join(here, path)).read().split("## Examples")[0]

setuptools.setup(
    name="dp-accounting",
    version=_get_version(),
    author="Google Differential Privacy Team",
    author_email="dp-open-source@google.com",
    description="Tools for tracking differential privacy budgets",
    long_description=_read_description("README.md"),
    long_description_content_type="text/markdown",
    url="https://github.com/google/differential-privacy/",
    packages=setuptools.find_packages(),
    install_requires=_parse_requirements("requirements.txt"),
    classifiers=[
        "Programming Language :: Python :: 3.7",
        "Programming Language :: Python :: 3.8",
        "Programming Language :: Python :: 3.9",
        "Topic :: Software Development :: Libraries :: Python Modules",
    ],
    python_requires=">=3.7",
    license="Apache 2.0",
    keywords="differential-privacy accounting",
)
