parent
a76cc8f8c4
commit
2c0d2eef40
|
@ -0,0 +1 @@
|
||||||
|
Fix bug where importing modules or other objects with prefix ``pytest_`` prefix would raise a ``PluginValidationError``.
|
|
@ -1,6 +1,7 @@
|
||||||
""" command line options, ini-file and conftest.py processing. """
|
""" command line options, ini-file and conftest.py processing. """
|
||||||
from __future__ import absolute_import, division, print_function
|
from __future__ import absolute_import, division, print_function
|
||||||
import argparse
|
import argparse
|
||||||
|
import inspect
|
||||||
import shlex
|
import shlex
|
||||||
import traceback
|
import traceback
|
||||||
import types
|
import types
|
||||||
|
@ -252,6 +253,10 @@ class PytestPluginManager(PluginManager):
|
||||||
method = getattr(plugin, name)
|
method = getattr(plugin, name)
|
||||||
opts = super(PytestPluginManager, self).parse_hookimpl_opts(plugin, name)
|
opts = super(PytestPluginManager, self).parse_hookimpl_opts(plugin, name)
|
||||||
|
|
||||||
|
# consider only actual functions for hooks (#3775)
|
||||||
|
if not inspect.isroutine(method):
|
||||||
|
return
|
||||||
|
|
||||||
# collect unmarked hooks as long as they have the `pytest_' prefix
|
# collect unmarked hooks as long as they have the `pytest_' prefix
|
||||||
if opts is None and name.startswith("pytest_"):
|
if opts is None and name.startswith("pytest_"):
|
||||||
opts = {}
|
opts = {}
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
class pytest_something(object):
|
||||||
|
pass
|
|
@ -0,0 +1,2 @@
|
||||||
|
def test_foo():
|
||||||
|
pass
|
|
@ -745,6 +745,24 @@ def test_get_plugin_specs_as_list():
|
||||||
assert _get_plugin_specs_as_list(("foo", "bar")) == ["foo", "bar"]
|
assert _get_plugin_specs_as_list(("foo", "bar")) == ["foo", "bar"]
|
||||||
|
|
||||||
|
|
||||||
|
def test_collect_pytest_prefix_bug_integration(testdir):
|
||||||
|
"""Integration test for issue #3775"""
|
||||||
|
p = testdir.copy_example("config/collect_pytest_prefix")
|
||||||
|
result = testdir.runpytest(p)
|
||||||
|
result.stdout.fnmatch_lines("* 1 passed *")
|
||||||
|
|
||||||
|
|
||||||
|
def test_collect_pytest_prefix_bug(pytestconfig):
|
||||||
|
"""Ensure we collect only actual functions from conftest files (#3775)"""
|
||||||
|
|
||||||
|
class Dummy(object):
|
||||||
|
class pytest_something(object):
|
||||||
|
pass
|
||||||
|
|
||||||
|
pm = pytestconfig.pluginmanager
|
||||||
|
assert pm.parse_hookimpl_opts(Dummy(), "pytest_something") is None
|
||||||
|
|
||||||
|
|
||||||
class TestWarning(object):
|
class TestWarning(object):
|
||||||
def test_warn_config(self, testdir):
|
def test_warn_config(self, testdir):
|
||||||
testdir.makeconftest(
|
testdir.makeconftest(
|
||||||
|
|
Loading…
Reference in New Issue