monkeypatch.syspath_prepend: call fixup_namespace_packages
Without the patch the test fails as follows: # Prepending should call fixup_namespace_packages. monkeypatch.syspath_prepend("world") > import ns_pkg.world E ModuleNotFoundError: No module named 'ns_pkg.world'
This commit is contained in:
parent
15d608867d
commit
475119988c
|
@ -0,0 +1 @@
|
||||||
|
``monkeypatch.syspath_prepend`` calls ``pkg_resources.fixup_namespace_packages`` to handle namespace packages better.
|
|
@ -262,10 +262,15 @@ class MonkeyPatch(object):
|
||||||
|
|
||||||
def syspath_prepend(self, path):
|
def syspath_prepend(self, path):
|
||||||
""" Prepend ``path`` to ``sys.path`` list of import locations. """
|
""" Prepend ``path`` to ``sys.path`` list of import locations. """
|
||||||
|
from pkg_resources import fixup_namespace_packages
|
||||||
|
|
||||||
if self._savesyspath is None:
|
if self._savesyspath is None:
|
||||||
self._savesyspath = sys.path[:]
|
self._savesyspath = sys.path[:]
|
||||||
sys.path.insert(0, str(path))
|
sys.path.insert(0, str(path))
|
||||||
|
|
||||||
|
# https://github.com/pypa/setuptools/blob/d8b901bc/docs/pkg_resources.txt#L162-L171
|
||||||
|
fixup_namespace_packages(str(path))
|
||||||
|
|
||||||
def chdir(self, path):
|
def chdir(self, path):
|
||||||
""" Change the current working directory to the specified path.
|
""" Change the current working directory to the specified path.
|
||||||
Path can be a string or a py.path.local object.
|
Path can be a string or a py.path.local object.
|
||||||
|
|
|
@ -437,3 +437,28 @@ def test_context():
|
||||||
m.setattr(functools, "partial", 3)
|
m.setattr(functools, "partial", 3)
|
||||||
assert not inspect.isclass(functools.partial)
|
assert not inspect.isclass(functools.partial)
|
||||||
assert inspect.isclass(functools.partial)
|
assert inspect.isclass(functools.partial)
|
||||||
|
|
||||||
|
|
||||||
|
def test_syspath_prepend_with_namespace_packages(testdir, monkeypatch):
|
||||||
|
for dirname in "hello", "world":
|
||||||
|
d = testdir.mkdir(dirname)
|
||||||
|
ns = d.mkdir("ns_pkg")
|
||||||
|
ns.join("__init__.py").write(
|
||||||
|
"__import__('pkg_resources').declare_namespace(__name__)"
|
||||||
|
)
|
||||||
|
lib = ns.mkdir(dirname)
|
||||||
|
lib.join("__init__.py").write("def check(): return %r" % dirname)
|
||||||
|
|
||||||
|
monkeypatch.syspath_prepend("hello")
|
||||||
|
import ns_pkg.hello
|
||||||
|
|
||||||
|
assert ns_pkg.hello.check() == "hello"
|
||||||
|
|
||||||
|
with pytest.raises(ImportError):
|
||||||
|
import ns_pkg.world
|
||||||
|
|
||||||
|
# Prepending should call fixup_namespace_packages.
|
||||||
|
monkeypatch.syspath_prepend("world")
|
||||||
|
import ns_pkg.world
|
||||||
|
|
||||||
|
assert ns_pkg.world.check() == "world"
|
||||||
|
|
Loading…
Reference in New Issue