Skip to content

Commit bf1dde6

Browse files
crwilcoxtseaver
andauthored
feat: support autoconversion of Entity to Key for purposes of delete & delete_multi (#123)
* feat: support autoconversion of Entity to Key for purposes of delete, delete_multi * Update google/cloud/datastore/client.py Co-authored-by: Tres Seaver <tseaver@palladion.com> * test: update typing, use entity delete path * fix: remove warning * test: add unit test for delete multi with an entity * fix: lint/black Co-authored-by: Tres Seaver <tseaver@palladion.com>
1 parent 3fcefc4 commit bf1dde6

File tree

3 files changed

+26
-6
lines changed

3 files changed

+26
-6
lines changed

google/cloud/datastore/client.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -622,7 +622,8 @@ def delete(self, key, retry=None, timeout=None):
622622
The backend API does not make a distinction between a single key or
623623
multiple keys in a commit request.
624624
625-
:type key: :class:`google.cloud.datastore.key.Key`
625+
:type key: :class:`google.cloud.datastore.key.Key`, :class:`google.cloud.datastore.entity.Entity`
626+
626627
:param key: The key to be deleted from the datastore.
627628
628629
:type retry: :class:`google.api_core.retry.Retry`
@@ -643,7 +644,7 @@ def delete(self, key, retry=None, timeout=None):
643644
def delete_multi(self, keys, retry=None, timeout=None):
644645
"""Delete keys from the Cloud Datastore.
645646
646-
:type keys: list of :class:`google.cloud.datastore.key.Key`
647+
:type keys: list of :class:`google.cloud.datastore.key.Key`, :class:`google.cloud.datastore.entity.Entity`
647648
:param keys: The keys to be deleted from the Datastore.
648649
649650
:type retry: :class:`google.api_core.retry.Retry`
@@ -671,6 +672,9 @@ def delete_multi(self, keys, retry=None, timeout=None):
671672
current.begin()
672673

673674
for key in keys:
675+
if isinstance(key, Entity):
676+
# If the key is in fact an Entity, the key can be extracted.
677+
key = key.key
674678
current.delete(key)
675679

676680
if not in_batch:

tests/system/test_system.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,8 @@ def setUpModule():
7272

7373

7474
def tearDownModule():
75-
keys = [entity.key for entity in Config.TO_DELETE]
7675
with Config.CLIENT.transaction():
77-
Config.CLIENT.delete_multi(keys)
76+
Config.CLIENT.delete_multi(Config.TO_DELETE)
7877

7978

8079
class TestDatastore(unittest.TestCase):
@@ -83,8 +82,7 @@ def setUp(self):
8382

8483
def tearDown(self):
8584
with Config.CLIENT.transaction():
86-
keys = [entity.key for entity in self.case_entities_to_delete]
87-
Config.CLIENT.delete_multi(keys)
85+
Config.CLIENT.delete_multi(self.case_entities_to_delete)
8886

8987

9088
class TestDatastoreAllocateIDs(TestDatastore):

tests/unit/test_client.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -961,6 +961,24 @@ def test_delete_multi_w_existing_transaction(self):
961961
self.assertEqual(mutated_key, key._key)
962962
client._datastore_api_internal.commit.assert_not_called()
963963

964+
def test_delete_multi_w_existing_transaction_entity(self):
965+
from google.cloud.datastore.entity import Entity
966+
967+
creds = _make_credentials()
968+
client = self._make_one(credentials=creds)
969+
client._datastore_api_internal = _make_datastore_api()
970+
971+
key = _Key()
972+
entity = Entity(key=key)
973+
974+
with _NoCommitTransaction(client) as CURR_XACT:
975+
result = client.delete_multi([entity])
976+
977+
self.assertIsNone(result)
978+
mutated_key = _mutated_pb(self, CURR_XACT.mutations, "delete")
979+
self.assertEqual(mutated_key, key._key)
980+
client._datastore_api_internal.commit.assert_not_called()
981+
964982
def test_allocate_ids_w_partial_key(self):
965983
num_ids = 2
966984

0 commit comments

Comments
 (0)