Add support for repeated timestamps and durations to to_dict from_dict (#211)

This commit is contained in:
Matthew Badger 2021-02-16 18:54:50 +00:00 committed by GitHub
parent 59f5f88c0d
commit 9e6881999e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 44 additions and 3 deletions

View File

@ -961,7 +961,15 @@ class Message(ABC):
output[cased_name] = value
elif field_is_repeated:
# Convert each item.
value = [i.to_dict(casing, include_default_values) for i in value]
cls = self._betterproto.cls_by_field[field_name]
if cls == datetime:
value = [_Timestamp.timestamp_to_json(i) for i in value]
elif cls == timedelta:
value = [_Duration.delta_to_json(i) for i in value]
else:
value = [
i.to_dict(casing, include_default_values) for i in value
]
if value or include_default_values:
output[cased_name] = value
elif (
@ -1042,8 +1050,18 @@ class Message(ABC):
v = getattr(self, field_name)
if isinstance(v, list):
cls = self._betterproto.cls_by_field[field_name]
for item in value[key]:
v.append(cls().from_dict(item))
if cls == datetime:
v = [
datetime.fromisoformat(item.replace("Z", "+00:00"))
for item in value[key]
]
elif cls == timedelta:
v = [
timedelta(seconds=float(item[:-1]))
for item in value[key]
]
else:
v = [cls().from_dict(item) for item in value[key]]
elif isinstance(v, datetime):
v = datetime.fromisoformat(value[key].replace("Z", "+00:00"))
setattr(self, field_name, v)

View File

@ -0,0 +1,4 @@
{
"times": ["1972-01-01T10:00:20.021Z", "1972-01-01T10:00:20.021Z"],
"durations": ["1.200s", "1.200s"]
}

View File

@ -0,0 +1,10 @@
syntax = "proto3";
import "google/protobuf/duration.proto";
import "google/protobuf/timestamp.proto";
message Test {
repeated google.protobuf.Timestamp times = 1;
repeated google.protobuf.Duration durations = 2;
}

View File

@ -0,0 +1,9 @@
from datetime import datetime, timedelta
from tests.output_betterproto.repeated_duration_timestamp import Test
def test_roundtrip():
message = Test()
message.times = [datetime.now(), datetime.now()]
message.durations = [timedelta(), timedelta()]