Kaydet (Commit) 85825dc1 authored tarafından Guido van Rossum's avatar Guido van Rossum

Changes preparing for stricter enforcement of bytes vs. str.

üst 56e4a840
...@@ -255,7 +255,7 @@ class UncompressedZipImportTestCase(ImportHooksBaseTestCase): ...@@ -255,7 +255,7 @@ class UncompressedZipImportTestCase(ImportHooksBaseTestCase):
# stuff at the beginning of the file # stuff at the beginning of the file
files = {TESTMOD + ".py": (NOW, test_src)} files = {TESTMOD + ".py": (NOW, test_src)}
self.doTest(".py", files, TESTMOD, self.doTest(".py", files, TESTMOD,
stuff="Some Stuff"*31) stuff=b"Some Stuff"*31)
def assertModuleSource(self, module): def assertModuleSource(self, module):
self.assertEqual(inspect.getsource(module), test_src) self.assertEqual(inspect.getsource(module), test_src)
......
...@@ -909,10 +909,14 @@ class ZipFile: ...@@ -909,10 +909,14 @@ class ZipFile:
self.filelist.append(zinfo) self.filelist.append(zinfo)
self.NameToInfo[zinfo.filename] = zinfo self.NameToInfo[zinfo.filename] = zinfo
def writestr(self, zinfo_or_arcname, bytes): def writestr(self, zinfo_or_arcname, data):
"""Write a file into the archive. The contents is the string """Write a file into the archive. The contents is 'data', which
'bytes'. 'zinfo_or_arcname' is either a ZipInfo instance or may be either a 'str' or a 'bytes' instance; if it is a 'str',
it is encoded as UTF-8 first.
'zinfo_or_arcname' is either a ZipInfo instance or
the name of the file in the archive.""" the name of the file in the archive."""
if isinstance(data, str):
data = data.encode("utf-8")
if not isinstance(zinfo_or_arcname, ZipInfo): if not isinstance(zinfo_or_arcname, ZipInfo):
zinfo = ZipInfo(filename=zinfo_or_arcname, zinfo = ZipInfo(filename=zinfo_or_arcname,
date_time=time.localtime(time.time())) date_time=time.localtime(time.time()))
...@@ -924,21 +928,21 @@ class ZipFile: ...@@ -924,21 +928,21 @@ class ZipFile:
raise RuntimeError( raise RuntimeError(
"Attempt to write to ZIP archive that was already closed") "Attempt to write to ZIP archive that was already closed")
zinfo.file_size = len(bytes) # Uncompressed size zinfo.file_size = len(data) # Uncompressed size
zinfo.header_offset = self.fp.tell() # Start of header bytes zinfo.header_offset = self.fp.tell() # Start of header data
self._writecheck(zinfo) self._writecheck(zinfo)
self._didModify = True self._didModify = True
zinfo.CRC = binascii.crc32(bytes) # CRC-32 checksum zinfo.CRC = binascii.crc32(data) # CRC-32 checksum
if zinfo.compress_type == ZIP_DEFLATED: if zinfo.compress_type == ZIP_DEFLATED:
co = zlib.compressobj(zlib.Z_DEFAULT_COMPRESSION, co = zlib.compressobj(zlib.Z_DEFAULT_COMPRESSION,
zlib.DEFLATED, -15) zlib.DEFLATED, -15)
bytes = co.compress(bytes) + co.flush() data = co.compress(data) + co.flush()
zinfo.compress_size = len(bytes) # Compressed size zinfo.compress_size = len(data) # Compressed size
else: else:
zinfo.compress_size = zinfo.file_size zinfo.compress_size = zinfo.file_size
zinfo.header_offset = self.fp.tell() # Start of header bytes zinfo.header_offset = self.fp.tell() # Start of header data
self.fp.write(zinfo.FileHeader()) self.fp.write(zinfo.FileHeader())
self.fp.write(bytes) self.fp.write(data)
self.fp.flush() self.fp.flush()
if zinfo.flag_bits & 0x08: if zinfo.flag_bits & 0x08:
# Write CRC and file sizes after the file data # Write CRC and file sizes after the file data
......
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