8000 Fix from_dict() in the presence of optional datetime fields. (#329) · Gobot1234/python-betterproto@8c727d9 · GitHub
[go: up one dir, main page]

8000
Skip to content

Commit 8c727d9

Browse files
authored
Fix from_dict() in the presence of optional datetime fields. (danielgtaylor#329)
1 parent eeddc84 commit 8c727d9

File tree

4 files changed

+9
-5
lines changed

4 files changed

+9
-5
lines changed

src/betterproto/__init__.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1180,8 +1180,8 @@ def from_dict(self: T, value: Dict[str, Any]) -> T:
11801180
if value[key] is not None:
11811181
if meta.proto_type == TYPE_MESSAGE:
11821182
v = getattr(self, field_name)
1183+
cls = self._betterproto.cls_by_field[field_name]
11831184
if isinstance(v, list):
1184-
cls = self._betterproto.cls_by_field[field_name]
11851185
if cls == datetime:
11861186
v = [isoparse(item) for item in value[key]]
11871187
elif cls == timedelta:
@@ -1191,16 +1191,15 @@ def from_dict(self: T, value: Dict[str, Any]) -> T:
11911191
]
11921192
else:
11931193
v = [cls().from_dict(item) for item in value[key]]
1194-
elif isinstance(v, datetime):
1194+
elif cls == datetime:
11951195
v = isoparse(value[key])
11961196
setattr(self, field_name, v)
1197-
elif isinstance(v, timedelta):
1197+
elif cls == timedelta:
11981198
v = timedelta(seconds=float(value[key][:-1]))
11991199
setattr(self, field_name, v)
12001200
elif meta.wraps:
12011201
setattr(self, field_name, value[key])
12021202
elif v is None:
1203-
cls = self._betterproto.cls_by_field[field_name]
12041203
setattr(self, field_name, cls().from_dict(value[key]))
12051204
else:
12061205
# NOTE: `from_dict` mutates the underlying message, so no

tests/inputs/proto3_field_presence/proto3_field_presence.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,6 @@
88
},
99
"test6": "B",
1010
"test7": "8589934592",
11-
"test8": 2.5
11+
"test8": 2.5,
12+
"test9": "2022-01-24T12:12:42Z"
1213
}

tests/inputs/proto3_field_presence/proto3_field_presence.proto

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
syntax = "proto3";
22

3+
import "google/protobuf/timestamp.proto";
4+
35
message InnerTest {
46
string test = 1;
57
}
@@ -13,6 +15,7 @@ message Test {
1315
optional TestEnum test6 = 6;
1416
optional uint64 test7 = 7;
1517
optional float test8 = 8;
18+
optional google.protobuf.Timestamp test9 = 9;
1619
}
1720

1821
enum TestEnum {

tests/inputs/proto3_field_presence/test_proto3_field_presence.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,5 @@ def test_json(ref_json: str, obj_json: str) -> None:
3535
"test6": None,
3636
"test7": None,
3737
"test8": None,
38+
"test9": None,
3839
}

0 commit comments

Comments
 (0)
0