Migrate to py3 style type annotation: sphinx.io

This commit is contained in:
Takeshi KOMIYA 2019-12-25 01:38:57 +09:00
parent 6e88d66543
commit 16d4ee2582

View File

@ -9,19 +9,25 @@
""" """
import codecs import codecs
import warnings import warnings
from typing import Any from typing import Any, List, Tuple
from typing import Type # for python3.5.1
from docutils import nodes
from docutils.core import Publisher from docutils.core import Publisher
from docutils.io import FileInput, NullOutput from docutils.frontend import Values
from docutils.io import FileInput, Input, NullOutput
from docutils.parsers import Parser
from docutils.parsers.rst import Parser as RSTParser from docutils.parsers.rst import Parser as RSTParser
from docutils.readers import standalone from docutils.readers import standalone
from docutils.statemachine import StringList, string2lines from docutils.statemachine import StringList, string2lines
from docutils.transforms import Transform
from docutils.transforms.references import DanglingReferences from docutils.transforms.references import DanglingReferences
from docutils.writers import UnfilteredWriter from docutils.writers import UnfilteredWriter
from sphinx.deprecation import ( from sphinx.deprecation import (
RemovedInSphinx30Warning, RemovedInSphinx40Warning, deprecated_alias RemovedInSphinx30Warning, RemovedInSphinx40Warning, deprecated_alias
) )
from sphinx.environment import BuildEnvironment
from sphinx.errors import FiletypeNotFoundError from sphinx.errors import FiletypeNotFoundError
from sphinx.transforms import ( from sphinx.transforms import (
AutoIndexUpgrader, DoctreeReadEvent, FigureAligner, SphinxTransformer AutoIndexUpgrader, DoctreeReadEvent, FigureAligner, SphinxTransformer
@ -38,15 +44,7 @@ from sphinx.versioning import UIDTransform
if False: if False:
# For type annotation # For type annotation
from typing import Dict, List, Tuple # NOQA from sphinx.application import Sphinx
from typing import Type # for python3.5.1
from docutils import nodes # NOQA
from docutils.frontend import Values # NOQA
from docutils.io import Input # NOQA
from docutils.parsers import Parser # NOQA
from docutils.transforms import Transform # NOQA
from sphinx.application import Sphinx # NOQA
from sphinx.environment import BuildEnvironment # NOQA
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -61,8 +59,7 @@ class SphinxBaseReader(standalone.Reader):
transforms = [] # type: List[Type[Transform]] transforms = [] # type: List[Type[Transform]]
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs) -> None:
# type: (Any, Any) -> None
from sphinx.application import Sphinx from sphinx.application import Sphinx
if len(args) > 0 and isinstance(args[0], Sphinx): if len(args) > 0 and isinstance(args[0], Sphinx):
self._app = args[0] self._app = args[0]
@ -72,26 +69,22 @@ class SphinxBaseReader(standalone.Reader):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
@property @property
def app(self): def app(self) -> "Sphinx":
# type: () -> Sphinx
warnings.warn('SphinxBaseReader.app is deprecated.', warnings.warn('SphinxBaseReader.app is deprecated.',
RemovedInSphinx40Warning, stacklevel=2) RemovedInSphinx40Warning, stacklevel=2)
return self._app return self._app
@property @property
def env(self): def env(self) -> BuildEnvironment:
# type: () -> BuildEnvironment
warnings.warn('SphinxBaseReader.env is deprecated.', warnings.warn('SphinxBaseReader.env is deprecated.',
RemovedInSphinx40Warning, stacklevel=2) RemovedInSphinx40Warning, stacklevel=2)
return self._env return self._env
def setup(self, app): def setup(self, app: "Sphinx") -> None:
# type: (Sphinx) -> None
self._app = app # hold application object only for compatibility self._app = app # hold application object only for compatibility
self._env = app.env self._env = app.env
def get_transforms(self): def get_transforms(self) -> List[Type[Transform]]:
# type: () -> List[Type[Transform]]
transforms = super().get_transforms() + self.transforms transforms = super().get_transforms() + self.transforms
# remove transforms which is not needed for Sphinx # remove transforms which is not needed for Sphinx
@ -102,8 +95,7 @@ class SphinxBaseReader(standalone.Reader):
return transforms return transforms
def new_document(self): def new_document(self) -> nodes.document:
# type: () -> nodes.document
"""Creates a new document object which having a special reporter object good """Creates a new document object which having a special reporter object good
for logging. for logging.
""" """
@ -125,13 +117,11 @@ class SphinxStandaloneReader(SphinxBaseReader):
A basic document reader for Sphinx. A basic document reader for Sphinx.
""" """
def setup(self, app): def setup(self, app: "Sphinx") -> None:
# type: (Sphinx) -> None
self.transforms = self.transforms + app.registry.get_transforms() self.transforms = self.transforms + app.registry.get_transforms()
super().setup(app) super().setup(app)
def read(self, source, parser, settings): def read(self, source: Input, parser: Parser, settings: Values) -> nodes.document:
# type: (Input, Parser, Values) -> nodes.document
self.source = source self.source = source
if not self.parser: if not self.parser:
self.parser = parser self.parser = parser
@ -140,8 +130,7 @@ class SphinxStandaloneReader(SphinxBaseReader):
self.parse() self.parse()
return self.document return self.document
def read_source(self, env): def read_source(self, env: BuildEnvironment) -> str:
# type: (BuildEnvironment) -> str
"""Read content from source and do post-process.""" """Read content from source and do post-process."""
content = self.source.read() content = self.source.read()
@ -160,8 +149,7 @@ class SphinxI18nReader(SphinxBaseReader):
Because the translated texts are partial and they don't have correct line numbers. Because the translated texts are partial and they don't have correct line numbers.
""" """
def setup(self, app): def setup(self, app: "Sphinx") -> None:
# type: (Sphinx) -> None
super().setup(app) super().setup(app)
self.transforms = self.transforms + app.registry.get_transforms() self.transforms = self.transforms + app.registry.get_transforms()
@ -172,15 +160,13 @@ class SphinxI18nReader(SphinxBaseReader):
if transform in self.transforms: if transform in self.transforms:
self.transforms.remove(transform) self.transforms.remove(transform)
def set_lineno_for_reporter(self, lineno): def set_lineno_for_reporter(self, lineno: int) -> None:
# type: (int) -> None
"""Stores the source line number of original text.""" """Stores the source line number of original text."""
warnings.warn('SphinxI18nReader.set_lineno_for_reporter() is deprecated.', warnings.warn('SphinxI18nReader.set_lineno_for_reporter() is deprecated.',
RemovedInSphinx30Warning, stacklevel=2) RemovedInSphinx30Warning, stacklevel=2)
@property @property
def line(self): def line(self) -> int:
# type: () -> int
warnings.warn('SphinxI18nReader.line is deprecated.', warnings.warn('SphinxI18nReader.line is deprecated.',
RemovedInSphinx30Warning, stacklevel=2) RemovedInSphinx30Warning, stacklevel=2)
return 0 return 0
@ -191,13 +177,11 @@ class SphinxDummyWriter(UnfilteredWriter):
supported = ('html',) # needed to keep "meta" nodes supported = ('html',) # needed to keep "meta" nodes
def translate(self): def translate(self) -> None:
# type: () -> None
pass pass
def SphinxDummySourceClass(source, *args, **kwargs): def SphinxDummySourceClass(source: Any, *args, **kwargs) -> Any:
# type: (Any, Any, Any) -> Any
"""Bypass source object as is to cheat Publisher.""" """Bypass source object as is to cheat Publisher."""
return source return source
@ -208,8 +192,7 @@ class SphinxBaseFileInput(FileInput):
It supports to replace unknown Unicode characters to '?'. It supports to replace unknown Unicode characters to '?'.
""" """
def __init__(self, app, env, *args, **kwds): def __init__(self, app: "Sphinx", env: BuildEnvironment, *args, **kwds) -> None:
# type: (Sphinx, BuildEnvironment, Any, Any) -> None
self.app = app self.app = app
self.env = env self.env = env
@ -219,8 +202,7 @@ class SphinxBaseFileInput(FileInput):
kwds['error_handler'] = 'sphinx' # py3: handle error on open. kwds['error_handler'] = 'sphinx' # py3: handle error on open.
super().__init__(*args, **kwds) super().__init__(*args, **kwds)
def warn_and_replace(self, error): def warn_and_replace(self, error: Any) -> Tuple:
# type: (Any) -> Tuple
return UnicodeDecodeErrorHandler(self.env.docname)(error) return UnicodeDecodeErrorHandler(self.env.docname)(error)
@ -228,8 +210,7 @@ class SphinxFileInput(FileInput):
"""A basic FileInput for Sphinx.""" """A basic FileInput for Sphinx."""
supported = ('*',) # RemovedInSphinx30Warning supported = ('*',) # RemovedInSphinx30Warning
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs) -> None:
# type: (Any, Any) -> None
kwargs['error_handler'] = 'sphinx' kwargs['error_handler'] = 'sphinx'
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
@ -250,8 +231,7 @@ class SphinxRSTFileInput(SphinxBaseFileInput):
""" """
supported = ('restructuredtext',) supported = ('restructuredtext',)
def prepend_prolog(self, text, prolog): def prepend_prolog(self, text: StringList, prolog: str) -> None:
# type: (StringList, str) -> None
docinfo = self.count_docinfo_lines(text) docinfo = self.count_docinfo_lines(text)
if docinfo: if docinfo:
# insert a blank line after docinfo # insert a blank line after docinfo
@ -264,15 +244,13 @@ class SphinxRSTFileInput(SphinxBaseFileInput):
text.insert(docinfo + lineno + 1, '', '<generated>', 0) text.insert(docinfo + lineno + 1, '', '<generated>', 0)
def append_epilog(self, text, epilog): def append_epilog(self, text: StringList, epilog: str) -> None:
# type: (StringList, str) -> None
# append a blank line and rst_epilog # append a blank line and rst_epilog
text.append('', '<generated>', 0) text.append('', '<generated>', 0)
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): # type: ignore def read(self) -> StringList: # type: ignore
# type: () -> StringList
inputstring = super().read() inputstring = super().read()
lines = string2lines(inputstring, convert_whitespace=True) lines = string2lines(inputstring, convert_whitespace=True)
content = StringList() content = StringList()
@ -284,8 +262,7 @@ class SphinxRSTFileInput(SphinxBaseFileInput):
return content return content
def count_docinfo_lines(self, content): def count_docinfo_lines(self, content: StringList) -> int:
# type: (StringList) -> int
if len(content) == 0: if len(content) == 0:
return 0 return 0
else: else:
@ -295,8 +272,7 @@ class SphinxRSTFileInput(SphinxBaseFileInput):
return lineno return lineno
def read_doc(app, env, filename): def read_doc(app: "Sphinx", env: BuildEnvironment, filename: str) -> nodes.document:
# type: (Sphinx, BuildEnvironment, str) -> nodes.document
"""Parse a document and convert to doctree.""" """Parse a document and convert to doctree."""
# set up error_handler for the target document # set up error_handler for the target document
error_handler = UnicodeDecodeErrorHandler(env.docname) error_handler = UnicodeDecodeErrorHandler(env.docname)