shrink mypy whitelist for `sphinx.builders` (#11396)

Co-authored-by: Adam Turner <9087854+aa-turner@users.noreply.github.com>
This commit is contained in:
danieleades 2023-07-23 18:21:29 +01:00 committed by GitHub
parent edd9ea0a39
commit d564a8ba11
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 26 additions and 23 deletions

View File

@ -307,7 +307,6 @@ disallow_any_generics = true
[[tool.mypy.overrides]] [[tool.mypy.overrides]]
module = [ module = [
"sphinx.builders",
"sphinx.builders.html", "sphinx.builders.html",
"sphinx.builders.latex", "sphinx.builders.latex",
"sphinx.builders.linkcheck", "sphinx.builders.linkcheck",

View File

@ -32,10 +32,6 @@ from sphinx.util.typing import NoneType
# side effect: registers roles and directives # side effect: registers roles and directives
from sphinx import directives # noqa: F401 isort:skip from sphinx import directives # noqa: F401 isort:skip
from sphinx import roles # noqa: F401 isort:skip from sphinx import roles # noqa: F401 isort:skip
try:
import multiprocessing
except ImportError:
multiprocessing = None
if TYPE_CHECKING: if TYPE_CHECKING:
from sphinx.application import Sphinx from sphinx.application import Sphinx
@ -60,7 +56,7 @@ class Builder:
#: default translator class for the builder. This can be overridden by #: default translator class for the builder. This can be overridden by
#: :py:meth:`~sphinx.application.Sphinx.set_translator`. #: :py:meth:`~sphinx.application.Sphinx.set_translator`.
default_translator_class: type[nodes.NodeVisitor] = None default_translator_class: type[nodes.NodeVisitor]
# doctree versioning method # doctree versioning method
versioning_method = 'none' versioning_method = 'none'
versioning_compare = False versioning_compare = False
@ -135,7 +131,7 @@ class Builder:
from sphinx.jinja2glue import BuiltinTemplateLoader from sphinx.jinja2glue import BuiltinTemplateLoader
self.templates = 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. """Return the target URI for a document name.
*typ* can be used to qualify the link characteristic for individual *typ* can be used to qualify the link characteristic for individual
@ -143,7 +139,7 @@ class Builder:
""" """
raise NotImplementedError 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. """Return a relative URI between two source filenames.
May raise environment.NoUri if there's no way to return a sensible URI. May raise environment.NoUri if there's no way to return a sensible URI.
@ -296,7 +292,10 @@ class Builder:
len(to_build)) len(to_build))
def 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: ) -> None:
"""Main build method. """Main build method.
@ -509,15 +508,15 @@ class Builder:
) -> None: ) -> None:
"""Write the doctree to a file.""" """Write the doctree to a file."""
# make it picklable # make it picklable
doctree.reporter = None doctree.reporter = None # type: ignore[assignment]
doctree.transformer = None doctree.transformer = None # type: ignore[assignment]
# Create a copy of settings object before modification because it is # Create a copy of settings object before modification because it is
# shared with other documents. # shared with other documents.
doctree.settings = doctree.settings.copy() doctree.settings = doctree.settings.copy()
doctree.settings.warning_stream = None doctree.settings.warning_stream = None
doctree.settings.env = 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') doctree_filename = path.join(self.doctreedir, docname + '.doctree')
ensuredir(path.dirname(doctree_filename)) ensuredir(path.dirname(doctree_filename))
@ -532,7 +531,7 @@ class Builder:
def write( def write(
self, self,
build_docnames: Iterable[str], build_docnames: Iterable[str] | None,
updated_docnames: Sequence[str], updated_docnames: Sequence[str],
method: str = 'update', method: str = 'update',
) -> None: ) -> None:

View File

@ -254,7 +254,10 @@ class MessageCatalogBuilder(I18nBuilder):
raise ThemeError(f'{template}: {exc!r}') from exc raise ThemeError(f'{template}: {exc!r}') from exc
def 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: ) -> None:
self._extract_from_template() self._extract_from_template()
super().build(docnames, summary, method) super().build(docnames, summary, method)

View File

@ -193,6 +193,7 @@ class StandaloneHTMLBuilder(Builder):
format = 'html' format = 'html'
epilog = __('The HTML pages are in %(outdir)s.') epilog = __('The HTML pages are in %(outdir)s.')
default_translator_class = HTML5Translator
copysource = True copysource = True
allow_parallel = True allow_parallel = True
out_suffix = '.html' out_suffix = '.html'
@ -372,10 +373,6 @@ class StandaloneHTMLBuilder(Builder):
self.script_files.append(JavaScript(filename, **kwargs)) self.script_files.append(JavaScript(filename, **kwargs))
@property
def default_translator_class(self) -> type[nodes.NodeVisitor]: # type: ignore
return HTML5Translator
@property @property
def math_renderer_name(self) -> str: def math_renderer_name(self) -> str:
name = self.get_builder_config('math_renderer', 'html') name = self.get_builder_config('math_renderer', 'html')

View File

@ -327,12 +327,16 @@ class SphinxComponentRegistry:
) from exc ) from exc
def get_translator_class(self, builder: Builder) -> type[nodes.NodeVisitor]: def get_translator_class(self, builder: Builder) -> type[nodes.NodeVisitor]:
return self.translators.get(builder.name, try:
builder.default_translator_class) 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: def create_translator(self, builder: Builder, *args: Any) -> nodes.NodeVisitor:
translator_class = self.get_translator_class(builder) translator_class = self.get_translator_class(builder)
assert translator_class, "translator not found for %s" % builder.name
translator = translator_class(*args) translator = translator_class(*args)
# transplant handlers for custom nodes to translator instance # transplant handlers for custom nodes to translator instance

View File

@ -236,8 +236,9 @@ class SigElementFallbackTransform(SphinxPostTransform):
def has_visitor(translator: type[nodes.NodeVisitor], node: type[Element]) -> bool: def has_visitor(translator: type[nodes.NodeVisitor], node: type[Element]) -> bool:
return hasattr(translator, "visit_%s" % node.__name__) return hasattr(translator, "visit_%s" % node.__name__)
translator = self.app.builder.get_translator_class() try:
if translator is None: translator = self.app.builder.get_translator_class()
except AttributeError:
# do nothing if no translator class is specified (e.g., on a dummy builder) # do nothing if no translator class is specified (e.g., on a dummy builder)
return return