|
import sys |
|
import subprocess |
|
|
|
from setuptools._path import paths_on_pythonpath |
|
|
|
from . import namespaces |
|
|
|
|
|
class TestNamespaces: |
|
def test_mixed_site_and_non_site(self, tmpdir): |
|
""" |
|
Installing two packages sharing the same namespace, one installed |
|
to a site dir and the other installed just to a path on PYTHONPATH |
|
should leave the namespace in tact and both packages reachable by |
|
import. |
|
""" |
|
pkg_A = namespaces.build_namespace_package(tmpdir, 'myns.pkgA') |
|
pkg_B = namespaces.build_namespace_package(tmpdir, 'myns.pkgB') |
|
site_packages = tmpdir / 'site-packages' |
|
path_packages = tmpdir / 'path-packages' |
|
targets = site_packages, path_packages |
|
|
|
install_cmd = [ |
|
sys.executable, |
|
'-m', |
|
'pip.__main__', |
|
'install', |
|
str(pkg_A), |
|
'-t', |
|
str(site_packages), |
|
] |
|
subprocess.check_call(install_cmd) |
|
namespaces.make_site_dir(site_packages) |
|
install_cmd = [ |
|
sys.executable, |
|
'-m', |
|
'pip.__main__', |
|
'install', |
|
str(pkg_B), |
|
'-t', |
|
str(path_packages), |
|
] |
|
subprocess.check_call(install_cmd) |
|
try_import = [ |
|
sys.executable, |
|
'-c', |
|
'import myns.pkgA; import myns.pkgB', |
|
] |
|
with paths_on_pythonpath(map(str, targets)): |
|
subprocess.check_call(try_import) |
|
|
|
def test_pkg_resources_import(self, tmpdir): |
|
""" |
|
Ensure that a namespace package doesn't break on import |
|
of pkg_resources. |
|
""" |
|
pkg = namespaces.build_namespace_package(tmpdir, 'myns.pkgA') |
|
target = tmpdir / 'packages' |
|
target.mkdir() |
|
install_cmd = [ |
|
sys.executable, |
|
'-m', |
|
'pip', |
|
'install', |
|
'-t', |
|
str(target), |
|
str(pkg), |
|
] |
|
with paths_on_pythonpath([str(target)]): |
|
subprocess.check_call(install_cmd) |
|
namespaces.make_site_dir(target) |
|
try_import = [ |
|
sys.executable, |
|
'-c', |
|
'import pkg_resources', |
|
] |
|
with paths_on_pythonpath([str(target)]): |
|
subprocess.check_call(try_import) |
|
|
|
def test_namespace_package_installed_and_cwd(self, tmpdir): |
|
""" |
|
Installing a namespace packages but also having it in the current |
|
working directory, only one version should take precedence. |
|
""" |
|
pkg_A = namespaces.build_namespace_package(tmpdir, 'myns.pkgA') |
|
target = tmpdir / 'packages' |
|
|
|
install_cmd = [ |
|
sys.executable, |
|
'-m', |
|
'pip.__main__', |
|
'install', |
|
str(pkg_A), |
|
'-t', |
|
str(target), |
|
] |
|
subprocess.check_call(install_cmd) |
|
namespaces.make_site_dir(target) |
|
|
|
|
|
pkg_resources_imp = [ |
|
sys.executable, |
|
'-c', |
|
'import pkg_resources; import myns.pkgA', |
|
] |
|
with paths_on_pythonpath([str(target)]): |
|
subprocess.check_call(pkg_resources_imp, cwd=str(pkg_A)) |
|
|
|
def test_packages_in_the_same_namespace_installed_and_cwd(self, tmpdir): |
|
""" |
|
Installing one namespace package and also have another in the same |
|
namespace in the current working directory, both of them must be |
|
importable. |
|
""" |
|
pkg_A = namespaces.build_namespace_package(tmpdir, 'myns.pkgA') |
|
pkg_B = namespaces.build_namespace_package(tmpdir, 'myns.pkgB') |
|
target = tmpdir / 'packages' |
|
|
|
install_cmd = [ |
|
sys.executable, |
|
'-m', |
|
'pip.__main__', |
|
'install', |
|
str(pkg_A), |
|
'-t', |
|
str(target), |
|
] |
|
subprocess.check_call(install_cmd) |
|
namespaces.make_site_dir(target) |
|
|
|
|
|
pkg_resources_imp = [ |
|
sys.executable, |
|
'-c', |
|
'import pkg_resources; import myns.pkgA; import myns.pkgB', |
|
] |
|
with paths_on_pythonpath([str(target)]): |
|
subprocess.check_call(pkg_resources_imp, cwd=str(pkg_B)) |
|
|