with self.assertRaises(zipapp.ZipAppError):
zipapp.create_archive(source, target)
+ def test_target_overwrites_filtered_source_file(self):
+ # If there's a filter that excludes the target,
+ # the overwrite check shouldn't trigger.
+ source = self.tmpdir
+ (source / '__main__.py').touch()
+ target = source / 'target.pyz'
+ target.touch()
+ pyz_filter = lambda p: not p.match('*.pyz')
+ zipapp.create_archive(source, target, filter=pyz_filter)
+ with zipfile.ZipFile(target, 'r') as z:
+ self.assertEqual(len(z.namelist()), 1)
+ self.assertIn('__main__.py', z.namelist())
+
def test_create_archive_filter_exclude_dir(self):
# Test packing a directory and using a filter to exclude a
# subdirectory (ensures that the path supplied to include
# Create the list of files to add to the archive now, in case
# the target is being created in the source directory - we
# don't want the target being added to itself
- files_to_add = sorted(source.rglob('*'))
+ files_to_add = {}
+ for path in sorted(source.rglob('*')):
+ relative_path = path.relative_to(source)
+ if filter is None or filter(relative_path):
+ files_to_add[path] = relative_path
# The target cannot be in the list of files to add. If it were, we'd
# end up overwriting the source file and writing the archive into
compression = (zipfile.ZIP_DEFLATED if compressed else
zipfile.ZIP_STORED)
with zipfile.ZipFile(fd, 'w', compression=compression) as z:
- for child in files_to_add:
- arcname = child.relative_to(source)
- if filter is None or filter(arcname):
- z.write(child, arcname.as_posix())
+ for path, relative_path in files_to_add.items():
+ z.write(path, relative_path.as_posix())
if main_py:
z.writestr('__main__.py', main_py.encode('utf-8'))