Commit 5d059922 authored by Tim Peters's avatar Tim Peters

Patch #1475231: add a new SKIP doctest option, thanks to

Edward Loper.
parent f31e8816
...@@ -616,6 +616,20 @@ TypeError: object doesn't support item assignment ...@@ -616,6 +616,20 @@ TypeError: object doesn't support item assignment
\end{datadesc} \end{datadesc}
\begin{datadesc}{SKIP}
When specified, do not run the example at all. This can be useful
in contexts where doctest examples serve as both documentation and
test cases, and an example should be included for documentation
purposes, but should not be checked. E.g., the example's output
might be random; or the example might depend on resources which
would be unavailable to the test driver.
The SKIP flag can also be used for temporarily "commenting out"
examples.
\end{datadesc}
\begin{datadesc}{COMPARISON_FLAGS} \begin{datadesc}{COMPARISON_FLAGS}
A bitmask or'ing together all the comparison flags above. A bitmask or'ing together all the comparison flags above.
\end{datadesc} \end{datadesc}
...@@ -744,6 +758,7 @@ can be useful. ...@@ -744,6 +758,7 @@ can be useful.
were added; by default \code{<BLANKLINE>} in expected output were added; by default \code{<BLANKLINE>} in expected output
matches an empty line in actual output; and doctest directives matches an empty line in actual output; and doctest directives
were added]{2.4} were added]{2.4}
\versionchanged[Constant \constant{SKIP} was added]{2.5}
There's also a way to register new option flag names, although this There's also a way to register new option flag names, although this
isn't useful unless you intend to extend \refmodule{doctest} internals isn't useful unless you intend to extend \refmodule{doctest} internals
......
...@@ -54,6 +54,7 @@ __all__ = [ ...@@ -54,6 +54,7 @@ __all__ = [
'DONT_ACCEPT_BLANKLINE', 'DONT_ACCEPT_BLANKLINE',
'NORMALIZE_WHITESPACE', 'NORMALIZE_WHITESPACE',
'ELLIPSIS', 'ELLIPSIS',
'SKIP',
'IGNORE_EXCEPTION_DETAIL', 'IGNORE_EXCEPTION_DETAIL',
'COMPARISON_FLAGS', 'COMPARISON_FLAGS',
'REPORT_UDIFF', 'REPORT_UDIFF',
...@@ -136,12 +137,14 @@ DONT_ACCEPT_TRUE_FOR_1 = register_optionflag('DONT_ACCEPT_TRUE_FOR_1') ...@@ -136,12 +137,14 @@ DONT_ACCEPT_TRUE_FOR_1 = register_optionflag('DONT_ACCEPT_TRUE_FOR_1')
DONT_ACCEPT_BLANKLINE = register_optionflag('DONT_ACCEPT_BLANKLINE') DONT_ACCEPT_BLANKLINE = register_optionflag('DONT_ACCEPT_BLANKLINE')
NORMALIZE_WHITESPACE = register_optionflag('NORMALIZE_WHITESPACE') NORMALIZE_WHITESPACE = register_optionflag('NORMALIZE_WHITESPACE')
ELLIPSIS = register_optionflag('ELLIPSIS') ELLIPSIS = register_optionflag('ELLIPSIS')
SKIP = register_optionflag('SKIP')
IGNORE_EXCEPTION_DETAIL = register_optionflag('IGNORE_EXCEPTION_DETAIL') IGNORE_EXCEPTION_DETAIL = register_optionflag('IGNORE_EXCEPTION_DETAIL')
COMPARISON_FLAGS = (DONT_ACCEPT_TRUE_FOR_1 | COMPARISON_FLAGS = (DONT_ACCEPT_TRUE_FOR_1 |
DONT_ACCEPT_BLANKLINE | DONT_ACCEPT_BLANKLINE |
NORMALIZE_WHITESPACE | NORMALIZE_WHITESPACE |
ELLIPSIS | ELLIPSIS |
SKIP |
IGNORE_EXCEPTION_DETAIL) IGNORE_EXCEPTION_DETAIL)
REPORT_UDIFF = register_optionflag('REPORT_UDIFF') REPORT_UDIFF = register_optionflag('REPORT_UDIFF')
...@@ -1233,6 +1236,10 @@ class DocTestRunner: ...@@ -1233,6 +1236,10 @@ class DocTestRunner:
else: else:
self.optionflags &= ~optionflag self.optionflags &= ~optionflag
# If 'SKIP' is set, then skip this example.
if self.optionflags & SKIP:
continue
# Record that we started this example. # Record that we started this example.
tries += 1 tries += 1
if not quiet: if not quiet:
...@@ -1792,6 +1799,7 @@ def testmod(m=None, name=None, globs=None, verbose=None, isprivate=None, ...@@ -1792,6 +1799,7 @@ def testmod(m=None, name=None, globs=None, verbose=None, isprivate=None,
DONT_ACCEPT_BLANKLINE DONT_ACCEPT_BLANKLINE
NORMALIZE_WHITESPACE NORMALIZE_WHITESPACE
ELLIPSIS ELLIPSIS
SKIP
IGNORE_EXCEPTION_DETAIL IGNORE_EXCEPTION_DETAIL
REPORT_UDIFF REPORT_UDIFF
REPORT_CDIFF REPORT_CDIFF
...@@ -1914,6 +1922,7 @@ def testfile(filename, module_relative=True, name=None, package=None, ...@@ -1914,6 +1922,7 @@ def testfile(filename, module_relative=True, name=None, package=None,
DONT_ACCEPT_BLANKLINE DONT_ACCEPT_BLANKLINE
NORMALIZE_WHITESPACE NORMALIZE_WHITESPACE
ELLIPSIS ELLIPSIS
SKIP
IGNORE_EXCEPTION_DETAIL IGNORE_EXCEPTION_DETAIL
REPORT_UDIFF REPORT_UDIFF
REPORT_CDIFF REPORT_CDIFF
......
...@@ -1079,6 +1079,25 @@ output to match any substring in the actual output: ...@@ -1079,6 +1079,25 @@ output to match any substring in the actual output:
... # doctest: +NORMALIZE_WHITESPACE ... # doctest: +NORMALIZE_WHITESPACE
[0, 1, ..., 18, 19] [0, 1, ..., 18, 19]
The SKIP flag causes an example to be skipped entirely. I.e., the
example is not run. It can be useful in contexts where doctest
examples serve as both documentation and test cases, and an example
should be included for documentation purposes, but should not be
checked (e.g., because its output is random, or depends on resources
which would be unavailable.) The SKIP flag can also be used for
'commenting out' broken examples.
>>> import unavailable_resource # doctest: +SKIP
>>> unavailable_resource.do_something() # doctest: +SKIP
>>> unavailable_resource.blow_up() # doctest: +SKIP
Traceback (most recent call last):
...
UncheckedBlowUpError: Nobody checks me.
>>> import random
>>> print random.random() # doctest: +SKIP
0.721216923889
The REPORT_UDIFF flag causes failures that involve multi-line expected The REPORT_UDIFF flag causes failures that involve multi-line expected
and actual outputs to be displayed using a unified diff: and actual outputs to be displayed using a unified diff:
......
...@@ -86,6 +86,10 @@ Extension Modules ...@@ -86,6 +86,10 @@ Extension Modules
Library Library
------- -------
- Patch #1475231: ``doctest`` has a new ``SKIP`` option, which causes
a doctest to be skipped (the code is not run, and the expected output
or exception is ignored).
- Fixed contextlib.nested to cope with exceptions being raised and - Fixed contextlib.nested to cope with exceptions being raised and
caught inside exit handlers. caught inside exit handlers.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment