Add docutils-stubs to test deps

This commit is contained in:
Takeshi KOMIYA
2018-12-04 01:52:07 +09:00
parent 53917f228f
commit 9dfc5e7efe
16 changed files with 42 additions and 39 deletions

View File

@@ -46,6 +46,7 @@ extras_require = {
'flake8>=3.5.0', 'flake8>=3.5.0',
'flake8-import-order', 'flake8-import-order',
'mypy>=0.470', 'mypy>=0.470',
'docutils-stubs',
], ],
} }

View File

@@ -83,7 +83,7 @@ class Catalog:
if msg not in self.metadata: # faster lookup in hash if msg not in self.metadata: # faster lookup in hash
self.messages.append(msg) self.messages.append(msg)
self.metadata[msg] = [] self.metadata[msg] = []
self.metadata[msg].append((origin.source, origin.line, origin.uid)) self.metadata[msg].append((origin.source, origin.line, origin.uid)) # type: ignore
class MsgOrigin: class MsgOrigin:

View File

@@ -62,10 +62,10 @@ class Meta(html.Meta, SphinxDirective):
meta = node.details['nodes'][0] meta = node.details['nodes'][0]
meta.source = self.env.doc2path(self.env.docname) meta.source = self.env.doc2path(self.env.docname)
meta.line = self.lineno meta.line = self.lineno
meta.rawcontent = meta['content'] meta.rawcontent = meta['content'] # type: ignore
# docutils' meta nodes aren't picklable because the class is nested # docutils' meta nodes aren't picklable because the class is nested
meta.__class__ = addnodes.meta meta.__class__ = addnodes.meta # type: ignore
return result return result

View File

@@ -152,7 +152,7 @@ class PyXrefMixin:
delims_re = re.compile(delims) delims_re = re.compile(delims)
sub_targets = re.split(delims, target) sub_targets = re.split(delims, target)
split_contnode = bool(contnode and contnode.astext() == target) split_contnode = bool(contnode and contnode.astext() == target) # type: ignore
results = [] results = []
for sub_target in filter(None, sub_targets): for sub_target in filter(None, sub_targets):

View File

@@ -246,8 +246,8 @@ class TocTree:
caption_node.rawsource = toctree['rawcaption'] caption_node.rawsource = toctree['rawcaption']
if hasattr(toctree, 'uid'): if hasattr(toctree, 'uid'):
# move uid to caption_node to translate it # move uid to caption_node to translate it
caption_node.uid = toctree.uid caption_node.uid = toctree.uid # type: ignore
del toctree.uid del toctree.uid # type: ignore
newnode += caption_node newnode += caption_node
newnode.extend(tocentries) newnode.extend(tocentries)
newnode['toctree'] = True newnode['toctree'] = True

View File

@@ -114,7 +114,7 @@ class AutodocDirective(SphinxDirective):
reporter = self.state.document.reporter reporter = self.state.document.reporter
try: try:
source, lineno = reporter.get_source_and_line(self.lineno) source, lineno = reporter.get_source_and_line(self.lineno) # type: ignore
except AttributeError: except AttributeError:
source, lineno = (None, None) source, lineno = (None, None)
logger.debug('[autodoc] %s:%s: input:\n%s', source, lineno, self.block_text) logger.debug('[autodoc] %s:%s: input:\n%s', source, lineno, self.block_text)

View File

