summaryrefslogtreecommitdiff
path: root/pymemcache
diff options
context:
space:
mode:
authorLudwig Hähne <lhaehne@gmail.com>2021-10-15 15:28:10 +0200
committerJon Parise <jon@pinterest.com>2022-02-20 12:08:42 -0800
commit828394ffabfdeadbae96cc167d3953e71a050a2a (patch)
tree1867a8d6e5d27bb25ce9fd786d3eb4ef8820e51c /pymemcache
parent4cdf69d4d493dd7f806ee10e25f164b9c0d6c63b (diff)
downloadpymemcache-828394ffabfdeadbae96cc167d3953e71a050a2a.tar.gz
Return default from hash client when using positional argument (#354)
When using HashClient with ignore_exc, get would always return None if no server is available and the default is passed as a positional argument. The other clients return the default value in this case. An earlier fix only had the desired effect when passing default as a keyword argument. For example, Django passes the default as a positional argument. Return the default value so HashClient behaves like the other clients.
Diffstat (limited to 'pymemcache')
-rw-r--r--pymemcache/client/hash.py5
-rw-r--r--pymemcache/test/test_client_hash.py17
2 files changed, 17 insertions, 5 deletions
diff --git a/pymemcache/client/hash.py b/pymemcache/client/hash.py
index 789f111..72cb9d8 100644
--- a/pymemcache/client/hash.py
+++ b/pymemcache/client/hash.py
@@ -357,9 +357,8 @@ class HashClient(object):
def set(self, key, *args, **kwargs):
return self._run_cmd('set', key, False, *args, **kwargs)
- def get(self, key, *args, **kwargs):
- default = kwargs.get('default', None)
- return self._run_cmd('get', key, default, *args, **kwargs)
+ def get(self, key, default=None, **kwargs):
+ return self._run_cmd('get', key, default, default=default, **kwargs)
def incr(self, key, *args, **kwargs):
return self._run_cmd('incr', key, False, *args, **kwargs)
diff --git a/pymemcache/test/test_client_hash.py b/pymemcache/test/test_client_hash.py
index 514b019..aecc1bd 100644
--- a/pymemcache/test/test_client_hash.py
+++ b/pymemcache/test/test_client_hash.py
@@ -262,6 +262,19 @@ class TestHashClient(ClientTestMixin, unittest.TestCase):
result = client.set('foo', 'bar')
assert result is False
+ def test_no_servers_left_return_positional_default(self):
+ from pymemcache.client.hash import HashClient
+ client = HashClient(
+ [], use_pooling=True,
+ ignore_exc=True,
+ timeout=1, connect_timeout=1
+ )
+
+ # Ensure compatibility with clients that pass the default as a
+ # positional argument
+ result = client.get('foo', 'default')
+ assert result == 'default'
+
def test_no_servers_left_with_set_many(self):
from pymemcache.client.hash import HashClient
client = HashClient(
@@ -381,7 +394,7 @@ class TestHashClient(ClientTestMixin, unittest.TestCase):
# Client gets removed because of socket timeout
assert ("127.0.0.1", 11211) in client._dead_clients
- test_client.get.side_effect = lambda *_: "Some value"
+ test_client.get.side_effect = lambda *_, **_kw: "Some value"
# Client should be retried and brought back
assert client.get(b"key") == "Some value"
assert ("127.0.0.1", 11211) not in client._dead_clients
@@ -400,7 +413,7 @@ class TestHashClient(ClientTestMixin, unittest.TestCase):
with pytest.raises(socket.timeout):
client.get(b"key", noreply=False)
- test_client.get.side_effect = lambda *_: "Some value"
+ test_client.get.side_effect = lambda *_, **_kw: "Some value"
assert client.get(b"key") == "Some value"
assert client_patch.call_count == 1