Make the `env argument to Builder` subclasses required (#11379)

This commit is contained in:
Adam Turner 2023-04-28 10:25:57 +01:00 committed by GitHub
parent d22e660347
commit a464c5851d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 6 additions and 37 deletions

View File

@ -23,6 +23,7 @@ Incompatible changes
* #11373: Removed deprecated ``sphinx.util.get_matching_files()`` function. * #11373: Removed deprecated ``sphinx.util.get_matching_files()`` function.
* #11378: Remove deprecated ``sphinx.util.docutils.is_html5_writer_available()`` * #11378: Remove deprecated ``sphinx.util.docutils.is_html5_writer_available()``
function. function.
* #11379: Make the ``env`` argument to ``Builder`` subclasses required.
Deprecated Deprecated
---------- ----------

View File

@ -335,8 +335,6 @@ class Sphinx:
return self.registry.create_builder(self, name, self.env) return self.registry.create_builder(self, name, self.env)
def _init_builder(self) -> None: def _init_builder(self) -> None:
if not hasattr(self.builder, "env"):
self.builder.set_environment(self.env)
self.builder.init() self.builder.init()
self.events.emit('builder-inited') self.events.emit('builder-inited')

View File

@ -5,7 +5,6 @@ from __future__ import annotations
import codecs import codecs
import pickle import pickle
import time import time
import warnings
from os import path from os import path
from typing import TYPE_CHECKING, Any, Iterable, Sequence from typing import TYPE_CHECKING, Any, Iterable, Sequence
@ -14,7 +13,6 @@ from docutils.nodes import Node
from docutils.utils import DependencyList from docutils.utils import DependencyList
from sphinx.config import Config from sphinx.config import Config
from sphinx.deprecation import RemovedInSphinx70Warning
from sphinx.environment import CONFIG_CHANGED_REASON, CONFIG_OK, BuildEnvironment from sphinx.environment import CONFIG_CHANGED_REASON, CONFIG_OK, BuildEnvironment
from sphinx.environment.adapters.asset import ImageAdapter from sphinx.environment.adapters.asset import ImageAdapter
from sphinx.errors import SphinxError from sphinx.errors import SphinxError
@ -79,7 +77,7 @@ class Builder:
#: The builder supports data URIs or not. #: The builder supports data URIs or not.
supported_data_uri_images = False supported_data_uri_images = False
def __init__(self, app: Sphinx, env: BuildEnvironment = None) -> None: def __init__(self, app: Sphinx, env: BuildEnvironment) -> None:
self.srcdir = app.srcdir self.srcdir = app.srcdir
self.confdir = app.confdir self.confdir = app.confdir
self.outdir = app.outdir self.outdir = app.outdir
@ -87,15 +85,9 @@ class Builder:
ensuredir(self.doctreedir) ensuredir(self.doctreedir)
self.app: Sphinx = app self.app: Sphinx = app
if env is not None: self.env: BuildEnvironment = env
self.env: BuildEnvironment = env self.env.set_versioning_method(self.versioning_method,
self.env.set_versioning_method(self.versioning_method, self.versioning_compare)
self.versioning_compare)
else:
# ... is passed by SphinxComponentRegistry.create_builder to not show two warnings.
warnings.warn("The 'env' argument to Builder will be required from Sphinx 7.",
RemovedInSphinx70Warning, stacklevel=2)
self.env = None
self.events: EventManager = app.events self.events: EventManager = app.events
self.config: Config = app.config self.config: Config = app.config
self.tags: Tags = app.tags self.tags: Tags = app.tags
@ -115,15 +107,6 @@ class Builder:
self.parallel_ok = False self.parallel_ok = False
self.finish_tasks: Any = None self.finish_tasks: Any = None
def set_environment(self, env: BuildEnvironment) -> None:
"""Store BuildEnvironment object."""
warnings.warn("Builder.set_environment is deprecated, pass env to "
"'Builder.__init__()' instead.",
RemovedInSphinx70Warning, stacklevel=2)
self.env = env
self.env.set_versioning_method(self.versioning_method,
self.versioning_compare)
def get_translator_class(self, *args: Any) -> type[nodes.NodeVisitor]: def get_translator_class(self, *args: Any) -> type[nodes.NodeVisitor]:
"""Return a class of translator.""" """Return a class of translator."""
return self.app.registry.get_translator_class(self) return self.app.registry.get_translator_class(self)

View File

@ -4,7 +4,6 @@ from __future__ import annotations
import sys import sys
import traceback import traceback
import warnings
from importlib import import_module from importlib import import_module
from types import MethodType from types import MethodType
from typing import TYPE_CHECKING, Any, Callable, Iterator from typing import TYPE_CHECKING, Any, Callable, Iterator
@ -23,7 +22,6 @@ else:
from sphinx.builders import Builder from sphinx.builders import Builder
from sphinx.config import Config from sphinx.config import Config
from sphinx.deprecation import RemovedInSphinx70Warning
from sphinx.domains import Domain, Index, ObjType from sphinx.domains import Domain, Index, ObjType
from sphinx.domains.std import GenericObject, Target from sphinx.domains.std import GenericObject, Target
from sphinx.environment import BuildEnvironment from sphinx.environment import BuildEnvironment
@ -156,18 +154,7 @@ class SphinxComponentRegistry:
if name not in self.builders: if name not in self.builders:
raise SphinxError(__('Builder name %s not registered') % name) raise SphinxError(__('Builder name %s not registered') % name)
try: return self.builders[name](app, env)
return self.builders[name](app, env)
except TypeError:
warnings.warn(
f"The custom builder {name} defines a custom __init__ method without the "
f"'env'argument. Report this bug to the developers of your custom builder, "
f"this is likely not a issue with Sphinx. The 'env' argument will be required "
f"from Sphinx 7.", RemovedInSphinx70Warning, stacklevel=2)
builder = self.builders[name](app)
if env is not None:
builder.set_environment(env)
return builder
def add_domain(self, domain: type[Domain], override: bool = False) -> None: def add_domain(self, domain: type[Domain], override: bool = False) -> None:
logger.debug('[app] adding domain: %r', domain) logger.debug('[app] adding domain: %r', domain)