Skip to content

Commit f709ce9

Browse files
authored
Merge pull request scipy#22671 from lucascolley/tach
MAINT: enforce modularity with `tach`
2 parents ad7f7c6 + 27ccfa1 commit f709ce9

File tree

7 files changed

+227
-5
lines changed

7 files changed

+227
-5
lines changed

.github/workflows/lint.yml

+5-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ jobs:
3939

4040
- name: Install Python packages
4141
run: |
42-
python -m pip install ruff cython-lint packaging
42+
python -m pip install ruff cython-lint packaging tach
4343
4444
- name: Lint
4545
run: |
@@ -52,3 +52,7 @@ jobs:
5252
shell: bash
5353
run: |
5454
python tools/check_python_h_first.py
55+
56+
- name: Check module interdependencies
57+
run: |
58+
tach check --exact

scipy/_lib/meson.build

-1
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,6 @@ python_sources = [
120120
'_disjoint_set.py',
121121
'_docscrape.py',
122122
'_elementwise_iterative_method.py',
123-
'_finite_differences.py',
124123
'_gcutils.py',
125124
'_pep440.py',
126125
'_sparse.py',

scipy/stats/_distn_infrastructure.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
from scipy import integrate
2727

2828
# to approximate the pdf of a continuous distribution given its cdf
29-
from scipy._lib._finite_differences import _derivative
29+
from scipy.stats._finite_differences import _derivative
3030

3131
# for scipy.stats.entropy. Attempts to import just that function or file
3232
# have cause import problems

scipy/_lib/_finite_differences.py scipy/stats/_finite_differences.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from numpy import arange, newaxis, hstack, prod, array
2+
from scipy import linalg
23

34

45
def _central_diff_weights(Np, ndiv=1):
@@ -54,7 +55,6 @@ def _central_diff_weights(Np, ndiv=1):
5455
)
5556
if Np % 2 == 0:
5657
raise ValueError("The number of points must be odd.")
57-
from scipy import linalg
5858

5959
ho = Np >> 1
6060
x = arange(-ho, ho + 1.0)

scipy/stats/_ksstats.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@
6868
import numpy as np
6969
import scipy.special
7070
import scipy.special._ufuncs as scu
71-
from scipy._lib._finite_differences import _derivative
71+
from scipy.stats._finite_differences import _derivative
7272

7373
_E128 = 128
7474
_EP128 = np.ldexp(np.longdouble(1), _E128)

scipy/stats/meson.build

