From 77b112cd56a50232abcdbf28f9aba88dc5d33ad3 Mon Sep 17 00:00:00 2001 From: Marcel Plch Date: Fri, 31 Aug 2018 16:43:31 +0200 Subject: bpo-34097: Polish API design (GH-8725) Move strict_timestamps to constructor. --- Doc/library/zipfile.rst | 21 +++++++++++---------- Lib/test/test_zipfile.py | 8 ++++---- Lib/zipfile.py | 8 ++++---- 3 files changed, 19 insertions(+), 18 deletions(-) diff --git a/Doc/library/zipfile.rst b/Doc/library/zipfile.rst index a2fa966..e5872f3 100644 --- a/Doc/library/zipfile.rst +++ b/Doc/library/zipfile.rst @@ -131,7 +131,7 @@ ZipFile Objects .. class:: ZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, \ - compresslevel=None) + compresslevel=None, *, strict_timestamps=True) Open a ZIP file, where *file* can be a path to a file (a string), a file-like object or a :term:`path-like object`. @@ -169,6 +169,12 @@ ZipFile Objects When using :const:`ZIP_BZIP2` integers ``1`` through ``9`` are accepted (see :class:`bz2 ` for more information). + The *strict_timestamps* argument, when set to ``False``, allows to + zip files older than 1980-01-01 at the cost of setting the + timestamp to 1980-01-01. + Similar behavior occurs with files newer than 2107-12-31, + the timestamp is also set to the limit. + If the file is created with mode ``'w'``, ``'x'`` or ``'a'`` and then :meth:`closed ` without adding any files to the archive, the appropriate ZIP structures for an empty archive will be written to the file. @@ -203,6 +209,9 @@ ZipFile Objects .. versionchanged:: 3.7 Add the *compresslevel* parameter. + .. versionadded:: 3.8 + The *strict_timestamps* keyword-only argument + .. method:: ZipFile.close() @@ -368,7 +377,7 @@ ZipFile Objects .. method:: ZipFile.write(filename, arcname=None, compress_type=None, \ - compresslevel=None, *, strict_timestamps=True) + compresslevel=None) Write the file named *filename* to the archive, giving it the archive name *arcname* (by default, this will be the same as *filename*, but without a drive @@ -377,11 +386,6 @@ ZipFile Objects the new entry. Similarly, *compresslevel* will override the constructor if given. The archive must be open with mode ``'w'``, ``'x'`` or ``'a'``. - The *strict_timestamps* argument, when set to ``False``, allows to - zip files older than 1980-01-01 at the cost of setting the - timestamp to 1980-01-01. - Similar behavior occurs with files newer than 2107-12-31, - the timestamp is also set to the limit. .. note:: @@ -405,9 +409,6 @@ ZipFile Objects a closed ZipFile will raise a :exc:`ValueError`. Previously, a :exc:`RuntimeError` was raised. - .. versionadded:: 3.8 - The *strict_timestamps* keyword-only argument - .. method:: ZipFile.writestr(zinfo_or_arcname, data, compress_type=None, \ compresslevel=None) diff --git a/Lib/test/test_zipfile.py b/Lib/test/test_zipfile.py index 68b56a0..4c6f57c 100644 --- a/Lib/test/test_zipfile.py +++ b/Lib/test/test_zipfile.py @@ -549,8 +549,8 @@ class StoredTestsWithSourceFile(AbstractTestsWithSourceFile, with zipfile.ZipFile(TESTFN2, "w") as zipfp: self.assertRaises(ValueError, zipfp.write, TESTFN) - with zipfile.ZipFile(TESTFN2, "w") as zipfp: - zipfp.write(TESTFN, strict_timestamps=False) + with zipfile.ZipFile(TESTFN2, "w", strict_timestamps=False) as zipfp: + zipfp.write(TESTFN) zinfo = zipfp.getinfo(TESTFN) self.assertEqual(zinfo.date_time, (1980, 1, 1, 0, 0, 0)) @@ -564,8 +564,8 @@ class StoredTestsWithSourceFile(AbstractTestsWithSourceFile, with zipfile.ZipFile(TESTFN2, "w") as zipfp: self.assertRaises(struct.error, zipfp.write, TESTFN) - with zipfile.ZipFile(TESTFN2, "w") as zipfp: - zipfp.write(TESTFN, strict_timestamps=False) + with zipfile.ZipFile(TESTFN2, "w", strict_timestamps=False) as zipfp: + zipfp.write(TESTFN) zinfo = zipfp.getinfo(TESTFN) self.assertEqual(zinfo.date_time, (2107, 12, 31, 23, 59, 59)) diff --git a/Lib/zipfile.py b/Lib/zipfile.py index 6da1778..7f23778 100644 --- a/Lib/zipfile.py +++ b/Lib/zipfile.py @@ -1151,7 +1151,7 @@ class ZipFile: _windows_illegal_name_trans_table = None def __init__(self, file, mode="r", compression=ZIP_STORED, allowZip64=True, - compresslevel=None): + compresslevel=None, *, strict_timestamps=True): """Open the ZIP file with mode read 'r', write 'w', exclusive create 'x', or append 'a'.""" if mode not in ('r', 'w', 'x', 'a'): @@ -1169,6 +1169,7 @@ class ZipFile: self.mode = mode self.pwd = None self._comment = b'' + self._strict_timestamps = strict_timestamps # Check if we were passed a file-like object if isinstance(file, os.PathLike): @@ -1677,8 +1678,7 @@ class ZipFile: " would require ZIP64 extensions") def write(self, filename, arcname=None, - compress_type=None, compresslevel=None, *, - strict_timestamps=True): + compress_type=None, compresslevel=None): """Put the bytes from filename into the archive under the name arcname.""" if not self.fp: @@ -1690,7 +1690,7 @@ class ZipFile: ) zinfo = ZipInfo.from_file(filename, arcname, - strict_timestamps=strict_timestamps) + strict_timestamps=self._strict_timestamps) if zinfo.is_dir(): zinfo.compress_size = 0 -- cgit v0.12