Improve pytest plugin loading

This commit is contained in:
Martin Vielsmaier
2024-01-23 20:50:11 +01:00
parent 162034b387
commit 9b8cece7ef

View File

@@ -181,10 +181,12 @@ def _iter_pytest_modules(module_context, skip_own_module=False):
if Path(file_io.path) != module_context.py__file__(): if Path(file_io.path) != module_context.py__file__():
try: try:
m = load_module_from_path(module_context.inference_state, file_io) m = load_module_from_path(module_context.inference_state, file_io)
pytest_plugins_pointer = m.goto("pytest_plugins") conftest_module = m.as_context()
if pytest_plugins_pointer: plugins_list = m.tree_node.get_used_names().get("pytest_plugins")
yield from _load_pytest_plugins(module_context, pytest_plugins_pointer[0]) if plugins_list:
yield m.as_context() name = conftest_module.create_name(plugins_list[0])
yield from _load_pytest_plugins(module_context, name)
yield conftest_module
except FileNotFoundError: except FileNotFoundError:
pass pass
folder = folder.get_parent_folder() folder = folder.get_parent_folder()
@@ -198,15 +200,15 @@ def _iter_pytest_modules(module_context, skip_own_module=False):
for module_value in module_context.inference_state.import_module(names): for module_value in module_context.inference_state.import_module(names):
yield module_value.as_context() yield module_value.as_context()
def _load_pytest_plugins(module_context, name):
from jedi.inference.helpers import get_str_or_none
def _load_pytest_plugins(module_context, plugins_pointers): for inferred in name.infer():
from jedi.inference.value import iterable for seq_value in inferred.py__iter__():
from parso.python.tree import String for value in seq_value.infer():
for inferred in plugins_pointers.infer(): fq_name = get_str_or_none(value)
if isinstance(inferred, iterable.SequenceLiteralValue): if fq_name:
for value in inferred.get_tree_entries(): names = fq_name.split(".")
if isinstance(value, String):
names = eval(value.value).split(".")
for module_value in module_context.inference_state.import_module(names): for module_value in module_context.inference_state.import_module(names):
yield module_value.as_context() yield module_value.as_context()