cpython: b7948aaca1dd (original) (raw)
Mercurial > cpython
changeset 86450:b7948aaca1dd
Issue #19201: Add support for the 'x' mode to the lzma module. Patch by Tim Heaney and Vajrasky Kok. [#19201]
Nadeem Vawda nadeem.vawda@gmail.com | |
---|---|
date | Sat, 19 Oct 2013 00:06:19 +0200 |
parents | bea507fbcd81 |
children | 5abc04e6579b |
files | Doc/library/lzma.rst Lib/lzma.py Lib/test/test_lzma.py Misc/ACKS Misc/NEWS |
diffstat | 5 files changed, 51 insertions(+), 13 deletions(-)[+] [-] Doc/library/lzma.rst 15 Lib/lzma.py 13 Lib/test/test_lzma.py 32 Misc/ACKS 1 Misc/NEWS 3 |
line wrap: on
line diff
--- a/Doc/library/lzma.rst
+++ b/Doc/library/lzma.rst
@@ -39,8 +39,8 @@ Reading and writing compressed files
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"
,"wt"
,"xt"
, or"at"
for text mode. The default is"rb"
. When opening a file for reading, the format and filters arguments have the same meanings as for :class:LZMADecompressor
. In this case, the check @@ -57,6 +57,9 @@ Reading and writing compressed files :class:io.TextIOWrapper
instance with the specified encoding, error handling behavior, and line ending(s).- .. versionchanged:: 3.4
Added support for the ``"x"``, ``"xb"`` and ``"xt"`` modes.[](#l1.19)
+
.. class:: LZMAFile(filename=None, mode="r", *, format=None, check=-1, preset=None, filters=None)
@@ -69,8 +72,9 @@ Reading and writing compressed files
file will not be closed when the :class:LZMAFile
is closed.
The mode argument can be either "r"
for reading (default), "w"
for
- overwriting, or
"a"
for appending. These can equivalently be given as "rb"
,"wb"
, and"ab"
respectively.
- overwriting,
"x"
for exclusive creation, or"a"
for appending. These - can equivalently be given as
"rb"
,"wb"
,"xb"
and"ab"
- respectively.
If filename is a file object (rather than an actual file name), a mode of
"w"
does not truncate the file, and is instead equivalent to"a"
. @@ -98,6 +102,9 @@ Reading and writing compressed files byte of data will be returned, unless EOF has been reached. The exact number of bytes returned is unspecified (the size argument is ignored). - .. versionchanged:: 3.4
Added support for the ``"x"`` and ``"xb"`` modes.[](#l1.41)
+ Compressing and decompressing data in memory --------------------------------------------
--- a/Lib/lzma.py +++ b/Lib/lzma.py @@ -54,9 +54,9 @@ class LZMAFile(io.BufferedIOBase): bytes 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, or[](#l2.7)
"a" for appending. These can equivalently be given as "rb", "wb"[](#l2.8)
and "ab" respectively.[](#l2.9)
mode can be "r" for reading (default), "w" for (over)writing,[](#l2.10)
"x" for creating exclusively, or "a" for appending. These can[](#l2.11)
equivalently be given as "rb", "wb", "xb" and "ab" respectively.[](#l2.12)
format specifies the container format to use for the file. If mode is "r", this defaults to FORMAT_AUTO. Otherwise, the @@ -112,7 +112,7 @@ class LZMAFile(io.BufferedIOBase): self._decompressor = LZMADecompressor(**self._init_args) self._buffer = b"" self._buffer_offset = 0
elif mode in ("w", "wb", "a", "ab"):[](#l2.20)
elif mode in ("w", "wb", "a", "ab", "x", "xb"):[](#l2.21) if format is None:[](#l2.22) format = FORMAT_XZ[](#l2.23) mode_code = _MODE_WRITE[](#l2.24)
@@ -426,8 +426,9 @@ def open(filename, mode="rb", *, 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", "a" or "ab"
- for binary mode, or "rt", "wt" or "at" for text mode.
- 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
- mode.
The format, check, preset and filters arguments specify the compression settings, as for LZMACompressor, LZMADecompressor and
--- a/Lib/test/test_lzma.py +++ b/Lib/test/test_lzma.py @@ -362,6 +362,8 @@ class FileTestCase(unittest.TestCase): pass with LZMAFile(BytesIO(), "w") as f: pass
with LZMAFile(BytesIO(), "x") as f:[](#l3.7)
pass[](#l3.8) with LZMAFile(BytesIO(), "a") as f:[](#l3.9) pass[](#l3.10)
@@ -389,13 +391,29 @@ class FileTestCase(unittest.TestCase): with LZMAFile(TESTFN, "ab"): pass
- def test_init_with_x_mode(self):
self.addCleanup(unlink, TESTFN)[](#l3.17)
for mode in ("x", "xb"):[](#l3.18)
unlink(TESTFN)[](#l3.19)
with LZMAFile(TESTFN, mode):[](#l3.20)
pass[](#l3.21)
with self.assertRaises(FileExistsError):[](#l3.22)
with LZMAFile(TESTFN, mode):[](#l3.23)
pass[](#l3.24)
+ def test_init_bad_mode(self): with self.assertRaises(ValueError): LZMAFile(BytesIO(COMPRESSED_XZ), (3, "x")) with self.assertRaises(ValueError): LZMAFile(BytesIO(COMPRESSED_XZ), "") with self.assertRaises(ValueError):
LZMAFile(BytesIO(COMPRESSED_XZ), "x")[](#l3.32)
LZMAFile(BytesIO(COMPRESSED_XZ), "xt")[](#l3.33)
with self.assertRaises(ValueError):[](#l3.34)
LZMAFile(BytesIO(COMPRESSED_XZ), "x+")[](#l3.35)
with self.assertRaises(ValueError):[](#l3.36)
LZMAFile(BytesIO(COMPRESSED_XZ), "rx")[](#l3.37)
with self.assertRaises(ValueError):[](#l3.38)
LZMAFile(BytesIO(COMPRESSED_XZ), "wx")[](#l3.39) with self.assertRaises(ValueError):[](#l3.40) LZMAFile(BytesIO(COMPRESSED_XZ), "rt")[](#l3.41) with self.assertRaises(ValueError):[](#l3.42)
@@ -1022,8 +1040,6 @@ class OpenTestCase(unittest.TestCase): with self.assertRaises(ValueError): lzma.open(TESTFN, "") with self.assertRaises(ValueError):
lzma.open(TESTFN, "x")[](#l3.47)
with self.assertRaises(ValueError):[](#l3.48) lzma.open(TESTFN, "rbt")[](#l3.49) with self.assertRaises(ValueError):[](#l3.50) lzma.open(TESTFN, "rb", encoding="utf-8")[](#l3.51)
@@ -1072,6 +1088,16 @@ class OpenTestCase(unittest.TestCase): with lzma.open(bio, "rt", newline="\r") as f: self.assertEqual(f.readlines(), [text])
- def test_x_mode(self):
self.addCleanup(unlink, TESTFN)[](#l3.57)
for mode in ("x", "xb", "xt"):[](#l3.58)
unlink(TESTFN)[](#l3.59)
with lzma.open(TESTFN, mode):[](#l3.60)
pass[](#l3.61)
with self.assertRaises(FileExistsError):[](#l3.62)
with lzma.open(TESTFN, mode):[](#l3.63)
pass[](#l3.64)
+ class MiscellaneousTestCase(unittest.TestCase):
--- a/Misc/ACKS +++ b/Misc/ACKS @@ -506,6 +506,7 @@ Janko Hauser Rycharde Hawkes Ben Hayden Jochen Hayek +Tim Heaney Henrik Heimbuerger Christian Heimes Thomas Heller
--- a/Misc/NEWS +++ b/Misc/NEWS @@ -54,6 +54,9 @@ Core and Builtins Library ------- +- Issue #19201: Add "x" mode (exclusive creation) in opening file to lzma