Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 8 additions & 6 deletions datastore/google/cloud/datastore/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -212,8 +212,6 @@ def entity_to_protobuf(entity):

for name, value in entity.items():
value_is_list = isinstance(value, list)
if value_is_list and len(value) == 0:
continue

value_pb = _new_value_pb(entity_pb, name)
# Set the appropriate value.
Expand Down Expand Up @@ -453,10 +451,14 @@ def _set_protobuf_value(value_pb, val):
entity_pb = entity_to_protobuf(val)
value_pb.entity_value.CopyFrom(entity_pb)
elif attr == 'array_value':
l_pb = value_pb.array_value.values
for item in val:
i_pb = l_pb.add()
_set_protobuf_value(i_pb, item)
if len(val) == 0:
array_value = entity_pb2.ArrayValue(values=[])
value_pb.array_value.CopyFrom(array_value)
else:
l_pb = value_pb.array_value.values
for item in val:
i_pb = l_pb.add()
_set_protobuf_value(i_pb, item)
elif attr == 'geo_point_value':
value_pb.geo_point_value.CopyFrom(val)
else: # scalar, just assign
Expand Down
12 changes: 12 additions & 0 deletions datastore/tests/system/test_system.py
Original file line number Diff line number Diff line change
Expand Up @@ -547,3 +547,15 @@ def test_failure_with_contention(self):
# transaction.
entity_in_txn[contention_prop_name] = u'inside'
txn.put(entity_in_txn)

def test_empty_array_put(self):
local_client = clone_client(Config.CLIENT)

key = local_client.key('EmptyArray', 1234)
local_client = datastore.Client()
entity = datastore.Entity(key=key)
entity['children'] = []
local_client.put(entity)
retrieved = local_client.get(entity.key)

self.assertEqual(entity['children'], retrieved['children'])
6 changes: 3 additions & 3 deletions datastore/tests/unit/test_batch.py
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ def test_put_entity_w_completed_key(self):
'foo': 'bar',
'baz': 'qux',
'spam': [1, 2, 3],
'frotz': [], # will be ignored
'frotz': [],
}
client = _Client(project)
batch = self._make_one(client)
Expand All @@ -134,15 +134,15 @@ def test_put_entity_w_completed_key(self):
self.assertEqual(mutated_entity.key, key._key)

prop_dict = dict(_property_tuples(mutated_entity))
self.assertEqual(len(prop_dict), 3)
self.assertEqual(len(prop_dict), 4)
self.assertFalse(prop_dict['foo'].exclude_from_indexes)
self.assertTrue(prop_dict['baz'].exclude_from_indexes)
self.assertFalse(prop_dict['spam'].exclude_from_indexes)
spam_values = prop_dict['spam'].array_value.values
self.assertTrue(spam_values[0].exclude_from_indexes)
self.assertTrue(spam_values[1].exclude_from_indexes)
self.assertTrue(spam_values[2].exclude_from_indexes)
self.assertFalse('frotz' in prop_dict)
self.assertTrue('frotz' in prop_dict)

def test_delete_wrong_status(self):
project = 'PROJECT'
Expand Down
6 changes: 5 additions & 1 deletion datastore/tests/unit/test_helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -294,7 +294,11 @@ def test_with_empty_list(self):
entity['foo'] = []
entity_pb = self._call_fut(entity)

self._compare_entity_proto(entity_pb, entity_pb2.Entity())
expected_pb = entity_pb2.Entity()
prop = expected_pb.properties.get_or_create('foo')
prop.array_value.CopyFrom(entity_pb2.ArrayValue(values=[]))

self._compare_entity_proto(entity_pb, expected_pb)

def test_inverts_to_protobuf(self):
from google.cloud.datastore_v1.proto import entity_pb2
Expand Down