Imported Upstream version 38.2.5 upstream/38.2.5
authorDongHun Kwak <dh0128.kwak@samsung.com>
Mon, 14 Jan 2019 01:40:47 +0000 (10:40 +0900)
committerDongHun Kwak <dh0128.kwak@samsung.com>
Mon, 14 Jan 2019 01:40:47 +0000 (10:40 +0900)
CHANGES.rst
pkg_resources/__init__.py
pkg_resources/tests/test_pkg_resources.py
setup.cfg
setup.py

index 3694b15272c89def39d34831527f0445f81fad32..7227b7fe7cebfcb466d809eb0488494560bc2d54 100644 (file)
@@ -1,3 +1,8 @@
+v38.2.5
+-------
+
+* #1232: Fix trailing slash handling in ``pkg_resources.ZipProvider``.
+
 v38.2.4
 -------
 
index 73334641b5675510711b30d26ab7834b7990fd1a..08f9bbe7ef55e38f910e7a79af2d6da290488f9b 100644 (file)
@@ -1693,6 +1693,9 @@ class ZipProvider(EggProvider):
     def _zipinfo_name(self, fspath):
         # Convert a virtual filename (full path to file) into a zipfile subpath
         # usable with the zipimport directory cache for our target archive
+        fspath = fspath.rstrip(os.sep)
+        if fspath == self.loader.archive:
+            return ''
         if fspath.startswith(self.zip_pre):
             return fspath[len(self.zip_pre):]
         raise AssertionError(
index c6a7ac97e93467b60dbd8e419bf53142881c8cc8..f2c00b297b6ebe66b7ee0df44b0f562b75cbdc0d 100644 (file)
@@ -62,10 +62,21 @@ class TestZipProvider(object):
         zip_info.filename = 'data.dat'
         zip_info.date_time = cls.ref_time.timetuple()
         zip_egg.writestr(zip_info, 'hello, world!')
+        zip_info = zipfile.ZipInfo()
+        zip_info.filename = 'subdir/mod2.py'
+        zip_info.date_time = cls.ref_time.timetuple()
+        zip_egg.writestr(zip_info, 'x = 6\n')
+        zip_info = zipfile.ZipInfo()
+        zip_info.filename = 'subdir/data2.dat'
+        zip_info.date_time = cls.ref_time.timetuple()
+        zip_egg.writestr(zip_info, 'goodbye, world!')
         zip_egg.close()
         egg.close()
 
         sys.path.append(egg.name)
+        subdir = os.path.join(egg.name, 'subdir')
+        sys.path.append(subdir)
+        cls.finalizers.append(EggRemover(subdir))
         cls.finalizers.append(EggRemover(egg.name))
 
     @classmethod
@@ -73,6 +84,30 @@ class TestZipProvider(object):
         for finalizer in cls.finalizers:
             finalizer()
 
+    def test_resource_listdir(self):
+        import mod
+        zp = pkg_resources.ZipProvider(mod)
+
+        expected_root = ['data.dat', 'mod.py', 'subdir']
+        assert sorted(zp.resource_listdir('')) == expected_root
+        assert sorted(zp.resource_listdir('/')) == expected_root
+
+        expected_subdir = ['data2.dat', 'mod2.py']
+        assert sorted(zp.resource_listdir('subdir')) == expected_subdir
+        assert sorted(zp.resource_listdir('subdir/')) == expected_subdir
+
+        assert zp.resource_listdir('nonexistent') == []
+        assert zp.resource_listdir('nonexistent/') == []
+
+        import mod2
+        zp2 = pkg_resources.ZipProvider(mod2)
+
+        assert sorted(zp2.resource_listdir('')) == expected_subdir
+        assert sorted(zp2.resource_listdir('/')) == expected_subdir
+
+        assert zp2.resource_listdir('subdir') == []
+        assert zp2.resource_listdir('subdir/') == []
+
     def test_resource_filename_rewrites_on_change(self):
         """
         If a previous call to get_resource_filename has saved the file, but
index d6f1a195b539a529c078f92c03bff70f6da30fc3..0a33329c10d7583ac1512130cf8baf0182603c3e 100755 (executable)
--- a/setup.cfg
+++ b/setup.cfg
@@ -1,5 +1,5 @@
 [bumpversion]
-current_version = 38.2.4
+current_version = 38.2.5
 commit = True
 tag = True
 
index 0e3e42c5367b91d25c9313b7d99a8b71f6d3ad4f..af799e465ac9c013044f2b77b2e118ae584c1f9c 100755 (executable)
--- a/setup.py
+++ b/setup.py
@@ -89,7 +89,7 @@ def pypi_link(pkg_filename):
 
 setup_params = dict(
     name="setuptools",
-    version="38.2.4",
+    version="38.2.5",
     description="Easily download, build, install, upgrade, and uninstall "
         "Python packages",
     author="Python Packaging Authority",