Add support for pydantic dataclasses (#406)

This commit is contained in:
Samuel Yvon
2023-02-13 07:37:16 -08:00
committed by GitHub
parent 6df8cef3f0
commit 13d656587c
11 changed files with 283 additions and 19 deletions

View File

@@ -628,7 +628,6 @@ class Message(ABC):
# Set current field of each group after `__init__` has already been run.
group_current: Dict[str, Optional[str]] = {}
for field_name, meta in self._betterproto.meta_by_field_name.items():
if meta.group:
group_current.setdefault(meta.group)
@@ -1470,6 +1469,24 @@ class Message(ABC):
)
return self.__raw_get(name) is not default
@classmethod
def _validate_field_groups(cls, values):
meta = cls._betterproto_meta.oneof_field_by_group # type: ignore
for group, field_set in meta.items():
set_fields = [
field.name for field in field_set if values[field.name] is not None
]
if not set_fields:
raise ValueError(f"Group {group} has no value; all fields are None")
elif len(set_fields) > 1:
set_fields_str = ", ".join(set_fields)
raise ValueError(
f"Group {group} has more than one value; fields {set_fields_str} are not None"
)
return values
def serialized_on_wire(message: Message) -> bool:
"""