Skip to content

Commit

Permalink
Only consider actual functions when considering hooks
Browse files Browse the repository at this point in the history
  • Loading branch information
nicoddemus committed Aug 4, 2018
1 parent a76cc8f commit 2c0d2ee
Show file tree
Hide file tree
Showing 5 changed files with 28 additions and 0 deletions.
1 change: 1 addition & 0 deletions changelog/3775.bugfix.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix bug where importing modules or other objects with prefix ``pytest_`` prefix would raise a ``PluginValidationError``.
5 changes: 5 additions & 0 deletions src/_pytest/config/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
""" command line options, ini-file and conftest.py processing. """
from __future__ import absolute_import, division, print_function
import argparse
import inspect
import shlex
import traceback
import types
Expand Down Expand Up @@ -252,6 +253,10 @@ def parse_hookimpl_opts(self, plugin, name):
method = getattr(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
if opts is None and name.startswith("pytest_"):
opts = {}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
class pytest_something(object):
pass
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
def test_foo():
pass
18 changes: 18 additions & 0 deletions testing/test_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -745,6 +745,24 @@ def test_get_plugin_specs_as_list():
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):
def test_warn_config(self, testdir):
testdir.makeconftest(
Expand Down

0 comments on commit 2c0d2ee

Please sign in to comment.