8000 fix: backwards-compatibility for previous meaning format (#603) · googleapis/python-datastore@ed92e8e · GitHub
[go: up one dir, main page]

Skip to content

Commit ed92e8e

Browse files
fix: backwards-compatibility for previous meaning format (#603)
1 parent a7df080 commit ed92e8e

File tree

2 files changed

+65
-1
lines changed

2 files changed

+65
-1
lines changed

google/cloud/datastore/helpers.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
"""
1919

2020
import datetime
21+
import itertools
2122

2223
from google.protobuf import struct_pb2
2324
from google.type import latlng_pb2
@@ -182,7 +183,15 @@ def _set_pb_meaning_from_entity(entity, name, value, value_pb, is_list=False):
182183
return
183184
elif is_list:
184185
# for lists, set meaning on the root pb and on each sub-element
185-
root_meaning, sub_meaning_list = meaning
186+
if isinstance(meaning, tuple):
187+
root_meaning, sub_meaning_list = meaning
188+
else:
189+
# if meaning isn't a tuple, fall back to pre-v2.20.2 meaning format
190+
root_meaning = None
191+
if isinstance(meaning, list):
192+
sub_meaning_list = meaning
193+
else:
194+
sub_meaning_list = itertools.repeat(meaning)
186195
if root_meaning is not None:
187196
value_pb.meaning = root_meaning
188197
if sub_meaning_list:

tests/unit/test_helpers.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1318,6 +1318,61 @@ def test__set_pb_meaning_w_value_unset(orig_meaning):
13181318
assert value_pb.meaning == orig_meaning
13191319

13201320

1321+
def test__set_pb_meaning_w_list_and_single_value():
1322+
"""
1323+
v2.20.2 uses a tuple to represent list meanings (https://github.com/googleapis/python-datastore/pull/575)
1324+
1325+
This check ensures _set_pb_meaning_from_entity is backwards
1326+
compatible with the old meaning style, still used by python-ndb
1327+
"""
1328+
from google.cloud.datastore_v1.types import entity as entity_pb2
1329+
from google.cloud.datastore.helpers import _set_pb_meaning_from_entity
1330+
from google.cloud.datastore.entity import Entity
1331+
1332+
orig_root_meaning = 1
1333+
updated_meaning = 22
1334+
orig_pb = entity_pb2.Entity()
1335+
value_pb = orig_pb._pb.properties.get_or_create("value")
1336+
value_pb.meaning = orig_root_meaning
1337+
sub_value_pb1 = value_pb.array_value.values.add()
1338+
sub_value_pb2 = value_pb.array_value.values.add()
1339+
1340+
entity = Entity(key="key")
1341+
entity._meanings = {"value": (updated_meaning, None)}
1342+
_set_pb_meaning_from_entity(entity, "value", None, value_pb, is_list=True)
1343+
assert value_pb.meaning == orig_root_meaning
1344+
assert sub_value_pb1.meaning == updated_meaning
1345+
assert sub_value_pb2.meaning == updated_meaning
1346+
1347+
1348+
def test__set_pb_meaning_w_list_and_list():
1349+
"""
1350+
v2.20.2 uses a tuple to represent list meanings (https://github.com/googleapis/python-datastore/pull/575)
1351+
1352+
This check ensures _set_pb_meaning_from_entity is backwards
1353+
compatible with the old meaning style, still used by python-ndb
1354+
"""
1355+
from google.cloud.datastore_v1.types import entity as entity_pb2
1356+
from google.cloud.datastore.helpers import _set_pb_meaning_from_entity
1357+
from google.cloud.datastore.entity import Entity
1358+
1359+
orig_root_meaning = 1
1360+
updated_meaning_1 = 12
1361+
updated_meaning_2 = 4
1362+
orig_pb = entity_pb2.Entity()
1363+
value_pb = orig_pb._pb.properties.get_or_create("value")
1364+
value_pb.meaning = orig_root_meaning
1365+
sub_value_pb1 = value_pb.array_value.values.add()
1366+
sub_value_pb2 = value_pb.array_value.values.add()
1367+
1368+
entity = Entity(key="key")
1369+
entity._meanings = {"value": ([updated_meaning_1, updated_meaning_2], None)}
1370+
_set_pb_meaning_from_entity(entity, "value", None, value_pb, is_list=True)
1371+
assert value_pb.meaning == orig_root_meaning
1372+
assert sub_value_pb1.meaning == updated_meaning_1
1373+
assert sub_value_pb2.meaning == updated_meaning_2
1374+
1375+
13211376
def test__array_w_meaning_end_to_end():
13221377
"""
13231378
Test proto->entity->proto with an array with a meaning field

0 commit comments

Comments
 (0)
0