Support date type in python client

This commit is contained in:
geekerzp
2015-07-16 10:11:27 +08:00
parent 4d302683f3
commit 33561fa159
3 changed files with 51 additions and 7 deletions

View File

@@ -15,12 +15,14 @@ import os
import re import re
import urllib import urllib
import json import json
import datetime
import mimetypes import mimetypes
import random import random
import tempfile import tempfile
import threading import threading
from datetime import datetime
from datetime import date
# python 2 and python 3 compatibility library # python 2 and python 3 compatibility library
from six import iteritems from six import iteritems
@@ -146,7 +148,7 @@ class ApiClient(object):
return obj return obj
elif isinstance(obj, list): elif isinstance(obj, list):
return [self.sanitize_for_serialization(sub_obj) for sub_obj in obj] return [self.sanitize_for_serialization(sub_obj) for sub_obj in obj]
elif isinstance(obj, (datetime.datetime, datetime.date)): elif isinstance(obj, (datetime, date)):
return obj.isoformat() return obj.isoformat()
else: else:
if isinstance(obj, dict): if isinstance(obj, dict):
@@ -203,7 +205,7 @@ class ApiClient(object):
# convert str to class # convert str to class
# for native types # for native types
if klass in ['int', 'float', 'str', 'bool', 'datetime', "object"]: if klass in ['int', 'float', 'str', 'bool', "date", 'datetime', "object"]:
klass = eval(klass) klass = eval(klass)
# for model types # for model types
else: else:
@@ -213,6 +215,8 @@ class ApiClient(object):
return self.__deserialize_primitive(data, klass) return self.__deserialize_primitive(data, klass)
elif klass == object: elif klass == object:
return self.__deserialize_object() return self.__deserialize_object()
elif klass == date:
return self.__deserialize_date(data)
elif klass == datetime: elif klass == datetime:
return self.__deserialize_datatime(data) return self.__deserialize_datatime(data)
else: else:
@@ -386,6 +390,21 @@ class ApiClient(object):
""" """
return object() return object()
def __deserialize_date(self, string):
"""
Deserialize string to date
:param string: str
:return: date
"""
try:
from dateutil.parser import parse
return parse(string).date()
except ImportError:
return string
except ValueError:
raise ApiException(status=0, reason="Failed to parse `{0}` into a date object".format(string))
def __deserialize_datatime(self, string): def __deserialize_datatime(self, string):
""" """
Deserialize string to datetime. Deserialize string to datetime.

View File

@@ -15,12 +15,14 @@ import os
import re import re
import urllib import urllib
import json import json
import datetime
import mimetypes import mimetypes
import random import random
import tempfile import tempfile
import threading import threading
from datetime import datetime
from datetime import date
# python 2 and python 3 compatibility library # python 2 and python 3 compatibility library
from six import iteritems from six import iteritems
@@ -146,7 +148,7 @@ class ApiClient(object):
return obj return obj
elif isinstance(obj, list): elif isinstance(obj, list):
return [self.sanitize_for_serialization(sub_obj) for sub_obj in obj] return [self.sanitize_for_serialization(sub_obj) for sub_obj in obj]
elif isinstance(obj, (datetime.datetime, datetime.date)): elif isinstance(obj, (datetime, date)):
return obj.isoformat() return obj.isoformat()
else: else:
if isinstance(obj, dict): if isinstance(obj, dict):
@@ -203,7 +205,7 @@ class ApiClient(object):
# convert str to class # convert str to class
# for native types # for native types
if klass in ['int', 'float', 'str', 'bool', 'datetime', "object"]: if klass in ['int', 'float', 'str', 'bool', "date", 'datetime', "object"]:
klass = eval(klass) klass = eval(klass)
# for model types # for model types
else: else:
@@ -213,6 +215,8 @@ class ApiClient(object):
return self.__deserialize_primitive(data, klass) return self.__deserialize_primitive(data, klass)
elif klass == object: elif klass == object:
return self.__deserialize_object() return self.__deserialize_object()
elif klass == date:
return self.__deserialize_date(data)
elif klass == datetime: elif klass == datetime:
return self.__deserialize_datatime(data) return self.__deserialize_datatime(data)
else: else:
@@ -386,6 +390,21 @@ class ApiClient(object):
""" """
return object() return object()
def __deserialize_date(self, string):
"""
Deserialize string to date
:param string: str
:return: date
"""
try:
from dateutil.parser import parse
return parse(string).date()
except ImportError:
return string
except ValueError:
raise ApiException(status=0, reason="Failed to parse `{0}` into a date object".format(string))
def __deserialize_datatime(self, string): def __deserialize_datatime(self, string):
""" """
Deserialize string to datetime. Deserialize string to datetime.

View File

@@ -63,8 +63,14 @@ class DeserializationTests(unittest.TestCase):
deserialized = self.deserialize(data, "str") deserialized = self.deserialize(data, "str")
self.assertTrue(isinstance(deserialized, str)) self.assertTrue(isinstance(deserialized, str))
def test_deserialize_date(self):
""" deserialize date """
data = "1997-07-16"
deserialized = self.deserialize(data, "date")
self.assertTrue(isinstance(deserialized, datetime.date))
def test_deserialize_datetime(self): def test_deserialize_datetime(self):
""" deserialize dateimte """ """ deserialize datetime """
data = "1997-07-16T19:20:30.45+01:00" data = "1997-07-16T19:20:30.45+01:00"
deserialized = self.deserialize(data, "datetime") deserialized = self.deserialize(data, "datetime")
self.assertTrue(isinstance(deserialized, datetime.datetime)) self.assertTrue(isinstance(deserialized, datetime.datetime))