Skip to content

Commit

Permalink
Merge pull request #136 from craigcitro/encoding_bug
Browse files Browse the repository at this point in the history
Fix a nasty encoding corner case with JsonValue.
  • Loading branch information
cherba29 authored Nov 29, 2016
2 parents 58dfc18 + 3f14c91 commit f1f353a
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 12 deletions.
22 changes: 10 additions & 12 deletions apitools/base/protorpclite/protojson.py
Original file line number Diff line number Diff line change
Expand Up @@ -277,22 +277,20 @@ def __decode_dictionary(self, message_type, dictionary):
'No variant found for unrecognized field: %s', key)
continue

# Normalize values in to a list.
if isinstance(value, list):
if not value:
continue
else:
value = [value]

valid_value = []
for item in value:
valid_value.append(self.decode_field(field, item))
# This is just for consistency with the old behavior.
if value == []:
continue

if field.repeated:
_ = getattr(message, field.name)
# This should be unnecessary? Or in fact become an error.
if not isinstance(value, list):
value = [value]
valid_value = [self.decode_field(field, item)
for item in value]
setattr(message, field.name, valid_value)
else:
setattr(message, field.name, valid_value[-1])
setattr(message, field.name, self.decode_field(field, value))

return message

def decode_field(self, field, value):
Expand Down
12 changes: 12 additions & 0 deletions apitools/base/py/extra_types_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,18 @@ def testJsonObjectPropertyTranslation(self):
self.assertEqual(json_value, encoding.MessageToJson(value))
self.assertEqual(json_obj, encoding.MessageToJson(obj))

def testJsonValueAsFieldTranslation(self):
class HasJsonValueMsg(messages.Message):
some_value = messages.MessageField(extra_types.JsonValue, 1)

msg_json = '{"some_value": [1, 2, 3]}'
msg = HasJsonValueMsg(
some_value=encoding.PyValueToMessage(
extra_types.JsonValue, [1, 2, 3]))
self.assertEqual(msg,
encoding.JsonToMessage(HasJsonValueMsg, msg_json))
self.assertEqual(msg_json, encoding.MessageToJson(msg))

def testDateField(self):

class DateMsg(messages.Message):
Expand Down

0 comments on commit f1f353a

Please sign in to comment.