Skip to content

Commit 2fa0be2

Browse files
authored
Fix for #459 (pydantic code gen only) (#460)
1 parent 13d6565 commit 2fa0be2

File tree

2 files changed

+19
-3
lines changed

2 files changed

+19
-3
lines changed

src/betterproto/__init__.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1471,12 +1471,24 @@ def is_set(self, name: str) -> bool:
14711471

14721472
@classmethod
14731473
def _validate_field_groups(cls, values):
1474-
meta = cls._betterproto_meta.oneof_field_by_group # type: ignore
1474+
group_to_one_ofs = cls._betterproto_meta.oneof_field_by_group # type: ignore
1475+
field_name_to_meta = cls._betterproto_meta.meta_by_field_name # type: ignore
1476+
1477+
for group, field_set in group_to_one_ofs.items():
1478+
1479+
if len(field_set) == 1:
1480+
(field,) = field_set
1481+
field_name = field.name
1482+
meta = field_name_to_meta[field_name]
1483+
1484+
# This is a synthetic oneof; we should ignore it's presence and not consider it as a oneof.
1485+
if meta.optional:
1486+
continue
14751487

1476-
for group, field_set in meta.items():
14771488
set_fields = [
14781489
field.name for field in field_set if values[field.name] is not None
14791490
]
1491+
14801492
if not set_fields:
14811493
raise ValueError(f"Group {group} has no value; all fields are None")
14821494
elif len(set_fields) > 1:

src/betterproto/templates/template.py.j2

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,11 @@ import {{ i }}
77
{% endfor %}
88

99
{% if output_file.pydantic_dataclasses %}
10-
from pydantic.dataclasses import dataclass
10+
from typing import TYPE_CHECKING
11+
if TYPE_CHECKING:
12+
from dataclasses import dataclass
13+
else:
14+
from pydantic.dataclasses import dataclass
1115
{%- else -%}
1216
from dataclasses import dataclass
1317
{% endif %}

0 commit comments

Comments
 (0)