Skip to content

Commit 9203f2f

Browse files
authored
Avoid using Documenter.name (#13975)
1 parent ce81838 commit 9203f2f

File tree

3 files changed

+25
-27
lines changed

3 files changed

+25
-27
lines changed

sphinx/ext/autodoc/_documenters.py

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ class Documenter:
8686
}
8787

8888
def __init__(
89-
self, directive: DocumenterBridge, name: str, indent: str = ''
89+
self, directive: DocumenterBridge, orig_name: str, indent: str = ''
9090
) -> None:
9191
self.directive = directive
9292
self.config: Config = directive.env.config
@@ -95,7 +95,7 @@ def __init__(
9595
self._events: EventManager = directive.env.events
9696
self.options: _AutoDocumenterOptions = directive.genopt
9797
self.get_attr = directive.get_attr
98-
self.name = name
98+
self.orig_name = orig_name
9999
self.indent: Final = indent
100100
# the parent/owner of the object to document
101101
self.parent: Any = None
@@ -122,15 +122,15 @@ def add_line(self, line: str, source: str, *lineno: int, indent: str) -> None:
122122
self.directive.result.append('', source, *lineno)
123123

124124
def _load_object_by_name(self) -> Literal[True] | None:
125-
"""Import the object given by *self.name*.
125+
"""Import the object given by *self.orig_name*.
126126
127127
Returns True if parsing and resolving was successful, otherwise None.
128128
"""
129129
if self._load_object_has_been_called:
130130
return True
131131

132132
ret = _load_object_by_name(
133-
name=self.name,
133+
name=self.orig_name,
134134
objtype=self.objtype, # type: ignore[arg-type]
135135
mock_imports=self.config.autodoc_mock_imports,
136136
type_aliases=self.config.autodoc_type_aliases,
@@ -359,7 +359,7 @@ def generate(
359359
check_module: bool = False,
360360
all_members: bool = False,
361361
) -> None:
362-
"""Generate reST for the object given by *self.name*, and possibly for
362+
"""Generate reST for the object given by *self.orig_name*, and possibly for
363363
its members.
364364
365365
If *more_content* is given, include that content. If *real_modname* is
@@ -433,7 +433,7 @@ def _generate(
433433
if ismock(self.props._obj) and not has_docstring:
434434
logger.warning(
435435
__('A mocked object is detected: %r'),
436-
self.name,
436+
self.props.full_name,
437437
type='autodoc',
438438
subtype='mocked_object',
439439
)
@@ -475,7 +475,6 @@ def _generate(
475475
events=self._events,
476476
get_attr=self.get_attr,
477477
indent=indent,
478-
name=self.name,
479478
options=self.options,
480479
props=self.props,
481480
real_modname=self.real_modname,

sphinx/ext/autodoc/_member_finder.py

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,6 @@ def _document_members(
101101
events: EventManager,
102102
get_attr: _AttrGetter,
103103
indent: str,
104-
name: str,
105104
options: _AutoDocumenterOptions,
106105
props: _ItemProperties,
107106
real_modname: str,
@@ -129,7 +128,6 @@ def _document_members(
129128
directive=directive,
130129
events=events,
131130
get_attr=get_attr,
132-
name=name,
133131
options=options,
134132
props=props,
135133
registry=registry,
@@ -167,7 +165,6 @@ def _gather_members(
167165
directive: DocumenterBridge,
168166
events: EventManager,
169167
get_attr: _AttrGetter,
170-
name: str,
171168
options: _AutoDocumenterOptions,
172169
props: _ItemProperties,
173170
registry: SphinxComponentRegistry,
@@ -207,7 +204,6 @@ def _gather_members(
207204
get_attr=get_attr,
208205
inherit_docstrings=config.autodoc_inherit_docstrings,
209206
options=options,
210-
orig_name=name,
211207
props=props,
212208
inherited_members=inherited_members,
213209
exclude_members=options.exclude_members,
@@ -233,9 +229,9 @@ def _gather_members(
233229
doccls = registry.documenters[obj_type]
234230
# give explicitly separated module name, so that members
235231
# of inner classes can be documented
236-
module_prefix = f'{props.module_name}::'
237-
full_mname = module_prefix + '.'.join((*props.parts, member_name))
238-
documenter = doccls(directive, full_mname, indent)
232+
dotted_parts = '.'.join((*props.parts, member_name))
233+
full_name = f'{props.module_name}::{dotted_parts}'
234+
documenter = doccls(directive, full_name, indent)
239235

240236
# We now try to import all objects before ordering them. This is to
241237
# avoid possible circular imports if we were to import objects after
@@ -476,7 +472,6 @@ def _filter_members(
476472
events: EventManager,
477473
get_attr: _AttrGetter,
478474
options: _AutoDocumenterOptions,
479-
orig_name: str,
480475
props: _ModuleProperties | _ClassDefProperties,
481476
inherit_docstrings: bool,
482477
inherited_members: Set[str],
@@ -517,7 +512,7 @@ def _filter_members(
517512
'autodoc: failed to determine %s.%s (%r) to be documented, '
518513
'the following exception was raised:\n%s'
519514
),
520-
orig_name,
515+
props.full_name,
521516
member_name,
522517
member_obj,
523518
exc,
@@ -633,7 +628,10 @@ def _sort_members(
633628
"""Sort the given member list."""
634629
if order == 'groupwise':
635630
# sort by group; alphabetically within groups
636-
documenters.sort(key=lambda e: (e[0].props._groupwise_order_key, e[0].name))
631+
def group_order(entry: tuple[Documenter, bool]) -> tuple[int, str]:
632+
return entry[0].props._groupwise_order_key, entry[0].props.full_name
633+
634+
documenters.sort(key=group_order)
637635
elif order == 'bysource':
638636
if (
639637
isinstance(props, _ModuleProperties)
@@ -644,25 +642,25 @@ def _sort_members(
644642
module_all_idx = {name: idx for idx, name in enumerate(module_all)}
645643
module_all_len = len(module_all)
646644

647-
def key_func(entry: tuple[Documenter, bool]) -> int:
648-
fullname = entry[0].name.split('::')[1]
645+
def source_order(entry: tuple[Documenter, bool]) -> int:
646+
fullname = entry[0].props.dotted_parts
649647
return module_all_idx.get(fullname, module_all_len)
650648

651-
documenters.sort(key=key_func)
649+
documenters.sort(key=source_order)
652650

653651
# By default, member discovery order matches source order,
654652
# as dicts are insertion-ordered from Python 3.7.
655653
elif analyzer_order:
656654
# sort by source order, by virtue of the module analyzer
657655
order_len = len(analyzer_order)
658656

659-
def key_func(entry: tuple[Documenter, bool]) -> int:
660-
fullname = entry[0].name.split('::')[1]
657+
def source_order(entry: tuple[Documenter, bool]) -> int:
658+
fullname = entry[0].props.dotted_parts
661659
return analyzer_order.get(fullname, order_len)
662660

663-
documenters.sort(key=key_func)
661+
documenters.sort(key=source_order)
664662
else: # alphabetical
665-
documenters.sort(key=lambda e: e[0].name)
663+
documenters.sort(key=lambda entry: entry[0].props.full_name)
666664

667665
return documenters
668666

sphinx/ext/autosummary/__init__.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -364,11 +364,12 @@ def get_items(self, names: list[str]) -> list[tuple[str, str | None, str, str]]:
364364
result = StringList() # initialize for each documenter
365365
obj_type = _get_documenter(obj, parent)
366366
doccls = self.env._registry.documenters[obj_type]
367-
full_name = real_name
368-
if not isinstance(obj, ModuleType):
367+
if isinstance(obj, ModuleType):
368+
full_name = real_name
369+
else:
369370
# give explicitly separated module name, so that members
370371
# of inner classes can be documented
371-
full_name = modname + '::' + full_name[len(modname) + 1 :]
372+
full_name = f'{modname}::{real_name[len(modname) + 1 :]}'
372373
# NB. using full_name here is important, since Documenters
373374
# handle module prefixes slightly differently
374375
self.bridge.result = result

0 commit comments

Comments
 (0)