Skip to content

Commit dcafca2

Browse files
anandoleecopybara-github
authored andcommitted
Make python text_format able to skip unknown fields for repeated messages
PiperOrigin-RevId: 742306668
1 parent ea77a1a commit dcafca2

File tree

2 files changed

+21
-7
lines changed

2 files changed

+21
-7
lines changed

python/google/protobuf/internal/text_format_test.py

+10
Original file line numberDiff line numberDiff line change
@@ -841,6 +841,16 @@ def testParseUnknownField(self, message_module):
841841
self.assertEqual(message.optional_nested_message.bb, 45)
842842
self.assertEqual(message.optional_int32, 123)
843843

844+
def testParseUnknownRepeatedMessage(self, message_module):
845+
message = message_module.TestAllTypes()
846+
text = (
847+
'unknown_repeated: [{}]\n'
848+
'unknown_repeated2: [<>, {}]\n'
849+
'optional_nested_message { bb: 45 }'
850+
)
851+
text_format.Parse(text, message, allow_unknown_field=True)
852+
self.assertEqual(message.optional_nested_message.bb, 45)
853+
844854
def testParseBadEnumValue(self, message_module):
845855
message = message_module.TestAllTypes()
846856
text = 'optional_nested_enum: BARR'

python/google/protobuf/text_format.py

+11-7
Original file line numberDiff line numberDiff line change
@@ -1196,7 +1196,7 @@ def _SkipFieldContents(self, tokenizer, field_name, immediate_message_type):
11961196
':') and not tokenizer.LookingAt('{') and not tokenizer.LookingAt('<'):
11971197
self._DetectSilentMarker(tokenizer, immediate_message_type, field_name)
11981198
if tokenizer.LookingAt('['):
1199-
self._SkipRepeatedFieldValue(tokenizer)
1199+
self._SkipRepeatedFieldValue(tokenizer, immediate_message_type)
12001200
else:
12011201
self._SkipFieldValue(tokenizer)
12021202
else:
@@ -1271,18 +1271,22 @@ def _SkipFieldValue(self, tokenizer):
12711271
not tokenizer.TryConsumeFloat()):
12721272
raise ParseError('Invalid field value: ' + tokenizer.token)
12731273

1274-
def _SkipRepeatedFieldValue(self, tokenizer):
1274+
def _SkipRepeatedFieldValue(self, tokenizer, immediate_message_type):
12751275
"""Skips over a repeated field value.
12761276
12771277
Args:
12781278
tokenizer: A tokenizer to parse the field value.
12791279
"""
12801280
tokenizer.Consume('[')
1281-
if not tokenizer.LookingAt(']'):
1282-
self._SkipFieldValue(tokenizer)
1283-
while tokenizer.TryConsume(','):
1284-
self._SkipFieldValue(tokenizer)
1285-
tokenizer.Consume(']')
1281+
if not tokenizer.TryConsume(']'):
1282+
while True:
1283+
if tokenizer.LookingAt('<') or tokenizer.LookingAt('{'):
1284+
self._SkipFieldMessage(tokenizer, immediate_message_type)
1285+
else:
1286+
self._SkipFieldValue(tokenizer)
1287+
if tokenizer.TryConsume(']'):
1288+
break
1289+
tokenizer.Consume(',')
12861290

12871291

12881292
class Tokenizer(object):

0 commit comments

Comments
 (0)