Merge remote-tracking branch 'upstream/pytest-2.7'

Conflicts:
	testing/conftest.py
This commit is contained in:
Bruno Oliveira 2015-07-24 19:24:21 -03:00
commit 9f94e443ff
6 changed files with 48 additions and 9 deletions

View File

@ -104,9 +104,17 @@
2.7.3 (compared to 2.7.2) 2.7.3 (compared to 2.7.2)
----------------------------- -----------------------------
- Allow 'dev', 'rc', or other non-integer version strings in `importorskip`.
Thanks to Eric Hunsberger for the PR.
- fix issue856: consider --color parameter in all outputs (for example - fix issue856: consider --color parameter in all outputs (for example
--fixtures). Thanks Barney Gale for the report and Bruno Oliveira for the PR. --fixtures). Thanks Barney Gale for the report and Bruno Oliveira for the PR.
- fix issue855: passing str objects as `plugins` argument to pytest.main
is now interpreted as a module name to be imported and registered as a
plugin, instead of silently having no effect.
Thanks xmo-odoo for the report and Bruno Oliveira for the PR.
- fix issue744: fix for ast.Call changes in Python 3.5+. Thanks - fix issue744: fix for ast.Call changes in Python 3.5+. Thanks
Guido van Rossum, Matthias Bussonnier, Stefan Zimmermann and Guido van Rossum, Matthias Bussonnier, Stefan Zimmermann and
Thomas Kluyver. Thomas Kluyver.

View File

@ -107,6 +107,9 @@ def _prepareconfig(args=None, plugins=None):
try: try:
if plugins: if plugins:
for plugin in plugins: for plugin in plugins:
if isinstance(plugin, py.builtin._basestring):
pluginmanager.consider_pluginarg(plugin)
else:
pluginmanager.register(plugin) pluginmanager.register(plugin)
return pluginmanager.hook.pytest_cmdline_parse( return pluginmanager.hook.pytest_cmdline_parse(
pluginmanager=pluginmanager, args=args) pluginmanager=pluginmanager, args=args)

View File

@ -3,6 +3,8 @@ import bdb
import sys import sys
from time import time from time import time
from pkg_resources import parse_version
import py import py
import pytest import pytest
from py._code.code import TerminalRepr from py._code.code import TerminalRepr
@ -483,8 +485,6 @@ def importorskip(modname, minversion=None):
""" return imported module if it has at least "minversion" as its """ return imported module if it has at least "minversion" as its
__version__ attribute. If no minversion is specified the a skip __version__ attribute. If no minversion is specified the a skip
is only triggered if the module can not be imported. is only triggered if the module can not be imported.
Note that version comparison only works with simple version strings
like "1.2.3" but not "1.2.3.dev1" or others.
""" """
__tracebackhide__ = True __tracebackhide__ = True
compile(modname, '', 'eval') # to catch syntaxerrors compile(modname, '', 'eval') # to catch syntaxerrors
@ -496,9 +496,7 @@ def importorskip(modname, minversion=None):
if minversion is None: if minversion is None:
return mod return mod
verattr = getattr(mod, '__version__', None) verattr = getattr(mod, '__version__', None)
def intver(verstring): if verattr is None or parse_version(verattr) < parse_version(minversion):
return [int(x) for x in verstring.split(".")]
if verattr is None or intver(verattr) < intver(minversion):
skip("module %r has __version__ %r, required is: %r" %( skip("module %r has __version__ %r, required is: %r" %(
modname, verattr, minversion)) modname, verattr, minversion))
return mod return mod

View File

@ -1,3 +1,4 @@
import sys
import py, pytest import py, pytest
class TestGeneralUsage: class TestGeneralUsage:
@ -371,6 +372,21 @@ class TestGeneralUsage:
"*fixture 'invalid_fixture' not found", "*fixture 'invalid_fixture' not found",
]) ])
def test_plugins_given_as_strings(self, tmpdir, monkeypatch):
"""test that str values passed to main() as `plugins` arg
are interpreted as module names to be imported and registered.
#855.
"""
with pytest.raises(ImportError) as excinfo:
pytest.main([str(tmpdir)], plugins=['invalid.module'])
assert 'invalid' in str(excinfo.value)
p = tmpdir.join('test_test_plugins_given_as_strings.py')
p.write('def test_foo(): pass')
mod = py.std.types.ModuleType("myplugin")
monkeypatch.setitem(sys.modules, 'myplugin', mod)
assert pytest.main(args=[str(tmpdir)], plugins=['myplugin']) == 0
class TestInvocationVariants: class TestInvocationVariants:
def test_earlyinit(self, testdir): def test_earlyinit(self, testdir):

View File

@ -649,7 +649,8 @@ def lsof_check():
pid = os.getpid() pid = os.getpid()
try: try:
out = py.process.cmdexec("lsof -p %d" % pid) out = py.process.cmdexec("lsof -p %d" % pid)
except py.process.cmdexec.Error: except (py.process.cmdexec.Error, UnicodeDecodeError):
# about UnicodeDecodeError, see note on conftest.py
pytest.skip("could not run 'lsof'") pytest.skip("could not run 'lsof'")
yield yield
out2 = py.process.cmdexec("lsof -p %d" % pid) out2 = py.process.cmdexec("lsof -p %d" % pid)

View File

@ -439,7 +439,7 @@ def test_exception_printing_skip():
s = excinfo.exconly(tryshort=True) s = excinfo.exconly(tryshort=True)
assert s.startswith("Skipped") assert s.startswith("Skipped")
def test_importorskip(): def test_importorskip(monkeypatch):
importorskip = pytest.importorskip importorskip = pytest.importorskip
def f(): def f():
importorskip("asdlkj") importorskip("asdlkj")
@ -457,7 +457,7 @@ def test_importorskip():
pytest.raises(SyntaxError, "pytest.importorskip('x=y')") pytest.raises(SyntaxError, "pytest.importorskip('x=y')")
mod = py.std.types.ModuleType("hello123") mod = py.std.types.ModuleType("hello123")
mod.__version__ = "1.3" mod.__version__ = "1.3"
sys.modules["hello123"] = mod monkeypatch.setitem(sys.modules, "hello123", mod)
pytest.raises(pytest.skip.Exception, """ pytest.raises(pytest.skip.Exception, """
pytest.importorskip("hello123", minversion="1.3.1") pytest.importorskip("hello123", minversion="1.3.1")
""") """)
@ -471,6 +471,19 @@ def test_importorskip_imports_last_module_part():
ospath = pytest.importorskip("os.path") ospath = pytest.importorskip("os.path")
assert os.path == ospath assert os.path == ospath
def test_importorskip_dev_module(monkeypatch):
try:
mod = py.std.types.ModuleType("mockmodule")
mod.__version__ = '0.13.0.dev-43290'
monkeypatch.setitem(sys.modules, 'mockmodule', mod)
mod2 = pytest.importorskip('mockmodule', minversion='0.12.0')
assert mod2 == mod
pytest.raises(pytest.skip.Exception, """
pytest.importorskip('mockmodule1', minversion='0.14.0')""")
except pytest.skip.Exception:
print(py.code.ExceptionInfo())
pytest.fail("spurious skip")
def test_pytest_cmdline_main(testdir): def test_pytest_cmdline_main(testdir):
p = testdir.makepyfile(""" p = testdir.makepyfile("""