Merge pull request #5827 from tk0miya/refactor_io3

Refactor sphinx.io
This commit is contained in:
Takeshi KOMIYA 2018-12-18 23:28:50 +09:00 committed by GitHub
commit 9574607578
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 53 additions and 33 deletions

View File

@ -68,7 +68,10 @@ Deprecated
* ``sphinx.ext.autosummary.Autosummary.warnings`` * ``sphinx.ext.autosummary.Autosummary.warnings``
* ``sphinx.ext.autosummary.Autosummary.result`` * ``sphinx.ext.autosummary.Autosummary.result``
* ``sphinx.ext.doctest.doctest_encode()`` * ``sphinx.ext.doctest.doctest_encode()``
* ``sphinx.io.SphinxBaseFileInput``
* ``sphinx.io.SphinxFileInput.supported``
* ``sphinx.io.SphinxRSTFileInput`` * ``sphinx.io.SphinxRSTFileInput``
* ``sphinx.registry.SphinxComponentRegistry.add_source_input()``
* ``sphinx.testing.util.remove_unicode_literal()`` * ``sphinx.testing.util.remove_unicode_literal()``
* ``sphinx.util.attrdict`` * ``sphinx.util.attrdict``
* ``sphinx.util.force_decode()`` * ``sphinx.util.force_decode()``

View File

@ -278,11 +278,26 @@ The following is a list of deprecated interfaces.
- 3.0 - 3.0
- N/A - N/A
* - ``sphinx.io.SphinxBaseFileInput``
- 2.0
- 3.0
- N/A
* - ``sphinx.io.SphinxFileInput.supported``
- 2.0
- 3.0
- N/A
* - ``sphinx.io.SphinxRSTFileInput`` * - ``sphinx.io.SphinxRSTFileInput``
- 2.0 - 2.0
- 3.0 - 3.0
- N/A - N/A
* - ``sphinx.registry.SphinxComponentRegistry.add_source_input()``
- 2.0
- 3.0
- N/A
* - ``sphinx.writers.latex.LaTeXTranslator._make_visit_admonition()`` * - ``sphinx.writers.latex.LaTeXTranslator._make_visit_admonition()``
- 2.0 - 2.0
- 3.0 - 3.0

View File

