Add sphinx.util.logging.pending_warnings()

This commit is contained in:
Takeshi KOMIYA 2016-12-23 10:41:38 +09:00
parent d8ad3d063c
commit ad871e5a48
3 changed files with 37 additions and 6 deletions

View File

@ -287,7 +287,7 @@ class Builder(object):
logger.info(bold('building [%s]' % self.name) + ': ' + summary) logger.info(bold('building [%s]' % self.name) + ': ' + summary)
# while reading, collect all warnings from docutils # while reading, collect all warnings from docutils
with logging.pending_logging(): with logging.pending_warnings():
updated_docnames = set(self.env.update(self.config, self.srcdir, updated_docnames = set(self.env.update(self.config, self.srcdir,
self.doctreedir, self.app)) self.doctreedir, self.app))
@ -386,7 +386,7 @@ class Builder(object):
def _write_serial(self, docnames): def _write_serial(self, docnames):
# type: (Sequence[unicode]) -> None # type: (Sequence[unicode]) -> None
with logging.pending_logging(): with logging.pending_warnings():
for docname in self.app.status_iterator( for docname in self.app.status_iterator(
docnames, 'writing output... ', darkgreen, len(docnames)): docnames, 'writing output... ', darkgreen, len(docnames)):
doctree = self.env.get_and_resolve_doctree(docname, self) doctree = self.env.get_and_resolve_doctree(docname, self)

View File

@ -126,6 +126,11 @@ class SphinxLoggerAdapter(logging.LoggerAdapter):
self.logger.handle(record) # type: ignore self.logger.handle(record) # type: ignore
class WarningStreamHandler(logging.StreamHandler):
"""StreamHandler for warnings."""
pass
class NewLineStreamHandlerPY2(logging.StreamHandler): class NewLineStreamHandlerPY2(logging.StreamHandler):
"""StreamHandler which switches line terminator by record.nonl flag.""" """StreamHandler which switches line terminator by record.nonl flag."""
@ -195,10 +200,36 @@ class MemoryHandler(logging.handlers.BufferingHandler):
return buffer return buffer
@contextmanager
def pending_warnings():
# type: () -> Generator
"""contextmanager to pend logging warnings temporary."""
logger = logging.getLogger()
memhandler = MemoryHandler()
memhandler.setLevel(logging.WARNING)
try:
handlers = []
for handler in logger.handlers[:]:
if isinstance(handler, WarningStreamHandler):
logger.removeHandler(handler)
handlers.append(handler)
logger.addHandler(memhandler)
yield memhandler
finally:
logger.removeHandler(memhandler)
for handler in handlers:
logger.addHandler(handler)
memhandler.flushTo(logger)
@contextmanager @contextmanager
def pending_logging(): def pending_logging():
# type: () -> Generator # type: () -> Generator
"""contextmanager to pend logging temporary.""" """contextmanager to pend logging all logs temporary."""
logger = logging.getLogger() logger = logging.getLogger()
memhandler = MemoryHandler() memhandler = MemoryHandler()
@ -357,7 +388,7 @@ def setup(app, status, warning):
info_handler.setLevel(VERBOSITY_MAP.get(app.verbosity)) info_handler.setLevel(VERBOSITY_MAP.get(app.verbosity))
info_handler.setFormatter(ColorizeFormatter()) info_handler.setFormatter(ColorizeFormatter())
warning_handler = logging.StreamHandler(warning) warning_handler = WarningStreamHandler(warning)
warning_handler.addFilter(WarningSuppressor(app)) warning_handler.addFilter(WarningSuppressor(app))
warning_handler.addFilter(WarningIsErrorFilter(app)) warning_handler.addFilter(WarningIsErrorFilter(app))
warning_handler.addFilter(WarningLogRecordTranslator(app)) warning_handler.addFilter(WarningLogRecordTranslator(app))

View File

@ -225,12 +225,12 @@ def test_warn_node(app, status, warning):
@with_app() @with_app()
def test_pending_logging(app, status, warning): def test_pending_warnings(app, status, warning):
logging.setup(app, status, warning) logging.setup(app, status, warning)
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
logger.warning('message1') logger.warning('message1')
with logging.pending_logging(): with logging.pending_warnings():
# not logged yet (bufferred) in here # not logged yet (bufferred) in here
logger.warning('message2') logger.warning('message2')
logger.warning('message3') logger.warning('message3')