summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorshimizukawa <shimizukawa@gmail.com>2016-11-24 23:55:02 +0900
committershimizukawa <shimizukawa@gmail.com>2016-11-24 23:55:02 +0900
commit3284e89991a277eaa78e14a7a2adbdfa08a8716e (patch)
treedd3bf651a47be5f7cc78c2c91031d1c0440fe446
parent76f2ed9215ecd8022f8d63ff1c5f455b0bb23354 (diff)
parentdef08a206fd885557381309604b7bbd776cdc03c (diff)
downloadsphinx-git-3284e89991a277eaa78e14a7a2adbdfa08a8716e.tar.gz
Merge branch 'fix-attr-documenter' into stable
-rw-r--r--sphinx/ext/autodoc.py14
-rw-r--r--tests/test_autodoc.py14
2 files changed, 23 insertions, 5 deletions
diff --git a/sphinx/ext/autodoc.py b/sphinx/ext/autodoc.py
index 405d24c88..b9c73f87e 100644
--- a/sphinx/ext/autodoc.py
+++ b/sphinx/ext/autodoc.py
@@ -42,6 +42,11 @@ try:
except ImportError:
typing = None
+# This type isn't exposed directly in any modules, but can be found
+# here in most Python versions
+MethodDescriptorType = type(type.__subclasses__)
+
+
#: extended signature RE: with explicit module name separated by ::
py_ext_sig_re = re.compile(
r'''^ ([\w.]+::)? # explicit module name
@@ -1466,10 +1471,13 @@ class AttributeDocumenter(DocstringStripSignatureMixin, ClassLevelDocumenter):
@classmethod
def can_document_member(cls, member, membername, isattr, parent):
+ non_attr_types = cls.method_types + (type, MethodDescriptorType)
isdatadesc = isdescriptor(member) and not \
- isinstance(member, cls.method_types) and not \
- type(member).__name__ in ("type", "method_descriptor",
- "instancemethod")
+ isinstance(member, non_attr_types) and not \
+ type(member).__name__ == "instancemethod"
+ # That last condition addresses an obscure case of C-defined
+ # methods using a deprecated type in Python 3, that is not otherwise
+ # exported anywhere by Python
return isdatadesc or (not isinstance(parent, ModuleDocumenter) and
not inspect.isroutine(member) and
not isinstance(member, class_types))
diff --git a/tests/test_autodoc.py b/tests/test_autodoc.py
index 711e5e807..ff82aacb8 100644
--- a/tests/test_autodoc.py
+++ b/tests/test_autodoc.py
@@ -14,7 +14,7 @@
from util import TestApp, Struct, raises, SkipTest # NOQA
from nose.tools import with_setup, eq_
-from six import StringIO
+from six import StringIO, add_metaclass
from docutils.statemachine import ViewList
from sphinx.ext.autodoc import AutoDirective, add_documenter, \
@@ -826,11 +826,13 @@ def test_generate():
del directive.env.ref_context['py:module']
# test descriptor class documentation
- options.members = ['CustomDataDescriptor']
+ options.members = ['CustomDataDescriptor', 'CustomDataDescriptor2']
assert_result_contains('.. py:class:: CustomDataDescriptor(doc)',
'module', 'test_autodoc')
assert_result_contains(' .. py:method:: CustomDataDescriptor.meth()',
'module', 'test_autodoc')
+ assert_result_contains('.. py:class:: CustomDataDescriptor2(doc)',
+ 'module', 'test_autodoc')
# --- generate fodder ------------
__all__ = ['Class']
@@ -862,6 +864,14 @@ class CustomDataDescriptor(object):
return "The Answer"
+class CustomDataDescriptorMeta(type):
+ """Descriptor metaclass docstring."""
+
+@add_metaclass(CustomDataDescriptorMeta)
+class CustomDataDescriptor2(CustomDataDescriptor):
+ """Descriptor class with custom metaclass docstring."""
+
+
def _funky_classmethod(name, b, c, d, docstring=None):
"""Generates a classmethod for a class from a template by filling out
some arguments."""