diff options
author | Łukasz Langa <lukasz@langa.pl> | 2010-11-23 00:15:02 (GMT) |
---|---|---|
committer | Łukasz Langa <lukasz@langa.pl> | 2010-11-23 00:15:02 (GMT) |
commit | a9f054b423cd2c8b7b37cd28ad7017ff84bede7b (patch) | |
tree | 1d49d55959774e3437c30059cb26018f57b24f61 | |
parent | e94980a64fe8db4170482f14eb165b46def733c8 (diff) | |
download | cpython-a9f054b423cd2c8b7b37cd28ad7017ff84bede7b.zip cpython-a9f054b423cd2c8b7b37cd28ad7017ff84bede7b.tar.gz cpython-a9f054b423cd2c8b7b37cd28ad7017ff84bede7b.tar.bz2 |
zipfile: remove remaining ResourceWarnings
-rw-r--r-- | Lib/test/test_zipfile.py | 21 | ||||
-rw-r--r-- | Lib/zipfile.py | 19 |
2 files changed, 24 insertions, 16 deletions
diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py index 15a8c4c..7f93b68 100644 --- a/Lib/test/test_zipfile.py +++ b/Lib/test/test_zipfile.py @@ -609,7 +609,7 @@ class TestZip64InSmallFiles(unittest.TestCase): class PyZipFileTests(unittest.TestCase): def test_write_pyfile(self): - with zipfile.PyZipFile(TemporaryFile(), "w") as zipfp: + with TemporaryFile() as t, zipfile.PyZipFile(t, "w") as zipfp: fn = __file__ if fn.endswith('.pyc') or fn.endswith('.pyo'): path_split = fn.split(os.sep) @@ -627,7 +627,7 @@ class PyZipFileTests(unittest.TestCase): self.assertTrue(bn + 'o' in zipfp.namelist() or bn + 'c' in zipfp.namelist()) - with zipfile.PyZipFile(TemporaryFile(), "w") as zipfp: + with TemporaryFile() as t, zipfile.PyZipFile(t, "w") as zipfp: fn = __file__ if fn.endswith(('.pyc', '.pyo')): fn = fn[:-1] @@ -643,7 +643,7 @@ class PyZipFileTests(unittest.TestCase): import email 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) # Check for a couple of modules at different levels of the @@ -666,26 +666,25 @@ class PyZipFileTests(unittest.TestCase): with open(os.path.join(TESTFN2, "mod2.txt"), "w") as fp: fp.write("bla bla bla\n") - zipfp = zipfile.PyZipFile(TemporaryFile(), "w") - zipfp.writepy(TESTFN2) + with TemporaryFile() as t, zipfile.PyZipFile(t, "w") as zipfp: + zipfp.writepy(TESTFN2) - names = zipfp.namelist() - self.assertTrue('mod1.pyc' in names or 'mod1.pyo' in names) - self.assertTrue('mod2.pyc' in names or 'mod2.pyo' in names) - self.assertNotIn('mod2.txt', names) + names = zipfp.namelist() + self.assertTrue('mod1.pyc' in names or 'mod1.pyo' in names) + self.assertTrue('mod2.pyc' in names or 'mod2.pyo' in names) + self.assertNotIn('mod2.txt', names) finally: shutil.rmtree(TESTFN2) 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: f.write('most definitely not a python file') self.assertRaises(RuntimeError, zipfp.writepy, TESTFN) os.remove(TESTFN) - class OtherTests(unittest.TestCase): zips_with_bad_crc = { zipfile.ZIP_STORED: ( diff --git a/Lib/zipfile.py b/Lib/zipfile.py index eec8ece..bfe41b7 100644 --- a/Lib/zipfile.py +++ b/Lib/zipfile.py @@ -897,10 +897,8 @@ class ZipFile: # given a file object in the constructor if self._filePassed: zef_file = self.fp - should_close = False else: zef_file = io.open(self.filename, 'rb') - should_close = True # Make sure we have an info object if isinstance(name, ZipInfo): @@ -908,8 +906,12 @@ class ZipFile: zinfo = name else: # 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) # Skip the file header: @@ -923,6 +925,8 @@ class ZipFile: zef_file.read(fheader[_FH_EXTRA_FIELD_LENGTH]) if fname != zinfo.orig_filename.encode("utf-8"): + if not self._filePassed: + zef_file.close() raise BadZipFile( 'File name in directory %r and header %r differ.' % (zinfo.orig_filename, fname)) @@ -934,6 +938,8 @@ class ZipFile: if not pwd: pwd = self.pwd if not pwd: + if not self._filePassed: + zef_file.close() raise RuntimeError("File %s is encrypted, " "password required for extraction" % name) @@ -952,9 +958,12 @@ class ZipFile: # compare against the CRC otherwise check_byte = (zinfo.CRC >> 24) & 0xff if h[11] != check_byte: + if not self._filePassed: + zef_file.close() 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): """Extract a member from the archive to the current working directory, |