scipy-doctest 1.3__py3-none-any.whl → 1.5__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- scipy_doctest/__init__.py +1 -1
- scipy_doctest/impl.py +66 -9
- scipy_doctest/tests/failure_cases.py +8 -0
- scipy_doctest/tests/local_file_cases.py +1 -1
- scipy_doctest/tests/module_cases.py +21 -9
- scipy_doctest/tests/test_pytest_configuration.py +1 -3
- scipy_doctest/tests/test_skipmarkers.py +18 -1
- scipy_doctest/tests/test_testmod.py +10 -0
- {scipy_doctest-1.3.dist-info → scipy_doctest-1.5.dist-info}/METADATA +17 -10
- {scipy_doctest-1.3.dist-info → scipy_doctest-1.5.dist-info}/RECORD +13 -13
- {scipy_doctest-1.3.dist-info → scipy_doctest-1.5.dist-info}/WHEEL +1 -1
- {scipy_doctest-1.3.dist-info → scipy_doctest-1.5.dist-info}/LICENSE +0 -0
- {scipy_doctest-1.3.dist-info → scipy_doctest-1.5.dist-info}/entry_points.txt +0 -0
scipy_doctest/__init__.py
CHANGED
scipy_doctest/impl.py
CHANGED
|
@@ -40,6 +40,11 @@ class DTConfig:
|
|
|
40
40
|
rtol : float
|
|
41
41
|
Absolute and relative tolerances to check doctest examples with.
|
|
42
42
|
Specifically, the check is ``np.allclose(want, got, atol=atol, rtol=rtol)``
|
|
43
|
+
strict_check : bool
|
|
44
|
+
Whether to check that dtypes match or rely on the lax definition of
|
|
45
|
+
equality of numpy objects. For instance, `3 == np.float64(3)`, but
|
|
46
|
+
dtypes do not match.
|
|
47
|
+
Default is False.
|
|
43
48
|
optionflags : int
|
|
44
49
|
doctest optionflags
|
|
45
50
|
Default is ``NORMALIZE_WHITESPACE | ELLIPSIS | IGNORE_EXCEPTION_DETAIL``
|
|
@@ -107,6 +112,7 @@ class DTConfig:
|
|
|
107
112
|
rndm_markers=None,
|
|
108
113
|
atol=1e-8,
|
|
109
114
|
rtol=1e-2,
|
|
115
|
+
strict_check=False,
|
|
110
116
|
# DTRunner configuration
|
|
111
117
|
optionflags=None,
|
|
112
118
|
# DTFinder/DTParser configuration
|
|
@@ -142,8 +148,12 @@ class DTConfig:
|
|
|
142
148
|
'masked_array': np.ma.masked_array,
|
|
143
149
|
'int64': np.int64,
|
|
144
150
|
'uint64': np.uint64,
|
|
145
|
-
'int8': np.int8,
|
|
146
151
|
'int32': np.int32,
|
|
152
|
+
'uint32': np.uint32,
|
|
153
|
+
'int16': np.int16,
|
|
154
|
+
'uint16': np.uint16,
|
|
155
|
+
'int8': np.int8,
|
|
156
|
+
'uint8': np.uint8,
|
|
147
157
|
'float32': np.float32,
|
|
148
158
|
'float64': np.float64,
|
|
149
159
|
'dtype': np.dtype,
|
|
@@ -161,8 +171,8 @@ class DTConfig:
|
|
|
161
171
|
'#random', '#Random',
|
|
162
172
|
"# may vary"}
|
|
163
173
|
self.rndm_markers = rndm_markers
|
|
164
|
-
|
|
165
174
|
self.atol, self.rtol = atol, rtol
|
|
175
|
+
self.strict_check = strict_check
|
|
166
176
|
|
|
167
177
|
### DTRunner configuration ###
|
|
168
178
|
|
|
@@ -256,6 +266,29 @@ def has_masked(got):
|
|
|
256
266
|
return 'masked_array' in got and '--' in got
|
|
257
267
|
|
|
258
268
|
|
|
269
|
+
def try_split_shape_from_abbrv(s_got):
|
|
270
|
+
"""NumPy 2.2 added shape=(123,) to abbreviated array repr.
|
|
271
|
+
|
|
272
|
+
If present, split it off, and return a tuple. `(array, shape)`
|
|
273
|
+
"""
|
|
274
|
+
if "shape=" in s_got:
|
|
275
|
+
# handle
|
|
276
|
+
# array(..., shape=(1000,))
|
|
277
|
+
# array(..., shape=(100, 100))
|
|
278
|
+
# array(..., shape=(100, 100), dtype=uint16)
|
|
279
|
+
match = re.match(r'(.+),\s+shape=\(([\d\s,]+)\)(.+)', s_got, flags=re.DOTALL)
|
|
280
|
+
if match:
|
|
281
|
+
grp = match.groups()
|
|
282
|
+
|
|
283
|
+
s_got = grp[0] + grp[-1]
|
|
284
|
+
s_got = s_got.replace(',,', ',')
|
|
285
|
+
shape_str = f'({grp[1]})'
|
|
286
|
+
|
|
287
|
+
return ''.join(s_got.split('...,')), shape_str
|
|
288
|
+
|
|
289
|
+
return ''.join(s_got.split('...,')), ''
|
|
290
|
+
|
|
291
|
+
|
|
259
292
|
class DTChecker(doctest.OutputChecker):
|
|
260
293
|
obj_pattern = re.compile(r'at 0x[0-9a-fA-F]+>')
|
|
261
294
|
vanilla = doctest.OutputChecker()
|
|
@@ -319,11 +352,17 @@ class DTChecker(doctest.OutputChecker):
|
|
|
319
352
|
return self.check_output(s_want, s_got, optionflags)
|
|
320
353
|
|
|
321
354
|
#handle array abbreviation for n-dimensional arrays, n >= 1
|
|
322
|
-
ndim_array = (s_want.startswith("array([") and
|
|
323
|
-
s_got.startswith("array([") and
|
|
355
|
+
ndim_array = (s_want.startswith("array([") and "..." in s_want and
|
|
356
|
+
s_got.startswith("array([") and "..." in s_got)
|
|
324
357
|
if ndim_array:
|
|
325
|
-
s_want =
|
|
326
|
-
s_got =
|
|
358
|
+
s_want, want_shape = try_split_shape_from_abbrv(s_want)
|
|
359
|
+
s_got, got_shape = try_split_shape_from_abbrv(s_got)
|
|
360
|
+
|
|
361
|
+
if got_shape:
|
|
362
|
+
# NumPy 2.2 output, `with shape=`, check the shapes, too
|
|
363
|
+
s_want = f"{s_want}, {want_shape}"
|
|
364
|
+
s_got = f"{s_got}, {got_shape}"
|
|
365
|
+
|
|
327
366
|
return self.check_output(s_want, s_got, optionflags)
|
|
328
367
|
|
|
329
368
|
# maybe we are dealing with masked arrays?
|
|
@@ -363,23 +402,35 @@ class DTChecker(doctest.OutputChecker):
|
|
|
363
402
|
return False
|
|
364
403
|
|
|
365
404
|
# ... and defer to numpy
|
|
405
|
+
strict = self.config.strict_check
|
|
366
406
|
try:
|
|
367
|
-
return self._do_check(a_want, a_got)
|
|
407
|
+
return self._do_check(a_want, a_got, strict)
|
|
368
408
|
except Exception:
|
|
369
409
|
# heterog tuple, eg (1, np.array([1., 2.]))
|
|
370
410
|
try:
|
|
371
|
-
return all(
|
|
411
|
+
return all(
|
|
412
|
+
self._do_check(w, g, strict) for w, g in zip_longest(a_want, a_got)
|
|
413
|
+
)
|
|
372
414
|
except (TypeError, ValueError):
|
|
373
415
|
return False
|
|
374
416
|
|
|
375
|
-
def _do_check(self, want, got):
|
|
417
|
+
def _do_check(self, want, got, strict_check):
|
|
376
418
|
# This should be done exactly as written to correctly handle all of
|
|
377
419
|
# numpy-comparable objects, strings, and heterogeneous tuples
|
|
420
|
+
|
|
421
|
+
# NB: 3 == np.float64(3.0) but dtypes differ
|
|
422
|
+
if strict_check:
|
|
423
|
+
want_dtype = np.asarray(want).dtype
|
|
424
|
+
got_dtype = np.asarray(got).dtype
|
|
425
|
+
if want_dtype != got_dtype:
|
|
426
|
+
return False
|
|
427
|
+
|
|
378
428
|
try:
|
|
379
429
|
if want == got:
|
|
380
430
|
return True
|
|
381
431
|
except Exception:
|
|
382
432
|
pass
|
|
433
|
+
|
|
383
434
|
with warnings.catch_warnings():
|
|
384
435
|
# NumPy's ragged array deprecation of np.array([1, (2, 3)])
|
|
385
436
|
warnings.simplefilter('ignore', VisibleDeprecationWarning)
|
|
@@ -514,6 +565,7 @@ class DTParser(doctest.DocTestParser):
|
|
|
514
565
|
"""
|
|
515
566
|
stopwords = self.config.stopwords
|
|
516
567
|
pseudocode = self.config.pseudocode
|
|
568
|
+
rndm_markers = self.config.rndm_markers
|
|
517
569
|
|
|
518
570
|
SKIP = doctest.OPTIONFLAGS_BY_NAME['SKIP']
|
|
519
571
|
keep_skipping_this_block = False
|
|
@@ -537,6 +589,11 @@ class DTParser(doctest.DocTestParser):
|
|
|
537
589
|
# NB: Could have just skipped it via `continue`.
|
|
538
590
|
example.options[SKIP] = True
|
|
539
591
|
|
|
592
|
+
if any(word in example.source for word in rndm_markers):
|
|
593
|
+
# Found a `# may vary`. Do not check the output (but do check
|
|
594
|
+
# that the source is valid python).
|
|
595
|
+
example.want += " # _ignore\n"
|
|
596
|
+
|
|
540
597
|
if any(word in example.source for word in stopwords):
|
|
541
598
|
# Found a stopword. Do not check the output (but do check
|
|
542
599
|
# that the source is valid python).
|
|
@@ -3,7 +3,7 @@ from ..conftest import dt_config
|
|
|
3
3
|
# Specify local files required by doctests
|
|
4
4
|
dt_config.local_resources = {
|
|
5
5
|
'scipy_doctest.tests.local_file_cases.local_files': ['local_file.txt'],
|
|
6
|
-
'scipy_doctest.local_file_cases.sio': ['octave_a.mat']
|
|
6
|
+
'scipy_doctest.tests.local_file_cases.sio': ['octave_a.mat']
|
|
7
7
|
}
|
|
8
8
|
|
|
9
9
|
|
|
@@ -164,14 +164,25 @@ def array_abbreviation():
|
|
|
164
164
|
"""
|
|
165
165
|
Numpy abbreviates arrays, check that it works.
|
|
166
166
|
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
167
|
+
XXX: check if ... creates ragged arrays, avoid if so.
|
|
168
|
+
|
|
169
|
+
NumPy 2.2 abbreviations
|
|
170
|
+
=======================
|
|
171
|
+
|
|
172
|
+
NumPy 2.2 adds shape=(...) to abbreviated arrays.
|
|
173
|
+
|
|
174
|
+
This is not a valid argument to `array(...), so it cannot be eval-ed,
|
|
175
|
+
and need to be removed for doctesting.
|
|
176
|
+
|
|
177
|
+
The implementation handles both formats, and checks the shapes if present
|
|
178
|
+
in the actual output. If not present in the output, they are ignored.
|
|
179
|
+
|
|
172
180
|
>>> import numpy as np
|
|
173
181
|
>>> np.arange(10000)
|
|
174
|
-
array([0, 1, 2, ..., 9997, 9998, 9999])
|
|
182
|
+
array([0, 1, 2, ..., 9997, 9998, 9999], shape=(10000,))
|
|
183
|
+
|
|
184
|
+
>>> np.arange(10000, dtype=np.uint16)
|
|
185
|
+
array([ 0, 1, 2, ..., 9997, 9998, 9999], shape=(10000,), dtype=uint16)
|
|
175
186
|
|
|
176
187
|
>>> np.diag(np.arange(33)) / 30
|
|
177
188
|
array([[0., 0., 0., ..., 0., 0.,0.],
|
|
@@ -180,19 +191,20 @@ def array_abbreviation():
|
|
|
180
191
|
...,
|
|
181
192
|
[0., 0., 0., ..., 1., 0., 0.],
|
|
182
193
|
[0., 0., 0., ..., 0., 1.03333333, 0.],
|
|
183
|
-
[0., 0., 0., ..., 0., 0., 1.06666667]])
|
|
194
|
+
[0., 0., 0., ..., 0., 0., 1.06666667]], shape=(33, 33))
|
|
184
195
|
|
|
185
196
|
|
|
186
|
-
>>> np.diag(np.arange(1, 1001, dtype=
|
|
197
|
+
>>> np.diag(np.arange(1, 1001, dtype=np.uint16))
|
|
187
198
|
array([[1, 0, 0, ..., 0, 0, 0],
|
|
188
199
|
[0, 2, 0, ..., 0, 0, 0],
|
|
189
200
|
[0, 0, 3, ..., 0, 0, 0],
|
|
190
201
|
...,
|
|
191
202
|
[0, 0, 0, ..., 998, 0, 0],
|
|
192
203
|
[0, 0, 0, ..., 0, 999, 0],
|
|
193
|
-
[0, 0, 0, ..., 0, 0, 1000]])
|
|
204
|
+
[0, 0, 0, ..., 0, 0, 1000]], shape=(1000, 1000), dtype=uint16)
|
|
194
205
|
"""
|
|
195
206
|
|
|
207
|
+
|
|
196
208
|
def nan_equal():
|
|
197
209
|
"""
|
|
198
210
|
Test that nans are treated as equal.
|
|
@@ -49,11 +49,9 @@ def test_stopword_cases(pytester):
|
|
|
49
49
|
assert result.ret == pytest.ExitCode.OK
|
|
50
50
|
|
|
51
51
|
|
|
52
|
-
@pytest.mark.xfail(reason="XXX: passes locally, fails on CI")
|
|
53
52
|
@pytest.mark.skipif(not HAVE_SCIPY, reason='need scipy')
|
|
54
53
|
def test_local_file_cases(pytester):
|
|
55
|
-
"""Test that local files are found for use in doctests.
|
|
56
|
-
"""
|
|
54
|
+
"""Test that local files are found for use in doctests."""
|
|
57
55
|
path_str = local_file_cases.__file__
|
|
58
56
|
python_file = Path(path_str)
|
|
59
57
|
result = pytester.inline_run(python_file, "--doctest-modules")
|
|
@@ -161,8 +161,25 @@ class TestMayVary:
|
|
|
161
161
|
filename='none', lineno=0)
|
|
162
162
|
|
|
163
163
|
runner = DebugDTRunner()
|
|
164
|
-
|
|
164
|
+
runner.run(test)
|
|
165
|
+
|
|
166
|
+
# one example tried, of which zero failed
|
|
167
|
+
assert runner.get_history() == {'may_vary_source': (0, 1)}
|
|
168
|
+
|
|
169
|
+
def test_may_vary_syntax_error(self):
|
|
170
|
+
# `# may vary` markers do not mask syntax errors, unlike `# doctest: +SKIP`
|
|
171
|
+
string = ">>> 1 += 2 # may vary\n"
|
|
172
|
+
string += "42\n"
|
|
173
|
+
|
|
174
|
+
parser = DTParser()
|
|
175
|
+
test = parser.get_doctest(string, globs={},
|
|
176
|
+
name='may_vary_err',
|
|
177
|
+
filename='none', lineno=0)
|
|
178
|
+
|
|
179
|
+
runner = DebugDTRunner()
|
|
180
|
+
with pytest.raises(Exception) as exc_info:
|
|
165
181
|
runner.run(test)
|
|
182
|
+
assert exc_info.type == doctest.UnexpectedException
|
|
166
183
|
|
|
167
184
|
|
|
168
185
|
string='''\
|
|
@@ -117,6 +117,16 @@ def test_tuple_and_list():
|
|
|
117
117
|
assert res.failed == 2
|
|
118
118
|
|
|
119
119
|
|
|
120
|
+
@pytest.mark.parametrize('strict, num_fails', [(True, 1), (False, 0)])
|
|
121
|
+
class TestStrictDType:
|
|
122
|
+
def test_np_fix(self, strict, num_fails):
|
|
123
|
+
config = DTConfig(strict_check=strict)
|
|
124
|
+
res, _ = _testmod(failure_cases,
|
|
125
|
+
strategy=[failure_cases.dtype_mismatch],
|
|
126
|
+
config=config)
|
|
127
|
+
assert res.failed == num_fails
|
|
128
|
+
|
|
129
|
+
|
|
120
130
|
class TestLocalFiles:
|
|
121
131
|
def test_local_files(self):
|
|
122
132
|
# A doctest tries to open a local file. Test that it works
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.3
|
|
2
2
|
Name: scipy_doctest
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.5
|
|
4
4
|
Summary: Configurable, whitespace-insensitive, floating-point-aware doctest helpers.
|
|
5
5
|
Maintainer-email: SciPy developers <scipy-dev@python.org>
|
|
6
6
|
Requires-Python: >=3.8
|
|
@@ -67,8 +67,8 @@ Its main features are
|
|
|
67
67
|
>>> np.random.randint(100)
|
|
68
68
|
42 # may vary
|
|
69
69
|
```
|
|
70
|
-
Note that the markers (by default, `"# may vary"` and `"# random"`)
|
|
71
|
-
to an example's output,
|
|
70
|
+
Note that the markers (by default, `"# may vary"` and `"# random"`) can be applied
|
|
71
|
+
to either an example's output, or its source.
|
|
72
72
|
|
|
73
73
|
Also note a difference with respect to the standard `# doctest: +SKIP`: the latter
|
|
74
74
|
skips the example entirely, while these additional markers only skip checking
|
|
@@ -291,12 +291,6 @@ and [a doctest example](https://github.com/scipy/scipy_doctest/blob/main/scipy_d
|
|
|
291
291
|
for more details.
|
|
292
292
|
|
|
293
293
|
|
|
294
|
-
### The SciPy Doctest Pytest Plugin
|
|
295
|
-
|
|
296
|
-
The pytest plugin enables the use of `scipy_doctest` tools to perform doctests.
|
|
297
|
-
|
|
298
|
-
Follow the given instructions to utilize the pytest plugin for doctesting.
|
|
299
|
-
|
|
300
294
|
### NumPy and SciPy wrappers
|
|
301
295
|
|
|
302
296
|
|
|
@@ -382,6 +376,19 @@ leads to
|
|
|
382
376
|
- `scipy.linalg.det`, collected from `scipy/linalg/__init__.py`, is public.
|
|
383
377
|
|
|
384
378
|
|
|
379
|
+
- *`pytest`'s assertion rewriting*
|
|
380
|
+
|
|
381
|
+
In some rare cases you may need to either explicitly register the `scipy_doctest`
|
|
382
|
+
package with the `pytest` assertion rewriting machinery, or ask it to avoid rewriting
|
|
383
|
+
completely, via `pytest --assert=plain`.
|
|
384
|
+
See [the `pytest documentation`](https://docs.pytest.org/en/7.1.x/how-to/assert.html)
|
|
385
|
+
for more details.
|
|
386
|
+
|
|
387
|
+
In general, rewriting assertions is not very useful for doctests, as the
|
|
388
|
+
output on error is fixed by the doctest machinery anyway. Therefore, we believe
|
|
389
|
+
adding `--assert=plain` is reasonable.
|
|
390
|
+
|
|
391
|
+
|
|
385
392
|
## Prior art and related work
|
|
386
393
|
|
|
387
394
|
- `pytest` provides some limited floating-point aware `NumericLiteralChecker`.
|
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
scipy_doctest/__init__.py,sha256=
|
|
1
|
+
scipy_doctest/__init__.py,sha256=uRFgqX-BvUtGq2GVDAAGjdF5A7JfD-scaE0-D6xJZaY,649
|
|
2
2
|
scipy_doctest/__main__.py,sha256=H8jTO13GlOLzexbgu7lHMJW1y3_NhLOSArARFZ5WS7o,90
|
|
3
3
|
scipy_doctest/conftest.py,sha256=5vZxzuH042urYIToiKWANDJHQPoGkfQI-ppQ_cuHgM0,53
|
|
4
4
|
scipy_doctest/frontend.py,sha256=7Vz9VIRmzdkmwPD1OtI9sJSxCXIF7jmSxXyt6asjaI0,18628
|
|
5
|
-
scipy_doctest/impl.py,sha256=
|
|
5
|
+
scipy_doctest/impl.py,sha256=NC61Qy-4VXd3Vjk9WXyTf0oPcm6ZdIiv7WxeVSffTrw,24083
|
|
6
6
|
scipy_doctest/plugin.py,sha256=DzTPBCDIre5b2e8JLiTGw7d9zhCP9hYqXcxeKpFTtys,12900
|
|
7
7
|
scipy_doctest/util.py,sha256=R-pS9FSL5hQNmOA0nhRDLOL1riFVAoK-OhG70ilaKhw,8057
|
|
8
8
|
scipy_doctest/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
9
|
-
scipy_doctest/tests/failure_cases.py,sha256=
|
|
9
|
+
scipy_doctest/tests/failure_cases.py,sha256=ReSRSugjKDNoWO5M4h-vwCbX_7BwkktlwEjFiGWI3F4,732
|
|
10
10
|
scipy_doctest/tests/failure_cases_2.py,sha256=gupqwSICvzurGIiKVNJRJX9jkmtFR7_Rf3snWU-4Nac,784
|
|
11
11
|
scipy_doctest/tests/finder_cases.py,sha256=s4sq5HZ7m5mXEi1N8dbkgCRY6AxEGcirFRYhEyEG7rw,872
|
|
12
12
|
scipy_doctest/tests/local_file.txt,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
13
|
-
scipy_doctest/tests/local_file_cases.py,sha256=
|
|
14
|
-
scipy_doctest/tests/module_cases.py,sha256=
|
|
13
|
+
scipy_doctest/tests/local_file_cases.py,sha256=xQeD809EoLxY-QIb0X7ZPl6Ecyme3zjnf95AHJ_8gp0,914
|
|
14
|
+
scipy_doctest/tests/module_cases.py,sha256=W3u97oMJ8yf0rqrsiQbB1yMMTkKAVz4gNpBLDhijHek,5860
|
|
15
15
|
scipy_doctest/tests/octave_a.mat,sha256=lOfXBSOdMG7_kruTnOHjixXkPy3zSUt10A1FSVjfngI,288
|
|
16
16
|
scipy_doctest/tests/scipy_ndimage_tutorial_clone.rst,sha256=uCtH99RQM0hvDK2_5lgBO2hqtMUOUQhPKxWn4zwHjSs,81594
|
|
17
17
|
scipy_doctest/tests/stopwords_cases.py,sha256=OEZkoFW3B9nHUCG_5adSkLI91avSwNjw-NeUS0D6Yz0,156
|
|
18
18
|
scipy_doctest/tests/test_finder.py,sha256=9bBa3OvB8aTPixMkAFAPlCul7Bm7J95GKri0npOMp9M,6136
|
|
19
19
|
scipy_doctest/tests/test_parser.py,sha256=cmK5kXqTWPUdSVor4bPu6yoikIukDIkVXjIjk1TTPI8,925
|
|
20
|
-
scipy_doctest/tests/test_pytest_configuration.py,sha256=
|
|
20
|
+
scipy_doctest/tests/test_pytest_configuration.py,sha256=2aesrRyHFdMcRMjARXJ5g8nMtaYC0gb_48Mh8U58RzE,2573
|
|
21
21
|
scipy_doctest/tests/test_runner.py,sha256=qP4u8ngbUK946HhMM6Py70hi0W0DcZGcCN258phhM7g,2936
|
|
22
|
-
scipy_doctest/tests/test_skipmarkers.py,sha256=
|
|
22
|
+
scipy_doctest/tests/test_skipmarkers.py,sha256=C5U8BKF3Ti-nPWekt2yK6a3j3Tcg_pq-Z5IuiR-F9eU,7835
|
|
23
23
|
scipy_doctest/tests/test_testfile.py,sha256=66ZHUpEGGg8MfQT8EKSZ8Zx5pV55gP__TZejGMYwBHA,733
|
|
24
|
-
scipy_doctest/tests/test_testmod.py,sha256=
|
|
25
|
-
scipy_doctest-1.
|
|
26
|
-
scipy_doctest-1.
|
|
27
|
-
scipy_doctest-1.
|
|
28
|
-
scipy_doctest-1.
|
|
29
|
-
scipy_doctest-1.
|
|
24
|
+
scipy_doctest/tests/test_testmod.py,sha256=PoOI0o2_dXjWDmDkUUKqcJiyZvh46YpjlmMxyW6PXyI,5874
|
|
25
|
+
scipy_doctest-1.5.dist-info/entry_points.txt,sha256=dFda3z6PjFL7pEWokv_QmoLwE8X1HETCY1H60xopQ-s,47
|
|
26
|
+
scipy_doctest-1.5.dist-info/LICENSE,sha256=xH5PVX8bm8e1JxkmJ-e5FsZsOa7FsNOMfepmCvMoR9g,1523
|
|
27
|
+
scipy_doctest-1.5.dist-info/WHEEL,sha256=CpUCUxeHQbRN5UGRQHYRJorO5Af-Qy_fHMctcQ8DSGI,82
|
|
28
|
+
scipy_doctest-1.5.dist-info/METADATA,sha256=tAedM4-9Ya3w0fB-B6XoUxXCq7cY-BLo4jUvR__XJOA,14867
|
|
29
|
+
scipy_doctest-1.5.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|