Reviewers: Rafe,
Description:
Fix bug in Message.check_initialized for message fields. Fixes Issue 51.
Please review this at
http://google-protorpc-review.appspot.com/95001/
Affected files:
M python/protorpc/messages.py
M python/protorpc/messages_test.py
M python/protorpc/protojson.py
M python/protorpc/protourlencode.py
M python/protorpc/registry.py
Index: python/protorpc/messages.py
diff --git a/python/protorpc/messages.py b/python/protorpc/messages.py
index
a014270542463726c6e9d124fa178fd014c8eacf..741072617529beadabaa803b08f4027304fcb4cd
100644
--- a/python/protorpc/messages.py
+++ b/python/protorpc/messages.py
@@ -761,12 +761,14 @@ class Message(object):
else:
try:
if (isinstance(field, MessageField) and
- issubclass(field.type, MessageField)):
+ issubclass(field.message_type, Message)):
if field.repeated:
for item in value:
- item.check_initialized()
+ item_message_value = field.value_to_message(item)
+ item_message_value.check_initialized()
else:
- value.check_initialized()
+ message_value = field.value_to_message(value)
+ message_value.check_initialized()
except ValidationError, err:
if not hasattr(err, 'message_name'):
err.message_name = type(self).__name__
@@ -1525,7 +1527,7 @@ class MessageField(Field):
message: A message instance of type self.message_type.
Returns:
- Value of self.type.
+ Value of self.message_type.
"""
if not isinstance(message, self.message_type):
raise DecodeError('Expected type %s, got %s: %r' %
Index: python/protorpc/messages_test.py
diff --git a/python/protorpc/messages_test.py
b/python/protorpc/messages_test.py
index
ea3a6898c5bb39e9601a2aa811e42fb5be161e46..b571c4b13cad5a9a0d166f1fa6dc3ea5ad112c28
100644
--- a/python/protorpc/messages_test.py
+++ b/python/protorpc/messages_test.py
@@ -1197,6 +1197,24 @@ class MessageTest(test_util.TestCase):
self.assertTrue(simple_message.is_initialized())
+ def testIsInitializedNestedField(self):
+ """Tests is_initialized for nested fields."""
+ class SimpleMessage(messages.Message):
+ required = messages.IntegerField(1, required=True)
+
+ class NestedMessage(messages.Message):
+ simple = messages.MessageField(SimpleMessage, 1)
+
+ simple_message = SimpleMessage()
+ self.assertFalse(simple_message.is_initialized())
+ nested_message = NestedMessage(simple=simple_message)
+ self.assertFalse(nested_message.is_initialized())
+
+ simple_message.required = 10
+
+ self.assertTrue(simple_message.is_initialized())
+ self.assertTrue(nested_message.is_initialized())
+
def testNestedMethodsNotAllowed(self):
"""Test that method definitions on Message classes are not allowed."""
def action():
Index: python/protorpc/protojson.py
diff --git a/python/protorpc/protojson.py b/python/protorpc/protojson.py
index
d50a11a13e08b63266e7ed7d7b483c182ce78bb1..4a19224f29e43a4ed51205bb963982389790065f
100644
--- a/python/protorpc/protojson.py
+++ b/python/protorpc/protojson.py
@@ -262,7 +262,7 @@ def decode_message(message_type, encoded_message):
except ValueError, err:
raise messages.DecodeError(err)
elif isinstance(field, messages.MessageField):
- item = decode_dictionary(field.type, item)
+ item = decode_dictionary(field.message_type, item)
elif (isinstance(field, messages.FloatField) and
isinstance(item, (int, long, basestring))):
try:
Index: python/protorpc/protourlencode.py
diff --git a/python/protorpc/protourlencode.py
b/python/protorpc/protourlencode.py
index
381baa159b14616c67dd845d9265fe744b5dffae..00aba24c9fd481a0128533d343877426d2e6c2c6
100644
--- a/python/protorpc/protourlencode.py
+++ b/python/protorpc/protourlencode.py
@@ -236,7 +236,7 @@ class URLEncodedRequestBuilder(object):
return None
if isinstance(field, messages.MessageField):
- message_type = field.type
+ message_type = field.message_type
else:
message_type = None
@@ -335,8 +335,7 @@ class URLEncodedRequestBuilder(object):
next_path = parent_path + ((name, index),)
next_message = self.__messages.get(next_path, None)
if next_message is None:
- message_type = field.type
- next_message = message_type()
+ next_message = field.message_type()
self.__messages[next_path] = next_message
if not field.repeated:
setattr(parent,
field.name, next_message)
Index: python/protorpc/registry.py
diff --git a/python/protorpc/registry.py b/python/protorpc/registry.py
index
30236508cce688a0885867068ac53f98d656e3fa..8e291880e09778834b66b2567b7f1d20829a3ac9
100644
--- a/python/protorpc/registry.py
+++ b/python/protorpc/registry.py
@@ -174,8 +174,8 @@ class RegistryService(remote.Service):
for field in message_type.all_fields():
if isinstance(field, messages.MessageField):
- if field.type not in seen:
- get_dependencies(field.type, seen)
+ if field.message_type not in seen:
+ get_dependencies(field.message_type, seen)
elif isinstance(field, messages.EnumField):
seen.add(field.type)