1 | # Module doctest.
|
---|
2 | # Released to the public domain 16-Jan-2001, by Tim Peters (tim@python.org).
|
---|
3 | # Major enhancements and refactoring by:
|
---|
4 | # Jim Fulton
|
---|
5 | # Edward Loper
|
---|
6 |
|
---|
7 | # Provided as-is; use at your own risk; no warranty; no promises; enjoy!
|
---|
8 |
|
---|
9 | r"""Module doctest -- a framework for running examples in docstrings.
|
---|
10 |
|
---|
11 | In simplest use, end each module M to be tested with:
|
---|
12 |
|
---|
13 | def _test():
|
---|
14 | import doctest
|
---|
15 | doctest.testmod()
|
---|
16 |
|
---|
17 | if __name__ == "__main__":
|
---|
18 | _test()
|
---|
19 |
|
---|
20 | Then running the module as a script will cause the examples in the
|
---|
21 | docstrings to get executed and verified:
|
---|
22 |
|
---|
23 | python M.py
|
---|
24 |
|
---|
25 | This won't display anything unless an example fails, in which case the
|
---|
26 | failing example(s) and the cause(s) of the failure(s) are printed to stdout
|
---|
27 | (why not stderr? because stderr is a lame hack <0.2 wink>), and the final
|
---|
28 | line of output is "Test failed.".
|
---|
29 |
|
---|
30 | Run it with the -v switch instead:
|
---|
31 |
|
---|
32 | python M.py -v
|
---|
33 |
|
---|
34 | and a detailed report of all examples tried is printed to stdout, along
|
---|
35 | with assorted summaries at the end.
|
---|
36 |
|
---|
37 | You can force verbose mode by passing "verbose=True" to testmod, or prohibit
|
---|
38 | it by passing "verbose=False". In either of those cases, sys.argv is not
|
---|
39 | examined by testmod.
|
---|
40 |
|
---|
41 | There are a variety of other ways to run doctests, including integration
|
---|
42 | with the unittest framework, and support for running non-Python text
|
---|
43 | files containing doctests. There are also many ways to override parts
|
---|
44 | of doctest's default behaviors. See the Library Reference Manual for
|
---|
45 | details.
|
---|
46 | """
|
---|
47 |
|
---|
48 | __docformat__ = 'reStructuredText en'
|
---|
49 |
|
---|
50 | __all__ = [
|
---|
51 | # 0, Option Flags
|
---|
52 | 'register_optionflag',
|
---|
53 | 'DONT_ACCEPT_TRUE_FOR_1',
|
---|
54 | 'DONT_ACCEPT_BLANKLINE',
|
---|
55 | 'NORMALIZE_WHITESPACE',
|
---|
56 | 'ELLIPSIS',
|
---|
57 | 'SKIP',
|
---|
58 | 'IGNORE_EXCEPTION_DETAIL',
|
---|
59 | 'COMPARISON_FLAGS',
|
---|
60 | 'REPORT_UDIFF',
|
---|
61 | 'REPORT_CDIFF',
|
---|
62 | 'REPORT_NDIFF',
|
---|
63 | 'REPORT_ONLY_FIRST_FAILURE',
|
---|
64 | 'REPORTING_FLAGS',
|
---|
65 | # 1. Utility Functions
|
---|
66 | # 2. Example & DocTest
|
---|
67 | 'Example',
|
---|
68 | 'DocTest',
|
---|
69 | # 3. Doctest Parser
|
---|
70 | 'DocTestParser',
|
---|
71 | # 4. Doctest Finder
|
---|
72 | 'DocTestFinder',
|
---|
73 | # 5. Doctest Runner
|
---|
74 | 'DocTestRunner',
|
---|
75 | 'OutputChecker',
|
---|
76 | 'DocTestFailure',
|
---|
77 | 'UnexpectedException',
|
---|
78 | 'DebugRunner',
|
---|
79 | # 6. Test Functions
|
---|
80 | 'testmod',
|
---|
81 | 'testfile',
|
---|
82 | 'run_docstring_examples',
|
---|
83 | # 7. Tester
|
---|
84 | 'Tester',
|
---|
85 | # 8. Unittest Support
|
---|
86 | 'DocTestSuite',
|
---|
87 | 'DocFileSuite',
|
---|
88 | 'set_unittest_reportflags',
|
---|
89 | # 9. Debugging Support
|
---|
90 | 'script_from_examples',
|
---|
91 | 'testsource',
|
---|
92 | 'debug_src',
|
---|
93 | 'debug',
|
---|
94 | ]
|
---|
95 |
|
---|
96 | import __future__
|
---|
97 |
|
---|
98 | import sys, traceback, inspect, linecache, os, re
|
---|
99 | import unittest, difflib, pdb, tempfile
|
---|
100 | import warnings
|
---|
101 | from StringIO import StringIO
|
---|
102 | from collections import namedtuple
|
---|
103 |
|
---|
104 | TestResults = namedtuple('TestResults', 'failed attempted')
|
---|
105 |
|
---|
106 | # There are 4 basic classes:
|
---|
107 | # - Example: a <source, want> pair, plus an intra-docstring line number.
|
---|
108 | # - DocTest: a collection of examples, parsed from a docstring, plus
|
---|
109 | # info about where the docstring came from (name, filename, lineno).
|
---|
110 | # - DocTestFinder: extracts DocTests from a given object's docstring and
|
---|
111 | # its contained objects' docstrings.
|
---|
112 | # - DocTestRunner: runs DocTest cases, and accumulates statistics.
|
---|
113 | #
|
---|
114 | # So the basic picture is:
|
---|
115 | #
|
---|
116 | # list of:
|
---|
117 | # +------+ +---------+ +-------+
|
---|
118 | # |object| --DocTestFinder-> | DocTest | --DocTestRunner-> |results|
|
---|
119 | # +------+ +---------+ +-------+
|
---|
120 | # | Example |
|
---|
121 | # | ... |
|
---|
122 | # | Example |
|
---|
123 | # +---------+
|
---|
124 |
|
---|
125 | # Option constants.
|
---|
126 |
|
---|
127 | OPTIONFLAGS_BY_NAME = {}
|
---|
128 | def register_optionflag(name):
|
---|
129 | # Create a new flag unless `name` is already known.
|
---|
130 | return OPTIONFLAGS_BY_NAME.setdefault(name, 1 << len(OPTIONFLAGS_BY_NAME))
|
---|
131 |
|
---|
132 | DONT_ACCEPT_TRUE_FOR_1 = register_optionflag('DONT_ACCEPT_TRUE_FOR_1')
|
---|
133 | DONT_ACCEPT_BLANKLINE = register_optionflag('DONT_ACCEPT_BLANKLINE')
|
---|
134 | NORMALIZE_WHITESPACE = register_optionflag('NORMALIZE_WHITESPACE')
|
---|
135 | ELLIPSIS = register_optionflag('ELLIPSIS')
|
---|
136 | SKIP = register_optionflag('SKIP')
|
---|
137 | IGNORE_EXCEPTION_DETAIL = register_optionflag('IGNORE_EXCEPTION_DETAIL')
|
---|
138 |
|
---|
139 | COMPARISON_FLAGS = (DONT_ACCEPT_TRUE_FOR_1 |
|
---|
140 | DONT_ACCEPT_BLANKLINE |
|
---|
141 | NORMALIZE_WHITESPACE |
|
---|
142 | ELLIPSIS |
|
---|
143 | SKIP |
|
---|
144 | IGNORE_EXCEPTION_DETAIL)
|
---|
145 |
|
---|
146 | REPORT_UDIFF = register_optionflag('REPORT_UDIFF')
|
---|
147 | REPORT_CDIFF = register_optionflag('REPORT_CDIFF')
|
---|
148 | REPORT_NDIFF = register_optionflag('REPORT_NDIFF')
|
---|
149 | REPORT_ONLY_FIRST_FAILURE = register_optionflag('REPORT_ONLY_FIRST_FAILURE')
|
---|
150 |
|
---|
151 | REPORTING_FLAGS = (REPORT_UDIFF |
|
---|
152 | REPORT_CDIFF |
|
---|
153 | REPORT_NDIFF |
|
---|
154 | REPORT_ONLY_FIRST_FAILURE)
|
---|
155 |
|
---|
156 | # Special string markers for use in `want` strings:
|
---|
157 | BLANKLINE_MARKER = '<BLANKLINE>'
|
---|
158 | ELLIPSIS_MARKER = '...'
|
---|
159 |
|
---|
160 | ######################################################################
|
---|
161 | ## Table of Contents
|
---|
162 | ######################################################################
|
---|
163 | # 1. Utility Functions
|
---|
164 | # 2. Example & DocTest -- store test cases
|
---|
165 | # 3. DocTest Parser -- extracts examples from strings
|
---|
166 | # 4. DocTest Finder -- extracts test cases from objects
|
---|
167 | # 5. DocTest Runner -- runs test cases
|
---|
168 | # 6. Test Functions -- convenient wrappers for testing
|
---|
169 | # 7. Tester Class -- for backwards compatibility
|
---|
170 | # 8. Unittest Support
|
---|
171 | # 9. Debugging Support
|
---|
172 | # 10. Example Usage
|
---|
173 |
|
---|
174 | ######################################################################
|
---|
175 | ## 1. Utility Functions
|
---|
176 | ######################################################################
|
---|
177 |
|
---|
178 | def _extract_future_flags(globs):
|
---|
179 | """
|
---|
180 | Return the compiler-flags associated with the future features that
|
---|
181 | have been imported into the given namespace (globs).
|
---|
182 | """
|
---|
183 | flags = 0
|
---|
184 | for fname in __future__.all_feature_names:
|
---|
185 | feature = globs.get(fname, None)
|
---|
186 | if feature is getattr(__future__, fname):
|
---|
187 | flags |= feature.compiler_flag
|
---|
188 | return flags
|
---|
189 |
|
---|
190 | def _normalize_module(module, depth=2):
|
---|
191 | """
|
---|
192 | Return the module specified by `module`. In particular:
|
---|
193 | - If `module` is a module, then return module.
|
---|
194 | - If `module` is a string, then import and return the
|
---|
195 | module with that name.
|
---|
196 | - If `module` is None, then return the calling module.
|
---|
197 | The calling module is assumed to be the module of
|
---|
198 | the stack frame at the given depth in the call stack.
|
---|
199 | """
|
---|
200 | if inspect.ismodule(module):
|
---|
201 | return module
|
---|
202 | elif isinstance(module, (str, unicode)):
|
---|
203 | return __import__(module, globals(), locals(), ["*"])
|
---|
204 | elif module is None:
|
---|
205 | return sys.modules[sys._getframe(depth).f_globals['__name__']]
|
---|
206 | else:
|
---|
207 | raise TypeError("Expected a module, string, or None")
|
---|
208 |
|
---|
209 | def _load_testfile(filename, package, module_relative):
|
---|
210 | if module_relative:
|
---|
211 | package = _normalize_module(package, 3)
|
---|
212 | filename = _module_relative_path(package, filename)
|
---|
213 | if hasattr(package, '__loader__'):
|
---|
214 | if hasattr(package.__loader__, 'get_data'):
|
---|
215 | file_contents = package.__loader__.get_data(filename)
|
---|
216 | # get_data() opens files as 'rb', so one must do the equivalent
|
---|
217 | # conversion as universal newlines would do.
|
---|
218 | return file_contents.replace(os.linesep, '\n'), filename
|
---|
219 | with open(filename) as f:
|
---|
220 | return f.read(), filename
|
---|
221 |
|
---|
222 | # Use sys.stdout encoding for ouput.
|
---|
223 | _encoding = getattr(sys.__stdout__, 'encoding', None) or 'utf-8'
|
---|
224 |
|
---|
225 | def _indent(s, indent=4):
|
---|
226 | """
|
---|
227 | Add the given number of space characters to the beginning of
|
---|
228 | every non-blank line in `s`, and return the result.
|
---|
229 | If the string `s` is Unicode, it is encoded using the stdout
|
---|
230 | encoding and the `backslashreplace` error handler.
|
---|
231 | """
|
---|
232 | if isinstance(s, unicode):
|
---|
233 | s = s.encode(_encoding, 'backslashreplace')
|
---|
234 | # This regexp matches the start of non-blank lines:
|
---|
235 | return re.sub('(?m)^(?!$)', indent*' ', s)
|
---|
236 |
|
---|
237 | def _exception_traceback(exc_info):
|
---|
238 | """
|
---|
239 | Return a string containing a traceback message for the given
|
---|
240 | exc_info tuple (as returned by sys.exc_info()).
|
---|
241 | """
|
---|
242 | # Get a traceback message.
|
---|
243 | excout = StringIO()
|
---|
244 | exc_type, exc_val, exc_tb = exc_info
|
---|
245 | traceback.print_exception(exc_type, exc_val, exc_tb, file=excout)
|
---|
246 | return excout.getvalue()
|
---|
247 |
|
---|
248 | # Override some StringIO methods.
|
---|
249 | class _SpoofOut(StringIO):
|
---|
250 | def getvalue(self):
|
---|
251 | result = StringIO.getvalue(self)
|
---|
252 | # If anything at all was written, make sure there's a trailing
|
---|
253 | # newline. There's no way for the expected output to indicate
|
---|
254 | # that a trailing newline is missing.
|
---|
255 | if result and not result.endswith("\n"):
|
---|
256 | result += "\n"
|
---|
257 | # Prevent softspace from screwing up the next test case, in
|
---|
258 | # case they used print with a trailing comma in an example.
|
---|
259 | if hasattr(self, "softspace"):
|
---|
260 | del self.softspace
|
---|
261 | return result
|
---|
262 |
|
---|
263 | def truncate(self, size=None):
|
---|
264 | StringIO.truncate(self, size)
|
---|
265 | if hasattr(self, "softspace"):
|
---|
266 | del self.softspace
|
---|
267 | if not self.buf:
|
---|
268 | # Reset it to an empty string, to make sure it's not unicode.
|
---|
269 | self.buf = ''
|
---|
270 |
|
---|
271 | # Worst-case linear-time ellipsis matching.
|
---|
272 | def _ellipsis_match(want, got):
|
---|
273 | """
|
---|
274 | Essentially the only subtle case:
|
---|
275 | >>> _ellipsis_match('aa...aa', 'aaa')
|
---|
276 | False
|
---|
277 | """
|
---|
278 | if ELLIPSIS_MARKER not in want:
|
---|
279 | return want == got
|
---|
280 |
|
---|
281 | # Find "the real" strings.
|
---|
282 | ws = want.split(ELLIPSIS_MARKER)
|
---|
283 | assert len(ws) >= 2
|
---|
284 |
|
---|
285 | # Deal with exact matches possibly needed at one or both ends.
|
---|
286 | startpos, endpos = 0, len(got)
|
---|
287 | w = ws[0]
|
---|
288 | if w: # starts with exact match
|
---|
289 | if got.startswith(w):
|
---|
290 | startpos = len(w)
|
---|
291 | del ws[0]
|
---|
292 | else:
|
---|
293 | return False
|
---|
294 | w = ws[-1]
|
---|
295 | if w: # ends with exact match
|
---|
296 | if got.endswith(w):
|
---|
297 | endpos -= len(w)
|
---|
298 | del ws[-1]
|
---|
299 | else:
|
---|
300 | return False
|
---|
301 |
|
---|
302 | if startpos > endpos:
|
---|
303 | # Exact end matches required more characters than we have, as in
|
---|
304 | # _ellipsis_match('aa...aa', 'aaa')
|
---|
305 | return False
|
---|
306 |
|
---|
307 | # For the rest, we only need to find the leftmost non-overlapping
|
---|
308 | # match for each piece. If there's no overall match that way alone,
|
---|
309 | # there's no overall match period.
|
---|
310 | for w in ws:
|
---|
311 | # w may be '' at times, if there are consecutive ellipses, or
|
---|
312 | # due to an ellipsis at the start or end of `want`. That's OK.
|
---|
313 | # Search for an empty string succeeds, and doesn't change startpos.
|
---|
314 | startpos = got.find(w, startpos, endpos)
|
---|
315 | if startpos < 0:
|
---|
316 | return False
|
---|
317 | startpos += len(w)
|
---|
318 |
|
---|
319 | return True
|
---|
320 |
|
---|
321 | def _comment_line(line):
|
---|
322 | "Return a commented form of the given line"
|
---|
323 | line = line.rstrip()
|
---|
324 | if line:
|
---|
325 | return '# '+line
|
---|
326 | else:
|
---|
327 | return '#'
|
---|
328 |
|
---|
329 | class _OutputRedirectingPdb(pdb.Pdb):
|
---|
330 | """
|
---|
331 | A specialized version of the python debugger that redirects stdout
|
---|
332 | to a given stream when interacting with the user. Stdout is *not*
|
---|
333 | redirected when traced code is executed.
|
---|
334 | """
|
---|
335 | def __init__(self, out):
|
---|
336 | self.__out = out
|
---|
337 | self.__debugger_used = False
|
---|
338 | pdb.Pdb.__init__(self, stdout=out)
|
---|
339 | # still use input() to get user input
|
---|
340 | self.use_rawinput = 1
|
---|
341 |
|
---|
342 | def set_trace(self, frame=None):
|
---|
343 | self.__debugger_used = True
|
---|
344 | if frame is None:
|
---|
345 | frame = sys._getframe().f_back
|
---|
346 | pdb.Pdb.set_trace(self, frame)
|
---|
347 |
|
---|
348 | def set_continue(self):
|
---|
349 | # Calling set_continue unconditionally would break unit test
|
---|
350 | # coverage reporting, as Bdb.set_continue calls sys.settrace(None).
|
---|
351 | if self.__debugger_used:
|
---|
352 | pdb.Pdb.set_continue(self)
|
---|
353 |
|
---|
354 | def trace_dispatch(self, *args):
|
---|
355 | # Redirect stdout to the given stream.
|
---|
356 | save_stdout = sys.stdout
|
---|
357 | sys.stdout = self.__out
|
---|
358 | # Call Pdb's trace dispatch method.
|
---|
359 | try:
|
---|
360 | return pdb.Pdb.trace_dispatch(self, *args)
|
---|
361 | finally:
|
---|
362 | sys.stdout = save_stdout
|
---|
363 |
|
---|
364 | # [XX] Normalize with respect to os.path.pardir?
|
---|
365 | def _module_relative_path(module, path):
|
---|
366 | if not inspect.ismodule(module):
|
---|
367 | raise TypeError, 'Expected a module: %r' % module
|
---|
368 | if path.startswith('/'):
|
---|
369 | raise ValueError, 'Module-relative files may not have absolute paths'
|
---|
370 |
|
---|
371 | # Find the base directory for the path.
|
---|
372 | if hasattr(module, '__file__'):
|
---|
373 | # A normal module/package
|
---|
374 | basedir = os.path.split(module.__file__)[0]
|
---|
375 | elif module.__name__ == '__main__':
|
---|
376 | # An interactive session.
|
---|
377 | if len(sys.argv)>0 and sys.argv[0] != '':
|
---|
378 | basedir = os.path.split(sys.argv[0])[0]
|
---|
379 | else:
|
---|
380 | basedir = os.curdir
|
---|
381 | else:
|
---|
382 | # A module w/o __file__ (this includes builtins)
|
---|
383 | raise ValueError("Can't resolve paths relative to the module " +
|
---|
384 | module + " (it has no __file__)")
|
---|
385 |
|
---|
386 | # Combine the base directory and the path.
|
---|
387 | return os.path.join(basedir, *(path.split('/')))
|
---|
388 |
|
---|
389 | ######################################################################
|
---|
390 | ## 2. Example & DocTest
|
---|
391 | ######################################################################
|
---|
392 | ## - An "example" is a <source, want> pair, where "source" is a
|
---|
393 | ## fragment of source code, and "want" is the expected output for
|
---|
394 | ## "source." The Example class also includes information about
|
---|
395 | ## where the example was extracted from.
|
---|
396 | ##
|
---|
397 | ## - A "doctest" is a collection of examples, typically extracted from
|
---|
398 | ## a string (such as an object's docstring). The DocTest class also
|
---|
399 | ## includes information about where the string was extracted from.
|
---|
400 |
|
---|
401 | class Example:
|
---|
402 | """
|
---|
403 | A single doctest example, consisting of source code and expected
|
---|
404 | output. `Example` defines the following attributes:
|
---|
405 |
|
---|
406 | - source: A single Python statement, always ending with a newline.
|
---|
407 | The constructor adds a newline if needed.
|
---|
408 |
|
---|
409 | - want: The expected output from running the source code (either
|
---|
410 | from stdout, or a traceback in case of exception). `want` ends
|
---|
411 | with a newline unless it's empty, in which case it's an empty
|
---|
412 | string. The constructor adds a newline if needed.
|
---|
413 |
|
---|
414 | - exc_msg: The exception message generated by the example, if
|
---|
415 | the example is expected to generate an exception; or `None` if
|
---|
416 | it is not expected to generate an exception. This exception
|
---|
417 | message is compared against the return value of
|
---|
418 | `traceback.format_exception_only()`. `exc_msg` ends with a
|
---|
419 | newline unless it's `None`. The constructor adds a newline
|
---|
420 | if needed.
|
---|
421 |
|
---|
422 | - lineno: The line number within the DocTest string containing
|
---|
423 | this Example where the Example begins. This line number is
|
---|
424 | zero-based, with respect to the beginning of the DocTest.
|
---|
425 |
|
---|
426 | - indent: The example's indentation in the DocTest string.
|
---|
427 | I.e., the number of space characters that precede the
|
---|
428 | example's first prompt.
|
---|
429 |
|
---|
430 | - options: A dictionary mapping from option flags to True or
|
---|
431 | False, which is used to override default options for this
|
---|
432 | example. Any option flags not contained in this dictionary
|
---|
433 | are left at their default value (as specified by the
|
---|
434 | DocTestRunner's optionflags). By default, no options are set.
|
---|
435 | """
|
---|
436 | def __init__(self, source, want, exc_msg=None, lineno=0, indent=0,
|
---|
437 | options=None):
|
---|
438 | # Normalize inputs.
|
---|
439 | if not source.endswith('\n'):
|
---|
440 | source += '\n'
|
---|
441 | if want and not want.endswith('\n'):
|
---|
442 | want += '\n'
|
---|
443 | if exc_msg is not None and not exc_msg.endswith('\n'):
|
---|
444 | exc_msg += '\n'
|
---|
445 | # Store properties.
|
---|
446 | self.source = source
|
---|
447 | self.want = want
|
---|
448 | self.lineno = lineno
|
---|
449 | self.indent = indent
|
---|
450 | if options is None: options = {}
|
---|
451 | self.options = options
|
---|
452 | self.exc_msg = exc_msg
|
---|
453 |
|
---|
454 | def __eq__(self, other):
|
---|
455 | if type(self) is not type(other):
|
---|
456 | return NotImplemented
|
---|
457 |
|
---|
458 | return self.source == other.source and \
|
---|
459 | self.want == other.want and \
|
---|
460 | self.lineno == other.lineno and \
|
---|
461 | self.indent == other.indent and \
|
---|
462 | self.options == other.options and \
|
---|
463 | self.exc_msg == other.exc_msg
|
---|
464 |
|
---|
465 | def __ne__(self, other):
|
---|
466 | return not self == other
|
---|
467 |
|
---|
468 | def __hash__(self):
|
---|
469 | return hash((self.source, self.want, self.lineno, self.indent,
|
---|
470 | self.exc_msg))
|
---|
471 |
|
---|
472 |
|
---|
473 | class DocTest:
|
---|
474 | """
|
---|
475 | A collection of doctest examples that should be run in a single
|
---|
476 | namespace. Each `DocTest` defines the following attributes:
|
---|
477 |
|
---|
478 | - examples: the list of examples.
|
---|
479 |
|
---|
480 | - globs: The namespace (aka globals) that the examples should
|
---|
481 | be run in.
|
---|
482 |
|
---|
483 | - name: A name identifying the DocTest (typically, the name of
|
---|
484 | the object whose docstring this DocTest was extracted from).
|
---|
485 |
|
---|
486 | - filename: The name of the file that this DocTest was extracted
|
---|
487 | from, or `None` if the filename is unknown.
|
---|
488 |
|
---|
489 | - lineno: The line number within filename where this DocTest
|
---|
490 | begins, or `None` if the line number is unavailable. This
|
---|
491 | line number is zero-based, with respect to the beginning of
|
---|
492 | the file.
|
---|
493 |
|
---|
494 | - docstring: The string that the examples were extracted from,
|
---|
495 | or `None` if the string is unavailable.
|
---|
496 | """
|
---|
497 | def __init__(self, examples, globs, name, filename, lineno, docstring):
|
---|
498 | """
|
---|
499 | Create a new DocTest containing the given examples. The
|
---|
500 | DocTest's globals are initialized with a copy of `globs`.
|
---|
501 | """
|
---|
502 | assert not isinstance(examples, basestring), \
|
---|
503 | "DocTest no longer accepts str; use DocTestParser instead"
|
---|
504 | self.examples = examples
|
---|
505 | self.docstring = docstring
|
---|
506 | self.globs = globs.copy()
|
---|
507 | self.name = name
|
---|
508 | self.filename = filename
|
---|
509 | self.lineno = lineno
|
---|
510 |
|
---|
511 | def __repr__(self):
|
---|
512 | if len(self.examples) == 0:
|
---|
513 | examples = 'no examples'
|
---|
514 | elif len(self.examples) == 1:
|
---|
515 | examples = '1 example'
|
---|
516 | else:
|
---|
517 | examples = '%d examples' % len(self.examples)
|
---|
518 | return ('<DocTest %s from %s:%s (%s)>' %
|
---|
519 | (self.name, self.filename, self.lineno, examples))
|
---|
520 |
|
---|
521 | def __eq__(self, other):
|
---|
522 | if type(self) is not type(other):
|
---|
523 | return NotImplemented
|
---|
524 |
|
---|
525 | return self.examples == other.examples and \
|
---|
526 | self.docstring == other.docstring and \
|
---|
527 | self.globs == other.globs and \
|
---|
528 | self.name == other.name and \
|
---|
529 | self.filename == other.filename and \
|
---|
530 | self.lineno == other.lineno
|
---|
531 |
|
---|
532 | def __ne__(self, other):
|
---|
533 | return not self == other
|
---|
534 |
|
---|
535 | def __hash__(self):
|
---|
536 | return hash((self.docstring, self.name, self.filename, self.lineno))
|
---|
537 |
|
---|
538 | # This lets us sort tests by name:
|
---|
539 | def __cmp__(self, other):
|
---|
540 | if not isinstance(other, DocTest):
|
---|
541 | return -1
|
---|
542 | return cmp((self.name, self.filename, self.lineno, id(self)),
|
---|
543 | (other.name, other.filename, other.lineno, id(other)))
|
---|
544 |
|
---|
545 | ######################################################################
|
---|
546 | ## 3. DocTestParser
|
---|
547 | ######################################################################
|
---|
548 |
|
---|
549 | class DocTestParser:
|
---|
550 | """
|
---|
551 | A class used to parse strings containing doctest examples.
|
---|
552 | """
|
---|
553 | # This regular expression is used to find doctest examples in a
|
---|
554 | # string. It defines three groups: `source` is the source code
|
---|
555 | # (including leading indentation and prompts); `indent` is the
|
---|
556 | # indentation of the first (PS1) line of the source code; and
|
---|
557 | # `want` is the expected output (including leading indentation).
|
---|
558 | _EXAMPLE_RE = re.compile(r'''
|
---|
559 | # Source consists of a PS1 line followed by zero or more PS2 lines.
|
---|
560 | (?P<source>
|
---|
561 | (?:^(?P<indent> [ ]*) >>> .*) # PS1 line
|
---|
562 | (?:\n [ ]* \.\.\. .*)*) # PS2 lines
|
---|
563 | \n?
|
---|
564 | # Want consists of any non-blank lines that do not start with PS1.
|
---|
565 | (?P<want> (?:(?![ ]*$) # Not a blank line
|
---|
566 | (?![ ]*>>>) # Not a line starting with PS1
|
---|
567 | .+$\n? # But any other line
|
---|
568 | )*)
|
---|
569 | ''', re.MULTILINE | re.VERBOSE)
|
---|
570 |
|
---|
571 | # A regular expression for handling `want` strings that contain
|
---|
572 | # expected exceptions. It divides `want` into three pieces:
|
---|
573 | # - the traceback header line (`hdr`)
|
---|
574 | # - the traceback stack (`stack`)
|
---|
575 | # - the exception message (`msg`), as generated by
|
---|
576 | # traceback.format_exception_only()
|
---|
577 | # `msg` may have multiple lines. We assume/require that the
|
---|
578 | # exception message is the first non-indented line starting with a word
|
---|
579 | # character following the traceback header line.
|
---|
580 | _EXCEPTION_RE = re.compile(r"""
|
---|
581 | # Grab the traceback header. Different versions of Python have
|
---|
582 | # said different things on the first traceback line.
|
---|
583 | ^(?P<hdr> Traceback\ \(
|
---|
584 | (?: most\ recent\ call\ last
|
---|
585 | | innermost\ last
|
---|
586 | ) \) :
|
---|
587 | )
|
---|
588 | \s* $ # toss trailing whitespace on the header.
|
---|
589 | (?P<stack> .*?) # don't blink: absorb stuff until...
|
---|
590 | ^ (?P<msg> \w+ .*) # a line *starts* with alphanum.
|
---|
591 | """, re.VERBOSE | re.MULTILINE | re.DOTALL)
|
---|
592 |
|
---|
593 | # A callable returning a true value iff its argument is a blank line
|
---|
594 | # or contains a single comment.
|
---|
595 | _IS_BLANK_OR_COMMENT = re.compile(r'^[ ]*(#.*)?$').match
|
---|
596 |
|
---|
597 | def parse(self, string, name='<string>'):
|
---|
598 | """
|
---|
599 | Divide the given string into examples and intervening text,
|
---|
600 | and return them as a list of alternating Examples and strings.
|
---|
601 | Line numbers for the Examples are 0-based. The optional
|
---|
602 | argument `name` is a name identifying this string, and is only
|
---|
603 | used for error messages.
|
---|
604 | """
|
---|
605 | string = string.expandtabs()
|
---|
606 | # If all lines begin with the same indentation, then strip it.
|
---|
607 | min_indent = self._min_indent(string)
|
---|
608 | if min_indent > 0:
|
---|
609 | string = '\n'.join([l[min_indent:] for l in string.split('\n')])
|
---|
610 |
|
---|
611 | output = []
|
---|
612 | charno, lineno = 0, 0
|
---|
613 | # Find all doctest examples in the string:
|
---|
614 | for m in self._EXAMPLE_RE.finditer(string):
|
---|
615 | # Add the pre-example text to `output`.
|
---|
616 | output.append(string[charno:m.start()])
|
---|
617 | # Update lineno (lines before this example)
|
---|
618 | lineno += string.count('\n', charno, m.start())
|
---|
619 | # Extract info from the regexp match.
|
---|
620 | (source, options, want, exc_msg) = \
|
---|
621 | self._parse_example(m, name, lineno)
|
---|
622 | # Create an Example, and add it to the list.
|
---|
623 | if not self._IS_BLANK_OR_COMMENT(source):
|
---|
624 | output.append( Example(source, want, exc_msg,
|
---|
625 | lineno=lineno,
|
---|
626 | indent=min_indent+len(m.group('indent')),
|
---|
627 | options=options) )
|
---|
628 | # Update lineno (lines inside this example)
|
---|
629 | lineno += string.count('\n', m.start(), m.end())
|
---|
630 | # Update charno.
|
---|
631 | charno = m.end()
|
---|
632 | # Add any remaining post-example text to `output`.
|
---|
633 | output.append(string[charno:])
|
---|
634 | return output
|
---|
635 |
|
---|
636 | def get_doctest(self, string, globs, name, filename, lineno):
|
---|
637 | """
|
---|
638 | Extract all doctest examples from the given string, and
|
---|
639 | collect them into a `DocTest` object.
|
---|
640 |
|
---|
641 | `globs`, `name`, `filename`, and `lineno` are attributes for
|
---|
642 | the new `DocTest` object. See the documentation for `DocTest`
|
---|
643 | for more information.
|
---|
644 | """
|
---|
645 | return DocTest(self.get_examples(string, name), globs,
|
---|
646 | name, filename, lineno, string)
|
---|
647 |
|
---|
648 | def get_examples(self, string, name='<string>'):
|
---|
649 | """
|
---|
650 | Extract all doctest examples from the given string, and return
|
---|
651 | them as a list of `Example` objects. Line numbers are
|
---|
652 | 0-based, because it's most common in doctests that nothing
|
---|
653 | interesting appears on the same line as opening triple-quote,
|
---|
654 | and so the first interesting line is called \"line 1\" then.
|
---|
655 |
|
---|
656 | The optional argument `name` is a name identifying this
|
---|
657 | string, and is only used for error messages.
|
---|
658 | """
|
---|
659 | return [x for x in self.parse(string, name)
|
---|
660 | if isinstance(x, Example)]
|
---|
661 |
|
---|
662 | def _parse_example(self, m, name, lineno):
|
---|
663 | """
|
---|
664 | Given a regular expression match from `_EXAMPLE_RE` (`m`),
|
---|
665 | return a pair `(source, want)`, where `source` is the matched
|
---|
666 | example's source code (with prompts and indentation stripped);
|
---|
667 | and `want` is the example's expected output (with indentation
|
---|
668 | stripped).
|
---|
669 |
|
---|
670 | `name` is the string's name, and `lineno` is the line number
|
---|
671 | where the example starts; both are used for error messages.
|
---|
672 | """
|
---|
673 | # Get the example's indentation level.
|
---|
674 | indent = len(m.group('indent'))
|
---|
675 |
|
---|
676 | # Divide source into lines; check that they're properly
|
---|
677 | # indented; and then strip their indentation & prompts.
|
---|
678 | source_lines = m.group('source').split('\n')
|
---|
679 | self._check_prompt_blank(source_lines, indent, name, lineno)
|
---|
680 | self._check_prefix(source_lines[1:], ' '*indent + '.', name, lineno)
|
---|
681 | source = '\n'.join([sl[indent+4:] for sl in source_lines])
|
---|
682 |
|
---|
683 | # Divide want into lines; check that it's properly indented; and
|
---|
684 | # then strip the indentation. Spaces before the last newline should
|
---|
685 | # be preserved, so plain rstrip() isn't good enough.
|
---|
686 | want = m.group('want')
|
---|
687 | want_lines = want.split('\n')
|
---|
688 | if len(want_lines) > 1 and re.match(r' *$', want_lines[-1]):
|
---|
689 | del want_lines[-1] # forget final newline & spaces after it
|
---|
690 | self._check_prefix(want_lines, ' '*indent, name,
|
---|
691 | lineno + len(source_lines))
|
---|
692 | want = '\n'.join([wl[indent:] for wl in want_lines])
|
---|
693 |
|
---|
694 | # If `want` contains a traceback message, then extract it.
|
---|
695 | m = self._EXCEPTION_RE.match(want)
|
---|
696 | if m:
|
---|
697 | exc_msg = m.group('msg')
|
---|
698 | else:
|
---|
699 | exc_msg = None
|
---|
700 |
|
---|
701 | # Extract options from the source.
|
---|
702 | options = self._find_options(source, name, lineno)
|
---|
703 |
|
---|
704 | return source, options, want, exc_msg
|
---|
705 |
|
---|
706 | # This regular expression looks for option directives in the
|
---|
707 | # source code of an example. Option directives are comments
|
---|
708 | # starting with "doctest:". Warning: this may give false
|
---|
709 | # positives for string-literals that contain the string
|
---|
710 | # "#doctest:". Eliminating these false positives would require
|
---|
711 | # actually parsing the string; but we limit them by ignoring any
|
---|
712 | # line containing "#doctest:" that is *followed* by a quote mark.
|
---|
713 | _OPTION_DIRECTIVE_RE = re.compile(r'#\s*doctest:\s*([^\n\'"]*)$',
|
---|
714 | re.MULTILINE)
|
---|
715 |
|
---|
716 | def _find_options(self, source, name, lineno):
|
---|
717 | """
|
---|
718 | Return a dictionary containing option overrides extracted from
|
---|
719 | option directives in the given source string.
|
---|
720 |
|
---|
721 | `name` is the string's name, and `lineno` is the line number
|
---|
722 | where the example starts; both are used for error messages.
|
---|
723 | """
|
---|
724 | options = {}
|
---|
725 | # (note: with the current regexp, this will match at most once:)
|
---|
726 | for m in self._OPTION_DIRECTIVE_RE.finditer(source):
|
---|
727 | option_strings = m.group(1).replace(',', ' ').split()
|
---|
728 | for option in option_strings:
|
---|
729 | if (option[0] not in '+-' or
|
---|
730 | option[1:] not in OPTIONFLAGS_BY_NAME):
|
---|
731 | raise ValueError('line %r of the doctest for %s '
|
---|
732 | 'has an invalid option: %r' %
|
---|
733 | (lineno+1, name, option))
|
---|
734 | flag = OPTIONFLAGS_BY_NAME[option[1:]]
|
---|
735 | options[flag] = (option[0] == '+')
|
---|
736 | if options and self._IS_BLANK_OR_COMMENT(source):
|
---|
737 | raise ValueError('line %r of the doctest for %s has an option '
|
---|
738 | 'directive on a line with no example: %r' %
|
---|
739 | (lineno, name, source))
|
---|
740 | return options
|
---|
741 |
|
---|
742 | # This regular expression finds the indentation of every non-blank
|
---|
743 | # line in a string.
|
---|
744 | _INDENT_RE = re.compile('^([ ]*)(?=\S)', re.MULTILINE)
|
---|
745 |
|
---|
746 | def _min_indent(self, s):
|
---|
747 | "Return the minimum indentation of any non-blank line in `s`"
|
---|
748 | indents = [len(indent) for indent in self._INDENT_RE.findall(s)]
|
---|
749 | if len(indents) > 0:
|
---|
750 | return min(indents)
|
---|
751 | else:
|
---|
752 | return 0
|
---|
753 |
|
---|
754 | def _check_prompt_blank(self, lines, indent, name, lineno):
|
---|
755 | """
|
---|
756 | Given the lines of a source string (including prompts and
|
---|
757 | leading indentation), check to make sure that every prompt is
|
---|
758 | followed by a space character. If any line is not followed by
|
---|
759 | a space character, then raise ValueError.
|
---|
760 | """
|
---|
761 | for i, line in enumerate(lines):
|
---|
762 | if len(line) >= indent+4 and line[indent+3] != ' ':
|
---|
763 | raise ValueError('line %r of the docstring for %s '
|
---|
764 | 'lacks blank after %s: %r' %
|
---|
765 | (lineno+i+1, name,
|
---|
766 | line[indent:indent+3], line))
|
---|
767 |
|
---|
768 | def _check_prefix(self, lines, prefix, name, lineno):
|
---|
769 | """
|
---|
770 | Check that every line in the given list starts with the given
|
---|
771 | prefix; if any line does not, then raise a ValueError.
|
---|
772 | """
|
---|
773 | for i, line in enumerate(lines):
|
---|
774 | if line and not line.startswith(prefix):
|
---|
775 | raise ValueError('line %r of the docstring for %s has '
|
---|
776 | 'inconsistent leading whitespace: %r' %
|
---|
777 | (lineno+i+1, name, line))
|
---|
778 |
|
---|
779 |
|
---|
780 | ######################################################################
|
---|
781 | ## 4. DocTest Finder
|
---|
782 | ######################################################################
|
---|
783 |
|
---|
784 | class DocTestFinder:
|
---|
785 | """
|
---|
786 | A class used to extract the DocTests that are relevant to a given
|
---|
787 | object, from its docstring and the docstrings of its contained
|
---|
788 | objects. Doctests can currently be extracted from the following
|
---|
789 | object types: modules, functions, classes, methods, staticmethods,
|
---|
790 | classmethods, and properties.
|
---|
791 | """
|
---|
792 |
|
---|
793 | def __init__(self, verbose=False, parser=DocTestParser(),
|
---|
794 | recurse=True, exclude_empty=True):
|
---|
795 | """
|
---|
796 | Create a new doctest finder.
|
---|
797 |
|
---|
798 | The optional argument `parser` specifies a class or
|
---|
799 | function that should be used to create new DocTest objects (or
|
---|
800 | objects that implement the same interface as DocTest). The
|
---|
801 | signature for this factory function should match the signature
|
---|
802 | of the DocTest constructor.
|
---|
803 |
|
---|
804 | If the optional argument `recurse` is false, then `find` will
|
---|
805 | only examine the given object, and not any contained objects.
|
---|
806 |
|
---|
807 | If the optional argument `exclude_empty` is false, then `find`
|
---|
808 | will include tests for objects with empty docstrings.
|
---|
809 | """
|
---|
810 | self._parser = parser
|
---|
811 | self._verbose = verbose
|
---|
812 | self._recurse = recurse
|
---|
813 | self._exclude_empty = exclude_empty
|
---|
814 |
|
---|
815 | def find(self, obj, name=None, module=None, globs=None, extraglobs=None):
|
---|
816 | """
|
---|
817 | Return a list of the DocTests that are defined by the given
|
---|
818 | object's docstring, or by any of its contained objects'
|
---|
819 | docstrings.
|
---|
820 |
|
---|
821 | The optional parameter `module` is the module that contains
|
---|
822 | the given object. If the module is not specified or is None, then
|
---|
823 | the test finder will attempt to automatically determine the
|
---|
824 | correct module. The object's module is used:
|
---|
825 |
|
---|
826 | - As a default namespace, if `globs` is not specified.
|
---|
827 | - To prevent the DocTestFinder from extracting DocTests
|
---|
828 | from objects that are imported from other modules.
|
---|
829 | - To find the name of the file containing the object.
|
---|
830 | - To help find the line number of the object within its
|
---|
831 | file.
|
---|
832 |
|
---|
833 | Contained objects whose module does not match `module` are ignored.
|
---|
834 |
|
---|
835 | If `module` is False, no attempt to find the module will be made.
|
---|
836 | This is obscure, of use mostly in tests: if `module` is False, or
|
---|
837 | is None but cannot be found automatically, then all objects are
|
---|
838 | considered to belong to the (non-existent) module, so all contained
|
---|
839 | objects will (recursively) be searched for doctests.
|
---|
840 |
|
---|
841 | The globals for each DocTest is formed by combining `globs`
|
---|
842 | and `extraglobs` (bindings in `extraglobs` override bindings
|
---|
843 | in `globs`). A new copy of the globals dictionary is created
|
---|
844 | for each DocTest. If `globs` is not specified, then it
|
---|
845 | defaults to the module's `__dict__`, if specified, or {}
|
---|
846 | otherwise. If `extraglobs` is not specified, then it defaults
|
---|
847 | to {}.
|
---|
848 |
|
---|
849 | """
|
---|
850 | # If name was not specified, then extract it from the object.
|
---|
851 | if name is None:
|
---|
852 | name = getattr(obj, '__name__', None)
|
---|
853 | if name is None:
|
---|
854 | raise ValueError("DocTestFinder.find: name must be given "
|
---|
855 | "when obj.__name__ doesn't exist: %r" %
|
---|
856 | (type(obj),))
|
---|
857 |
|
---|
858 | # Find the module that contains the given object (if obj is
|
---|
859 | # a module, then module=obj.). Note: this may fail, in which
|
---|
860 | # case module will be None.
|
---|
861 | if module is False:
|
---|
862 | module = None
|
---|
863 | elif module is None:
|
---|
864 | module = inspect.getmodule(obj)
|
---|
865 |
|
---|
866 | # Read the module's source code. This is used by
|
---|
867 | # DocTestFinder._find_lineno to find the line number for a
|
---|
868 | # given object's docstring.
|
---|
869 | try:
|
---|
870 | file = inspect.getsourcefile(obj) or inspect.getfile(obj)
|
---|
871 | if module is not None:
|
---|
872 | # Supply the module globals in case the module was
|
---|
873 | # originally loaded via a PEP 302 loader and
|
---|
874 | # file is not a valid filesystem path
|
---|
875 | source_lines = linecache.getlines(file, module.__dict__)
|
---|
876 | else:
|
---|
877 | # No access to a loader, so assume it's a normal
|
---|
878 | # filesystem path
|
---|
879 | source_lines = linecache.getlines(file)
|
---|
880 | if not source_lines:
|
---|
881 | source_lines = None
|
---|
882 | except TypeError:
|
---|
883 | source_lines = None
|
---|
884 |
|
---|
885 | # Initialize globals, and merge in extraglobs.
|
---|
886 | if globs is None:
|
---|
887 | if module is None:
|
---|
888 | globs = {}
|
---|
889 | else:
|
---|
890 | globs = module.__dict__.copy()
|
---|
891 | else:
|
---|
892 | globs = globs.copy()
|
---|
893 | if extraglobs is not None:
|
---|
894 | globs.update(extraglobs)
|
---|
895 | if '__name__' not in globs:
|
---|
896 | globs['__name__'] = '__main__' # provide a default module name
|
---|
897 |
|
---|
898 | # Recursively explore `obj`, extracting DocTests.
|
---|
899 | tests = []
|
---|
900 | self._find(tests, obj, name, module, source_lines, globs, {})
|
---|
901 | # Sort the tests by alpha order of names, for consistency in
|
---|
902 | # verbose-mode output. This was a feature of doctest in Pythons
|
---|
903 | # <= 2.3 that got lost by accident in 2.4. It was repaired in
|
---|
904 | # 2.4.4 and 2.5.
|
---|
905 | tests.sort()
|
---|
906 | return tests
|
---|
907 |
|
---|
908 | def _from_module(self, module, object):
|
---|
909 | """
|
---|
910 | Return true if the given object is defined in the given
|
---|
911 | module.
|
---|
912 | """
|
---|
913 | if module is None:
|
---|
914 | return True
|
---|
915 | elif inspect.getmodule(object) is not None:
|
---|
916 | return module is inspect.getmodule(object)
|
---|
917 | elif inspect.isfunction(object):
|
---|
918 | return module.__dict__ is object.func_globals
|
---|
919 | elif inspect.isclass(object):
|
---|
920 | return module.__name__ == object.__module__
|
---|
921 | elif hasattr(object, '__module__'):
|
---|
922 | return module.__name__ == object.__module__
|
---|
923 | elif isinstance(object, property):
|
---|
924 | return True # [XX] no way not be sure.
|
---|
925 | else:
|
---|
926 | raise ValueError("object must be a class or function")
|
---|
927 |
|
---|
928 | def _find(self, tests, obj, name, module, source_lines, globs, seen):
|
---|
929 | """
|
---|
930 | Find tests for the given object and any contained objects, and
|
---|
931 | add them to `tests`.
|
---|
932 | """
|
---|
933 | if self._verbose:
|
---|
934 | print 'Finding tests in %s' % name
|
---|
935 |
|
---|
936 | # If we've already processed this object, then ignore it.
|
---|
937 | if id(obj) in seen:
|
---|
938 | return
|
---|
939 | seen[id(obj)] = 1
|
---|
940 |
|
---|
941 | # Find a test for this object, and add it to the list of tests.
|
---|
942 | test = self._get_test(obj, name, module, globs, source_lines)
|
---|
943 | if test is not None:
|
---|
944 | tests.append(test)
|
---|
945 |
|
---|
946 | # Look for tests in a module's contained objects.
|
---|
947 | if inspect.ismodule(obj) and self._recurse:
|
---|
948 | for valname, val in obj.__dict__.items():
|
---|
949 | valname = '%s.%s' % (name, valname)
|
---|
950 | # Recurse to functions & classes.
|
---|
951 | if ((inspect.isfunction(val) or inspect.isclass(val)) and
|
---|
952 | self._from_module(module, val)):
|
---|
953 | self._find(tests, val, valname, module, source_lines,
|
---|
954 | globs, seen)
|
---|
955 |
|
---|
956 | # Look for tests in a module's __test__ dictionary.
|
---|
957 | if inspect.ismodule(obj) and self._recurse:
|
---|
958 | for valname, val in getattr(obj, '__test__', {}).items():
|
---|
959 | if not isinstance(valname, basestring):
|
---|
960 | raise ValueError("DocTestFinder.find: __test__ keys "
|
---|
961 | "must be strings: %r" %
|
---|
962 | (type(valname),))
|
---|
963 | if not (inspect.isfunction(val) or inspect.isclass(val) or
|
---|
964 | inspect.ismethod(val) or inspect.ismodule(val) or
|
---|
965 | isinstance(val, basestring)):
|
---|
966 | raise ValueError("DocTestFinder.find: __test__ values "
|
---|
967 | "must be strings, functions, methods, "
|
---|
968 | "classes, or modules: %r" %
|
---|
969 | (type(val),))
|
---|
970 | valname = '%s.__test__.%s' % (name, valname)
|
---|
971 | self._find(tests, val, valname, module, source_lines,
|
---|
972 | globs, seen)
|
---|
973 |
|
---|
974 | # Look for tests in a class's contained objects.
|
---|
975 | if inspect.isclass(obj) and self._recurse:
|
---|
976 | for valname, val in obj.__dict__.items():
|
---|
977 | # Special handling for staticmethod/classmethod.
|
---|
978 | if isinstance(val, staticmethod):
|
---|
979 | val = getattr(obj, valname)
|
---|
980 | if isinstance(val, classmethod):
|
---|
981 | val = getattr(obj, valname).im_func
|
---|
982 |
|
---|
983 | # Recurse to methods, properties, and nested classes.
|
---|
984 | if ((inspect.isfunction(val) or inspect.isclass(val) or
|
---|
985 | isinstance(val, property)) and
|
---|
986 | self._from_module(module, val)):
|
---|
987 | valname = '%s.%s' % (name, valname)
|
---|
988 | self._find(tests, val, valname, module, source_lines,
|
---|
989 | globs, seen)
|
---|
990 |
|
---|
991 | def _get_test(self, obj, name, module, globs, source_lines):
|
---|
992 | """
|
---|
993 | Return a DocTest for the given object, if it defines a docstring;
|
---|
994 | otherwise, return None.
|
---|
995 | """
|
---|
996 | # Extract the object's docstring. If it doesn't have one,
|
---|
997 | # then return None (no test for this object).
|
---|
998 | if isinstance(obj, basestring):
|
---|
999 | docstring = obj
|
---|
1000 | else:
|
---|
1001 | try:
|
---|
1002 | if obj.__doc__ is None:
|
---|
1003 | docstring = ''
|
---|
1004 | else:
|
---|
1005 | docstring = obj.__doc__
|
---|
1006 | if not isinstance(docstring, basestring):
|
---|
1007 | docstring = str(docstring)
|
---|
1008 | except (TypeError, AttributeError):
|
---|
1009 | docstring = ''
|
---|
1010 |
|
---|
1011 | # Find the docstring's location in the file.
|
---|
1012 | lineno = self._find_lineno(obj, source_lines)
|
---|
1013 |
|
---|
1014 | # Don't bother if the docstring is empty.
|
---|
1015 | if self._exclude_empty and not docstring:
|
---|
1016 | return None
|
---|
1017 |
|
---|
1018 | # Return a DocTest for this object.
|
---|
1019 | if module is None:
|
---|
1020 | filename = None
|
---|
1021 | else:
|
---|
1022 | filename = getattr(module, '__file__', module.__name__)
|
---|
1023 | if filename[-4:] in (".pyc", ".pyo"):
|
---|
1024 | filename = filename[:-1]
|
---|
1025 | return self._parser.get_doctest(docstring, globs, name,
|
---|
1026 | filename, lineno)
|
---|
1027 |
|
---|
1028 | def _find_lineno(self, obj, source_lines):
|
---|
1029 | """
|
---|
1030 | Return a line number of the given object's docstring. Note:
|
---|
1031 | this method assumes that the object has a docstring.
|
---|
1032 | """
|
---|
1033 | lineno = None
|
---|
1034 |
|
---|
1035 | # Find the line number for modules.
|
---|
1036 | if inspect.ismodule(obj):
|
---|
1037 | lineno = 0
|
---|
1038 |
|
---|
1039 | # Find the line number for classes.
|
---|
1040 | # Note: this could be fooled if a class is defined multiple
|
---|
1041 | # times in a single file.
|
---|
1042 | if inspect.isclass(obj):
|
---|
1043 | if source_lines is None:
|
---|
1044 | return None
|
---|
1045 | pat = re.compile(r'^\s*class\s*%s\b' %
|
---|
1046 | getattr(obj, '__name__', '-'))
|
---|
1047 | for i, line in enumerate(source_lines):
|
---|
1048 | if pat.match(line):
|
---|
1049 | lineno = i
|
---|
1050 | break
|
---|
1051 |
|
---|
1052 | # Find the line number for functions & methods.
|
---|
1053 | if inspect.ismethod(obj): obj = obj.im_func
|
---|
1054 | if inspect.isfunction(obj): obj = obj.func_code
|
---|
1055 | if inspect.istraceback(obj): obj = obj.tb_frame
|
---|
1056 | if inspect.isframe(obj): obj = obj.f_code
|
---|
1057 | if inspect.iscode(obj):
|
---|
1058 | lineno = getattr(obj, 'co_firstlineno', None)-1
|
---|
1059 |
|
---|
1060 | # Find the line number where the docstring starts. Assume
|
---|
1061 | # that it's the first line that begins with a quote mark.
|
---|
1062 | # Note: this could be fooled by a multiline function
|
---|
1063 | # signature, where a continuation line begins with a quote
|
---|
1064 | # mark.
|
---|
1065 | if lineno is not None:
|
---|
1066 | if source_lines is None:
|
---|
1067 | return lineno+1
|
---|
1068 | pat = re.compile('(^|.*:)\s*\w*("|\')')
|
---|
1069 | for lineno in range(lineno, len(source_lines)):
|
---|
1070 | if pat.match(source_lines[lineno]):
|
---|
1071 | return lineno
|
---|
1072 |
|
---|
1073 | # We couldn't find the line number.
|
---|
1074 | return None
|
---|
1075 |
|
---|
1076 | ######################################################################
|
---|
1077 | ## 5. DocTest Runner
|
---|
1078 | ######################################################################
|
---|
1079 |
|
---|
1080 | class DocTestRunner:
|
---|
1081 | """
|
---|
1082 | A class used to run DocTest test cases, and accumulate statistics.
|
---|
1083 | The `run` method is used to process a single DocTest case. It
|
---|
1084 | returns a tuple `(f, t)`, where `t` is the number of test cases
|
---|
1085 | tried, and `f` is the number of test cases that failed.
|
---|
1086 |
|
---|
1087 | >>> tests = DocTestFinder().find(_TestClass)
|
---|
1088 | >>> runner = DocTestRunner(verbose=False)
|
---|
1089 | >>> tests.sort(key = lambda test: test.name)
|
---|
1090 | >>> for test in tests:
|
---|
1091 | ... print test.name, '->', runner.run(test)
|
---|
1092 | _TestClass -> TestResults(failed=0, attempted=2)
|
---|
1093 | _TestClass.__init__ -> TestResults(failed=0, attempted=2)
|
---|
1094 | _TestClass.get -> TestResults(failed=0, attempted=2)
|
---|
1095 | _TestClass.square -> TestResults(failed=0, attempted=1)
|
---|
1096 |
|
---|
1097 | The `summarize` method prints a summary of all the test cases that
|
---|
1098 | have been run by the runner, and returns an aggregated `(f, t)`
|
---|
1099 | tuple:
|
---|
1100 |
|
---|
1101 | >>> runner.summarize(verbose=1)
|
---|
1102 | 4 items passed all tests:
|
---|
1103 | 2 tests in _TestClass
|
---|
1104 | 2 tests in _TestClass.__init__
|
---|
1105 | 2 tests in _TestClass.get
|
---|
1106 | 1 tests in _TestClass.square
|
---|
1107 | 7 tests in 4 items.
|
---|
1108 | 7 passed and 0 failed.
|
---|
1109 | Test passed.
|
---|
1110 | TestResults(failed=0, attempted=7)
|
---|
1111 |
|
---|
1112 | The aggregated number of tried examples and failed examples is
|
---|
1113 | also available via the `tries` and `failures` attributes:
|
---|
1114 |
|
---|
1115 | >>> runner.tries
|
---|
1116 | 7
|
---|
1117 | >>> runner.failures
|
---|
1118 | 0
|
---|
1119 |
|
---|
1120 | The comparison between expected outputs and actual outputs is done
|
---|
1121 | by an `OutputChecker`. This comparison may be customized with a
|
---|
1122 | number of option flags; see the documentation for `testmod` for
|
---|
1123 | more information. If the option flags are insufficient, then the
|
---|
1124 | comparison may also be customized by passing a subclass of
|
---|
1125 | `OutputChecker` to the constructor.
|
---|
1126 |
|
---|
1127 | The test runner's display output can be controlled in two ways.
|
---|
1128 | First, an output function (`out) can be passed to
|
---|
1129 | `TestRunner.run`; this function will be called with strings that
|
---|
1130 | should be displayed. It defaults to `sys.stdout.write`. If
|
---|
1131 | capturing the output is not sufficient, then the display output
|
---|
1132 | can be also customized by subclassing DocTestRunner, and
|
---|
1133 | overriding the methods `report_start`, `report_success`,
|
---|
1134 | `report_unexpected_exception`, and `report_failure`.
|
---|
1135 | """
|
---|
1136 | # This divider string is used to separate failure messages, and to
|
---|
1137 | # separate sections of the summary.
|
---|
1138 | DIVIDER = "*" * 70
|
---|
1139 |
|
---|
1140 | def __init__(self, checker=None, verbose=None, optionflags=0):
|
---|
1141 | """
|
---|
1142 | Create a new test runner.
|
---|
1143 |
|
---|
1144 | Optional keyword arg `checker` is the `OutputChecker` that
|
---|
1145 | should be used to compare the expected outputs and actual
|
---|
1146 | outputs of doctest examples.
|
---|
1147 |
|
---|
1148 | Optional keyword arg 'verbose' prints lots of stuff if true,
|
---|
1149 | only failures if false; by default, it's true iff '-v' is in
|
---|
1150 | sys.argv.
|
---|
1151 |
|
---|
1152 | Optional argument `optionflags` can be used to control how the
|
---|
1153 | test runner compares expected output to actual output, and how
|
---|
1154 | it displays failures. See the documentation for `testmod` for
|
---|
1155 | more information.
|
---|
1156 | """
|
---|
1157 | self._checker = checker or OutputChecker()
|
---|
1158 | if verbose is None:
|
---|
1159 | verbose = '-v' in sys.argv
|
---|
1160 | self._verbose = verbose
|
---|
1161 | self.optionflags = optionflags
|
---|
1162 | self.original_optionflags = optionflags
|
---|
1163 |
|
---|
1164 | # Keep track of the examples we've run.
|
---|
1165 | self.tries = 0
|
---|
1166 | self.failures = 0
|
---|
1167 | self._name2ft = {}
|
---|
1168 |
|
---|
1169 | # Create a fake output target for capturing doctest output.
|
---|
1170 | self._fakeout = _SpoofOut()
|
---|
1171 |
|
---|
1172 | #/////////////////////////////////////////////////////////////////
|
---|
1173 | # Reporting methods
|
---|
1174 | #/////////////////////////////////////////////////////////////////
|
---|
1175 |
|
---|
1176 | def report_start(self, out, test, example):
|
---|
1177 | """
|
---|
1178 | Report that the test runner is about to process the given
|
---|
1179 | example. (Only displays a message if verbose=True)
|
---|
1180 | """
|
---|
1181 | if self._verbose:
|
---|
1182 | if example.want:
|
---|
1183 | out('Trying:\n' + _indent(example.source) +
|
---|
1184 | 'Expecting:\n' + _indent(example.want))
|
---|
1185 | else:
|
---|
1186 | out('Trying:\n' + _indent(example.source) +
|
---|
1187 | 'Expecting nothing\n')
|
---|
1188 |
|
---|
1189 | def report_success(self, out, test, example, got):
|
---|
1190 | """
|
---|
1191 | Report that the given example ran successfully. (Only
|
---|
1192 | displays a message if verbose=True)
|
---|
1193 | """
|
---|
1194 | if self._verbose:
|
---|
1195 | out("ok\n")
|
---|
1196 |
|
---|
1197 | def report_failure(self, out, test, example, got):
|
---|
1198 | """
|
---|
1199 | Report that the given example failed.
|
---|
1200 | """
|
---|
1201 | out(self._failure_header(test, example) +
|
---|
1202 | self._checker.output_difference(example, got, self.optionflags))
|
---|
1203 |
|
---|
1204 | def report_unexpected_exception(self, out, test, example, exc_info):
|
---|
1205 | """
|
---|
1206 | Report that the given example raised an unexpected exception.
|
---|
1207 | """
|
---|
1208 | out(self._failure_header(test, example) +
|
---|
1209 | 'Exception raised:\n' + _indent(_exception_traceback(exc_info)))
|
---|
1210 |
|
---|
1211 | def _failure_header(self, test, example):
|
---|
1212 | out = [self.DIVIDER]
|
---|
1213 | if test.filename:
|
---|
1214 | if test.lineno is not None and example.lineno is not None:
|
---|
1215 | lineno = test.lineno + example.lineno + 1
|
---|
1216 | else:
|
---|
1217 | lineno = '?'
|
---|
1218 | out.append('File "%s", line %s, in %s' %
|
---|
1219 | (test.filename, lineno, test.name))
|
---|
1220 | else:
|
---|
1221 | out.append('Line %s, in %s' % (example.lineno+1, test.name))
|
---|
1222 | out.append('Failed example:')
|
---|
1223 | source = example.source
|
---|
1224 | out.append(_indent(source))
|
---|
1225 | return '\n'.join(out)
|
---|
1226 |
|
---|
1227 | #/////////////////////////////////////////////////////////////////
|
---|
1228 | # DocTest Running
|
---|
1229 | #/////////////////////////////////////////////////////////////////
|
---|
1230 |
|
---|
1231 | def __run(self, test, compileflags, out):
|
---|
1232 | """
|
---|
1233 | Run the examples in `test`. Write the outcome of each example
|
---|
1234 | with one of the `DocTestRunner.report_*` methods, using the
|
---|
1235 | writer function `out`. `compileflags` is the set of compiler
|
---|
1236 | flags that should be used to execute examples. Return a tuple
|
---|
1237 | `(f, t)`, where `t` is the number of examples tried, and `f`
|
---|
1238 | is the number of examples that failed. The examples are run
|
---|
1239 | in the namespace `test.globs`.
|
---|
1240 | """
|
---|
1241 | # Keep track of the number of failures and tries.
|
---|
1242 | failures = tries = 0
|
---|
1243 |
|
---|
1244 | # Save the option flags (since option directives can be used
|
---|
1245 | # to modify them).
|
---|
1246 | original_optionflags = self.optionflags
|
---|
1247 |
|
---|
1248 | SUCCESS, FAILURE, BOOM = range(3) # `outcome` state
|
---|
1249 |
|
---|
1250 | check = self._checker.check_output
|
---|
1251 |
|
---|
1252 | # Process each example.
|
---|
1253 | for examplenum, example in enumerate(test.examples):
|
---|
1254 |
|
---|
1255 | # If REPORT_ONLY_FIRST_FAILURE is set, then suppress
|
---|
1256 | # reporting after the first failure.
|
---|
1257 | quiet = (self.optionflags & REPORT_ONLY_FIRST_FAILURE and
|
---|
1258 | failures > 0)
|
---|
1259 |
|
---|
1260 | # Merge in the example's options.
|
---|
1261 | self.optionflags = original_optionflags
|
---|
1262 | if example.options:
|
---|
1263 | for (optionflag, val) in example.options.items():
|
---|
1264 | if val:
|
---|
1265 | self.optionflags |= optionflag
|
---|
1266 | else:
|
---|
1267 | self.optionflags &= ~optionflag
|
---|
1268 |
|
---|
1269 | # If 'SKIP' is set, then skip this example.
|
---|
1270 | if self.optionflags & SKIP:
|
---|
1271 | continue
|
---|
1272 |
|
---|
1273 | # Record that we started this example.
|
---|
1274 | tries += 1
|
---|
1275 | if not quiet:
|
---|
1276 | self.report_start(out, test, example)
|
---|
1277 |
|
---|
1278 | # Use a special filename for compile(), so we can retrieve
|
---|
1279 | # the source code during interactive debugging (see
|
---|
1280 | # __patched_linecache_getlines).
|
---|
1281 | filename = '<doctest %s[%d]>' % (test.name, examplenum)
|
---|
1282 |
|
---|
1283 | # Run the example in the given context (globs), and record
|
---|
1284 | # any exception that gets raised. (But don't intercept
|
---|
1285 | # keyboard interrupts.)
|
---|
1286 | try:
|
---|
1287 | # Don't blink! This is where the user's code gets run.
|
---|
1288 | exec compile(example.source, filename, "single",
|
---|
1289 | compileflags, 1) in test.globs
|
---|
1290 | self.debugger.set_continue() # ==== Example Finished ====
|
---|
1291 | exception = None
|
---|
1292 | except KeyboardInterrupt:
|
---|
1293 | raise
|
---|
1294 | except:
|
---|
1295 | exception = sys.exc_info()
|
---|
1296 | self.debugger.set_continue() # ==== Example Finished ====
|
---|
1297 |
|
---|
1298 | got = self._fakeout.getvalue() # the actual output
|
---|
1299 | self._fakeout.truncate(0)
|
---|
1300 | outcome = FAILURE # guilty until proved innocent or insane
|
---|
1301 |
|
---|
1302 | # If the example executed without raising any exceptions,
|
---|
1303 | # verify its output.
|
---|
1304 | if exception is None:
|
---|
1305 | if check(example.want, got, self.optionflags):
|
---|
1306 | outcome = SUCCESS
|
---|
1307 |
|
---|
1308 | # The example raised an exception: check if it was expected.
|
---|
1309 | else:
|
---|
1310 | exc_info = sys.exc_info()
|
---|
1311 | exc_msg = traceback.format_exception_only(*exc_info[:2])[-1]
|
---|
1312 | if not quiet:
|
---|
1313 | got += _exception_traceback(exc_info)
|
---|
1314 |
|
---|
1315 | # If `example.exc_msg` is None, then we weren't expecting
|
---|
1316 | # an exception.
|
---|
1317 | if example.exc_msg is None:
|
---|
1318 | outcome = BOOM
|
---|
1319 |
|
---|
1320 | # We expected an exception: see whether it matches.
|
---|
1321 | elif check(example.exc_msg, exc_msg, self.optionflags):
|
---|
1322 | outcome = SUCCESS
|
---|
1323 |
|
---|
1324 | # Another chance if they didn't care about the detail.
|
---|
1325 | elif self.optionflags & IGNORE_EXCEPTION_DETAIL:
|
---|
1326 | m1 = re.match(r'(?:[^:]*\.)?([^:]*:)', example.exc_msg)
|
---|
1327 | m2 = re.match(r'(?:[^:]*\.)?([^:]*:)', exc_msg)
|
---|
1328 | if m1 and m2 and check(m1.group(1), m2.group(1),
|
---|
1329 | self.optionflags):
|
---|
1330 | outcome = SUCCESS
|
---|
1331 |
|
---|
1332 | # Report the outcome.
|
---|
1333 | if outcome is SUCCESS:
|
---|
1334 | if not quiet:
|
---|
1335 | self.report_success(out, test, example, got)
|
---|
1336 | elif outcome is FAILURE:
|
---|
1337 | if not quiet:
|
---|
1338 | self.report_failure(out, test, example, got)
|
---|
1339 | failures += 1
|
---|
1340 | elif outcome is BOOM:
|
---|
1341 | if not quiet:
|
---|
1342 | self.report_unexpected_exception(out, test, example,
|
---|
1343 | exc_info)
|
---|
1344 | failures += 1
|
---|
1345 | else:
|
---|
1346 | assert False, ("unknown outcome", outcome)
|
---|
1347 |
|
---|
1348 | # Restore the option flags (in case they were modified)
|
---|
1349 | self.optionflags = original_optionflags
|
---|
1350 |
|
---|
1351 | # Record and return the number of failures and tries.
|
---|
1352 | self.__record_outcome(test, failures, tries)
|
---|
1353 | return TestResults(failures, tries)
|
---|
1354 |
|
---|
1355 | def __record_outcome(self, test, f, t):
|
---|
1356 | """
|
---|
1357 | Record the fact that the given DocTest (`test`) generated `f`
|
---|
1358 | failures out of `t` tried examples.
|
---|
1359 | """
|
---|
1360 | f2, t2 = self._name2ft.get(test.name, (0,0))
|
---|
1361 | self._name2ft[test.name] = (f+f2, t+t2)
|
---|
1362 | self.failures += f
|
---|
1363 | self.tries += t
|
---|
1364 |
|
---|
1365 | __LINECACHE_FILENAME_RE = re.compile(r'<doctest '
|
---|
1366 | r'(?P<name>.+)'
|
---|
1367 | r'\[(?P<examplenum>\d+)\]>$')
|
---|
1368 | def __patched_linecache_getlines(self, filename, module_globals=None):
|
---|
1369 | m = self.__LINECACHE_FILENAME_RE.match(filename)
|
---|
1370 | if m and m.group('name') == self.test.name:
|
---|
1371 | example = self.test.examples[int(m.group('examplenum'))]
|
---|
1372 | source = example.source
|
---|
1373 | if isinstance(source, unicode):
|
---|
1374 | source = source.encode('ascii', 'backslashreplace')
|
---|
1375 | return source.splitlines(True)
|
---|
1376 | else:
|
---|
1377 | return self.save_linecache_getlines(filename, module_globals)
|
---|
1378 |
|
---|
1379 | def run(self, test, compileflags=None, out=None, clear_globs=True):
|
---|
1380 | """
|
---|
1381 | Run the examples in `test`, and display the results using the
|
---|
1382 | writer function `out`.
|
---|
1383 |
|
---|
1384 | The examples are run in the namespace `test.globs`. If
|
---|
1385 | `clear_globs` is true (the default), then this namespace will
|
---|
1386 | be cleared after the test runs, to help with garbage
|
---|
1387 | collection. If you would like to examine the namespace after
|
---|
1388 | the test completes, then use `clear_globs=False`.
|
---|
1389 |
|
---|
1390 | `compileflags` gives the set of flags that should be used by
|
---|
1391 | the Python compiler when running the examples. If not
|
---|
1392 | specified, then it will default to the set of future-import
|
---|
1393 | flags that apply to `globs`.
|
---|
1394 |
|
---|
1395 | The output of each example is checked using
|
---|
1396 | `DocTestRunner.check_output`, and the results are formatted by
|
---|
1397 | the `DocTestRunner.report_*` methods.
|
---|
1398 | """
|
---|
1399 | self.test = test
|
---|
1400 |
|
---|
1401 | if compileflags is None:
|
---|
1402 | compileflags = _extract_future_flags(test.globs)
|
---|
1403 |
|
---|
1404 | save_stdout = sys.stdout
|
---|
1405 | if out is None:
|
---|
1406 | out = save_stdout.write
|
---|
1407 | sys.stdout = self._fakeout
|
---|
1408 |
|
---|
1409 | # Patch pdb.set_trace to restore sys.stdout during interactive
|
---|
1410 | # debugging (so it's not still redirected to self._fakeout).
|
---|
1411 | # Note that the interactive output will go to *our*
|
---|
1412 | # save_stdout, even if that's not the real sys.stdout; this
|
---|
1413 | # allows us to write test cases for the set_trace behavior.
|
---|
1414 | save_set_trace = pdb.set_trace
|
---|
1415 | self.debugger = _OutputRedirectingPdb(save_stdout)
|
---|
1416 | self.debugger.reset()
|
---|
1417 | pdb.set_trace = self.debugger.set_trace
|
---|
1418 |
|
---|
1419 | # Patch linecache.getlines, so we can see the example's source
|
---|
1420 | # when we're inside the debugger.
|
---|
1421 | self.save_linecache_getlines = linecache.getlines
|
---|
1422 | linecache.getlines = self.__patched_linecache_getlines
|
---|
1423 |
|
---|
1424 | # Make sure sys.displayhook just prints the value to stdout
|
---|
1425 | save_displayhook = sys.displayhook
|
---|
1426 | sys.displayhook = sys.__displayhook__
|
---|
1427 |
|
---|
1428 | try:
|
---|
1429 | return self.__run(test, compileflags, out)
|
---|
1430 | finally:
|
---|
1431 | sys.stdout = save_stdout
|
---|
1432 | pdb.set_trace = save_set_trace
|
---|
1433 | linecache.getlines = self.save_linecache_getlines
|
---|
1434 | sys.displayhook = save_displayhook
|
---|
1435 | if clear_globs:
|
---|
1436 | test.globs.clear()
|
---|
1437 |
|
---|
1438 | #/////////////////////////////////////////////////////////////////
|
---|
1439 | # Summarization
|
---|
1440 | #/////////////////////////////////////////////////////////////////
|
---|
1441 | def summarize(self, verbose=None):
|
---|
1442 | """
|
---|
1443 | Print a summary of all the test cases that have been run by
|
---|
1444 | this DocTestRunner, and return a tuple `(f, t)`, where `f` is
|
---|
1445 | the total number of failed examples, and `t` is the total
|
---|
1446 | number of tried examples.
|
---|
1447 |
|
---|
1448 | The optional `verbose` argument controls how detailed the
|
---|
1449 | summary is. If the verbosity is not specified, then the
|
---|
1450 | DocTestRunner's verbosity is used.
|
---|
1451 | """
|
---|
1452 | if verbose is None:
|
---|
1453 | verbose = self._verbose
|
---|
1454 | notests = []
|
---|
1455 | passed = []
|
---|
1456 | failed = []
|
---|
1457 | totalt = totalf = 0
|
---|
1458 | for x in self._name2ft.items():
|
---|
1459 | name, (f, t) = x
|
---|
1460 | assert f <= t
|
---|
1461 | totalt += t
|
---|
1462 | totalf += f
|
---|
1463 | if t == 0:
|
---|
1464 | notests.append(name)
|
---|
1465 | elif f == 0:
|
---|
1466 | passed.append( (name, t) )
|
---|
1467 | else:
|
---|
1468 | failed.append(x)
|
---|
1469 | if verbose:
|
---|
1470 | if notests:
|
---|
1471 | print len(notests), "items had no tests:"
|
---|
1472 | notests.sort()
|
---|
1473 | for thing in notests:
|
---|
1474 | print " ", thing
|
---|
1475 | if passed:
|
---|
1476 | print len(passed), "items passed all tests:"
|
---|
1477 | passed.sort()
|
---|
1478 | for thing, count in passed:
|
---|
1479 | print " %3d tests in %s" % (count, thing)
|
---|
1480 | if failed:
|
---|
1481 | print self.DIVIDER
|
---|
1482 | print len(failed), "items had failures:"
|
---|
1483 | failed.sort()
|
---|
1484 | for thing, (f, t) in failed:
|
---|
1485 | print " %3d of %3d in %s" % (f, t, thing)
|
---|
1486 | if verbose:
|
---|
1487 | print totalt, "tests in", len(self._name2ft), "items."
|
---|
1488 | print totalt - totalf, "passed and", totalf, "failed."
|
---|
1489 | if totalf:
|
---|
1490 | print "***Test Failed***", totalf, "failures."
|
---|
1491 | elif verbose:
|
---|
1492 | print "Test passed."
|
---|
1493 | return TestResults(totalf, totalt)
|
---|
1494 |
|
---|
1495 | #/////////////////////////////////////////////////////////////////
|
---|
1496 | # Backward compatibility cruft to maintain doctest.master.
|
---|
1497 | #/////////////////////////////////////////////////////////////////
|
---|
1498 | def merge(self, other):
|
---|
1499 | d = self._name2ft
|
---|
1500 | for name, (f, t) in other._name2ft.items():
|
---|
1501 | if name in d:
|
---|
1502 | # Don't print here by default, since doing
|
---|
1503 | # so breaks some of the buildbots
|
---|
1504 | #print "*** DocTestRunner.merge: '" + name + "' in both" \
|
---|
1505 | # " testers; summing outcomes."
|
---|
1506 | f2, t2 = d[name]
|
---|
1507 | f = f + f2
|
---|
1508 | t = t + t2
|
---|
1509 | d[name] = f, t
|
---|
1510 |
|
---|
1511 | class OutputChecker:
|
---|
1512 | """
|
---|
1513 | A class used to check the whether the actual output from a doctest
|
---|
1514 | example matches the expected output. `OutputChecker` defines two
|
---|
1515 | methods: `check_output`, which compares a given pair of outputs,
|
---|
1516 | and returns true if they match; and `output_difference`, which
|
---|
1517 | returns a string describing the differences between two outputs.
|
---|
1518 | """
|
---|
1519 | def check_output(self, want, got, optionflags):
|
---|
1520 | """
|
---|
1521 | Return True iff the actual output from an example (`got`)
|
---|
1522 | matches the expected output (`want`). These strings are
|
---|
1523 | always considered to match if they are identical; but
|
---|
1524 | depending on what option flags the test runner is using,
|
---|
1525 | several non-exact match types are also possible. See the
|
---|
1526 | documentation for `TestRunner` for more information about
|
---|
1527 | option flags.
|
---|
1528 | """
|
---|
1529 | # Handle the common case first, for efficiency:
|
---|
1530 | # if they're string-identical, always return true.
|
---|
1531 | if got == want:
|
---|
1532 | return True
|
---|
1533 |
|
---|
1534 | # The values True and False replaced 1 and 0 as the return
|
---|
1535 | # value for boolean comparisons in Python 2.3.
|
---|
1536 | if not (optionflags & DONT_ACCEPT_TRUE_FOR_1):
|
---|
1537 | if (got,want) == ("True\n", "1\n"):
|
---|
1538 | return True
|
---|
1539 | if (got,want) == ("False\n", "0\n"):
|
---|
1540 | return True
|
---|
1541 |
|
---|
1542 | # <BLANKLINE> can be used as a special sequence to signify a
|
---|
1543 | # blank line, unless the DONT_ACCEPT_BLANKLINE flag is used.
|
---|
1544 | if not (optionflags & DONT_ACCEPT_BLANKLINE):
|
---|
1545 | # Replace <BLANKLINE> in want with a blank line.
|
---|
1546 | want = re.sub('(?m)^%s\s*?$' % re.escape(BLANKLINE_MARKER),
|
---|
1547 | '', want)
|
---|
1548 | # If a line in got contains only spaces, then remove the
|
---|
1549 | # spaces.
|
---|
1550 | got = re.sub('(?m)^\s*?$', '', got)
|
---|
1551 | if got == want:
|
---|
1552 | return True
|
---|
1553 |
|
---|
1554 | # This flag causes doctest to ignore any differences in the
|
---|
1555 | # contents of whitespace strings. Note that this can be used
|
---|
1556 | # in conjunction with the ELLIPSIS flag.
|
---|
1557 | if optionflags & NORMALIZE_WHITESPACE:
|
---|
1558 | got = ' '.join(got.split())
|
---|
1559 | want = ' '.join(want.split())
|
---|
1560 | if got == want:
|
---|
1561 | return True
|
---|
1562 |
|
---|
1563 | # The ELLIPSIS flag says to let the sequence "..." in `want`
|
---|
1564 | # match any substring in `got`.
|
---|
1565 | if optionflags & ELLIPSIS:
|
---|
1566 | if _ellipsis_match(want, got):
|
---|
1567 | return True
|
---|
1568 |
|
---|
1569 | # We didn't find any match; return false.
|
---|
1570 | return False
|
---|
1571 |
|
---|
1572 | # Should we do a fancy diff?
|
---|
1573 | def _do_a_fancy_diff(self, want, got, optionflags):
|
---|
1574 | # Not unless they asked for a fancy diff.
|
---|
1575 | if not optionflags & (REPORT_UDIFF |
|
---|
1576 | REPORT_CDIFF |
|
---|
1577 | REPORT_NDIFF):
|
---|
1578 | return False
|
---|
1579 |
|
---|
1580 | # If expected output uses ellipsis, a meaningful fancy diff is
|
---|
1581 | # too hard ... or maybe not. In two real-life failures Tim saw,
|
---|
1582 | # a diff was a major help anyway, so this is commented out.
|
---|
1583 | # [todo] _ellipsis_match() knows which pieces do and don't match,
|
---|
1584 | # and could be the basis for a kick-ass diff in this case.
|
---|
1585 | ##if optionflags & ELLIPSIS and ELLIPSIS_MARKER in want:
|
---|
1586 | ## return False
|
---|
1587 |
|
---|
1588 | # ndiff does intraline difference marking, so can be useful even
|
---|
1589 | # for 1-line differences.
|
---|
1590 | if optionflags & REPORT_NDIFF:
|
---|
1591 | return True
|
---|
1592 |
|
---|
1593 | # The other diff types need at least a few lines to be helpful.
|
---|
1594 | return want.count('\n') > 2 and got.count('\n') > 2
|
---|
1595 |
|
---|
1596 | def output_difference(self, example, got, optionflags):
|
---|
1597 | """
|
---|
1598 | Return a string describing the differences between the
|
---|
1599 | expected output for a given example (`example`) and the actual
|
---|
1600 | output (`got`). `optionflags` is the set of option flags used
|
---|
1601 | to compare `want` and `got`.
|
---|
1602 | """
|
---|
1603 | want = example.want
|
---|
1604 | # If <BLANKLINE>s are being used, then replace blank lines
|
---|
1605 | # with <BLANKLINE> in the actual output string.
|
---|
1606 | if not (optionflags & DONT_ACCEPT_BLANKLINE):
|
---|
1607 | got = re.sub('(?m)^[ ]*(?=\n)', BLANKLINE_MARKER, got)
|
---|
1608 |
|
---|
1609 | # Check if we should use diff.
|
---|
1610 | if self._do_a_fancy_diff(want, got, optionflags):
|
---|
1611 | # Split want & got into lines.
|
---|
1612 | want_lines = want.splitlines(True) # True == keep line ends
|
---|
1613 | got_lines = got.splitlines(True)
|
---|
1614 | # Use difflib to find their differences.
|
---|
1615 | if optionflags & REPORT_UDIFF:
|
---|
1616 | diff = difflib.unified_diff(want_lines, got_lines, n=2)
|
---|
1617 | diff = list(diff)[2:] # strip the diff header
|
---|
1618 | kind = 'unified diff with -expected +actual'
|
---|
1619 | elif optionflags & REPORT_CDIFF:
|
---|
1620 | diff = difflib.context_diff(want_lines, got_lines, n=2)
|
---|
1621 | diff = list(diff)[2:] # strip the diff header
|
---|
1622 | kind = 'context diff with expected followed by actual'
|
---|
1623 | elif optionflags & REPORT_NDIFF:
|
---|
1624 | engine = difflib.Differ(charjunk=difflib.IS_CHARACTER_JUNK)
|
---|
1625 | diff = list(engine.compare(want_lines, got_lines))
|
---|
1626 | kind = 'ndiff with -expected +actual'
|
---|
1627 | else:
|
---|
1628 | assert 0, 'Bad diff option'
|
---|
1629 | # Remove trailing whitespace on diff output.
|
---|
1630 | diff = [line.rstrip() + '\n' for line in diff]
|
---|
1631 | return 'Differences (%s):\n' % kind + _indent(''.join(diff))
|
---|
1632 |
|
---|
1633 | # If we're not using diff, then simply list the expected
|
---|
1634 | # output followed by the actual output.
|
---|
1635 | if want and got:
|
---|
1636 | return 'Expected:\n%sGot:\n%s' % (_indent(want), _indent(got))
|
---|
1637 | elif want:
|
---|
1638 | return 'Expected:\n%sGot nothing\n' % _indent(want)
|
---|
1639 | elif got:
|
---|
1640 | return 'Expected nothing\nGot:\n%s' % _indent(got)
|
---|
1641 | else:
|
---|
1642 | return 'Expected nothing\nGot nothing\n'
|
---|
1643 |
|
---|
1644 | class DocTestFailure(Exception):
|
---|
1645 | """A DocTest example has failed in debugging mode.
|
---|
1646 |
|
---|
1647 | The exception instance has variables:
|
---|
1648 |
|
---|
1649 | - test: the DocTest object being run
|
---|
1650 |
|
---|
1651 | - example: the Example object that failed
|
---|
1652 |
|
---|
1653 | - got: the actual output
|
---|
1654 | """
|
---|
1655 | def __init__(self, test, example, got):
|
---|
1656 | self.test = test
|
---|
1657 | self.example = example
|
---|
1658 | self.got = got
|
---|
1659 |
|
---|
1660 | def __str__(self):
|
---|
1661 | return str(self.test)
|
---|
1662 |
|
---|
1663 | class UnexpectedException(Exception):
|
---|
1664 | """A DocTest example has encountered an unexpected exception
|
---|
1665 |
|
---|
1666 | The exception instance has variables:
|
---|
1667 |
|
---|
1668 | - test: the DocTest object being run
|
---|
1669 |
|
---|
1670 | - example: the Example object that failed
|
---|
1671 |
|
---|
1672 | - exc_info: the exception info
|
---|
1673 | """
|
---|
1674 | def __init__(self, test, example, exc_info):
|
---|
1675 | self.test = test
|
---|
1676 | self.example = example
|
---|
1677 | self.exc_info = exc_info
|
---|
1678 |
|
---|
1679 | def __str__(self):
|
---|
1680 | return str(self.test)
|
---|
1681 |
|
---|
1682 | class DebugRunner(DocTestRunner):
|
---|
1683 | r"""Run doc tests but raise an exception as soon as there is a failure.
|
---|
1684 |
|
---|
1685 | If an unexpected exception occurs, an UnexpectedException is raised.
|
---|
1686 | It contains the test, the example, and the original exception:
|
---|
1687 |
|
---|
1688 | >>> runner = DebugRunner(verbose=False)
|
---|
1689 | >>> test = DocTestParser().get_doctest('>>> raise KeyError\n42',
|
---|
1690 | ... {}, 'foo', 'foo.py', 0)
|
---|
1691 | >>> try:
|
---|
1692 | ... runner.run(test)
|
---|
1693 | ... except UnexpectedException, failure:
|
---|
1694 | ... pass
|
---|
1695 |
|
---|
1696 | >>> failure.test is test
|
---|
1697 | True
|
---|
1698 |
|
---|
1699 | >>> failure.example.want
|
---|
1700 | '42\n'
|
---|
1701 |
|
---|
1702 | >>> exc_info = failure.exc_info
|
---|
1703 | >>> raise exc_info[0], exc_info[1], exc_info[2]
|
---|
1704 | Traceback (most recent call last):
|
---|
1705 | ...
|
---|
1706 | KeyError
|
---|
1707 |
|
---|
1708 | We wrap the original exception to give the calling application
|
---|
1709 | access to the test and example information.
|
---|
1710 |
|
---|
1711 | If the output doesn't match, then a DocTestFailure is raised:
|
---|
1712 |
|
---|
1713 | >>> test = DocTestParser().get_doctest('''
|
---|
1714 | ... >>> x = 1
|
---|
1715 | ... >>> x
|
---|
1716 | ... 2
|
---|
1717 | ... ''', {}, 'foo', 'foo.py', 0)
|
---|
1718 |
|
---|
1719 | >>> try:
|
---|
1720 | ... runner.run(test)
|
---|
1721 | ... except DocTestFailure, failure:
|
---|
1722 | ... pass
|
---|
1723 |
|
---|
1724 | DocTestFailure objects provide access to the test:
|
---|
1725 |
|
---|
1726 | >>> failure.test is test
|
---|
1727 | True
|
---|
1728 |
|
---|
1729 | As well as to the example:
|
---|
1730 |
|
---|
1731 | >>> failure.example.want
|
---|
1732 | '2\n'
|
---|
1733 |
|
---|
1734 | and the actual output:
|
---|
1735 |
|
---|
1736 | >>> failure.got
|
---|
1737 | '1\n'
|
---|
1738 |
|
---|
1739 | If a failure or error occurs, the globals are left intact:
|
---|
1740 |
|
---|
1741 | >>> del test.globs['__builtins__']
|
---|
1742 | >>> test.globs
|
---|
1743 | {'x': 1}
|
---|
1744 |
|
---|
1745 | >>> test = DocTestParser().get_doctest('''
|
---|
1746 | ... >>> x = 2
|
---|
1747 | ... >>> raise KeyError
|
---|
1748 | ... ''', {}, 'foo', 'foo.py', 0)
|
---|
1749 |
|
---|
1750 | >>> runner.run(test)
|
---|
1751 | Traceback (most recent call last):
|
---|
1752 | ...
|
---|
1753 | UnexpectedException: <DocTest foo from foo.py:0 (2 examples)>
|
---|
1754 |
|
---|
1755 | >>> del test.globs['__builtins__']
|
---|
1756 | >>> test.globs
|
---|
1757 | {'x': 2}
|
---|
1758 |
|
---|
1759 | But the globals are cleared if there is no error:
|
---|
1760 |
|
---|
1761 | >>> test = DocTestParser().get_doctest('''
|
---|
1762 | ... >>> x = 2
|
---|
1763 | ... ''', {}, 'foo', 'foo.py', 0)
|
---|
1764 |
|
---|
1765 | >>> runner.run(test)
|
---|
1766 | TestResults(failed=0, attempted=1)
|
---|
1767 |
|
---|
1768 | >>> test.globs
|
---|
1769 | {}
|
---|
1770 |
|
---|
1771 | """
|
---|
1772 |
|
---|
1773 | def run(self, test, compileflags=None, out=None, clear_globs=True):
|
---|
1774 | r = DocTestRunner.run(self, test, compileflags, out, False)
|
---|
1775 | if clear_globs:
|
---|
1776 | test.globs.clear()
|
---|
1777 | return r
|
---|
1778 |
|
---|
1779 | def report_unexpected_exception(self, out, test, example, exc_info):
|
---|
1780 | raise UnexpectedException(test, example, exc_info)
|
---|
1781 |
|
---|
1782 | def report_failure(self, out, test, example, got):
|
---|
1783 | raise DocTestFailure(test, example, got)
|
---|
1784 |
|
---|
1785 | ######################################################################
|
---|
1786 | ## 6. Test Functions
|
---|
1787 | ######################################################################
|
---|
1788 | # These should be backwards compatible.
|
---|
1789 |
|
---|
1790 | # For backward compatibility, a global instance of a DocTestRunner
|
---|
1791 | # class, updated by testmod.
|
---|
1792 | master = None
|
---|
1793 |
|
---|
1794 | def testmod(m=None, name=None, globs=None, verbose=None,
|
---|
1795 | report=True, optionflags=0, extraglobs=None,
|
---|
1796 | raise_on_error=False, exclude_empty=False):
|
---|
1797 | """m=None, name=None, globs=None, verbose=None, report=True,
|
---|
1798 | optionflags=0, extraglobs=None, raise_on_error=False,
|
---|
1799 | exclude_empty=False
|
---|
1800 |
|
---|
1801 | Test examples in docstrings in functions and classes reachable
|
---|
1802 | from module m (or the current module if m is not supplied), starting
|
---|
1803 | with m.__doc__.
|
---|
1804 |
|
---|
1805 | Also test examples reachable from dict m.__test__ if it exists and is
|
---|
1806 | not None. m.__test__ maps names to functions, classes and strings;
|
---|
1807 | function and class docstrings are tested even if the name is private;
|
---|
1808 | strings are tested directly, as if they were docstrings.
|
---|
1809 |
|
---|
1810 | Return (#failures, #tests).
|
---|
1811 |
|
---|
1812 | See help(doctest) for an overview.
|
---|
1813 |
|
---|
1814 | Optional keyword arg "name" gives the name of the module; by default
|
---|
1815 | use m.__name__.
|
---|
1816 |
|
---|
1817 | Optional keyword arg "globs" gives a dict to be used as the globals
|
---|
1818 | when executing examples; by default, use m.__dict__. A copy of this
|
---|
1819 | dict is actually used for each docstring, so that each docstring's
|
---|
1820 | examples start with a clean slate.
|
---|
1821 |
|
---|
1822 | Optional keyword arg "extraglobs" gives a dictionary that should be
|
---|
1823 | merged into the globals that are used to execute examples. By
|
---|
1824 | default, no extra globals are used. This is new in 2.4.
|
---|
1825 |
|
---|
1826 | Optional keyword arg "verbose" prints lots of stuff if true, prints
|
---|
1827 | only failures if false; by default, it's true iff "-v" is in sys.argv.
|
---|
1828 |
|
---|
1829 | Optional keyword arg "report" prints a summary at the end when true,
|
---|
1830 | else prints nothing at the end. In verbose mode, the summary is
|
---|
1831 | detailed, else very brief (in fact, empty if all tests passed).
|
---|
1832 |
|
---|
1833 | Optional keyword arg "optionflags" or's together module constants,
|
---|
1834 | and defaults to 0. This is new in 2.3. Possible values (see the
|
---|
1835 | docs for details):
|
---|
1836 |
|
---|
1837 | DONT_ACCEPT_TRUE_FOR_1
|
---|
1838 | DONT_ACCEPT_BLANKLINE
|
---|
1839 | NORMALIZE_WHITESPACE
|
---|
1840 | ELLIPSIS
|
---|
1841 | SKIP
|
---|
1842 | IGNORE_EXCEPTION_DETAIL
|
---|
1843 | REPORT_UDIFF
|
---|
1844 | REPORT_CDIFF
|
---|
1845 | REPORT_NDIFF
|
---|
1846 | REPORT_ONLY_FIRST_FAILURE
|
---|
1847 |
|
---|
1848 | Optional keyword arg "raise_on_error" raises an exception on the
|
---|
1849 | first unexpected exception or failure. This allows failures to be
|
---|
1850 | post-mortem debugged.
|
---|
1851 |
|
---|
1852 | Advanced tomfoolery: testmod runs methods of a local instance of
|
---|
1853 | class doctest.Tester, then merges the results into (or creates)
|
---|
1854 | global Tester instance doctest.master. Methods of doctest.master
|
---|
1855 | can be called directly too, if you want to do something unusual.
|
---|
1856 | Passing report=0 to testmod is especially useful then, to delay
|
---|
1857 | displaying a summary. Invoke doctest.master.summarize(verbose)
|
---|
1858 | when you're done fiddling.
|
---|
1859 | """
|
---|
1860 | global master
|
---|
1861 |
|
---|
1862 | # If no module was given, then use __main__.
|
---|
1863 | if m is None:
|
---|
1864 | # DWA - m will still be None if this wasn't invoked from the command
|
---|
1865 | # line, in which case the following TypeError is about as good an error
|
---|
1866 | # as we should expect
|
---|
1867 | m = sys.modules.get('__main__')
|
---|
1868 |
|
---|
1869 | # Check that we were actually given a module.
|
---|
1870 | if not inspect.ismodule(m):
|
---|
1871 | raise TypeError("testmod: module required; %r" % (m,))
|
---|
1872 |
|
---|
1873 | # If no name was given, then use the module's name.
|
---|
1874 | if name is None:
|
---|
1875 | name = m.__name__
|
---|
1876 |
|
---|
1877 | # Find, parse, and run all tests in the given module.
|
---|
1878 | finder = DocTestFinder(exclude_empty=exclude_empty)
|
---|
1879 |
|
---|
1880 | if raise_on_error:
|
---|
1881 | runner = DebugRunner(verbose=verbose, optionflags=optionflags)
|
---|
1882 | else:
|
---|
1883 | runner = DocTestRunner(verbose=verbose, optionflags=optionflags)
|
---|
1884 |
|
---|
1885 | for test in finder.find(m, name, globs=globs, extraglobs=extraglobs):
|
---|
1886 | runner.run(test)
|
---|
1887 |
|
---|
1888 | if report:
|
---|
1889 | runner.summarize()
|
---|
1890 |
|
---|
1891 | if master is None:
|
---|
1892 | master = runner
|
---|
1893 | else:
|
---|
1894 | master.merge(runner)
|
---|
1895 |
|
---|
1896 | return TestResults(runner.failures, runner.tries)
|
---|
1897 |
|
---|
1898 | def testfile(filename, module_relative=True, name=None, package=None,
|
---|
1899 | globs=None, verbose=None, report=True, optionflags=0,
|
---|
1900 | extraglobs=None, raise_on_error=False, parser=DocTestParser(),
|
---|
1901 | encoding=None):
|
---|
1902 | """
|
---|
1903 | Test examples in the given file. Return (#failures, #tests).
|
---|
1904 |
|
---|
1905 | Optional keyword arg "module_relative" specifies how filenames
|
---|
1906 | should be interpreted:
|
---|
1907 |
|
---|
1908 | - If "module_relative" is True (the default), then "filename"
|
---|
1909 | specifies a module-relative path. By default, this path is
|
---|
1910 | relative to the calling module's directory; but if the
|
---|
1911 | "package" argument is specified, then it is relative to that
|
---|
1912 | package. To ensure os-independence, "filename" should use
|
---|
1913 | "/" characters to separate path segments, and should not
|
---|
1914 | be an absolute path (i.e., it may not begin with "/").
|
---|
1915 |
|
---|
1916 | - If "module_relative" is False, then "filename" specifies an
|
---|
1917 | os-specific path. The path may be absolute or relative (to
|
---|
1918 | the current working directory).
|
---|
1919 |
|
---|
1920 | Optional keyword arg "name" gives the name of the test; by default
|
---|
1921 | use the file's basename.
|
---|
1922 |
|
---|
1923 | Optional keyword argument "package" is a Python package or the
|
---|
1924 | name of a Python package whose directory should be used as the
|
---|
1925 | base directory for a module relative filename. If no package is
|
---|
1926 | specified, then the calling module's directory is used as the base
|
---|
1927 | directory for module relative filenames. It is an error to
|
---|
1928 | specify "package" if "module_relative" is False.
|
---|
1929 |
|
---|
1930 | Optional keyword arg "globs" gives a dict to be used as the globals
|
---|
1931 | when executing examples; by default, use {}. A copy of this dict
|
---|
1932 | is actually used for each docstring, so that each docstring's
|
---|
1933 | examples start with a clean slate.
|
---|
1934 |
|
---|
1935 | Optional keyword arg "extraglobs" gives a dictionary that should be
|
---|
1936 | merged into the globals that are used to execute examples. By
|
---|
1937 | default, no extra globals are used.
|
---|
1938 |
|
---|
1939 | Optional keyword arg "verbose" prints lots of stuff if true, prints
|
---|
1940 | only failures if false; by default, it's true iff "-v" is in sys.argv.
|
---|
1941 |
|
---|
1942 | Optional keyword arg "report" prints a summary at the end when true,
|
---|
1943 | else prints nothing at the end. In verbose mode, the summary is
|
---|
1944 | detailed, else very brief (in fact, empty if all tests passed).
|
---|
1945 |
|
---|
1946 | Optional keyword arg "optionflags" or's together module constants,
|
---|
1947 | and defaults to 0. Possible values (see the docs for details):
|
---|
1948 |
|
---|
1949 | DONT_ACCEPT_TRUE_FOR_1
|
---|
1950 | DONT_ACCEPT_BLANKLINE
|
---|
1951 | NORMALIZE_WHITESPACE
|
---|
1952 | ELLIPSIS
|
---|
1953 | SKIP
|
---|
1954 | IGNORE_EXCEPTION_DETAIL
|
---|
1955 | REPORT_UDIFF
|
---|
1956 | REPORT_CDIFF
|
---|
1957 | REPORT_NDIFF
|
---|
1958 | REPORT_ONLY_FIRST_FAILURE
|
---|
1959 |
|
---|
1960 | Optional keyword arg "raise_on_error" raises an exception on the
|
---|
1961 | first unexpected exception or failure. This allows failures to be
|
---|
1962 | post-mortem debugged.
|
---|
1963 |
|
---|
1964 | Optional keyword arg "parser" specifies a DocTestParser (or
|
---|
1965 | subclass) that should be used to extract tests from the files.
|
---|
1966 |
|
---|
1967 | Optional keyword arg "encoding" specifies an encoding that should
|
---|
1968 | be used to convert the file to unicode.
|
---|
1969 |
|
---|
1970 | Advanced tomfoolery: testmod runs methods of a local instance of
|
---|
1971 | class doctest.Tester, then merges the results into (or creates)
|
---|
1972 | global Tester instance doctest.master. Methods of doctest.master
|
---|
1973 | can be called directly too, if you want to do something unusual.
|
---|
1974 | Passing report=0 to testmod is especially useful then, to delay
|
---|
1975 | displaying a summary. Invoke doctest.master.summarize(verbose)
|
---|
1976 | when you're done fiddling.
|
---|
1977 | """
|
---|
1978 | global master
|
---|
1979 |
|
---|
1980 | if package and not module_relative:
|
---|
1981 | raise ValueError("Package may only be specified for module-"
|
---|
1982 | "relative paths.")
|
---|
1983 |
|
---|
1984 | # Relativize the path
|
---|
1985 | text, filename = _load_testfile(filename, package, module_relative)
|
---|
1986 |
|
---|
1987 | # If no name was given, then use the file's name.
|
---|
1988 | if name is None:
|
---|
1989 | name = os.path.basename(filename)
|
---|
1990 |
|
---|
1991 | # Assemble the globals.
|
---|
1992 | if globs is None:
|
---|
1993 | globs = {}
|
---|
1994 | else:
|
---|
1995 | globs = globs.copy()
|
---|
1996 | if extraglobs is not None:
|
---|
1997 | globs.update(extraglobs)
|
---|
1998 | if '__name__' not in globs:
|
---|
1999 | globs['__name__'] = '__main__'
|
---|
2000 |
|
---|
2001 | if raise_on_error:
|
---|
2002 | runner = DebugRunner(verbose=verbose, optionflags=optionflags)
|
---|
2003 | else:
|
---|
2004 | runner = DocTestRunner(verbose=verbose, optionflags=optionflags)
|
---|
2005 |
|
---|
2006 | if encoding is not None:
|
---|
2007 | text = text.decode(encoding)
|
---|
2008 |
|
---|
2009 | # Read the file, convert it to a test, and run it.
|
---|
2010 | test = parser.get_doctest(text, globs, name, filename, 0)
|
---|
2011 | runner.run(test)
|
---|
2012 |
|
---|
2013 | if report:
|
---|
2014 | runner.summarize()
|
---|
2015 |
|
---|
2016 | if master is None:
|
---|
2017 | master = runner
|
---|
2018 | else:
|
---|
2019 | master.merge(runner)
|
---|
2020 |
|
---|
2021 | return TestResults(runner.failures, runner.tries)
|
---|
2022 |
|
---|
2023 | def run_docstring_examples(f, globs, verbose=False, name="NoName",
|
---|
2024 | compileflags=None, optionflags=0):
|
---|
2025 | """
|
---|
2026 | Test examples in the given object's docstring (`f`), using `globs`
|
---|
2027 | as globals. Optional argument `name` is used in failure messages.
|
---|
2028 | If the optional argument `verbose` is true, then generate output
|
---|
2029 | even if there are no failures.
|
---|
2030 |
|
---|
2031 | `compileflags` gives the set of flags that should be used by the
|
---|
2032 | Python compiler when running the examples. If not specified, then
|
---|
2033 | it will default to the set of future-import flags that apply to
|
---|
2034 | `globs`.
|
---|
2035 |
|
---|
2036 | Optional keyword arg `optionflags` specifies options for the
|
---|
2037 | testing and output. See the documentation for `testmod` for more
|
---|
2038 | information.
|
---|
2039 | """
|
---|
2040 | # Find, parse, and run all tests in the given module.
|
---|
2041 | finder = DocTestFinder(verbose=verbose, recurse=False)
|
---|
2042 | runner = DocTestRunner(verbose=verbose, optionflags=optionflags)
|
---|
2043 | for test in finder.find(f, name, globs=globs):
|
---|
2044 | runner.run(test, compileflags=compileflags)
|
---|
2045 |
|
---|
2046 | ######################################################################
|
---|
2047 | ## 7. Tester
|
---|
2048 | ######################################################################
|
---|
2049 | # This is provided only for backwards compatibility. It's not
|
---|
2050 | # actually used in any way.
|
---|
2051 |
|
---|
2052 | class Tester:
|
---|
2053 | def __init__(self, mod=None, globs=None, verbose=None, optionflags=0):
|
---|
2054 |
|
---|
2055 | warnings.warn("class Tester is deprecated; "
|
---|
2056 | "use class doctest.DocTestRunner instead",
|
---|
2057 | DeprecationWarning, stacklevel=2)
|
---|
2058 | if mod is None and globs is None:
|
---|
2059 | raise TypeError("Tester.__init__: must specify mod or globs")
|
---|
2060 | if mod is not None and not inspect.ismodule(mod):
|
---|
2061 | raise TypeError("Tester.__init__: mod must be a module; %r" %
|
---|
2062 | (mod,))
|
---|
2063 | if globs is None:
|
---|
2064 | globs = mod.__dict__
|
---|
2065 | self.globs = globs
|
---|
2066 |
|
---|
2067 | self.verbose = verbose
|
---|
2068 | self.optionflags = optionflags
|
---|
2069 | self.testfinder = DocTestFinder()
|
---|
2070 | self.testrunner = DocTestRunner(verbose=verbose,
|
---|
2071 | optionflags=optionflags)
|
---|
2072 |
|
---|
2073 | def runstring(self, s, name):
|
---|
2074 | test = DocTestParser().get_doctest(s, self.globs, name, None, None)
|
---|
2075 | if self.verbose:
|
---|
2076 | print "Running string", name
|
---|
2077 | (f,t) = self.testrunner.run(test)
|
---|
2078 | if self.verbose:
|
---|
2079 | print f, "of", t, "examples failed in string", name
|
---|
2080 | return TestResults(f,t)
|
---|
2081 |
|
---|
2082 | def rundoc(self, object, name=None, module=None):
|
---|
2083 | f = t = 0
|
---|
2084 | tests = self.testfinder.find(object, name, module=module,
|
---|
2085 | globs=self.globs)
|
---|
2086 | for test in tests:
|
---|
2087 | (f2, t2) = self.testrunner.run(test)
|
---|
2088 | (f,t) = (f+f2, t+t2)
|
---|
2089 | return TestResults(f,t)
|
---|
2090 |
|
---|
2091 | def rundict(self, d, name, module=None):
|
---|
2092 | import types
|
---|
2093 | m = types.ModuleType(name)
|
---|
2094 | m.__dict__.update(d)
|
---|
2095 | if module is None:
|
---|
2096 | module = False
|
---|
2097 | return self.rundoc(m, name, module)
|
---|
2098 |
|
---|
2099 | def run__test__(self, d, name):
|
---|
2100 | import types
|
---|
2101 | m = types.ModuleType(name)
|
---|
2102 | m.__test__ = d
|
---|
2103 | return self.rundoc(m, name)
|
---|
2104 |
|
---|
2105 | def summarize(self, verbose=None):
|
---|
2106 | return self.testrunner.summarize(verbose)
|
---|
2107 |
|
---|
2108 | def merge(self, other):
|
---|
2109 | self.testrunner.merge(other.testrunner)
|
---|
2110 |
|
---|
2111 | ######################################################################
|
---|
2112 | ## 8. Unittest Support
|
---|
2113 | ######################################################################
|
---|
2114 |
|
---|
2115 | _unittest_reportflags = 0
|
---|
2116 |
|
---|
2117 | def set_unittest_reportflags(flags):
|
---|
2118 | """Sets the unittest option flags.
|
---|
2119 |
|
---|
2120 | The old flag is returned so that a runner could restore the old
|
---|
2121 | value if it wished to:
|
---|
2122 |
|
---|
2123 | >>> import doctest
|
---|
2124 | >>> old = doctest._unittest_reportflags
|
---|
2125 | >>> doctest.set_unittest_reportflags(REPORT_NDIFF |
|
---|
2126 | ... REPORT_ONLY_FIRST_FAILURE) == old
|
---|
2127 | True
|
---|
2128 |
|
---|
2129 | >>> doctest._unittest_reportflags == (REPORT_NDIFF |
|
---|
2130 | ... REPORT_ONLY_FIRST_FAILURE)
|
---|
2131 | True
|
---|
2132 |
|
---|
2133 | Only reporting flags can be set:
|
---|
2134 |
|
---|
2135 | >>> doctest.set_unittest_reportflags(ELLIPSIS)
|
---|
2136 | Traceback (most recent call last):
|
---|
2137 | ...
|
---|
2138 | ValueError: ('Only reporting flags allowed', 8)
|
---|
2139 |
|
---|
2140 | >>> doctest.set_unittest_reportflags(old) == (REPORT_NDIFF |
|
---|
2141 | ... REPORT_ONLY_FIRST_FAILURE)
|
---|
2142 | True
|
---|
2143 | """
|
---|
2144 | global _unittest_reportflags
|
---|
2145 |
|
---|
2146 | if (flags & REPORTING_FLAGS) != flags:
|
---|
2147 | raise ValueError("Only reporting flags allowed", flags)
|
---|
2148 | old = _unittest_reportflags
|
---|
2149 | _unittest_reportflags = flags
|
---|
2150 | return old
|
---|
2151 |
|
---|
2152 |
|
---|
2153 | class DocTestCase(unittest.TestCase):
|
---|
2154 |
|
---|
2155 | def __init__(self, test, optionflags=0, setUp=None, tearDown=None,
|
---|
2156 | checker=None):
|
---|
2157 |
|
---|
2158 | unittest.TestCase.__init__(self)
|
---|
2159 | self._dt_optionflags = optionflags
|
---|
2160 | self._dt_checker = checker
|
---|
2161 | self._dt_test = test
|
---|
2162 | self._dt_setUp = setUp
|
---|
2163 | self._dt_tearDown = tearDown
|
---|
2164 |
|
---|
2165 | def setUp(self):
|
---|
2166 | test = self._dt_test
|
---|
2167 |
|
---|
2168 | if self._dt_setUp is not None:
|
---|
2169 | self._dt_setUp(test)
|
---|
2170 |
|
---|
2171 | def tearDown(self):
|
---|
2172 | test = self._dt_test
|
---|
2173 |
|
---|
2174 | if self._dt_tearDown is not None:
|
---|
2175 | self._dt_tearDown(test)
|
---|
2176 |
|
---|
2177 | test.globs.clear()
|
---|
2178 |
|
---|
2179 | def runTest(self):
|
---|
2180 | test = self._dt_test
|
---|
2181 | old = sys.stdout
|
---|
2182 | new = StringIO()
|
---|
2183 | optionflags = self._dt_optionflags
|
---|
2184 |
|
---|
2185 | if not (optionflags & REPORTING_FLAGS):
|
---|
2186 | # The option flags don't include any reporting flags,
|
---|
2187 | # so add the default reporting flags
|
---|
2188 | optionflags |= _unittest_reportflags
|
---|
2189 |
|
---|
2190 | runner = DocTestRunner(optionflags=optionflags,
|
---|
2191 | checker=self._dt_checker, verbose=False)
|
---|
2192 |
|
---|
2193 | try:
|
---|
2194 | runner.DIVIDER = "-"*70
|
---|
2195 | failures, tries = runner.run(
|
---|
2196 | test, out=new.write, clear_globs=False)
|
---|
2197 | finally:
|
---|
2198 | sys.stdout = old
|
---|
2199 |
|
---|
2200 | if failures:
|
---|
2201 | raise self.failureException(self.format_failure(new.getvalue()))
|
---|
2202 |
|
---|
2203 | def format_failure(self, err):
|
---|
2204 | test = self._dt_test
|
---|
2205 | if test.lineno is None:
|
---|
2206 | lineno = 'unknown line number'
|
---|
2207 | else:
|
---|
2208 | lineno = '%s' % test.lineno
|
---|
2209 | lname = '.'.join(test.name.split('.')[-1:])
|
---|
2210 | return ('Failed doctest test for %s\n'
|
---|
2211 | ' File "%s", line %s, in %s\n\n%s'
|
---|
2212 | % (test.name, test.filename, lineno, lname, err)
|
---|
2213 | )
|
---|
2214 |
|
---|
2215 | def debug(self):
|
---|
2216 | r"""Run the test case without results and without catching exceptions
|
---|
2217 |
|
---|
2218 | The unit test framework includes a debug method on test cases
|
---|
2219 | and test suites to support post-mortem debugging. The test code
|
---|
2220 | is run in such a way that errors are not caught. This way a
|
---|
2221 | caller can catch the errors and initiate post-mortem debugging.
|
---|
2222 |
|
---|
2223 | The DocTestCase provides a debug method that raises
|
---|
2224 | UnexpectedException errors if there is an unexpected
|
---|
2225 | exception:
|
---|
2226 |
|
---|
2227 | >>> test = DocTestParser().get_doctest('>>> raise KeyError\n42',
|
---|
2228 | ... {}, 'foo', 'foo.py', 0)
|
---|
2229 | >>> case = DocTestCase(test)
|
---|
2230 | >>> try:
|
---|
2231 | ... case.debug()
|
---|
2232 | ... except UnexpectedException, failure:
|
---|
2233 | ... pass
|
---|
2234 |
|
---|
2235 | The UnexpectedException contains the test, the example, and
|
---|
2236 | the original exception:
|
---|
2237 |
|
---|
2238 | >>> failure.test is test
|
---|
2239 | True
|
---|
2240 |
|
---|
2241 | >>> failure.example.want
|
---|
2242 | '42\n'
|
---|
2243 |
|
---|
2244 | >>> exc_info = failure.exc_info
|
---|
2245 | >>> raise exc_info[0], exc_info[1], exc_info[2]
|
---|
2246 | Traceback (most recent call last):
|
---|
2247 | ...
|
---|
2248 | KeyError
|
---|
2249 |
|
---|
2250 | If the output doesn't match, then a DocTestFailure is raised:
|
---|
2251 |
|
---|
2252 | >>> test = DocTestParser().get_doctest('''
|
---|
2253 | ... >>> x = 1
|
---|
2254 | ... >>> x
|
---|
2255 | ... 2
|
---|
2256 | ... ''', {}, 'foo', 'foo.py', 0)
|
---|
2257 | >>> case = DocTestCase(test)
|
---|
2258 |
|
---|
2259 | >>> try:
|
---|
2260 | ... case.debug()
|
---|
2261 | ... except DocTestFailure, failure:
|
---|
2262 | ... pass
|
---|
2263 |
|
---|
2264 | DocTestFailure objects provide access to the test:
|
---|
2265 |
|
---|
2266 | >>> failure.test is test
|
---|
2267 | True
|
---|
2268 |
|
---|
2269 | As well as to the example:
|
---|
2270 |
|
---|
2271 | >>> failure.example.want
|
---|
2272 | '2\n'
|
---|
2273 |
|
---|
2274 | and the actual output:
|
---|
2275 |
|
---|
2276 | >>> failure.got
|
---|
2277 | '1\n'
|
---|
2278 |
|
---|
2279 | """
|
---|
2280 |
|
---|
2281 | self.setUp()
|
---|
2282 | runner = DebugRunner(optionflags=self._dt_optionflags,
|
---|
2283 | checker=self._dt_checker, verbose=False)
|
---|
2284 | runner.run(self._dt_test, clear_globs=False)
|
---|
2285 | self.tearDown()
|
---|
2286 |
|
---|
2287 | def id(self):
|
---|
2288 | return self._dt_test.name
|
---|
2289 |
|
---|
2290 | def __eq__(self, other):
|
---|
2291 | if type(self) is not type(other):
|
---|
2292 | return NotImplemented
|
---|
2293 |
|
---|
2294 | return self._dt_test == other._dt_test and \
|
---|
2295 | self._dt_optionflags == other._dt_optionflags and \
|
---|
2296 | self._dt_setUp == other._dt_setUp and \
|
---|
2297 | self._dt_tearDown == other._dt_tearDown and \
|
---|
2298 | self._dt_checker == other._dt_checker
|
---|
2299 |
|
---|
2300 | def __ne__(self, other):
|
---|
2301 | return not self == other
|
---|
2302 |
|
---|
2303 | def __hash__(self):
|
---|
2304 | return hash((self._dt_optionflags, self._dt_setUp, self._dt_tearDown,
|
---|
2305 | self._dt_checker))
|
---|
2306 |
|
---|
2307 | def __repr__(self):
|
---|
2308 | name = self._dt_test.name.split('.')
|
---|
2309 | return "%s (%s)" % (name[-1], '.'.join(name[:-1]))
|
---|
2310 |
|
---|
2311 | __str__ = __repr__
|
---|
2312 |
|
---|
2313 | def shortDescription(self):
|
---|
2314 | return "Doctest: " + self._dt_test.name
|
---|
2315 |
|
---|
2316 | class SkipDocTestCase(DocTestCase):
|
---|
2317 | def __init__(self, module):
|
---|
2318 | self.module = module
|
---|
2319 | DocTestCase.__init__(self, None)
|
---|
2320 |
|
---|
2321 | def setUp(self):
|
---|
2322 | self.skipTest("DocTestSuite will not work with -O2 and above")
|
---|
2323 |
|
---|
2324 | def test_skip(self):
|
---|
2325 | pass
|
---|
2326 |
|
---|
2327 | def shortDescription(self):
|
---|
2328 | return "Skipping tests from %s" % self.module.__name__
|
---|
2329 |
|
---|
2330 | __str__ = shortDescription
|
---|
2331 |
|
---|
2332 |
|
---|
2333 | def DocTestSuite(module=None, globs=None, extraglobs=None, test_finder=None,
|
---|
2334 | **options):
|
---|
2335 | """
|
---|
2336 | Convert doctest tests for a module to a unittest test suite.
|
---|
2337 |
|
---|
2338 | This converts each documentation string in a module that
|
---|
2339 | contains doctest tests to a unittest test case. If any of the
|
---|
2340 | tests in a doc string fail, then the test case fails. An exception
|
---|
2341 | is raised showing the name of the file containing the test and a
|
---|
2342 | (sometimes approximate) line number.
|
---|
2343 |
|
---|
2344 | The `module` argument provides the module to be tested. The argument
|
---|
2345 | can be either a module or a module name.
|
---|
2346 |
|
---|
2347 | If no argument is given, the calling module is used.
|
---|
2348 |
|
---|
2349 | A number of options may be provided as keyword arguments:
|
---|
2350 |
|
---|
2351 | setUp
|
---|
2352 | A set-up function. This is called before running the
|
---|
2353 | tests in each file. The setUp function will be passed a DocTest
|
---|
2354 | object. The setUp function can access the test globals as the
|
---|
2355 | globs attribute of the test passed.
|
---|
2356 |
|
---|
2357 | tearDown
|
---|
2358 | A tear-down function. This is called after running the
|
---|
2359 | tests in each file. The tearDown function will be passed a DocTest
|
---|
2360 | object. The tearDown function can access the test globals as the
|
---|
2361 | globs attribute of the test passed.
|
---|
2362 |
|
---|
2363 | globs
|
---|
2364 | A dictionary containing initial global variables for the tests.
|
---|
2365 |
|
---|
2366 | optionflags
|
---|
2367 | A set of doctest option flags expressed as an integer.
|
---|
2368 | """
|
---|
2369 |
|
---|
2370 | if test_finder is None:
|
---|
2371 | test_finder = DocTestFinder()
|
---|
2372 |
|
---|
2373 | module = _normalize_module(module)
|
---|
2374 | tests = test_finder.find(module, globs=globs, extraglobs=extraglobs)
|
---|
2375 |
|
---|
2376 | if not tests and sys.flags.optimize >=2:
|
---|
2377 | # Skip doctests when running with -O2
|
---|
2378 | suite = unittest.TestSuite()
|
---|
2379 | suite.addTest(SkipDocTestCase(module))
|
---|
2380 | return suite
|
---|
2381 | elif not tests:
|
---|
2382 | # Why do we want to do this? Because it reveals a bug that might
|
---|
2383 | # otherwise be hidden.
|
---|
2384 | # It is probably a bug that this exception is not also raised if the
|
---|
2385 | # number of doctest examples in tests is zero (i.e. if no doctest
|
---|
2386 | # examples were found). However, we should probably not be raising
|
---|
2387 | # an exception at all here, though it is too late to make this change
|
---|
2388 | # for a maintenance release. See also issue #14649.
|
---|
2389 | raise ValueError(module, "has no docstrings")
|
---|
2390 |
|
---|
2391 | tests.sort()
|
---|
2392 | suite = unittest.TestSuite()
|
---|
2393 |
|
---|
2394 | for test in tests:
|
---|
2395 | if len(test.examples) == 0:
|
---|
2396 | continue
|
---|
2397 | if not test.filename:
|
---|
2398 | filename = module.__file__
|
---|
2399 | if filename[-4:] in (".pyc", ".pyo"):
|
---|
2400 | filename = filename[:-1]
|
---|
2401 | test.filename = filename
|
---|
2402 | suite.addTest(DocTestCase(test, **options))
|
---|
2403 |
|
---|
2404 | return suite
|
---|
2405 |
|
---|
2406 | class DocFileCase(DocTestCase):
|
---|
2407 |
|
---|
2408 | def id(self):
|
---|
2409 | return '_'.join(self._dt_test.name.split('.'))
|
---|
2410 |
|
---|
2411 | def __repr__(self):
|
---|
2412 | return self._dt_test.filename
|
---|
2413 | __str__ = __repr__
|
---|
2414 |
|
---|
2415 | def format_failure(self, err):
|
---|
2416 | return ('Failed doctest test for %s\n File "%s", line 0\n\n%s'
|
---|
2417 | % (self._dt_test.name, self._dt_test.filename, err)
|
---|
2418 | )
|
---|
2419 |
|
---|
2420 | def DocFileTest(path, module_relative=True, package=None,
|
---|
2421 | globs=None, parser=DocTestParser(),
|
---|
2422 | encoding=None, **options):
|
---|
2423 | if globs is None:
|
---|
2424 | globs = {}
|
---|
2425 | else:
|
---|
2426 | globs = globs.copy()
|
---|
2427 |
|
---|
2428 | if package and not module_relative:
|
---|
2429 | raise ValueError("Package may only be specified for module-"
|
---|
2430 | "relative paths.")
|
---|
2431 |
|
---|
2432 | # Relativize the path.
|
---|
2433 | doc, path = _load_testfile(path, package, module_relative)
|
---|
2434 |
|
---|
2435 | if "__file__" not in globs:
|
---|
2436 | globs["__file__"] = path
|
---|
2437 |
|
---|
2438 | # Find the file and read it.
|
---|
2439 | name = os.path.basename(path)
|
---|
2440 |
|
---|
2441 | # If an encoding is specified, use it to convert the file to unicode
|
---|
2442 | if encoding is not None:
|
---|
2443 | doc = doc.decode(encoding)
|
---|
2444 |
|
---|
2445 | # Convert it to a test, and wrap it in a DocFileCase.
|
---|
2446 | test = parser.get_doctest(doc, globs, name, path, 0)
|
---|
2447 | return DocFileCase(test, **options)
|
---|
2448 |
|
---|
2449 | def DocFileSuite(*paths, **kw):
|
---|
2450 | """A unittest suite for one or more doctest files.
|
---|
2451 |
|
---|
2452 | The path to each doctest file is given as a string; the
|
---|
2453 | interpretation of that string depends on the keyword argument
|
---|
2454 | "module_relative".
|
---|
2455 |
|
---|
2456 | A number of options may be provided as keyword arguments:
|
---|
2457 |
|
---|
2458 | module_relative
|
---|
2459 | If "module_relative" is True, then the given file paths are
|
---|
2460 | interpreted as os-independent module-relative paths. By
|
---|
2461 | default, these paths are relative to the calling module's
|
---|
2462 | directory; but if the "package" argument is specified, then
|
---|
2463 | they are relative to that package. To ensure os-independence,
|
---|
2464 | "filename" should use "/" characters to separate path
|
---|
2465 | segments, and may not be an absolute path (i.e., it may not
|
---|
2466 | begin with "/").
|
---|
2467 |
|
---|
2468 | If "module_relative" is False, then the given file paths are
|
---|
2469 | interpreted as os-specific paths. These paths may be absolute
|
---|
2470 | or relative (to the current working directory).
|
---|
2471 |
|
---|
2472 | package
|
---|
2473 | A Python package or the name of a Python package whose directory
|
---|
2474 | should be used as the base directory for module relative paths.
|
---|
2475 | If "package" is not specified, then the calling module's
|
---|
2476 | directory is used as the base directory for module relative
|
---|
2477 | filenames. It is an error to specify "package" if
|
---|
2478 | "module_relative" is False.
|
---|
2479 |
|
---|
2480 | setUp
|
---|
2481 | A set-up function. This is called before running the
|
---|
2482 | tests in each file. The setUp function will be passed a DocTest
|
---|
2483 | object. The setUp function can access the test globals as the
|
---|
2484 | globs attribute of the test passed.
|
---|
2485 |
|
---|
2486 | tearDown
|
---|
2487 | A tear-down function. This is called after running the
|
---|
2488 | tests in each file. The tearDown function will be passed a DocTest
|
---|
2489 | object. The tearDown function can access the test globals as the
|
---|
2490 | globs attribute of the test passed.
|
---|
2491 |
|
---|
2492 | globs
|
---|
2493 | A dictionary containing initial global variables for the tests.
|
---|
2494 |
|
---|
2495 | optionflags
|
---|
2496 | A set of doctest option flags expressed as an integer.
|
---|
2497 |
|
---|
2498 | parser
|
---|
2499 | A DocTestParser (or subclass) that should be used to extract
|
---|
2500 | tests from the files.
|
---|
2501 |
|
---|
2502 | encoding
|
---|
2503 | An encoding that will be used to convert the files to unicode.
|
---|
2504 | """
|
---|
2505 | suite = unittest.TestSuite()
|
---|
2506 |
|
---|
2507 | # We do this here so that _normalize_module is called at the right
|
---|
2508 | # level. If it were called in DocFileTest, then this function
|
---|
2509 | # would be the caller and we might guess the package incorrectly.
|
---|
2510 | if kw.get('module_relative', True):
|
---|
2511 | kw['package'] = _normalize_module(kw.get('package'))
|
---|
2512 |
|
---|
2513 | for path in paths:
|
---|
2514 | suite.addTest(DocFileTest(path, **kw))
|
---|
2515 |
|
---|
2516 | return suite
|
---|
2517 |
|
---|
2518 | ######################################################################
|
---|
2519 | ## 9. Debugging Support
|
---|
2520 | ######################################################################
|
---|
2521 |
|
---|
2522 | def script_from_examples(s):
|
---|
2523 | r"""Extract script from text with examples.
|
---|
2524 |
|
---|
2525 | Converts text with examples to a Python script. Example input is
|
---|
2526 | converted to regular code. Example output and all other words
|
---|
2527 | are converted to comments:
|
---|
2528 |
|
---|
2529 | >>> text = '''
|
---|
2530 | ... Here are examples of simple math.
|
---|
2531 | ...
|
---|
2532 | ... Python has super accurate integer addition
|
---|
2533 | ...
|
---|
2534 | ... >>> 2 + 2
|
---|
2535 | ... 5
|
---|
2536 | ...
|
---|
2537 | ... And very friendly error messages:
|
---|
2538 | ...
|
---|
2539 | ... >>> 1/0
|
---|
2540 | ... To Infinity
|
---|
2541 | ... And
|
---|
2542 | ... Beyond
|
---|
2543 | ...
|
---|
2544 | ... You can use logic if you want:
|
---|
2545 | ...
|
---|
2546 | ... >>> if 0:
|
---|
2547 | ... ... blah
|
---|
2548 | ... ... blah
|
---|
2549 | ... ...
|
---|
2550 | ...
|
---|
2551 | ... Ho hum
|
---|
2552 | ... '''
|
---|
2553 |
|
---|
2554 | >>> print script_from_examples(text)
|
---|
2555 | # Here are examples of simple math.
|
---|
2556 | #
|
---|
2557 | # Python has super accurate integer addition
|
---|
2558 | #
|
---|
2559 | 2 + 2
|
---|
2560 | # Expected:
|
---|
2561 | ## 5
|
---|
2562 | #
|
---|
2563 | # And very friendly error messages:
|
---|
2564 | #
|
---|
2565 | 1/0
|
---|
2566 | # Expected:
|
---|
2567 | ## To Infinity
|
---|
2568 | ## And
|
---|
2569 | ## Beyond
|
---|
2570 | #
|
---|
2571 | # You can use logic if you want:
|
---|
2572 | #
|
---|
2573 | if 0:
|
---|
2574 | blah
|
---|
2575 | blah
|
---|
2576 | #
|
---|
2577 | # Ho hum
|
---|
2578 | <BLANKLINE>
|
---|
2579 | """
|
---|
2580 | output = []
|
---|
2581 | for piece in DocTestParser().parse(s):
|
---|
2582 | if isinstance(piece, Example):
|
---|
2583 | # Add the example's source code (strip trailing NL)
|
---|
2584 | output.append(piece.source[:-1])
|
---|
2585 | # Add the expected output:
|
---|
2586 | want = piece.want
|
---|
2587 | if want:
|
---|
2588 | output.append('# Expected:')
|
---|
2589 | output += ['## '+l for l in want.split('\n')[:-1]]
|
---|
2590 | else:
|
---|
2591 | # Add non-example text.
|
---|
2592 | output += [_comment_line(l)
|
---|
2593 | for l in piece.split('\n')[:-1]]
|
---|
2594 |
|
---|
2595 | # Trim junk on both ends.
|
---|
2596 | while output and output[-1] == '#':
|
---|
2597 | output.pop()
|
---|
2598 | while output and output[0] == '#':
|
---|
2599 | output.pop(0)
|
---|
2600 | # Combine the output, and return it.
|
---|
2601 | # Add a courtesy newline to prevent exec from choking (see bug #1172785)
|
---|
2602 | return '\n'.join(output) + '\n'
|
---|
2603 |
|
---|
2604 | def testsource(module, name):
|
---|
2605 | """Extract the test sources from a doctest docstring as a script.
|
---|
2606 |
|
---|
2607 | Provide the module (or dotted name of the module) containing the
|
---|
2608 | test to be debugged and the name (within the module) of the object
|
---|
2609 | with the doc string with tests to be debugged.
|
---|
2610 | """
|
---|
2611 | module = _normalize_module(module)
|
---|
2612 | tests = DocTestFinder().find(module)
|
---|
2613 | test = [t for t in tests if t.name == name]
|
---|
2614 | if not test:
|
---|
2615 | raise ValueError(name, "not found in tests")
|
---|
2616 | test = test[0]
|
---|
2617 | testsrc = script_from_examples(test.docstring)
|
---|
2618 | return testsrc
|
---|
2619 |
|
---|
2620 | def debug_src(src, pm=False, globs=None):
|
---|
2621 | """Debug a single doctest docstring, in argument `src`'"""
|
---|
2622 | testsrc = script_from_examples(src)
|
---|
2623 | debug_script(testsrc, pm, globs)
|
---|
2624 |
|
---|
2625 | def debug_script(src, pm=False, globs=None):
|
---|
2626 | "Debug a test script. `src` is the script, as a string."
|
---|
2627 | import pdb
|
---|
2628 |
|
---|
2629 | # Note that tempfile.NameTemporaryFile() cannot be used. As the
|
---|
2630 | # docs say, a file so created cannot be opened by name a second time
|
---|
2631 | # on modern Windows boxes, and execfile() needs to open it.
|
---|
2632 | srcfilename = tempfile.mktemp(".py", "doctestdebug")
|
---|
2633 | f = open(srcfilename, 'w')
|
---|
2634 | f.write(src)
|
---|
2635 | f.close()
|
---|
2636 |
|
---|
2637 | try:
|
---|
2638 | if globs:
|
---|
2639 | globs = globs.copy()
|
---|
2640 | else:
|
---|
2641 | globs = {}
|
---|
2642 |
|
---|
2643 | if pm:
|
---|
2644 | try:
|
---|
2645 | execfile(srcfilename, globs, globs)
|
---|
2646 | except:
|
---|
2647 | print sys.exc_info()[1]
|
---|
2648 | pdb.post_mortem(sys.exc_info()[2])
|
---|
2649 | else:
|
---|
2650 | # Note that %r is vital here. '%s' instead can, e.g., cause
|
---|
2651 | # backslashes to get treated as metacharacters on Windows.
|
---|
2652 | pdb.run("execfile(%r)" % srcfilename, globs, globs)
|
---|
2653 |
|
---|
2654 | finally:
|
---|
2655 | os.remove(srcfilename)
|
---|
2656 |
|
---|
2657 | def debug(module, name, pm=False):
|
---|
2658 | """Debug a single doctest docstring.
|
---|
2659 |
|
---|
2660 | Provide the module (or dotted name of the module) containing the
|
---|
2661 | test to be debugged and the name (within the module) of the object
|
---|
2662 | with the docstring with tests to be debugged.
|
---|
2663 | """
|
---|
2664 | module = _normalize_module(module)
|
---|
2665 | testsrc = testsource(module, name)
|
---|
2666 | debug_script(testsrc, pm, module.__dict__)
|
---|
2667 |
|
---|
2668 | ######################################################################
|
---|
2669 | ## 10. Example Usage
|
---|
2670 | ######################################################################
|
---|
2671 | class _TestClass:
|
---|
2672 | """
|
---|
2673 | A pointless class, for sanity-checking of docstring testing.
|
---|
2674 |
|
---|
2675 | Methods:
|
---|
2676 | square()
|
---|
2677 | get()
|
---|
2678 |
|
---|
2679 | >>> _TestClass(13).get() + _TestClass(-12).get()
|
---|
2680 | 1
|
---|
2681 | >>> hex(_TestClass(13).square().get())
|
---|
2682 | '0xa9'
|
---|
2683 | """
|
---|
2684 |
|
---|
2685 | def __init__(self, val):
|
---|
2686 | """val -> _TestClass object with associated value val.
|
---|
2687 |
|
---|
2688 | >>> t = _TestClass(123)
|
---|
2689 | >>> print t.get()
|
---|
2690 | 123
|
---|
2691 | """
|
---|
2692 |
|
---|
2693 | self.val = val
|
---|
2694 |
|
---|
2695 | def square(self):
|
---|
2696 | """square() -> square TestClass's associated value
|
---|
2697 |
|
---|
2698 | >>> _TestClass(13).square().get()
|
---|
2699 | 169
|
---|
2700 | """
|
---|
2701 |
|
---|
2702 | self.val = self.val ** 2
|
---|
2703 | return self
|
---|
2704 |
|
---|
2705 | def get(self):
|
---|
2706 | """get() -> return TestClass's associated value.
|
---|
2707 |
|
---|
2708 | >>> x = _TestClass(-42)
|
---|
2709 | >>> print x.get()
|
---|
2710 | -42
|
---|
2711 | """
|
---|
2712 |
|
---|
2713 | return self.val
|
---|
2714 |
|
---|
2715 | __test__ = {"_TestClass": _TestClass,
|
---|
2716 | "string": r"""
|
---|
2717 | Example of a string object, searched as-is.
|
---|
2718 | >>> x = 1; y = 2
|
---|
2719 | >>> x + y, x * y
|
---|
2720 | (3, 2)
|
---|
2721 | """,
|
---|
2722 |
|
---|
2723 | "bool-int equivalence": r"""
|
---|
2724 | In 2.2, boolean expressions displayed
|
---|
2725 | 0 or 1. By default, we still accept
|
---|
2726 | them. This can be disabled by passing
|
---|
2727 | DONT_ACCEPT_TRUE_FOR_1 to the new
|
---|
2728 | optionflags argument.
|
---|
2729 | >>> 4 == 4
|
---|
2730 | 1
|
---|
2731 | >>> 4 == 4
|
---|
2732 | True
|
---|
2733 | >>> 4 > 4
|
---|
2734 | 0
|
---|
2735 | >>> 4 > 4
|
---|
2736 | False
|
---|
2737 | """,
|
---|
2738 |
|
---|
2739 | "blank lines": r"""
|
---|
2740 | Blank lines can be marked with <BLANKLINE>:
|
---|
2741 | >>> print 'foo\n\nbar\n'
|
---|
2742 | foo
|
---|
2743 | <BLANKLINE>
|
---|
2744 | bar
|
---|
2745 | <BLANKLINE>
|
---|
2746 | """,
|
---|
2747 |
|
---|
2748 | "ellipsis": r"""
|
---|
2749 | If the ellipsis flag is used, then '...' can be used to
|
---|
2750 | elide substrings in the desired output:
|
---|
2751 | >>> print range(1000) #doctest: +ELLIPSIS
|
---|
2752 | [0, 1, 2, ..., 999]
|
---|
2753 | """,
|
---|
2754 |
|
---|
2755 | "whitespace normalization": r"""
|
---|
2756 | If the whitespace normalization flag is used, then
|
---|
2757 | differences in whitespace are ignored.
|
---|
2758 | >>> print range(30) #doctest: +NORMALIZE_WHITESPACE
|
---|
2759 | [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
|
---|
2760 | 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
|
---|
2761 | 27, 28, 29]
|
---|
2762 | """,
|
---|
2763 | }
|
---|
2764 |
|
---|
2765 |
|
---|
2766 | def _test():
|
---|
2767 | testfiles = [arg for arg in sys.argv[1:] if arg and arg[0] != '-']
|
---|
2768 | if not testfiles:
|
---|
2769 | name = os.path.basename(sys.argv[0])
|
---|
2770 | if '__loader__' in globals(): # python -m
|
---|
2771 | name, _ = os.path.splitext(name)
|
---|
2772 | print("usage: {0} [-v] file ...".format(name))
|
---|
2773 | return 2
|
---|
2774 | for filename in testfiles:
|
---|
2775 | if filename.endswith(".py"):
|
---|
2776 | # It is a module -- insert its dir into sys.path and try to
|
---|
2777 | # import it. If it is part of a package, that possibly
|
---|
2778 | # won't work because of package imports.
|
---|
2779 | dirname, filename = os.path.split(filename)
|
---|
2780 | sys.path.insert(0, dirname)
|
---|
2781 | m = __import__(filename[:-3])
|
---|
2782 | del sys.path[0]
|
---|
2783 | failures, _ = testmod(m)
|
---|
2784 | else:
|
---|
2785 | failures, _ = testfile(filename, module_relative=False)
|
---|
2786 | if failures:
|
---|
2787 | return 1
|
---|
2788 | return 0
|
---|
2789 |
|
---|
2790 |
|
---|
2791 | if __name__ == "__main__":
|
---|
2792 | sys.exit(_test())
|
---|