Skip to content

Commit d171d44

Browse files
committed
Merge pull request #481 from dhermes/fix-477-part4
Address fourth part of 477: Moving Entity.delete to Key (for datastore).
2 parents 36ec6a6 + a741516 commit d171d44

File tree

7 files changed

+61
-51
lines changed

7 files changed

+61
-51
lines changed

gcloud/datastore/connection.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -509,9 +509,8 @@ def delete_entities(self, dataset_id, key_pbs):
509509
:type key_pbs: list of :class:`gcloud.datastore.datastore_v1_pb2.Key`
510510
:param key_pbs: The keys to delete from the datastore.
511511
512-
:rtype: boolean (if in a transaction) or else
513-
:class:`gcloud.datastore.datastore_v1_pb2.MutationResult`.
514-
:returns: True
512+
:rtype: boolean
513+
:returns: `True`
515514
"""
516515
mutation = self.mutation()
517516
helpers._add_keys_to_request(mutation.delete, key_pbs)

gcloud/datastore/entity.py

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -258,21 +258,6 @@ def save(self):
258258

259259
return self
260260

261-
def delete(self):
262-
"""Delete the entity in the Cloud Datastore.
263-
264-
.. note::
265-
This is based entirely off of the :class:`gcloud.datastore.key.Key`
266-
set on the entity. Whatever is stored remotely using the key on the
267-
entity will be deleted.
268-
"""
269-
key = self._must_key
270-
dataset = self._must_dataset
271-
dataset.connection().delete_entities(
272-
dataset_id=dataset.id(),
273-
key_pbs=[key.to_protobuf()],
274-
)
275-
276261
def __repr__(self):
277262
if self._key:
278263
return '<Entity%s %s>' % (self._key.path,

gcloud/datastore/key.py

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -231,19 +231,16 @@ def get(self, connection=None):
231231
"""Retrieve entity corresponding to the curretn key.
232232
233233
:type connection: :class:`gcloud.datastore.connection.Connection`
234-
:param connection: Optional connection used to connection to datastore.
234+
:param connection: Optional connection used to connect to datastore.
235235
236236
:rtype: :class:`gcloud.datastore.entity.Entity` or `NoneType`
237237
:returns: The requested entity, or ``None`` if there was no
238238
match found.
239-
:raises: `ValueError` if the current key is partial.
240239
"""
241240
# Temporary import hack until Dataset is removed in #477.
242241
from gcloud.datastore.dataset import Dataset
243242

244-
if self.is_partial:
245-
raise ValueError('Can only retrieve complete keys.')
246-
243+
# We allow partial keys to attempt a get, the backend will fail.
247244
connection = connection or _implicit_environ.CONNECTION
248245
dataset = Dataset(self.dataset_id, connection=connection)
249246
entities = dataset.get_entities([self])
@@ -254,6 +251,19 @@ def get(self, connection=None):
254251
result.key(self)
255252
return result
256253

254+
def delete(self, connection=None):
255+
"""Delete the key in the Cloud Datastore.
256+
257+
:type connection: :class:`gcloud.datastore.connection.Connection`
258+
:param connection: Optional connection used to connect to datastore.
259+
"""
260+
# We allow partial keys to attempt a delete, the backend will fail.
261+
connection = connection or _implicit_environ.CONNECTION
262+
connection.delete_entities(
263+
dataset_id=self.dataset_id,
264+
key_pbs=[self.to_protobuf()],
265+
)
266+
257267
@property
258268
def is_partial(self):
259269
"""Boolean indicating if the key has an ID (or name).

gcloud/datastore/test_dataset.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,11 @@ def allocate_ids(self, dataset_id, key_pbs):
157157
num_pbs = len(key_pbs)
158158
return [_KeyProto(i) for i in range(num_pbs)]
159159

160+
def delete_entities(self, dataset_id, key_pbs):
161+
self._called_dataset_id = dataset_id
162+
self._called_key_pbs = key_pbs
163+
return True
164+
160165

161166
class _PathElementProto(object):
162167

gcloud/datastore/test_entity.py

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -213,23 +213,6 @@ def test_save_w_returned_key_exclude_from_indexes(self):
213213

214214
self.assertEqual(entity.key()._path, [{'kind': _KIND, 'id': _ID}])
215215

