Commit 449f8cf1 authored by Łukasz Langa's avatar Łukasz Langa

zipfile: remove remaining ResourceWarnings

parent efada8c8
...@@ -609,7 +609,7 @@ class TestZip64InSmallFiles(unittest.TestCase): ...@@ -609,7 +609,7 @@ class TestZip64InSmallFiles(unittest.TestCase):
class PyZipFileTests(unittest.TestCase): class PyZipFileTests(unittest.TestCase):
def test_write_pyfile(self): def test_write_pyfile(self):
with zipfile.PyZipFile(TemporaryFile(), "w") as zipfp: with TemporaryFile() as t, zipfile.PyZipFile(t, "w") as zipfp:
fn = __file__ fn = __file__
if fn.endswith('.pyc') or fn.endswith('.pyo'): if fn.endswith('.pyc') or fn.endswith('.pyo'):
path_split = fn.split(os.sep) path_split = fn.split(os.sep)
...@@ -627,7 +627,7 @@ class PyZipFileTests(unittest.TestCase): ...@@ -627,7 +627,7 @@ class PyZipFileTests(unittest.TestCase):
self.assertTrue(bn + 'o' in zipfp.namelist() or self.assertTrue(bn + 'o' in zipfp.namelist() or
bn + 'c' in zipfp.namelist()) bn + 'c' in zipfp.namelist())
with zipfile.PyZipFile(TemporaryFile(), "w") as zipfp: with TemporaryFile() as t, zipfile.PyZipFile(t, "w") as zipfp:
fn = __file__ fn = __file__
if fn.endswith(('.pyc', '.pyo')): if fn.endswith(('.pyc', '.pyo')):
fn = fn[:-1] fn = fn[:-1]
...@@ -643,7 +643,7 @@ class PyZipFileTests(unittest.TestCase): ...@@ -643,7 +643,7 @@ class PyZipFileTests(unittest.TestCase):
import email import email
packagedir = os.path.dirname(email.__file__) packagedir = os.path.dirname(email.__file__)
with zipfile.PyZipFile(TemporaryFile(), "w") as zipfp: with TemporaryFile() as t, zipfile.PyZipFile(t, "w") as zipfp:
zipfp.writepy(packagedir) zipfp.writepy(packagedir)
# Check for a couple of modules at different levels of the # Check for a couple of modules at different levels of the
...@@ -666,26 +666,25 @@ class PyZipFileTests(unittest.TestCase): ...@@ -666,26 +666,25 @@ class PyZipFileTests(unittest.TestCase):
with open(os.path.join(TESTFN2, "mod2.txt"), "w") as fp: with open(os.path.join(TESTFN2, "mod2.txt"), "w") as fp:
fp.write("bla bla bla\n") fp.write("bla bla bla\n")
zipfp = zipfile.PyZipFile(TemporaryFile(), "w") with TemporaryFile() as t, zipfile.PyZipFile(t, "w") as zipfp:
zipfp.writepy(TESTFN2) zipfp.writepy(TESTFN2)
names = zipfp.namelist() names = zipfp.namelist()
self.assertTrue('mod1.pyc' in names or 'mod1.pyo' in names) self.assertTrue('mod1.pyc' in names or 'mod1.pyo' in names)
self.assertTrue('mod2.pyc' in names or 'mod2.pyo' in names) self.assertTrue('mod2.pyc' in names or 'mod2.pyo' in names)
self.assertNotIn('mod2.txt', names) self.assertNotIn('mod2.txt', names)
finally: finally:
shutil.rmtree(TESTFN2) shutil.rmtree(TESTFN2)
def test_write_non_pyfile(self): def test_write_non_pyfile(self):
with zipfile.PyZipFile(TemporaryFile(), "w") as zipfp: with TemporaryFile() as t, zipfile.PyZipFile(t, "w") as zipfp:
with open(TESTFN, 'w') as f: with open(TESTFN, 'w') as f:
f.write('most definitely not a python file') f.write('most definitely not a python file')
self.assertRaises(RuntimeError, zipfp.writepy, TESTFN) self.assertRaises(RuntimeError, zipfp.writepy, TESTFN)
os.remove(TESTFN) os.remove(TESTFN)
class OtherTests(unittest.TestCase): class OtherTests(unittest.TestCase):
zips_with_bad_crc = { zips_with_bad_crc = {
zipfile.ZIP_STORED: ( zipfile.ZIP_STORED: (
......
...@@ -897,10 +897,8 @@ class ZipFile: ...@@ -897,10 +897,8 @@ class ZipFile:
# given a file object in the constructor # given a file object in the constructor
if self._filePassed: if self._filePassed:
zef_file = self.fp zef_file = self.fp
should_close = False
else: else:
zef_file = io.open(self.filename, 'rb') zef_file = io.open(self.filename, 'rb')
should_close = True
# Make sure we have an info object # Make sure we have an info object
if isinstance(name, ZipInfo): if isinstance(name, ZipInfo):
...@@ -908,8 +906,12 @@ class ZipFile: ...@@ -908,8 +906,12 @@ class ZipFile:
zinfo = name zinfo = name
else: else:
# Get info object for name # Get info object for name
zinfo = self.getinfo(name) try:
zinfo = self.getinfo(name)
except KeyError:
if not self._filePassed:
zef_file.close()
raise
zef_file.seek(zinfo.header_offset, 0) zef_file.seek(zinfo.header_offset, 0)
# Skip the file header: # Skip the file header:
...@@ -923,6 +925,8 @@ class ZipFile: ...@@ -923,6 +925,8 @@ class ZipFile:
zef_file.read(fheader[_FH_EXTRA_FIELD_LENGTH]) zef_file.read(fheader[_FH_EXTRA_FIELD_LENGTH])
if fname != zinfo.orig_filename.encode("utf-8"): if fname != zinfo.orig_filename.encode("utf-8"):
if not self._filePassed:
zef_file.close()
raise BadZipFile( raise BadZipFile(
'File name in directory %r and header %r differ.' 'File name in directory %r and header %r differ.'
% (zinfo.orig_filename, fname)) % (zinfo.orig_filename, fname))
...@@ -934,6 +938,8 @@ class ZipFile: ...@@ -934,6 +938,8 @@ class ZipFile:
if not pwd: if not pwd:
pwd = self.pwd pwd = self.pwd
if not pwd: if not pwd:
if not self._filePassed:
zef_file.close()
raise RuntimeError("File %s is encrypted, " raise RuntimeError("File %s is encrypted, "
"password required for extraction" % name) "password required for extraction" % name)
...@@ -952,9 +958,12 @@ class ZipFile: ...@@ -952,9 +958,12 @@ class ZipFile:
# compare against the CRC otherwise # compare against the CRC otherwise
check_byte = (zinfo.CRC >> 24) & 0xff check_byte = (zinfo.CRC >> 24) & 0xff
if h[11] != check_byte: if h[11] != check_byte:
if not self._filePassed:
zef_file.close()
raise RuntimeError("Bad password for file", name) raise RuntimeError("Bad password for file", name)
return ZipExtFile(zef_file, mode, zinfo, zd, close_fileobj=should_close) return ZipExtFile(zef_file, mode, zinfo, zd,
close_fileobj=not self._filePassed)
def extract(self, member, path=None, pwd=None): def extract(self, member, path=None, pwd=None):
"""Extract a member from the archive to the current working directory, """Extract a member from the archive to the current working directory,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment