scipy-doctest 1.7.1__py3-none-any.whl → 2.0.0__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 CHANGED
@@ -3,7 +3,7 @@ Configurable, whitespace-insensitive, floating-point-aware doctest helpers.
3
3
  """
4
4
 
5
5
 
6
- __version__ = "1.7.1"
6
+ __version__ = "2.0.0"
7
7
 
8
8
  try:
9
9
  # register internal modules with pytest; obscure errors galore otherwise
scipy_doctest/impl.py CHANGED
@@ -2,6 +2,7 @@ import re
2
2
  import warnings
3
3
  import inspect
4
4
  import doctest
5
+ import operator
5
6
  from doctest import NORMALIZE_WHITESPACE, ELLIPSIS, IGNORE_EXCEPTION_DETAIL
6
7
  from itertools import zip_longest
7
8
  from sys import version_info
@@ -78,7 +79,7 @@ class DTConfig:
78
79
  Default is False.
79
80
  pytest_extra_ignore : list
80
81
  A list of names/modules to ignore when run under pytest plugin. This is
81
- equivalent to using `--ignore=...` cmdline switch.
82
+ equivalent to using ``--ignore=...`` cmdline switch.
82
83
  pytest_extra_skip : dict
83
84
  Names/modules to skip when run under pytest plugin. This is
84
85
  equivalent to decorating the doctest with `@pytest.mark.skip` or adding
@@ -91,6 +92,12 @@ class DTConfig:
91
92
  adding `# may vary` to the outputs of all examples.
92
93
  Each key is a doctest name to skip, and the corresponding value is
93
94
  a string. If not empty, the string value is used as the skip reason.
95
+ pytest_extra_requires : dict
96
+ Paths or functions to conditionally ignore unless requirements are met.
97
+ The format is ``{path/or/glob/pattern: requirement(s), full.func.name: requirement(s)}``,
98
+ where the values are PEP 508 dependency specifiers. If a requirement is not met,
99
+ the behavior is equivalent to using the ``--ignore=...`` command line switch for
100
+ paths, and to using a `pytest_extra_skip` for function names.
94
101
  CheckerKlass : object, optional
95
102
  The class for the Checker object. Must mimic the ``DTChecker`` API:
96
103
  subclass the `doctest.OutputChecker` and make the constructor signature
@@ -124,6 +131,7 @@ class DTConfig:
124
131
  pytest_extra_ignore=None,
125
132
  pytest_extra_skip=None,
126
133
  pytest_extra_xfail=None,
134
+ pytest_extra_requires=None,
127
135
  ):
128
136
  ### DTChecker configuration ###
129
137
  self.CheckerKlass = CheckerKlass or DTChecker
@@ -216,6 +224,7 @@ class DTConfig:
216
224
  self.pytest_extra_ignore = pytest_extra_ignore or []
217
225
  self.pytest_extra_skip = pytest_extra_skip or {}
218
226
  self.pytest_extra_xfail = pytest_extra_xfail or {}
227
+ self.pytest_extra_requires = pytest_extra_requires or {}
219
228
 
220
229
 
221
230
  def try_convert_namedtuple(got):
@@ -413,6 +422,22 @@ class DTChecker(doctest.OutputChecker):
413
422
  if is_list_or_tuple and type(a_want) is not type(a_got):
414
423
  return False
415
424
 
425
+ # dicts and other mappings need special treatment
426
+ want_is_dict = hasattr(a_want, 'items')
427
+ got_is_dict = hasattr(a_got, 'items')
428
+ if operator.xor(want_is_dict, got_is_dict):
429
+ # either both are dicts or both are not
430
+ return False
431
+
432
+ if want_is_dict:
433
+ # split each dict into a pair of lists of keys and values, and retry
434
+ want_keys, want_values = f"{list(a_want.keys())}", f"{list(a_want.values())}"
435
+ got_keys, got_values = f"{list(a_got.keys())}", f"{list(a_got.values())}"
436
+
437
+ keys_match = self.check_output(want_keys, got_keys, optionflags)
438
+ values_match = self.check_output(want_values, got_values, optionflags)
439
+ return keys_match and values_match
440
+
416
441
  # ... and defer to numpy
417
442
  strict = self.config.strict_check
418
443
  try:
scipy_doctest/plugin.py CHANGED
@@ -13,7 +13,7 @@ from _pytest.pathlib import import_path
13
13
 
14
14
  from .impl import DTParser, DebugDTRunner
15
15
  from .conftest import dt_config
16
- from .util import np_errstate, matplotlib_make_nongui, temp_cwd
16
+ from .util import np_errstate, matplotlib_make_nongui, temp_cwd, is_req_satisfied
17
17
  from .frontend import find_doctests
18
18
 
19
19
 
@@ -29,6 +29,28 @@ def pytest_addoption(parser):
29
29
  dest="collection_strategy"
30
30
  )
31
31
 
32
+ # We cannot add `--doctest-only` option because of
33
+ # https://github.com/pytest-dev/pytest/discussions/13435
34
+ #
35
+ # Therefore, we add a new option, --doctest-only-doctests,
36
+ # which was `true` by default in versions 1.x.
37
+ #
38
+ # In v2.0, the default is `false`, so that
39
+ #
40
+ # $ pytest --doctest-modules
41
+ #
42
+ # runs both doctests and unit tests, and the way to use the previous behavior
43
+ # (only run doctests, skip unit tests) is
44
+ #
45
+ # $ pytest --doctest-modules --doctest-only-doctests=true
46
+ #
47
+ group.addoption("--doctest-only-doctests",
48
+ action="store",
49
+ default="false",
50
+ help="Whether to only collect doctests, or also collect unit tests, too.",
51
+ choices=("true", "false"),
52
+ dest="doctest_only_doctests"
53
+ )
32
54
 
33
55
  def pytest_configure(config):
34
56
  """
@@ -49,15 +71,27 @@ def pytest_ignore_collect(collection_path, config):
49
71
  This function is used to exclude the 'tests' directory and test modules when
50
72
  the `--doctest-modules` option is used.
51
73
  """
52
- if config.getoption("--doctest-modules"):
74
+ # XXX: From v2.0, --doctest-modules means "run both doctests and unit tests",
75
+ # (consistent with vanilla pytest), and the way to retain the 1.x behavior
76
+ # is to add --doctest-only-doctests=true to the CLI command
77
+ if (
78
+ config.getoption("--doctest-modules") and
79
+ config.getoption("--doctest-only-doctests") == 'true'
80
+ ):
53
81
  path_str = str(collection_path)
54
82
  if "tests" in path_str or "test_" in path_str:
55
83
  return True
56
84
 
85
+ fnmatch_ex = _pytest.pathlib.fnmatch_ex
86
+
57
87
  for entry in config.dt_config.pytest_extra_ignore:
58
- if entry in str(collection_path):
88
+ if fnmatch_ex(entry, collection_path):
59
89
  return True
60
90
 
91
+ for entry, reqs in config.dt_config.pytest_extra_requires.items():
92
+ if fnmatch_ex(entry, collection_path):
93
+ return not is_req_satisfied(reqs)
94
+
61
95
 
62
96
  def is_private(item):
63
97
  """Decide if an DocTestItem `item` is private.
@@ -82,21 +116,26 @@ def _maybe_add_markers(item, config):
82
116
  dt_config = config.dt_config
83
117
 
84
118
  extra_skip = dt_config.pytest_extra_skip
85
- skip_it = item.name in extra_skip
86
- if skip_it:
119
+ if skip_it := item.name in extra_skip:
87
120
  reason = extra_skip[item.name] or ''
88
121
  item.add_marker(
89
122
  pytest.mark.skip(reason=reason)
90
123
  )
91
124
 
92
125
  extra_xfail = dt_config.pytest_extra_xfail
93
- fail_it = item.name in extra_xfail
94
- if fail_it:
126
+ if fail_it := item.name in extra_xfail:
95
127
  reason = extra_xfail[item.name] or ''
96
128
  item.add_marker(
97
129
  pytest.mark.xfail(reason=reason)
98
130
  )
99
131
 
132
+ extra_requires = dt_config.pytest_extra_requires
133
+ if req_str := extra_requires.get(item.name, None):
134
+ if not is_req_satisfied(req_str):
135
+ item.add_marker(
136
+ pytest.mark.skip(reason=f"requires {req_str}")
137
+ )
138
+
100
139
 
101
140
  def pytest_collection_modifyitems(config, items):
102
141
  """
@@ -53,3 +53,66 @@ def dtype_mismatch():
53
53
  >>> 3.0
54
54
  3
55
55
  """
56
+
57
+
58
+ def dict_not_dict():
59
+ """
60
+ >>> dict(a=1, b=2)
61
+ ['a', 'b']
62
+ """
63
+
64
+ def dict_not_dict_2():
65
+ """
66
+ >>> [('a', 1), ('b', 2)]
67
+ {'a': 1, 'b': 2}
68
+ """
69
+
70
+
71
+ def dict_wrong_keys():
72
+ """
73
+ >>> dict(a=1, b=2)
74
+ {'c': 1, 'd': 2}
75
+ """
76
+
77
+
78
+ def dict_wrong_values():
79
+ """
80
+ >>> dict(a=1, b=2)
81
+ {'a': -1, 'b': -2}
82
+ """
83
+
84
+
85
+ def dict_wrong_values_np():
86
+ """
87
+ >>> import numpy as np
88
+ >>> dict(a=1, b=np.arange(3)/3)
89
+ {'a': 1, 'b': array([0, 0.335, 0.69])}
90
+ """
91
+
92
+
93
+ def dict_nested_wrong_values_np():
94
+ """
95
+ >>> import numpy as np
96
+ >>> dict(a=1, b=dict(blurb=np.arange(3)/3))
97
+ {'a': 1, 'b': {'blurb': array([0, 0.335, 0.69])}}
98
+ """
99
+
100
+
101
+ # This is an XFAIL
102
+ # Currently, checking nested dicts falls back to vanilla doctest
103
+ # When this is fixed, move this case to module_cases.py
104
+ def dict_nested_needs_numeric_comparison():
105
+ """
106
+ >>> import numpy as np
107
+ >>> dict(a=1, b=dict(blurb=np.arange(3)/3))
108
+ {'a': 1, 'b': {'blurb': array([0, 0.333, 0.667])}}
109
+ """
110
+
111
+
112
+ # This is an XFAIL
113
+ # Nested sequences which contain strings fall back to vanilla doctest
114
+ def list_of_tuples():
115
+ """
116
+ >>> [('a', 1/3), ('b', 2/3)]
117
+ [('a', 0.333), ('b', 0.667)]
118
+ """
@@ -1,8 +1,5 @@
1
- __all__ = [
2
- 'func', 'func2', 'func3', 'func4', 'func5', 'func6', 'func8',
3
- 'func7', 'manip_printoptions', 'array_abbreviation'
4
- ]
5
-
1
+ """ A collection of test cases.
2
+ """
6
3
 
7
4
  def func():
8
5
  """
@@ -242,3 +239,38 @@ def array_and_list_2():
242
239
  >>> [1, 2, 3]
243
240
  array([1, 2, 3])
244
241
  """