@@ -233,7 +233,7 @@ class SphinxRSTFileInput(SphinxBaseFileInput):
for lineno, line in enumerate(epilog.splitlines()): for lineno, line in enumerate(epilog.splitlines()):
text.append(line, '<rst_epilog>', lineno) text.append(line, '<rst_epilog>', lineno)
def read(self): def read(self): # type: ignore
# type: () -> StringList # type: () -> StringList
warnings.warn('SphinxRSTFileInput is deprecated.', warnings.warn('SphinxRSTFileInput is deprecated.',
RemovedInSphinx30Warning, stacklevel=2) RemovedInSphinx30Warning, stacklevel=2)
@@ -284,7 +284,7 @@ def read_doc(app, env, filename):
filetype = get_filetype(app.config.source_suffix, filename) filetype = get_filetype(app.config.source_suffix, filename)
input_class = app.registry.get_source_input(filetype) input_class = app.registry.get_source_input(filetype)
reader = SphinxStandaloneReader(app) reader = SphinxStandaloneReader(app)
source = input_class(app, env, source=None, source_path=filename, source = input_class(app, env, source=None, source_path=filename, # type: ignore
encoding=env.config.source_encoding) encoding=env.config.source_encoding)
parser = app.registry.create_source_parser(app, filetype) parser = app.registry.create_source_parser(app, filetype)
if parser.__class__.__name__ == 'CommonMarkParser' and parser.settings_spec == (): if parser.__class__.__name__ == 'CommonMarkParser' and parser.settings_spec == ():
@@ -295,7 +295,7 @@ def read_doc(app, env, filename):
# CommonMarkParser. # CommonMarkParser.
parser.settings_spec = RSTParser.settings_spec parser.settings_spec = RSTParser.settings_spec
pub = Publisher(reader=reader, pub = Publisher(reader=reader, # type: ignore
parser=parser, parser=parser,
writer=SphinxDummyWriter(), writer=SphinxDummyWriter(),
source_class=SphinxDummySourceClass, source_class=SphinxDummySourceClass,

View File

@@ -76,7 +76,7 @@ class RSTParser(docutils.parsers.rst.Parser, Parser):
def parse(self, inputstring, document): def parse(self, inputstring, document):
# type: (Union[str, StringList], nodes.document) -> None # type: (Union[str, StringList], nodes.document) -> None
"""Parse text and generate a document tree.""" """Parse text and generate a document tree."""
self.setup_parse(inputstring, document) self.setup_parse(inputstring, document) # type: ignore
self.statemachine = states.RSTStateMachine( self.statemachine = states.RSTStateMachine(
state_classes=self.state_classes, state_classes=self.state_classes,
initial_state=self.initial_state, initial_state=self.initial_state,

View File

@@ -133,8 +133,8 @@ class SphinxTestApp(application.Sphinx):
warningiserror = False warningiserror = False
self._saved_path = sys.path[:] self._saved_path = sys.path[:]
self._saved_directives = directives._directives.copy() self._saved_directives = directives._directives.copy() # type: ignore
self._saved_roles = roles._roles.copy() self._saved_roles = roles._roles.copy() # type: ignore
self._saved_nodeclasses = set(v for v in dir(nodes.GenericNodeVisitor) self._saved_nodeclasses = set(v for v in dir(nodes.GenericNodeVisitor)
if v.startswith('visit_')) if v.startswith('visit_'))
@@ -154,8 +154,8 @@ class SphinxTestApp(application.Sphinx):
locale.translators.clear() locale.translators.clear()
sys.path[:] = self._saved_path sys.path[:] = self._saved_path
sys.modules.pop('autodoc_fodder', None) sys.modules.pop('autodoc_fodder', None)
directives._directives = self._saved_directives directives._directives = self._saved_directives # type: ignore
roles._roles = self._saved_roles roles._roles = self._saved_roles # type: ignore
for method in dir(nodes.GenericNodeVisitor): for method in dir(nodes.GenericNodeVisitor):
if method.startswith('visit_') and \ if method.startswith('visit_') and \
method not in self._saved_nodeclasses: method not in self._saved_nodeclasses:

View File

@@ -63,7 +63,7 @@ def publish_msgstr(app, source, source_path, source_line, config, settings):
settings=settings, settings=settings,
) )
try: try:
doc = doc[0] doc = doc[0] # type: ignore
except IndexError: # empty node except IndexError: # empty node
pass pass
return doc return doc

View File

@@ -18,6 +18,7 @@ from contextlib import contextmanager
from copy import copy from copy import copy
from distutils.version import LooseVersion from distutils.version import LooseVersion
from os import path from os import path
from typing import IO, cast
import docutils import docutils
from docutils import nodes from docutils import nodes
@@ -55,13 +56,13 @@ def docutils_namespace():
# type: () -> Generator[None, None, None] # type: () -> Generator[None, None, None]
"""Create namespace for reST parsers.""" """Create namespace for reST parsers."""
try: try:
_directives = copy(directives._directives) _directives = copy(directives._directives) # type: ignore
_roles = copy(roles._roles) _roles = copy(roles._roles) # type: ignore
yield yield
finally: finally:
directives._directives = _directives directives._directives = _directives # type: ignore
roles._roles = _roles roles._roles = _roles # type: ignore
for node in list(additional_nodes): for node in list(additional_nodes):
unregister_node(node) unregister_node(node)
@@ -71,7 +72,7 @@ def docutils_namespace():
def is_directive_registered(name): def is_directive_registered(name):
# type: (unicode) -> bool # type: (unicode) -> bool
"""Check the *name* directive is already registered.""" """Check the *name* directive is already registered."""
return name in directives._directives return name in directives._directives # type: ignore
def register_directive(name, directive): def register_directive(name, directive):
@@ -87,7 +88,7 @@ def register_directive(name, directive):
def is_role_registered(name): def is_role_registered(name):
# type: (unicode) -> bool # type: (unicode) -> bool
"""Check the *name* role is already registered.""" """Check the *name* role is already registered."""
return name in roles._roles return name in roles._roles # type: ignore
def register_role(name, role): def register_role(name, role):
@@ -103,7 +104,7 @@ def register_role(name, role):
def unregister_role(name): def unregister_role(name):
# type: (unicode) -> None # type: (unicode) -> None
"""Unregister a role from docutils.""" """Unregister a role from docutils."""
roles._roles.pop(name, None) roles._roles.pop(name, None) # type: ignore
def is_node_registered(node): def is_node_registered(node):
@@ -120,7 +121,7 @@ def register_node(node):
inside ``docutils_namespace()`` to prevent side-effects. inside ``docutils_namespace()`` to prevent side-effects.
""" """
if not hasattr(nodes.GenericNodeVisitor, 'visit_' + node.__name__): if not hasattr(nodes.GenericNodeVisitor, 'visit_' + node.__name__):
nodes._add_node_class_names([node.__name__]) nodes._add_node_class_names([node.__name__]) # type: ignore
additional_nodes.add(node) additional_nodes.add(node)
@@ -211,8 +212,8 @@ class sphinx_domains:
self.directive_func = directives.directive self.directive_func = directives.directive
self.role_func = roles.role self.role_func = roles.role
directives.directive = self.lookup_directive directives.directive = self.lookup_directive # type: ignore
roles.role = self.lookup_role roles.role = self.lookup_role # type: ignore
def disable(self): def disable(self):
# type: () -> None # type: () -> None
@@ -287,7 +288,7 @@ class LoggingReporter(Reporter):
halt_level=Reporter.SEVERE_LEVEL, debug=False, halt_level=Reporter.SEVERE_LEVEL, debug=False,
error_handler='backslashreplace'): error_handler='backslashreplace'):
# type: (unicode, int, int, bool, unicode) -> None # type: (unicode, int, int, bool, unicode) -> None
stream = WarningStream() stream = cast(IO, WarningStream())
super(LoggingReporter, self).__init__(source, report_level, halt_level, super(LoggingReporter, self).__init__(source, report_level, halt_level,
stream, debug, error_handler=error_handler) stream, debug, error_handler=error_handler)
@@ -329,17 +330,17 @@ def switch_source_input(state, content):
"""Switch current source input of state temporarily.""" """Switch current source input of state temporarily."""
try: try:
# remember the original ``get_source_and_line()`` method # remember the original ``get_source_and_line()`` method
get_source_and_line = state.memo.reporter.get_source_and_line get_source_and_line = state.memo.reporter.get_source_and_line # type: ignore
# replace it by new one # replace it by new one
state_machine = StateMachine([], None) state_machine = StateMachine([], None)
state_machine.input_lines = content state_machine.input_lines = content
state.memo.reporter.get_source_and_line = state_machine.get_source_and_line state.memo.reporter.get_source_and_line = state_machine.get_source_and_line # type: ignore # NOQA
yield yield
finally: finally:
# restore the method # restore the method
state.memo.reporter.get_source_and_line = get_source_and_line state.memo.reporter.get_source_and_line = get_source_and_line # type: ignore
class SphinxFileOutput(FileOutput): class SphinxFileOutput(FileOutput):

