[Python-checkins] cpython: add filtering of individual files to PyZipFile

christian.tismer python-checkins at python.org
Tue Oct 22 04:09:37 CEST 2013


http://hg.python.org/cpython/rev/4f1121ae1cb5
changeset:   86555:4f1121ae1cb5
user:        Christian Tismer  <tismer at stackless.com>
date:        Tue Oct 22 04:09:28 2013 +0200
summary:
  add filtering of individual files to PyZipFile

changed output of debug messages to say "path" or "file"
extended test for filtering  certain files in a package
added test for filtering files in a python dir (no package)

files:
  Lib/test/test_zipfile.py |  31 +++++++++++++++++++++++++++-
  Lib/zipfile.py           |  11 +++++++++-
  2 files changed, 40 insertions(+), 2 deletions(-)


diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py
--- a/Lib/test/test_zipfile.py
+++ b/Lib/test/test_zipfile.py
@@ -604,12 +604,21 @@
             reportStr = reportSIO.getvalue()
             self.assertTrue('SyntaxError' in reportStr)
 
-            # then check that the filter works
+            # then check that the filter works on the whole package
             with captured_stdout() as reportSIO:
                 zipfp.writepy(packagedir, filterfunc=lambda whatever: False)
             reportStr = reportSIO.getvalue()
             self.assertTrue('SyntaxError' not in reportStr)
 
+            # then check that the filter works on individual files
+            with captured_stdout() as reportSIO:
+                zipfp.writepy(packagedir, filterfunc=lambda fn:
+                                                     'bad' not in fn)
+            reportStr = reportSIO.getvalue()
+            if reportStr:
+                print(reportStr)
+            self.assertTrue('SyntaxError' not in reportStr)
+
     def test_write_with_optimization(self):
         import email
         packagedir = os.path.dirname(email.__file__)
@@ -649,6 +658,26 @@
         finally:
             shutil.rmtree(TESTFN2)
 
+    def test_write_python_directory_filtered(self):
+        os.mkdir(TESTFN2)
+        try:
+            with open(os.path.join(TESTFN2, "mod1.py"), "w") as fp:
+                fp.write("print(42)\n")
+
+            with open(os.path.join(TESTFN2, "mod2.py"), "w") as fp:
+                fp.write("print(42 * 42)\n")
+
+            with TemporaryFile() as t, zipfile.PyZipFile(t, "w") as zipfp:
+                zipfp.writepy(TESTFN2, filterfunc=lambda fn:
+                                                  not fn.endswith('mod2.py'))
+
+                names = zipfp.namelist()
+                self.assertCompiledIn('mod1.py', names)
+                self.assertNotIn('mod2.py', names)
+
+        finally:
+            shutil.rmtree(TESTFN2)
+
     def test_write_non_pyfile(self):
         with TemporaryFile() as t, zipfile.PyZipFile(t, "w") as zipfp:
             with open(TESTFN, 'w') as f:
diff --git a/Lib/zipfile.py b/Lib/zipfile.py
--- a/Lib/zipfile.py
+++ b/Lib/zipfile.py
@@ -1582,7 +1582,8 @@
         """
         if filterfunc and not filterfunc(pathname):
             if self.debug:
-                print('pathname "%s" skipped by filterfunc' % pathname)
+                label = 'path' if os.path.isdir(pathname) else 'file'
+                print('%s "%s" skipped by filterfunc' % (label, pathname))
             return
         dir, name = os.path.split(pathname)
         if os.path.isdir(pathname):
@@ -1611,6 +1612,10 @@
                             self.writepy(path, basename,
                                          filterfunc=filterfunc)  # Recursive call
                     elif ext == ".py":
+                        if filterfunc and not filterfunc(path):
+                            if self.debug:
+                                print('file "%s" skipped by filterfunc' % path)
+                            continue
                         fname, arcname = self._get_codename(path[0:-3],
                                                             basename)
                         if self.debug:
@@ -1624,6 +1629,10 @@
                     path = os.path.join(pathname, filename)
                     root, ext = os.path.splitext(filename)
                     if ext == ".py":
+                        if filterfunc and not filterfunc(path):
+                            if self.debug:
+                                print('file "%s" skipped by filterfunc' % path)
+                            continue
                         fname, arcname = self._get_codename(path[0:-3],
                                                             basename)
                         if self.debug:

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list