Skip to content

Commit ae880b4

Browse files
committed
Re-allow use of dataset ID from keys as a fallback.
See: #552 (comment)
1 parent 9006e61 commit ae880b4

2 files changed

Lines changed: 48 additions & 16 deletions

File tree

gcloud/datastore/api.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,11 @@ def get(keys, missing=None, deferred=None, connection=None, dataset_id=None):
103103
return []
104104

105105
connection = _require_connection(connection)
106-
dataset_id = _require_dataset_id(dataset_id)
106+
try:
107+
dataset_id = _require_dataset_id(dataset_id)
108+
except EnvironmentError:
109+
dataset_id = keys[0].dataset_id
110+
107111
if list(set([key.dataset_id for key in keys])) != [dataset_id]:
108112
raise ValueError('Keys do not match dataset ID')
109113

@@ -157,7 +161,10 @@ def put(entities, connection=None, dataset_id=None):
157161
return
158162

159163
connection = _require_connection(connection)
160-
dataset_id = _require_dataset_id(dataset_id)
164+
try:
165+
dataset_id = _require_dataset_id(dataset_id)
166+
except EnvironmentError:
167+
dataset_id = entities[0].key.dataset_id
161168

162169
current = Batch.current()
163170
in_batch = current is not None
@@ -192,7 +199,10 @@ def delete(keys, connection=None, dataset_id=None):
192199
return
193200

194201
connection = _require_connection(connection)
195-
dataset_id = _require_dataset_id(dataset_id)
202+
try:
203+
dataset_id = _require_dataset_id(dataset_id)
204+
except EnvironmentError:
205+
dataset_id = keys[0].dataset_id
196206

197207
# We allow partial keys to attempt a delete, the backend will fail.
198208
current = Batch.current()

gcloud/datastore/test_api.py

Lines changed: 35 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -148,30 +148,36 @@ def test_wo_connection(self):
148148
self.assertRaises(EnvironmentError,
149149
self._callFUT, [key], dataset_id=DATASET_ID)
150150

151-
def test_wo_dataset_id(self):
151+
def test_no_keys(self):
152+
results = self._callFUT([])
153+
self.assertEqual(results, [])
154+
155+
def test_miss(self):
152156
from gcloud.datastore.key import Key
153157
from gcloud.datastore.test_connection import _Connection
154158

155159
DATASET_ID = 'DATASET'
156160
connection = _Connection()
157161
key = Key('Kind', 1234, dataset_id=DATASET_ID)
158-
self.assertRaises(EnvironmentError,
159-
self._callFUT, [key], connection=connection)
160-
161-
def test_no_keys(self):
162-
results = self._callFUT([])
162+
results = self._callFUT([key], connection=connection,
163+
dataset_id=DATASET_ID)
163164
self.assertEqual(results, [])
164165

165-
def test_miss(self):
166+
def test_miss_wo_dataset_id(self):
166167
from gcloud.datastore.key import Key
167168
from gcloud.datastore.test_connection import _Connection
168169

169170
DATASET_ID = 'DATASET'
170171
connection = _Connection()
171172
key = Key('Kind', 1234, dataset_id=DATASET_ID)
172-
results = self._callFUT([key], connection=connection,
173-
dataset_id=DATASET_ID)
173+
results = self._callFUT([key], connection=connection)
174174
self.assertEqual(results, [])
175+
expected = {
176+
'dataset_id': DATASET_ID,
177+
'key_pbs': [key.to_protobuf()],
178+
'transaction_id': None,
179+
}
180+
self.assertEqual(connection._called_with, expected)
175181

176182
def test_miss_w_missing(self):
177183
from gcloud.datastore import _datastore_v1_pb2 as datastore_pb
@@ -398,8 +404,18 @@ def test_no_dataset_id(self):
398404
entity.key = _Key(_DATASET)
399405

400406
self.assertEqual(_implicit_environ.CONNECTION, None)
401-
with self.assertRaises(EnvironmentError):
402-
self._callFUT([entity], connection=connection)
407+
result = self._callFUT([entity], connection=connection)
408+
409+
self.assertEqual(result, None)
410+
self.assertEqual(len(connection._committed), 1)
411+
dataset_id, mutation = connection._committed[0]
412+
self.assertEqual(dataset_id, _DATASET)
413+
upserts = list(mutation.upsert)
414+
self.assertEqual(len(upserts), 1)
415+
self.assertEqual(upserts[0].key, entity.key.to_protobuf())
416+
properties = list(upserts[0].property)
417+
self.assertEqual(properties[0].name, 'foo')
418+
self.assertEqual(properties[0].value.string_value, u'bar')
403419

404420
def test_no_entities(self):
405421
from gcloud.datastore import _implicit_environ
@@ -517,8 +533,14 @@ def test_no_dataset_id(self):
517533
key = _Key(_DATASET)
518534

519535
self.assertEqual(_implicit_environ.CONNECTION, None)
520-
with self.assertRaises(EnvironmentError):
521-
self._callFUT([key], connection=connection)
536+
537+
result = self._callFUT([key], connection=connection)
538+
539+
self.assertEqual(result, None)
540+
self.assertEqual(len(connection._committed), 1)
541+
dataset_id, mutation = connection._committed[0]
542+
self.assertEqual(dataset_id, _DATASET)
543+
self.assertEqual(list(mutation.delete), [key.to_protobuf()])
522544

523545
def test_no_keys(self):
524546
from gcloud.datastore import _implicit_environ

0 commit comments

Comments
 (0)