Skip to content

Commit

Permalink
Merge pull request #8611 from tk0miya/8602_process-docstring_for_nond…
Browse files Browse the repository at this point in the history
…atadescriptors

Fix #8602: autodoc: The ``autodoc-process-docstring`` event is emitted to the non-datadescriptors unexpectedly
  • Loading branch information
tk0miya authored Dec 31, 2020
2 parents 3f560cd + e3b1fde commit 1dd0cc8
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 2 deletions.
2 changes: 2 additions & 0 deletions CHANGES
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ Bugs fixed
----------

* #8164: autodoc: Classes that inherit mocked class are not documented
* #8602: autodoc: The ``autodoc-process-docstring`` event is emitted to the
non-datadescriptors unexpectedly

Testing
--------
Expand Down
22 changes: 20 additions & 2 deletions sphinx/ext/autodoc/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2092,18 +2092,36 @@ class NonDataDescriptorMixin(DataDocumenterMixinBase):
and :value: header will be suppressed unexpectedly.
"""

def import_object(self, raiseerror: bool = False) -> bool:
ret = super().import_object(raiseerror) # type: ignore
if ret and not inspect.isattributedescriptor(self.object):
self.non_data_descriptor = True
else:
self.non_data_descriptor = False

return ret

def should_suppress_value_header(self) -> bool:
return (inspect.isattributedescriptor(self.object) or
return (not getattr(self, 'non_data_descriptor', False) or
super().should_suppress_directive_header())

def get_doc(self, encoding: str = None, ignore: int = None) -> List[List[str]]:
if not inspect.isattributedescriptor(self.object):
if getattr(self, 'non_data_descriptor', False):
# the docstring of non datadescriptor is very probably the wrong thing
# to display
return []
else:
return super().get_doc(encoding, ignore) # type: ignore

def add_content(self, more_content: Optional[StringList], no_docstring: bool = False
) -> None:
if getattr(self, 'non_data_descriptor', False):
# the docstring of non datadescriptor is very probably the wrong thing
# to display
no_docstring = True

super().add_content(more_content, no_docstring=no_docstring) # type: ignore


class SlotsMixin(DataDocumenterMixinBase):
"""
Expand Down
17 changes: 17 additions & 0 deletions tests/test_ext_autodoc_events.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,23 @@ def on_process_docstring(app, what, name, obj, options, lines):
]


@pytest.mark.sphinx('html', testroot='ext-autodoc')
def test_process_docstring_for_nondatadescriptor(app):
def on_process_docstring(app, what, name, obj, options, lines):
raise

app.connect('autodoc-process-docstring', on_process_docstring)

actual = do_autodoc(app, 'attribute', 'target.AttCls.a1')
assert list(actual) == [
'',
'.. py:attribute:: AttCls.a1',
' :module: target',
' :value: hello world',
'',
]


@pytest.mark.sphinx('html', testroot='ext-autodoc')
def test_cut_lines(app):
app.connect('autodoc-process-docstring',
Expand Down

0 comments on commit 1dd0cc8

Please sign in to comment.