Use dateutil parser (#213)

Switch to using `isoparse` from `dateutil.parser` instead of `datetime.fromisoformat` for more robust parsing of dates in from_dict.
This commit is contained in:
robinaly
2021-02-24 22:18:05 +01:00
committed by GitHub
parent 9e6881999e
commit 6c1c41e9cc
4 changed files with 107 additions and 13 deletions

View File

@@ -8,6 +8,7 @@ import typing
from abc import ABC
from base64 import b64decode, b64encode
from datetime import datetime, timedelta, timezone
from dateutil.parser import isoparse
from typing import (
Any,
Callable,
@@ -26,12 +27,6 @@ from ._types import T
from .casing import camel_case, safe_snake_case, snake_case
from .grpc.grpclib_client import ServiceStub
if sys.version_info[:2] < (3, 7):
# Apply backport of datetime.fromisoformat from 3.7
from backports.datetime_fromisoformat import MonkeyPatch
MonkeyPatch.patch_fromisoformat()
# Proto 3 data types
TYPE_ENUM = "enum"
@@ -1051,10 +1046,7 @@ class Message(ABC):
if isinstance(v, list):
cls = self._betterproto.cls_by_field[field_name]
if cls == datetime:
v = [
datetime.fromisoformat(item.replace("Z", "+00:00"))
for item in value[key]
]
v = [isoparse(item) for item in value[key]]
elif cls == timedelta:
v = [
timedelta(seconds=float(item[:-1]))
@@ -1063,7 +1055,7 @@ class Message(ABC):
else:
v = [cls().from_dict(item) for item in value[key]]
elif isinstance(v, datetime):
v = datetime.fromisoformat(value[key].replace("Z", "+00:00"))
v = isoparse(value[key])
setattr(self, field_name, v)
elif isinstance(v, timedelta):
v = timedelta(seconds=float(value[key][:-1]))