Skip to content

Commit f3e0de1

Browse files
committed
Avoid using attributes of app
1 parent c68f846 commit f3e0de1

File tree

19 files changed

+180
-83
lines changed

19 files changed

+180
-83
lines changed

sphinx/builders/__init__.py

+8-3
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747

4848
if TYPE_CHECKING:
4949
from collections.abc import Iterable, Sequence, Set
50+
from gettext import NullTranslations
5051
from typing import Any, Literal
5152

5253
from docutils.nodes import Node
@@ -135,17 +136,21 @@ def __init__(self, app: Sphinx, env: BuildEnvironment) -> None:
135136
self.parallel_ok = False
136137
self.finish_tasks: Any = None
137138

139+
@property
140+
def _translator(self) -> NullTranslations | None:
141+
return self.app.translator
142+
138143
def get_translator_class(self, *args: Any) -> type[nodes.NodeVisitor]:
139144
"""Return a class of translator."""
140-
return self.app.registry.get_translator_class(self)
145+
return self.env._registry.get_translator_class(self)
141146

142147
def create_translator(self, *args: Any) -> nodes.NodeVisitor:
143148
"""Return an instance of translator.
144149
145150
This method returns an instance of ``default_translator_class`` by default.
146151
Users can replace the translator class with ``app.set_translator()`` API.
147152
"""
148-
return self.app.registry.create_translator(self, *args)
153+
return self.env._registry.create_translator(self, *args)
149154

150155
# helper methods
151156
def init(self) -> None:
@@ -626,7 +631,7 @@ def read_doc(self, docname: str, *, _cache: bool = True) -> None:
626631

627632
filename = str(env.doc2path(docname))
628633
filetype = get_filetype(self.app.config.source_suffix, filename)
629-
publisher = self.app.registry.get_publisher(self.app, filetype)
634+
publisher = self.env._registry.get_publisher(self.app, filetype)
630635
self.env.current_document._parser = publisher.parser
631636
# record_dependencies is mutable even though it is in settings,
632637
# explicitly re-initialise for each document

sphinx/builders/html/__init__.py

+6-6
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ def init_css_files(self) -> None:
276276
for filename in self._get_style_filenames():
277277
self.add_css_file(filename, priority=200)
278278

279-
for filename, attrs in self.app.registry.css_files:
279+
for filename, attrs in self.env._registry.css_files:
280280
self.add_css_file(filename, **attrs)
281281

282282
for filename, attrs in self.get_builder_config('css_files', 'html'):
@@ -303,7 +303,7 @@ def init_js_files(self) -> None:
303303
self.add_js_file('doctools.js', priority=200)
304304
self.add_js_file('sphinx_highlight.js', priority=200)
305305

306-
for filename, attrs in self.app.registry.js_files:
306+
for filename, attrs in self.env._registry.js_files:
307307
self.add_js_file(filename or '', **attrs)
308308

309309
for filename, attrs in self.get_builder_config('js_files', 'html'):
@@ -328,7 +328,7 @@ def math_renderer_name(self) -> str | None:
328328
return name
329329
else:
330330
# not given: choose a math_renderer from registered ones as possible
331-
renderers = list(self.app.registry.html_inline_math_renderers)
331+
renderers = list(self.env._registry.html_inline_math_renderers)
332332
if len(renderers) == 1:
333333
# only default math_renderer (mathjax) is registered
334334
return renderers[0]
@@ -516,9 +516,9 @@ def prepare_writing(self, docnames: Set[str]) -> None:
516516
))
517517

518518
# add assets registered after ``Builder.init()``.
519-
for css_filename, attrs in self.app.registry.css_files:
519+
for css_filename, attrs in self.env._registry.css_files:
520520
self.add_css_file(css_filename, **attrs)
521-
for js_filename, attrs in self.app.registry.js_files:
521+
for js_filename, attrs in self.env._registry.js_files:
522522
self.add_js_file(js_filename or '', **attrs)
523523

524524
# back up _css_files and _js_files to allow adding CSS/JS files to a specific page.
@@ -1186,7 +1186,7 @@ def js_tag(js: _JavaScript | str) -> str:
11861186
self._js_files[:] = self._orig_js_files
11871187

