diff options
author | Jason R. Coombs <jaraco@jaraco.com> | 2016-12-11 15:40:54 -0500 |
---|---|---|
committer | Jason R. Coombs <jaraco@jaraco.com> | 2016-12-11 15:57:23 -0500 |
commit | 67aefd1b218e5a97fb4be7830ac4b28d8eb6a26e (patch) | |
tree | 82e40eaa20e4ee8eb41f8319e84c40dc75317a07 /setuptools | |
parent | acd949909b158557984ad9a4ffda401367f089c5 (diff) | |
parent | 3dd506f01d48b98aeea9bdbca0105d4c7d8ad538 (diff) | |
download | external_python_setuptools-67aefd1b218e5a97fb4be7830ac4b28d8eb6a26e.tar.gz external_python_setuptools-67aefd1b218e5a97fb4be7830ac4b28d8eb6a26e.tar.bz2 external_python_setuptools-67aefd1b218e5a97fb4be7830ac4b28d8eb6a26e.zip |
Merge branch 'develop-nspkg-always' into issue250-module_from_spec
Diffstat (limited to 'setuptools')
-rwxr-xr-x | setuptools/command/develop.py | 6 | ||||
-rwxr-xr-x | setuptools/namespaces.py | 14 | ||||
-rw-r--r-- | setuptools/tests/test_develop.py | 49 |
3 files changed, 64 insertions, 5 deletions
diff --git a/setuptools/command/develop.py b/setuptools/command/develop.py index 3eb86120..aa82f959 100755 --- a/setuptools/command/develop.py +++ b/setuptools/command/develop.py @@ -9,10 +9,11 @@ from setuptools.extern import six from pkg_resources import Distribution, PathMetadata, normalize_path from setuptools.command.easy_install import easy_install +from setuptools import namespaces import setuptools -class develop(easy_install): +class develop(namespaces.DevelopInstaller, easy_install): """Set up package for development""" description = "install package in 'development mode'" @@ -30,6 +31,7 @@ class develop(easy_install): if self.uninstall: self.multi_version = True self.uninstall_link() + self.uninstall_namespaces() else: self.install_for_development() self.warn_deprecated_options() @@ -123,6 +125,8 @@ class develop(easy_install): self.easy_install(setuptools.bootstrap_install_from) setuptools.bootstrap_install_from = None + self.install_namespaces() + # create an .egg-link in the installation dir, pointing to our egg log.info("Creating %s (link to %s)", self.egg_link, self.egg_base) if not self.dry_run: diff --git a/setuptools/namespaces.py b/setuptools/namespaces.py index ce16286f..96aa20e7 100755 --- a/setuptools/namespaces.py +++ b/setuptools/namespaces.py @@ -31,21 +31,27 @@ class Installer: with open(filename, 'wt') as f: f.writelines(lines) + def uninstall_namespaces(self): + filename, ext = os.path.splitext(self._get_target()) + filename += self.nspkg_ext + if not os.path.exists(filename): + return + log.info("Removing %s", filename) + os.remove(filename) + def _get_target(self): return self.target _nspkg_tmpl = ( "import sys, types, os, importlib.util, importlib.machinery", - "pep420 = (3, 3) < sys.version_info < (3, 5)", "has_mfs = sys.version_info > (3, 5)", "p = os.path.join(%(root)s, *%(pth)r)", - "ie = os.path.exists(os.path.join(p,'__init__.py'))", - "m = not ie and not pep420 and has_mfs and " + "m = has_mfs and " "sys.modules.setdefault(%(pkg)r, " "importlib.util.module_from_spec(" "importlib.machinery.PathFinder.find_spec(%(pkg)r, " "[os.path.dirname(p)])))", - "m = not ie and not pep420 and not has_mfs and " + "m = not has_mfs and " "sys.modules.setdefault(%(pkg)r, types.ModuleType(%(pkg)r))", "mp = (m or []) and m.__dict__.setdefault('__path__',[])", "(p not in mp) and mp.append(p)", diff --git a/setuptools/tests/test_develop.py b/setuptools/tests/test_develop.py index 4cf483f2..e0227453 100644 --- a/setuptools/tests/test_develop.py +++ b/setuptools/tests/test_develop.py @@ -1,9 +1,13 @@ """develop tests """ + +from __future__ import absolute_import, unicode_literals + import os import site import sys import io +import subprocess from setuptools.extern import six @@ -12,6 +16,7 @@ import pytest from setuptools.command.develop import develop from setuptools.dist import Distribution from . import contexts +from . import namespaces SETUP_PY = """\ from setuptools import setup @@ -114,3 +119,47 @@ class TestDevelop: cmd.install_dir = tmpdir cmd.run() # assert '0.0' not in foocmd_text + + +class TestNamespaces: + + @staticmethod + def install_develop(src_dir, target): + + develop_cmd = [ + sys.executable, + 'setup.py', + 'develop', + '--install-dir', str(target), + ] + env = dict(PYTHONPATH=str(target)) + with src_dir.as_cwd(): + subprocess.check_call(develop_cmd, env=env) + + def test_namespace_package_importable(self, tmpdir): + """ + Installing two packages sharing the same namespace, one installed + naturally using pip or `--single-version-externally-managed` + and the other installed using `develop` 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') + target = tmpdir / 'packages' + # use pip to install to the target directory + install_cmd = [ + 'pip', + 'install', + str(pkg_A), + '-t', str(target), + ] + subprocess.check_call(install_cmd) + self.install_develop(pkg_B, target) + namespaces.make_site_dir(target) + try_import = [ + sys.executable, + '-c', 'import myns.pkgA; import myns.pkgB', + ] + env = dict(PYTHONPATH=str(target)) + subprocess.check_call(try_import, env=env) + |