diff options
author | Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> | 2017-11-16 00:28:25 (GMT) |
---|---|---|
committer | Yury Selivanov <yury@magic.io> | 2017-11-16 00:28:25 (GMT) |
commit | f35076a002b958f991d180d6f945344cc5ab3900 (patch) | |
tree | c0e4e49172999a62fcee5836351db8317d977dc8 | |
parent | d15bb5fcad584e113836486d17c6abcbf2168a86 (diff) | |
download | cpython-f35076a002b958f991d180d6f945344cc5ab3900.zip cpython-f35076a002b958f991d180d6f945344cc5ab3900.tar.gz cpython-f35076a002b958f991d180d6f945344cc5ab3900.tar.bz2 |
bpo-32034: Make IncompleteReadError & LimitOverrunError pickleable GH-4409 (#4411)
(cherry picked from commit 43605e6bfa8d49612df4a38460d063d6ba781906)
-rw-r--r-- | Lib/asyncio/streams.py | 6 | ||||
-rw-r--r-- | Lib/test/test_asyncio/test_streams.py | 18 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Library/2017-11-15-13-44-28.bpo-32034.uHAOmu.rst | 1 |
3 files changed, 25 insertions, 0 deletions
diff --git a/Lib/asyncio/streams.py b/Lib/asyncio/streams.py index a82cc79..4089b0e 100644 --- a/Lib/asyncio/streams.py +++ b/Lib/asyncio/streams.py @@ -35,6 +35,9 @@ class IncompleteReadError(EOFError): self.partial = partial self.expected = expected + def __reduce__(self): + return type(self), (self.partial, self.expected) + class LimitOverrunError(Exception): """Reached the buffer limit while looking for a separator. @@ -46,6 +49,9 @@ class LimitOverrunError(Exception): super().__init__(message) self.consumed = consumed + def __reduce__(self): + return type(self), (self.args[0], self.consumed) + @coroutine def open_connection(host=None, port=None, *, diff --git a/Lib/test/test_asyncio/test_streams.py b/Lib/test/test_asyncio/test_streams.py index b47433a..6d16d20 100644 --- a/Lib/test/test_asyncio/test_streams.py +++ b/Lib/test/test_asyncio/test_streams.py @@ -3,6 +3,7 @@ import gc import os import queue +import pickle import socket import sys import threading @@ -845,6 +846,23 @@ os.close(fd) stream._transport.__repr__.return_value = "<Transport>" self.assertEqual("<StreamReader t=<Transport>>", repr(stream)) + def test_IncompleteReadError_pickleable(self): + e = asyncio.IncompleteReadError(b'abc', 10) + for proto in range(pickle.HIGHEST_PROTOCOL + 1): + with self.subTest(pickle_protocol=proto): + e2 = pickle.loads(pickle.dumps(e, protocol=proto)) + self.assertEqual(str(e), str(e2)) + self.assertEqual(e.partial, e2.partial) + self.assertEqual(e.expected, e2.expected) + + def test_LimitOverrunError_pickleable(self): + e = asyncio.LimitOverrunError('message', 10) + for proto in range(pickle.HIGHEST_PROTOCOL + 1): + with self.subTest(pickle_protocol=proto): + e2 = pickle.loads(pickle.dumps(e, protocol=proto)) + self.assertEqual(str(e), str(e2)) + self.assertEqual(e.consumed, e2.consumed) + if __name__ == '__main__': unittest.main() diff --git a/Misc/NEWS.d/next/Library/2017-11-15-13-44-28.bpo-32034.uHAOmu.rst b/Misc/NEWS.d/next/Library/2017-11-15-13-44-28.bpo-32034.uHAOmu.rst new file mode 100644 index 0000000..828e8cd --- /dev/null +++ b/Misc/NEWS.d/next/Library/2017-11-15-13-44-28.bpo-32034.uHAOmu.rst @@ -0,0 +1 @@ +Make asyncio.IncompleteReadError and LimitOverrunError pickleable. |