Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make the env argument to Builder subclasses required #11379

Merged
merged 2 commits into from Apr 28, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGES
Expand Up @@ -23,6 +23,7 @@ Incompatible changes
* #11373: Removed deprecated ``sphinx.util.get_matching_files()`` function.
* #11378: Remove deprecated ``sphinx.util.docutils.is_html5_writer_available()``
function.
* #11379: Make the ``env`` argument to ``Builder`` subclasses required.

Deprecated
----------
Expand Down
2 changes: 0 additions & 2 deletions sphinx/application.py
Expand Up @@ -335,8 +335,6 @@ def create_builder(self, name: str) -> Builder:
return self.registry.create_builder(self, name, self.env)

def _init_builder(self) -> None:
if not hasattr(self.builder, "env"):
self.builder.set_environment(self.env)
self.builder.init()
self.events.emit('builder-inited')

Expand Down
25 changes: 4 additions & 21 deletions sphinx/builders/__init__.py
Expand Up @@ -5,7 +5,6 @@
import codecs
import pickle
import time
import warnings
from os import path
from typing import TYPE_CHECKING, Any, Iterable, Sequence

Expand All @@ -14,7 +13,6 @@
from docutils.utils import DependencyList

from sphinx.config import Config
from sphinx.deprecation import RemovedInSphinx70Warning
from sphinx.environment import CONFIG_CHANGED_REASON, CONFIG_OK, BuildEnvironment
from sphinx.environment.adapters.asset import ImageAdapter
from sphinx.errors import SphinxError
Expand Down Expand Up @@ -79,23 +77,17 @@ class Builder:
#: The builder supports data URIs or not.
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.confdir = app.confdir
self.outdir = app.outdir
self.doctreedir = app.doctreedir
ensuredir(self.doctreedir)

self.app: Sphinx = app
if env is not None:
self.env: BuildEnvironment = env
self.env.set_versioning_method(self.versioning_method,
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.env: BuildEnvironment = env
self.env.set_versioning_method(self.versioning_method,
self.versioning_compare)
self.events: EventManager = app.events
self.config: Config = app.config
self.tags: Tags = app.tags
Expand All @@ -115,15 +107,6 @@ def __init__(self, app: Sphinx, env: BuildEnvironment = None) -> None:
self.parallel_ok = False
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]:
"""Return a class of translator."""
return self.app.registry.get_translator_class(self)
Expand Down
15 changes: 1 addition & 14 deletions sphinx/registry.py
Expand Up @@ -4,7 +4,6 @@

import sys
import traceback
import warnings
from importlib import import_module
from types import MethodType
from typing import TYPE_CHECKING, Any, Callable, Iterator
Expand All @@ -23,7 +22,6 @@

from sphinx.builders import Builder
from sphinx.config import Config
from sphinx.deprecation import RemovedInSphinx70Warning
from sphinx.domains import Domain, Index, ObjType
from sphinx.domains.std import GenericObject, Target
from sphinx.environment import BuildEnvironment
Expand Down Expand Up @@ -156,18 +154,7 @@ def create_builder(self, app: Sphinx, name: str,
if name not in self.builders:
raise SphinxError(__('Builder name %s not registered') % name)

try:
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
return self.builders[name](app, env)

def add_domain(self, domain: type[Domain], override: bool = False) -> None:
logger.debug('[app] adding domain: %r', domain)
Expand Down