diff --git a/sphinx/application.py b/sphinx/application.py index d05a399cb..638bcdf49 100644 --- a/sphinx/application.py +++ b/sphinx/application.py @@ -122,7 +122,6 @@ class Sphinx(object): self._additional_source_parsers = {} # type: Dict[unicode, Parser] self._setting_up_extension = ['?'] # type: List[unicode] self.domains = {} # type: Dict[unicode, Type[Domain]] - self.buildername = buildername self.builderclasses = {} # type: Dict[unicode, Type[Builder]] self.builder = None # type: Builder self.env = None # type: BuildEnvironment @@ -241,6 +240,8 @@ class Sphinx(object): logger.warning(_('primary_domain %r not found, ignored.'), self.config.primary_domain) + # create the builder + self.builder = self.create_builder(buildername) # check all configuration values for permissible types self.config.check_types() # set up source_parsers @@ -248,7 +249,7 @@ class Sphinx(object): # set up the build environment self._init_env(freshenv) # set up the builder - self._init_builder(self.buildername) + self._init_builder() # set up the enumerable nodes self._init_enumerable_nodes() @@ -290,7 +291,7 @@ class Sphinx(object): # type: (bool) -> None if freshenv: self.env = BuildEnvironment(self) - self.env.find_files(self.config, self.buildername) + self.env.find_files(self.config, self.builder.name) for domain in self.domains.keys(): self.env.domains[domain] = self.domains[domain](self.env) else: @@ -310,8 +311,8 @@ class Sphinx(object): logger.info(_('failed: %s'), err) self._init_env(freshenv=True) - def _init_builder(self, buildername): - # type: (unicode) -> None + def create_builder(self, buildername): + # type: (unicode) -> Builder if buildername is None: logger.info(_('No builder selected, using default: html')) buildername = 'html' @@ -319,7 +320,12 @@ class Sphinx(object): raise SphinxError(_('Builder name %s not registered') % buildername) builderclass = self.builderclasses[buildername] - self.builder = builderclass(self) + return builderclass(self) + + def _init_builder(self): + # type: () -> None + self.builder.set_environment(self.env) + self.builder.init() self.emit('builder-inited') def _init_enumerable_nodes(self): @@ -327,6 +333,12 @@ class Sphinx(object): for node, settings in iteritems(self.enumerable_nodes): self.env.get_domain('std').enumerable_nodes[node] = settings # type: ignore + @property + def buildername(self): + # type: () -> unicode + warnings.warn('app.buildername is deprecated.', RemovedInSphinx17Warning) + return self.builder.name + # ---- main "build" method ------------------------------------------------- def build(self, force_all=False, filenames=None): diff --git a/sphinx/builders/__init__.py b/sphinx/builders/__init__.py index 2b7964022..171246162 100644 --- a/sphinx/builders/__init__.py +++ b/sphinx/builders/__init__.py @@ -60,9 +60,6 @@ class Builder(object): def __init__(self, app): # type: (Sphinx) -> None - self.env = app.env # type: BuildEnvironment - self.env.set_versioning_method(self.versioning_method, - self.versioning_compare) self.srcdir = app.srcdir self.confdir = app.confdir self.outdir = app.outdir @@ -71,6 +68,7 @@ class Builder(object): os.makedirs(self.doctreedir) self.app = app # type: Sphinx + self.env = None # type: BuildEnvironment self.warn = app.warn # type: Callable self.info = app.info # type: Callable self.config = app.config # type: Config @@ -97,7 +95,12 @@ class Builder(object): # load default translator class self.translator_class = app._translators.get(self.name) - self.init() + def set_environment(self, env): + # type: (BuildEnvironment) -> None + """Store BuildEnvironment object.""" + self.env = env + self.env.set_versioning_method(self.versioning_method, + self.versioning_compare) # helper methods def init(self): diff --git a/sphinx/builders/gettext.py b/sphinx/builders/gettext.py index a1eb5bae4..f63288a99 100644 --- a/sphinx/builders/gettext.py +++ b/sphinx/builders/gettext.py @@ -114,14 +114,11 @@ class I18nBuilder(Builder): versioning_method = 'text' versioning_compare = None # be set by `gettext_uuid` - def __init__(self, app): - # type: (Sphinx) -> None - self.versioning_compare = app.env.config.gettext_uuid - super(I18nBuilder, self).__init__(app) - def init(self): # type: () -> None Builder.init(self) + self.env.set_versioning_method(self.versioning_method, + self.env.config.gettext_uuid) self.tags = I18nTags() self.catalogs = defaultdict(Catalog) # type: defaultdict[unicode, Catalog] diff --git a/tests/test_environment.py b/tests/test_environment.py index f638bd1e4..8cfd26e1a 100644 --- a/tests/test_environment.py +++ b/tests/test_environment.py @@ -45,6 +45,8 @@ def test_images(): tree = env.get_doctree('images') htmlbuilder = StandaloneHTMLBuilder(app) + htmlbuilder.set_environment(app.env) + htmlbuilder.init() htmlbuilder.imgpath = 'dummy' htmlbuilder.post_process_images(tree) assert set(htmlbuilder.images.keys()) == \ @@ -54,6 +56,8 @@ def test_images(): set(['img.png', 'img1.png', 'simg.png', 'svgimg.svg', 'img.foo.png']) latexbuilder = LaTeXBuilder(app) + latexbuilder.set_environment(app.env) + latexbuilder.init() latexbuilder.post_process_images(tree) assert set(latexbuilder.images.keys()) == \ set(['subdir/img.png', 'subdir/simg.png', 'img.png', 'img.pdf',