Add support for repeated timestamps and durations to to_dict from_dict (#211)
This commit is contained in:
parent
59f5f88c0d
commit
9e6881999e
@ -961,7 +961,15 @@ class Message(ABC):
|
|||||||
output[cased_name] = value
|
output[cased_name] = value
|
||||||
elif field_is_repeated:
|
elif field_is_repeated:
|
||||||
# Convert each item.
|
# 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:
|
if value or include_default_values:
|
||||||
output[cased_name] = value
|
output[cased_name] = value
|
||||||
elif (
|
elif (
|
||||||
@ -1042,8 +1050,18 @@ class Message(ABC):
|
|||||||
v = getattr(self, field_name)
|
v = getattr(self, field_name)
|
||||||
if isinstance(v, list):
|
if isinstance(v, list):
|
||||||
cls = self._betterproto.cls_by_field[field_name]
|
cls = self._betterproto.cls_by_field[field_name]
|
||||||
for item in value[key]:
|
if cls == datetime:
|
||||||
v.append(cls().from_dict(item))
|
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):
|
elif isinstance(v, datetime):
|
||||||
v = datetime.fromisoformat(value[key].replace("Z", "+00:00"))
|
v = datetime.fromisoformat(value[key].replace("Z", "+00:00"))
|
||||||
setattr(self, field_name, v)
|
setattr(self, field_name, v)
|
||||||
|
@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"times": ["1972-01-01T10:00:20.021Z", "1972-01-01T10:00:20.021Z"],
|
||||||
|
"durations": ["1.200s", "1.200s"]
|
||||||
|
}
|
@ -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;
|
||||||
|
}
|
@ -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()]
|
Loading…
x
Reference in New Issue
Block a user