Skip to content

Commit

Permalink
Add PyAttribute class; a directive for python attribute description
Browse files Browse the repository at this point in the history
  • Loading branch information
tk0miya committed Apr 7, 2019
1 parent c833470 commit fcc964b
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 1 deletion.
21 changes: 20 additions & 1 deletion sphinx/domains/python.py
Original file line number Diff line number Diff line change
Expand Up @@ -592,6 +592,25 @@ def get_index_text(self, modname, name_cls):
return _('%s() (%s static method)') % (methname, clsname)


class PyAttribute(PyObject):
"""Description of an attribute."""

def get_index_text(self, modname, name_cls):
# type: (str, Tuple[str, str]) -> str
name, cls = name_cls
try:
clsname, attrname = name.rsplit('.', 1)
if modname and self.env.config.add_module_names:
clsname = '.'.join([modname, clsname])
except ValueError:
if modname:
return _('%s (in module %s)') % (name, modname)
else:
return name

return _('%s (%s attribute)') % (attrname, clsname)


class PyDecoratorMixin:
"""
Mixin for decorator directives.
Expand Down Expand Up @@ -817,7 +836,7 @@ class PythonDomain(Domain):
'method': PyMethod,
'classmethod': PyClassMethod,
'staticmethod': PyStaticMethod,
'attribute': PyClassmember,
'attribute': PyAttribute,
'module': PyModule,
'currentmodule': PyCurrentModule,
'decorator': PyDecoratorFunction,
Expand Down
19 changes: 19 additions & 0 deletions tests/test_domain_py.py
Original file line number Diff line number Diff line change
Expand Up @@ -353,3 +353,22 @@ def test_pystaticmethod(app):
[desc_content, ()]))
assert 'Class.meth' in domain.objects
assert domain.objects['Class.meth'] == ('index', 'staticmethod')


def test_pyattribute(app):
text = (".. py:class:: Class\n"
"\n"
" .. py:attribute:: attr\n")
domain = app.env.get_domain('py')
doctree = restructuredtext.parse(app, text)
assert_node(doctree, (addnodes.index,
[desc, ([desc_signature, ([desc_annotation, "class "],
[desc_name, "Class"])],
[desc_content, (addnodes.index,
desc)])]))
assert_node(doctree[1][1][0], addnodes.index,
entries=[('single', 'attr (Class attribute)', 'Class.attr', '', None)])
assert_node(doctree[1][1][1], ([desc_signature, desc_name, "attr"],
[desc_content, ()]))
assert 'Class.attr' in domain.objects
assert domain.objects['Class.attr'] == ('index', 'attribute')

0 comments on commit fcc964b

Please sign in to comment.