Create an instance of builder before initialize env

This commit is contained in:
Takeshi KOMIYA 2017-03-19 23:16:37 +09:00
parent d4d106e7b7
commit cd3f48bb76
4 changed files with 31 additions and 15 deletions

View File

@ -122,7 +122,6 @@ class Sphinx(object):
self._additional_source_parsers = {} # type: Dict[unicode, Parser] self._additional_source_parsers = {} # type: Dict[unicode, Parser]
self._setting_up_extension = ['?'] # type: List[unicode] self._setting_up_extension = ['?'] # type: List[unicode]
self.domains = {} # type: Dict[unicode, Type[Domain]] self.domains = {} # type: Dict[unicode, Type[Domain]]
self.buildername = buildername
self.builderclasses = {} # type: Dict[unicode, Type[Builder]] self.builderclasses = {} # type: Dict[unicode, Type[Builder]]
self.builder = None # type: Builder self.builder = None # type: Builder
self.env = None # type: BuildEnvironment self.env = None # type: BuildEnvironment
@ -241,6 +240,8 @@ class Sphinx(object):
logger.warning(_('primary_domain %r not found, ignored.'), logger.warning(_('primary_domain %r not found, ignored.'),
self.config.primary_domain) self.config.primary_domain)
# create the builder
self.builder = self.create_builder(buildername)
# check all configuration values for permissible types # check all configuration values for permissible types
self.config.check_types() self.config.check_types()
# set up source_parsers # set up source_parsers
@ -248,7 +249,7 @@ class Sphinx(object):
# set up the build environment # set up the build environment
self._init_env(freshenv) self._init_env(freshenv)
# set up the builder # set up the builder
self._init_builder(self.buildername) self._init_builder()
# set up the enumerable nodes # set up the enumerable nodes
self._init_enumerable_nodes() self._init_enumerable_nodes()
@ -290,7 +291,7 @@ class Sphinx(object):
# type: (bool) -> None # type: (bool) -> None
if freshenv: if freshenv:
self.env = BuildEnvironment(self) 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(): for domain in self.domains.keys():
self.env.domains[domain] = self.domains[domain](self.env) self.env.domains[domain] = self.domains[domain](self.env)
else: else:
@ -310,8 +311,8 @@ class Sphinx(object):
logger.info(_('failed: %s'), err) logger.info(_('failed: %s'), err)
self._init_env(freshenv=True) self._init_env(freshenv=True)
def _init_builder(self, buildername): def create_builder(self, buildername):
# type: (unicode) -> None # type: (unicode) -> Builder
if buildername is None: if buildername is None:
logger.info(_('No builder selected, using default: html')) logger.info(_('No builder selected, using default: html'))
buildername = 'html' buildername = 'html'
@ -319,7 +320,12 @@ class Sphinx(object):
raise SphinxError(_('Builder name %s not registered') % buildername) raise SphinxError(_('Builder name %s not registered') % buildername)
builderclass = self.builderclasses[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') self.emit('builder-inited')
def _init_enumerable_nodes(self): def _init_enumerable_nodes(self):
@ -327,6 +333,12 @@ class Sphinx(object):
for node, settings in iteritems(self.enumerable_nodes): for node, settings in iteritems(self.enumerable_nodes):
self.env.get_domain('std').enumerable_nodes[node] = settings # type: ignore 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 ------------------------------------------------- # ---- main "build" method -------------------------------------------------
def build(self, force_all=False, filenames=None): def build(self, force_all=False, filenames=None):

View File

@ -60,9 +60,6 @@ class Builder(object):
def __init__(self, app): def __init__(self, app):
# type: (Sphinx) -> None # 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.srcdir = app.srcdir
self.confdir = app.confdir self.confdir = app.confdir
self.outdir = app.outdir self.outdir = app.outdir
@ -71,6 +68,7 @@ class Builder(object):
os.makedirs(self.doctreedir) os.makedirs(self.doctreedir)
self.app = app # type: Sphinx self.app = app # type: Sphinx
self.env = None # type: BuildEnvironment
self.warn = app.warn # type: Callable self.warn = app.warn # type: Callable
self.info = app.info # type: Callable self.info = app.info # type: Callable
self.config = app.config # type: Config self.config = app.config # type: Config
@ -97,7 +95,12 @@ class Builder(object):
# load default translator class # load default translator class
self.translator_class = app._translators.get(self.name) 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 # helper methods
def init(self): def init(self):

View File

@ -114,14 +114,11 @@ class I18nBuilder(Builder):
versioning_method = 'text' versioning_method = 'text'
versioning_compare = None # be set by `gettext_uuid` 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): def init(self):
# type: () -> None # type: () -> None
Builder.init(self) Builder.init(self)
self.env.set_versioning_method(self.versioning_method,
self.env.config.gettext_uuid)
self.tags = I18nTags() self.tags = I18nTags()
self.catalogs = defaultdict(Catalog) # type: defaultdict[unicode, Catalog] self.catalogs = defaultdict(Catalog) # type: defaultdict[unicode, Catalog]

View File

@ -45,6 +45,8 @@ def test_images():
tree = env.get_doctree('images') tree = env.get_doctree('images')
htmlbuilder = StandaloneHTMLBuilder(app) htmlbuilder = StandaloneHTMLBuilder(app)
htmlbuilder.set_environment(app.env)
htmlbuilder.init()
htmlbuilder.imgpath = 'dummy' htmlbuilder.imgpath = 'dummy'
htmlbuilder.post_process_images(tree) htmlbuilder.post_process_images(tree)
assert set(htmlbuilder.images.keys()) == \ assert set(htmlbuilder.images.keys()) == \
@ -54,6 +56,8 @@ def test_images():
set(['img.png', 'img1.png', 'simg.png', 'svgimg.svg', 'img.foo.png']) set(['img.png', 'img1.png', 'simg.png', 'svgimg.svg', 'img.foo.png'])
latexbuilder = LaTeXBuilder(app) latexbuilder = LaTeXBuilder(app)
latexbuilder.set_environment(app.env)
latexbuilder.init()
latexbuilder.post_process_images(tree) latexbuilder.post_process_images(tree)
assert set(latexbuilder.images.keys()) == \ assert set(latexbuilder.images.keys()) == \
set(['subdir/img.png', 'subdir/simg.png', 'img.png', 'img.pdf', set(['subdir/img.png', 'subdir/simg.png', 'img.png', 'img.pdf',