Browse Source

added add_serializer/add_deserializer and serialize/deserialize methods

also removed setup_serializer and favored self.serialize/self.deserialize in code
master
Brett Langdon 12 years ago
parent
commit
22c95472f4
2 changed files with 36 additions and 19 deletions
  1. +23
    -11
      riakcached/client.py
  2. +13
    -8
      riakcached/tests/test_client.py

+ 23
- 11
riakcached/client.py View File

@ -37,13 +37,30 @@ class RiakClient(object):
if auto_connect: if auto_connect:
self._connect() self._connect()
def setup_serializer(self, content_type, serializer, deserializer):
def add_serializer(self, content_type, serializer):
""" """
""" """
content_type = content_type.lower() content_type = content_type.lower()
self._serializers[content_type] = serializer self._serializers[content_type] = serializer
def add_deserializer(self, content_type, deserializer):
"""
"""
content_type = content_type.lower()
self._deserializers[content_type] = deserializer self._deserializers[content_type] = deserializer
def serialize(self, data, content_type):
"""
"""
serializer = self._serializers.get(content_type, str)
return serializer(data)
def deserialize(self, data, content_type):
"""
"""
deserializer = self._deserializers.get(content_type, str)
return deserializer(data)
def close(self): def close(self):
""" """
""" """
@ -65,8 +82,7 @@ class RiakClient(object):
if response.status not in (200, 300, 304): if response.status not in (200, 300, 304):
return None return None
deserializer = self._deserializers.get(response.getheader("content-type"), str)
return deserializer(response.data)
return self.deserialize(response.data, response.getheader("content-type"))
def get_many(self, keys): def get_many(self, keys):
""" """
@ -82,8 +98,7 @@ class RiakClient(object):
def set(self, key, value, content_type="text/plain"): def set(self, key, value, content_type="text/plain"):
""" """
""" """
serializer = self._serializers.get(content_type.lower(), str)
value = serializer(value)
value = self.serialize(value, content_type)
response = self._request( response = self._request(
method="POST", method="POST",
@ -137,8 +152,7 @@ class RiakClient(object):
url="%s/stats" % self.url, url="%s/stats" % self.url,
) )
if response.status == 200: if response.status == 200:
deserializer = self._deserializers.get("application/json", json.loads)
return deserializer(response.data)
return self.deserialize(response.data, "application/json")
return None return None
def props(self): def props(self):
@ -153,11 +167,10 @@ class RiakClient(object):
return None return None
def set_props(self, props): def set_props(self, props):
serializer = self._serializers.get("application/json", json.dumps)
response = self._request( response = self._request(
method="PUT", method="PUT",
url="%s/buckets/%s/props" % (self.url, self.bucket), url="%s/buckets/%s/props" % (self.url, self.bucket),
body=serializer(props),
body=self.serialize(props, "application/json"),
headers={ headers={
"Content-Type": "application/json", "Content-Type": "application/json",
} }
@ -170,8 +183,7 @@ class RiakClient(object):
url="%s/buckets/%s/keys?keys=true" % (self.url, self.bucket), url="%s/buckets/%s/keys?keys=true" % (self.url, self.bucket),
) )
if response.status == 200: if response.status == 200:
deserializer = self._deserializers.get("application/json", json.loads)
return deserializer(response.data)
return self.deserialize(response.data, "application/json")
return None return None
def ping(self): def ping(self):


+ 13
- 8
riakcached/tests/test_client.py View File

@ -21,17 +21,22 @@ class TestRiakClient(unittest2.TestCase):
client = RiakClient("test_bucket", url="http://127.0.0.1:8098/", auto_connect=False) client = RiakClient("test_bucket", url="http://127.0.0.1:8098/", auto_connect=False)
self.assertEqual(client.url, "http://127.0.0.1:8098") self.assertEqual(client.url, "http://127.0.0.1:8098")
def test_client_adds_serializer_and_deserializer(self):
def test_client_adds_serializer(self):
serializer = mock.Mock() serializer = mock.Mock()
deserializer = mock.Mock()
client = RiakClient("test_bucket", auto_connect=False) client = RiakClient("test_bucket", auto_connect=False)
client.setup_serializer("application/test", serializer, deserializer)
client.add_serializer("application/test", serializer)
self.assertEqual(client._serializers["application/test"], serializer) self.assertEqual(client._serializers["application/test"], serializer)
self.assertEqual(client._deserializers["application/test"], deserializer)
client._serializers["application/test"]()
client._deserializers["application/test"]()
client.serialize("test", "application/test")
serializer.assert_called() serializer.assert_called()
def test_client_adds_deserializer(self):
deserializer = mock.Mock()
client = RiakClient("test_bucket", auto_connect=False)
client.add_deserializer("application/test", deserializer)
self.assertEqual(client._deserializers["application/test"], deserializer)
client.deserialize("test", "application/test")
deserializer.assert_called() deserializer.assert_called()
def test_client_calls_pool_close(self): def test_client_calls_pool_close(self):
@ -140,7 +145,7 @@ class TestGet(unittest2.TestCase):
return "deserialized" return "deserialized"
client = RiakClient("test_bucket") client = RiakClient("test_bucket")
client.setup_serializer("application/test", None, deserializer)
client.add_deserializer("application/test", deserializer)
client._pool.urlopen.return_value = InlineClass({ client._pool.urlopen.return_value = InlineClass({
"status": 200, "status": 200,
"data": "some data", "data": "some data",
@ -247,7 +252,7 @@ class TestSet(unittest2.TestCase):
return "serialized" return "serialized"
client = RiakClient("test_bucket") client = RiakClient("test_bucket")
client.setup_serializer("application/test", serializer, None)
client.add_serializer("application/test", serializer)
client._pool.urlopen.return_value = InlineClass({ client._pool.urlopen.return_value = InlineClass({
"status": 204, "status": 204,
"data": "", "data": "",


Loading…
Cancel
Save