Skip to content

Commit de3c82a

Browse files
authored
Merge pull request #100 from SoptikHa2/fix-mapping-classification
Check whether a type is mapping by comparing both name and fields
2 parents 1da8332 + 40fac60 commit de3c82a

File tree

1 file changed

+6
-3
lines changed

1 file changed

+6
-3
lines changed

protobuf_to_pydantic/gen_model.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)