From 647021be64614f25980179ef3d3374be26c6126c Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Sat, 12 Jan 2019 21:56:19 +0900 Subject: [PATCH] Add progress_message() as a helper for progress messages --- sphinx/application.py | 15 +++++++-------- sphinx/util/__init__.py | 29 +++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/sphinx/application.py b/sphinx/application.py index 822c02a36..5744e4e94 100644 --- a/sphinx/application.py +++ b/sphinx/application.py @@ -35,7 +35,7 @@ from sphinx.locale import __ from sphinx.project import Project from sphinx.registry import SphinxComponentRegistry from sphinx.util import docutils -from sphinx.util import import_object +from sphinx.util import import_object, progress_message from sphinx.util import logging from sphinx.util import pycompat # noqa: F401 from sphinx.util.build_phase import BuildPhase @@ -230,8 +230,8 @@ class Sphinx: self.preload_builder(buildername) if not path.isdir(outdir): - logger.info(__('making output directory...')) - ensuredir(outdir) + with progress_message(__('making output directory')): + ensuredir(outdir) # the config file itself can be an extension if self.config.setup: @@ -294,11 +294,10 @@ class Sphinx: self.env.find_files(self.config, self.builder) else: try: - logger.info(bold(__('loading pickled environment... ')), nonl=True) - with open(filename, 'rb') as f: - self.env = pickle.load(f) - self.env.setup(self) - logger.info(__('done')) + with progress_message(__('loading pickled environment')): + with open(filename, 'rb') as f: + self.env = pickle.load(f) + self.env.setup(self) except Exception as err: logger.info(__('failed: %s'), err) self._init_env(freshenv=True) diff --git a/sphinx/util/__init__.py b/sphinx/util/__init__.py index 0da075768..18e9f8701 100644 --- a/sphinx/util/__init__.py +++ b/sphinx/util/__init__.py @@ -9,6 +9,7 @@ """ import fnmatch +import functools import os import posixpath import re @@ -675,6 +676,34 @@ def status_iterator(iterable, summary, color="darkgreen", length=0, verbosity=0, logger.info('') +class progress_message: + def __init__(self, message): + # type: (str) -> None + self.message = message + + def __enter__(self): + # type: () -> None + logger.info(bold(self.message + '... '), nonl=True) + + def __exit__(self, exc_type, exc_value, traceback): + # type: (Any, Any, Any) -> bool + if exc_type: + logger.info(__('failed')) + else: + logger.info(__('done')) + + return False + + def __call__(self, f): + # type: (Callable) -> Callable + @functools.wraps(f) + def wrapper(*args, **kwargs): + with self: + return f(*args, **kwargs) + + return wrapper + + def epoch_to_rfc1123(epoch): # type: (float) -> str """Convert datetime format epoch to RFC1123."""