Skip to content
This repository was archived by the owner on Jun 9, 2025. It is now read-only.

Commit 404b23f

Browse files
committed
Simplify dataclass fields
1 parent 5863013 commit 404b23f

File tree

1 file changed

+24
-15
lines changed

1 file changed

+24
-15
lines changed

src/betterproto2_compiler/plugin/models.py

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@
5353
FieldDescriptorProto,
5454
FieldDescriptorProtoLabel,
5555
FieldDescriptorProtoType,
56+
FieldDescriptorProtoType as FieldType,
5657
FileDescriptorProto,
5758
MethodDescriptorProto,
5859
)
@@ -339,7 +340,7 @@ def is_map(proto_field_obj: FieldDescriptorProto, parent_message: DescriptorProt
339340
map_entry = f"{proto_field_obj.name.replace('_', '').lower()}entry"
340341
if message_type == map_entry:
341342
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:
343344
return True
344345
return False
345346

@@ -382,7 +383,10 @@ def get_field_string(self) -> str:
382383
"""Construct string representation of this field as a field."""
383384
name = f"{self.py_name}"
384385
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+
)
386390
if self.py_name in dir(builtins):
387391
self.parent.builtins_types.add(self.py_name)
388392
return f'{name}: "{self.annotation}" = {betterproto_field_type}'
@@ -396,9 +400,9 @@ def betterproto_field_args(self) -> list[str]:
396400
args.append("optional=True")
397401
if self.repeated:
398402
args.append("repeated=True")
399-
if self.field_type == "enum":
403+
if self.field_type == FieldType.TYPE_ENUM:
400404
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)")
402406
return args
403407

404408
@property
@@ -426,12 +430,13 @@ def repeated(self) -> bool:
426430

427431
@property
428432
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)
430435

431436
@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)
435440

436441
@property
437442
def packed(self) -> bool:
@@ -540,13 +545,17 @@ def ready(self) -> None:
540545

541546
raise ValueError("can't find enum")
542547

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}'
550559

551560
@property
552561
def annotation(self) -> str:

0 commit comments

Comments
 (0)