From 26a141696c57e22a593a8fba80eb2a77121af206 Mon Sep 17 00:00:00 2001 From: Wannes Boeykens Date: Sun, 30 Mar 2025 15:28:55 +0200 Subject: [PATCH 1/7] Fix issue #481 --- src/sphinx_autodoc_typehints/__init__.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/sphinx_autodoc_typehints/__init__.py b/src/sphinx_autodoc_typehints/__init__.py index 432fdf4..77ef5e3 100644 --- a/src/sphinx_autodoc_typehints/__init__.py +++ b/src/sphinx_autodoc_typehints/__init__.py @@ -17,7 +17,7 @@ from sphinx.ext.autodoc.mock import mock from sphinx.parsers import RSTParser from sphinx.util import logging, rst -from sphinx.util.inspect import TypeAliasForwardRef, TypeAliasNamespace, stringify_signature +from sphinx.util.inspect import stringify_signature from sphinx.util.inspect import signature as sphinx_signature from ._parser import parse @@ -222,9 +222,6 @@ def format_annotation(annotation: Any, config: Config, *, short_literals: bool = if isinstance(annotation, tuple): return format_internal_tuple(annotation, config) - if isinstance(annotation, TypeAliasForwardRef): - return annotation.name - try: module = get_annotation_module(annotation) class_name = get_annotation_class_name(annotation, module) @@ -446,7 +443,7 @@ def _future_annotations_imported(obj: Any) -> bool: def get_all_type_hints( - autodoc_mock_imports: list[str], obj: Any, name: str, localns: TypeAliasNamespace + autodoc_mock_imports: list[str], obj: Any, name: str, localns: dict[str, ForwardRef] ) -> dict[str, Any]: result = _get_type_hint(autodoc_mock_imports, name, obj, localns) if not result: @@ -517,7 +514,7 @@ def _resolve_type_guarded_imports(autodoc_mock_imports: list[str], obj: Any) -> _execute_guarded_code(autodoc_mock_imports, obj, module_code) -def _get_type_hint(autodoc_mock_imports: list[str], name: str, obj: Any, localns: TypeAliasNamespace) -> dict[str, Any]: +def _get_type_hint(autodoc_mock_imports: list[str], name: str, obj: Any, localns: dict[str, ForwardRef]) -> dict[str, Any]: _resolve_type_guarded_imports(autodoc_mock_imports, obj) try: result = get_type_hints(obj, None, localns) @@ -689,7 +686,7 @@ def process_docstring( # noqa: PLR0913, PLR0917 except (ValueError, TypeError): signature = None - localns = TypeAliasNamespace(app.config["autodoc_type_aliases"]) + localns = {key: ForwardRef(value) for key, value in app.config["autodoc_type_aliases"].items()} type_hints = get_all_type_hints(app.config.autodoc_mock_imports, obj, name, localns) app.config._annotation_globals = getattr(obj, "__globals__", {}) # noqa: SLF001 try: From 54422b8eaa79ca27e491e73a997714d0bc729fbe Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Sun, 30 Mar 2025 13:29:43 +0000 Subject: [PATCH 2/7] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- src/sphinx_autodoc_typehints/__init__.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/sphinx_autodoc_typehints/__init__.py b/src/sphinx_autodoc_typehints/__init__.py index 77ef5e3..cca4ca1 100644 --- a/src/sphinx_autodoc_typehints/__init__.py +++ b/src/sphinx_autodoc_typehints/__init__.py @@ -17,8 +17,8 @@ from sphinx.ext.autodoc.mock import mock from sphinx.parsers import RSTParser from sphinx.util import logging, rst -from sphinx.util.inspect import stringify_signature from sphinx.util.inspect import signature as sphinx_signature +from sphinx.util.inspect import stringify_signature from ._parser import parse from .patches import install_patches @@ -514,7 +514,9 @@ def _resolve_type_guarded_imports(autodoc_mock_imports: list[str], obj: Any) -> _execute_guarded_code(autodoc_mock_imports, obj, module_code) -def _get_type_hint(autodoc_mock_imports: list[str], name: str, obj: Any, localns: dict[str, ForwardRef]) -> dict[str, Any]: +def _get_type_hint( + autodoc_mock_imports: list[str], name: str, obj: Any, localns: dict[str, ForwardRef] +) -> dict[str, Any]: _resolve_type_guarded_imports(autodoc_mock_imports, obj) try: result = get_type_hints(obj, None, localns) From 823a9922072d8368bde7ac961a7609c4dd4c6821 Mon Sep 17 00:00:00 2001 From: Wannes Boeykens Date: Sun, 30 Mar 2025 17:04:24 +0200 Subject: [PATCH 3/7] Fix tests --- src/sphinx_autodoc_typehints/__init__.py | 18 +++++++++++++----- tests/test_integration_autodoc_type_aliases.py | 4 ++-- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/sphinx_autodoc_typehints/__init__.py b/src/sphinx_autodoc_typehints/__init__.py index cca4ca1..08d9861 100644 --- a/src/sphinx_autodoc_typehints/__init__.py +++ b/src/sphinx_autodoc_typehints/__init__.py @@ -10,15 +10,15 @@ import textwrap import types from dataclasses import dataclass -from typing import TYPE_CHECKING, Any, AnyStr, ForwardRef, NewType, TypeVar, get_type_hints +from typing import TYPE_CHECKING, Any, AnyStr, ForwardRef, NewType, TypeVar, Union, get_type_hints from docutils import nodes from docutils.frontend import get_default_settings from sphinx.ext.autodoc.mock import mock from sphinx.parsers import RSTParser from sphinx.util import logging, rst +from sphinx.util.inspect import TypeAliasForwardRef, stringify_signature from sphinx.util.inspect import signature as sphinx_signature -from sphinx.util.inspect import stringify_signature from ._parser import parse from .patches import install_patches @@ -61,6 +61,11 @@ _TYPES_DICT[types.FunctionType] = "FunctionType" +class MyTypeAliasForwardRef(TypeAliasForwardRef): + def __or__(self, value): + return Union[self, value] + + def _get_types_type(obj: Any) -> str | None: try: return _TYPES_DICT.get(obj) @@ -222,6 +227,9 @@ def format_annotation(annotation: Any, config: Config, *, short_literals: bool = if isinstance(annotation, tuple): return format_internal_tuple(annotation, config) + if isinstance(annotation, TypeAliasForwardRef): + return annotation.name + try: module = get_annotation_module(annotation) class_name = get_annotation_class_name(annotation, module) @@ -443,7 +451,7 @@ def _future_annotations_imported(obj: Any) -> bool: def get_all_type_hints( - autodoc_mock_imports: list[str], obj: Any, name: str, localns: dict[str, ForwardRef] + autodoc_mock_imports: list[str], obj: Any, name: str, localns: dict[str, TypeAliasForwardRef] ) -> dict[str, Any]: result = _get_type_hint(autodoc_mock_imports, name, obj, localns) if not result: @@ -515,7 +523,7 @@ def _resolve_type_guarded_imports(autodoc_mock_imports: list[str], obj: Any) -> def _get_type_hint( - autodoc_mock_imports: list[str], name: str, obj: Any, localns: dict[str, ForwardRef] + autodoc_mock_imports: list[str], name: str, obj: Any, localns: dict[str, TypeAliasForwardRef] ) -> dict[str, Any]: _resolve_type_guarded_imports(autodoc_mock_imports, obj) try: @@ -688,7 +696,7 @@ def process_docstring( # noqa: PLR0913, PLR0917 except (ValueError, TypeError): signature = None - localns = {key: ForwardRef(value) for key, value in app.config["autodoc_type_aliases"].items()} + localns = {key: MyTypeAliasForwardRef(value) for key, value in app.config["autodoc_type_aliases"].items()} type_hints = get_all_type_hints(app.config.autodoc_mock_imports, obj, name, localns) app.config._annotation_globals = getattr(obj, "__globals__", {}) # noqa: SLF001 try: diff --git a/tests/test_integration_autodoc_type_aliases.py b/tests/test_integration_autodoc_type_aliases.py index 9d5a951..f964042 100644 --- a/tests/test_integration_autodoc_type_aliases.py +++ b/tests/test_integration_autodoc_type_aliases.py @@ -103,7 +103,7 @@ def g(s: AliasedClass) -> AliasedClass: Function docstring. Parameters: - * **x** (Array) -- foo + * **x** ("Optional"[Array]) -- foo * **y** ("Schema") -- boo @@ -115,7 +115,7 @@ def g(s: AliasedClass) -> AliasedClass: """, ) -def function(x: ArrayLike, y: Schema) -> str: +def function(x: ArrayLike | None, y: Schema) -> str: """ Function docstring. From 97a98ed0860bc4046bc3db6c6bbc304f719c9782 Mon Sep 17 00:00:00 2001 From: Wannes Boeykens Date: Sun, 30 Mar 2025 17:13:52 +0200 Subject: [PATCH 4/7] Fix lint errors --- src/sphinx_autodoc_typehints/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sphinx_autodoc_typehints/__init__.py b/src/sphinx_autodoc_typehints/__init__.py index 08d9861..9e1edba 100644 --- a/src/sphinx_autodoc_typehints/__init__.py +++ b/src/sphinx_autodoc_typehints/__init__.py @@ -62,8 +62,8 @@ class MyTypeAliasForwardRef(TypeAliasForwardRef): - def __or__(self, value): - return Union[self, value] + def __or__(self, value: Any) -> types.UnionType: + return Union[self, value] # noqa: UP007 def _get_types_type(obj: Any) -> str | None: From e7d883f6d458e73e9e92dff6f1df29d1ca661c29 Mon Sep 17 00:00:00 2001 From: Wannes Boeykens Date: Sun, 30 Mar 2025 22:22:27 +0200 Subject: [PATCH 5/7] Fix mypy error --- src/sphinx_autodoc_typehints/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sphinx_autodoc_typehints/__init__.py b/src/sphinx_autodoc_typehints/__init__.py index 9e1edba..ee96bc4 100644 --- a/src/sphinx_autodoc_typehints/__init__.py +++ b/src/sphinx_autodoc_typehints/__init__.py @@ -62,7 +62,7 @@ class MyTypeAliasForwardRef(TypeAliasForwardRef): - def __or__(self, value: Any) -> types.UnionType: + def __or__(self, value: Any) -> Any: return Union[self, value] # noqa: UP007 From abb1a118693b9107e061b1a4a6dcdfd95f3bb6ee Mon Sep 17 00:00:00 2001 From: Wannes Boeykens Date: Sun, 30 Mar 2025 22:53:38 +0200 Subject: [PATCH 6/7] Fix mypy error --- src/sphinx_autodoc_typehints/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sphinx_autodoc_typehints/__init__.py b/src/sphinx_autodoc_typehints/__init__.py index ee96bc4..86edc36 100644 --- a/src/sphinx_autodoc_typehints/__init__.py +++ b/src/sphinx_autodoc_typehints/__init__.py @@ -451,7 +451,7 @@ def _future_annotations_imported(obj: Any) -> bool: def get_all_type_hints( - autodoc_mock_imports: list[str], obj: Any, name: str, localns: dict[str, TypeAliasForwardRef] + autodoc_mock_imports: list[str], obj: Any, name: str, localns: dict[Any, TypeAliasForwardRef] ) -> dict[str, Any]: result = _get_type_hint(autodoc_mock_imports, name, obj, localns) if not result: @@ -523,7 +523,7 @@ def _resolve_type_guarded_imports(autodoc_mock_imports: list[str], obj: Any) -> def _get_type_hint( - autodoc_mock_imports: list[str], name: str, obj: Any, localns: dict[str, TypeAliasForwardRef] + autodoc_mock_imports: list[str], name: str, obj: Any, localns: dict[Any, TypeAliasForwardRef] ) -> dict[str, Any]: _resolve_type_guarded_imports(autodoc_mock_imports, obj) try: From 8e86073afa1d68da9d9fab4ce3b38346c5fe1388 Mon Sep 17 00:00:00 2001 From: Wannes Boeykens Date: Mon, 31 Mar 2025 16:29:19 +0200 Subject: [PATCH 7/7] Fix mypy error again --- src/sphinx_autodoc_typehints/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sphinx_autodoc_typehints/__init__.py b/src/sphinx_autodoc_typehints/__init__.py index 86edc36..4f20b97 100644 --- a/src/sphinx_autodoc_typehints/__init__.py +++ b/src/sphinx_autodoc_typehints/__init__.py @@ -451,7 +451,7 @@ def _future_annotations_imported(obj: Any) -> bool: def get_all_type_hints( - autodoc_mock_imports: list[str], obj: Any, name: str, localns: dict[Any, TypeAliasForwardRef] + autodoc_mock_imports: list[str], obj: Any, name: str, localns: dict[Any, MyTypeAliasForwardRef] ) -> dict[str, Any]: result = _get_type_hint(autodoc_mock_imports, name, obj, localns) if not result: @@ -523,7 +523,7 @@ def _resolve_type_guarded_imports(autodoc_mock_imports: list[str], obj: Any) -> def _get_type_hint( - autodoc_mock_imports: list[str], name: str, obj: Any, localns: dict[Any, TypeAliasForwardRef] + autodoc_mock_imports: list[str], name: str, obj: Any, localns: dict[Any, MyTypeAliasForwardRef] ) -> dict[str, Any]: _resolve_type_guarded_imports(autodoc_mock_imports, obj) try: