From 12695c2aa79ecf44a6c85ed12ed41cb618884a0c Mon Sep 17 00:00:00 2001 From: Danny Hermes Date: Thu, 23 Oct 2014 16:42:21 -0700 Subject: [PATCH 1/2] Only using explicit namespace when deserializing key pb. This issue surfaced during review for #282. --- gcloud/datastore/entity.py | 7 ++++++- gcloud/datastore/helpers.py | 8 ++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/gcloud/datastore/entity.py b/gcloud/datastore/entity.py index 5c939493c9d6..0d75a5c9b413 100644 --- a/gcloud/datastore/entity.py +++ b/gcloud/datastore/entity.py @@ -222,13 +222,18 @@ def save(self): transaction.add_auto_id_entity(self) if isinstance(key_pb, datastore_pb.Key): + # Update the path (which may have been altered). + # NOTE: The underlying namespace can't have changed in a save(). + # The value of the dataset ID may have changed from implicit + # (i.e. None, with the ID implied from the dataset.Dataset + # object associated with the Entity/Key), but if it was + # implicit before the save() we leave it as implicit. path = [] for element in key_pb.path_element: key_part = {} for descriptor, value in element._fields.items(): key_part[descriptor.name] = value path.append(key_part) - # Update the path (which may have been altered). self._key = key.path(path) return self diff --git a/gcloud/datastore/helpers.py b/gcloud/datastore/helpers.py index c8927bf2beea..c5673a8d3c04 100644 --- a/gcloud/datastore/helpers.py +++ b/gcloud/datastore/helpers.py @@ -64,8 +64,12 @@ def key_from_protobuf(pb): path.append(element_dict) - dataset_id = pb.partition_id.dataset_id or None - namespace = pb.partition_id.namespace + dataset_id = None + if pb.partition_id.HasField('dataset_id'): + dataset_id = pb.partition_id.dataset_id + namespace = None + if pb.partition_id.HasField('namespace'): + namespace = pb.partition_id.namespace return Key(path, namespace, dataset_id) From 156c317065e64cdd9719f6bb75b11f5a155ee50c Mon Sep 17 00:00:00 2001 From: Danny Hermes Date: Fri, 24 Oct 2014 10:03:30 -0700 Subject: [PATCH 2/2] Adding checks for namespace in datastore helpers test. This is to ensure that values are correctly ignored when the field isn't set on the protobuf. --- gcloud/datastore/test_helpers.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/gcloud/datastore/test_helpers.py b/gcloud/datastore/test_helpers.py index c2c8aae45933..6e3e5bc97784 100644 --- a/gcloud/datastore/test_helpers.py +++ b/gcloud/datastore/test_helpers.py @@ -22,7 +22,6 @@ def test_wo_dataset(self): entity_pb = datastore_pb.Entity() entity_pb.key.partition_id.dataset_id = _DATASET_ID entity_pb.key.path_element.add(kind=_KIND, id=_ID) - entity_pb.key.partition_id.dataset_id = _DATASET_ID prop_pb = entity_pb.property.add() prop_pb.name = 'foo' prop_pb.value.string_value = 'Foo' @@ -32,6 +31,7 @@ def test_wo_dataset(self): self.assertEqual(entity['foo'], 'Foo') key = entity.key() self.assertEqual(key._dataset_id, _DATASET_ID) + self.assertEqual(key.namespace(), None) self.assertEqual(key.kind(), _KIND) self.assertEqual(key.id(), _ID) @@ -45,7 +45,6 @@ def test_w_dataset(self): entity_pb = datastore_pb.Entity() entity_pb.key.partition_id.dataset_id = _DATASET_ID entity_pb.key.path_element.add(kind=_KIND, id=_ID) - entity_pb.key.partition_id.dataset_id = _DATASET_ID prop_pb = entity_pb.property.add() prop_pb.name = 'foo' prop_pb.value.string_value = 'Foo' @@ -56,6 +55,7 @@ def test_w_dataset(self): self.assertEqual(entity['foo'], 'Foo') key = entity.key() self.assertEqual(key._dataset_id, _DATASET_ID) + self.assertEqual(key.namespace(), None) self.assertEqual(key.kind(), _KIND) self.assertEqual(key.id(), _ID) @@ -88,11 +88,13 @@ def test_w_dataset_id_in_pb(self): pb = self._makePB(_DATASET) key = self._callFUT(pb) self.assertEqual(key._dataset_id, _DATASET) + self.assertEqual(key.namespace(), None) def test_w_namespace_in_pb(self): _NAMESPACE = 'NAMESPACE' pb = self._makePB(namespace=_NAMESPACE) key = self._callFUT(pb) + self.assertEqual(key._dataset_id, None) self.assertEqual(key.namespace(), _NAMESPACE) def test_w_path_in_pb(self):