|
1 | | -import versioneer |
2 | | -from packaging.version import Version |
3 | 1 | import os |
4 | | - |
5 | | -try: |
6 | | - import importlib.metadata as metadata |
7 | | - get_version = lambda x: metadata.version(x) |
8 | | - PkgNotFound = metadata.PackageNotFoundError |
9 | | -except ImportError: |
10 | | - import pkg_resources |
11 | | - get_version = lambda x: pkg_resources.get_distribution(x).version |
12 | | - PkgNotFound = pkg_resources.DistributionNotFound |
13 | | - |
14 | 2 | from setuptools import setup, find_packages |
| 3 | +import versioneer |
15 | 4 |
|
16 | 5 |
|
17 | | -def min_max(pkgs, pkg_name): |
18 | | - pkg = [p for p in pkgs if pkg_name in p][0] |
19 | | - minsign = '>=' if '>=' in pkg else '>' |
20 | | - maxsign = '<=' if '<=' in pkg else '<' |
21 | | - vmin = pkg.split(minsign)[1].split(',')[0] |
22 | | - vmax = pkg.split(maxsign)[-1] |
23 | | - return vmin, vmax |
24 | | - |
25 | | - |
26 | | -def numpy_compat(required): |
27 | | - new_reqs = [r for r in required if "numpy" not in r and "sympy" not in r] |
28 | | - sympy_lb, sympy_ub = min_max(required, "sympy") |
29 | | - numpy_lb, numpy_ub = min_max(required, "numpy") |
30 | | - |
31 | | - # Due to api changes in numpy 2.0, it requires sympy 1.12.1 at the minimum |
32 | | - # Check if sympy is installed and enforce numpy version accordingly. |
33 | | - # If sympy isn't installed, enforce sympy>=1.12.1 and numpy>=2.0 |
34 | | - try: |
35 | | - sympy_version = Version(get_version("sympy")) |
36 | | - min_ver2 = Version("1.12.1") |
37 | | - if sympy_version < min_ver2: |
38 | | - new_reqs.extend([f"numpy>{numpy_lb},<2.0", f"sympy=={sympy_version}"]) |
39 | | - else: |
40 | | - new_reqs.extend([f"numpy>=2.0,<{numpy_ub}", f"sympy=={sympy_version}"]) |
41 | | - except PkgNotFound: |
42 | | - new_reqs.extend([f"sympy>=1.12.1,<{sympy_ub}", f"numpy>=2.0,<{numpy_ub}"]) |
43 | | - |
44 | | - return new_reqs |
45 | | - |
46 | | - |
47 | | -with open('requirements.txt') as f: |
48 | | - required = f.read().splitlines() |
49 | | - required = numpy_compat(required) |
50 | | - |
51 | | -with open('requirements-optional.txt') as f: |
52 | | - optionals = f.read().splitlines() |
53 | | - |
54 | | -with open('requirements-testing.txt') as f: |
55 | | - testing = f.read().splitlines() |
56 | | - |
57 | | -with open('requirements-mpi.txt') as f: |
58 | | - mpis = f.read().splitlines() |
59 | | - |
60 | | -with open('requirements-nvidia.txt') as f: |
61 | | - nvidias = f.read().splitlines() |
| 6 | +def load_requirements(filename): |
| 7 | + with open(filename) as f: |
| 8 | + lines = f.read().splitlines() |
| 9 | + return lines |
62 | 10 |
|
63 | | -reqs = [] |
64 | | -for ir in required: |
65 | | - if ir[0:3] == 'git': |
66 | | - name = ir.split('/')[-1] |
67 | | - reqs += ['%s @ %s@main' % (name, ir)] |
68 | | - else: |
69 | | - reqs += [ir] |
70 | 11 |
|
71 | | -extras_require = {} |
72 | | -for mreqs, mode in (zip([optionals, mpis, nvidias, testing], |
73 | | - ['extras', 'mpi', 'nvidia', 'tests'])): |
74 | | - opt_reqs = [] |
75 | | - for ir in mreqs: |
76 | | - # For conditionals like pytest=2.1; python == 3.6 |
77 | | - if ';' in ir: |
78 | | - entries = ir.split(';') |
79 | | - extras_require[entries[1]] = entries[0] |
80 | | - # Git repos, install main |
81 | | - if ir[0:3] == 'git': |
82 | | - name = ir.split('/')[-1] |
83 | | - opt_reqs += ['%s @ %s@main' % (name, ir)] |
84 | | - else: |
85 | | - opt_reqs += [ir] |
86 | | - extras_require[mode] = opt_reqs |
| 12 | +reqs = load_requirements('requirements.txt') |
| 13 | +extras_require = { |
| 14 | + 'mpi': load_requirements('requirements-mpi.txt'), |
| 15 | + 'nvidia': load_requirements('requirements-nvidia.txt'), |
| 16 | + 'tests': load_requirements('requirements-testing.txt'), |
| 17 | + 'extras': load_requirements('requirements-optional.txt'), |
| 18 | +} |
87 | 19 |
|
88 | 20 | # If interested in benchmarking devito, we need the `examples` too |
89 | 21 | exclude = ['docs', 'tests'] |
90 | 22 | try: |
91 | 23 | if not bool(int(os.environ.get('DEVITO_BENCHMARKS', 0))): |
92 | 24 | exclude += ['examples'] |
93 | 25 | else: |
94 | | - required += testing |
| 26 | + reqs += extras_require['tests'] |
95 | 27 | except (TypeError, ValueError): |
96 | 28 | exclude += ['examples'] |
97 | 29 |
|
|
0 commit comments