11881188
self.update_page_context(pagename, templatename, ctx, event_arg)
1189-
if new_template := self.app.emit_firstresult(
1189+
if new_template := self.events.emit_firstresult(
11901190
'html-page-context', pagename, templatename, ctx, event_arg
11911191
):
11921192
templatename = new_template

sphinx/builders/latex/__init__.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ def init_context(self) -> None:
211211
def update_context(self) -> None:
212212
"""Update template variables for .tex file just before writing."""
213213
# Apply extension settings to context
214-
registry = self.app.registry
214+
registry = self.env._registry
215215
self.context['packages'] = registry.latex_packages
216216
self.context['packages_after_hyperref'] = registry.latex_packages_after_hyperref
217217

sphinx/builders/linkcheck.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,7 @@ def _add_uri(self, uri: str, node: nodes.Element) -> None:
262262
hyperlinks = builder.hyperlinks
263263
docname = self.env.docname
264264

265-
if newuri := self.app.emit_firstresult('linkcheck-process-uri', uri):
265+
if newuri := self.app.events.emit_firstresult('linkcheck-process-uri', uri):
266266
uri = newuri
267267

268268
try:

sphinx/domains/std/__init__.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -808,7 +808,7 @@ def __init__(self, env: BuildEnvironment) -> None:
808808
self.enumerable_nodes = copy(
809809
self.enumerable_nodes
810810
) # create a copy for this instance
811-
for node, settings in env.app.registry.enumerable_nodes.items():
811+
for node, settings in env._registry.enumerable_nodes.items():
812812
self.enumerable_nodes[node] = settings
813813

814814
def note_hyperlink_target(

sphinx/environment/__init__.py

+12-2
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@
4848
from sphinx.events import EventManager
4949
from sphinx.extension import Extension
5050
from sphinx.project import Project
51+
from sphinx.registry import SphinxComponentRegistry
52+
from sphinx.util.tags import Tags
5153

5254
logger = logging.getLogger(__name__)
5355

@@ -282,6 +284,14 @@ def setup(self, app: Sphinx) -> None:
282284
# initialize settings
283285
self._update_settings(app.config)
284286

287+
@property
288+
def _registry(self) -> SphinxComponentRegistry:
289+
return self.app.registry
290+
291+
@property
292+
def _tags(self) -> Tags:
293+
return self.app.tags
294+
285295
@staticmethod
286296
def _config_status(
287297
*, old_config: Config | None, new_config: Config, verbosity: int
@@ -629,7 +639,7 @@ def note_included(self, filename: str | os.PathLike[str]) -> None:
629639
"""
630640
doc = self.path2doc(filename)
631641
if doc:
632-
self.included[self.docname].add(doc)
642+
self.included.setdefault(self.docname, set()).add(doc)
633643

634644
def note_reread(self) -> None:
635645
"""Add the current document to the list of documents that will
@@ -759,7 +769,7 @@ def apply_post_transforms(self, doctree: nodes.document, docname: str) -> None:
759769

760770
transformer = SphinxTransformer(doctree)
761771
transformer.set_environment(self)
762-
transformer.add_transforms(self.app.registry.get_post_transforms())
772+
transformer.add_transforms(self._registry.get_post_transforms())
763773
transformer.apply_transforms()
764774
finally:
765775
self.current_document = backup

sphinx/environment/adapters/toctree.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -574,7 +574,7 @@ def get_toctree_ancestors(self, docname: str) -> list[str]:
574574
return [*_get_toctree_ancestors(self.env.toctree_includes, docname)]
575575

576576
def get_toc_for(self, docname: str, builder: Builder) -> Node:
577-
return document_toc(self.env, docname, self.env.app.tags)
577+
return document_toc(self.env, docname, self.env._tags)
578578

579579
def get_toctree_for(
580580
self,

sphinx/ext/autodoc/__init__.py

+7-4
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
from sphinx.environment import BuildEnvironment, _CurrentDocument
4545
from sphinx.events import EventManager
4646
from sphinx.ext.autodoc.directive import DocumenterBridge
47+
from sphinx.registry import SphinxComponentRegistry
4748
from sphinx.util.typing import ExtensionMetadata, OptionSpec, _RestifyMode
4849

4950
_AutodocObjType = Literal[
@@ -380,7 +381,7 @@ class Documenter:
380381

381382
def get_attr(self, obj: Any, name: str, *defargs: Any) -> Any:
382383
"""getattr() override for types such as Zope interfaces."""
383-
return autodoc_attrgetter(self.env.app, obj, name, *defargs)
384+
return autodoc_attrgetter(self.env._registry, obj, name, *defargs)
384385

385386
@classmethod
386387
def can_document_member(
@@ -422,7 +423,7 @@ def __init__(
422423
@property
423424
def documenters(self) -> dict[str, type[Documenter]]:
424425
"""Returns registered Documenter classes"""
425-
return self.env.app.registry.documenters
426+
return self.env._registry.documenters
426427

427428
def add_line(self, line: str, source: str, *lineno: int) -> None:
428429
"""Append one line of generated reST to the output."""
@@ -3137,9 +3138,11 @@ def _get_property_getter(self) -> Callable[..., Any] | None:
31373138
return None
31383139

31393140

3140-
def autodoc_attrgetter(app: Sphinx, obj: Any, name: str, *defargs: Any) -> Any:
3141+
def autodoc_attrgetter(
3142+
registry: SphinxComponentRegistry, obj: Any, name: str, *defargs: Any
3143+
) -> Any:
31413144
"""Alternative getattr() for types"""
3142-
for typ, func in app.registry.autodoc_attrgetters.items():
3145+
for typ, func in registry.autodoc_attrgetters.items():
31433146
if isinstance(obj, typ):
31443147
return func(obj, name, *defargs)
31453148

sphinx/ext/autodoc/directive.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ def run(self) -> list[Node]:
150150

151151
# look up target Documenter
152152
objtype = self.name[4:] # strip prefix (auto-).
153-
doccls = self.env.app.registry.documenters[objtype]
153+
doccls = self.env._registry.documenters[objtype]
154154

155155
# process the options with the selected documenter's option_spec
156156
try:

sphinx/ext/autosummary/__init__.py

+16-7
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,9 @@ def __init__(self) -> None:
180180
super().__init__(env, None, Options(), 0, state)
181181

182182

183-
def get_documenter(app: Sphinx, obj: Any, parent: Any) -> type[Documenter]:
183+
def _get_documenter(
184+
obj: Any, parent: Any, *, registry: SphinxComponentRegistry
185+
) -> type[Documenter]:
184186
"""Get an autodoc.Documenter class suitable for documenting the given
185187
object.
186188
@@ -196,7 +198,7 @@ def get_documenter(app: Sphinx, obj: Any, parent: Any) -> type[Documenter]:
196198

197199
# Construct a fake documenter for *parent*
198200
if parent is not None:
199-
parent_doc_cls = get_documenter(app, parent, None)
201+
parent_doc_cls = _get_documenter(parent, None, registry=registry)
200202
else:
201203
parent_doc_cls = ModuleDocumenter
202204

@@ -208,7 +210,7 @@ def get_documenter(app: Sphinx, obj: Any, parent: Any) -> type[Documenter]:
208210
# Get the correct documenter class for *obj*
209211
classes = [
210212
cls
211-
for cls in app.registry.documenters.values()
213+
for cls in registry.documenters.values()
212214
if cls.can_document_member(obj, '', False, parent_doc)
213215
]
214216
if classes:
@@ -318,14 +320,19 @@ def import_by_name(
318320
raise ImportExceptionGroup(exc.args[0], errors) from None
319321

320322
def create_documenter(
321-
self, app: Sphinx, obj: Any, parent: Any, full_name: str
323+
self,
324+
obj: Any,
325+
parent: Any,
326+
full_name: str,
327+
*,
328+
registry: SphinxComponentRegistry,
322329
) -> Documenter:
323330
"""Get an autodoc.Documenter class suitable for documenting the given
324331
object.
325332
326-
Wraps get_documenter and is meant as a hook for extensions.
333+
Wraps _get_documenter and is meant as a hook for extensions.
327334
"""
328-
doccls = get_documenter(app, obj, parent)
335+
doccls = _get_documenter(obj, parent, registry=registry)
329336
return doccls(self.bridge, full_name)
330337

331338
def get_items(self, names: list[str]) -> list[tuple[str, str | None, str, str]]:
@@ -378,7 +385,9 @@ def get_items(self, names: list[str]) -> list[tuple[str, str | None, str, str]]:
378385
full_name = modname + '::' + full_name[len(modname) + 1 :]
379386
# NB. using full_name here is important, since Documenters
380387
# handle module prefixes slightly differently
381-
documenter = self.create_documenter(self.env.app, obj, parent, full_name)
388+
documenter = self.create_documenter(
389+
obj, parent, full_name, registry=self.env._registry
390+
)
382391
if not documenter.parse_name():
383392
logger.warning(
384393
__('failed to parse name %s'),

0 commit comments

Comments
 (0)