Skip to content

Commit 2a1cc26

Browse files
committed
ENH: adding doctest-requires-all directive
1 parent 81fe4fd commit 2a1cc26

File tree

3 files changed

+38
-1
lines changed

3 files changed

+38
-1
lines changed

pytest_doctestplus/plugin.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,10 @@ class DocTestParserPlus(doctest.DocTestParser):
389389
doctest chunk if the given modules/packages are not
390390
installed.
391391
392+
- ``.. doctest-requires-all:: module1, module2``: Skip all subsequent
393+
doctest chunks if the given modules/packages are not
394+
installed.
395+
392396
- ``.. doctest-skip-all``: Skip all subsequent doctests.
393397
394398
- ``.. doctest-remote-data::``: Skip the next doctest chunk if
@@ -422,10 +426,19 @@ def parse(self, s, name=None):
422426

423427
if isinstance(entry, str) and entry:
424428
required = []
429+
required_all = []
425430
skip_next = False
426431
lines = entry.strip().splitlines()
432+
requires_all_match = [re.match(
433+
fr'{comment_char}\s+doctest-requires-all\s*::\s+(.*)', x) for x in lines]
434+
if any(requires_all_match):
435+
print(requires_all_match)
436+
required_all = [re.split(r'\s*[,\s]\s*', match.group(1)) for match in requires_all_match if match][0]
437+
438+
required_modules_all = DocTestFinderPlus.check_required_modules(required_all)
439+
427440
if any(re.match(
428-
f'{comment_char} doctest-skip-all', x.strip()) for x in lines):
441+
f'{comment_char} doctest-skip-all', x.strip()) for x in lines) or not required_modules_all:
429442
skip_all = True
430443
continue
431444

pytest_doctestplus/sphinx/doctestplus.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ class DoctestRequiresDirective(DoctestSkipDirective):
4343
def setup(app):
4444

4545
app.add_directive('doctest-requires', DoctestRequiresDirective)
46+
app.add_directive('doctest-requires-all', DoctestRequiresDirective)
4647
app.add_directive('doctest-skip', DoctestSkipDirective)
4748
app.add_directive('doctest-skip-all', DoctestSkipDirective)
4849
app.add_directive('doctest', DoctestSkipDirective, override=True)

tests/test_doctestplus.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -435,6 +435,29 @@ def test_requires(testdir):
435435
testdir.inline_run(p, '--doctest-plus', '--doctest-rst').assertoutcome(skipped=1)
436436

437437

438+
def test_requires_all(testdir):
439+
testdir.makeini(
440+
"""
441+
[pytest]
442+
doctestplus = enabled
443+
""")
444+
445+
# should be ignored
446+
p = testdir.makefile(
447+
'.rst',
448+
"""
449+
.. doctest-requires-all:: foobar
450+
451+
>>> import foobar
452+
453+
This is a narrative line, before another doctest snippet
454+
455+
>>> import foobar
456+
"""
457+
)
458+
testdir.inline_run(p, '--doctest-plus', '--doctest-rst').assertoutcome(skipped=1)
459+
460+
438461
def test_ignore_warnings_module(testdir):
439462

440463
# First check that we get a warning if we don't add the IGNORE_WARNINGS

0 commit comments

Comments
 (0)