From c311190cf88205e1537cad85b43aa4fc26c6e2f8 Mon Sep 17 00:00:00 2001 From: Adrien Vannson Date: Thu, 31 Jul 2025 11:29:54 +0200 Subject: [PATCH] Fix unknown enum to dict --- betterproto2/src/betterproto2/__init__.py | 5 +++++ betterproto2/tests/test_all_definition.py | 13 +++++++++++- betterproto2/tests/test_enum.py | 10 +++++++++ .../tests/inputs/enum/enum.proto | 21 +++++++++++++++++++ 4 files changed, 48 insertions(+), 1 deletion(-) diff --git a/betterproto2/src/betterproto2/__init__.py b/betterproto2/src/betterproto2/__init__.py index 24a02926..dc159eb5 100644 --- a/betterproto2/src/betterproto2/__init__.py +++ b/betterproto2/src/betterproto2/__init__.py @@ -588,6 +588,11 @@ def _value_to_dict( return b64encode(value).decode("utf8"), not bool(value) if proto_type == TYPE_ENUM: enum_value = field_type(value) + + # If we don't know the definition of this variant, we fall back to the value. + if not enum_value.name: + return enum_value.value, not bool(value) + return enum_value.proto_name or enum_value.name, not bool(value) if proto_type in (TYPE_FLOAT, TYPE_DOUBLE): return _dump_float(value), not bool(value) diff --git a/betterproto2/tests/test_all_definition.py b/betterproto2/tests/test_all_definition.py index eb2ec30d..ce22ae7c 100644 --- a/betterproto2/tests/test_all_definition.py +++ b/betterproto2/tests/test_all_definition.py @@ -17,4 +17,15 @@ def test_all_definition(): "TestSyncStub", "ThingType", ) - assert enum.__all__ == ("ArithmeticOperator", "Choice", "EnumMessage", "HttpCode", "NoStriping", "Test") + assert enum.__all__ == ( + "ArithmeticOperator", + "Choice", + "EnumMessage", + "HttpCode", + "NewVersion", + "NewVersionMessage", + "NoStriping", + "OldVersion", + "OldVersionMessage", + "Test", + ) diff --git a/betterproto2/tests/test_enum.py b/betterproto2/tests/test_enum.py index f8e0bc17..6dc12f78 100644 --- a/betterproto2/tests/test_enum.py +++ b/betterproto2/tests/test_enum.py @@ -98,3 +98,13 @@ def test_enum_to_dict() -> None: "arithmeticOperator": "ARITHMETIC_OPERATOR_PLUS", # The original proto name must be preserved "noStriping": "NO_STRIPING_A", } + + +def test_unknown_variant_to_dict() -> None: + from tests.outputs.enum.enum import NewVersion, NewVersionMessage, OldVersionMessage + + serialized = bytes(NewVersionMessage(new_version=NewVersion.V3)) + + deserialized = OldVersionMessage.parse(serialized) + + assert deserialized.to_dict() == {"oldVersion": 3} diff --git a/betterproto2_compiler/tests/inputs/enum/enum.proto b/betterproto2_compiler/tests/inputs/enum/enum.proto index fb2aa9fc..09e4499a 100644 --- a/betterproto2_compiler/tests/inputs/enum/enum.proto +++ b/betterproto2_compiler/tests/inputs/enum/enum.proto @@ -43,3 +43,24 @@ message EnumMessage { ArithmeticOperator arithmetic_operator = 1; NoStriping no_striping = 2; } + +enum OldVersion { + OLD_VERSION_UNSPECIFIED = 0; + OLD_VERSION_V1 = 1; + OLD_VERSION_V2 = 2; +} + +message OldVersionMessage { + OldVersion old_version = 1; +} + +enum NewVersion { + NEW_VERSION_UNSPECIFIED = 0; + NEW_VERSION_V1 = 1; + NEW_VERSION_V2 = 2; + NEW_VERSION_V3 = 3; +} + +message NewVersionMessage { + NewVersion new_version = 1; +}