move consider_setuptools_entrypoints to core pluginmanager
--HG-- branch : more_plugin
This commit is contained in:
parent
0c961deeaa
commit
8e009ee31c
|
@ -9,7 +9,7 @@ import py
|
|||
# DON't import pytest here because it causes import cycle troubles
|
||||
import sys, os
|
||||
from _pytest import hookspec # the extension point definitions
|
||||
from _pytest.core import PluginManager
|
||||
from _pytest.core import PluginManager, hookimpl_opts
|
||||
|
||||
# pytest startup
|
||||
#
|
||||
|
@ -98,7 +98,6 @@ class PytestPluginManager(PluginManager):
|
|||
super(PytestPluginManager, self).__init__(prefix="pytest_",
|
||||
excludefunc=exclude_pytest_names)
|
||||
self._warnings = []
|
||||
self._plugin_distinfo = []
|
||||
self._conftest_plugins = set()
|
||||
|
||||
# state related to local conftest plugins
|
||||
|
@ -126,16 +125,10 @@ class PytestPluginManager(PluginManager):
|
|||
return ret
|
||||
|
||||
def getplugin(self, name):
|
||||
# deprecated naming
|
||||
# support deprecated naming because plugins (xdist e.g.) use it
|
||||
return self.get_plugin(name)
|
||||
|
||||
def pytest_configure(self, config):
|
||||
config.addinivalue_line("markers",
|
||||
"tryfirst: mark a hook implementation function such that the "
|
||||
"plugin machinery will try to call it first/as early as possible.")
|
||||
config.addinivalue_line("markers",
|
||||
"trylast: mark a hook implementation function such that the "
|
||||
"plugin machinery will try to call it last/as late as possible.")
|
||||
for warning in self._warnings:
|
||||
config.warn(code="I1", message=warning)
|
||||
|
||||
|
@ -236,21 +229,6 @@ class PytestPluginManager(PluginManager):
|
|||
#
|
||||
#
|
||||
|
||||
def consider_setuptools_entrypoints(self):
|
||||
try:
|
||||
from pkg_resources import iter_entry_points, DistributionNotFound
|
||||
except ImportError:
|
||||
return # XXX issue a warning
|
||||
for ep in iter_entry_points('pytest11'):
|
||||
if self.get_plugin(ep.name) or ep.name in self._name2plugin:
|
||||
continue
|
||||
try:
|
||||
plugin = ep.load()
|
||||
except DistributionNotFound:
|
||||
continue
|
||||
self.register(plugin, name=ep.name)
|
||||
self._plugin_distinfo.append((ep.dist, plugin))
|
||||
|
||||
def consider_preparse(self, args):
|
||||
for opt1,opt2 in zip(args, args[1:]):
|
||||
if opt1 == "-p":
|
||||
|
@ -679,6 +657,7 @@ class Notset:
|
|||
|
||||
notset = Notset()
|
||||
FILE_OR_DIR = 'file_or_dir'
|
||||
|
||||
class Config(object):
|
||||
""" access to configuration values, pluginmanager and plugin hooks. """
|
||||
|
||||
|
@ -779,9 +758,9 @@ class Config(object):
|
|||
if not hasattr(self.option, opt.dest):
|
||||
setattr(self.option, opt.dest, opt.default)
|
||||
|
||||
@hookimpl_opts(trylast=True)
|
||||
def pytest_load_initial_conftests(self, early_config):
|
||||
self.pluginmanager._set_initial_conftests(early_config.known_args_namespace)
|
||||
pytest_load_initial_conftests.trylast = True
|
||||
|
||||
def _initini(self, args):
|
||||
parsed_args = self._parser.parse_known_args(args)
|
||||
|
@ -798,7 +777,7 @@ class Config(object):
|
|||
args[:] = self.getini("addopts") + args
|
||||
self._checkversion()
|
||||
self.pluginmanager.consider_preparse(args)
|
||||
self.pluginmanager.consider_setuptools_entrypoints()
|
||||
self.pluginmanager.load_setuptools_entrypoints("pytest11")
|
||||
self.pluginmanager.consider_env()
|
||||
self.known_args_namespace = ns = self._parser.parse_known_args(args)
|
||||
try:
|
||||
|
|
|
@ -212,6 +212,7 @@ class PluginManager(object):
|
|||
self._excludefunc = excludefunc
|
||||
self._name2plugin = {}
|
||||
self._plugin2hookcallers = {}
|
||||
self._plugin_distinfo = []
|
||||
self.trace = TagTracer().get("pluginmanage")
|
||||
self.hook = HookRelay(self.trace.root.get("hook"))
|
||||
self._inner_hookexec = lambda hook, methods, kwargs: \
|
||||
|
@ -379,6 +380,25 @@ class PluginManager(object):
|
|||
raise PluginValidationError(
|
||||
"unknown hook %r in plugin %r" %(name, plugin))
|
||||
|
||||
def load_setuptools_entrypoints(self, entrypoint_name):
|
||||
""" Load modules from querying the specified entrypoint name.
|
||||
Return None if setuptools was not operable, otherwise
|
||||
the number of loaded plugins. """
|
||||
try:
|
||||
from pkg_resources import iter_entry_points, DistributionNotFound
|
||||
except ImportError:
|
||||
return # XXX issue a warning
|
||||
for ep in iter_entry_points(entrypoint_name):
|
||||
if self.get_plugin(ep.name) or ep.name in self._name2plugin:
|
||||
continue
|
||||
try:
|
||||
plugin = ep.load()
|
||||
except DistributionNotFound:
|
||||
continue
|
||||
self.register(plugin, name=ep.name)
|
||||
self._plugin_distinfo.append((ep.dist, plugin))
|
||||
return len(self._plugin_distinfo)
|
||||
|
||||
|
||||
class MultiCall:
|
||||
""" execute a call into multiple python functions/methods. """
|
||||
|
|
|
@ -383,6 +383,32 @@ class TestAddMethodOrdering:
|
|||
results = pm.hook.he_myhook(arg1=17)
|
||||
assert results == 18
|
||||
|
||||
def test_load_setuptools_instantiation(self, monkeypatch, pm):
|
||||
pkg_resources = pytest.importorskip("pkg_resources")
|
||||
def my_iter(name):
|
||||
assert name == "hello"
|
||||
class EntryPoint:
|
||||
name = "myname"
|
||||
dist = None
|
||||
def load(self):
|
||||
class PseudoPlugin:
|
||||
x = 42
|
||||
return PseudoPlugin()
|
||||
return iter([EntryPoint()])
|
||||
|
||||
monkeypatch.setattr(pkg_resources, 'iter_entry_points', my_iter)
|
||||
num = pm.load_setuptools_entrypoints("hello")
|
||||
assert num == 1
|
||||
plugin = pm.get_plugin("myname")
|
||||
assert plugin.x == 42
|
||||
assert pm._plugin_distinfo == [(None, plugin)]
|
||||
|
||||
def test_load_setuptools_not_installed(self, monkeypatch, pm):
|
||||
monkeypatch.setitem(py.std.sys.modules, 'pkg_resources',
|
||||
py.std.types.ModuleType("pkg_resources"))
|
||||
assert pm.load_setuptools_entrypoints("qwe") is None
|
||||
# ok, we did not explode
|
||||
|
||||
|
||||
class TestPytestPluginInteractions:
|
||||
|
||||
|
@ -932,30 +958,6 @@ class TestPytestPluginManager:
|
|||
l3 = len(pytestpm.get_plugins())
|
||||
assert l2 == l3
|
||||
|
||||
def test_consider_setuptools_instantiation(self, monkeypatch, pytestpm):
|
||||
pkg_resources = pytest.importorskip("pkg_resources")
|
||||
def my_iter(name):
|
||||
assert name == "pytest11"
|
||||
class EntryPoint:
|
||||
name = "pytest_mytestplugin"
|
||||
dist = None
|
||||
def load(self):
|
||||
class PseudoPlugin:
|
||||
x = 42
|
||||
return PseudoPlugin()
|
||||
return iter([EntryPoint()])
|
||||
|
||||
monkeypatch.setattr(pkg_resources, 'iter_entry_points', my_iter)
|
||||
pytestpm.consider_setuptools_entrypoints()
|
||||
plugin = pytestpm.get_plugin("pytest_mytestplugin")
|
||||
assert plugin.x == 42
|
||||
|
||||
def test_consider_setuptools_not_installed(self, monkeypatch, pytestpm):
|
||||
monkeypatch.setitem(py.std.sys.modules, 'pkg_resources',
|
||||
py.std.types.ModuleType("pkg_resources"))
|
||||
pytestpm.consider_setuptools_entrypoints()
|
||||
# ok, we did not explode
|
||||
|
||||
def test_pluginmanager_ENV_startup(self, testdir, monkeypatch):
|
||||
testdir.makepyfile(pytest_x500="#")
|
||||
p = testdir.makepyfile("""
|
||||
|
|
Loading…
Reference in New Issue