bpo-30017: Allowed calling the close() method of the zip entry writer object (#1041)
multiple times. Writing to closed zip entry writer object now always produce a ValueError.
This commit is contained in:
parent
3e0f1fc4e0
commit
4c0d9ea995
|
@ -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:
|
||||
|
|
|
@ -980,6 +980,8 @@ class _ZipWriteFile(io.BufferedIOBase):
|
|||
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)
|
||||
|
@ -990,6 +992,8 @@ class _ZipWriteFile(io.BufferedIOBase):
|
|||
return nbytes
|
||||
|
||||
def close(self):
|
||||
if self.closed:
|
||||
return
|
||||
super().close()
|
||||
# Flush any data from the compressor, and update header info
|
||||
if self._compressor:
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
Loading…
Reference in New Issue