Avoid using attributes of `app`

This commit is contained in:
Adam Turner 2025-02-16 04:25:08 +00:00
parent c68f846edc
commit f3e0de1da0
19 changed files with 180 additions and 83 deletions

View File

@ -47,6 +47,7 @@ from sphinx import roles # NoQA: F401 isort:skip
if TYPE_CHECKING:
from collections.abc import Iterable, Sequence, Set
from gettext import NullTranslations
from typing import Any, Literal
from docutils.nodes import Node
@ -135,9 +136,13 @@ class Builder:
self.parallel_ok = False
self.finish_tasks: Any = None
@property
def _translator(self) -> NullTranslations | None:
return self.app.translator
def get_translator_class(self, *args: Any) -> type[nodes.NodeVisitor]:
"""Return a class of translator."""
return self.app.registry.get_translator_class(self)
return self.env._registry.get_translator_class(self)
def create_translator(self, *args: Any) -> nodes.NodeVisitor:
"""Return an instance of translator.
@ -145,7 +150,7 @@ class Builder:
This method returns an instance of ``default_translator_class`` by default.
Users can replace the translator class with ``app.set_translator()`` API.
"""
return self.app.registry.create_translator(self, *args)
return self.env._registry.create_translator(self, *args)
# helper methods
def init(self) -> None:
@ -626,7 +631,7 @@ class Builder:
filename = str(env.doc2path(docname))
filetype = get_filetype(self.app.config.source_suffix, filename)
publisher = self.app.registry.get_publisher(self.app, filetype)
publisher = self.env._registry.get_publisher(self.app, filetype)
self.env.current_document._parser = publisher.parser
# record_dependencies is mutable even though it is in settings,
# explicitly re-initialise for each document

View File

