From 8c29801f271eb7c258924fef02609d1b8d9d1d25 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Sun, 22 Jul 2018 01:06:17 +0900 Subject: [PATCH] Close #2820: autoclass directive supports nested class --- CHANGES | 1 + sphinx/ext/autodoc/importer.py | 17 +++++++++++++++-- tests/test_autodoc.py | 3 +++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index e57a0dad6..114c34cf5 100644 --- a/CHANGES +++ b/CHANGES @@ -162,6 +162,7 @@ Features added if :confval:`latex_engine` is ``'xelatex'`` or ``'lualatex'``. * #4976: ``SphinxLoggerAdapter.info()`` now supports ``location`` parameter * #5122: setuptools: support nitpicky option +* #2820: autoclass directive supports nested class Bugs fixed ---------- diff --git a/sphinx/ext/autodoc/importer.py b/sphinx/ext/autodoc/importer.py index 20d448506..4b92a7b59 100644 --- a/sphinx/ext/autodoc/importer.py +++ b/sphinx/ext/autodoc/importer.py @@ -167,8 +167,21 @@ def import_object(modname, objpath, objtype='', attrgetter=safe_getattr, warning logger.debug('[autodoc] import %s', modname) try: - module = import_module(modname, warningiserror=warningiserror) - logger.debug('[autodoc] => %r', module) + module = None + objpath = list(objpath) + while module is None: + try: + module = import_module(modname, warningiserror=warningiserror) + logger.debug('[autodoc] import %s => %r', modname, module) + except ImportError: + logger.debug('[autodoc] import %s => failed', modname) + if '.' in modname: + # retry with parent module + modname, name = modname.rsplit('.', 1) + objpath.insert(0, name) + else: + raise + obj = module parent = None object_name = None diff --git a/tests/test_autodoc.py b/tests/test_autodoc.py index 53d8a1e14..a42210a4c 100644 --- a/tests/test_autodoc.py +++ b/tests/test_autodoc.py @@ -771,6 +771,9 @@ def test_generate(): ('class', 'target.Outer.Inner'), ('method', 'target.Outer.Inner.meth')], 'class', 'Outer', all_members=True) + assert_processes([('class', 'target.Outer.Inner'), + ('method', 'target.Outer.Inner.meth')], + 'class', 'target.Outer.Inner', all_members=True) # test descriptor docstrings assert_result_contains(' Descriptor instance docstring.',