53
53
FieldDescriptorProto ,
54
54
FieldDescriptorProtoLabel ,
55
55
FieldDescriptorProtoType ,
56
+ FieldDescriptorProtoType as FieldType ,
56
57
FileDescriptorProto ,
57
58
MethodDescriptorProto ,
58
59
)
@@ -339,7 +340,7 @@ def is_map(proto_field_obj: FieldDescriptorProto, parent_message: DescriptorProt
339
340
map_entry = f"{ proto_field_obj .name .replace ('_' , '' ).lower ()} entry"
340
341
if message_type == map_entry :
341
342
for nested in parent_message .nested_type : # parent message
342
- if nested .name .replace ("_" , "" ).lower () == map_entry and nested .options .map_entry :
343
+ if nested .name .replace ("_" , "" ).lower () == map_entry and nested .options and nested . options .map_entry :
343
344
return True
344
345
return False
345
346
@@ -382,7 +383,10 @@ def get_field_string(self) -> str:
382
383
"""Construct string representation of this field as a field."""
383
384
name = f"{ self .py_name } "
384
385
field_args = ", " .join ((["" ] + self .betterproto_field_args ) if self .betterproto_field_args else [])
385
- betterproto_field_type = f"betterproto2.{ self .field_type } _field({ self .proto_obj .number } { field_args } )"
386
+
387
+ betterproto_field_type = (
388
+ f"betterproto2.field({ self .proto_obj .number } , betterproto2.{ str (self .field_type )} { field_args } )"
389
+ )
386
390
if self .py_name in dir (builtins ):
387
391
self .parent .builtins_types .add (self .py_name )
388
392
return f'{ name } : "{ self .annotation } " = { betterproto_field_type } '
@@ -396,9 +400,9 @@ def betterproto_field_args(self) -> list[str]:
396
400
args .append ("optional=True" )
397
401
if self .repeated :
398
402
args .append ("repeated=True" )
399
- if self .field_type == "enum" :
403
+ if self .field_type == FieldType . TYPE_ENUM :
400
404
t = self .py_type
401
- args .append (f"enum_default_value =lambda: { t } .try_value(0)" )
405
+ args .append (f"default_factory =lambda: { t } .try_value(0)" )
402
406
return args
403
407
404
408
@property
@@ -426,12 +430,13 @@ def repeated(self) -> bool:
426
430
427
431
@property
428
432
def optional (self ) -> bool :
429
- return self .proto_obj .proto3_optional or (self .field_type == "message" and not self .repeated )
433
+ # TODO not for maps
434
+ return self .proto_obj .proto3_optional or (self .field_type == FieldType .TYPE_MESSAGE and not self .repeated )
430
435
431
436
@property
432
- def field_type (self ) -> str :
433
- """String representation of proto field type."""
434
- return FieldDescriptorProtoType (self .proto_obj .type ). name . lower (). replace ( "type_" , "" )
437
+ def field_type (self ) -> FieldType :
438
+ # TODO it should be possible to remove constructor
439
+ return FieldType (self .proto_obj .type )
435
440
436
441
@property
437
442
def packed (self ) -> bool :
@@ -540,13 +545,17 @@ def ready(self) -> None:
540
545
541
546
raise ValueError ("can't find enum" )
542
547
543
- @property
544
- def betterproto_field_args (self ) -> list [str ]:
545
- return [f"betterproto2.{ self .proto_k_type } " , f"betterproto2.{ self .proto_v_type } " ]
546
-
547
- @property
548
- def field_type (self ) -> str :
549
- return "map"
548
+ def get_field_string (self ) -> str :
549
+ """Construct string representation of this field as a field."""
550
+ betterproto_field_type = (
551
+ f"betterproto2.field({ self .proto_obj .number } , "
552
+ "betterproto2.TYPE_MAP, "
553
+ f"map_types=(betterproto2.{ self .proto_k_type } , "
554
+ f"betterproto2.{ self .proto_v_type } ))"
555
+ )
556
+ if self .py_name in dir (builtins ):
557
+ self .parent .builtins_types .add (self .py_name )
558
+ return f'{ self .py_name } : "{ self .annotation } " = { betterproto_field_type } '
550
559
551
560
@property
552
561
def annotation (self ) -> str :
0 commit comments