[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