fix: map field edge-case

This change ensures a parent is a nested type when checking if a field is a map.
This commit is contained in:
Max 2022-04-22 11:06:44 +02:00 committed by GitHub
parent 204e04dd69
commit e7133adeb3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 23 additions and 0 deletions

View File

@ -339,6 +339,9 @@ def is_map(
) -> bool: ) -> bool:
"""True if proto_field_obj is a map, otherwise False.""" """True if proto_field_obj is a map, otherwise False."""
if proto_field_obj.type == FieldDescriptorProtoType.TYPE_MESSAGE: if proto_field_obj.type == FieldDescriptorProtoType.TYPE_MESSAGE:
if not hasattr(parent_message, "nested_type"):
return False
# This might be a map... # This might be a map...
message_type = proto_field_obj.type_name.split(".").pop().lower() message_type = proto_field_obj.type_name.split(".").pop().lower()
map_entry = f"{proto_field_obj.name.replace('_', '').lower()}entry" map_entry = f"{proto_field_obj.name.replace('_', '').lower()}entry"

View File

@ -0,0 +1,20 @@
syntax = "proto3";
package entry;
// This is a minimal example of a repeated message field that caused issues when
// checking whether a message is a map.
//
// During the check wheter a field is a "map", the string "entry" is added to
// the field name, checked against the type name and then further checks are
// made against the nested type of a parent message. In this edge-case, the
// first check would pass even though it shouldn't and that would cause an
// error because the parent type does not have a "nested_type" attribute.
message Test {
repeated ExportEntry export = 1;
}
message ExportEntry {
string name = 1;
}