From 9962c00947a6490dbf04229343c6a7d2f0ac445a Mon Sep 17 00:00:00 2001 From: Pauli Virtanen Date: Wed, 29 Jun 2011 21:27:03 +0200 Subject: [PATCH] autosummary: fix get_documenter to handle its *parent* parameter correctly The *parent* parameter is a Python object, and should not be passed on to Documenter.can_document_member, which expects a Documenter instance. --- sphinx/ext/autosummary/__init__.py | 37 ++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/sphinx/ext/autosummary/__init__.py b/sphinx/ext/autosummary/__init__.py index 82637583c..515777b82 100644 --- a/sphinx/ext/autosummary/__init__.py +++ b/sphinx/ext/autosummary/__init__.py @@ -125,22 +125,39 @@ def autosummary_table_visit_html(self, node): # -- autodoc integration ------------------------------------------------------- -try: - ismemberdescriptor = inspect.ismemberdescriptor - isgetsetdescriptor = inspect.isgetsetdescriptor -except AttributeError: - def ismemberdescriptor(obj): - return False - isgetsetdescriptor = ismemberdescriptor +class FakeDirective: + env = {} + genopt = {} def get_documenter(obj, parent): """Get an autodoc.Documenter class suitable for documenting the given object. - """ - from sphinx.ext.autodoc import AutoDirective, DataDocumenter + *obj* is the Python object to be documented, and *parent* is an + another Python object (e.g. a module or a class) to which *obj* + belongs to. + """ + from sphinx.ext.autodoc import AutoDirective, DataDocumenter, \ + ModuleDocumenter + + if inspect.ismodule(obj): + # ModuleDocumenter.can_document_member always returns False + return ModuleDocumenter + + # Construct a fake documenter for *parent* + if parent is not None: + parent_doc_cls = get_documenter(parent, None) + else: + parent_doc_cls = ModuleDocumenter + + if hasattr(parent, '__name__'): + parent_doc = parent_doc_cls(FakeDirective(), parent.__name__) + else: + parent_doc = parent_doc_cls(FakeDirective(), "") + + # Get the corrent documenter class for *obj* classes = [cls for cls in AutoDirective._registry.values() - if cls.can_document_member(obj, '', False, parent)] + if cls.can_document_member(obj, '', False, parent_doc)] if classes: classes.sort(key=lambda cls: cls.priority) return classes[-1]