summaryrefslogtreecommitdiff
path: root/sphinx/registry.py
diff options
context:
space:
mode:
Diffstat (limited to 'sphinx/registry.py')
-rw-r--r--sphinx/registry.py99
1 files changed, 51 insertions, 48 deletions
diff --git a/sphinx/registry.py b/sphinx/registry.py
index c6a249e74..cdf77cb67 100644
--- a/sphinx/registry.py
+++ b/sphinx/registry.py
@@ -9,9 +9,11 @@
"""
import traceback
+import warnings
from importlib import import_module
from types import MethodType
-from typing import Any, Callable, Dict, Iterator, List, Tuple, Union
+from typing import (TYPE_CHECKING, Any, Callable, Dict, Iterator, List, Optional, Tuple, Type,
+ Union)
from docutils import nodes
from docutils.io import Input
@@ -23,6 +25,7 @@ from pkg_resources import iter_entry_points
from sphinx.builders import Builder
from sphinx.config import Config
+from sphinx.deprecation import RemovedInSphinx60Warning
from sphinx.domains import Domain, Index, ObjType
from sphinx.domains.std import GenericObject, Target
from sphinx.environment import BuildEnvironment
@@ -35,10 +38,7 @@ from sphinx.util import logging
from sphinx.util.logging import prefixed_warnings
from sphinx.util.typing import RoleFunction, TitleGetter
-if False:
- # For type annotation
- from typing import Type # for python3.5.1
-
+if TYPE_CHECKING:
from sphinx.application import Sphinx
from sphinx.ext.autodoc import Documenter
@@ -54,76 +54,76 @@ EXTENSION_BLACKLIST = {
class SphinxComponentRegistry:
def __init__(self) -> None:
#: special attrgetter for autodoc; class object -> attrgetter
- self.autodoc_attrgettrs = {} # type: Dict[Type, Callable[[Any, str, Any], Any]]
+ self.autodoc_attrgettrs: Dict[Type, Callable[[Any, str, Any], Any]] = {}
#: builders; a dict of builder name -> bulider class
- self.builders = {} # type: Dict[str, Type[Builder]]
+ self.builders: Dict[str, Type[Builder]] = {}
#: autodoc documenters; a dict of documenter name -> documenter class
- self.documenters = {} # type: Dict[str, Type[Documenter]]
+ self.documenters: Dict[str, Type[Documenter]] = {}
#: css_files; a list of tuple of filename and attributes
- self.css_files = [] # type: List[Tuple[str, Dict[str, Any]]]
+ self.css_files: List[Tuple[str, Dict[str, Any]]] = []
#: domains; a dict of domain name -> domain class
- self.domains = {} # type: Dict[str, Type[Domain]]
+ self.domains: Dict[str, Type[Domain]] = {}
#: additional directives for domains
#: a dict of domain name -> dict of directive name -> directive
- self.domain_directives = {} # type: Dict[str, Dict[str, Any]]
+ self.domain_directives: Dict[str, Dict[str, Any]] = {}
#: additional indices for domains
#: a dict of domain name -> list of index class
- self.domain_indices = {} # type: Dict[str, List[Type[Index]]]
+ self.domain_indices: 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[str, Dict[str, ObjType]]
+ self.domain_object_types: 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[str, Dict[str, Union[RoleFunction, XRefRole]]] # NOQA
+ self.domain_roles: Dict[str, Dict[str, Union[RoleFunction, XRefRole]]] = {}
#: additional enumerable nodes
#: a dict of node class -> tuple of figtype and title_getter function
- self.enumerable_nodes = {} # type: Dict[Type[Node], Tuple[str, TitleGetter]]
+ self.enumerable_nodes: Dict[Type[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[str, Tuple[Callable, Callable]]
- self.html_block_math_renderers = {} # type: Dict[str, Tuple[Callable, Callable]]
+ self.html_inline_math_renderers: Dict[str, Tuple[Callable, Callable]] = {}
+ self.html_block_math_renderers: Dict[str, Tuple[Callable, Callable]] = {}
#: js_files; list of JS paths or URLs
- self.js_files = [] # type: List[Tuple[str, Dict[str, Any]]]
+ self.js_files: List[Tuple[str, Dict[str, Any]]] = []
#: LaTeX packages; list of package names and its options
- self.latex_packages = [] # type: List[Tuple[str, str]]
+ self.latex_packages: List[Tuple[str, str]] = []
- self.latex_packages_after_hyperref = [] # type: List[Tuple[str, str]]
+ self.latex_packages_after_hyperref: List[Tuple[str, str]] = []
#: post transforms; list of transforms
- self.post_transforms = [] # type: List[Type[Transform]]
+ self.post_transforms: List[Type[Transform]] = []
#: source paresrs; file type -> parser class
- self.source_parsers = {} # type: Dict[str, Type[Parser]]
+ self.source_parsers: Dict[str, Type[Parser]] = {}
#: source inputs; file type -> input class
- self.source_inputs = {} # type: Dict[str, Type[Input]]
+ self.source_inputs: Dict[str, Type[Input]] = {}
#: source suffix: suffix -> file type
- self.source_suffix = {} # type: Dict[str, str]
+ self.source_suffix: Dict[str, str] = {}
#: custom translators; builder name -> translator class
- self.translators = {} # type: Dict[str, Type[nodes.NodeVisitor]]
+ self.translators: 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[str, Dict[str, Tuple[Callable, Callable]]]
+ self.translation_handlers: Dict[str, Dict[str, Tuple[Callable, Callable]]] = {}
#: additional transforms; list of transforms
- self.transforms = [] # type: List[Type[Transform]]
+ self.transforms: List[Type[Transform]] = []
- def add_builder(self, builder: "Type[Builder]", override: bool = False) -> None:
+ def add_builder(self, builder: Type[Builder], override: bool = False) -> None:
logger.debug('[app] adding builder: %r', builder)
if not hasattr(builder, 'name'):
raise ExtensionError(__('Builder class %s has no "name" attribute') % builder)
@@ -152,7 +152,7 @@ class SphinxComponentRegistry:
return self.builders[name](app)
- def add_domain(self, domain: "Type[Domain]", override: bool = False) -> None:
+ def add_domain(self, domain: Type[Domain], override: bool = False) -> None:
logger.debug('[app] adding domain: %r', domain)
if domain.name in self.domains and not override:
raise ExtensionError(__('domain %s already registered') % domain.name)
@@ -175,7 +175,7 @@ class SphinxComponentRegistry:
yield domain
def add_directive_to_domain(self, domain: str, name: str,
- cls: "Type[Directive]", override: bool = False) -> None:
+ cls: Type[Directive], override: bool = False) -> None:
logger.debug('[app] adding directive to domain: %r', (domain, name, cls))
if domain not in self.domains:
raise ExtensionError(__('domain %s not yet registered') % domain)
@@ -198,7 +198,7 @@ class SphinxComponentRegistry:
(name, domain))
roles[name] = role
- def add_index_to_domain(self, domain: str, index: "Type[Index]",
+ def add_index_to_domain(self, domain: str, index: Type[Index],
override: bool = False) -> None:
logger.debug('[app] adding index to domain: %r', (domain, index))
if domain not in self.domains:
@@ -210,7 +210,7 @@ class SphinxComponentRegistry:
indices.append(index)
def add_object_type(self, directivename: str, rolename: str, indextemplate: str = '',
- parse_node: Callable = None, ref_nodeclass: "Type[TextElement]" = None,
+ parse_node: Callable = None, ref_nodeclass: Type[TextElement] = None,
objname: str = '', doc_field_types: List = [], override: bool = False
) -> None:
logger.debug('[app] adding object type: %r',
@@ -234,7 +234,7 @@ class SphinxComponentRegistry:
object_types[directivename] = ObjType(objname or directivename, rolename)
def add_crossref_type(self, directivename: str, rolename: str, indextemplate: str = '',
- ref_nodeclass: "Type[TextElement]" = None, objname: str = '',
+ ref_nodeclass: Type[TextElement] = None, objname: str = '',
override: bool = False) -> None:
logger.debug('[app] adding crossref type: %r',
(directivename, rolename, indextemplate, ref_nodeclass, objname))
@@ -260,7 +260,7 @@ class SphinxComponentRegistry:
else:
self.source_suffix[suffix] = filetype
- def add_source_parser(self, parser: "Type[Parser]", override: bool = False) -> None:
+ def add_source_parser(self, parser: Type[Parser], override: bool = False) -> None:
logger.debug('[app] adding search source_parser: %r', parser)
# create a map from filetype to parser
@@ -271,13 +271,13 @@ class SphinxComponentRegistry:
else:
self.source_parsers[filetype] = parser
- def get_source_parser(self, filetype: str) -> "Type[Parser]":
+ def get_source_parser(self, filetype: str) -> Type[Parser]:
try:
return self.source_parsers[filetype]
except KeyError as exc:
raise SphinxError(__('Source parser for %s not registered') % filetype) from exc
- def get_source_parsers(self) -> Dict[str, "Type[Parser]"]:
+ def get_source_parsers(self) -> Dict[str, Type[Parser]]:
return self.source_parsers
def create_source_parser(self, app: "Sphinx", filename: str) -> Parser:
@@ -287,7 +287,10 @@ class SphinxComponentRegistry:
parser.set_application(app)
return parser
- def get_source_input(self, filetype: str) -> "Type[Input]":
+ def get_source_input(self, filetype: str) -> Optional[Type[Input]]:
+ warnings.warn('SphinxComponentRegistry.get_source_input() is deprecated.',
+ RemovedInSphinx60Warning)
+
try:
return self.source_inputs[filetype]
except KeyError:
@@ -297,14 +300,14 @@ class SphinxComponentRegistry:
except KeyError:
return None
- def add_translator(self, name: str, translator: "Type[nodes.NodeVisitor]",
+ def add_translator(self, name: str, translator: Type[nodes.NodeVisitor],
override: bool = False) -> 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: "Type[Element]",
+ def add_translation_handlers(self, node: Type[Element],
**kwargs: Tuple[Callable, Callable]) -> None:
logger.debug('[app] adding translation_handlers: %r, %r', node, kwargs)
for builder_name, handlers in kwargs.items():
@@ -318,7 +321,7 @@ class SphinxComponentRegistry:
'function tuple: %r=%r') % (builder_name, handlers)
) from exc
- def get_translator_class(self, builder: Builder) -> "Type[nodes.NodeVisitor]":
+ def get_translator_class(self, builder: Builder) -> Type[nodes.NodeVisitor]:
return self.translators.get(builder.name,
builder.default_translator_class)
@@ -340,24 +343,24 @@ class SphinxComponentRegistry:
return translator
- def add_transform(self, transform: "Type[Transform]") -> None:
+ def add_transform(self, transform: Type[Transform]) -> None:
logger.debug('[app] adding transform: %r', transform)
self.transforms.append(transform)
- def get_transforms(self) -> List["Type[Transform]"]:
+ def get_transforms(self) -> List[Type[Transform]]:
return self.transforms
- def add_post_transform(self, transform: "Type[Transform]") -> None:
+ def add_post_transform(self, transform: Type[Transform]) -> None:
logger.debug('[app] adding post transform: %r', transform)
self.post_transforms.append(transform)
- def get_post_transforms(self) -> List["Type[Transform]"]:
+ def get_post_transforms(self) -> List[Type[Transform]]:
return self.post_transforms
- def add_documenter(self, objtype: str, documenter: "Type[Documenter]") -> None:
+ def add_documenter(self, objtype: str, documenter: Type["Documenter"]) -> None:
self.documenters[objtype] = documenter
- def add_autodoc_attrgetter(self, typ: "Type",
+ def add_autodoc_attrgetter(self, typ: Type,
attrgetter: Callable[[Any, str, Any], Any]) -> None:
self.autodoc_attrgettrs[typ] = attrgetter
@@ -382,7 +385,7 @@ class SphinxComponentRegistry:
else:
self.latex_packages.append((name, options))
- def add_enumerable_node(self, node: "Type[Node]", figtype: str,
+ def add_enumerable_node(self, node: Type[Node], figtype: str,
title_getter: TitleGetter = None, override: bool = False) -> None:
logger.debug('[app] adding enumerable node: (%r, %r, %r)', node, figtype, title_getter)
if node in self.enumerable_nodes and not override:
@@ -424,7 +427,7 @@ class SphinxComponentRegistry:
if setup is None:
logger.warning(__('extension %r has no setup() function; is it really '
'a Sphinx extension module?'), extname)
- metadata = {} # type: Dict[str, Any]
+ metadata: Dict[str, Any] = {}
else:
try:
metadata = setup(app)