mirror of
https://github.com/sphinx-doc/sphinx.git
synced 2025-02-25 18:55:22 -06:00
autodoc: Handle multiple inheritance correctly (#13136)
Co-authored-by: Adam Turner <9087854+aa-turner@users.noreply.github.com>
This commit is contained in:
parent
774f8cc738
commit
766900e416
@ -134,6 +134,8 @@ Bugs fixed
|
||||
* #12975: Avoid rendering a trailing comma in C and C++ multi-line signatures.
|
||||
* #13178: autodoc: Fix resolution for ``pathlib`` types.
|
||||
Patch by Adam Turner.
|
||||
* #13136: autodoc: Correctly handle multiple inheritance.
|
||||
Patch by Pavel Holica
|
||||
|
||||
Testing
|
||||
-------
|
||||
|
@ -742,10 +742,19 @@ class Documenter:
|
||||
|
||||
def is_filtered_inherited_member(name: str, obj: Any) -> bool:
|
||||
inherited_members = self.options.inherited_members or set()
|
||||
seen = set()
|
||||
|
||||
if inspect.isclass(self.object):
|
||||
for cls in self.object.__mro__:
|
||||
if cls.__name__ in inherited_members and cls != self.object:
|
||||
if name in cls.__dict__:
|
||||
seen.add(cls)
|
||||
if (
|
||||
cls.__name__ in inherited_members
|
||||
and cls != self.object
|
||||
and any(
|
||||
issubclass(potential_child, cls) for potential_child in seen
|
||||
)
|
||||
):
|
||||
# given member is a member of specified *super class*
|
||||
return True
|
||||
if name in cls.__dict__:
|
||||
|
@ -14,7 +14,13 @@ class Base:
|
||||
"""Inherited static method."""
|
||||
|
||||
|
||||
class Derived(Base):
|
||||
class AnotherBase:
|
||||
#: docstring
|
||||
def another_inheritedmeth(self):
|
||||
"""Another inherited function."""
|
||||
|
||||
|
||||
class Derived(Base, AnotherBase):
|
||||
def inheritedmeth(self):
|
||||
# no docstring here
|
||||
pass
|
||||
|
@ -831,6 +831,7 @@ def test_autodoc_inherited_members(app):
|
||||
}
|
||||
actual = do_autodoc(app, 'class', 'target.inheritance.Derived', options)
|
||||
assert list(filter(lambda l: 'method::' in l, actual)) == [
|
||||
' .. py:method:: Derived.another_inheritedmeth()',
|
||||
' .. py:method:: Derived.inheritedclassmeth()',
|
||||
' .. py:method:: Derived.inheritedmeth()',
|
||||
' .. py:method:: Derived.inheritedstaticmeth(cls)',
|
||||
|
@ -134,6 +134,16 @@ def test_automodule_inherited_members(app):
|
||||
'.. py:module:: target.inheritance',
|
||||
'',
|
||||
'',
|
||||
'.. py:class:: AnotherBase()',
|
||||
' :module: target.inheritance',
|
||||
'',
|
||||
'',
|
||||
' .. py:method:: AnotherBase.another_inheritedmeth()',
|
||||
' :module: target.inheritance',
|
||||
'',
|
||||
' Another inherited function.',
|
||||
'',
|
||||
'',
|
||||
'.. py:class:: Base()',
|
||||
' :module: target.inheritance',
|
||||
'',
|
||||
@ -169,6 +179,12 @@ def test_automodule_inherited_members(app):
|
||||
' :module: target.inheritance',
|
||||
'',
|
||||
'',
|
||||
' .. py:method:: Derived.another_inheritedmeth()',
|
||||
' :module: target.inheritance',
|
||||
'',
|
||||
' Another inherited function.',
|
||||
'',
|
||||
'',
|
||||
' .. py:method:: Derived.inheritedmeth()',
|
||||
' :module: target.inheritance',
|
||||
'',
|
||||
|
@ -319,6 +319,12 @@ def test_autodoc_inherit_docstrings_for_inherited_members(app):
|
||||
' :module: target.inheritance',
|
||||
'',
|
||||
'',
|
||||
' .. py:method:: Derived.another_inheritedmeth()',
|
||||
' :module: target.inheritance',
|
||||
'',
|
||||
' Another inherited function.',
|
||||
'',
|
||||
'',
|
||||
' .. py:attribute:: Derived.inheritedattr',
|
||||
' :module: target.inheritance',
|
||||
' :value: None',
|
||||
@ -356,6 +362,12 @@ def test_autodoc_inherit_docstrings_for_inherited_members(app):
|
||||
' :module: target.inheritance',
|
||||
'',
|
||||
'',
|
||||
' .. py:method:: Derived.another_inheritedmeth()',
|
||||
' :module: target.inheritance',
|
||||
'',
|
||||
' Another inherited function.',
|
||||
'',
|
||||
'',
|
||||
' .. py:method:: Derived.inheritedclassmeth()',
|
||||
' :module: target.inheritance',
|
||||
' :classmethod:',
|
||||
|
Loading…
Reference in New Issue
Block a user