Commit 35c0e9c2 authored by Benoit Pierre's avatar Benoit Pierre

fix `data_files` handling when installing from wheel

parent b729553a
...@@ -444,6 +444,42 @@ WHEEL_INSTALL_TESTS = ( ...@@ -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( @pytest.mark.parametrize(
......
...@@ -28,6 +28,28 @@ except ImportError: ...@@ -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): class Wheel(object):
def __init__(self, filename): def __init__(self, filename):
...@@ -125,10 +147,7 @@ class Wheel(object): ...@@ -125,10 +147,7 @@ class Wheel(object):
os.path.join(dist_data, d) os.path.join(dist_data, d)
for d in ('data', 'headers', 'purelib', 'platlib') for d in ('data', 'headers', 'purelib', 'platlib')
)): )):
for entry in os.listdir(subdir): unpack(subdir, destination_eggdir)
os.rename(os.path.join(subdir, entry),
os.path.join(destination_eggdir, entry))
os.rmdir(subdir)
if os.path.exists(dist_data): if os.path.exists(dist_data):
os.rmdir(dist_data) os.rmdir(dist_data)
# Fix namespace packages. # Fix namespace packages.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment