Commit 0ee9baa8 authored by Tim Peters's avatar Tim Peters

Issue #19138: doctest's IGNORE_EXCEPTION_DETAIL now allows no detail at all.

Grafted from c80083ad142d.
parent 7b2ac609
...@@ -326,6 +326,32 @@ def _comment_line(line): ...@@ -326,6 +326,32 @@ def _comment_line(line):
else: else:
return '#' return '#'
def _strip_exception_details(msg):
# Support for IGNORE_EXCEPTION_DETAIL.
# Get rid of everything except the exception name; in particular, drop
# the possibly dotted module path (if any) and the exception message (if
# any). We assume that a colon is never part of a dotted name, or of an
# exception name.
# E.g., given
# "foo.bar.MyError: la di da"
# return "MyError"
# Or for "abc.def" or "abc.def:\n" return "def".
start, end = 0, len(msg)
# The exception name must appear on the first line.
i = msg.find("\n")
if i >= 0:
end = i
# retain up to the first colon (if any)
i = msg.find(':', 0, end)
if i >= 0:
end = i
# retain just the exception name
i = msg.rfind('.', 0, end)
if i >= 0:
start = i+1
return msg[start: end]
class _OutputRedirectingPdb(pdb.Pdb): class _OutputRedirectingPdb(pdb.Pdb):
""" """
A specialized version of the python debugger that redirects stdout A specialized version of the python debugger that redirects stdout
...@@ -1323,10 +1349,9 @@ class DocTestRunner: ...@@ -1323,10 +1349,9 @@ class DocTestRunner:
# Another chance if they didn't care about the detail. # Another chance if they didn't care about the detail.
elif self.optionflags & IGNORE_EXCEPTION_DETAIL: elif self.optionflags & IGNORE_EXCEPTION_DETAIL:
m1 = re.match(r'(?:[^:]*\.)?([^:]*:)', example.exc_msg) if check(_strip_exception_details(example.exc_msg),
m2 = re.match(r'(?:[^:]*\.)?([^:]*:)', exc_msg) _strip_exception_details(exc_msg),
if m1 and m2 and check(m1.group(1), m2.group(1), self.optionflags):
self.optionflags):
outcome = SUCCESS outcome = SUCCESS
# Report the outcome. # Report the outcome.
......
...@@ -1019,6 +1019,33 @@ But IGNORE_EXCEPTION_DETAIL does not allow a mismatch in the exception type: ...@@ -1019,6 +1019,33 @@ But IGNORE_EXCEPTION_DETAIL does not allow a mismatch in the exception type:
ValueError: message ValueError: message
TestResults(failed=1, attempted=1) TestResults(failed=1, attempted=1)
If the exception does not have a message, you can still use
IGNORE_EXCEPTION_DETAIL to normalize the modules between Python 2 and 3:
>>> def f(x):
... r'''
... >>> from http.client import HTTPException
... >>> raise HTTPException() #doctest: +IGNORE_EXCEPTION_DETAIL
... Traceback (most recent call last):
... foo.bar.HTTPException
... '''
>>> test = doctest.DocTestFinder().find(f)[0]
>>> doctest.DocTestRunner(verbose=False).run(test)
TestResults(failed=0, attempted=2)
Note that a trailing colon doesn't matter either:
>>> def f(x):
... r'''
... >>> from http.client import HTTPException
... >>> raise HTTPException() #doctest: +IGNORE_EXCEPTION_DETAIL
... Traceback (most recent call last):
... foo.bar.HTTPException:
... '''
>>> test = doctest.DocTestFinder().find(f)[0]
>>> doctest.DocTestRunner(verbose=False).run(test)
TestResults(failed=0, attempted=2)
If an exception is raised but not expected, then it is reported as an If an exception is raised but not expected, then it is reported as an
unexpected exception: unexpected exception:
......
...@@ -15,6 +15,10 @@ Core and Builtins ...@@ -15,6 +15,10 @@ Core and Builtins
Library Library
------- -------
- Issue #19138: doctest's IGNORE_EXCEPTION_DETAIL now allows a match when
no exception detail exists (no colon following the exception's name, or
a colon does follow but no text follows the colon).
- Issue #16231: Fixed pickle.Pickler to only fallback to its default pickling - Issue #16231: Fixed pickle.Pickler to only fallback to its default pickling
behaviour when Pickler.persistent_id returns None, but not for any other behaviour when Pickler.persistent_id returns None, but not for any other
false values. This allows false values other than None to be used as false values. This allows false values other than None to be used as
......
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