Expose `log_cli` as a CLI parser option.

This commit is contained in:
Pedro Algarvio 2018-02-05 18:07:40 +00:00
parent ce0a9aadec
commit 0b71255dda
No known key found for this signature in database
GPG Key ID: BB36BF6584A298FF
3 changed files with 52 additions and 2 deletions

View File

@ -336,9 +336,10 @@ class LoggingPlugin(object):
create a single one for the entire test session here. create a single one for the entire test session here.
""" """
self._config = config self._config = config
self._stream_logs = None
# enable verbose output automatically if live logging is enabled # enable verbose output automatically if live logging is enabled
if self._config.getini('log_cli') and not config.getoption('verbose'): if self._stream_logs_enabled() and not config.getoption('verbose'):
# sanity check: terminal reporter should not have been loaded at this point # sanity check: terminal reporter should not have been loaded at this point
assert self._config.pluginmanager.get_plugin('terminalreporter') is None assert self._config.pluginmanager.get_plugin('terminalreporter') is None
config.option.verbose = 1 config.option.verbose = 1
@ -364,6 +365,12 @@ class LoggingPlugin(object):
# initialized during pytest_runtestloop # initialized during pytest_runtestloop
self.log_cli_handler = None self.log_cli_handler = None
def _stream_logs_enabled(self):
if self._stream_logs is None:
self._stream_logs = self._config.getoption('--log-cli-level') is not None or \
self._config.getini('log_cli')
return self._stream_logs
@contextmanager @contextmanager
def _runtest_for(self, item, when): def _runtest_for(self, item, when):
"""Implements the internals of pytest_runtest_xxx() hook.""" """Implements the internals of pytest_runtest_xxx() hook."""
@ -438,7 +445,7 @@ class LoggingPlugin(object):
This must be done right before starting the loop so we can access the terminal reporter plugin. This must be done right before starting the loop so we can access the terminal reporter plugin.
""" """
terminal_reporter = self._config.pluginmanager.get_plugin('terminalreporter') terminal_reporter = self._config.pluginmanager.get_plugin('terminalreporter')
if self._config.getini('log_cli') and terminal_reporter is not None: if self._stream_logs_enabled() and terminal_reporter is not None:
capture_manager = self._config.pluginmanager.get_plugin('capturemanager') capture_manager = self._config.pluginmanager.get_plugin('capturemanager')
log_cli_handler = _LiveLoggingStreamHandler(terminal_reporter, capture_manager) log_cli_handler = _LiveLoggingStreamHandler(terminal_reporter, capture_manager)
log_cli_format = get_option_ini(self._config, 'log_cli_format', 'log_format') log_cli_format = get_option_ini(self._config, 'log_cli_format', 'log_format')

1
changelog/3190.feature Normal file
View File

@ -0,0 +1 @@
Passing `--log-cli-level` in the command-line now automatically activates live logging.

View File

@ -366,6 +366,48 @@ def test_log_cli_ini_level(testdir):
assert result.ret == 0 assert result.ret == 0
@pytest.mark.parametrize('cli_args', ['',
'--log-level=WARNING',
'--log-file-level=WARNING',
'--log-cli-level=WARNING'])
def test_log_cli_auto_enable(testdir, request, cli_args):
"""Check that live logs are enabled if --log-level or --log-cli-level is passed on the CLI.
It should not be auto enabled if the same configs are set on the INI file.
"""
testdir.makepyfile('''
import pytest
import logging
def test_log_1():
logging.info("log message from test_log_1 not to be shown")
logging.warning("log message from test_log_1")
''')
testdir.makeini('''
[pytest]
log_level=INFO
log_cli_level=INFO
''')
result = testdir.runpytest(cli_args)
if cli_args == '--log-cli-level=WARNING':
result.stdout.fnmatch_lines([
'*::test_log_1 ',
'*-- live log call --*',
'*WARNING*log message from test_log_1*',
'PASSED *100%*',
'=* 1 passed in *=',
])
assert 'INFO' not in result.stdout.str()
else:
result.stdout.fnmatch_lines([
'*test_log_cli_auto_enable*100%*',
'=* 1 passed in *=',
])
assert 'INFO' not in result.stdout.str()
assert 'WARNING' not in result.stdout.str()
def test_log_file_cli(testdir): def test_log_file_cli(testdir):
# Default log file level # Default log file level
testdir.makepyfile(''' testdir.makepyfile('''