From 3859136342c75b1ad67c622d9045f1117e62710a Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Tue, 6 Feb 2018 00:15:29 +0900 Subject: [PATCH 1/3] Refactor app._init_env() not to load env even if dump not found --- sphinx/application.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/sphinx/application.py b/sphinx/application.py index d39d313b6..99af4d068 100644 --- a/sphinx/application.py +++ b/sphinx/application.py @@ -41,7 +41,7 @@ from sphinx.util import pycompat # noqa: F401 from sphinx.util.console import bold # type: ignore from sphinx.util.docutils import is_html5_writer_available, directive_helper from sphinx.util.i18n import find_catalog_source_files -from sphinx.util.osutil import ENOENT, abspath, ensuredir +from sphinx.util.osutil import abspath, ensuredir from sphinx.util.tags import Tags if False: @@ -282,7 +282,8 @@ class Sphinx(object): def _init_env(self, freshenv): # type: (bool) -> None - if freshenv: + filename = path.join(self.doctreedir, ENV_PICKLE_FILENAME) + if freshenv or not os.path.exists(filename): self.env = BuildEnvironment(self) self.env.find_files(self.config, self.builder) for domain in self.registry.create_domains(self.env): @@ -290,7 +291,6 @@ class Sphinx(object): else: try: logger.info(bold(__('loading pickled environment... ')), nonl=True) - filename = path.join(self.doctreedir, ENV_PICKLE_FILENAME) self.env = BuildEnvironment.frompickle(filename, self) needed, reason = self.env.need_refresh(self) if needed: @@ -301,10 +301,7 @@ class Sphinx(object): self.env.domains[domain.name] = domain logger.info(__('done')) except Exception as err: - if isinstance(err, IOError) and err.errno == ENOENT: - logger.info(__('not yet created')) - else: - logger.info(__('failed: %s'), err) + logger.info(__('failed: %s'), err) self._init_env(freshenv=True) def preload_builder(self, name): From 9d33ec99b4c104e981200d73403cc716d6bb640c Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Tue, 6 Feb 2018 00:36:55 +0900 Subject: [PATCH 2/3] Deprecate: app.import_object() --- CHANGES | 2 ++ sphinx/application.py | 12 +++++++++--- sphinx/builders/__init__.py | 6 +++--- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/CHANGES b/CHANGES index 8feec7efe..8ede11a06 100644 --- a/CHANGES +++ b/CHANGES @@ -21,6 +21,8 @@ Deprecated * :confval:`source_parsers` is deprecated. Please use ``add_source_parser()`` instead. +* ``app.import_object()`` is deprecated. Please use + ``sphinx.util.import_object()`` instead. Features added -------------- diff --git a/sphinx/application.py b/sphinx/application.py index 99af4d068..1504a1cb1 100644 --- a/sphinx/application.py +++ b/sphinx/application.py @@ -27,7 +27,7 @@ from six.moves import cStringIO import sphinx from sphinx import package_dir, locale from sphinx.config import Config -from sphinx.deprecation import RemovedInSphinx20Warning +from sphinx.deprecation import RemovedInSphinx20Warning, RemovedInSphinx30Warning from sphinx.environment import BuildEnvironment from sphinx.errors import ( ApplicationError, ConfigError, ExtensionError, VersionRequirementError @@ -460,10 +460,16 @@ class Sphinx(object): if version > sphinx.__display_version__[:3]: raise VersionRequirementError(version) - # TODO(stephenfin): Deprecate this as it has no callers and isn't necessary def import_object(self, objname, source=None): # type: (str, unicode) -> Any - """Import an object from a ``module.name`` string.""" + """Import an object from a ``module.name`` string. + + .. deprecated:: 1.8 + Use ``sphinx.util.import_object()`` instead. + """ + warnings.warn('app.import_object() is deprecated. ' + 'Use sphinx.util.add_object_type() instead.', + RemovedInSphinx30Warning) return import_object(objname, source=None) # event interface diff --git a/sphinx/builders/__init__.py b/sphinx/builders/__init__.py index 907cec92e..a2a5ee035 100644 --- a/sphinx/builders/__init__.py +++ b/sphinx/builders/__init__.py @@ -16,7 +16,7 @@ from docutils import nodes from sphinx.deprecation import RemovedInSphinx20Warning from sphinx.environment.adapters.asset import ImageAdapter -from sphinx.util import i18n, path_stabilize, logging, status_iterator +from sphinx.util import i18n, import_object, path_stabilize, logging, status_iterator from sphinx.util.console import bold # type: ignore from sphinx.util.i18n import find_catalog from sphinx.util.osutil import SEP, ensuredir, relative_uri @@ -159,8 +159,8 @@ class Builder(object): # type: () -> None """Return the template bridge configured.""" if self.config.template_bridge: - self.templates = self.app.import_object( - self.config.template_bridge, 'template_bridge setting')() + self.templates = import_object(self.config.template_bridge, + 'template_bridge setting')() else: from sphinx.jinja2glue import BuiltinTemplateLoader self.templates = BuiltinTemplateLoader() From 301aee4916db82146b004af51f63df792f8ebc0b Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Tue, 6 Feb 2018 00:45:49 +0900 Subject: [PATCH 3/3] Drop function based directive support --- CHANGES | 4 +++- sphinx/application.py | 11 ++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/CHANGES b/CHANGES index 8ede11a06..81c862fb1 100644 --- a/CHANGES +++ b/CHANGES @@ -21,8 +21,10 @@ Deprecated * :confval:`source_parsers` is deprecated. Please use ``add_source_parser()`` instead. -* ``app.import_object()`` is deprecated. Please use +* ``Application.import_object()`` is deprecated. Please use ``sphinx.util.import_object()`` instead. +* Drop function based directive support. For now, Sphinx only supports class + based directives. Features added -------------- diff --git a/sphinx/application.py b/sphinx/application.py index 1504a1cb1..420810571 100644 --- a/sphinx/application.py +++ b/sphinx/application.py @@ -20,7 +20,7 @@ from collections import deque from os import path from docutils import nodes -from docutils.parsers.rst import directives, roles +from docutils.parsers.rst import Directive, directives, roles from six import iteritems, itervalues from six.moves import cStringIO @@ -687,8 +687,6 @@ class Sphinx(object): self.enumerable_nodes[node] = (figtype, title_getter) self.add_node(node, **kwds) - # TODO(stephenfin): Remove docutils 0.4 style parsing and update the - # example to use the newer style def add_directive(self, name, obj, content=None, arguments=None, **options): # type: (unicode, Any, bool, Tuple[int, int, bool], Any) -> None """Register a Docutils directive. @@ -726,6 +724,8 @@ class Sphinx(object): .. versionchanged:: 0.6 Docutils 0.5-style directive classes are now supported. + .. deprecated:: 1.8 + Docutils 0.4-style (function based) directives support is deprecated. """ logger.debug('[app] adding directive: %r', (name, obj, content, arguments, options)) @@ -737,6 +737,11 @@ class Sphinx(object): directive = directive_helper(obj, content, arguments, **options) directives.register_directive(name, directive) + if not isinstance(obj, Directive): + warnings.warn('function based directive support is now deprecated. ' + 'Use class based directive instead.', + RemovedInSphinx30Warning) + def add_role(self, name, role): # type: (unicode, Any) -> None """Register a Docutils role.