diff --git a/sphinx/ext/autodoc.py b/sphinx/ext/autodoc.py index 98783cfdbf4..148c09811fa 100644 --- a/sphinx/ext/autodoc.py +++ b/sphinx/ext/autodoc.py @@ -93,6 +93,9 @@ def __init__(self, *args, **kwargs): self.__all__ = [] def __call__(self, *args, **kwargs): + if args and type(args[0]) in [FunctionType, MethodType]: + # Appears to be a decorator, pass through unchanged + return args[0] return _MockModule() def _append_submodule(self, submod): diff --git a/tests/root/autodoc_missing_imports.py b/tests/root/autodoc_missing_imports.py index 7a71734526e..0901ce8e253 100644 --- a/tests/root/autodoc_missing_imports.py +++ b/tests/root/autodoc_missing_imports.py @@ -5,5 +5,14 @@ from missing_package2 import missing_module2 from missing_package3.missing_module3 import missing_name +@missing_name +def decoratedFunction(): + """decoratedFunction docstring""" + return None + class TestAutodoc(object): """TestAutodoc docstring.""" + @missing_name + def decoratedMethod(self): + """TestAutodoc::decoratedMethod docstring""" + return None diff --git a/tests/test_autodoc.py b/tests/test_autodoc.py index 68e15bbed64..2b5d80efbe2 100644 --- a/tests/test_autodoc.py +++ b/tests/test_autodoc.py @@ -853,6 +853,17 @@ def assert_order(items, objtype, name, member_order, **kw): assert_result_contains(' .. py:method:: CustomDataDescriptor.meth()', 'module', 'test_autodoc') + # test mocked module imports + options.members = ['TestAutodoc'] + options.undoc_members = False + assert_result_contains('.. py:class:: TestAutodoc', + 'module', 'autodoc_missing_imports') + assert_result_contains(' .. py:method:: TestAutodoc.decoratedMethod()', + 'module', 'autodoc_missing_imports') + options.members = ['decoratedFunction'] + assert_result_contains('.. py:function:: decoratedFunction()', + 'module', 'autodoc_missing_imports') + # --- generate fodder ------------ __all__ = ['Class']