[pypy-svn] r48564 - in pypy/dist/pypy/module/zipimport: . test

fijal at codespeak.net fijal at codespeak.net
Sun Nov 11 14:38:56 CET 2007


Author: fijal
Date: Sun Nov 11 14:38:56 2007
New Revision: 48564

Modified:
   pypy/dist/pypy/module/zipimport/__init__.py
   pypy/dist/pypy/module/zipimport/app_zipimport.py
   pypy/dist/pypy/module/zipimport/interp_zipimport.py
   pypy/dist/pypy/module/zipimport/test/test_zipimport.py
Log:
Expose _zip_directory_cache, test it and actually use it.


Modified: pypy/dist/pypy/module/zipimport/__init__.py
==============================================================================
--- pypy/dist/pypy/module/zipimport/__init__.py	(original)
+++ pypy/dist/pypy/module/zipimport/__init__.py	Sun Nov 11 14:38:56 2007
@@ -10,6 +10,7 @@
     interpleveldefs = {'zipimporter':'interp_zipimport.W_ZipImporter'}
 
     appleveldefs = {
-        'ZipImportError' : 'app_zipimport.ZipImportError',
+        'ZipImportError'      : 'app_zipimport.ZipImportError',
+        '_zip_directory_cache': 'app_zipimport._zip_directory_cache',
     }
     

Modified: pypy/dist/pypy/module/zipimport/app_zipimport.py
==============================================================================
--- pypy/dist/pypy/module/zipimport/app_zipimport.py	(original)
+++ pypy/dist/pypy/module/zipimport/app_zipimport.py	Sun Nov 11 14:38:56 2007
@@ -1,3 +1,5 @@
 
 class ZipImportError(Exception):
     pass
+
+_zip_directory_cache = {}

Modified: pypy/dist/pypy/module/zipimport/interp_zipimport.py
==============================================================================
--- pypy/dist/pypy/module/zipimport/interp_zipimport.py	(original)
+++ pypy/dist/pypy/module/zipimport/interp_zipimport.py	Sun Nov 11 14:38:56 2007
@@ -16,8 +16,6 @@
 # note that zipfiles always use slash, but for OSes with other
 # separators, we need to pretend that we had the os.sep.
 
-zip_importer_cache = {}
-
 ENUMERATE_EXTS = unrolling_iterable(
     [(True, True, os.path.sep + '__init__.pyc'),
      (True, True, os.path.sep + '__init__.pyo'),
@@ -167,14 +165,19 @@
         return space.wrap(self.name)
 
 def descr_new_zipimporter(space, w_type, name):
+    w_zip_cache = space.getattr(space.getbuiltinmodule('zipimport'),
+                                space.wrap('_zip_directory_cache'))
     try:
-        result = zip_importer_cache[name]
-        if result is None:
+        w_result = space.getitem(w_zip_cache, space.wrap(name))
+        if space.is_w(w_result, space.w_None):
             raise OperationError(space.w_ImportError, space.wrap(
                 "Cannot import %s from zipfile, recursion detected or"
                 "already tried and failed" % (name,)))
-    except KeyError:
-        zip_importer_cache[name] = None
+        return w_result
+    except OperationError, o:
+        if not o.match(space, space.w_KeyError):
+            raise
+        space.setitem(w_zip_cache, space.wrap(name), space.w_None)
     ok = False
     parts = name.split(os.path.sep)
     filename = "" # make annotator happy
@@ -205,9 +208,9 @@
     except OperationError, e: # we catch everything as this function
         raise OperationError(space.w_ImportError, space.wrap(
             "%s seems not to be a zipfile" % (filename,)))
-    result = space.wrap(W_ZipImporter(space, name, w_dir, w_zipfile))
-    zip_importer_cache[name] = result
-    return result
+    w_result = space.wrap(W_ZipImporter(space, name, w_dir, w_zipfile))
+    space.setitem(w_zip_cache, space.wrap(name), w_result)
+    return w_result
     
 descr_new_zipimporter.unwrap_spec = [ObjSpace, W_Root, str]
 

Modified: pypy/dist/pypy/module/zipimport/test/test_zipimport.py
==============================================================================
--- pypy/dist/pypy/module/zipimport/test/test_zipimport.py	(original)
+++ pypy/dist/pypy/module/zipimport/test/test_zipimport.py	Sun Nov 11 14:38:56 2007
@@ -42,7 +42,7 @@
         """).compile()
         space = gettestobjspace(usemodules=['zipimport', 'zlib', 'rctime'])
         cls.space = space
-        tmpdir = udir.ensure('zipimport', dir=1)
+        tmpdir = udir.ensure('zipimport_%s' % cls.__name__, dir=1)
         now = time.time()
         cls.w_now = space.wrap(now)
         test_pyc = cls.make_pyc(space, co, now)
@@ -90,6 +90,15 @@
             sys.path.pop(0)
         """)
 
+    def test_cache(self):
+        self.writefile(self, 'x.py', 'y')
+        from zipimport import _zip_directory_cache, zipimporter
+        new_importer = zipimporter(self.zipfile)
+        try:
+            assert zipimporter(self.zipfile) is new_importer
+        finally:
+            del _zip_directory_cache[self.zipfile]
+
     def test_good_bad_arguments(self):
         from zipimport import zipimporter
         import os



More information about the Pypy-commit mailing list