summaryrefslogtreecommitdiffstats
path: root/Lib/doctest.py
diff options
context:
space:
mode:
authorTim Peters <tim@python.org>2013-12-04 03:02:05 (GMT)
committerTim Peters <tim@python.org>2013-12-04 03:02:05 (GMT)
commitf9a07f2e11c76c0c1ced04fed8b86c9d23cb3ac8 (patch)
tree76e591027897e4127ffe9754f4a37fb47176f99e /Lib/doctest.py
parent88c29877c7ebe04892d2800c4e554298b9e38465 (diff)
downloadcpython-f9a07f2e11c76c0c1ced04fed8b86c9d23cb3ac8.zip
cpython-f9a07f2e11c76c0c1ced04fed8b86c9d23cb3ac8.tar.gz
cpython-f9a07f2e11c76c0c1ced04fed8b86c9d23cb3ac8.tar.bz2
Issue #19138: doctest's IGNORE_EXCEPTION_DETAIL now allows no detail at all.
Diffstat (limited to 'Lib/doctest.py')
-rw-r--r--Lib/doctest.py33
1 files changed, 29 insertions, 4 deletions
diff --git a/Lib/doctest.py b/Lib/doctest.py
index ee4e068..fcfcbb0 100644
--- a/Lib/doctest.py
+++ b/Lib/doctest.py
@@ -318,6 +318,32 @@ def _comment_line(line):
else:
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):
"""
A specialized version of the python debugger that redirects stdout
@@ -1325,10 +1351,9 @@ class DocTestRunner:
# Another chance if they didn't care about the detail.
elif self.optionflags & IGNORE_EXCEPTION_DETAIL:
- m1 = re.match(r'(?:[^:]*\.)?([^:]*:)', example.exc_msg)
- m2 = re.match(r'(?:[^:]*\.)?([^:]*:)', exc_msg)
- if m1 and m2 and check(m1.group(1), m2.group(1),
- self.optionflags):
+ if check(_strip_exception_details(example.exc_msg),
+ _strip_exception_details(exc_msg),
+ self.optionflags):
outcome = SUCCESS
# Report the outcome.