Skip to content

Commit

Permalink
bpo-30017: Allowed calling the close() method of the zip entry writer…
Browse files Browse the repository at this point in the history
… object (#1041)

multiple times.  Writing to closed zip entry writer object now always produce
a ValueError.
  • Loading branch information
serhiy-storchaka committed Apr 12, 2017
1 parent 3e0f1fc commit 4c0d9ea
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 0 deletions.
42 changes: 42 additions & 0 deletions Lib/test/test_zipfile.py
Original file line number Diff line number Diff line change
Expand Up @@ -734,6 +734,48 @@ class LzmaTestZip64InSmallFiles(AbstractTestZip64InSmallFiles,
compression = zipfile.ZIP_LZMA


class AbstractWriterTests:

def tearDown(self):
unlink(TESTFN2)

def test_close_after_close(self):
data = b'content'
with zipfile.ZipFile(TESTFN2, "w", self.compression) as zipf:
w = zipf.open('test', 'w')
w.write(data)
w.close()
self.assertTrue(w.closed)
w.close()
self.assertTrue(w.closed)
self.assertEqual(zipf.read('test'), data)

def test_write_after_close(self):
data = b'content'
with zipfile.ZipFile(TESTFN2, "w", self.compression) as zipf:
w = zipf.open('test', 'w')
w.write(data)
w.close()
self.assertTrue(w.closed)
self.assertRaises(ValueError, w.write, b'')
self.assertEqual(zipf.read('test'), data)

class StoredWriterTests(AbstractWriterTests, unittest.TestCase):
compression = zipfile.ZIP_STORED

@requires_zlib
class DeflateWriterTests(AbstractWriterTests, unittest.TestCase):
compression = zipfile.ZIP_DEFLATED

@requires_bz2
class Bzip2WriterTests(AbstractWriterTests, unittest.TestCase):
compression = zipfile.ZIP_BZIP2

@requires_lzma
class LzmaWriterTests(AbstractWriterTests, unittest.TestCase):
compression = zipfile.ZIP_LZMA


class PyZipFileTests(unittest.TestCase):
def assertCompiledIn(self, name, namelist):
if name + 'o' not in namelist:
Expand Down
4 changes: 4 additions & 0 deletions Lib/zipfile.py
Original file line number Diff line number Diff line change
Expand Up @@ -980,6 +980,8 @@ def writable(self):
return True

def write(self, data):
if self.closed:
raise ValueError('I/O operation on closed file.')
nbytes = len(data)
self._file_size += nbytes
self._crc = crc32(data, self._crc)
Expand All @@ -990,6 +992,8 @@ def write(self, data):
return nbytes

def close(self):
if self.closed:
return
super().close()
# Flush any data from the compressor, and update header info
if self._compressor:
Expand Down
3 changes: 3 additions & 0 deletions Misc/NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -314,6 +314,9 @@ Library
times when schema is changing. Indirectly fixed by switching to
use sqlite3_prepare_v2() in bpo-9303. Patch by Aviv Palivoda.

- bpo-30017: Allowed calling the close() method of the zip entry writer object
multiple times. Writing to a closed writer now always produces a ValueError.

- bpo-29998: Pickling and copying ImportError now preserves name and path
attributes.

Expand Down

0 comments on commit 4c0d9ea

Please sign in to comment.