Merge pull request #3190 from s0undt3ch/feature/logs-stream

Expose `log_cli` as a CLI parser option.
This commit is contained in:
Bruno Oliveira 2018-02-08 17:07:48 -02:00 committed by GitHub
commit bba258aa5e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 52 additions and 2 deletions

View File

@ -338,7 +338,7 @@ class LoggingPlugin(object):
self._config = config self._config = config
# 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._log_cli_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 +364,13 @@ class LoggingPlugin(object):
# initialized during pytest_runtestloop # initialized during pytest_runtestloop
self.log_cli_handler = None self.log_cli_handler = None
def _log_cli_enabled(self):
"""Return True if log_cli should be considered enabled, either explicitly
or because --log-cli-level was given in the command-line.
"""
return self._config.getoption('--log-cli-level') is not None or \
self._config.getini('log_cli')
@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._log_cli_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('''