242
+
243
+
244
+ def two_dicts():
245
+ """
246
+ >>> import numpy as np
247
+ >>> dict(a=0, b=1)
248
+ {'a': 0, 'b': 1}
249
+ >>> {'a': 1/3, 'b': 2/3}
250
+ {'a': 0.333, 'b': 0.667}
251
+ >>> {'a': 0., 'b': np.arange(3) / 3 }
252
+ {'a': 0.0, 'b': array([0, 0.333, 0.667])}
253
+ """
254
+
255
+ def nested_dicts():
256
+ # Note that we need to give all digits: checking nested dictionaries
257
+ # currently fall back to vanilla doctest.
258
+ # cf failure_cases.py::dict_nested_needs_numeric_comparison
259
+ """
260
+ >>> import numpy as np
261
+ >>> {'a': 1.0, 'b': dict(blurb=np.arange(3)/3)}
262
+ {'a': 1.0, 'b': {'blurb': array([0, 0.33333333, 0.66666667])}}
263
+ """
264
+
265
+
266
+ def list_of_tuples_numeric():
267
+ # cf failure_cases.py::list_of_tuples --- string entries preclude numeric comparisons
268
+ """
269
+ >>> [(1, 1/3), (2, 2/3)]
270
+ [(1, 0.333), (2, 0.667)]
271
+ """
272
+
273
+
274
+ # This is used by test_testmod.py::test_public_object_discovery
275
+ # While in test we only need __all__ to be not empty, let's make it correct, too.
276
+ __all__ = [x for x in vars().keys() if not x.startswith("_")]
@@ -15,6 +15,7 @@ import pytest
15
15
 
16
16
  try:
17
17
  import scipy # noqa
18
+ from scipy import stats # https://github.com/scipy/scipy_doctest/issues/184
18
19
  HAVE_SCIPY = True
19
20
  except Exception:
20
21
  HAVE_SCIPY = False
@@ -117,6 +118,29 @@ def test_tuple_and_list():
117
118
  assert res.failed == 2
118
119
 
119
120
 
121
+ def test_list_of_tuples():
122
+ config = DTConfig()
123
+ res, _ = _testmod(failure_cases,
124
+ strategy=[failure_cases.list_of_tuples],
125
+ config=config)
126
+ assert res.failed == 1
127
+
128
+
129
+ def test_dict():
130
+ config = DTConfig()
131
+ res, _ = _testmod(failure_cases,
132
+ strategy=[failure_cases.dict_not_dict,
133
+ failure_cases.dict_not_dict_2,
134
+ failure_cases.dict_wrong_keys,
135
+ failure_cases.dict_wrong_values,
136
+ failure_cases.dict_wrong_values_np,
137
+ failure_cases.dict_nested_wrong_values_np,
138
+ failure_cases.dict_nested_needs_numeric_comparison,
139
+ ],
140
+ config=config)
141
+ assert res.failed == 7
142
+
143
+
120
144
  @pytest.mark.parametrize('strict, num_fails', [(True, 1), (False, 0)])
121
145
  class TestStrictDType:
122
146
  def test_np_fix(self, strict, num_fails):
scipy_doctest/util.py CHANGED
@@ -10,6 +10,10 @@ import tempfile
10
10
  import inspect
11
11
  from contextlib import contextmanager
12
12
 
13
+ from typing import Sequence
14
+
15
+ from importlib.metadata import version as get_version, PackageNotFoundError
16
+ from packaging.requirements import Requirement
13
17
 
14
18
  @contextmanager
15
19
  def matplotlib_make_nongui():
@@ -255,6 +259,20 @@ def get_public_objects(module, skiplist=None):
255
259
  return (items, names), failures
256
260
 
257
261
 
262
+ def is_req_satisfied(req_strs: str | Sequence[str]) -> bool:
263
+ """ Check if all PEP 508-compliant requirement(s) are satisfied or not.
264
+ """
265
+ req_strs = [req_strs] if isinstance(req_strs, str) else req_strs
266
+ reqs = [Requirement(req_str) for req_str in req_strs]
267
+ if any(req.marker is not None for req in reqs):
268
+ msg = r"Markers not supported in `pytest_extra_requires`"
269
+ raise NotImplementedError(msg)
270
+ try:
271
+ return all(get_version(req.name) in req.specifier for req in reqs)
272
+ except PackageNotFoundError:
273
+ return False
274
+
275
+
258
276
  # XXX: not used ATM
259
277
  modules = []
260
278
  def generate_log(module, test):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: scipy_doctest
3
- Version: 1.7.1
3
+ Version: 2.0.0
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
@@ -17,7 +17,7 @@ Requires-Dist: furo==2024.8.6 ; extra == "doc"
17
17
  Requires-Dist: myst-parser==4.0.0 ; extra == "doc"
