mirror of
https://github.com/sphinx-doc/sphinx.git
synced 2025-02-25 18:55:22 -06:00
Avoid using attributes of `app
`
This commit is contained in:
parent
c68f846edc
commit
f3e0de1da0
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
||||
|
@ -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:
|
||||
|
@ -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(
|
||||
|
@ -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
|
||||
|
@ -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,
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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:
|
||||
|
@ -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'),
|
||||
|
@ -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:
|
||||
|
@ -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:
|
||||
|
@ -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)
|
||||
|
@ -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):
|
||||
|
@ -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}
|
||||
|
@ -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)
|
||||
|
||||
|
@ -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
|
||||
|
@ -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'
|
||||
|
||||
|
@ -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)
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user