216-
def test_delete_no_key(self):
217-
from gcloud.datastore.entity import NoKey
218-
219-
entity = self._makeOne(None, None)
220-
entity['foo'] = 'Foo'
221-
self.assertRaises(NoKey, entity.delete)
222-
223-
def test_delete(self):
224-
connection = _Connection()
225-
dataset = _Dataset(connection)
226-
key = _Key()
227-
entity = self._makeOne(dataset)
228-
entity.key(key)
229-
entity['foo'] = 'Foo'
230-
self.assertTrue(entity.delete() is None)
231-
self.assertEqual(connection._deleted, (_DATASET_ID, ['KEY']))
232-
233216
def test___repr___no_key_empty(self):
234217
entity = self._makeOne(None, None)
235218
self.assertEqual(repr(entity), '<Entity {}>')
@@ -308,9 +291,6 @@ def save_entity(self, dataset_id, key_pb, properties,
308291
tuple(exclude_from_indexes))
309292
return self._save_result
310293

311-
def delete_entities(self, dataset_id, key_pbs):
312-
self._deleted = (dataset_id, key_pbs)
313-
314294

315295
class _Transaction(object):
316296
_added = ()

gcloud/datastore/test_key.py

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -243,14 +243,45 @@ def test_get_explicit_connection_hit(self):
243243
self.assertEqual(entity.items(), [('foo', 'Foo')])
244244
self.assertTrue(entity.key() is key)
245245

246-
def test_get_explicit_connection_partial_key(self):
246+
def test_get_no_connection(self):
247+
from gcloud.datastore import _implicit_environ
248+
249+
self.assertEqual(_implicit_environ.CONNECTION, None)
250+
key = self._makeOne('KIND', 1234)
251+
with self.assertRaises(AttributeError):
252+
key.get()
253+
254+
def test_delete_explicit_connection(self):
247255
from gcloud.datastore.test_dataset import _Connection
248256

249-
cnxn_lookup_result = []
250-
cnxn = _Connection(*cnxn_lookup_result)
251-
key = self._makeOne('KIND')
252-
with self.assertRaises(ValueError):
253-
key.get(connection=cnxn)
257+
cnxn = _Connection()
258+
key = self._makeOne('KIND', 1234)
259+
result = key.delete(connection=cnxn)
260+
self.assertEqual(result, None)
261+
self.assertEqual(cnxn._called_dataset_id, self._DEFAULT_DATASET)
262+
self.assertEqual(cnxn._called_key_pbs, [key.to_protobuf()])
263+
264+
def test_delete_implicit_connection(self):
265+
from gcloud._testing import _Monkey
266+
from gcloud.datastore import _implicit_environ
267+
from gcloud.datastore.test_dataset import _Connection
268+
269+
cnxn = _Connection()
270+
key = self._makeOne('KIND', 1234)
271+
with _Monkey(_implicit_environ, CONNECTION=cnxn):
272+
result = key.delete()
273+
274+
self.assertEqual(result, None)
275+
self.assertEqual(cnxn._called_dataset_id, self._DEFAULT_DATASET)
276+
self.assertEqual(cnxn._called_key_pbs, [key.to_protobuf()])
277+
278+
def test_delete_no_connection(self):
279+
from gcloud.datastore import _implicit_environ
280+
281+
self.assertEqual(_implicit_environ.CONNECTION, None)
282+
key = self._makeOne('KIND', 1234)
283+
with self.assertRaises(AttributeError):
284+
key.delete()
254285

255286
def test_is_partial_no_name_or_id(self):
256287
key = self._makeOne('KIND')

regression/datastore.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ def setUp(self):
4040
def tearDown(self):
4141
with Transaction():
4242
for entity in self.case_entities_to_delete:
43-
entity.delete()
43+
entity.key().delete()
4444

4545

4646
class TestDatastoreAllocateIDs(TestDatastore):
@@ -358,7 +358,7 @@ def test_transaction(self):
358358

359359
# This will always return after the transaction.
360360
retrieved_entity = key.get()
361+
self.case_entities_to_delete.append(retrieved_entity)
361362
retrieved_dict = dict(retrieved_entity.items())
362363
entity_dict = dict(entity.items())
363364
self.assertEqual(retrieved_dict, entity_dict)
364-
retrieved_entity.delete()

0 commit comments

Comments
 (0)