Migrate to py3 style type annotation: sphinx.domains.math

This commit is contained in:
Takeshi KOMIYA 2019-06-29 23:56:40 +09:00
parent f6d0cb8f3a
commit f5620910fc

View File

@ -9,13 +9,17 @@
""" """
import warnings import warnings
from typing import Any, Dict, Iterable, List, Tuple
from docutils import nodes from docutils import nodes
from docutils.nodes import Element, Node, system_message
from docutils.nodes import make_id from docutils.nodes import make_id
from sphinx.addnodes import math_block as displaymath from sphinx.addnodes import math_block as displaymath
from sphinx.addnodes import pending_xref
from sphinx.deprecation import RemovedInSphinx40Warning from sphinx.deprecation import RemovedInSphinx40Warning
from sphinx.domains import Domain from sphinx.domains import Domain
from sphinx.environment import BuildEnvironment
from sphinx.locale import __ from sphinx.locale import __
from sphinx.roles import XRefRole from sphinx.roles import XRefRole
from sphinx.util import logging from sphinx.util import logging
@ -23,18 +27,16 @@ from sphinx.util.nodes import make_refnode
if False: if False:
# For type annotation # For type annotation
from typing import Any, Dict, Iterable, List, Tuple # NOQA from sphinx.application import Sphinx
from sphinx import addnodes # NOQA from sphinx.builders import Builder
from sphinx.application import Sphinx # NOQA
from sphinx.builders import Builder # NOQA
from sphinx.environment import BuildEnvironment # NOQA
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class MathReferenceRole(XRefRole): class MathReferenceRole(XRefRole):
def result_nodes(self, document, env, node, is_ref): def result_nodes(self, document: nodes.document, env: BuildEnvironment, node: Element,
# type: (nodes.document, BuildEnvironment, nodes.Element, bool) -> Tuple[List[nodes.Node], List[nodes.system_message]] # NOQA is_ref: bool) -> Tuple[List[Node], List[system_message]]:
node['refdomain'] = 'math' node['refdomain'] = 'math'
return [node], [] return [node], []
@ -60,12 +62,10 @@ class MathDomain(Domain):
} }
@property @property
def equations(self): def equations(self) -> Dict[str, Tuple[str, int]]:
# type: () -> Dict[str, Tuple[str, int]]
return self.data.setdefault('objects', {}) # labelid -> (docname, eqno) return self.data.setdefault('objects', {}) # labelid -> (docname, eqno)
def note_equation(self, docname, labelid, location=None): def note_equation(self, docname: str, labelid: str, location: Any = None) -> None:
# type: (str, str, Any) -> None
if labelid in self.equations: if labelid in self.equations:
other = self.equations[labelid][0] other = self.equations[labelid][0]
logger.warning(__('duplicate label of equation %s, other instance in %s') % logger.warning(__('duplicate label of equation %s, other instance in %s') %
@ -73,31 +73,27 @@ class MathDomain(Domain):
self.equations[labelid] = (docname, self.env.new_serialno('eqno') + 1) self.equations[labelid] = (docname, self.env.new_serialno('eqno') + 1)
def get_equation_number_for(self, labelid): def get_equation_number_for(self, labelid: str) -> int:
# type: (str) -> int
if labelid in self.equations: if labelid in self.equations:
return self.equations[labelid][1] return self.equations[labelid][1]
else: else:
return None return None
def process_doc(self, env, docname, document): def process_doc(self, env: BuildEnvironment, docname: str,
# type: (BuildEnvironment, str, nodes.document) -> None document: nodes.document) -> None:
def math_node(node): def math_node(node: Node) -> bool:
# type: (nodes.Node) -> bool
return isinstance(node, (nodes.math, nodes.math_block)) return isinstance(node, (nodes.math, nodes.math_block))
self.data['has_equations'][docname] = any(document.traverse(math_node)) self.data['has_equations'][docname] = any(document.traverse(math_node))
def clear_doc(self, docname): def clear_doc(self, docname: str) -> None:
# type: (str) -> None
for equation_id, (doc, eqno) in list(self.equations.items()): for equation_id, (doc, eqno) in list(self.equations.items()):
if doc == docname: if doc == docname:
del self.equations[equation_id] del self.equations[equation_id]
self.data['has_equations'].pop(docname, None) self.data['has_equations'].pop(docname, None)
def merge_domaindata(self, docnames, otherdata): def merge_domaindata(self, docnames: Iterable[str], otherdata: Dict) -> None:
# type: (Iterable[str], Dict) -> None
for labelid, (doc, eqno) in otherdata['objects'].items(): for labelid, (doc, eqno) in otherdata['objects'].items():
if doc in docnames: if doc in docnames:
self.equations[labelid] = (doc, eqno) self.equations[labelid] = (doc, eqno)
@ -105,8 +101,9 @@ class MathDomain(Domain):
for docname in docnames: for docname in docnames:
self.data['has_equations'][docname] = otherdata['has_equations'][docname] self.data['has_equations'][docname] = otherdata['has_equations'][docname]
def resolve_xref(self, env, fromdocname, builder, typ, target, node, contnode): def resolve_xref(self, env: BuildEnvironment, fromdocname: str, builder: "Builder",
# type: (BuildEnvironment, str, Builder, str, str, addnodes.pending_xref, nodes.Element) -> nodes.Element # NOQA typ: str, target: str, node: pending_xref, contnode: Element
) -> Element:
assert typ in ('eq', 'numref') assert typ in ('eq', 'numref')
docname, number = self.equations.get(target, (None, None)) docname, number = self.equations.get(target, (None, None))
if docname: if docname:
@ -133,20 +130,19 @@ class MathDomain(Domain):
else: else:
return None return None
def resolve_any_xref(self, env, fromdocname, builder, target, node, contnode): def resolve_any_xref(self, env: BuildEnvironment, fromdocname: str, builder: "Builder",
# type: (BuildEnvironment, str, Builder, str, addnodes.pending_xref, nodes.Element) -> List[Tuple[str, nodes.Element]] # NOQA target: str, node: pending_xref, contnode: Element
) -> List[Tuple[str, Element]]:
refnode = self.resolve_xref(env, fromdocname, builder, 'eq', target, node, contnode) refnode = self.resolve_xref(env, fromdocname, builder, 'eq', target, node, contnode)
if refnode is None: if refnode is None:
return [] return []
else: else:
return [('eq', refnode)] return [('eq', refnode)]
def get_objects(self): def get_objects(self) -> List:
# type: () -> List
return [] return []
def add_equation(self, env, docname, labelid): def add_equation(self, env: BuildEnvironment, docname: str, labelid: str) -> int:
# type: (BuildEnvironment, str, str) -> int
warnings.warn('MathDomain.add_equation() is deprecated.', warnings.warn('MathDomain.add_equation() is deprecated.',
RemovedInSphinx40Warning) RemovedInSphinx40Warning)
if labelid in self.equations: if labelid in self.equations:
@ -158,20 +154,17 @@ class MathDomain(Domain):
self.equations[labelid] = (docname, eqno) self.equations[labelid] = (docname, eqno)
return eqno return eqno
def get_next_equation_number(self, docname): def get_next_equation_number(self, docname: str) -> int:
# type: (str) -> int
warnings.warn('MathDomain.get_next_equation_number() is deprecated.', warnings.warn('MathDomain.get_next_equation_number() is deprecated.',
RemovedInSphinx40Warning) RemovedInSphinx40Warning)
targets = [eq for eq in self.equations.values() if eq[0] == docname] targets = [eq for eq in self.equations.values() if eq[0] == docname]
return len(targets) + 1 return len(targets) + 1
def has_equations(self): def has_equations(self) -> bool:
# type: () -> bool
return any(self.data['has_equations'].values()) return any(self.data['has_equations'].values())
def setup(app): def setup(app: "Sphinx") -> Dict[str, Any]:
# type: (Sphinx) -> Dict[str, Any]
app.add_domain(MathDomain) app.add_domain(MathDomain)
app.add_role('eq', MathReferenceRole(warn_dangling=True)) app.add_role('eq', MathReferenceRole(warn_dangling=True))