Skip to content

Commit 55a512e

Browse files
committed
Merge pull request #617 from dhermes/fix-616
Only parsing protobuf entity key if field is set.
2 parents df4c625 + 1234c09 commit 55a512e

File tree

2 files changed

+46
-1
lines changed

2 files changed

+46
-1
lines changed

gcloud/datastore/helpers.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,10 @@ def entity_from_protobuf(pb):
4545
:rtype: :class:`gcloud.datastore.entity.Entity`
4646
:returns: The entity derived from the protobuf.
4747
"""
48-
key = key_from_protobuf(pb.key)
48+
key = None
49+
if pb.HasField('key'):
50+
key = key_from_protobuf(pb.key)
51+
4952
entity_props = {}
5053
exclude_from_indexes = []
5154

gcloud/datastore/test_helpers.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,48 @@ def test_mismatched_value_indexed(self):
104104
with self.assertRaises(ValueError):
105105
self._callFUT(entity_pb)
106106

107+
def test_entity_no_key(self):
108+
from gcloud.datastore import _datastore_v1_pb2 as datastore_pb
109+
110+
entity_pb = datastore_pb.Entity()
111+
entity = self._callFUT(entity_pb)
112+
113+
self.assertEqual(entity.key, None)
114+
self.assertEqual(dict(entity), {})
115+
116+
def test_nested_entity_no_key(self):
117+
from gcloud.datastore import _datastore_v1_pb2 as datastore_pb
118+
119+
DATASET_ID = 's~FOO'
120+
KIND = 'KIND'
121+
INSIDE_NAME = 'IFOO'
122+
OUTSIDE_NAME = 'OBAR'
123+
INSIDE_VALUE = 1337
124+
125+
entity_inside = datastore_pb.Entity()
126+
inside_prop = entity_inside.property.add()
127+
inside_prop.name = INSIDE_NAME
128+
inside_prop.value.integer_value = INSIDE_VALUE
129+
130+
entity_pb = datastore_pb.Entity()
131+
entity_pb.key.partition_id.dataset_id = DATASET_ID
132+
element = entity_pb.key.path_element.add()
133+
element.kind = KIND
134+
135+
outside_prop = entity_pb.property.add()
136+
outside_prop.name = OUTSIDE_NAME
137+
outside_prop.value.entity_value.CopyFrom(entity_inside)
138+
139+
entity = self._callFUT(entity_pb)
140+
self.assertEqual(entity.key.dataset_id, DATASET_ID)
141+
self.assertEqual(entity.key.flat_path, (KIND,))
142+
self.assertEqual(len(entity), 1)
143+
144+
inside_entity = entity[OUTSIDE_NAME]
145+
self.assertEqual(inside_entity.key, None)
146+
self.assertEqual(len(inside_entity), 1)
147+
self.assertEqual(inside_entity[INSIDE_NAME], INSIDE_VALUE)
148+
107149

108150
class Test_key_from_protobuf(unittest2.TestCase):
109151

0 commit comments

Comments
 (0)