mirror of
https://github.com/sphinx-doc/sphinx.git
synced 2025-02-25 18:55:22 -06:00
* Fix: autosummary does not create the description from attributes docstring. Closes #1444
This commit is contained in:
parent
c24cfbaed1
commit
8f69e25c85
2
CHANGES
2
CHANGES
@ -9,7 +9,7 @@ Bugs fixed
|
|||||||
from '.js_t' and '.html'. The issue was introduced from Sphinx-1.1
|
from '.js_t' and '.html'. The issue was introduced from Sphinx-1.1
|
||||||
* #1363: Fix i18n: missing python domain's cross-references with currentmodule
|
* #1363: Fix i18n: missing python domain's cross-references with currentmodule
|
||||||
directive or currentclass directive.
|
directive or currentclass directive.
|
||||||
|
* #1444: autosummary does not create the description from attributes docstring.
|
||||||
|
|
||||||
Release 1.2.2 (released Mar 2, 2014)
|
Release 1.2.2 (released Mar 2, 2014)
|
||||||
====================================
|
====================================
|
||||||
|
@ -65,6 +65,7 @@ from docutils import nodes
|
|||||||
|
|
||||||
from sphinx import addnodes
|
from sphinx import addnodes
|
||||||
from sphinx.util.compat import Directive
|
from sphinx.util.compat import Directive
|
||||||
|
from sphinx.pycode import ModuleAnalyzer, PycodeError
|
||||||
|
|
||||||
|
|
||||||
# -- autosummary_toc node ------------------------------------------------------
|
# -- autosummary_toc node ------------------------------------------------------
|
||||||
@ -192,6 +193,7 @@ class Autosummary(Directive):
|
|||||||
self.env = env = self.state.document.settings.env
|
self.env = env = self.state.document.settings.env
|
||||||
self.genopt = {}
|
self.genopt = {}
|
||||||
self.warnings = []
|
self.warnings = []
|
||||||
|
self.result = ViewList()
|
||||||
|
|
||||||
names = [x.strip().split()[0] for x in self.content
|
names = [x.strip().split()[0] for x in self.content
|
||||||
if x.strip() and re.search(r'^[~a-zA-Z_]', x.strip()[0])]
|
if x.strip() and re.search(r'^[~a-zA-Z_]', x.strip()[0])]
|
||||||
@ -249,6 +251,7 @@ class Autosummary(Directive):
|
|||||||
|
|
||||||
# NB. using real_name here is important, since Documenters
|
# NB. using real_name here is important, since Documenters
|
||||||
# handle module prefixes slightly differently
|
# handle module prefixes slightly differently
|
||||||
|
self.result = ViewList() # initialize for each documenter
|
||||||
documenter = get_documenter(obj, parent)(self, real_name)
|
documenter = get_documenter(obj, parent)(self, real_name)
|
||||||
if not documenter.parse_name():
|
if not documenter.parse_name():
|
||||||
self.warn('failed to parse name %s' % real_name)
|
self.warn('failed to parse name %s' % real_name)
|
||||||
@ -259,6 +262,17 @@ class Autosummary(Directive):
|
|||||||
items.append((display_name, '', '', real_name))
|
items.append((display_name, '', '', real_name))
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
# try to also get a source code analyzer for attribute docs
|
||||||
|
try:
|
||||||
|
documenter.analyzer = ModuleAnalyzer.for_module(documenter.get_real_modname())
|
||||||
|
# parse right now, to get PycodeErrors on parsing (results will
|
||||||
|
# be cached anyway)
|
||||||
|
documenter.analyzer.find_attr_docs()
|
||||||
|
except PycodeError, err:
|
||||||
|
documenter.env.app.debug('[autodoc] module analyzer failed: %s', err)
|
||||||
|
# no source file -- e.g. for builtin and C modules
|
||||||
|
documenter.analyzer = None
|
||||||
|
|
||||||
# -- Grab the signature
|
# -- Grab the signature
|
||||||
|
|
||||||
sig = documenter.format_signature()
|
sig = documenter.format_signature()
|
||||||
@ -271,7 +285,8 @@ class Autosummary(Directive):
|
|||||||
|
|
||||||
# -- Grab the summary
|
# -- Grab the summary
|
||||||
|
|
||||||
doc = list(documenter.process_doc(documenter.get_doc()))
|
documenter.add_content(None)
|
||||||
|
doc = list(documenter.process_doc([self.result.data]))
|
||||||
|
|
||||||
while doc and not doc[0].strip():
|
while doc and not doc[0].strip():
|
||||||
doc.pop(0)
|
doc.pop(0)
|
||||||
|
@ -1,3 +1,11 @@
|
|||||||
|
"""
|
||||||
|
.. autosummary::
|
||||||
|
|
||||||
|
module_attr
|
||||||
|
C.class_attr
|
||||||
|
C.prop_attr1
|
||||||
|
C.prop_attr2
|
||||||
|
"""
|
||||||
|
|
||||||
def withSentence():
|
def withSentence():
|
||||||
'''I have a sentence which
|
'''I have a sentence which
|
||||||
@ -19,3 +27,39 @@ def emptyLine():
|
|||||||
However, it did't end with a period.
|
However, it did't end with a period.
|
||||||
'''
|
'''
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
#: This is a module attribute
|
||||||
|
#:
|
||||||
|
#: value is integer.
|
||||||
|
module_attr = 1
|
||||||
|
|
||||||
|
|
||||||
|
class C:
|
||||||
|
'''
|
||||||
|
My C class
|
||||||
|
|
||||||
|
with class_attr attribute
|
||||||
|
'''
|
||||||
|
|
||||||
|
#: This is a class attribute
|
||||||
|
#:
|
||||||
|
#: value is integer.
|
||||||
|
class_attr = 42
|
||||||
|
|
||||||
|
def _prop_attr_get(self):
|
||||||
|
"""
|
||||||
|
This is a function docstring
|
||||||
|
|
||||||
|
return value is string.
|
||||||
|
"""
|
||||||
|
return 'spam egg'
|
||||||
|
|
||||||
|
prop_attr1 = property(_prop_attr_get)
|
||||||
|
|
||||||
|
prop_attr2 = property(_prop_attr_get)
|
||||||
|
"""
|
||||||
|
This is a attribute docstring
|
||||||
|
|
||||||
|
value is string.
|
||||||
|
"""
|
||||||
|
@ -96,7 +96,35 @@ def test_get_items_summary():
|
|||||||
'withSentence': 'I have a sentence which spans multiple lines.',
|
'withSentence': 'I have a sentence which spans multiple lines.',
|
||||||
'noSentence': "this doesn't start with a",
|
'noSentence': "this doesn't start with a",
|
||||||
'emptyLine': "This is the real summary",
|
'emptyLine': "This is the real summary",
|
||||||
|
'module_attr': 'This is a module attribute',
|
||||||
|
'C.class_attr': 'This is a class attribute',
|
||||||
|
'C.prop_attr1': 'This is a function docstring',
|
||||||
|
'C.prop_attr2': 'This is a attribute docstring',
|
||||||
}
|
}
|
||||||
for key, expected in expected_values.iteritems():
|
for key, expected in expected_values.iteritems():
|
||||||
assert autosummary_items[key][2] == expected, 'Summary for %s was %r -'\
|
assert autosummary_items[key][2] == expected, 'Summary for %s was %r -'\
|
||||||
' expected %r' % (key, autosummary_items[key], expected)
|
' expected %r' % (key, autosummary_items[key], expected)
|
||||||
|
|
||||||
|
|
||||||
|
@with_app(confoverrides={'extensions': ['sphinx.ext.autosummary'],
|
||||||
|
'autosummary_generate': True,
|
||||||
|
'source_suffix': '.rst'},
|
||||||
|
buildername='html', srcdir=(test_roots / 'test-autosummary'))
|
||||||
|
def test_process_doc_event(app):
|
||||||
|
app.builddir.rmtree(True)
|
||||||
|
|
||||||
|
# Now, modify the python path...
|
||||||
|
srcdir = test_roots / 'test-autosummary'
|
||||||
|
sys.path.insert(0, srcdir)
|
||||||
|
try:
|
||||||
|
def handler(app, what, name, obj, options, lines):
|
||||||
|
assert isinstance(lines, list)
|
||||||
|
app.connect('autodoc-process-docstring', handler)
|
||||||
|
app.builder.build_all()
|
||||||
|
finally:
|
||||||
|
if srcdir in sys.path:
|
||||||
|
sys.path.remove(srcdir)
|
||||||
|
# remove the auto-generated dummy_module.rst
|
||||||
|
dummy_rst = srcdir / 'dummy_module.rst'
|
||||||
|
if dummy_rst.isfile():
|
||||||
|
dummy_rst.unlink()
|
||||||
|
Loading…
Reference in New Issue
Block a user