@@ -224,6 +224,9 @@ def _get_field_info_dict_by_full_name(self, full_name: str) -> Optional["FieldIn
224224 return None
225225 return None
226226
227+ def _is_type_a_mapping (self , message_type : Descriptor ) -> bool :
228+ return message_type .name .endswith ("Entry" ) and message_type .fields_by_name .keys () == ["key" , "value" ]
229+
227230 def _one_of_handle (self , descriptor : Descriptor ) -> Tuple [Dict [str , "UseOneOfTypedDict" ], Dict [str , Any ]]:
228231 message_option_dict : "MessageOptionTypedDict" = self ._message_option_dict .get (
229232 descriptor .name , {"message" : {}, "one_of" : {}, "nested" : {}, "metadata" : {}}
@@ -297,7 +300,7 @@ def get_nested_message_dict_by_message(self, descriptor: Descriptor) -> Dict[str
297300 # nested support
298301 nested_message_dict : Dict [str , Type [Union [BaseModel , IntEnum ]]] = {}
299302 for message in descriptor .nested_types :
300- if message . name . endswith ( "Entry" ):
303+ if self . _is_type_a_mapping ( message ):
301304 continue
302305 nested_type : Any = self ._parse_msg_to_pydantic_model (descriptor = message , root_descriptor = descriptor )
303306 nested_message_dict [message .full_name ] = nested_type
@@ -323,7 +326,7 @@ def _protobuf_field_type_is_type_message_handler(self, field_dataclass: FieldDat
323326 field_dataclass .field_default_factory = self ._message_default_factory_dict_by_type_name [
324327 protobuf_field .message_type .name
325328 ]
326- elif protobuf_field .message_type . name . endswith ( "Entry" ):
329+ elif self . _is_type_a_mapping ( protobuf_field .message_type ):
327330 # support google.protobuf.MapEntry
328331 # key, value = column.message_type.fields
329332 field_dataclass .field_type_name = "map"
@@ -442,7 +445,7 @@ def _protobuf_field_type_is_type_enum_handler(self, field_dataclass: FieldDataCl
442445 def _protobuf_field_lable_is_label_repeated_handler (self , field_dataclass : FieldDataClass ) -> None :
443446 # support google.protobuf.array
444447 protobuf_field = field_dataclass .protobuf_field
445- if not (protobuf_field .message_type and protobuf_field .message_type . name . endswith ( "Entry" )):
448+ if not (protobuf_field .message_type and self . _is_type_a_mapping ( protobuf_field .message_type )):
446449 # I didn't know that Protobuf's Design of Maps and Lists would be so weird
447450 field_dataclass .field_type = List [field_dataclass .field_type ] # type: ignore
448451 field_dataclass .field_default_factory = list
0 commit comments