18
18
  Requires-Dist: sphinx==8.1.3 ; extra == "doc"
19
19
  Requires-Dist: sphinx-copybutton==0.5.2 ; extra == "doc"
20
- Requires-Dist: scipy <= 1.14.1 ; extra == "test"
20
+ Requires-Dist: scipy ; extra == "test"
21
21
  Requires-Dist: matplotlib ; extra == "test"
22
22
  Project-URL: Home, https://github.com/scipy/scipy_doctest
23
23
  Provides-Extra: doc
@@ -176,6 +176,21 @@ $ pytest --pyargs <your-package> --doctest-modules --doctest-collect=api
176
176
  See [More fine-grained control](#more-fine-grained-control) section
177
177
  for details on how to customize the behavior.
178
178
 
179
+ **NOTE** In versions 1.x, `pytest --doctest-modules` was only collecting doctests, and
180
+ skipped 'regular' unit tests. This differed from the vanilla `pytest` behavior, which
181
+ collects both doctests and unit tests.
182
+
183
+ The behavior was changed in version 2.0: from `scipy-doctest==2.0` the default is
184
+ changed to align with the vanilla `pytest`.
185
+
186
+ To retain the previous behavior and skip 'regular' unit tests, use the
187
+ `--doctest-only-doctests` CLI option:
188
+
189
+ ```
190
+ $ pytest --doctest-modules --doctest-only-doctests=true
191
+ ```
192
+
193
+
179
194
  ### Basic usage
180
195
 
181
196
  The use of `pytest` is optional, and you can use the `doctest` layer API.
@@ -316,18 +331,18 @@ NumPy wraps `scipy-doctest` with the `spin` command
316
331
  $ spin check-docs
317
332
  ```
318
333
 
319
- SciPy wraps `scipy-doctest` with custom `dev.py` commands:
334
+ In SciPy, the name of the `spin` command is `smoke-docs`::
320
335
 
321
336
  ```
322
- $ python dev.py smoke-docs # check docstrings
323
- $ python dev.py smoke-tutorials # ReST user guide tutorials
337
+ $ spin smoke-docs # check docstrings
338
+ $ spin smoke-tutorials # ReST user guide tutorials
324
339
  ```
325
340
 
326
341
  ## Rough edges and sharp bits
327
342
 
328
343
  Here is a (non-exhaustive) list of possible gotchas:
329
344
 
330
- - _In-place development builds_.
345
+ #### _In-place development builds_.
331
346
 
332
347
  Some tools (looking at you `meson-python`) simulate in-place builds with a
333
348
  `build-install` directory. If this directory is located under the project root,
@@ -351,10 +366,10 @@ If push really comes to shove, you may try using the magic env variable:
351
366
  however the need usually indicates an issue with the package itself.
352
367
  (see [gh-107](https://github.com/scipy/scipy_doctest/pull/107) for an example).
353
368
 
354
- - _Optional dependencies are not that optional_
369
+ #### _Optional dependencies are not that optional_
355
370
 
356
371
  If your package contains optional dependencies, doctests do not know about them
357
- being optional. So you either guard the imports in doctests (yikes!), or
372
+ being optional. So you either guard the imports in doctests themselves (yikes!), or
358
373
  the collections fails if dependencies are not available.
359
374
 
360
375
  The solution is to explicitly `--ignore` the paths to modules with optionals.
@@ -370,7 +385,7 @@ Note that installed packages are no different:
370
385
  $ pytest --pyargs scipy --doctest-modules --ignore=/path/to/installed/scipy/_lib
371
386
  ```
372
387
 
373
- - _Doctest collection strategies_
388
+ #### _Doctest collection strategies_
374
389
 
375
390
  The default collection strategy follows `doctest` module and `pytest`. This leads
376
391
  to duplicates if your package has the split between public and \_private modules,
@@ -380,19 +395,19 @@ objects will be collected.
380
395
 
381
396
  The decision on what is public is as follows: an object is public iff
382
397
 
383
- - it is included into the `__all__` list of a public module;
384
- - the name of the object does not have a leading underscore;
385
- - the name of the module from which the object is collected does not have
398
+ - it is included into the `__all__` list of a public module;
399
+ - the name of the object does not have a leading underscore;
400
+ - the name of the module from which the object is collected does not have
386
401
  a leading underscore.
387
402
 
388
403
  Consider an example: `scipy.linalg.det` is defined in `scipy/linalg/_basic.py`,
389
404
  so it is collected twice, from `_basic.py` and from `__init__.py`. The rule above
390
405
  leads to
391
406
 
392
- - `scipy.linalg._basic.det`, collected from `scipy/linalg/_basic.py`, is private.
393
- - `scipy.linalg.det`, collected from `scipy/linalg/__init__.py`, is public.
407
+ - `scipy.linalg._basic.det`, collected from `scipy/linalg/_basic.py`, is private.
408
+ - `scipy.linalg.det`, collected from `scipy/linalg/__init__.py`, is public.
394
409
 
395
- - _`pytest`'s assertion rewriting_
410
+ #### _`pytest`'s assertion rewriting_
396
411
 
397
412
  In some rare cases you may need to either explicitly register the `scipy_doctest`
398
413
  package with the `pytest` assertion rewriting machinery, or ask it to avoid rewriting
@@ -404,6 +419,21 @@ In general, rewriting assertions is not very useful for doctests, as the
404
419
  output on error is fixed by the doctest machinery anyway. Therefore, we believe
405
420
  adding `--assert=plain` is reasonable.
406
421
 
422
+ #### _Mixing strings and numbers_
423
+
424
+ Generally, we aim to handle mixtures of strings and numeric data. Deeply nested data
425
+ structures, however, may cause the checker to fall back to the vanilla `doctest` literal
426
+ checking. For instance, `["value", 1/3]` will use the floating-point aware checker, and
427
+ so will `{"value": 1/3, "other value": 2/3}` or `[(1, 2), (3, 4)]`; Meanwhile, nested
428
+ dictionaries, `{"a": dict(value=1/3)}`, or lists of tuples with mixed entries,
429
+ `[("a", 1/3), ("b", 2/3)]`, will currently fall back to vanilla `doctest` literal
430
+ comparisons.
431
+
432
+ We stress that no matter how tricky or deeply nested the output is, the worst case
433
+ scenario is that the floating-point aware checker is not used. If you have a case where
434
+ `doctest` works correctly and `scipy_doctest` does not, please report it as a bug.
435
+
436
+
407
437
  ## Prior art and related work
408
438
 
409
439
  - `pytest` provides some limited floating-point aware `NumericLiteralChecker`.
@@ -411,24 +441,30 @@ adding `--assert=plain` is reasonable.
411
441
  - `pytest-doctestplus` plugin from the `AstroPy` project has similar goals.
412
442
  The package is well established and widely used. From a user perspective, main
413
443
  differences are: (i) `pytest-doctestplus` is more sensitive to formatting,
414
- including whitespace---thus if numpy tweaks its output formatting, doctests
415
- may start failing; (ii) there is still a need for `# doctest: +FLOAT_CMP`
444
+ including whitespace; (ii) there is still a need for `# doctest: +FLOAT_CMP`
416
445
  directives.
417
446
 
418
- This project takes a different approach: in addition to plugging into `pytest`,
419
- we closely follow the `doctest` API and implementation, which are naturally
420
- way more stable then `pytest`.
447
+ This project takes a slightly different approach: we strive to make numeric comparisons
448
+ whitespace insensitive and automatic, without a need for explicit markup. For rare cases
449
+ which require additional configuration, we either keep it in the tool (thus out of
450
+ reader-visible docstrings), or provide human-readable markers (hence `# may vary`
451
+ not `# doctest +SKIP`).
452
+ Furthermore, in addition to plugging into `pytest`, we provide an API layer which closely
453
+ follows the `doctest` API. Essentially all aspects of doctesting are user-configurable.
454
+
455
+ - `xdoctest` package relies on a deeper rewrite of the standard-library `doctest`
456
+ functionality, and uses an AST-based analysis to parse code examples out of docstrings.
421
457
 
422
458
  - `NumPy` and `SciPy` were using modified doctesting in their `refguide-check` utilities.
423
- These utilities are tightly coupled to their libraries, and have been reported
459
+ These utilities were tightly coupled to their libraries, and have been reported
424
460
  to be not easy to reason about, work with, and extend to other projects.
425
461
 
426
- This project is mainly the core functionality of the modified
427
- `refguide-check` doctesting, extracted to a separate package.
428
- We believe having it separate simplifies both addressing the needs of these
429
- two packages, and potential adoption by other projects.
462
+ This project is mainly the core functionality of the modified `refguide-check` doctesting,
463
+ extracted to a separate package. We believe having it separate simplifies both
464
+ addressing the needs of these two packages, and adoption by other projects.
465
+
430
466
 
431
- ### Bug reports, feature requests and contributions
467
+ ## Bug reports, feature requests and contributions
432
468
 
433
469
  This package is work in progress. Contributions are most welcome!
434
470
  Please don't hesitate to open an issue in the tracker or send a pull request.
@@ -1,18 +1,18 @@
1
- scipy_doctest/__init__.py,sha256=aatYgtIlyr2M-BiFgUpQ5aqy-1bE3VIhnVE2GE-jI0I,650
1
+ scipy_doctest/__init__.py,sha256=W0Mu3q_cXwIGUV0ldMQwEqXf0SDky5fY22sS0Zr0Yno,650
2
2
  scipy_doctest/__main__.py,sha256=H8jTO13GlOLzexbgu7lHMJW1y3_NhLOSArARFZ5WS7o,90
3
3
  scipy_doctest/conftest.py,sha256=rOkdrpmq95vzvMGMqm88c4HTrbpxLOvANtEuiD6suCg,52
4
4
  scipy_doctest/frontend.py,sha256=wl0-8I6epZ49TwxKVSuZbizS6J_pxea99z0vAv2EdbY,19126
5
- scipy_doctest/impl.py,sha256=kp8W2p7mTvQR-TwYc2EXA3JiXo1Z9t98XDzFsoOUVSc,26480
6
- scipy_doctest/plugin.py,sha256=8g2Jyoa69ezQ22RrVBcD42HGNZ6z3oqaPITBDHzJSiY,12852
7
- scipy_doctest/util.py,sha256=NQaJWfpUCqB8khIRJnTZz8ktKFqd0xT2sipFlv4RIhA,8048
5
+ scipy_doctest/impl.py,sha256=dmZBlfq-WbZdCCV6qOO-PjG0adT26XpMdd5lhE_AZzU,27849
6
+ scipy_doctest/plugin.py,sha256=X-XtZKu3Mh6iXLGqF6gsIv46H7YTDlOtMncQ-0pRPxs,14420
7
+ scipy_doctest/util.py,sha256=8-to4UpZt_ESoJq8kCWAPDMUGBh19GOxv2DZnMvNKWY,8769
8
8
  scipy_doctest/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
- scipy_doctest/tests/failure_cases.py,sha256=ReSRSugjKDNoWO5M4h-vwCbX_7BwkktlwEjFiGWI3F4,732
9
+ scipy_doctest/tests/failure_cases.py,sha256=P63datnbqpB5iUpdiTezZ1wOjjU-zbEDt7PVeTQ68JU,1934
10
10
  scipy_doctest/tests/failure_cases_2.py,sha256=p2Qg_eKh35-gavFS25hRNkYW22w8kwNRlAg0Vrq4MtM,783
11
11
  scipy_doctest/tests/finder_cases.py,sha256=-aWcIyKsW1GAOEhuqEYUVYGLYsVi2FU8HgZG2x7Nmyc,870
12
12
  scipy_doctest/tests/finder_cases_2.py,sha256=Z5pnvVQKk3Z8bWpnQyBSnM02qk-80R0doi7DYUbMBaU,306
13
13
  scipy_doctest/tests/local_file.txt,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
14
  scipy_doctest/tests/local_file_cases.py,sha256=8gIEwIJOwwWo0ii2I2gMbcg_8ZhH5XoWqqRFWxnVpd8,912
15
- scipy_doctest/tests/module_cases.py,sha256=kApmKDYImEHbgm-hiCSG7HpDzHhvwqOM8d1J9Dq7Gk4,5827
15
+ scipy_doctest/tests/module_cases.py,sha256=c90KMS2BLT5MotOWy2ViH9KFc7LJ9SQmdu51N1egO5A,6750
16
16
  scipy_doctest/tests/octave_a.mat,sha256=lOfXBSOdMG7_kruTnOHjixXkPy3zSUt10A1FSVjfngI,288
17
17
  scipy_doctest/tests/scipy_ndimage_tutorial_clone.rst,sha256=gw5YfCNuq1I-Pwu2XUYlOFLg4Qk8E0n9A8APXmcBh1w,81592
18
18
  scipy_doctest/tests/stopwords_cases.py,sha256=OEZkoFW3B9nHUCG_5adSkLI91avSwNjw-NeUS0D6Yz0,156
@@ -22,9 +22,9 @@ scipy_doctest/tests/test_pytest_configuration.py,sha256=Fou_WthuWwh0q-o2zZD92HLP
22
22
  scipy_doctest/tests/test_runner.py,sha256=cXDY51lRP7fG-5C_6Y69e8fFsB6mLr0NWauH4sCOWHs,2935
23
23
  scipy_doctest/tests/test_skipmarkers.py,sha256=dLcoy1F0e1GrLLAi2CqJQLapFB8uUBoqkTT-n5oFWbY,8182
24
24
  scipy_doctest/tests/test_testfile.py,sha256=66ZHUpEGGg8MfQT8EKSZ8Zx5pV55gP__TZejGMYwBHA,733
25
- scipy_doctest/tests/test_testmod.py,sha256=We1LBz3rKD5VDkcB8ssQehEr5aQRy2riBJwGwJWGgzs,5870
26
- scipy_doctest-1.7.1.dist-info/entry_points.txt,sha256=dFda3z6PjFL7pEWokv_QmoLwE8X1HETCY1H60xopQ-s,47
27
- scipy_doctest-1.7.1.dist-info/licenses/LICENSE,sha256=xH5PVX8bm8e1JxkmJ-e5FsZsOa7FsNOMfepmCvMoR9g,1523
28
- scipy_doctest-1.7.1.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
29
- scipy_doctest-1.7.1.dist-info/METADATA,sha256=Lq0C_omAgRLkCO_p0Aiel5wrlKE6XkMAzZjeZZAvdRI,15713
30
- scipy_doctest-1.7.1.dist-info/RECORD,,
25
+ scipy_doctest/tests/test_testmod.py,sha256=UW_UCSW-7cu4Hw3kLVS6Hg9c9xq5hN-QbLa6wCaoWMY,6817
26
+ scipy_doctest-2.0.0.dist-info/entry_points.txt,sha256=dFda3z6PjFL7pEWokv_QmoLwE8X1HETCY1H60xopQ-s,47
27
+ scipy_doctest-2.0.0.dist-info/licenses/LICENSE,sha256=xH5PVX8bm8e1JxkmJ-e5FsZsOa7FsNOMfepmCvMoR9g,1523
28
+ scipy_doctest-2.0.0.dist-info/WHEEL,sha256=G2gURzTEtmeR8nrdXUJfNiB3VYVxigPQ-bEQujpNiNs,82
29
+ scipy_doctest-2.0.0.dist-info/METADATA,sha256=n796XWg8_kme5IEJ4yaWLufGtkwdFW0iCAdOVWLbYGA,17501
30
+ scipy_doctest-2.0.0.dist-info/RECORD,,