Skip to content

Commit bfbb45f

Browse files
authored
Make sure RFC dates are pickable (#208)
* Make sure RFC dates are pickable * Doc * Mypy
1 parent 0534694 commit bfbb45f

File tree

2 files changed

+37
-16
lines changed

2 files changed

+37
-16
lines changed

msrest/serialization.py

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -79,26 +79,32 @@ def dst(self, dt):
7979
"""No daylight saving for UTC."""
8080
return datetime.timedelta(hours=1)
8181

82-
class _FixedOffset(datetime.tzinfo):
83-
"""Fixed offset in minutes east from UTC.
84-
Copy/pasted from Python doc
85-
:param int offset: offset in minutes
86-
"""
82+
try:
83+
from datetime import timezone as _FixedOffset
84+
except ImportError: # Python 2.7
85+
class _FixedOffset(datetime.tzinfo): # type: ignore
86+
"""Fixed offset in minutes east from UTC.
87+
Copy/pasted from Python doc
88+
:param datetime.timedelta offset: offset in timedelta format
89+
"""
8790

88-
def __init__(self, offset):
89-
self.__offset = datetime.timedelta(minutes=offset)
91+
def __init__(self, offset):
92+
self.__offset = offset
9093

91-
def utcoffset(self, dt):
92-
return self.__offset
94+
def utcoffset(self, dt):
95+
return self.__offset
9396

94-
def tzname(self, dt):
95-
return str(self.__offset.total_seconds()/3600)
97+
def tzname(self, dt):
98+
return str(self.__offset.total_seconds()/3600)
9699

97-
def __repr__(self):
98-
return "<FixedOffset {}>".format(self.tzname(None))
100+
def __repr__(self):
101+
return "<FixedOffset {}>".format(self.tzname(None))
99102

100-
def dst(self, dt):
101-
return datetime.timedelta(0)
103+
def dst(self, dt):
104+
return datetime.timedelta(0)
105+
106+
def __getinitargs__(self):
107+
return (self.__offset,)
102108

103109
try:
104110
from datetime import timezone
@@ -1868,7 +1874,7 @@ def deserialize_rfc(attr):
18681874
parsed_date = email.utils.parsedate_tz(attr)
18691875
date_obj = datetime.datetime(
18701876
*parsed_date[:6],
1871-
tzinfo=_FixedOffset((parsed_date[9] or 0)/60)
1877+
tzinfo=_FixedOffset(datetime.timedelta(minutes=(parsed_date[9] or 0)/60))
18721878
)
18731879
if not date_obj.tzinfo:
18741880
date_obj = date_obj.astimezone(tz=TZ_UTC)

tests/test_serialization.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import json
3030
import isodate
3131
import logging
32+
import pickle
3233
from enum import Enum
3334
from datetime import datetime, timedelta, date, time
3435
import unittest
@@ -2058,6 +2059,20 @@ def test_deserialize_datetime_rfc(self):
20582059
self.assertEqual(utc.tm_sec, 8)
20592060
self.assertEqual(a.microsecond, 0)
20602061

2062+
def test_rfc_pickable(self):
2063+
"""Check datetime created by RFC parser are pickable.
2064+
2065+
See https://github.com/Azure/msrest-for-python/issues/205
2066+
"""
2067+
2068+
datetime_rfc = "Mon, 25 May 2020 11:00:00 GMT"
2069+
datetime1 = Deserializer.deserialize_rfc(datetime_rfc)
2070+
2071+
pickled = pickle.dumps(datetime1)
2072+
datetime2 = pickle.loads(pickled)
2073+
2074+
assert datetime1 == datetime2
2075+
20612076
def test_polymorphic_deserialization(self):
20622077

20632078
class Zoo(Model):

0 commit comments

Comments
 (0)