summaryrefslogtreecommitdiff
path: root/sphinx/registry.py
diff options
context:
space:
mode:
Diffstat (limited to 'sphinx/registry.py')
-rw-r--r--sphinx/registry.py182
1 files changed, 91 insertions, 91 deletions
diff --git a/sphinx/registry.py b/sphinx/registry.py
index 4fd808f04..311270ccb 100644
--- a/sphinx/registry.py
+++ b/sphinx/registry.py
@@ -1,4 +1,3 @@
-# -*- coding: utf-8 -*-
"""
sphinx.registry
~~~~~~~~~~~~~~~
@@ -8,7 +7,6 @@
:copyright: Copyright 2007-2016 by the Sphinx team, see AUTHORS.
:license: BSD, see LICENSE for details.
"""
-from __future__ import print_function
import traceback
import warnings
@@ -17,7 +15,6 @@ from types import MethodType
from docutils.parsers.rst import Directive
from pkg_resources import iter_entry_points
-from six import iteritems, itervalues
from sphinx.deprecation import RemovedInSphinx30Warning
from sphinx.domains import ObjType
@@ -29,6 +26,7 @@ from sphinx.parsers import Parser as SphinxParser
from sphinx.roles import XRefRole
from sphinx.util import logging
from sphinx.util.docutils import directive_helper
+from sphinx.util.logging import prefixed_warnings
if False:
# For type annotation
@@ -43,6 +41,7 @@ if False:
from sphinx.domains import Domain, Index # NOQA
from sphinx.environment import BuildEnvironment # NOQA
from sphinx.ext.autodoc import Documenter # NOQA
+ from sphinx.io import SphinxFileInput # NOQA
from sphinx.util.typing import RoleFunction, TitleGetter # NOQA
logger = logging.getLogger(__name__)
@@ -51,76 +50,76 @@ logger = logging.getLogger(__name__)
# Values are Sphinx version that merge the extension.
EXTENSION_BLACKLIST = {
"sphinxjp.themecore": "1.2"
-} # type: Dict[unicode, unicode]
+}
-class SphinxComponentRegistry(object):
+class SphinxComponentRegistry:
def __init__(self):
# type: () -> None
#: special attrgetter for autodoc; class object -> attrgetter
- self.autodoc_attrgettrs = {} # type: Dict[Type, Callable[[Any, unicode, Any], Any]]
+ self.autodoc_attrgettrs = {} # type: Dict[Type, Callable[[Any, str, Any], Any]]
#: builders; a dict of builder name -> bulider class
- self.builders = {} # type: Dict[unicode, Type[Builder]]
+ self.builders = {} # type: Dict[str, Type[Builder]]
#: autodoc documenters; a dict of documenter name -> documenter class
- self.documenters = {} # type: Dict[unicode, Type[Documenter]]
+ self.documenters = {} # type: Dict[str, Type[Documenter]]
#: css_files; a list of tuple of filename and attributes
- self.css_files = [] # type: List[Tuple[unicode, Dict[unicode, unicode]]]
+ self.css_files = [] # type: List[Tuple[str, Dict[str, str]]]
#: domains; a dict of domain name -> domain class
- self.domains = {} # type: Dict[unicode, Type[Domain]]
+ self.domains = {} # type: Dict[str, Type[Domain]]
#: additional directives for domains
#: a dict of domain name -> dict of directive name -> directive
- self.domain_directives = {} # type: Dict[unicode, Dict[unicode, Any]]
+ self.domain_directives = {} # type: Dict[str, Dict[str, Any]]
#: additional indices for domains
#: a dict of domain name -> list of index class
- self.domain_indices = {} # type: Dict[unicode, List[Type[Index]]]
+ self.domain_indices = {} # type: Dict[str, List[Type[Index]]]
#: additional object types for domains
#: a dict of domain name -> dict of objtype name -> objtype
- self.domain_object_types = {} # type: Dict[unicode, Dict[unicode, ObjType]]
+ self.domain_object_types = {} # type: Dict[str, Dict[str, ObjType]]
#: additional roles for domains
#: a dict of domain name -> dict of role name -> role impl.
- self.domain_roles = {} # type: Dict[unicode, Dict[unicode, Union[RoleFunction, XRefRole]]] # NOQA
+ self.domain_roles = {} # type: Dict[str, Dict[str, Union[RoleFunction, XRefRole]]] # NOQA
#: additional enumerable nodes
#: a dict of node class -> tuple of figtype and title_getter function
- self.enumerable_nodes = {} # type: Dict[nodes.Node, Tuple[unicode, TitleGetter]]
+ self.enumerable_nodes = {} # type: Dict[Type[nodes.Node], Tuple[str, TitleGetter]]
#: HTML inline and block math renderers
#: a dict of name -> tuple of visit function and depart function
- self.html_inline_math_renderers = {} # type: Dict[unicode, Tuple[Callable, Callable]] # NOQA
- self.html_block_math_renderers = {} # type: Dict[unicode, Tuple[Callable, Callable]] # NOQA
+ self.html_inline_math_renderers = {} # type: Dict[str, Tuple[Callable, Callable]]
+ self.html_block_math_renderers = {} # type: Dict[str, Tuple[Callable, Callable]]
#: js_files; list of JS paths or URLs
- self.js_files = [] # type: List[Tuple[unicode, Dict[unicode, unicode]]]
+ self.js_files = [] # type: List[Tuple[str, Dict[str, str]]]
#: LaTeX packages; list of package names and its options
- self.latex_packages = [] # type: List[Tuple[unicode, unicode]]
+ self.latex_packages = [] # type: List[Tuple[str, str]]
#: post transforms; list of transforms
self.post_transforms = [] # type: List[Type[Transform]]
#: source paresrs; file type -> parser class
- self.source_parsers = {} # type: Dict[unicode, Type[Parser]]
+ self.source_parsers = {} # type: Dict[str, Type[Parser]]
#: source inputs; file type -> input class
- self.source_inputs = {} # type: Dict[unicode, Input]
+ self.source_inputs = {} # type: Dict[str, Type[Input]]
#: source suffix: suffix -> file type
- self.source_suffix = {} # type: Dict[unicode, unicode]
+ self.source_suffix = {} # type: Dict[str, str]
#: custom translators; builder name -> translator class
- self.translators = {} # type: Dict[unicode, nodes.NodeVisitor]
+ self.translators = {} # type: Dict[str, Type[nodes.NodeVisitor]]
#: custom handlers for translators
#: a dict of builder name -> dict of node name -> visitor and departure functions
- self.translation_handlers = {} # type: Dict[unicode, Dict[unicode, Tuple[Callable, Callable]]] # NOQA
+ self.translation_handlers = {} # type: Dict[str, Dict[str, Tuple[Callable, Callable]]]
#: additional transforms; list of transforms
self.transforms = [] # type: List[Type[Transform]]
@@ -136,7 +135,7 @@ class SphinxComponentRegistry(object):
self.builders[builder.name] = builder
def preload_builder(self, app, name):
- # type: (Sphinx, unicode) -> None
+ # type: (Sphinx, str) -> None
if name is None:
return
@@ -151,7 +150,7 @@ class SphinxComponentRegistry(object):
self.load_extension(app, entry_point.module_name)
def create_builder(self, app, name):
- # type: (Sphinx, unicode) -> Builder
+ # type: (Sphinx, str) -> Builder
if name not in self.builders:
raise SphinxError(__('Builder name %s not registered') % name)
@@ -165,19 +164,19 @@ class SphinxComponentRegistry(object):
self.domains[domain.name] = domain
def has_domain(self, domain):
- # type: (unicode) -> bool
+ # type: (str) -> bool
return domain in self.domains
def create_domains(self, env):
# type: (BuildEnvironment) -> Iterator[Domain]
- for DomainClass in itervalues(self.domains):
+ for DomainClass in self.domains.values():
domain = DomainClass(env)
# transplant components added by extensions
domain.directives.update(self.domain_directives.get(domain.name, {}))
domain.roles.update(self.domain_roles.get(domain.name, {}))
domain.indices.extend(self.domain_indices.get(domain.name, []))
- for name, objtype in iteritems(self.domain_object_types.get(domain.name, {})):
+ for name, objtype in self.domain_object_types.get(domain.name, {}).items():
domain.add_object_type(name, objtype)
yield domain
@@ -191,7 +190,7 @@ class SphinxComponentRegistry(object):
def add_directive_to_domain(self, domain, name, obj, has_content=None, argument_spec=None,
override=False, **option_spec):
- # type: (unicode, unicode, Any, bool, Any, bool, Any) -> None
+ # type: (str, str, Any, bool, Any, bool, Any) -> None
logger.debug('[app] adding directive to domain: %r',
(domain, name, obj, has_content, argument_spec, option_spec))
if domain not in self.domains:
@@ -207,7 +206,7 @@ class SphinxComponentRegistry(object):
directives[name] = obj
def add_role_to_domain(self, domain, name, role, override=False):
- # type: (unicode, unicode, Union[RoleFunction, XRefRole], bool) -> None
+ # type: (str, str, Union[RoleFunction, XRefRole], bool) -> None
logger.debug('[app] adding role to domain: %r', (domain, name, role))
if domain not in self.domains:
raise ExtensionError(__('domain %s not yet registered') % domain)
@@ -218,7 +217,7 @@ class SphinxComponentRegistry(object):
roles[name] = role
def add_index_to_domain(self, domain, index, override=False):
- # type: (unicode, Type[Index], bool) -> None
+ # type: (str, Type[Index], bool) -> None
logger.debug('[app] adding index to domain: %r', (domain, index))
if domain not in self.domains:
raise ExtensionError(__('domain %s not yet registered') % domain)
@@ -231,13 +230,13 @@ class SphinxComponentRegistry(object):
def add_object_type(self, directivename, rolename, indextemplate='',
parse_node=None, ref_nodeclass=None, objname='',
doc_field_types=[], override=False):
- # type: (unicode, unicode, unicode, Callable, nodes.Node, unicode, List, bool) -> None
+ # type: (str, str, str, Callable, Type[nodes.TextElement], str, List, bool) -> None
logger.debug('[app] adding object type: %r',
(directivename, rolename, indextemplate, parse_node,
ref_nodeclass, objname, doc_field_types))
# create a subclass of GenericObject as the new directive
- directive = type(directivename, # type: ignore
+ directive = type(directivename,
(GenericObject, object),
{'indextemplate': indextemplate,
'parse_node': staticmethod(parse_node),
@@ -254,12 +253,12 @@ class SphinxComponentRegistry(object):
def add_crossref_type(self, directivename, rolename, indextemplate='',
ref_nodeclass=None, objname='', override=False):
- # type: (unicode, unicode, unicode, nodes.Node, unicode, bool) -> None
+ # type: (str, str, str, Type[nodes.TextElement], str, bool) -> None
logger.debug('[app] adding crossref type: %r',
(directivename, rolename, indextemplate, ref_nodeclass, objname))
# create a subclass of Target as the new directive
- directive = type(directivename, # type: ignore
+ directive = type(directivename,
(Target, object),
{'indextemplate': indextemplate})
@@ -273,7 +272,7 @@ class SphinxComponentRegistry(object):
object_types[directivename] = ObjType(objname or directivename, rolename)
def add_source_suffix(self, suffix, filetype, override=False):
- # type: (unicode, unicode, bool) -> None
+ # type: (str, str, bool) -> None
logger.debug('[app] adding source_suffix: %r, %r', suffix, filetype)
if suffix in self.source_suffix and not override:
raise ExtensionError(__('source_suffix %r is already registered') % suffix)
@@ -285,7 +284,7 @@ class SphinxComponentRegistry(object):
logger.debug('[app] adding search source_parser: %r', args)
if len(args) == 1:
# new sytle arguments: (source_parser)
- suffix = None # type: unicode
+ suffix = None # type: str
parser = args[0] # type: Type[Parser]
else:
# old style arguments: (suffix, source_parser)
@@ -318,18 +317,18 @@ class SphinxComponentRegistry(object):
self.source_parsers[suffix] = parser
def get_source_parser(self, filetype):
- # type: (unicode) -> Type[Parser]
+ # type: (str) -> Type[Parser]
try:
return self.source_parsers[filetype]
except KeyError:
raise SphinxError(__('Source parser for %s not registered') % filetype)
def get_source_parsers(self):
- # type: () -> Dict[unicode, Parser]
+ # type: () -> Dict[str, Type[Parser]]
return self.source_parsers
def create_source_parser(self, app, filename):
- # type: (Sphinx, unicode) -> Parser
+ # type: (Sphinx, str) -> Parser
parser_class = self.get_source_parser(filename)
parser = parser_class()
if isinstance(parser, SphinxParser):
@@ -337,7 +336,9 @@ class SphinxComponentRegistry(object):
return parser
def add_source_input(self, input_class, override=False):
- # type: (Type[Input], bool) -> None
+ # type: (Type[SphinxFileInput], bool) -> None
+ warnings.warn('registry.source_input() is deprecated.',
+ RemovedInSphinx30Warning, stacklevel=2)
for filetype in input_class.supported:
if filetype in self.source_inputs and not override:
raise ExtensionError(__('source_input for %r is already registered') %
@@ -345,7 +346,7 @@ class SphinxComponentRegistry(object):
self.source_inputs[filetype] = input_class
def get_source_input(self, filetype):
- # type: (unicode) -> Type[Input]
+ # type: (str) -> Type[Input]
try:
return self.source_inputs[filetype]
except KeyError:
@@ -353,19 +354,19 @@ class SphinxComponentRegistry(object):
# use special source_input for unknown filetype
return self.source_inputs['*']
except KeyError:
- raise SphinxError(__('source_input for %s not registered') % filetype)
+ return None
def add_translator(self, name, translator, override=False):
- # type: (unicode, Type[nodes.NodeVisitor], bool) -> None
+ # type: (str, Type[nodes.NodeVisitor], bool) -> None
logger.debug('[app] Change of translator for the %s builder.' % name)
if name in self.translators and not override:
raise ExtensionError(__('Translator for %r already exists') % name)
self.translators[name] = translator
def add_translation_handlers(self, node, **kwargs):
- # type: (nodes.Node, Any) -> None
+ # type: (Type[nodes.Element], Any) -> None
logger.debug('[app] adding translation_handlers: %r, %r', node, kwargs)
- for builder_name, handlers in iteritems(kwargs):
+ for builder_name, handlers in kwargs.items():
translation_handlers = self.translation_handlers.setdefault(builder_name, {})
try:
visit, depart = handlers # unpack once for assertion
@@ -391,7 +392,7 @@ class SphinxComponentRegistry(object):
# retry with builder.format
handlers = self.translation_handlers.get(builder.format, {})
- for name, (visit, depart) in iteritems(handlers):
+ for name, (visit, depart) in handlers.items():
setattr(translator, 'visit_' + name, MethodType(visit, translator))
if depart:
setattr(translator, 'depart_' + name, MethodType(depart, translator))
@@ -417,35 +418,35 @@ class SphinxComponentRegistry(object):
return self.post_transforms
def add_documenter(self, objtype, documenter):
- # type: (unicode, Type[Documenter]) -> None
+ # type: (str, Type[Documenter]) -> None
self.documenters[objtype] = documenter
def add_autodoc_attrgetter(self, typ, attrgetter):
- # type: (Type, Callable[[Any, unicode, Any], Any]) -> None
+ # type: (Type, Callable[[Any, str, Any], Any]) -> None
self.autodoc_attrgettrs[typ] = attrgetter
def add_css_files(self, filename, **attributes):
self.css_files.append((filename, attributes))
def add_js_file(self, filename, **attributes):
- # type: (unicode, **unicode) -> None
+ # type: (str, **str) -> None
logger.debug('[app] adding js_file: %r, %r', filename, attributes)
- self.js_files.append((filename, attributes)) # type: ignore
+ self.js_files.append((filename, attributes))
def add_latex_package(self, name, options):
- # type: (unicode, unicode) -> None
+ # type: (str, str) -> None
logger.debug('[app] adding latex package: %r', name)
self.latex_packages.append((name, options))
def add_enumerable_node(self, node, figtype, title_getter=None, override=False):
- # type: (nodes.Node, unicode, TitleGetter, bool) -> None
+ # type: (Type[nodes.Node], str, TitleGetter, bool) -> None
logger.debug('[app] adding enumerable node: (%r, %r, %r)', node, figtype, title_getter)
if node in self.enumerable_nodes and not override:
raise ExtensionError(__('enumerable_node %r already registered') % node)
self.enumerable_nodes[node] = (figtype, title_getter)
def add_html_math_renderer(self, name, inline_renderers, block_renderers):
- # type: (unicode, Tuple[Callable, Callable], Tuple[Callable, Callable]) -> None
+ # type: (str, Tuple[Callable, Callable], Tuple[Callable, Callable]) -> None
logger.debug('[app] adding html_math_renderer: %s, %r, %r',
name, inline_renderers, block_renderers)
if name in self.html_inline_math_renderers:
@@ -455,7 +456,7 @@ class SphinxComponentRegistry(object):
self.html_block_math_renderers[name] = block_renderers
def load_extension(self, app, extname):
- # type: (Sphinx, unicode) -> None
+ # type: (Sphinx, str) -> None
"""Load a Sphinx extension."""
if extname in app.extensions: # alread loaded
return
@@ -466,42 +467,41 @@ class SphinxComponentRegistry(object):
return
# update loading context
- app._setting_up_extension.append(extname)
-
- try:
- mod = __import__(extname, None, None, ['setup'])
- except ImportError as err:
- logger.verbose(__('Original exception:\n') + traceback.format_exc())
- raise ExtensionError(__('Could not import extension %s') % extname, err)
-
- if not hasattr(mod, 'setup'):
- logger.warning(__('extension %r has no setup() function; is it really '
- 'a Sphinx extension module?'), extname)
- metadata = {} # type: Dict[unicode, Any]
- else:
+ prefix = __('while setting up extension %s:') % extname
+ with prefixed_warnings(prefix):
try:
- metadata = mod.setup(app)
- except VersionRequirementError as err:
- # add the extension name to the version required
- raise VersionRequirementError(
- __('The %s extension used by this project needs at least '
- 'Sphinx v%s; it therefore cannot be built with this '
- 'version.') % (extname, err)
- )
-
- if metadata is None:
- metadata = {}
- elif not isinstance(metadata, dict):
- logger.warning(__('extension %r returned an unsupported object from '
- 'its setup() function; it should return None or a '
- 'metadata dictionary'), extname)
- metadata = {}
-
- app.extensions[extname] = Extension(extname, mod, **metadata)
- app._setting_up_extension.pop()
+ mod = __import__(extname, None, None, ['setup'])
+ except ImportError as err:
+ logger.verbose(__('Original exception:\n') + traceback.format_exc())
+ raise ExtensionError(__('Could not import extension %s') % extname, err)
+
+ if not hasattr(mod, 'setup'):
+ logger.warning(__('extension %r has no setup() function; is it really '
+ 'a Sphinx extension module?'), extname)
+ metadata = {} # type: Dict[str, Any]
+ else:
+ try:
+ metadata = mod.setup(app)
+ except VersionRequirementError as err:
+ # add the extension name to the version required
+ raise VersionRequirementError(
+ __('The %s extension used by this project needs at least '
+ 'Sphinx v%s; it therefore cannot be built with this '
+ 'version.') % (extname, err)
+ )
+
+ if metadata is None:
+ metadata = {}
+ elif not isinstance(metadata, dict):
+ logger.warning(__('extension %r returned an unsupported object from '
+ 'its setup() function; it should return None or a '
+ 'metadata dictionary'), extname)
+ metadata = {}
+
+ app.extensions[extname] = Extension(extname, mod, **metadata)
def get_envversion(self, app):
- # type: (Sphinx) -> Dict[unicode, unicode]
+ # type: (Sphinx) -> Dict[str, str]
from sphinx.environment import ENV_VERSION
envversion = {ext.name: ext.metadata['env_version'] for ext in app.extensions.values()
if ext.metadata.get('env_version')}
@@ -512,7 +512,7 @@ class SphinxComponentRegistry(object):
def merge_source_suffix(app, config):
# type: (Sphinx, Config) -> None
"""Merge source_suffix which specified by user and added by extensions."""
- for suffix, filetype in iteritems(app.registry.source_suffix):
+ for suffix, filetype in app.registry.source_suffix.items():
if suffix not in app.config.source_suffix:
app.config.source_suffix[suffix] = filetype
elif app.config.source_suffix[suffix] is None:
@@ -525,7 +525,7 @@ def merge_source_suffix(app, config):
def setup(app):
- # type: (Sphinx) -> Dict[unicode, Any]
+ # type: (Sphinx) -> Dict[str, Any]
app.connect('config-inited', merge_source_suffix)
return {