Skip to content

Commit ebc67b4

Browse files
Fix unknown enum to dict (#127)
1 parent 37ce2d9 commit ebc67b4

4 files changed

Lines changed: 48 additions & 1 deletion

File tree

betterproto2/src/betterproto2/__init__.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -588,6 +588,11 @@ def _value_to_dict(
588588
return b64encode(value).decode("utf8"), not bool(value)
589589
if proto_type == TYPE_ENUM:
590590
enum_value = field_type(value)
591+
592+
# If we don't know the definition of this variant, we fall back to the value.
593+
if not enum_value.name:
594+
return enum_value.value, not bool(value)
595+
591596
return enum_value.proto_name or enum_value.name, not bool(value)
592597
if proto_type in (TYPE_FLOAT, TYPE_DOUBLE):
593598
return _dump_float(value), not bool(value)

betterproto2/tests/test_all_definition.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,15 @@ def test_all_definition():
1717
"TestSyncStub",
1818
"ThingType",
1919
)
20-
assert enum.__all__ == ("ArithmeticOperator", "Choice", "EnumMessage", "HttpCode", "NoStriping", "Test")
20+
assert enum.__all__ == (
21+
"ArithmeticOperator",
22+
"Choice",
23+
"EnumMessage",
24+
"HttpCode",
25+
"NewVersion",
26+
"NewVersionMessage",
27+
"NoStriping",
28+
"OldVersion",
29+
"OldVersionMessage",
30+
"Test",
31+
)

betterproto2/tests/test_enum.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,3 +98,13 @@ def test_enum_to_dict() -> None:
9898
"arithmeticOperator": "ARITHMETIC_OPERATOR_PLUS", # The original proto name must be preserved
9999
"noStriping": "NO_STRIPING_A",
100100
}
101+
102+
103+
def test_unknown_variant_to_dict() -> None:
104+
from tests.outputs.enum.enum import NewVersion, NewVersionMessage, OldVersionMessage
105+
106+
serialized = bytes(NewVersionMessage(new_version=NewVersion.V3))
107+
108+
deserialized = OldVersionMessage.parse(serialized)
109+
110+
assert deserialized.to_dict() == {"oldVersion": 3}

betterproto2_compiler/tests/inputs/enum/enum.proto

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,24 @@ message EnumMessage {
4343
ArithmeticOperator arithmetic_operator = 1;
4444
NoStriping no_striping = 2;
4545
}
46+
47+
enum OldVersion {
48+
OLD_VERSION_UNSPECIFIED = 0;
49+
OLD_VERSION_V1 = 1;
50+
OLD_VERSION_V2 = 2;
51+
}
52+
53+
message OldVersionMessage {
54+
OldVersion old_version = 1;
55+
}
56+
57+
enum NewVersion {
58+
NEW_VERSION_UNSPECIFIED = 0;
59+
NEW_VERSION_V1 = 1;
60+
NEW_VERSION_V2 = 2;
61+
NEW_VERSION_V3 = 3;
62+
}
63+
64+
message NewVersionMessage {
65+
NewVersion new_version = 1;
66+
}

0 commit comments

Comments
 (0)