+1
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ py3.install_sources([
120120
'_distribution_infrastructure.py',
121121
'_distr_params.py',
122122
'_entropy.py',
123+
'_finite_differences.py',
123124
'_fit.py',
124125
'_hypotests.py',
125126
'_kde.py',

tach.toml

+218
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,218 @@
1+
interfaces = []
2+
exclude = [
3+
"**/*__pycache__",
4+
"**/*egg-info",
5+
"**/docs",
6+
"**/tests",
7+
"**/venv",
8+
"benchmarks",
9+
"build*",
10+
"doc",
11+
"dev.py",
12+
"subprojects",
13+
"tools",
14+
"scipy/_build_utils",
15+
"scipy/_lib/cobyqa/doc",
16+
"scipy/_lib/cobyqa/examples",
17+
"scipy/_lib/cobyqa/pyproject.toml",
18+
"scipy/conftest.py",
19+
"scipy/special/_precompute/*",
20+
]
21+
source_roots = [
22+
".",
23+
]
24+
25+
[[modules]]
26+
path = "scipy"
27+
depends_on = ["scipy._lib"]
28+
29+
[[modules]]
30+
path = "scipy._lib"
31+
depends_on = ["scipy"]
32+
33+
[[modules]]
34+
path = "scipy._lib.cobyqa"
35+
unchecked = true
36+
37+
[[modules]]
38+
path = "scipy.cluster"
39+
depends_on = ["scipy.cluster.vq", "scipy.cluster.hierarchy", "scipy._lib"]
40+
41+
[[modules]]
42+
path = "scipy.cluster.hierarchy"
43+
depends_on = ["scipy._lib", "scipy.spatial.distance", "scipy.cluster"]
44+
45+
[[modules]]
46+
path = "scipy.cluster.vq"
47+
depends_on = ["scipy.cluster", "scipy._lib", "scipy.spatial.distance"]
48+
49+
[[modules]]
50+
path = "scipy.constants"
51+
depends_on = ["scipy._lib"]
52+
53+
[[modules]]
54+
path = "scipy.datasets"
55+
depends_on = ["scipy._lib"]
56+
57+
[[modules]]
58+
path = "scipy.differentiate"
59+
depends_on = ["scipy._lib"]
60+
61+
[[modules]]
62+
path = "scipy.fft"
63+
depends_on = ["scipy.special", "scipy._lib"]
64+
65+
[[modules]]
66+
path = "scipy.fftpack"
67+
depends_on = ["scipy._lib", "scipy.fft"]
68+
69+
[[modules]]
70+
path = "scipy.integrate"
71+
depends_on = ["scipy._lib", "scipy.interpolate", "scipy.sparse", "scipy.stats", "scipy.sparse.linalg", "scipy.special", "scipy.linalg", "scipy.optimize"]
72+
73+
[[modules]]
74+
path = "scipy.interpolate"
75+
depends_on = ["scipy._lib", "scipy.special", "scipy.spatial.distance", "scipy.linalg", "scipy.optimize", "scipy.spatial", "scipy.linalg.lapack", "scipy.sparse.linalg", "scipy.sparse", "scipy"]
76+
77+
[[modules]]
78+
path = "scipy.io"
79+
depends_on = ["scipy.sparse", "scipy.io.wavfile", "scipy.io.arff", "scipy.io.matlab", "scipy._lib"]
80+
81+
[[modules]]
82+
path = "scipy.io.arff"
83+
depends_on = ["scipy._lib"]
84+
85+
[[modules]]
86+
path = "scipy.io.matlab"
87+
depends_on = ["scipy.sparse", "scipy._lib"]
88+
89+
[[modules]]
90+
path = "scipy.io.wavfile"
91+
depends_on = []
92+
93+
[[modules]]
94+
path = "scipy.linalg"
95+
depends_on = ["scipy._lib", "scipy.sparse", "scipy.special", "scipy.sparse.linalg", "scipy.linalg.blas", "scipy.linalg.lapack", "scipy.fft"]
96+
97+
[[modules]]
98+
path = "scipy.linalg.blas"
99+
depends_on = ["scipy.linalg"]
100+
101+
[[modules]]
102+
path = "scipy.linalg.interpolative"
103+
depends_on = ["scipy.linalg", "scipy.sparse.linalg"]
104+
105+
[[modules]]
106+
path = "scipy.linalg.lapack"
107+
depends_on = ["scipy.linalg", "scipy.linalg.blas"]
108+
109+
[[modules]]
110+
path = "scipy.misc"
111+
depends_on = []
112+
113+
[[modules]]
114+
path = "scipy.ndimage"
115+
depends_on = ["scipy.special", "scipy._lib"]
116+
117+
[[modules]]
118+
path = "scipy.odr"
119+
depends_on = ["scipy.linalg", "scipy._lib"]
120+
121+
[[modules]]
122+
path = "scipy.optimize"
123+
depends_on = ["scipy.linalg", "scipy.spatial", "scipy._lib", "scipy.sparse", "scipy.sparse.linalg", "scipy.stats.qmc", "scipy.linalg.blas", "scipy.special", "scipy.linalg.interpolative", "scipy"]
124+
125+
[[modules]]
126+
path = "scipy.signal"
127+
depends_on = ["scipy.interpolate", "scipy.fft", "scipy.signal.windows", "scipy.ndimage", "scipy.special", "scipy.optimize", "scipy._lib", "scipy.stats", "scipy.spatial", "scipy.linalg"]
128+
129+
[[modules]]
130+
path = "scipy.signal.windows"
131+
depends_on = ["scipy.linalg", "scipy.special", "scipy._lib", "scipy.fft"]
132+
133+
[[modules]]
134+
path = "scipy.sparse"
135+
depends_on = ["scipy", "scipy._lib", "scipy.sparse.csgraph", "scipy.sparse.linalg"]
136+
137+
[[modules]]
138+
path = "scipy.sparse.csgraph"
139+
depends_on = ["scipy._lib", "scipy.sparse", "scipy.sparse.linalg"]
140+
141+
[[modules]]
142+
path = "scipy.sparse.linalg"
143+
depends_on = ["scipy._lib", "scipy.linalg", "scipy.sparse"]
144+
145+
[[modules]]
146+
path = "scipy.spatial"
147+
depends_on = ["scipy._lib", "scipy.linalg", "scipy.spatial.transform", "scipy", "scipy.spatial.distance"]
148+
149+
[[modules]]
150+
path = "scipy.spatial.distance"
151+
depends_on = ["scipy.spatial", "scipy._lib", "scipy.linalg", "scipy.special"]
152+
153+
[[modules]]
154+
path = "scipy.spatial.transform"
155+
depends_on = ["scipy.constants", "scipy.linalg", "scipy._lib", "scipy.interpolate"]
156+
157+
[[modules]]
158+
path = "scipy.special"
159+
depends_on = ["scipy.optimize", "scipy.linalg", "scipy._lib"]
160+
161+
[[modules]]
162+
path = "scipy.stats"
163+
depends_on = [
164+
"scipy.linalg.blas",
165+
"scipy.stats.distributions",
166+
"scipy.fft",
167+
"scipy.spatial.distance",
168+
"scipy.stats.contingency",
169+
"scipy.special",
170+
"scipy._lib",
171+
"scipy.sparse.csgraph",
172+
"scipy.spatial",
173+
"scipy.linalg",
174+
"scipy.stats.qmc",
175+
"scipy.integrate",
176+
"scipy.optimize",
177+
"scipy.stats.mstats",
178+
"scipy.ndimage",
179+
"scipy.interpolate",
180+
"scipy.sparse",
181+
]
182+
183+
[[modules]]
184+
path = "scipy.stats.contingency"
185+
depends_on = ["scipy.stats", "scipy._lib"]
186+
187+
[[modules]]
188+
path = "scipy.stats.distributions"
189+
depends_on = ["scipy.stats"]
190+
191+
[[modules]]
192+
path = "scipy.stats.mstats"
193+
depends_on = ["scipy.stats"]
194+
195+
[[modules]]
196+
path = "scipy.stats.qmc"
197+
depends_on = ["scipy.stats"]
198+
199+
[[modules]]
200+
path = "scipy.stats.sampling"
201+
depends_on = ["scipy.stats"]
202+
203+
204+
# Optional dependencies don't seem to be handled by tach yet
205+
[external]
206+
exclude = [
207+
"array-api-compat",
208+
"array-api-extra",
209+
"cupy",
210+
"cupyx",
211+
"dask",
212+
"jax",
213+
"matplotlib",
214+
"ndonnx",
215+
"sparse",
216+
"torch",
217+
"uarray",
218+
]

0 commit comments

Comments
 (0)