[pypy-svn] r61373 - in pypy/trunk/pypy: config module/zipimport/test rlib

afa at codespeak.net afa at codespeak.net
Mon Jan 26 18:22:31 CET 2009


Author: afa
Date: Mon Jan 26 18:22:30 2009
New Revision: 61373

Modified:
   pypy/trunk/pypy/config/pypyoption.py
   pypy/trunk/pypy/module/zipimport/test/test_undocumented.py
   pypy/trunk/pypy/module/zipimport/test/test_zipimport.py
   pypy/trunk/pypy/rlib/rzipfile.py
Log:
Allow zipfile and zipimport to work without zlib: 
as long as files are simply stored and not deflated, a zip archive does not need this external library.

Automatically disable the zlib module if zlib.h cannot be found.
Now we can translate pypy on Windows without any option and without installing any external library.


Modified: pypy/trunk/pypy/config/pypyoption.py
==============================================================================
--- pypy/trunk/pypy/config/pypyoption.py	(original)
+++ pypy/trunk/pypy/config/pypyoption.py	Mon Jan 26 18:22:30 2009
@@ -67,7 +67,9 @@
 module_import_dependencies = {
     # no _rawffi if importing pypy.rlib.libffi raises ImportError
     # or CompilationError
-    "_rawffi": ["pypy.rlib.libffi"],
+    "_rawffi"   : ["pypy.rlib.libffi"],
+
+    "zlib"      : ["pypy.rlib.rzlib"],
     }
 
 def get_module_validator(modname):

Modified: pypy/trunk/pypy/module/zipimport/test/test_undocumented.py
==============================================================================
--- pypy/trunk/pypy/module/zipimport/test/test_undocumented.py	(original)
+++ pypy/trunk/pypy/module/zipimport/test/test_undocumented.py	Mon Jan 26 18:22:30 2009
@@ -66,7 +66,7 @@
 
 class AppTestZipImport:
     def setup_class(cls):
-        space = gettestobjspace(usemodules=['zipimport', 'zlib', 'rctime'])
+        space = gettestobjspace(usemodules=['zipimport', 'rctime'])
         cls.space = space
         source = "():\n" + str(py.code.Source(temp_zipfile).indent()) + "\n    return temp_zipfile"
         cls.w_temp_zipfile = space.appexec([], source)

Modified: pypy/trunk/pypy/module/zipimport/test/test_zipimport.py
==============================================================================
--- pypy/trunk/pypy/module/zipimport/test/test_zipimport.py	(original)
+++ pypy/trunk/pypy/module/zipimport/test/test_zipimport.py	Mon Jan 26 18:22:30 2009
@@ -40,7 +40,12 @@
         def get_file():
             return __file__
         """).compile()
-        space = gettestobjspace(usemodules=['zipimport', 'zlib', 'rctime'])
+
+        if cls.compression == ZIP_DEFLATED:
+            space = gettestobjspace(usemodules=['zipimport', 'zlib', 'rctime'])
+        else:
+            space = gettestobjspace(usemodules=['zipimport', 'rctime'])
+            
         cls.space = space
         tmpdir = udir.ensure('zipimport_%s' % cls.__name__, dir=1)
         now = time.time()
@@ -190,8 +195,8 @@
 
     def test_package(self):
         import os, sys
-        self.writefile(self, "xxuuu"+os.sep+"__init__.py", "")
-        self.writefile(self, "xxuuu"+os.sep+"yy.py", "def f(x): return x")
+        self.writefile(self, "xxuuu/__init__.py", "")
+        self.writefile(self, "xxuuu/yy.py", "def f(x): return x")
         mod = __import__("xxuuu", globals(), locals(), ['yy'])
         assert mod.__path__
         assert mod.yy.f(3) == 3
@@ -249,3 +254,11 @@
 
 class AppTestZipimportDeflated(AppTestZipimport):
     compression = ZIP_DEFLATED
+
+    def setup_class(cls):
+        try:
+            import pypy.rlib.rzlib
+        except ImportError:
+            py.test.skip("zlib not available, cannot test compressed zipfiles")
+        AppTestZipimport.setup_class(cls)
+        

Modified: pypy/trunk/pypy/rlib/rzipfile.py
==============================================================================
--- pypy/trunk/pypy/rlib/rzipfile.py	(original)
+++ pypy/trunk/pypy/rlib/rzipfile.py	Mon Jan 26 18:22:30 2009
@@ -2,9 +2,14 @@
 from zipfile import ZIP_STORED, ZIP_DEFLATED
 from pypy.rlib.streamio import open_file_as_stream
 from pypy.rlib.rstruct.runpack import runpack
-import os
-from pypy.rlib import rzlib
 from pypy.rlib.rarithmetic import r_uint, intmask
+from pypy.rpython.tool.rffi_platform import CompilationError
+import os
+
+try:
+    from pypy.rlib import rzlib
+except (ImportError, CompilationError):
+    rzlib = None
 
 # XXX hack to get crc32 to work
 from pypy.lib.binascii import crc_32_tab
@@ -229,7 +234,7 @@
         self.fp.seek(filepos, 0)
         if zinfo.compress_type == ZIP_STORED:
             pass
-        elif zinfo.compress_type == ZIP_DEFLATED:
+        elif zinfo.compress_type == ZIP_DEFLATED and rzlib is not None:
             stream = rzlib.inflateInit(wbits=-15)
             try:
                 bytes, _, _ = rzlib.decompress(stream, bytes)
@@ -239,6 +244,9 @@
                     bytes = bytes + ex
             finally:
                 rzlib.inflateEnd(stream)
+        elif zinfo.compress_type == ZIP_DEFLATED:
+            raise BadZipfile, \
+                  "Cannot decompress file, zlib not installed"
         else:
             raise BadZipfile, \
                   "Unsupported compression method %d for file %s" % \



More information about the Pypy-commit mailing list