Skip to content

Commit

Permalink
Napoleon: Fix valid types for configuration values (#13382)
Browse files Browse the repository at this point in the history
  • Loading branch information
AA-Turner authored Feb 21, 2025
1 parent 8ef0708 commit 7ba7628
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 25 deletions.
2 changes: 2 additions & 0 deletions CHANGES.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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
-------
Expand Down
47 changes: 23 additions & 24 deletions sphinx/ext/napoleon/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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,
Expand Down
2 changes: 1 addition & 1 deletion tests/test_extensions/test_ext_napoleon.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down

0 comments on commit 7ba7628

Please sign in to comment.