diff --git a/Lib/doctest.py b/Lib/doctest.py index b2279524e14..bb9f43229d4 100644 --- a/Lib/doctest.py +++ b/Lib/doctest.py @@ -985,7 +985,8 @@ class DocTestFinder: for valname, val in obj.__dict__.items(): valname = '%s.%s' % (name, valname) # Recurse to functions & classes. - if ((inspect.isroutine(val) or inspect.isclass(val)) and + if ((inspect.isroutine(inspect.unwrap(val)) + or inspect.isclass(val)) and self._from_module(module, val)): self._find(tests, val, valname, module, source_lines, globs, seen) diff --git a/Lib/test/test_doctest.py b/Lib/test/test_doctest.py index 4b8d0d2b9c4..95700a3d3f1 100644 --- a/Lib/test/test_doctest.py +++ b/Lib/test/test_doctest.py @@ -4,6 +4,7 @@ Test script for doctest. from test import support import doctest +import functools import os import sys @@ -434,7 +435,7 @@ We'll simulate a __file__ attr that ends in pyc: >>> tests = finder.find(sample_func) >>> print(tests) # doctest: +ELLIPSIS - [] + [] The exact name depends on how test_doctest was invoked, so allow for leading path components. @@ -2364,6 +2365,22 @@ def test_trailing_space_in_test(): foo \n """ +class Wrapper: + def __init__(self, func): + self.func = func + functools.update_wrapper(self, func) + + def __call__(self, *args, **kwargs): + self.func(*args, **kwargs) + +@Wrapper +def test_look_in_unwrapped(): + """ + Docstrings in wrapped functions must be detected as well. + + >>> 'one other test' + 'one other test' + """ def test_unittest_reportflags(): """Default unittest reporting flags can be set to control reporting diff --git a/Misc/NEWS b/Misc/NEWS index d7c9a4919d1..9ca0f1f1b1a 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -194,6 +194,8 @@ Core and Builtins Library ------- +- Issue #21740: Support wrapped callables in pydoc. Patch by Claudiu Popa. + - Issue #23009: Make sure selectors.EpollSelecrtor.select() works when no FD is registered.