Skip to content

Commit 1cf1fa9

Browse files
committed
New datetime parameter into write_iter.
1 parent 58bfa8e commit 1cf1fa9

2 files changed

Lines changed: 31 additions & 4 deletions

File tree

tests/test_zipstream.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
import os
55
import tempfile
6+
import time
67
import unittest
78
import zipstream
89
import zipfile
@@ -76,6 +77,28 @@ def string_generator():
7677

7778
os.remove(f.name)
7879

80+
def test_write_iterable_with_date_time(self):
81+
file_name_in_zip = "data_datetime"
82+
file_date_time_in_zip = time.strptime("2011-04-19 22:30:21", "%Y-%m-%d %H:%M:%S")
83+
84+
z = zipstream.ZipFile(mode='w')
85+
def string_generator():
86+
for _ in range(10):
87+
yield b'zipstream\x01\n'
88+
z.write_iter(iterable=string_generator(), arcname=file_name_in_zip, date_time=file_date_time_in_zip)
89+
90+
f = tempfile.NamedTemporaryFile(suffix='zip', delete=False)
91+
for chunk in z:
92+
f.write(chunk)
93+
f.close()
94+
95+
z2 = zipfile.ZipFile(f.name, 'r')
96+
self.assertFalse(z2.testzip())
97+
98+
self.assertEqual(file_date_time_in_zip[0:5], z2.getinfo(file_name_in_zip).date_time[0:5])
99+
100+
os.remove(f.name)
101+
79102
def test_writestr(self):
80103
z = zipstream.ZipFile(mode='w')
81104

zipstream/__init__.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -220,9 +220,9 @@ def write(self, filename, arcname=None, compress_type=None):
220220
kwargs = {'filename': filename, 'arcname': arcname, 'compress_type': compress_type}
221221
self.paths_to_write.append(kwargs)
222222

223-
def write_iter(self, arcname, iterable, compress_type=None, buffer_size=None):
223+
def write_iter(self, arcname, iterable, compress_type=None, buffer_size=None, date_time=None):
224224
"""Write the bytes iterable `iterable` to the archive under the name `arcname`."""
225-
kwargs = {'arcname': arcname, 'iterable': iterable, 'compress_type': compress_type, 'buffer_size': buffer_size}
225+
kwargs = {'arcname': arcname, 'iterable': iterable, 'compress_type': compress_type, 'buffer_size': buffer_size, 'date_time': date_time}
226226
self.paths_to_write.append(kwargs)
227227

228228
def writestr(self, arcname, data, compress_type=None, buffer_size=None):
@@ -233,7 +233,7 @@ def _iterable():
233233
yield data
234234
return self.write_iter(arcname, _iterable(), compress_type=compress_type, buffer_size=buffer_size)
235235

236-
def __write(self, filename=None, iterable=None, arcname=None, compress_type=None, buffer_size=None):
236+
def __write(self, filename=None, iterable=None, arcname=None, compress_type=None, buffer_size=None, date_time=None):
237237
"""Put the bytes from filename into the archive under the name
238238
`arcname`."""
239239
if not self.fp:
@@ -248,7 +248,11 @@ def __write(self, filename=None, iterable=None, arcname=None, compress_type=None
248248
mtime = time.localtime(st.st_mtime)
249249
date_time = mtime[0:6]
250250
else:
251-
st, isdir, date_time = None, False, time.localtime()[0:6]
251+
st, isdir = None, False
252+
if date_time is not None and isinstance(date_time, time.struct_time):
253+
date_time = date_time[0:6]
254+
if date_time is None:
255+
date_time = time.localtime()[0:6]
252256
# Create ZipInfo instance to store file information
253257
if arcname is None:
254258
arcname = filename

0 commit comments

Comments
 (0)