Issue #19138: doctest's IGNORE_EXCEPTION_DETAIL now allows no detail at all.
This commit is contained in:
parent
88c29877c7
commit
f9a07f2e11
@ -318,6 +318,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
|
||||||
@ -1325,9 +1351,8 @@ 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
|
||||||
|
|
||||||
|
@ -1054,6 +1054,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:
|
||||||
|
|
||||||
|
@ -18,6 +18,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 #19827: On UNIX, setblocking() and settimeout() methods of
|
- Issue #19827: On UNIX, setblocking() and settimeout() methods of
|
||||||
socket.socket can now avoid a second syscall if the ioctl() function can be
|
socket.socket can now avoid a second syscall if the ioctl() function can be
|
||||||
used, or if the non-blocking flag of the socket is unchanged.
|
used, or if the non-blocking flag of the socket is unchanged.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user