Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions Doc/library/zlib.rst
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,11 @@ Compression objects support the following methods:
compress a set of data that share a common initial prefix.


.. versionchanged:: 3.8
Added :func:`copy.copy` and :func:`copy.deepcopy` support to compression
objects.


Decompression objects support the following methods and attributes:


Expand Down Expand Up @@ -298,6 +303,11 @@ Decompression objects support the following methods and attributes:
seeks into the stream at a future point.


.. versionchanged:: 3.8
Added :func:`copy.copy` and :func:`copy.deepcopy` support to decompression
objects.


Information about the version of the zlib library in use is available through
the following constants:

Expand Down
55 changes: 31 additions & 24 deletions Lib/test/test_zlib.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import unittest
from test import support
import binascii
import copy
import pickle
import random
import sys
Expand Down Expand Up @@ -626,23 +627,24 @@ def test_compresscopy(self):
# Test copying a compression object
data0 = HAMLET_SCENE
data1 = bytes(str(HAMLET_SCENE, "ascii").swapcase(), "ascii")
c0 = zlib.compressobj(zlib.Z_BEST_COMPRESSION)
bufs0 = []
bufs0.append(c0.compress(data0))
for func in lambda c: c.copy(), copy.copy, copy.deepcopy:
c0 = zlib.compressobj(zlib.Z_BEST_COMPRESSION)
bufs0 = []
bufs0.append(c0.compress(data0))

c1 = c0.copy()
bufs1 = bufs0[:]
c1 = func(c0)
bufs1 = bufs0[:]

bufs0.append(c0.compress(data0))
bufs0.append(c0.flush())
s0 = b''.join(bufs0)
bufs0.append(c0.compress(data0))
bufs0.append(c0.flush())
s0 = b''.join(bufs0)

bufs1.append(c1.compress(data1))
bufs1.append(c1.flush())
s1 = b''.join(bufs1)
bufs1.append(c1.compress(data1))
bufs1.append(c1.flush())
s1 = b''.join(bufs1)

self.assertEqual(zlib.decompress(s0),data0+data0)
self.assertEqual(zlib.decompress(s1),data0+data1)
self.assertEqual(zlib.decompress(s0),data0+data0)
self.assertEqual(zlib.decompress(s1),data0+data1)

@requires_Compress_copy
def test_badcompresscopy(self):
Expand All @@ -651,6 +653,8 @@ def test_badcompresscopy(self):
c.compress(HAMLET_SCENE)
c.flush()
self.assertRaises(ValueError, c.copy)
self.assertRaises(ValueError, copy.copy, c)
self.assertRaises(ValueError, copy.deepcopy, c)

@requires_Decompress_copy
def test_decompresscopy(self):
Expand All @@ -660,21 +664,22 @@ def test_decompresscopy(self):
# Test type of return value
self.assertIsInstance(comp, bytes)

d0 = zlib.decompressobj()
bufs0 = []
bufs0.append(d0.decompress(comp[:32]))
for func in lambda c: c.copy(), copy.copy, copy.deepcopy:
d0 = zlib.decompressobj()
bufs0 = []
bufs0.append(d0.decompress(comp[:32]))

d1 = d0.copy()
bufs1 = bufs0[:]
d1 = func(d0)
bufs1 = bufs0[:]

bufs0.append(d0.decompress(comp[32:]))
s0 = b''.join(bufs0)
bufs0.append(d0.decompress(comp[32:]))
s0 = b''.join(bufs0)

bufs1.append(d1.decompress(comp[32:]))
s1 = b''.join(bufs1)
bufs1.append(d1.decompress(comp[32:]))
s1 = b''.join(bufs1)

self.assertEqual(s0,s1)
self.assertEqual(s0,data)
self.assertEqual(s0,s1)
self.assertEqual(s0,data)

@requires_Decompress_copy
def test_baddecompresscopy(self):
Expand All @@ -684,6 +689,8 @@ def test_baddecompresscopy(self):
d.decompress(data)
d.flush()
self.assertRaises(ValueError, d.copy)
self.assertRaises(ValueError, copy.copy, d)
self.assertRaises(ValueError, copy.deepcopy, d)

def test_compresspickle(self):
for proto in range(pickle.HIGHEST_PROTOCOL + 1):
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Add :func:`copy.copy` and :func:`copy.deepcopy` support to zlib compressors
and decompressors. Patch by Zackery Spytz.
84 changes: 83 additions & 1 deletion Modules/clinic/zlibmodule.c.h

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

57 changes: 57 additions & 0 deletions Modules/zlibmodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -984,6 +984,32 @@ zlib_Compress_copy_impl(compobject *self)
return NULL;
}

/*[clinic input]
zlib.Compress.__copy__
[clinic start generated code]*/

static PyObject *
zlib_Compress___copy___impl(compobject *self)
/*[clinic end generated code: output=1875e6791975442e input=be97a05a788dfd83]*/
{
return zlib_Compress_copy_impl(self);
}

/*[clinic input]
zlib.Compress.__deepcopy__

memo: object
/

[clinic start generated code]*/

static PyObject *
zlib_Compress___deepcopy__(compobject *self, PyObject *memo)
/*[clinic end generated code: output=f47a2213282c9eb0 input=a9a8b0b40d83388e]*/
{
return zlib_Compress_copy_impl(self);
}

/*[clinic input]
zlib.Decompress.copy

Expand Down Expand Up @@ -1039,6 +1065,33 @@ zlib_Decompress_copy_impl(compobject *self)
Py_XDECREF(retval);
return NULL;
}

/*[clinic input]
zlib.Decompress.__copy__
[clinic start generated code]*/

static PyObject *
zlib_Decompress___copy___impl(compobject *self)
/*[clinic end generated code: output=80bae8bc43498ad4 input=efcb98b5472c13d2]*/
{
return zlib_Decompress_copy_impl(self);
}

/*[clinic input]
zlib.Decompress.__deepcopy__

memo: object
/

[clinic start generated code]*/

static PyObject *
zlib_Decompress___deepcopy__(compobject *self, PyObject *memo)
/*[clinic end generated code: output=1f77286ab490124b input=6e99bd0ac4b9cd8b]*/
{
return zlib_Decompress_copy_impl(self);
}

#endif

/*[clinic input]
Expand Down Expand Up @@ -1139,6 +1192,8 @@ static PyMethodDef comp_methods[] =
ZLIB_COMPRESS_COMPRESS_METHODDEF
ZLIB_COMPRESS_FLUSH_METHODDEF
ZLIB_COMPRESS_COPY_METHODDEF
ZLIB_COMPRESS___COPY___METHODDEF
ZLIB_COMPRESS___DEEPCOPY___METHODDEF
{NULL, NULL}
};

Expand All @@ -1147,6 +1202,8 @@ static PyMethodDef Decomp_methods[] =
ZLIB_DECOMPRESS_DECOMPRESS_METHODDEF
ZLIB_DECOMPRESS_FLUSH_METHODDEF
ZLIB_DECOMPRESS_COPY_METHODDEF
ZLIB_DECOMPRESS___COPY___METHODDEF
ZLIB_DECOMPRESS___DEEPCOPY___METHODDEF
{NULL, NULL}
};

Expand Down