autodoc: Handle multiple inheritance correctly (#13136)

Co-authored-by: Adam Turner <9087854+aa-turner@users.noreply.github.com>
This commit is contained in:
pholica 2025-02-03 02:46:35 +01:00 committed by GitHub
parent 774f8cc738
commit 766900e416
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 48 additions and 2 deletions

View File

@ -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
-------

View File

@ -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__:

View File

@ -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

View File

@ -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)',

View File

@ -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',
'',

View File

@ -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:',