View File

@@ -451,7 +451,7 @@ def set_source_info(directive, node):
def set_role_source_info(inliner, lineno, node): def set_role_source_info(inliner, lineno, node):
# type: (Inliner, int, nodes.Node) -> None # type: (Inliner, int, nodes.Node) -> None
node.source, node.line = inliner.reporter.get_source_and_line(lineno) node.source, node.line = inliner.reporter.get_source_and_line(lineno) # type: ignore
NON_SMARTQUOTABLE_PARENT_NODES = ( NON_SMARTQUOTABLE_PARENT_NODES = (
@@ -510,4 +510,4 @@ def _new_copy(self):
return newnode return newnode
nodes.Element.copy = _new_copy nodes.Element.copy = _new_copy # type: ignore

View File

@@ -281,7 +281,7 @@ class HTMLTranslator(SphinxTranslator, BaseTranslator):
self.depart_reference(node) self.depart_reference(node)
# overwritten -- we don't want source comments to show up in the HTML # overwritten -- we don't want source comments to show up in the HTML
def visit_comment(self, node): def visit_comment(self, node): # type: ignore
# type: (nodes.Element) -> None # type: (nodes.Element) -> None
raise nodes.SkipNode raise nodes.SkipNode
@@ -840,7 +840,7 @@ class HTMLTranslator(SphinxTranslator, BaseTranslator):
else: else:
node['classes'].append('row-odd') node['classes'].append('row-odd')
self.body.append(self.starttag(node, 'tr', '')) self.body.append(self.starttag(node, 'tr', ''))
node.column = 0 node.column = 0 # type: ignore
def visit_entry(self, node): def visit_entry(self, node):
# type: (nodes.Element) -> None # type: (nodes.Element) -> None

View File

@@ -250,7 +250,7 @@ class HTML5Translator(SphinxTranslator, BaseTranslator):
self.depart_reference(node) self.depart_reference(node)
# overwritten -- we don't want source comments to show up in the HTML # overwritten -- we don't want source comments to show up in the HTML
def visit_comment(self, node): def visit_comment(self, node): # type: ignore
# type: (nodes.Element) -> None # type: (nodes.Element) -> None
raise nodes.SkipNode raise nodes.SkipNode
@@ -791,7 +791,7 @@ class HTML5Translator(SphinxTranslator, BaseTranslator):
else: else:
node['classes'].append('row-odd') node['classes'].append('row-odd')
self.body.append(self.starttag(node, 'tr', '')) self.body.append(self.starttag(node, 'tr', ''))
node.column = 0 node.column = 0 # type: ignore
def visit_field_list(self, node): def visit_field_list(self, node):
# type: (nodes.Element) -> None # type: (nodes.Element) -> None

View File

@@ -116,7 +116,7 @@ class ManualPageTranslator(SphinxTranslator, BaseTranslator):
# Overwrite admonition label translations with our own # Overwrite admonition label translations with our own
for label, translation in admonitionlabels.items(): for label, translation in admonitionlabels.items():
self.language.labels[label] = self.deunicode(translation) self.language.labels[label] = self.deunicode(translation) # type: ignore
# overwritten -- added quotes around all .TH arguments # overwritten -- added quotes around all .TH arguments
def header(self): def header(self):
@@ -253,7 +253,7 @@ class ManualPageTranslator(SphinxTranslator, BaseTranslator):
super(ManualPageTranslator, self).visit_term(node) super(ManualPageTranslator, self).visit_term(node)
# overwritten -- we don't want source comments to show up # overwritten -- we don't want source comments to show up
def visit_comment(self, node): def visit_comment(self, node): # type: ignore
# type: (nodes.Element) -> None # type: (nodes.Element) -> None
raise nodes.SkipNode raise nodes.SkipNode
@@ -333,7 +333,7 @@ class ManualPageTranslator(SphinxTranslator, BaseTranslator):
self.body.append(self.defs['reference'][0]) self.body.append(self.defs['reference'][0])
# avoid repeating escaping code... fine since # avoid repeating escaping code... fine since
# visit_Text calls astext() and only works on that afterwards # visit_Text calls astext() and only works on that afterwards
self.visit_Text(node) self.visit_Text(node) # type: ignore
self.body.append(self.defs['reference'][1]) self.body.append(self.defs['reference'][1])
uri = node.get('refuri', '') uri = node.get('refuri', '')

View File

@@ -55,6 +55,7 @@ description =
Run type checks. Run type checks.
deps = deps =
mypy mypy
docutils-stubs
commands= commands=
mypy sphinx/ mypy sphinx/