(original) (raw)
changeset: 104287:b512780c6589 branch: 3.6 parent: 104285:3a7234d04fe9 user: Berker Peksag berker.peksag@gmail.com date: Tue Oct 04 20:41:20 2016 +0300 files: Doc/library/lzma.rst Lib/lzma.py Lib/test/test_lzma.py Misc/NEWS description: Issue #28229: lzma module now supports pathlib diff -r 3a7234d04fe9 -r b512780c6589 Doc/library/lzma.rst --- a/Doc/library/lzma.rst Tue Oct 04 20:08:29 2016 +0300 +++ b/Doc/library/lzma.rst Tue Oct 04 20:41:20 2016 +0300 @@ -39,8 +39,9 @@ object`. The *filename* argument can be either an actual file name (given as a - :class:`str` or :class:`bytes` object), in which case the named file is - opened, or it can be an existing file object to read from or write to. + :class:`str`, :class:`bytes` or :term:`path-like object` object), in + which case the named file is opened, or it can be an existing file object + to read from or write to. The *mode* argument can be any of ``"r"``, ``"rb"``, ``"w"``, ``"wb"``, ``"x"``, ``"xb"``, ``"a"`` or ``"ab"`` for binary mode, or ``"rt"``, @@ -64,6 +65,9 @@ .. versionchanged:: 3.4 Added support for the ``"x"``, ``"xb"`` and ``"xt"`` modes. + .. versionchanged:: 3.6 + Accepts a :term:`path-like object`. + .. class:: LZMAFile(filename=None, mode="r", \*, format=None, check=-1, preset=None, filters=None) @@ -71,9 +75,10 @@ An :class:`LZMAFile` can wrap an already-open :term:`file object`, or operate directly on a named file. The *filename* argument specifies either the file - object to wrap, or the name of the file to open (as a :class:`str` or - :class:`bytes` object). When wrapping an existing file object, the wrapped - file will not be closed when the :class:`LZMAFile` is closed. + object to wrap, or the name of the file to open (as a :class:`str`, + :class:`bytes` or :term:`path-like object` object). When wrapping an + existing file object, the wrapped file will not be closed when the + :class:`LZMAFile` is closed. The *mode* argument can be either ``"r"`` for reading (default), ``"w"`` for overwriting, ``"x"`` for exclusive creation, or ``"a"`` for appending. These @@ -118,6 +123,9 @@ The :meth:`~io.BufferedIOBase.read` method now accepts an argument of ``None``. + .. versionchanged:: 3.6 + Accepts a :term:`path-like object`. + Compressing and decompressing data in memory -------------------------------------------- diff -r 3a7234d04fe9 -r b512780c6589 Lib/lzma.py --- a/Lib/lzma.py Tue Oct 04 20:08:29 2016 +0300 +++ b/Lib/lzma.py Tue Oct 04 20:41:20 2016 +0300 @@ -23,6 +23,7 @@ import builtins import io +import os from _lzma import * from _lzma import _encode_filter_properties, _decode_filter_properties import _compression @@ -49,9 +50,10 @@ format=None, check=-1, preset=None, filters=None): """Open an LZMA-compressed file in binary mode. - filename can be either an actual file name (given as a str or - bytes object), in which case the named file is opened, or it can - be an existing file object to read from or write to. + filename can be either an actual file name (given as a str, + bytes, or PathLike object), in which case the named file is + opened, or it can be an existing file object to read from or + write to. mode can be "r" for reading (default), "w" for (over)writing, "x" for creating exclusively, or "a" for appending. These can @@ -112,7 +114,7 @@ else: raise ValueError("Invalid mode: {!r}".format(mode)) - if isinstance(filename, (str, bytes)): + if isinstance(filename, (str, bytes, os.PathLike)): if "b" not in mode: mode += "b" self._fp = builtins.open(filename, mode) @@ -122,7 +124,7 @@ self._fp = filename self._mode = mode_code else: - raise TypeError("filename must be a str or bytes object, or a file") + raise TypeError("filename must be a str, bytes, file or PathLike object") if self._mode == _MODE_READ: raw = _compression.DecompressReader(self._fp, LZMADecompressor, @@ -263,9 +265,9 @@ encoding=None, errors=None, newline=None): """Open an LZMA-compressed file in binary or text mode. - filename can be either an actual file name (given as a str or bytes - object), in which case the named file is opened, or it can be an - existing file object to read from or write to. + filename can be either an actual file name (given as a str, bytes, + or PathLike object), in which case the named file is opened, or it + can be an existing file object to read from or write to. The mode argument can be "r", "rb" (default), "w", "wb", "x", "xb", "a", or "ab" for binary mode, or "rt", "wt", "xt", or "at" for text diff -r 3a7234d04fe9 -r b512780c6589 Lib/test/test_lzma.py --- a/Lib/test/test_lzma.py Tue Oct 04 20:08:29 2016 +0300 +++ b/Lib/test/test_lzma.py Tue Oct 04 20:41:20 2016 +0300 @@ -1,6 +1,7 @@ import _compression from io import BytesIO, UnsupportedOperation, DEFAULT_BUFFER_SIZE import os +import pathlib import pickle import random import unittest @@ -488,6 +489,16 @@ with LZMAFile(BytesIO(), "a") as f: pass + def test_init_with_PathLike_filename(self): + filename = pathlib.Path(TESTFN) + with TempFile(filename, COMPRESSED_XZ): + with LZMAFile(filename) as f: + self.assertEqual(f.read(), INPUT) + with LZMAFile(filename, "a") as f: + f.write(INPUT) + with LZMAFile(filename) as f: + self.assertEqual(f.read(), INPUT * 2) + def test_init_with_filename(self): with TempFile(TESTFN, COMPRESSED_XZ): with LZMAFile(TESTFN) as f: @@ -1180,6 +1191,17 @@ with lzma.open(TESTFN, "rb") as f: self.assertEqual(f.read(), INPUT * 2) + def test_with_pathlike_filename(self): + filename = pathlib.Path(TESTFN) + with TempFile(filename): + with lzma.open(filename, "wb") as f: + f.write(INPUT) + with open(filename, "rb") as f: + file_data = lzma.decompress(f.read()) + self.assertEqual(file_data, INPUT) + with lzma.open(filename, "rb") as f: + self.assertEqual(f.read(), INPUT) + def test_bad_params(self): # Test invalid parameter combinations. with self.assertRaises(ValueError): diff -r 3a7234d04fe9 -r b512780c6589 Misc/NEWS --- a/Misc/NEWS Tue Oct 04 20:08:29 2016 +0300 +++ b/Misc/NEWS Tue Oct 04 20:41:20 2016 +0300 @@ -50,6 +50,8 @@ Library ------- +- Issue #28229: lzma module now supports pathlib. + - Issue #28321: Fixed writing non-BMP characters with binary format in plistlib. - Issue #28225: bz2 module now supports pathlib. Initial patch by Ethan Furman. /berker.peksag@gmail.com