mirror of
https://github.com/sphinx-doc/sphinx.git
synced 2025-02-25 18:55:22 -06:00
Add SphinxFactory class to simplify application class
This commit is contained in:
parent
45887c7d62
commit
feaf2a793b
@ -26,19 +26,18 @@ from six.moves import cStringIO
|
|||||||
from docutils import nodes
|
from docutils import nodes
|
||||||
from docutils.parsers.rst import convert_directive_function, \
|
from docutils.parsers.rst import convert_directive_function, \
|
||||||
directives, roles
|
directives, roles
|
||||||
from pkg_resources import iter_entry_points
|
|
||||||
|
|
||||||
import sphinx
|
import sphinx
|
||||||
from sphinx import package_dir, locale
|
from sphinx import package_dir, locale
|
||||||
from sphinx.config import Config
|
from sphinx.config import Config
|
||||||
from sphinx.errors import SphinxError, ExtensionError, VersionRequirementError, \
|
from sphinx.errors import ConfigError, ExtensionError, VersionRequirementError
|
||||||
ConfigError
|
|
||||||
from sphinx.domains import ObjType
|
from sphinx.domains import ObjType
|
||||||
from sphinx.domains.std import GenericObject, Target, StandardDomain
|
from sphinx.domains.std import GenericObject, Target, StandardDomain
|
||||||
from sphinx.deprecation import RemovedInSphinx17Warning, RemovedInSphinx20Warning
|
from sphinx.deprecation import RemovedInSphinx17Warning, RemovedInSphinx20Warning
|
||||||
from sphinx.environment import BuildEnvironment
|
from sphinx.environment import BuildEnvironment
|
||||||
from sphinx.events import EventManager
|
from sphinx.events import EventManager
|
||||||
from sphinx.extension import load_extension, verify_required_extensions
|
from sphinx.extension import load_extension, verify_required_extensions
|
||||||
|
from sphinx.factory import SphinxFactory
|
||||||
from sphinx.io import SphinxStandaloneReader
|
from sphinx.io import SphinxStandaloneReader
|
||||||
from sphinx.locale import _
|
from sphinx.locale import _
|
||||||
from sphinx.roles import XRefRole
|
from sphinx.roles import XRefRole
|
||||||
@ -124,9 +123,9 @@ 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.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
|
||||||
|
self.factory = SphinxFactory()
|
||||||
self.enumerable_nodes = {} # type: Dict[nodes.Node, Tuple[unicode, Callable]] # NOQA
|
self.enumerable_nodes = {} # type: Dict[nodes.Node, Tuple[unicode, Callable]] # NOQA
|
||||||
self.post_transforms = [] # type: List[Transform]
|
self.post_transforms = [] # type: List[Transform]
|
||||||
self.html_themes = {} # type: Dict[unicode, unicode]
|
self.html_themes = {} # type: Dict[unicode, unicode]
|
||||||
@ -301,28 +300,17 @@ class Sphinx(object):
|
|||||||
logger.info(_('failed: %s'), err)
|
logger.info(_('failed: %s'), err)
|
||||||
self._init_env(freshenv=True)
|
self._init_env(freshenv=True)
|
||||||
|
|
||||||
def preload_builder(self, buildername):
|
def preload_builder(self, name):
|
||||||
# type: (unicode) -> None
|
# type: (unicode) -> None
|
||||||
if buildername is None:
|
self.factory.preload_builder(self, name)
|
||||||
return
|
|
||||||
|
|
||||||
if buildername not in self.builderclasses:
|
def create_builder(self, name):
|
||||||
entry_points = iter_entry_points('sphinx.builders', buildername)
|
|
||||||
try:
|
|
||||||
entry_point = next(entry_points)
|
|
||||||
except StopIteration:
|
|
||||||
raise SphinxError(_('Builder name %s not registered or available'
|
|
||||||
' through entry point') % buildername)
|
|
||||||
load_extension(self, entry_point.module_name)
|
|
||||||
|
|
||||||
def create_builder(self, buildername):
|
|
||||||
# type: (unicode) -> Builder
|
# type: (unicode) -> Builder
|
||||||
if buildername is None:
|
if name is None:
|
||||||
buildername = 'html'
|
logger.info(_('No builder selected, using default: html'))
|
||||||
if buildername not in self.builderclasses:
|
name = 'html'
|
||||||
raise SphinxError(_('Builder name %s not registered') % buildername)
|
|
||||||
|
|
||||||
return self.builderclasses[buildername](self)
|
return self.factory.create_builder(self, name)
|
||||||
|
|
||||||
def _init_builder(self):
|
def _init_builder(self):
|
||||||
# type: () -> None
|
# type: () -> None
|
||||||
@ -516,13 +504,7 @@ class Sphinx(object):
|
|||||||
def add_builder(self, builder):
|
def add_builder(self, builder):
|
||||||
# type: (Type[Builder]) -> None
|
# type: (Type[Builder]) -> None
|
||||||
logger.debug('[app] adding builder: %r', builder)
|
logger.debug('[app] adding builder: %r', builder)
|
||||||
if not hasattr(builder, 'name'):
|
self.factory.add_builder(builder)
|
||||||
raise ExtensionError(_('Builder class %s has no "name" attribute')
|
|
||||||
% builder)
|
|
||||||
if builder.name in self.builderclasses:
|
|
||||||
raise ExtensionError(_('Builder %r already exists (in module %s)') %
|
|
||||||
(builder.name, self.builderclasses[builder.name].__module__))
|
|
||||||
self.builderclasses[builder.name] = builder
|
|
||||||
|
|
||||||
def add_config_value(self, name, default, rebuild, types=()):
|
def add_config_value(self, name, default, rebuild, types=()):
|
||||||
# type: (unicode, Any, Union[bool, unicode], Any) -> None
|
# type: (unicode, Any, Union[bool, unicode], Any) -> None
|
||||||
|
59
sphinx/factory.py
Normal file
59
sphinx/factory.py
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""
|
||||||
|
sphinx.factory
|
||||||
|
~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Sphinx component factory.
|
||||||
|
|
||||||
|
Gracefully adapted from the TextPress system by Armin.
|
||||||
|
|
||||||
|
:copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS.
|
||||||
|
:license: BSD, see LICENSE for details.
|
||||||
|
"""
|
||||||
|
from __future__ import print_function
|
||||||
|
from pkg_resources import iter_entry_points
|
||||||
|
|
||||||
|
from sphinx.errors import ExtensionError, SphinxError
|
||||||
|
from sphinx.extension import load_extension
|
||||||
|
from sphinx.locale import _
|
||||||
|
|
||||||
|
if False:
|
||||||
|
# For type annotation
|
||||||
|
from typing import Dict, Type # NOQA
|
||||||
|
from sphinx.application import Sphinx # NOQA
|
||||||
|
from sphinx.builders import Builder # NOQA
|
||||||
|
|
||||||
|
|
||||||
|
class SphinxFactory(object):
|
||||||
|
def __init__(self):
|
||||||
|
self.builders = {} # type: Dict[unicode, Type[Builder]]
|
||||||
|
|
||||||
|
def add_builder(self, builder):
|
||||||
|
# type: (Type[Builder]) -> None
|
||||||
|
if not hasattr(builder, 'name'):
|
||||||
|
raise ExtensionError(_('Builder class %s has no "name" attribute') % builder)
|
||||||
|
if builder.name in self.builders:
|
||||||
|
raise ExtensionError(_('Builder %r already exists (in module %s)') %
|
||||||
|
(builder.name, self.builders[builder.name].__module__))
|
||||||
|
self.builders[builder.name] = builder
|
||||||
|
|
||||||
|
def preload_builder(self, app, name):
|
||||||
|
# type: (Sphinx, unicode) -> None
|
||||||
|
if name is None:
|
||||||
|
return
|
||||||
|
|
||||||
|
if name not in self.builders:
|
||||||
|
entry_points = iter_entry_points('sphinx.builders', name)
|
||||||
|
try:
|
||||||
|
entry_point = next(entry_points)
|
||||||
|
except StopIteration:
|
||||||
|
raise SphinxError(_('Builder name %s not registered or available'
|
||||||
|
' through entry point') % name)
|
||||||
|
load_extension(app, entry_point.module_name)
|
||||||
|
|
||||||
|
def create_builder(self, app, name):
|
||||||
|
# type: (Sphinx, unicode) -> Builder
|
||||||
|
if name not in self.builders:
|
||||||
|
raise SphinxError(_('Builder name %s not registered') % name)
|
||||||
|
|
||||||
|
return self.builders[name](app)
|
Loading…
Reference in New Issue
Block a user