diff --git a/CHANGES b/CHANGES index e6888146c..32ce16917 100644 --- a/CHANGES +++ b/CHANGES @@ -19,6 +19,7 @@ Features added Bugs fixed ---------- +* #7886: autodoc: TypeError is raised on mocking generic-typed classes * #7839: autosummary: cannot handle umlauts in function names * #7865: autosummary: Failed to extract summary line when abbreviations found * #7866: autosummary: Failed to extract correct summary line when docstring diff --git a/sphinx/ext/autodoc/mock.py b/sphinx/ext/autodoc/mock.py index 98a3a3a96..40258a135 100644 --- a/sphinx/ext/autodoc/mock.py +++ b/sphinx/ext/autodoc/mock.py @@ -52,8 +52,8 @@ class _MockObject: def __mro_entries__(self, bases: Tuple) -> Tuple: return (self.__class__,) - def __getitem__(self, key: str) -> "_MockObject": - return _make_subclass(key, self.__display_name__, self.__class__)() + def __getitem__(self, key: Any) -> "_MockObject": + return _make_subclass(str(key), self.__display_name__, self.__class__)() def __getattr__(self, key: str) -> "_MockObject": return _make_subclass(key, self.__display_name__, self.__class__)() diff --git a/tests/test_ext_autodoc_mock.py b/tests/test_ext_autodoc_mock.py index 4760493cf..a29170f75 100644 --- a/tests/test_ext_autodoc_mock.py +++ b/tests/test_ext_autodoc_mock.py @@ -11,6 +11,7 @@ import abc import sys from importlib import import_module +from typing import TypeVar import pytest @@ -39,6 +40,7 @@ def test_MockObject(): assert isinstance(mock.attr1.attr2, _MockObject) assert isinstance(mock.attr1.attr2.meth(), _MockObject) + # subclassing class SubClass(mock.SomeClass): """docstring of SubClass""" @@ -51,6 +53,16 @@ def test_MockObject(): assert obj.method() == "string" assert isinstance(obj.other_method(), SubClass) + # parametrized type + T = TypeVar('T') + + class SubClass2(mock.SomeClass[T]): + """docstring of SubClass""" + + obj2 = SubClass2() + assert SubClass2.__doc__ == "docstring of SubClass" + assert isinstance(obj2, SubClass2) + def test_mock(): modname = 'sphinx.unknown'