[pypy-commit] pypy py3.3: Add more tests for zip-importing an archive whose filename contain non-ASCII characters, and fix bugs.
mjacob
noreply at buildbot.pypy.org
Tue Aug 25 23:41:56 CEST 2015
Author: Manuel Jacob <me at manueljacob.de>
Branch: py3.3
Changeset: r79230:6a89b5539f61
Date: 2015-08-25 23:41 +0200
http://bitbucket.org/pypy/pypy/changeset/6a89b5539f61/
Log: Add more tests for zip-importing an archive whose filename contain
non-ASCII characters, and fix bugs.
diff --git a/pypy/module/imp/importing.py b/pypy/module/imp/importing.py
--- a/pypy/module/imp/importing.py
+++ b/pypy/module/imp/importing.py
@@ -350,7 +350,7 @@
start = len(filename) - 4
stop = len(filename) - 1
if not 0 <= start <= stop or filename[start:stop].lower() != ".py":
- return space.wrap(filename)
+ return space.wrap_fsdecoded(filename)
py = make_source_pathname(filename)
if py is None:
py = filename[:-1]
@@ -360,8 +360,8 @@
pass
else:
if stat.S_ISREG(st.st_mode):
- return space.wrap(py)
- return space.wrap(filename)
+ return space.wrap_fsdecoded(py)
+ return space.wrap_fsdecoded(filename)
def update_code_filenames(space, code_w, pathname, oldname=None):
assert isinstance(code_w, PyCode)
diff --git a/pypy/module/zipimport/interp_zipimport.py b/pypy/module/zipimport/interp_zipimport.py
--- a/pypy/module/zipimport/interp_zipimport.py
+++ b/pypy/module/zipimport/interp_zipimport.py
@@ -146,7 +146,7 @@
def import_py_file(self, space, modname, filename, buf, pkgpath):
w = space.wrap
- w_mod = w(Module(space, w(modname)))
+ w_mod = w(Module(space, space.wrap_fsdecoded(modname)))
real_name = self.filename + os.path.sep + self.corr_zname(filename)
space.setattr(w_mod, w('__loader__'), space.wrap(self))
importing._prepare_module(space, w_mod, real_name, pkgpath)
@@ -313,8 +313,8 @@
space, co_filename, source)
return space.wrap(code_w)
raise oefmt(get_error(space),
- "Cannot find source or code for %s in %s",
- filename, self.name)
+ "Cannot find source or code for %s in %R",
+ filename, space.wrap_fsdecoded(self.name))
@unwrap_spec(fullname='str0')
def get_source(self, space, fullname):
@@ -334,17 +334,19 @@
# We have the module, but no source.
return space.w_None
raise oefmt(get_error(space),
- "Cannot find source for %s in %s", filename, self.name)
+ "Cannot find source for %s in %R", filename,
+ space.wrap_fsdecoded(self.name))
@unwrap_spec(fullname='str0')
def get_filename(self, space, fullname):
filename = self.make_filename(fullname)
for _, is_package, ext in ENUMERATE_EXTS:
if self.have_modulefile(space, filename + ext):
- return space.wrap(self.filename + os.path.sep +
- self.corr_zname(filename + ext))
+ return space.wrap_fsdecoded(self.filename + os.path.sep +
+ self.corr_zname(filename + ext))
raise oefmt(get_error(space),
- "Cannot find module %s in %s", filename, self.name)
+ "Cannot find module %s in %R", filename,
+ space.wrap_fsdecoded(self.name))
@unwrap_spec(fullname='str0')
def is_package(self, space, fullname):
@@ -353,11 +355,12 @@
if self.have_modulefile(space, filename + ext):
return space.wrap(is_package)
raise oefmt(get_error(space),
- "Cannot find module %s in %s", filename, self.name)
+ "Cannot find module %s in %R", filename,
+ space.wrap_fsdecoded(self.name))
def getarchive(self, space):
space = self.space
- return space.wrap(self.filename)
+ return space.wrap_fsdecoded(self.filename)
def descr_new_zipimporter(space, w_type, w_name):
name = space.fsencode_w(w_name)
@@ -378,8 +381,8 @@
ok = True
break
if not ok:
- raise oefmt(get_error(space), "Did not find %s to be a valid zippath",
- name)
+ raise oefmt(get_error(space), "Did not find %R to be a valid zippath",
+ w_name)
try:
w_result = zip_cache.get(filename)
if w_result is None:
@@ -391,7 +394,8 @@
try:
zip_file = RZipFile(filename, 'r')
except (BadZipfile, OSError):
- raise oefmt(get_error(space), "%s seems not to be a zipfile", filename)
+ raise oefmt(get_error(space), "%R seems not to be a zipfile",
+ space.wrap_fsdecoded(filename))
except RZlibError, e:
# in this case, CPython raises the direct exception coming
# from the zlib module: let's to the same
diff --git a/pypy/module/zipimport/test/test_zipimport.py b/pypy/module/zipimport/test/test_zipimport.py
--- a/pypy/module/zipimport/test/test_zipimport.py
+++ b/pypy/module/zipimport/test/test_zipimport.py
@@ -1,3 +1,4 @@
+# -*- encoding: utf-8 -*-
import inspect
import os
import time
@@ -346,11 +347,48 @@
import zipimport
assert sys.path_hooks.count(zipimport.zipimporter) == 1
- def test_unicode_filename(self):
+ def w__make_unicode_filename(self):
+ import os
+ head, tail = os.path.split(self.zipfile)
+ self.zipfile = head + os.path.sep + tail[:4] + '_ä' + tail[4:]
+
+ def test_unicode_filename_notfound(self):
import zipimport
- raises(zipimport.ZipImportError,
+ raises(zipimport.ZipImportError,
zipimport.zipimporter, 'caf\xe9')
+ def test_unicode_filename_invalid_zippath(self):
+ import zipimport
+ import os
+ self._make_unicode_filename()
+ os.mkdir(self.zipfile)
+ raises(zipimport.ZipImportError,
+ zipimport.zipimporter, self.zipfile)
+
+ def test_unicode_filename_invalid_zip(self):
+ import zipimport
+ self._make_unicode_filename()
+ open(self.zipfile, 'wb').write(b'invalid zip')
+ raises(zipimport.ZipImportError,
+ zipimport.zipimporter, self.zipfile)
+
+ def test_unicode_filename_existing(self):
+ import zipimport
+ self._make_unicode_filename()
+ self.writefile('ä.py', '3')
+ z = zipimport.zipimporter(self.zipfile)
+ assert not z.is_package('ä')
+ raises(ImportError, z.is_package, 'xx')
+ assert z.get_source('ä') == '3'
+ raises(ImportError, z.get_source, 'xx')
+ assert z.get_code('ä')
+ raises(ImportError, z.get_code, 'xx')
+ mod = z.load_module('ä')
+ assert z.get_filename('ä') == mod.__file__
+ raises(ImportError, z.load_module, 'xx')
+ raises(ImportError, z.get_filename, 'xx')
+ assert z.archive == self.zipfile
+
def test_co_filename(self):
self.writefile('mymodule.py', """
def get_co_filename():
More information about the pypy-commit
mailing list