aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--setuptools/tests/test_wheel.py36
-rw-r--r--setuptools/wheel.py27
2 files changed, 59 insertions, 4 deletions
diff --git a/setuptools/tests/test_wheel.py b/setuptools/tests/test_wheel.py
index 408c3576..b6be6f1f 100644
--- a/setuptools/tests/test_wheel.py
+++ b/setuptools/tests/test_wheel.py
@@ -444,6 +444,42 @@ WHEEL_INSTALL_TESTS = (
'''),
),
+ dict(
+ id='data_in_package',
+ file_defs={
+ 'foo': {
+ '__init__.py': '',
+ 'data_dir': {
+ 'data.txt': DALS(
+ '''
+ Some data...
+ '''
+ ),
+ }
+ }
+ },
+ setup_kwargs=dict(
+ packages=['foo'],
+ data_files=[('foo/data_dir', ['foo/data_dir/data.txt'])],
+ ),
+ install_tree=DALS(
+ '''
+ foo-1.0-py{py_version}.egg/
+ |-- EGG-INFO/
+ | |-- DESCRIPTION.rst
+ | |-- PKG-INFO
+ | |-- RECORD
+ | |-- WHEEL
+ | |-- metadata.json
+ | |-- top_level.txt
+ |-- foo/
+ | |-- __init__.py
+ | |-- data_dir/
+ | | |-- data.txt
+ '''
+ ),
+ ),
+
)
@pytest.mark.parametrize(
diff --git a/setuptools/wheel.py b/setuptools/wheel.py
index c2327213..9ffe434a 100644
--- a/setuptools/wheel.py
+++ b/setuptools/wheel.py
@@ -28,6 +28,28 @@ except ImportError:
'''
+def unpack(src_dir, dst_dir):
+ '''Move everything under `src_dir` to `dst_dir`, and delete the former.'''
+ for dirpath, dirnames, filenames in os.walk(src_dir):
+ subdir = os.path.relpath(dirpath, src_dir)
+ for f in filenames:
+ src = os.path.join(dirpath, f)
+ dst = os.path.join(dst_dir, subdir, f)
+ os.renames(src, dst)
+ for n, d in reversed(list(enumerate(dirnames))):
+ src = os.path.join(dirpath, d)
+ dst = os.path.join(dst_dir, subdir, d)
+ if not os.path.exists(dst):
+ # Directory does not exist in destination,
+ # rename it and prune it from os.walk list.
+ os.renames(src, dst)
+ del dirnames[n]
+ # Cleanup.
+ for dirpath, dirnames, filenames in os.walk(src_dir, topdown=True):
+ assert not filenames
+ os.rmdir(dirpath)
+
+
class Wheel(object):
def __init__(self, filename):
@@ -125,10 +147,7 @@ class Wheel(object):
os.path.join(dist_data, d)
for d in ('data', 'headers', 'purelib', 'platlib')
)):
- for entry in os.listdir(subdir):
- os.rename(os.path.join(subdir, entry),
- os.path.join(destination_eggdir, entry))
- os.rmdir(subdir)
+ unpack(subdir, destination_eggdir)
if os.path.exists(dist_data):
os.rmdir(dist_data)
# Fix namespace packages.