From 7ba762870f83175848ff1cd94a1b783ecde57f9a Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+AA-Turner@users.noreply.github.com> Date: Fri, 21 Feb 2025 22:16:29 +0000 Subject: [PATCH] Napoleon: Fix valid types for configuration values (#13382) --- CHANGES.rst | 2 + sphinx/ext/napoleon/__init__.py | 47 +++++++++++----------- tests/test_extensions/test_ext_napoleon.py | 2 +- 3 files changed, 26 insertions(+), 25 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 61d9d37c8e4..6c4dbb92e3f 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -21,6 +21,8 @@ Bugs fixed Patch by Kazuya Takei. * #13380: viewcode: Fix importing modules more than once. Patch by Dave Hoese. +* #13382: Napoleon: Use the right valid types for configuration values. + Patch by Adam Turner. Testing ------- diff --git a/sphinx/ext/napoleon/__init__.py b/sphinx/ext/napoleon/__init__.py index 74434184412..6d8f1b22e2d 100644 --- a/sphinx/ext/napoleon/__init__.py +++ b/sphinx/ext/napoleon/__init__.py @@ -11,6 +11,7 @@ from sphinx.util import inspect if TYPE_CHECKING: + from collections.abc import Sequence, Set from typing import Any from sphinx.config import _ConfigRebuild @@ -270,27 +271,27 @@ def __unicode__(self): """ - _config_values: dict[str, tuple[Any, _ConfigRebuild]] = { - 'napoleon_google_docstring': (True, 'env'), - 'napoleon_numpy_docstring': (True, 'env'), - 'napoleon_include_init_with_doc': (False, 'env'), - 'napoleon_include_private_with_doc': (False, 'env'), - 'napoleon_include_special_with_doc': (False, 'env'), - 'napoleon_use_admonition_for_examples': (False, 'env'), - 'napoleon_use_admonition_for_notes': (False, 'env'), - 'napoleon_use_admonition_for_references': (False, 'env'), - 'napoleon_use_ivar': (False, 'env'), - 'napoleon_use_param': (True, 'env'), - 'napoleon_use_rtype': (True, 'env'), - 'napoleon_use_keyword': (True, 'env'), - 'napoleon_preprocess_types': (False, 'env'), - 'napoleon_type_aliases': (None, 'env'), - 'napoleon_custom_sections': (None, 'env'), - 'napoleon_attr_annotations': (True, 'env'), - } + _config_values: Sequence[tuple[str, bool | None, _ConfigRebuild, Set[type]]] = ( + ('napoleon_google_docstring', True, 'env', frozenset({bool})), + ('napoleon_numpy_docstring', True, 'env', frozenset({bool})), + ('napoleon_include_init_with_doc', False, 'env', frozenset({bool})), + ('napoleon_include_private_with_doc', False, 'env', frozenset({bool})), + ('napoleon_include_special_with_doc', False, 'env', frozenset({bool})), + ('napoleon_use_admonition_for_examples', False, 'env', frozenset({bool})), + ('napoleon_use_admonition_for_notes', False, 'env', frozenset({bool})), + ('napoleon_use_admonition_for_references', False, 'env', frozenset({bool})), + ('napoleon_use_ivar', False, 'env', frozenset({bool})), + ('napoleon_use_param', True, 'env', frozenset({bool})), + ('napoleon_use_rtype', True, 'env', frozenset({bool})), + ('napoleon_use_keyword', True, 'env', frozenset({bool})), + ('napoleon_preprocess_types', False, 'env', frozenset({bool})), + ('napoleon_type_aliases', None, 'env', frozenset({dict, NoneType})), + ('napoleon_custom_sections', None, 'env', frozenset({list, tuple, NoneType})), + ('napoleon_attr_annotations', True, 'env', frozenset({bool})), + ) def __init__(self, **settings: Any) -> None: - for name, (default, _rebuild) in self._config_values.items(): + for name, default, _rebuild, _types in self._config_values: setattr(self, name, default) for name, value in settings.items(): setattr(self, name, value) @@ -331,11 +332,9 @@ def setup(app: Sphinx) -> ExtensionMetadata: app.connect('autodoc-process-docstring', _process_docstring) app.connect('autodoc-skip-member', _skip_member) - for name, (default, rebuild) in Config._config_values.items(): - if isinstance(default, bool): - app.add_config_value(name, default, rebuild, types=frozenset({bool})) - else: - app.add_config_value(name, default, rebuild, types=frozenset({NoneType})) + for name, default, rebuild, types in Config._config_values: + app.add_config_value(name, default, rebuild, types=types) + return { 'version': sphinx.__display_version__, 'parallel_read_safe': True, diff --git a/tests/test_extensions/test_ext_napoleon.py b/tests/test_extensions/test_ext_napoleon.py index 9475dff2aee..87a8bf5a9ef 100644 --- a/tests/test_extensions/test_ext_napoleon.py +++ b/tests/test_extensions/test_ext_napoleon.py @@ -115,7 +115,7 @@ def test_unknown_app_type(self): def test_add_config_values(self): app = mock.Mock(Sphinx) setup(app) - for name in Config._config_values: + for name, _default, _rebuild, _types in Config._config_values: has_config = False for method_name, args, _kwargs in app.method_calls: if method_name == 'add_config_value' and args[0] == name: