diff --git a/mparticle/api_client.py b/mparticle/api_client.py index 2bca7e5..f5a747d 100644 --- a/mparticle/api_client.py +++ b/mparticle/api_client.py @@ -35,6 +35,8 @@ from datetime import datetime from datetime import date +from datetime import time +from decimal import Decimal # python 2 and python 3 compatibility library from six import iteritems @@ -203,8 +205,10 @@ def sanitize_for_serialization(obj): If obj is None, return None. If obj is str, int, long, float, bool, return directly. - If obj is datetime.datetime, datetime.date + If obj is datetime.datetime, datetime.date, datetime.time convert to string in iso8601 format. + if obj is decimal.Decimal + convert to string If obj is list, sanitize each element in the list. If obj is dict, return the dict. If obj is swagger model, return the properties dict. @@ -220,8 +224,10 @@ def sanitize_for_serialization(obj): elif isinstance(obj, list): return [ApiClient.sanitize_for_serialization(sub_obj) for sub_obj in obj] - elif isinstance(obj, (datetime, date)): + elif isinstance(obj, (datetime, date, time)): return obj.isoformat() + elif isinstance(obj, Decimal): + return str(obj) else: if isinstance(obj, dict): obj_dict = obj diff --git a/test/test_api_client.py b/test/test_api_client.py index 23dd99d..450f331 100644 --- a/test/test_api_client.py +++ b/test/test_api_client.py @@ -24,6 +24,9 @@ from __future__ import absolute_import +import datetime +import decimal +import json import os import sys import unittest @@ -46,6 +49,52 @@ def test_validate_custom_attributes(self): self.assertFalse(ApiClient.validate_attribute_bag_values({"foo":"bar", "foo-2":5, "foo-3":[3.14], "foo-4":None})) pass + def test_sanitize_for_serialization(self): + obj = { + "a_string": "foo", + "a_int": 123, + "a_float": 1.23, + "a_bool": True, + "a_null": None, + "a_date": datetime.date(2023, 5, 3), + "a_datetime": datetime.datetime(2023, 5, 3, 10, 58, 16, 123), + "a_time": datetime.time(10, 58, 16, 123), + "a_decimal": decimal.Decimal('5.2E+7'), + "a_dict": { + "a_string": "foo", + "a_int": 123, + }, + "a_array": [ + "hello", + "world", + ], + } + + sanitized_obj = ApiClient.sanitize_for_serialization(obj) + assert sanitized_obj == { + "a_string": "foo", + "a_int": 123, + "a_float": 1.23, + "a_bool": True, + "a_null": None, + "a_date": '2023-05-03', + "a_datetime": '2023-05-03T10:58:16.000123', + "a_time": '10:58:16.000123', + "a_decimal": '5.2E+7', + "a_dict": { + "a_string": "foo", + "a_int": 123, + }, + "a_array": [ + "hello", + "world", + ], + } + + serialized_obj = json.dumps(sanitized_obj) + assert serialized_obj == '{"a_string": "foo", "a_int": 123, "a_float": 1.23, "a_bool": true, "a_null": null, ' \ + '"a_date": "2023-05-03", "a_datetime": "2023-05-03T10:58:16.000123", "a_time": "10:58:16.000123", ' \ + '"a_decimal": "5.2E+7", "a_dict": {"a_string": "foo", "a_int": 123}, "a_array": ["hello", "world"]}' if __name__ == '__main__':