Fix from_dict() in the presence of optional datetime fields. (#329)
This commit is contained in:
parent
eeddc844a5
commit
8c727d904f
@ -1180,8 +1180,8 @@ class Message(ABC):
|
|||||||
if value[key] is not None:
|
if value[key] is not None:
|
||||||
if meta.proto_type == TYPE_MESSAGE:
|
if meta.proto_type == TYPE_MESSAGE:
|
||||||
v = getattr(self, field_name)
|
v = getattr(self, field_name)
|
||||||
if isinstance(v, list):
|
|
||||||
cls = self._betterproto.cls_by_field[field_name]
|
cls = self._betterproto.cls_by_field[field_name]
|
||||||
|
if isinstance(v, list):
|
||||||
if cls == datetime:
|
if cls == datetime:
|
||||||
v = [isoparse(item) for item in value[key]]
|
v = [isoparse(item) for item in value[key]]
|
||||||
elif cls == timedelta:
|
elif cls == timedelta:
|
||||||
@ -1191,16 +1191,15 @@ class Message(ABC):
|
|||||||
]
|
]
|
||||||
else:
|
else:
|
||||||
v = [cls().from_dict(item) for item in value[key]]
|
v = [cls().from_dict(item) for item in value[key]]
|
||||||
elif isinstance(v, datetime):
|
elif cls == datetime:
|
||||||
v = isoparse(value[key])
|
v = isoparse(value[key])
|
||||||
setattr(self, field_name, v)
|
setattr(self, field_name, v)
|
||||||
elif isinstance(v, timedelta):
|
elif cls == timedelta:
|
||||||
v = timedelta(seconds=float(value[key][:-1]))
|
v = timedelta(seconds=float(value[key][:-1]))
|
||||||
setattr(self, field_name, v)
|
setattr(self, field_name, v)
|
||||||
elif meta.wraps:
|
elif meta.wraps:
|
||||||
setattr(self, field_name, value[key])
|
setattr(self, field_name, value[key])
|
||||||
elif v is None:
|
elif v is None:
|
||||||
cls = self._betterproto.cls_by_field[field_name]
|
|
||||||
setattr(self, field_name, cls().from_dict(value[key]))
|
setattr(self, field_name, cls().from_dict(value[key]))
|
||||||
else:
|
else:
|
||||||
# NOTE: `from_dict` mutates the underlying message, so no
|
# NOTE: `from_dict` mutates the underlying message, so no
|
||||||
|
@ -8,5 +8,6 @@
|
|||||||
},
|
},
|
||||||
"test6": "B",
|
"test6": "B",
|
||||||
"test7": "8589934592",
|
"test7": "8589934592",
|
||||||
"test8": 2.5
|
"test8": 2.5,
|
||||||
|
"test9": "2022-01-24T12:12:42Z"
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
syntax = "proto3";
|
syntax = "proto3";
|
||||||
|
|
||||||
|
import "google/protobuf/timestamp.proto";
|
||||||
|
|
||||||
message InnerTest {
|
message InnerTest {
|
||||||
string test = 1;
|
string test = 1;
|
||||||
}
|
}
|
||||||
@ -13,6 +15,7 @@ message Test {
|
|||||||
optional TestEnum test6 = 6;
|
optional TestEnum test6 = 6;
|
||||||
optional uint64 test7 = 7;
|
optional uint64 test7 = 7;
|
||||||
optional float test8 = 8;
|
optional float test8 = 8;
|
||||||
|
optional google.protobuf.Timestamp test9 = 9;
|
||||||
}
|
}
|
||||||
|
|
||||||
enum TestEnum {
|
enum TestEnum {
|
||||||
|
@ -35,4 +35,5 @@ def test_null_fields_json():
|
|||||||
"test6": None,
|
"test6": None,
|
||||||
"test7": None,
|
"test7": None,
|
||||||
"test8": None,
|
"test8": None,
|
||||||
|
"test9": None,
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user