Skip to content

Commit 7fbb6ec

Browse files
committed
make pickling backwards-compatible
1 parent 2ca88f3 commit 7fbb6ec

3 files changed

Lines changed: 30 additions & 4 deletions

File tree

conjure_python_client/_http/requests_client.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -219,8 +219,9 @@ def create(
219219

220220
class TransportAdapter(HTTPAdapter):
221221
"""Transport adapter that allows customising ssl things"""
222+
ENABLE_KEEP_ALIVE_ATTR = "_enable_keep_alive"
222223

223-
__attrs__ = HTTPAdapter.__attrs__ + ["_enable_keep_alive"]
224+
__attrs__ = HTTPAdapter.__attrs__ + [ENABLE_KEEP_ALIVE_ATTR]
224225

225226
def __init__(self, *args, enable_keep_alive: bool = False, **kwargs):
226227
self._enable_keep_alive = enable_keep_alive
@@ -247,6 +248,11 @@ def init_poolmanager(
247248
**pool_kwargs
248249
)
249250

251+
def __setstate__(self, state):
252+
if self.ENABLE_KEEP_ALIVE_ATTR not in state:
253+
state[self.ENABLE_KEEP_ALIVE_ATTR] = False
254+
super().__setstate__(state)
255+
250256

251257
class ConjureHTTPError(HTTPError):
252258
"""An HTTPError from a Conjure Service with ``SerializableError``
Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import pickle
12
import sys
23

34
from conjure_python_client._http.requests_client import (
@@ -12,9 +13,7 @@
1213

1314
def test_can_enable_keep_alives_in_transport_adapter():
1415
assert (
15-
TransportAdapter(
16-
max_retries=12, enable_keep_alive=True
17-
)._enable_keep_alive
16+
TransportAdapter(max_retries=12, enable_keep_alive=True)._enable_keep_alive
1817
is True
1918
)
2019
assert TransportAdapter(max_retries=12)._enable_keep_alive is False
@@ -38,3 +37,24 @@ def test_keep_alive_passed_in_state_in_transport_adapter():
3837
)
3938
assert ta._enable_keep_alive is True
4039
assert ta.max_retries.total == 12
40+
41+
42+
def test_transport_adapter_pickles_correctly():
43+
pre_adapter = TransportAdapter(enable_keep_alive=True)
44+
post_adapter = pickle.loads(pickle.dumps(pre_adapter))
45+
assert post_adapter._enable_keep_alive is True
46+
assert post_adapter._pool_connections == pre_adapter._pool_connections
47+
assert post_adapter._pool_maxsize == pre_adapter._pool_maxsize
48+
49+
50+
def test_transport_adapter_can_be_unpickled_from_old_pickle():
51+
# Remove "_enable_keep_alive" attr from get state so that when picked it emulates an old instance of this
52+
# class being pickled before this attr was added. Then verify we can pickle and unpickle to validate we
53+
# give it a default value if not present when unpickled.
54+
TransportAdapter.__getstate__ = lambda self: {
55+
attr: getattr(self, attr, None)
56+
for attr in self.__attrs__
57+
if attr != TransportAdapter.ENABLE_KEEP_ALIVE_ATTR
58+
}
59+
adapter = pickle.loads(pickle.dumps(TransportAdapter()))
60+
assert adapter._enable_keep_alive is False

0 commit comments

Comments
 (0)