forked from scipy/scipy
-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathgenerate_requirements.py
61 lines (45 loc) · 1.92 KB
/
generate_requirements.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
#!/usr/bin/env python
"""Generate requirements/*.txt files from pyproject.toml."""
import sys
from pathlib import Path
try: # standard module since Python 3.11
import tomllib as toml
except ImportError:
try: # available for older Python via pip
import tomli as toml
except ImportError:
sys.exit("Please install `tomli` first: `{mamba, pip} install tomli`")
script_pth = Path(__file__)
repo_dir = script_pth.parent.parent
script_relpth = script_pth.relative_to(repo_dir)
header = [
f"# Generated via {script_relpth.as_posix()}.",
"# Do not edit this file; modify `pyproject.toml` instead "
"and run `python tools/generate_requirements.py`.",
]
def generate_requirement_file(name, req_list, *, extra_list=None):
req_fname = repo_dir / "requirements" / f"{name}.txt"
# remove once scikit-umfpack issues are resolved
comment = "# scikit-umfpack # circular dependency issues"
req_list = [comment if x == "scikit-umfpack" else x for x in req_list]
if name == "build":
req_list = [x for x in req_list if "numpy" not in x]
req_list.append("ninja")
if extra_list:
req_list += extra_list
req_fname.write_text("\n".join(header + req_list) + "\n")
return req_list
def main():
pyproject = toml.loads((repo_dir / "pyproject.toml").read_text())
default = generate_requirement_file("default", pyproject["project"]["dependencies"])
generate_requirement_file("build", pyproject["build-system"]["requires"],
extra_list=default)
for key, opt_list in pyproject["project"]["optional-dependencies"].items():
generate_requirement_file(key, opt_list)
# generate requirements/all.txt
all_path = repo_dir / "requirements" / "all.txt"
files = ["build", "dev", "doc", "test"]
reqs = [f"-r {x}.txt" for x in files]
all_path.write_text("\n".join(header + reqs) + "\n")
if __name__ == "__main__":
main()