Skip to content

Commit 3d45523

Browse files
authored
Add time type to serialization (#196)
1 parent 6487fa7 commit 3d45523

File tree

2 files changed

+46
-1
lines changed

2 files changed

+46
-1
lines changed

msrest/serialization.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -416,6 +416,7 @@ def __init__(self, classes=None):
416416
'unix-time': Serializer.serialize_unix,
417417
'duration': Serializer.serialize_duration,
418418
'date': Serializer.serialize_date,
419+
'time': Serializer.serialize_time,
419420
'decimal': Serializer.serialize_decimal,
420421
'long': Serializer.serialize_long,
421422
'bytearray': Serializer.serialize_bytearray,
@@ -999,6 +1000,20 @@ def serialize_date(attr, **kwargs):
9991000
t = "{:04}-{:02}-{:02}".format(attr.year, attr.month, attr.day)
10001001
return t
10011002

1003+
@staticmethod
1004+
def serialize_time(attr, **kwargs):
1005+
"""Serialize Time object into ISO-8601 formatted string.
1006+
1007+
:param datetime.time attr: Object to be serialized.
1008+
:rtype: str
1009+
"""
1010+
if isinstance(attr, str):
1011+
attr = isodate.parse_time(attr)
1012+
t = "{:02}:{:02}:{:02}".format(attr.hour, attr.minute, attr.second)
1013+
if attr.microsecond:
1014+
t += ".{:02}".format(attr.microsecond)
1015+
return t
1016+
10021017
@staticmethod
10031018
def serialize_duration(attr, **kwargs):
10041019
"""Serialize TimeDelta object into ISO-8601 formatted string.
@@ -1230,6 +1245,7 @@ def __init__(self, classes=None):
12301245
'unix-time': Deserializer.deserialize_unix,
12311246
'duration': Deserializer.deserialize_duration,
12321247
'date': Deserializer.deserialize_date,
1248+
'time': Deserializer.deserialize_time,
12331249
'decimal': Deserializer.deserialize_decimal,
12341250
'long': Deserializer.deserialize_long,
12351251
'bytearray': Deserializer.deserialize_bytearray,
@@ -1763,6 +1779,20 @@ def deserialize_date(attr):
17631779
# This must NOT use defaultmonth/defaultday. Using None ensure this raises an exception.
17641780
return isodate.parse_date(attr, defaultmonth=None, defaultday=None)
17651781

1782+
@staticmethod
1783+
def deserialize_time(attr):
1784+
"""Deserialize ISO-8601 formatted string into time object.
1785+
1786+
:param str attr: response string to be deserialized.
1787+
:rtype: datetime.time
1788+
:raises: DeserializationError if string format invalid.
1789+
"""
1790+
if isinstance(attr, ET.Element):
1791+
attr = attr.text
1792+
if re.search(r"[^\W\d_]", attr, re.I + re.U):
1793+
raise DeserializationError("Date must have only digits and -. Received: %s" % attr)
1794+
return isodate.parse_time(attr)
1795+
17661796
@staticmethod
17671797
def deserialize_rfc(attr):
17681798
"""Deserialize RFC-1123 formatted string into Datetime object.

tests/test_serialization.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
import isodate
3131
import logging
3232
from enum import Enum
33-
from datetime import datetime, timedelta, date
33+
from datetime import datetime, timedelta, date, time
3434
import unittest
3535

3636
import xml.etree.ElementTree as ET
@@ -800,6 +800,14 @@ def test_serialize_datetime(self):
800800
date_str = Serializer.serialize_iso(date_obj)
801801
assert date_str == '2012-02-24T00:53:52.780Z'
802802

803+
def test_serialize_time(self):
804+
805+
time_str = Serializer.serialize_time(time(11,22,33))
806+
assert time_str == "11:22:33"
807+
808+
time_str = Serializer.serialize_time(time(11,22,33,444))
809+
assert time_str == "11:22:33.444"
810+
803811
def test_serialize_primitive_types(self):
804812

805813
a = self.s.serialize_data(1, 'int')
@@ -1814,6 +1822,13 @@ def test_deserialize_date(self):
18141822
with self.assertRaises(DeserializationError):
18151823
a = Deserializer.deserialize_date('201O-18-90')
18161824

1825+
def test_deserialize_time(self):
1826+
a = Deserializer.deserialize_time('11:22:33')
1827+
assert time(11,22,33) == a
1828+
1829+
with self.assertRaises(DeserializationError):
1830+
Deserializer.deserialize_time('1O:22:33')
1831+
18171832
def test_deserialize_datetime(self):
18181833

18191834
a = Deserializer.deserialize_iso('9999-12-31T23:59:59+23:59')

0 commit comments

Comments
 (0)