Skip to content

Commit 182aeda

Browse files
Handle empty value objects properly (#481)
Co-authored-by: James Hilton-Balfe <[email protected]>
1 parent a7532bb commit 182aeda

File tree

3 files changed

+31
-7
lines changed

3 files changed

+31
-7
lines changed

src/betterproto/__init__.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -704,6 +704,13 @@ def __getattribute__(self, name: str) -> Any:
704704
return value
705705

706706
def __setattr__(self, attr: str, value: Any) -> None:
707+
if (
708+
isinstance(value, Message)
709+
and hasattr(value, "_betterproto")
710+
and not value._betterproto.meta_by_field_name
711+
):
712+
value._serialized_on_wire = True
713+
707714
if attr != "_serialized_on_wire":
708715
# Track when a field has been set.
709716
self.__dict__["_serialized_on_wire"] = True

tests/inputs/google_impl_behavior_equivalence/google_impl_behavior_equivalence.proto

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,16 @@ syntax = "proto3";
22

33
package google_impl_behavior_equivalence;
44

5-
message Foo{
6-
int64 bar = 1;
7-
}
5+
message Foo { int64 bar = 1; }
86

9-
message Test{
10-
oneof group{
7+
message Test {
8+
oneof group {
119
string string = 1;
1210
int64 integer = 2;
1311
Foo foo = 3;
1412
}
1513
}
14+
15+
message Request { Empty foo = 1; }
16+
17+
message Empty {}

tests/inputs/google_impl_behavior_equivalence/test_google_impl_behavior_equivalence.py

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,20 @@
33

44
import betterproto
55
from tests.output_betterproto.google_impl_behavior_equivalence import (
6+
Empty,
67
Foo,
8+
Request,
79
Test,
810
)
911
from tests.output_reference.google_impl_behavior_equivalence.google_impl_behavior_equivalence_pb2 import (
12+
Empty as ReferenceEmpty,
1013
Foo as ReferenceFoo,
14+
Request as ReferenceRequest,
1115
Test as ReferenceTest,
1216
)
1317

1418

1519
def test_oneof_serializes_similar_to_google_oneof():
16-
1720
tests = [
1821
(Test(string="abc"), ReferenceTest(string="abc")),
1922
(Test(integer=2), ReferenceTest(integer=2)),
@@ -30,7 +33,6 @@ def test_oneof_serializes_similar_to_google_oneof():
3033

3134

3235
def test_bytes_are_the_same_for_oneof():
33-
3436
message = Test(string="")
3537
message_reference = ReferenceTest(string="")
3638

@@ -53,3 +55,16 @@ def test_bytes_are_the_same_for_oneof():
5355

5456
assert isinstance(message_reference.foo, ReferenceFoo)
5557
assert isinstance(message_reference2.foo, ReferenceFoo)
58+
59+
60+
def test_empty_message_field():
61+
message = Request()
62+
reference_message = ReferenceRequest()
63+
64+
message.foo = Empty()
65+
reference_message.foo.CopyFrom(ReferenceEmpty())
66+
67+
assert betterproto.serialized_on_wire(message.foo)
68+
assert reference_message.HasField("foo")
69+
70+
assert bytes(message) == reference_message.SerializeToString()

0 commit comments

Comments
 (0)