From d564a8ba11d655f35bcb8b9828a21baba5e92798 Mon Sep 17 00:00:00 2001 From: danieleades <33452915+danieleades@users.noreply.github.com> Date: Sun, 23 Jul 2023 18:21:29 +0100 Subject: [PATCH] shrink mypy whitelist for ``sphinx.builders`` (#11396) Co-authored-by: Adam Turner <9087854+aa-turner@users.noreply.github.com> --- pyproject.toml | 1 - sphinx/builders/__init__.py | 23 +++++++++---------- sphinx/builders/gettext.py | 5 +++- sphinx/builders/html/__init__.py | 5 +--- sphinx/registry.py | 10 +++++--- sphinx/transforms/post_transforms/__init__.py | 5 ++-- 6 files changed, 26 insertions(+), 23 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index b31ae439c..94f0133ef 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -307,7 +307,6 @@ disallow_any_generics = true [[tool.mypy.overrides]] module = [ - "sphinx.builders", "sphinx.builders.html", "sphinx.builders.latex", "sphinx.builders.linkcheck", diff --git a/sphinx/builders/__init__.py b/sphinx/builders/__init__.py index b6471d3d5..4ac15efe0 100644 --- a/sphinx/builders/__init__.py +++ b/sphinx/builders/__init__.py @@ -32,10 +32,6 @@ from sphinx.util.typing import NoneType # side effect: registers roles and directives from sphinx import directives # noqa: F401 isort:skip from sphinx import roles # noqa: F401 isort:skip -try: - import multiprocessing -except ImportError: - multiprocessing = None if TYPE_CHECKING: from sphinx.application import Sphinx @@ -60,7 +56,7 @@ class Builder: #: default translator class for the builder. This can be overridden by #: :py:meth:`~sphinx.application.Sphinx.set_translator`. - default_translator_class: type[nodes.NodeVisitor] = None + default_translator_class: type[nodes.NodeVisitor] # doctree versioning method versioning_method = 'none' versioning_compare = False @@ -135,7 +131,7 @@ class Builder: from sphinx.jinja2glue import BuiltinTemplateLoader self.templates = BuiltinTemplateLoader() - def get_target_uri(self, docname: str, typ: str = None) -> str: + def get_target_uri(self, docname: str, typ: str | None = None) -> str: """Return the target URI for a document name. *typ* can be used to qualify the link characteristic for individual @@ -143,7 +139,7 @@ class Builder: """ raise NotImplementedError - def get_relative_uri(self, from_: str, to: str, typ: str = None) -> str: + def get_relative_uri(self, from_: str, to: str, typ: str | None = None) -> str: """Return a relative URI between two source filenames. May raise environment.NoUri if there's no way to return a sensible URI. @@ -296,7 +292,10 @@ class Builder: len(to_build)) def build( - self, docnames: Iterable[str], summary: str | None = None, method: str = 'update', + self, + docnames: Iterable[str] | None, + summary: str | None = None, + method: str = 'update', ) -> None: """Main build method. @@ -509,15 +508,15 @@ class Builder: ) -> None: """Write the doctree to a file.""" # make it picklable - doctree.reporter = None - doctree.transformer = None + doctree.reporter = None # type: ignore[assignment] + doctree.transformer = None # type: ignore[assignment] # Create a copy of settings object before modification because it is # shared with other documents. doctree.settings = doctree.settings.copy() doctree.settings.warning_stream = None doctree.settings.env = None - doctree.settings.record_dependencies = None + doctree.settings.record_dependencies = None # type: ignore[assignment] doctree_filename = path.join(self.doctreedir, docname + '.doctree') ensuredir(path.dirname(doctree_filename)) @@ -532,7 +531,7 @@ class Builder: def write( self, - build_docnames: Iterable[str], + build_docnames: Iterable[str] | None, updated_docnames: Sequence[str], method: str = 'update', ) -> None: diff --git a/sphinx/builders/gettext.py b/sphinx/builders/gettext.py index ee2f8bcd6..8380b4415 100644 --- a/sphinx/builders/gettext.py +++ b/sphinx/builders/gettext.py @@ -254,7 +254,10 @@ class MessageCatalogBuilder(I18nBuilder): raise ThemeError(f'{template}: {exc!r}') from exc def build( - self, docnames: Iterable[str], summary: str | None = None, method: str = 'update', + self, + docnames: Iterable[str] | None, + summary: str | None = None, + method: str = 'update', ) -> None: self._extract_from_template() super().build(docnames, summary, method) diff --git a/sphinx/builders/html/__init__.py b/sphinx/builders/html/__init__.py index 64a5c1f60..5eb526c29 100644 --- a/sphinx/builders/html/__init__.py +++ b/sphinx/builders/html/__init__.py @@ -193,6 +193,7 @@ class StandaloneHTMLBuilder(Builder): format = 'html' epilog = __('The HTML pages are in %(outdir)s.') + default_translator_class = HTML5Translator copysource = True allow_parallel = True out_suffix = '.html' @@ -372,10 +373,6 @@ class StandaloneHTMLBuilder(Builder): self.script_files.append(JavaScript(filename, **kwargs)) - @property - def default_translator_class(self) -> type[nodes.NodeVisitor]: # type: ignore - return HTML5Translator - @property def math_renderer_name(self) -> str: name = self.get_builder_config('math_renderer', 'html') diff --git a/sphinx/registry.py b/sphinx/registry.py index 555722538..5eda1bb01 100644 --- a/sphinx/registry.py +++ b/sphinx/registry.py @@ -327,12 +327,16 @@ class SphinxComponentRegistry: ) from exc def get_translator_class(self, builder: Builder) -> type[nodes.NodeVisitor]: - return self.translators.get(builder.name, - builder.default_translator_class) + try: + return self.translators[builder.name] + except KeyError: + try: + return builder.default_translator_class + except AttributeError as err: + raise AttributeError(f'translator not found for {builder.name}') from err def create_translator(self, builder: Builder, *args: Any) -> nodes.NodeVisitor: translator_class = self.get_translator_class(builder) - assert translator_class, "translator not found for %s" % builder.name translator = translator_class(*args) # transplant handlers for custom nodes to translator instance diff --git a/sphinx/transforms/post_transforms/__init__.py b/sphinx/transforms/post_transforms/__init__.py index 4a963d31b..e7e458000 100644 --- a/sphinx/transforms/post_transforms/__init__.py +++ b/sphinx/transforms/post_transforms/__init__.py @@ -236,8 +236,9 @@ class SigElementFallbackTransform(SphinxPostTransform): def has_visitor(translator: type[nodes.NodeVisitor], node: type[Element]) -> bool: return hasattr(translator, "visit_%s" % node.__name__) - translator = self.app.builder.get_translator_class() - if translator is None: + try: + translator = self.app.builder.get_translator_class() + except AttributeError: # do nothing if no translator class is specified (e.g., on a dummy builder) return