forked from facebookresearch/nevergrad
-
Notifications
You must be signed in to change notification settings - Fork 0
/
setup.py
96 lines (77 loc) · 3.06 KB
/
setup.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#!/usr/bin/env python
# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved.
#
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.
import re
import os
import sys
import typing as tp
from pathlib import Path
from setuptools import setup
from setuptools import find_packages
from setuptools.command.install import install
# read requirements
requirements: tp.Dict[str, tp.List[str]] = {}
for extra in ["dev", "bench", "main"]:
requirements[extra] = Path(f"requirements/{extra}.txt").read_text().splitlines()
# build long description
with open("README.md", "r", encoding="utf-8") as fh:
long_description = fh.read()
# find version
init_str = Path("nevergrad/__init__.py").read_text()
match = re.search(r"^__version__ = \"(?P<version>[\w\.]+?)\"$", init_str, re.MULTILINE)
assert match is not None, "Could not find version in nevergrad/__init__.py"
version = match.group("version")
def _replace_relative_links(regex: tp.Match[str]) -> str:
"""Converts relative links into links to version
so that links on Pypi long description are correct
"""
string = regex.group()
link = regex.group("link")
name = regex.group("name")
if not link.startswith("http") and Path(link).exists():
githuburl = (
f"github.com/facebookresearch/nevergrad/blob/{version}"
if not link.endswith((".png", ".gif"))
else f"raw.githubusercontent.com/facebookresearch/nevergrad/{version}"
)
string = f"[{name}](https://{githuburl}/{link})"
return string
pattern = re.compile(r"\[(?P<name>.+?)\]\((?P<link>\S+?)\)")
long_description = re.sub(pattern, _replace_relative_links, long_description)
class VerifyCircleCiVersionCommand(install): # type: ignore
"""Custom command to verify that the git tag matches CircleCI version"""
description = "verify that the git tag matches CircleCI version"
def run(self) -> None:
tag = os.getenv("CIRCLE_TAG")
if tag != version:
info = f"Git tag: {tag} does not match the version of this app: {version}"
sys.exit(info)
# setup
setup(
name="nevergrad",
version=version,
license="MIT",
description="A Python toolbox for performing gradient-free optimization",
long_description=long_description,
long_description_content_type="text/markdown",
author="Facebook AI Research",
url="https://github.com/facebookresearch/nevergrad",
packages=find_packages(),
classifiers=[
"License :: OSI Approved :: MIT License",
"Intended Audience :: Science/Research",
"Topic :: Scientific/Engineering",
"Programming Language :: Python",
],
install_requires=requirements["main"],
extras_require={
"all": requirements["dev"] + requirements["bench"],
"dev": requirements["dev"],
"benchmark": requirements["bench"],
},
package_data={"nevergrad": ["py.typed", "*.csv", "*.py"]},
python_requires=">=3.6",
cmdclass={"verify_circleci_version": VerifyCircleCiVersionCommand},
)