Fix issue 2985.
This commit is contained in:
parent
a9dd37f429
commit
b62fd79c0c
1
AUTHORS
1
AUTHORS
|
@ -74,6 +74,7 @@ Grig Gheorghiu
|
||||||
Grigorii Eremeev (budulianin)
|
Grigorii Eremeev (budulianin)
|
||||||
Guido Wesdorp
|
Guido Wesdorp
|
||||||
Harald Armin Massa
|
Harald Armin Massa
|
||||||
|
Henk-Jaap Wagenaar
|
||||||
Hugo van Kemenade
|
Hugo van Kemenade
|
||||||
Hui Wang (coldnight)
|
Hui Wang (coldnight)
|
||||||
Ian Bicking
|
Ian Bicking
|
||||||
|
|
|
@ -729,6 +729,25 @@ class Session(FSCollector):
|
||||||
|
|
||||||
"""
|
"""
|
||||||
import pkgutil
|
import pkgutil
|
||||||
|
|
||||||
|
if six.PY2: # python 3.4+ uses importlib instead
|
||||||
|
def find_module_patched(self, fullname, path=None):
|
||||||
|
subname = fullname.split(".")[-1]
|
||||||
|
if subname != fullname and self.path is None:
|
||||||
|
return None
|
||||||
|
if self.path is None:
|
||||||
|
path = None
|
||||||
|
else:
|
||||||
|
path = [self.path]
|
||||||
|
try:
|
||||||
|
file, filename, etc = pkgutil.imp.find_module(subname,
|
||||||
|
path)
|
||||||
|
except ImportError:
|
||||||
|
return None
|
||||||
|
return pkgutil.ImpLoader(fullname, file, filename, etc)
|
||||||
|
|
||||||
|
pkgutil.ImpImporter.find_module = find_module_patched
|
||||||
|
|
||||||
try:
|
try:
|
||||||
loader = pkgutil.find_loader(x)
|
loader = pkgutil.find_loader(x)
|
||||||
except ImportError:
|
except ImportError:
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Fix conversion of pyargs to filename to not convert symlinks and not use deprecated features on Python 3.
|
|
@ -3,6 +3,8 @@ from __future__ import absolute_import, division, print_function
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
import six
|
||||||
|
|
||||||
import _pytest._code
|
import _pytest._code
|
||||||
import py
|
import py
|
||||||
import pytest
|
import pytest
|
||||||
|
@ -645,6 +647,69 @@ class TestInvocationVariants(object):
|
||||||
"*1 passed*"
|
"*1 passed*"
|
||||||
])
|
])
|
||||||
|
|
||||||
|
@pytest.mark.skipif(not hasattr(os, "symlink"), reason="requires symlinks")
|
||||||
|
def test_cmdline_python_package_symlink(self, testdir, monkeypatch):
|
||||||
|
"""
|
||||||
|
test --pyargs option with packages with path containing symlink can
|
||||||
|
have conftest.py in their package (#2985)
|
||||||
|
"""
|
||||||
|
monkeypatch.delenv('PYTHONDONTWRITEBYTECODE', raising=False)
|
||||||
|
|
||||||
|
search_path = ["lib", os.path.join("local", "lib")]
|
||||||
|
|
||||||
|
dirname = "lib"
|
||||||
|
d = testdir.mkdir(dirname)
|
||||||
|
foo = d.mkdir("foo")
|
||||||
|
foo.ensure("__init__.py")
|
||||||
|
lib = foo.mkdir('bar')
|
||||||
|
lib.ensure("__init__.py")
|
||||||
|
lib.join("test_bar.py"). \
|
||||||
|
write("def test_bar(): pass\n"
|
||||||
|
"def test_other(a_fixture):pass")
|
||||||
|
lib.join("conftest.py"). \
|
||||||
|
write("import pytest\n"
|
||||||
|
"@pytest.fixture\n"
|
||||||
|
"def a_fixture():pass")
|
||||||
|
|
||||||
|
d_local = testdir.mkdir("local")
|
||||||
|
symlink_location = os.path.join(str(d_local), "lib")
|
||||||
|
if six.PY2:
|
||||||
|
os.symlink(str(d), symlink_location)
|
||||||
|
else:
|
||||||
|
os.symlink(str(d), symlink_location, target_is_directory=True)
|
||||||
|
|
||||||
|
# The structure of the test directory is now:
|
||||||
|
# .
|
||||||
|
# ├── local
|
||||||
|
# │ └── lib -> ../world
|
||||||
|
# └── lib
|
||||||
|
# └── foo
|
||||||
|
# ├── __init__.py
|
||||||
|
# └── bar
|
||||||
|
# ├── __init__.py
|
||||||
|
# ├── conftest.py
|
||||||
|
# └── test_world.py
|
||||||
|
|
||||||
|
def join_pythonpath(*dirs):
|
||||||
|
cur = py.std.os.environ.get('PYTHONPATH')
|
||||||
|
if cur:
|
||||||
|
dirs += (cur,)
|
||||||
|
return os.pathsep.join(str(p) for p in dirs)
|
||||||
|
|
||||||
|
monkeypatch.setenv('PYTHONPATH', join_pythonpath(*search_path))
|
||||||
|
for p in search_path:
|
||||||
|
monkeypatch.syspath_prepend(p)
|
||||||
|
|
||||||
|
# module picked up in symlink-ed directory:
|
||||||
|
result = testdir.runpytest("--pyargs", "-v", "foo.bar")
|
||||||
|
testdir.chdir()
|
||||||
|
assert result.ret == 0
|
||||||
|
result.stdout.fnmatch_lines([
|
||||||
|
"*lib/foo/bar/test_bar.py::test_bar*PASSED*",
|
||||||
|
"*lib/foo/bar/test_bar.py::test_other*PASSED*",
|
||||||
|
"*2 passed*"
|
||||||
|
])
|
||||||
|
|
||||||
def test_cmdline_python_package_not_exists(self, testdir):
|
def test_cmdline_python_package_not_exists(self, testdir):
|
||||||
result = testdir.runpytest("--pyargs", "tpkgwhatv")
|
result = testdir.runpytest("--pyargs", "tpkgwhatv")
|
||||||
assert result.ret
|
assert result.ret
|
||||||
|
|
Loading…
Reference in New Issue