aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenoit Pierre <benoit.pierre@gmail.com>2017-11-27 23:19:38 +0100
committerGitHub <noreply@github.com>2017-11-27 23:19:38 +0100
commitb9df5fd4d08347b9db0e486af43d08978cb9f4bc (patch)
treee3865ad7928e3274a743fd82159a2add0b70db4f
parentb066b29042daf7b60c40d116f823ac28943cfbad (diff)
parentda1c78f354fac3ce177e2869828a34b3e6df1820 (diff)
downloadexternal_python_setuptools-b9df5fd4d08347b9db0e486af43d08978cb9f4bc.tar.gz
external_python_setuptools-b9df5fd4d08347b9db0e486af43d08978cb9f4bc.tar.bz2
external_python_setuptools-b9df5fd4d08347b9db0e486af43d08978cb9f4bc.zip
Merge pull request #1215 from benoit-pierre/fix_wheels_namespace_packages
fix namespace packages handling of wheels
-rw-r--r--CHANGES.rst6
-rw-r--r--setuptools/tests/test_wheel.py32
-rw-r--r--setuptools/wheel.py18
3 files changed, 56 insertions, 0 deletions
diff --git a/CHANGES.rst b/CHANGES.rst
index d5fd66a3..3886854a 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -1,3 +1,9 @@
+v38.2.2
+-------
+
+* #1214: fix handling of namespace packages when installing
+ from a wheel.
+
v38.2.1
-------
diff --git a/setuptools/tests/test_wheel.py b/setuptools/tests/test_wheel.py
index 2e857253..408c3576 100644
--- a/setuptools/tests/test_wheel.py
+++ b/setuptools/tests/test_wheel.py
@@ -412,6 +412,38 @@ WHEEL_INSTALL_TESTS = (
),
),
+ dict(
+ id='namespace_package',
+ file_defs={
+ 'foo': {
+ 'bar': {
+ '__init__.py': ''
+ },
+ },
+ },
+ setup_kwargs=dict(
+ namespace_packages=['foo'],
+ packages=['foo.bar'],
+ ),
+ install_tree=DALS(
+ '''
+ foo-1.0-py{py_version}.egg/
+ |-- foo-1.0-py{py_version}-nspkg.pth
+ |-- EGG-INFO/
+ | |-- DESCRIPTION.rst
+ | |-- PKG-INFO
+ | |-- RECORD
+ | |-- WHEEL
+ | |-- metadata.json
+ | |-- namespace_packages.txt
+ | |-- top_level.txt
+ |-- foo/
+ | |-- __init__.py
+ | |-- bar/
+ | | |-- __init__.py
+ '''),
+ ),
+
)
@pytest.mark.parametrize(
diff --git a/setuptools/wheel.py b/setuptools/wheel.py
index f711f38b..c2327213 100644
--- a/setuptools/wheel.py
+++ b/setuptools/wheel.py
@@ -20,6 +20,13 @@ WHEEL_NAME = re.compile(
)\.whl$""",
re.VERBOSE).match
+NAMESPACE_PACKAGE_INIT = '''\
+try:
+ __import__('pkg_resources').declare_namespace(__name__)
+except ImportError:
+ __path__ = __import__('pkgutil').extend_path(__path__, __name__)
+'''
+
class Wheel(object):
@@ -124,3 +131,14 @@ class Wheel(object):
os.rmdir(subdir)
if os.path.exists(dist_data):
os.rmdir(dist_data)
+ # Fix namespace packages.
+ namespace_packages = os.path.join(egg_info, 'namespace_packages.txt')
+ if os.path.exists(namespace_packages):
+ with open(namespace_packages) as fp:
+ namespace_packages = fp.read().split()
+ for mod in namespace_packages:
+ mod_dir = os.path.join(destination_eggdir, *mod.split('.'))
+ mod_init = os.path.join(mod_dir, '__init__.py')
+ if os.path.exists(mod_dir) and not os.path.exists(mod_init):
+ with open(mod_init, 'w') as fp:
+ fp.write(NAMESPACE_PACKAGE_INIT)