fix Message.to_dict mutating the underlying Message (#378)

* [fix] to_dict modifies the underlying message (#151)

* add test for mapmessage

* fix for to_dict

* formatting

* Apply suggestions from code review

Co-authored-by: Arun Babu Neelicattu <arun.neelicattu@gmail.com>

* change to_json to to_dict

Co-authored-by: Arun Babu Neelicattu <arun.neelicattu@gmail.com>
This commit is contained in:
GrownNed 2022-05-09 19:29:42 +03:00 committed by GitHub
parent 06c26ba60d
commit 85e4be96d8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 21 additions and 2 deletions

View File

@ -1123,12 +1123,13 @@ class Message(ABC):
): ):
output[cased_name] = value.to_dict(casing, include_default_values) output[cased_name] = value.to_dict(casing, include_default_values)
elif meta.proto_type == TYPE_MAP: elif meta.proto_type == TYPE_MAP:
output_map = {**value}
for k in value: for k in value:
if hasattr(value[k], "to_dict"): if hasattr(value[k], "to_dict"):
value[k] = value[k].to_dict(casing, include_default_values) output_map[k] = value[k].to_dict(casing, include_default_values)
if value or include_default_values: if value or include_default_values:
output[cased_name] = value output[cased_name] = output_map
elif ( elif (
value != self._get_field_default(field_name) value != self._get_field_default(field_name)
or include_default_values or include_default_values

18
tests/test_mapmessage.py Normal file
View File

@ -0,0 +1,18 @@
from tests.output_betterproto.mapmessage import (
Nested,
Test,
)
def test_mapmessage_to_dict_preserves_message():
message = Test(
items={
"test": Nested(
count=1,
)
}
)
message.to_dict()
assert isinstance(message.items["test"], Nested), "Wrong nested type after to_dict"