Source code for labgrid.pytestplugin.hooks
import os
import warnings
import logging
import pytest
from .. import Environment
from ..consoleloggingreporter import ConsoleLoggingReporter
from ..util.helper import processwrapper
from ..logging import StepFormatter, StepLogger
LABGRID_ENV_KEY = pytest.StashKey[Environment]()
[docs]
@pytest.hookimpl(tryfirst=True)
def pytest_cmdline_main(config):
def set_cli_log_level(level):
nonlocal config
try:
current_level = config.getoption("log_cli_level") or config.getini("log_cli_level")
except ValueError:
return
print(f"current_level: {current_level}")
if isinstance(current_level, str):
try:
current_level = int(logging.getLevelName(current_level))
except ValueError:
current_level = None
# If no level was set previously (via ini or cli) or current_level is
# less verbose than level, set to new level.
if current_level is None or level < current_level:
config.option.log_cli_level = str(level)
verbosity = config.getoption("verbose")
if verbosity > 3: # enable with -vvvv
set_cli_log_level(logging.DEBUG)
elif verbosity > 2: # enable with -vvv
set_cli_log_level(logging.CONSOLE)
elif verbosity > 1: # enable with -vv
set_cli_log_level(logging.INFO)
[docs]
def configure_pytest_logging(config, plugin):
plugin.log_cli_handler.formatter.add_color_level(logging.CONSOLE, "blue")
plugin.log_cli_handler.setFormatter(StepFormatter(
color=config.option.lg_colored_steps,
parent=plugin.log_cli_handler.formatter,
))
plugin.log_file_handler.setFormatter(StepFormatter(
parent=plugin.log_file_handler.formatter,
))
# Might be the same formatter instance, so get a reference for both before
# changing either
report_formatter = plugin.report_handler.formatter
caplog_formatter = plugin.caplog_handler.formatter
plugin.report_handler.setFormatter(StepFormatter(parent=report_formatter))
plugin.report_handler.setFormatter(StepFormatter(parent=caplog_formatter))
[docs]
@pytest.hookimpl(trylast=True)
def pytest_configure(config):
StepLogger.start()
config.add_cleanup(StepLogger.stop)
logging_plugin = config.pluginmanager.getplugin('logging-plugin')
if logging_plugin:
configure_pytest_logging(config, logging_plugin)
config.addinivalue_line("markers",
"lg_feature: marker for labgrid feature flags")
lg_log = config.option.lg_log
if lg_log:
ConsoleLoggingReporter(lg_log)
env_config = config.option.env_config
lg_env = config.option.lg_env
lg_coordinator = config.option.lg_coordinator
if lg_env is None:
if env_config is not None:
warnings.warn(pytest.PytestWarning(
"deprecated option --env-config (use --lg-env instead)",
__file__))
lg_env = env_config
env = None
if lg_env is None:
lg_env = os.environ.get('LG_ENV')
if lg_env is not None:
env = Environment(config_file=lg_env)
if lg_coordinator is not None:
env.config.set_option('crossbar_url', lg_coordinator)
config.stash[LABGRID_ENV_KEY] = env
processwrapper.enable_logging()
[docs]
@pytest.hookimpl()
def pytest_collection_modifyitems(config, items):
"""This function matches function feature flags with those found in the
environment and disables the item if no match is found"""
env = config.stash[LABGRID_ENV_KEY]
if not env:
return
have_feature = env.get_features() | env.get_target_features()
for item in items:
want_feature = set()
for marker in item.iter_markers("lg_feature"):
arg = marker.args[0]
if isinstance(arg, str):
want_feature.add(arg)
elif isinstance(arg, list):
want_feature.update(arg)
else:
raise Exception("Unsupported feature argument type")
missing_feature = want_feature - have_feature
if missing_feature:
if len(missing_feature) == 1:
skip = pytest.mark.skip(
reason=f'Skipping because feature "{missing_feature}" is not supported'
)
else:
skip = pytest.mark.skip(
reason=f'Skipping because features "{missing_feature}" are not supported'
)
item.add_marker(skip)