@ -92,7 +92,6 @@ builtin_extensions = (
'sphinx.directives.other', 'sphinx.directives.other',
'sphinx.directives.patches', 'sphinx.directives.patches',
'sphinx.extension', 'sphinx.extension',
'sphinx.io',
'sphinx.parsers', 'sphinx.parsers',
'sphinx.registry', 'sphinx.registry',
'sphinx.roles', 'sphinx.roles',

View File

@ -185,21 +185,25 @@ class SphinxBaseFileInput(FileInput):
self.app = app self.app = app
self.env = env self.env = env
warnings.warn('%s is deprecated.' % self.__class__.__name__,
RemovedInSphinx30Warning, stacklevel=2)
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):
# type: (Any) -> Tuple # type: (Any) -> Tuple
warnings.warn('SphinxBaseFileInput.warn_and_replace() is deprecated. '
'Use UnicodeDecodeErrorHandler instead.',
RemovedInSphinx30Warning, stacklevel=2)
return UnicodeDecodeErrorHandler(self.env.docname)(error) return UnicodeDecodeErrorHandler(self.env.docname)(error)
class SphinxFileInput(SphinxBaseFileInput): class SphinxFileInput(FileInput):
"""A basic FileInput for Sphinx.""" """A basic FileInput for Sphinx."""
supported = ('*',) # special source input supported = ('*',) # RemovedInSphinx30Warning
def __init__(self, *args, **kwargs):
# type: (Any, Any) -> None
kwargs['error_handler'] = 'sphinx'
super(SphinxFileInput, self).__init__(*args, **kwargs)
class SphinxRSTFileInput(SphinxBaseFileInput): class SphinxRSTFileInput(SphinxBaseFileInput):
@ -241,9 +245,6 @@ class SphinxRSTFileInput(SphinxBaseFileInput):
def read(self): # type: ignore def read(self): # type: ignore
# type: () -> StringList # type: () -> StringList
warnings.warn('SphinxRSTFileInput is deprecated.',
RemovedInSphinx30Warning, stacklevel=2)
inputstring = super().read() inputstring = super().read()
lines = string2lines(inputstring, convert_whitespace=True) lines = string2lines(inputstring, convert_whitespace=True)
content = StringList() content = StringList()
@ -287,11 +288,8 @@ def read_doc(app, env, filename):
error_handler = UnicodeDecodeErrorHandler(env.docname) error_handler = UnicodeDecodeErrorHandler(env.docname)
codecs.register_error('sphinx', error_handler) # type: ignore codecs.register_error('sphinx', error_handler) # type: ignore
filetype = get_filetype(app.config.source_suffix, filename)
input_class = app.registry.get_source_input(filetype)
reader = SphinxStandaloneReader(app) reader = SphinxStandaloneReader(app)
source = input_class(app, env, source=None, source_path=filename, # type: ignore filetype = get_filetype(app.config.source_suffix, filename)
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 == ():
# a workaround for recommonmark # a workaround for recommonmark
@ -301,23 +299,26 @@ def read_doc(app, env, filename):
# CommonMarkParser. # CommonMarkParser.
parser.settings_spec = RSTParser.settings_spec parser.settings_spec = RSTParser.settings_spec
pub = Publisher(reader=reader, # type: ignore input_class = app.registry.get_source_input(filetype)
parser=parser, if input_class:
writer=SphinxDummyWriter(), # Sphinx-1.8 style
source_class=SphinxDummySourceClass, source = input_class(app, env, source=None, source_path=filename, # type: ignore
destination=NullOutput()) encoding=env.config.source_encoding)
pub.process_programmatic_settings(None, env.settings, None) pub = Publisher(reader=reader, # type: ignore
pub.set_source(source, filename) parser=parser,
writer=SphinxDummyWriter(),
source_class=SphinxDummySourceClass,
destination=NullOutput())
pub.process_programmatic_settings(None, env.settings, None)
pub.set_source(source, filename)
else:
# Sphinx-2.0 style
pub = Publisher(reader=reader,
parser=parser,
writer=SphinxDummyWriter(),
source_class=SphinxFileInput)
pub.process_programmatic_settings(None, env.settings, None)
pub.set_source(source_path=filename)
pub.publish() pub.publish()
return pub.document return pub.document
def setup(app):
# type: (Sphinx) -> Dict[str, Any]
app.registry.add_source_input(SphinxFileInput)
return {
'version': 'builtin',
'parallel_read_safe': True,
'parallel_write_safe': True,
}

View File

@ -337,6 +337,8 @@ class SphinxComponentRegistry:
def add_source_input(self, input_class, override=False): def add_source_input(self, input_class, override=False):
# type: (Type[SphinxFileInput], bool) -> None # type: (Type[SphinxFileInput], bool) -> None
warnings.warn('registry.source_input() is deprecated.',
RemovedInSphinx30Warning, stacklevel=2)
for filetype in input_class.supported: for filetype in input_class.supported:
if filetype in self.source_inputs and not override: if filetype in self.source_inputs and not override:
raise ExtensionError(__('source_input for %r is already registered') % raise ExtensionError(__('source_input for %r is already registered') %
@ -352,7 +354,7 @@ class SphinxComponentRegistry:
# use special source_input for unknown filetype # use special source_input for unknown filetype
return self.source_inputs['*'] return self.source_inputs['*']
except KeyError: except KeyError:
raise SphinxError(__('source_input for %s not registered') % filetype) return None
def add_translator(self, name, translator, override=False): def add_translator(self, name, translator, override=False):
# type: (str, Type[nodes.NodeVisitor], bool) -> None # type: (str, Type[nodes.NodeVisitor], bool) -> None