From a26092f9da48d36c2a3621df11f1442a6ee02acb Mon Sep 17 00:00:00 2001 From: Sean Cribbs Date: Thu, 18 Dec 2014 09:57:14 -0600 Subject: [PATCH] Allow datatypes to be deleted directly. Closes #365 --- riak/datatypes/datatype.py | 11 +++++++++++ riak/tests/test_datatypes.py | 29 ++++++++++++++++++++++++++++- riak/transports/http/transport.py | 4 +++- riak/transports/pbc/transport.py | 4 +++- 4 files changed, 45 insertions(+), 3 deletions(-) diff --git a/riak/datatypes/datatype.py b/riak/datatypes/datatype.py index 4dd40e36..4aed67e4 100644 --- a/riak/datatypes/datatype.py +++ b/riak/datatypes/datatype.py @@ -104,6 +104,17 @@ def reload(self, **params): self._set_value(value) return self + def delete(self, **params): + """ + Deletes the datatype from Riak. See :meth:`RiakClient.delete() + ` for options. + """ + self.clear() + self._context = None + self._set_value(self._default_value()) + self.bucket._client.delete(self, **params) + return self + def update(self, **params): """ Sends locally staged mutations to Riak. diff --git a/riak/tests/test_datatypes.py b/riak/tests/test_datatypes.py index 1fce9d40..76a3e132 100644 --- a/riak/tests/test_datatypes.py +++ b/riak/tests/test_datatypes.py @@ -5,7 +5,7 @@ else: import unittest -from riak import RiakBucket, BucketType +from riak import RiakBucket, BucketType, RiakObject import riak.datatypes as datatypes from . import SKIP_DATATYPES from riak.tests import test_six @@ -450,3 +450,30 @@ def test_dt_map_return_body_true_default(self): mymap.store() self.assertEqual(mymap.value, {}) + + @unittest.skipIf(SKIP_DATATYPES, 'SKIP_DATATYPES is set') + def test_delete_datatype(self): + ctype = self.client.bucket_type('pytest-counters') + cbucket = ctype.bucket(self.bucket_name) + counter = cbucket.new(self.key_name) + counter.increment(5) + counter.store() + + stype = self.client.bucket_type('pytest-sets') + sbucket = stype.bucket(self.bucket_name) + set_ = sbucket.new(self.key_name) + set_.add("Brett") + set_.store() + + mtype = self.client.bucket_type('pytest-maps') + mbucket = mtype.bucket(self.bucket_name) + map_ = mbucket.new(self.key_name) + map_.sets['people'].add('Sean') + map_.store() + + for t in [counter, set_, map_]: + t.delete() + obj = RiakObject(self.client, t.bucket, t.key) + self.client.get(obj) + self.assertFalse(obj.exists, + "{0} exists after deletion".format(t.type_name)) diff --git a/riak/transports/http/transport.py b/riak/transports/http/transport.py index 758d5fcd..7214fbe0 100644 --- a/riak/transports/http/transport.py +++ b/riak/transports/http/transport.py @@ -188,7 +188,9 @@ def delete(self, robj, rw=None, r=None, w=None, dw=None, pr=None, pw=None, url = self.object_path(robj.bucket.name, robj.key, bucket_type=bucket_type, **params) - if self.tombstone_vclocks() and robj.vclock is not None: + use_vclocks = (self.tombstone_vclocks() and hasattr(robj, 'vclock') + and robj.vclock is not None) + if use_vclocks: headers['X-Riak-Vclock'] = robj.vclock.encode('base64') response = self._request('DELETE', url, headers) self.check_http_code(response[0], [204, 404]) diff --git a/riak/transports/pbc/transport.py b/riak/transports/pbc/transport.py index 574f950b..c021e56c 100644 --- a/riak/transports/pbc/transport.py +++ b/riak/transports/pbc/transport.py @@ -252,7 +252,9 @@ def delete(self, robj, rw=None, r=None, w=None, dw=None, pr=None, pw=None, if self.client_timeouts() and timeout: req.timeout = timeout - if self.tombstone_vclocks() and robj.vclock: + use_vclocks = (self.tombstone_vclocks() and hasattr(robj, 'vclock') + and robj.vclock) + if use_vclocks: req.vclock = robj.vclock.encode('binary') bucket = robj.bucket