mirror of
https://github.com/sphinx-doc/sphinx.git
synced 2025-02-25 18:55:22 -06:00
Merge pull request #8571 from tk0miya/8567_wrong_ivars_in_parent_class
Fix #8567: autodoc: Instance attributes are incorrectly added to Parent class
This commit is contained in:
1
CHANGES
1
CHANGES
@@ -19,6 +19,7 @@ Bugs fixed
|
|||||||
* #8559: autodoc: AttributeError is raised when using forward-reference type
|
* #8559: autodoc: AttributeError is raised when using forward-reference type
|
||||||
annotations
|
annotations
|
||||||
* #8568: autodoc: TypeError is raised on checking slots attribute
|
* #8568: autodoc: TypeError is raised on checking slots attribute
|
||||||
|
* #8567: autodoc: Instance attributes are incorrectly added to Parent class
|
||||||
|
|
||||||
Testing
|
Testing
|
||||||
--------
|
--------
|
||||||
|
|||||||
@@ -1856,13 +1856,14 @@ class DataDocumenter(GenericAliasMixin, NewTypeMixin, TypeVarMixin,
|
|||||||
def update_annotations(self, parent: Any) -> None:
|
def update_annotations(self, parent: Any) -> None:
|
||||||
"""Update __annotations__ to support type_comment and so on."""
|
"""Update __annotations__ to support type_comment and so on."""
|
||||||
try:
|
try:
|
||||||
annotations = inspect.getannotations(parent)
|
annotations = dict(inspect.getannotations(parent))
|
||||||
|
parent.__annotations__ = annotations
|
||||||
|
|
||||||
analyzer = ModuleAnalyzer.for_module(self.modname)
|
analyzer = ModuleAnalyzer.for_module(self.modname)
|
||||||
analyzer.analyze()
|
analyzer.analyze()
|
||||||
for (classname, attrname), annotation in analyzer.annotations.items():
|
for (classname, attrname), annotation in analyzer.annotations.items():
|
||||||
if classname == '' and attrname not in annotations:
|
if classname == '' and attrname not in annotations:
|
||||||
annotations[attrname] = annotation # type: ignore
|
annotations[attrname] = annotation
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@@ -2292,7 +2293,8 @@ class AttributeDocumenter(GenericAliasMixin, NewTypeMixin, SlotsMixin, # type:
|
|||||||
def update_annotations(self, parent: Any) -> None:
|
def update_annotations(self, parent: Any) -> None:
|
||||||
"""Update __annotations__ to support type_comment and so on."""
|
"""Update __annotations__ to support type_comment and so on."""
|
||||||
try:
|
try:
|
||||||
annotations = inspect.getannotations(parent)
|
annotations = dict(inspect.getannotations(parent))
|
||||||
|
parent.__annotations__ = annotations
|
||||||
|
|
||||||
for cls in inspect.getmro(parent):
|
for cls in inspect.getmro(parent):
|
||||||
try:
|
try:
|
||||||
@@ -2303,11 +2305,14 @@ class AttributeDocumenter(GenericAliasMixin, NewTypeMixin, SlotsMixin, # type:
|
|||||||
analyzer.analyze()
|
analyzer.analyze()
|
||||||
for (classname, attrname), annotation in analyzer.annotations.items():
|
for (classname, attrname), annotation in analyzer.annotations.items():
|
||||||
if classname == qualname and attrname not in annotations:
|
if classname == qualname and attrname not in annotations:
|
||||||
annotations[attrname] = annotation # type: ignore
|
annotations[attrname] = annotation
|
||||||
except (AttributeError, PycodeError):
|
except (AttributeError, PycodeError):
|
||||||
pass
|
pass
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
pass
|
pass
|
||||||
|
except TypeError:
|
||||||
|
# Failed to set __annotations__ (built-in, extensions, etc.)
|
||||||
|
pass
|
||||||
|
|
||||||
def import_object(self, raiseerror: bool = False) -> bool:
|
def import_object(self, raiseerror: bool = False) -> bool:
|
||||||
try:
|
try:
|
||||||
|
|||||||
@@ -690,6 +690,7 @@ def test_autodoc_special_members(app):
|
|||||||
actual = do_autodoc(app, 'class', 'target.Class', options)
|
actual = do_autodoc(app, 'class', 'target.Class', options)
|
||||||
assert list(filter(lambda l: '::' in l, actual)) == [
|
assert list(filter(lambda l: '::' in l, actual)) == [
|
||||||
'.. py:class:: Class(arg)',
|
'.. py:class:: Class(arg)',
|
||||||
|
' .. py:attribute:: Class.__annotations__',
|
||||||
' .. py:attribute:: Class.__dict__',
|
' .. py:attribute:: Class.__dict__',
|
||||||
' .. py:method:: Class.__init__(arg)',
|
' .. py:method:: Class.__init__(arg)',
|
||||||
' .. py:attribute:: Class.__module__',
|
' .. py:attribute:: Class.__module__',
|
||||||
|
|||||||
Reference in New Issue
Block a user