@ -276,7 +276,7 @@ class StandaloneHTMLBuilder(Builder):
for filename in self._get_style_filenames():
self.add_css_file(filename, priority=200)
for filename, attrs in self.app.registry.css_files:
for filename, attrs in self.env._registry.css_files:
self.add_css_file(filename, **attrs)
for filename, attrs in self.get_builder_config('css_files', 'html'):
@ -303,7 +303,7 @@ class StandaloneHTMLBuilder(Builder):
self.add_js_file('doctools.js', priority=200)
self.add_js_file('sphinx_highlight.js', priority=200)
for filename, attrs in self.app.registry.js_files:
for filename, attrs in self.env._registry.js_files:
self.add_js_file(filename or '', **attrs)
for filename, attrs in self.get_builder_config('js_files', 'html'):
@ -328,7 +328,7 @@ class StandaloneHTMLBuilder(Builder):
return name
else:
# not given: choose a math_renderer from registered ones as possible
renderers = list(self.app.registry.html_inline_math_renderers)
renderers = list(self.env._registry.html_inline_math_renderers)
if len(renderers) == 1:
# only default math_renderer (mathjax) is registered
return renderers[0]
@ -516,9 +516,9 @@ class StandaloneHTMLBuilder(Builder):
))
# add assets registered after ``Builder.init()``.
for css_filename, attrs in self.app.registry.css_files:
for css_filename, attrs in self.env._registry.css_files:
self.add_css_file(css_filename, **attrs)
for js_filename, attrs in self.app.registry.js_files:
for js_filename, attrs in self.env._registry.js_files:
self.add_js_file(js_filename or '', **attrs)
# back up _css_files and _js_files to allow adding CSS/JS files to a specific page.
@ -1186,7 +1186,7 @@ class StandaloneHTMLBuilder(Builder):
self._js_files[:] = self._orig_js_files
self.update_page_context(pagename, templatename, ctx, event_arg)
if new_template := self.app.emit_firstresult(
if new_template := self.events.emit_firstresult(
'html-page-context', pagename, templatename, ctx, event_arg
):
templatename = new_template

View File

@ -211,7 +211,7 @@ class LaTeXBuilder(Builder):
def update_context(self) -> None:
"""Update template variables for .tex file just before writing."""
# Apply extension settings to context
registry = self.app.registry
registry = self.env._registry
self.context['packages'] = registry.latex_packages
self.context['packages_after_hyperref'] = registry.latex_packages_after_hyperref

View File

@ -262,7 +262,7 @@ class HyperlinkCollector(SphinxPostTransform):
hyperlinks = builder.hyperlinks
docname = self.env.docname
if newuri := self.app.emit_firstresult('linkcheck-process-uri', uri):
if newuri := self.app.events.emit_firstresult('linkcheck-process-uri', uri):
uri = newuri
try:

View File

@ -808,7 +808,7 @@ class StandardDomain(Domain):
self.enumerable_nodes = copy(
self.enumerable_nodes
) # create a copy for this instance
for node, settings in env.app.registry.enumerable_nodes.items():
for node, settings in env._registry.enumerable_nodes.items():
self.enumerable_nodes[node] = settings
def note_hyperlink_target(

View File

@ -48,6 +48,8 @@ if TYPE_CHECKING:
from sphinx.events import EventManager
from sphinx.extension import Extension
from sphinx.project import Project
from sphinx.registry import SphinxComponentRegistry
from sphinx.util.tags import Tags
logger = logging.getLogger(__name__)
@ -282,6 +284,14 @@ class BuildEnvironment:
# initialize settings
self._update_settings(app.config)
@property
def _registry(self) -> SphinxComponentRegistry:
return self.app.registry
@property
def _tags(self) -> Tags:
return self.app.tags
@staticmethod
def _config_status(
*, old_config: Config | None, new_config: Config, verbosity: int
@ -629,7 +639,7 @@ class BuildEnvironment:
"""
doc = self.path2doc(filename)
if doc:
self.included[self.docname].add(doc)
self.included.setdefault(self.docname, set()).add(doc)
def note_reread(self) -> None:
"""Add the current document to the list of documents that will
@ -759,7 +769,7 @@ class BuildEnvironment:
transformer = SphinxTransformer(doctree)
transformer.set_environment(self)
transformer.add_transforms(self.app.registry.get_post_transforms())
transformer.add_transforms(self._registry.get_post_transforms())
transformer.apply_transforms()
finally:
self.current_document = backup

View File

@ -574,7 +574,7 @@ class TocTree:
return [*_get_toctree_ancestors(self.env.toctree_includes, docname)]
def get_toc_for(self, docname: str, builder: Builder) -> Node:
return document_toc(self.env, docname, self.env.app.tags)
return document_toc(self.env, docname, self.env._tags)
def get_toctree_for(
self,

View File

@ -44,6 +44,7 @@ if TYPE_CHECKING:
from sphinx.environment import BuildEnvironment, _CurrentDocument
from sphinx.events import EventManager
from sphinx.ext.autodoc.directive import DocumenterBridge
from sphinx.registry import SphinxComponentRegistry
from sphinx.util.typing import ExtensionMetadata, OptionSpec, _RestifyMode
_AutodocObjType = Literal[
@ -380,7 +381,7 @@ class Documenter:
def get_attr(self, obj: Any, name: str, *defargs: Any) -> Any:
"""getattr() override for types such as Zope interfaces."""
return autodoc_attrgetter(self.env.app, obj, name, *defargs)
return autodoc_attrgetter(self.env._registry, obj, name, *defargs)
@classmethod
def can_document_member(
@ -422,7 +423,7 @@ class Documenter:
@property
def documenters(self) -> dict[str, type[Documenter]]:
"""Returns registered Documenter classes"""
return self.env.app.registry.documenters
return self.env._registry.documenters
def add_line(self, line: str, source: str, *lineno: int) -> None:
"""Append one line of generated reST to the output."""
@ -3137,9 +3138,11 @@ class PropertyDocumenter(DocstringStripSignatureMixin, ClassLevelDocumenter): #
return None
def autodoc_attrgetter(app: Sphinx, obj: Any, name: str, *defargs: Any) -> Any:
def autodoc_attrgetter(
registry: SphinxComponentRegistry, obj: Any, name: str, *defargs: Any
) -> Any:
"""Alternative getattr() for types"""
for typ, func in app.registry.autodoc_attrgetters.items():
for typ, func in registry.autodoc_attrgetters.items():
if isinstance(obj, typ):
return func(obj, name, *defargs)

View File

@ -150,7 +150,7 @@ class AutodocDirective(SphinxDirective):
# look up target Documenter
objtype = self.name[4:] # strip prefix (auto-).
doccls = self.env.app.registry.documenters[objtype]
doccls = self.env._registry.documenters[objtype]
# process the options with the selected documenter's option_spec
try:

View File

@ -180,7 +180,9 @@ class FakeDirective(DocumenterBridge):
super().__init__(env, None, Options(), 0, state)
def get_documenter(app: Sphinx, obj: Any, parent: Any) -> type[Documenter]:
def _get_documenter(
obj: Any, parent: Any, *, registry: SphinxComponentRegistry
) -> type[Documenter]:
"""Get an autodoc.Documenter class suitable for documenting the given
object.
@ -196,7 +198,7 @@ def get_documenter(app: Sphinx, obj: Any, parent: Any) -> type[Documenter]:
# Construct a fake documenter for *parent*
if parent is not None:
parent_doc_cls = get_documenter(app, parent, None)
parent_doc_cls = _get_documenter(parent, None, registry=registry)
else:
parent_doc_cls = ModuleDocumenter
@ -208,7 +210,7 @@ def get_documenter(app: Sphinx, obj: Any, parent: Any) -> type[Documenter]:
# Get the correct documenter class for *obj*
classes = [
cls
for cls in app.registry.documenters.values()
for cls in registry.documenters.values()
if cls.can_document_member(obj, '', False, parent_doc)
]
if classes:
@ -318,14 +320,19 @@ class Autosummary(SphinxDirective):
raise ImportExceptionGroup(exc.args[0], errors) from None
def create_documenter(
self, app: Sphinx, obj: Any, parent: Any, full_name: str
self,
obj: Any,
parent: Any,
full_name: str,
*,
registry: SphinxComponentRegistry,
) -> Documenter:
"""Get an autodoc.Documenter class suitable for documenting the given
object.
Wraps get_documenter and is meant as a hook for extensions.
Wraps _get_documenter and is meant as a hook for extensions.
"""
doccls = get_documenter(app, obj, parent)
doccls = _get_documenter(obj, parent, registry=registry)
return doccls(self.bridge, full_name)
def get_items(self, names: list[str]) -> list[tuple[str, str | None, str, str]]:
@ -378,7 +385,9 @@ class Autosummary(SphinxDirective):
full_name = modname + '::' + full_name[len(modname) + 1 :]
# NB. using full_name here is important, since Documenters
# handle module prefixes slightly differently
documenter = self.create_documenter(self.env.app, obj, parent, full_name)
documenter = self.create_documenter(
obj, parent, full_name, registry=self.env._registry
)
if not documenter.parse_name():
logger.warning(
__('failed to parse name %s'),

View File

@ -36,7 +36,7 @@ from sphinx.errors import PycodeError
from sphinx.ext.autodoc.importer import import_module
from sphinx.ext.autosummary import (
ImportExceptionGroup,
get_documenter,
_get_documenter,
import_by_name,
import_ivar_by_name,
)
@ -56,16 +56,23 @@ if TYPE_CHECKING:
from typing import Any
from sphinx.application import Sphinx
from sphinx.events import EventManager
from sphinx.ext.autodoc import Documenter
logger = logging.getLogger(__name__)
class _DummyEvents:
def emit_firstresult(self, *args: Any) -> None:
pass
class DummyApplication:
"""Dummy Application class for sphinx-autogen command."""
def __init__(self, translator: NullTranslations) -> None:
self.config = Config()
self.events = _DummyEvents()
self.registry = SphinxComponentRegistry()
self.messagelog: list[str] = []
self.srcdir = _StrPath('/')
@ -89,7 +96,7 @@ class AutosummaryEntry(NamedTuple):
recursive: bool
def setup_documenters(app: Any) -> None:
def setup_documenters(app: Sphinx) -> None:
from sphinx.ext.autodoc import (
AttributeDocumenter,
ClassDocumenter,
@ -198,16 +205,25 @@ def _split_full_qualified_name(name: str) -> tuple[str | None, str]:
class ModuleScanner:
def __init__(self, app: Any, obj: Any) -> None:
self.app = app
def __init__(
self,
obj: Any,
*,
config: Config,
events: EventManager,
registry: SphinxComponentRegistry,
) -> None:
self.config = config
self.events = events
self.registry = registry
self.object = obj
def get_object_type(self, name: str, value: Any) -> str:
return get_documenter(self.app, value, self.object).objtype
return _get_documenter(value, self.object, registry=self.registry).objtype
def is_skipped(self, name: str, value: Any, objtype: str) -> bool:
try:
return self.app.emit_firstresult(
return self.events.emit_firstresult(
'autodoc-skip-member', objtype, name, value, False, {}
)
except Exception as exc:
@ -230,7 +246,7 @@ class ModuleScanner:
except PycodeError:
attr_docs = {}
for name in members_of(self.object, self.app.config):
for name in members_of(self.object, config=self.config):
try:
value = safe_getattr(self.object, name)
except AttributeError:
@ -252,7 +268,7 @@ class ModuleScanner:
except AttributeError:
imported = False
respect_module_all = not self.app.config.autosummary_ignore_module_all
respect_module_all = not self.config.autosummary_ignore_module_all
if (
# list all members up
imported_members
@ -266,12 +282,12 @@ class ModuleScanner:
return members
def members_of(obj: Any, conf: Config) -> Sequence[str]:
def members_of(obj: Any, *, config: Config) -> Sequence[str]:
"""Get the members of ``obj``, possibly ignoring the ``__all__`` module attribute
Follows the ``conf.autosummary_ignore_module_all`` setting.
Follows the ``config.autosummary_ignore_module_all`` setting.
"""
if conf.autosummary_ignore_module_all:
if config.autosummary_ignore_module_all:
return dir(obj)
else:
if (obj___all__ := getall(obj)) is not None:
@ -288,34 +304,55 @@ def generate_autosummary_content(
template: AutosummaryRenderer,
template_name: str,
imported_members: bool,
app: Any,
recursive: bool,
context: dict[str, Any],
modname: str | None = None,
qualname: str | None = None,
*,
config: Config,
events: EventManager,
registry: SphinxComponentRegistry,
) -> str:
doc = get_documenter(app, obj, parent)
doc = _get_documenter(obj, parent, registry=registry)
ns: dict[str, Any] = {}
ns.update(context)
if doc.objtype == 'module':
scanner = ModuleScanner(app, obj)
scanner = ModuleScanner(obj, config=config, events=events, registry=registry)
ns['members'] = scanner.scan(imported_members)
respect_module_all = not app.config.autosummary_ignore_module_all
respect_module_all = not config.autosummary_ignore_module_all
imported_members = imported_members or (
'__all__' in dir(obj) and respect_module_all
)
ns['functions'], ns['all_functions'] = _get_members(
doc, app, obj, {'function'}, imported=imported_members
doc,
obj,
{'function'},
config=config,
events=events,
registry=registry,
imported=imported_members,
)
ns['classes'], ns['all_classes'] = _get_members(
doc, app, obj, {'class'}, imported=imported_members
doc,
obj,
{'class'},
config=config,
events=events,
registry=registry,
imported=imported_members,
)
ns['exceptions'], ns['all_exceptions'] = _get_members(
doc, app, obj, {'exception'}, imported=imported_members
doc,
obj,
{'exception'},
config=config,
events=events,
registry=registry,
imported=imported_members,
)
ns['attributes'], ns['all_attributes'] = _get_module_attrs(name, ns['members'])
ispackage = hasattr(obj, '__path__')
@ -337,7 +374,13 @@ def generate_autosummary_content(
# Otherwise, use get_modules method normally
if respect_module_all and '__all__' in dir(obj):
imported_modules, all_imported_modules = _get_members(
doc, app, obj, {'module'}, imported=True
doc,
obj,
{'module'},
config=config,
events=events,
registry=registry,
imported=True,
)
skip += all_imported_modules
public_members = getall(obj)
@ -354,10 +397,21 @@ def generate_autosummary_content(
ns['members'] = dir(obj)
ns['inherited_members'] = set(dir(obj)) - set(obj.__dict__.keys())
ns['methods'], ns['all_methods'] = _get_members(
doc, app, obj, {'method'}, include_public={'__init__'}
doc,
obj,
{'method'},
config=config,
events=events,
registry=registry,
include_public={'__init__'},
)
ns['attributes'], ns['all_attributes'] = _get_members(
doc, app, obj, {'attribute', 'property'}
doc,
obj,
{'attribute', 'property'},
config=config,
events=events,
registry=registry,
)
if modname is None or qualname is None:
@ -385,9 +439,9 @@ def generate_autosummary_content(
return template.render(doc.objtype, ns)
def _skip_member(app: Sphinx, obj: Any, name: str, objtype: str) -> bool:
def _skip_member(obj: Any, name: str, objtype: str, *, events: EventManager) -> bool:
try:
return app.emit_firstresult(
return events.emit_firstresult(
'autodoc-skip-member', objtype, name, obj, False, {}
)
except Exception as exc:
@ -408,9 +462,9 @@ def _get_class_members(obj: Any) -> dict[str, Any]:
return {name: member.object for name, member in members.items()}
def _get_module_members(app: Sphinx, obj: Any) -> dict[str, Any]:
def _get_module_members(obj: Any, *, config: Config) -> dict[str, Any]:
members = {}
for name in members_of(obj, app.config):
for name in members_of(obj, config=config):
try:
members[name] = safe_getattr(obj, name)
except AttributeError:
@ -418,9 +472,11 @@ def _get_module_members(app: Sphinx, obj: Any) -> dict[str, Any]:
return members
def _get_all_members(doc: type[Documenter], app: Sphinx, obj: Any) -> dict[str, Any]:
def _get_all_members(
doc: type[Documenter], obj: Any, *, config: Config
) -> dict[str, Any]:
if doc.objtype == 'module':
return _get_module_members(app, obj)
return _get_module_members(obj, config=config)
elif doc.objtype == 'class':
return _get_class_members(obj)
return {}
@ -428,23 +484,25 @@ def _get_all_members(doc: type[Documenter], app: Sphinx, obj: Any) -> dict[str,
def _get_members(
doc: type[Documenter],
app: Sphinx,
obj: Any,
types: set[str],
*,
config: Config,
events: EventManager,
registry: SphinxComponentRegistry,
include_public: Set[str] = frozenset(),
imported: bool = True,
) -> tuple[list[str], list[str]]:
items: list[str] = []
public: list[str] = []
all_members = _get_all_members(doc, app, obj)
all_members = _get_all_members(doc, obj, config=config)
for name, value in all_members.items():
documenter = get_documenter(app, value, obj)
documenter = _get_documenter(value, obj, registry=registry)
if documenter.objtype in types:
# skip imported members if expected
if imported or getattr(value, '__module__', None) == obj.__name__:
skipped = _skip_member(app, value, name, documenter.objtype)
skipped = _skip_member(value, name, documenter.objtype, events=events)
if skipped is True:
pass
elif skipped is False:
@ -591,11 +649,13 @@ def generate_autosummary_docs(
template,
entry.template,
imported_members,
app,
entry.recursive,
context,
modname,
qualname,
config=app.config,
events=app.events,
registry=app.registry,
)
file_path = Path(path, filename_map.get(name, name) + suffix)
@ -859,7 +919,7 @@ def main(argv: Sequence[str] = (), /) -> None:
app = DummyApplication(sphinx.locale.get_translator())
logging.setup(app, sys.stdout, sys.stderr) # type: ignore[arg-type]
setup_documenters(app)
setup_documenters(app) # type: ignore[arg-type]
args = get_parser().parse_args(argv or sys.argv[1:])
if args.templates:

View File

@ -109,6 +109,7 @@ def is_supported_builder(builder: Builder) -> bool:
def doctree_read(app: Sphinx, doctree: Node) -> None:
env = app.env
events = app.events
if not hasattr(env, '_viewcode_modules'):
env._viewcode_modules = {} # type: ignore[attr-defined]
@ -117,7 +118,7 @@ def doctree_read(app: Sphinx, doctree: Node) -> None:
if entry is False:
return False
code_tags = app.emit_firstresult('viewcode-find-source', modname)
code_tags = events.emit_firstresult('viewcode-find-source', modname)
if code_tags is None:
try:
analyzer = ModuleAnalyzer.for_module(modname)
@ -152,7 +153,7 @@ def doctree_read(app: Sphinx, doctree: Node) -> None:
fullname = signode.get('fullname')
refname = modname
if env.config.viewcode_follow_imported_members:
new_modname = app.emit_firstresult(
new_modname = events.emit_firstresult(
'viewcode-follow-imported', modname, fullname
)
if not new_modname:
@ -239,7 +240,8 @@ class ViewcodeAnchorTransform(SphinxPostTransform):
def get_module_filename(app: Sphinx, modname: str) -> _StrPath | None:
"""Get module filename for *modname*."""
source_info = app.emit_firstresult('viewcode-find-source', modname)
events = app.events
source_info = events.emit_firstresult('viewcode-find-source', modname)
if source_info:
return None
else:

View File

@ -198,7 +198,7 @@ class BuiltinTemplateLoader(TemplateBridge, BaseLoader):
# make the paths into loaders
self.loaders = [SphinxFileSystemLoader(x) for x in loaderchain]
use_i18n = builder.app.translator is not None
use_i18n = builder._translator is not None
extensions = ['jinja2.ext.i18n'] if use_i18n else []
self.environment = SandboxedEnvironment(loader=self, extensions=extensions)
self.environment.filters['tobool'] = _tobool
@ -211,9 +211,7 @@ class BuiltinTemplateLoader(TemplateBridge, BaseLoader):
self.environment.globals['idgen'] = idgen
if use_i18n:
# ``install_gettext_translations`` is injected by the ``jinja2.ext.i18n`` extension
self.environment.install_gettext_translations( # type: ignore[attr-defined]
builder.app.translator
)
self.environment.install_gettext_translations(builder._translator) # type: ignore[attr-defined]
def render(self, template: str, context: dict[str, Any]) -> str: # type: ignore[override]
return self.environment.get_template(template).render(context)

View File

@ -409,7 +409,7 @@ class DoctreeReadEvent(SphinxTransform):
default_priority = 880
def apply(self, **kwargs: Any) -> None:
self.app.emit('doctree-read', self.document)
self.app.events.emit('doctree-read', self.document)
class GlossarySorter(SphinxTransform):

View File

@ -125,7 +125,7 @@ class ReferencesResolver(SphinxPostTransform):
try:
# no new node found? try the missing-reference event
new_node = self.app.emit_firstresult(
new_node = self.app.events.emit_firstresult(
'missing-reference',
self.env,
node,
@ -291,7 +291,7 @@ class ReferencesResolver(SphinxPostTransform):
if not warn:
return
if self.app.emit_firstresult('warn-missing-reference', domain, node):
if self.app.events.emit_firstresult('warn-missing-reference', domain, node):
return
elif domain and typ in domain.dangling_warnings:
msg = domain.dangling_warnings[typ] % {'target': target}

View File

@ -969,13 +969,13 @@ class HTML5Translator(SphinxTranslator, BaseTranslator): # type: ignore[misc]
# see validate_math_renderer
name: str = self.builder.math_renderer_name # type: ignore[assignment]
visit, _ = self.builder.app.registry.html_inline_math_renderers[name]
visit, _ = self.builder.env._registry.html_inline_math_renderers[name]
visit(self, node)
def depart_math(self, node: nodes.math, math_env: str = '') -> None:
# see validate_math_renderer
name: str = self.builder.math_renderer_name # type: ignore[assignment]
_, depart = self.builder.app.registry.html_inline_math_renderers[name]
_, depart = self.builder.env._registry.html_inline_math_renderers[name]
if depart:
depart(self, node)
@ -984,13 +984,13 @@ class HTML5Translator(SphinxTranslator, BaseTranslator): # type: ignore[misc]
# see validate_math_renderer
name: str = self.builder.math_renderer_name # type: ignore[assignment]
visit, _ = self.builder.app.registry.html_block_math_renderers[name]
visit, _ = self.builder.env._registry.html_block_math_renderers[name]
visit(self, node)
def depart_math_block(self, node: nodes.math_block, math_env: str = '') -> None:
# see validate_math_renderer
name: str = self.builder.math_renderer_name # type: ignore[assignment]
_, depart = self.builder.app.registry.html_block_math_renderers[name]
_, depart = self.builder.env._registry.html_block_math_renderers[name]
if depart:
depart(self, node)

View File

@ -30,7 +30,7 @@ if TYPE_CHECKING:
def test_process_doc_handle_figure_caption() -> None:
env = mock.Mock(domaindata={})
env.app.registry.enumerable_nodes = {}
env._registry.enumerable_nodes = {}
figure_node = nodes.figure(
'',
nodes.caption('caption text', 'caption text'),
@ -53,7 +53,7 @@ def test_process_doc_handle_figure_caption() -> None:
def test_process_doc_handle_table_title() -> None:
env = mock.Mock(domaindata={})
env.app.registry.enumerable_nodes = {}
env._registry.enumerable_nodes = {}
table_node = nodes.table(
'',
nodes.title('title text', 'title text'),
@ -76,7 +76,7 @@ def test_process_doc_handle_table_title() -> None:
def test_get_full_qualified_name() -> None:
env = mock.Mock(domaindata={})
env.app.registry.enumerable_nodes = {}
env._registry.enumerable_nodes = {}
domain = StandardDomain(env)
# normal references

View File

@ -253,9 +253,11 @@ def test_autosummary_generate_content_for_module(app):
template,
None,
False,
app,
False,
{},
config=app.config,
events=app.events,
registry=app.registry,
)
assert template.render.call_args[0][0] == 'module'
@ -314,9 +316,11 @@ def test_autosummary_generate_content_for_module___all__(app):
template,
None,
False,
app,
False,
{},
config=app.config,
events=app.events,
registry=app.registry,
)
assert template.render.call_args[0][0] == 'module'
@ -364,9 +368,11 @@ def test_autosummary_generate_content_for_module_skipped(app):
template,
None,
False,
app,
False,
{},
config=app.config,
events=app.events,
registry=app.registry,
)
context = template.render.call_args[0][1]
assert context['members'] == [
@ -404,9 +410,11 @@ def test_autosummary_generate_content_for_module_imported_members(app):
template,
None,
True,
app,
False,
{},
config=app.config,
events=app.events,
registry=app.registry,
)
assert template.render.call_args[0][0] == 'module'
@ -470,9 +478,11 @@ def test_autosummary_generate_content_for_module_imported_members_inherited_modu
template,
None,
True,
app,
False,
{},
config=app.config,
events=app.events,
registry=app.registry,
)
assert template.render.call_args[0][0] == 'module'

View File

@ -22,7 +22,7 @@ class DummyTemplateLoader(BuiltinTemplateLoader):
super().__init__()
builder = mock.Mock()
builder.config.templates_path = []
builder.app.translator = None
builder._translator = None
self.init(builder)