Merged in JonnyJD/sphinx/autodoc_novalue (pull request #109)

feature: autodoc: add :annotation: option for autodata and autoattribute
This commit is contained in:
Georg Brandl 2013-09-16 04:25:53 +02:00
commit e732807869
3 changed files with 51 additions and 7 deletions

View File

@ -197,8 +197,23 @@ inserting them into the page source under a suitable :rst:dir:`py:module`,
automethod
autoattribute
These work exactly like :rst:dir:`autoclass` etc., but do not offer the
options used for automatic member documentation.
These work exactly like :rst:dir:`autoclass` etc.,
but do not offer the options used for automatic member documentation.
:rst:dir:`autodata` and :rst:dir:`autoattribute` support
the ``annotation`` option.
Without this option, the representation of the object
will be shown in the documentation.
When the option is given without arguments,
only the name of the object will be printed::
.. autodata:: CD_DRIVE
:annotation:
You can tell sphinx what should be printed after the name::
.. autodata:: CD_DRIVE
:annotation: = your CD device name
For module data members and class attributes, documentation can either be put
into a comment with special formatting (using a ``#:`` to start the comment
@ -234,6 +249,10 @@ inserting them into the page source under a suitable :rst:dir:`py:module`,
.. versionchanged:: 1.1
Comment docs are now allowed on the same line after an assignment.
.. versionchanged:: 1.2
:rst:dir:`autodata` and :rst:dir:`autoattribute` have
an ``annotation`` option
.. note::
If you document decorated functions or methods, keep in mind that autodoc

View File

@ -85,6 +85,15 @@ def members_set_option(arg):
return ALL
return set(x.strip() for x in arg.split(','))
SUPPRESS = object()
def annotation_option(arg):
if arg is None:
# suppress showing the representation of the object
return SUPPRESS
else:
return arg
def bool_option(arg):
"""Used to convert flag options to auto directives. (Instead of
directives.flag(), which returns None).
@ -1110,6 +1119,8 @@ class DataDocumenter(ModuleLevelDocumenter):
objtype = 'data'
member_order = 40
priority = -10
option_spec = dict(ModuleLevelDocumenter.option_spec)
option_spec["annotation"] = annotation_option
@classmethod
def can_document_member(cls, member, membername, isattr, parent):
@ -1117,12 +1128,18 @@ class DataDocumenter(ModuleLevelDocumenter):
def add_directive_header(self, sig):
ModuleLevelDocumenter.add_directive_header(self, sig)
try:
objrepr = safe_repr(self.object)
except ValueError:
if not self.options.annotation:
try:
objrepr = safe_repr(self.object)
except ValueError:
pass
else:
self.add_line(u' :annotation: = ' + objrepr, '<autodoc>')
elif self.options.annotation is SUPPRESS:
pass
else:
self.add_line(u' :annotation: = ' + objrepr, '<autodoc>')
self.add_line(u' :annotation: %s' % self.options.annotation,
'<autodoc>')
def document_members(self, all_members=False):
pass
@ -1194,6 +1211,8 @@ class AttributeDocumenter(ClassLevelDocumenter):
"""
objtype = 'attribute'
member_order = 60
option_spec = dict(ModuleLevelDocumenter.option_spec)
option_spec["annotation"] = annotation_option
# must be higher than the MethodDocumenter, else it will recognize
# some non-data descriptors as methods
@ -1229,13 +1248,18 @@ class AttributeDocumenter(ClassLevelDocumenter):
def add_directive_header(self, sig):
ClassLevelDocumenter.add_directive_header(self, sig)
if not self._datadescriptor:
if not self._datadescriptor and not self.options.annotation:
try:
objrepr = safe_repr(self.object)
except ValueError:
pass
else:
self.add_line(u' :annotation: = ' + objrepr, '<autodoc>')
elif self.options.annotation is SUPPRESS:
pass
else:
self.add_line(u' :annotation: %s' % self.options.annotation,
'<autodoc>')
def add_content(self, more_content, no_docstring=False):
if not self._datadescriptor:

View File

@ -51,6 +51,7 @@ def setup_test():
special_members = False,
show_inheritance = False,
noindex = False,
annotation = None,
synopsis = '',
platform = '',
deprecated = False,