bpo-26185: Fix repr() on empty ZipInfo object (#13441)

* bpo-26185: Fix repr() on empty ZipInfo object

It was failing on AttributeError due to inexistant
but required attributes file_size and compress_size.
They are now initialized to 0 in ZipInfo.__init__().

* Remove useless hasattr() in ZipInfo._open_to_write()

* Completely remove file_size setting in _open_to_write().
This commit is contained in:
Mickaël Schoentgen 2019-09-09 15:08:54 +02:00 committed by Dino Viehland
parent 1a8de82d3a
commit 992347d737
3 changed files with 32 additions and 5 deletions

View file

@ -1655,6 +1655,33 @@ class OtherTests(unittest.TestCase):
self.assertRaises(ValueError,
zipfile.ZipInfo, 'seventies', (1979, 1, 1, 0, 0, 0))
def test_create_empty_zipinfo_repr(self):
"""Before bpo-26185, repr() on empty ZipInfo object was failing."""
zi = zipfile.ZipInfo(filename="empty")
self.assertEqual(repr(zi), "<ZipInfo filename='empty' file_size=0>")
def test_create_empty_zipinfo_default_attributes(self):
"""Ensure all required attributes are set."""
zi = zipfile.ZipInfo()
self.assertEqual(zi.orig_filename, "NoName")
self.assertEqual(zi.filename, "NoName")
self.assertEqual(zi.date_time, (1980, 1, 1, 0, 0, 0))
self.assertEqual(zi.compress_type, zipfile.ZIP_STORED)
self.assertEqual(zi.comment, b"")
self.assertEqual(zi.extra, b"")
self.assertIn(zi.create_system, (0, 3))
self.assertEqual(zi.create_version, zipfile.DEFAULT_VERSION)
self.assertEqual(zi.extract_version, zipfile.DEFAULT_VERSION)
self.assertEqual(zi.reserved, 0)
self.assertEqual(zi.flag_bits, 0)
self.assertEqual(zi.volume, 0)
self.assertEqual(zi.internal_attr, 0)
self.assertEqual(zi.external_attr, 0)
# Before bpo-26185, both were missing
self.assertEqual(zi.file_size, 0)
self.assertEqual(zi.compress_size, 0)
def test_zipfile_with_short_extra_field(self):
"""If an extra field in the header is less than 4 bytes, skip it."""
zipdata = (