Adding decimal support for python client generation (#19203)

* Adding decimal to template for Python generator

* Rerunning the build steps

* Add tests for decimal serialization and deserialization.

* Move test to python not legacy pydantic sample

* readd old imports

---------

Co-authored-by: Adam <abolfik@pollyex.com>
This commit is contained in:
m-standfuss 2024-07-23 02:16:23 -06:00 committed by GitHub
parent fef84d956e
commit 6ad5864d28
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
7 changed files with 51 additions and 0 deletions

View File

@ -5,6 +5,7 @@
import datetime import datetime
from dateutil.parser import parse from dateutil.parser import parse
from enum import Enum from enum import Enum
import decimal
import json import json
import mimetypes import mimetypes
import os import os
@ -59,6 +60,7 @@ class ApiClient:
'bool': bool, 'bool': bool,
'date': datetime.date, 'date': datetime.date,
'datetime': datetime.datetime, 'datetime': datetime.datetime,
'decimal': decimal.Decimal,
'object': object, 'object': object,
} }
_pool = None _pool = None
@ -346,6 +348,7 @@ class ApiClient:
If obj is str, int, long, float, bool, return directly. If obj is str, int, long, float, bool, return directly.
If obj is datetime.datetime, datetime.date If obj is datetime.datetime, datetime.date
convert to string in iso8601 format. convert to string in iso8601 format.
If obj is decimal.Decimal return string representation.
If obj is list, sanitize each element in the list. If obj is list, sanitize each element in the list.
If obj is dict, return the dict. If obj is dict, return the dict.
If obj is OpenAPI model, return the properties dict. If obj is OpenAPI model, return the properties dict.
@ -371,6 +374,8 @@ class ApiClient:
) )
elif isinstance(obj, (datetime.datetime, datetime.date)): elif isinstance(obj, (datetime.datetime, datetime.date)):
return obj.isoformat() return obj.isoformat()
elif isinstance(obj, decimal.Decimal):
return str(obj)
elif isinstance(obj, dict): elif isinstance(obj, dict):
obj_dict = obj obj_dict = obj
@ -462,6 +467,8 @@ class ApiClient:
return self.__deserialize_date(data) return self.__deserialize_date(data)
elif klass == datetime.datetime: elif klass == datetime.datetime:
return self.__deserialize_datetime(data) return self.__deserialize_datetime(data)
elif klass == decimal.Decimal:
return decimal.Decimal(data)
elif issubclass(klass, Enum): elif issubclass(klass, Enum):
return self.__deserialize_enum(data, klass) return self.__deserialize_enum(data, klass)
else: else:

View File

@ -16,6 +16,7 @@
import datetime import datetime
from dateutil.parser import parse from dateutil.parser import parse
from enum import Enum from enum import Enum
import decimal
import json import json
import mimetypes import mimetypes
import os import os
@ -67,6 +68,7 @@ class ApiClient:
'bool': bool, 'bool': bool,
'date': datetime.date, 'date': datetime.date,
'datetime': datetime.datetime, 'datetime': datetime.datetime,
'decimal': decimal.Decimal,
'object': object, 'object': object,
} }
_pool = None _pool = None
@ -339,6 +341,7 @@ class ApiClient:
If obj is str, int, long, float, bool, return directly. If obj is str, int, long, float, bool, return directly.
If obj is datetime.datetime, datetime.date If obj is datetime.datetime, datetime.date
convert to string in iso8601 format. convert to string in iso8601 format.
If obj is decimal.Decimal return string representation.
If obj is list, sanitize each element in the list. If obj is list, sanitize each element in the list.
If obj is dict, return the dict. If obj is dict, return the dict.
If obj is OpenAPI model, return the properties dict. If obj is OpenAPI model, return the properties dict.
@ -364,6 +367,8 @@ class ApiClient:
) )
elif isinstance(obj, (datetime.datetime, datetime.date)): elif isinstance(obj, (datetime.datetime, datetime.date)):
return obj.isoformat() return obj.isoformat()
elif isinstance(obj, decimal.Decimal):
return str(obj)
elif isinstance(obj, dict): elif isinstance(obj, dict):
obj_dict = obj obj_dict = obj
@ -455,6 +460,8 @@ class ApiClient:
return self.__deserialize_date(data) return self.__deserialize_date(data)
elif klass == datetime.datetime: elif klass == datetime.datetime:
return self.__deserialize_datetime(data) return self.__deserialize_datetime(data)
elif klass == decimal.Decimal:
return decimal.Decimal(data)
elif issubclass(klass, Enum): elif issubclass(klass, Enum):
return self.__deserialize_enum(data, klass) return self.__deserialize_enum(data, klass)
else: else:

View File

@ -16,6 +16,7 @@
import datetime import datetime
from dateutil.parser import parse from dateutil.parser import parse
from enum import Enum from enum import Enum
import decimal
import json import json
import mimetypes import mimetypes
import os import os
@ -67,6 +68,7 @@ class ApiClient:
'bool': bool, 'bool': bool,
'date': datetime.date, 'date': datetime.date,
'datetime': datetime.datetime, 'datetime': datetime.datetime,
'decimal': decimal.Decimal,
'object': object, 'object': object,
} }
_pool = None _pool = None
@ -339,6 +341,7 @@ class ApiClient:
If obj is str, int, long, float, bool, return directly. If obj is str, int, long, float, bool, return directly.
If obj is datetime.datetime, datetime.date If obj is datetime.datetime, datetime.date
convert to string in iso8601 format. convert to string in iso8601 format.
If obj is decimal.Decimal return string representation.
If obj is list, sanitize each element in the list. If obj is list, sanitize each element in the list.
If obj is dict, return the dict. If obj is dict, return the dict.
If obj is OpenAPI model, return the properties dict. If obj is OpenAPI model, return the properties dict.
@ -364,6 +367,8 @@ class ApiClient:
) )
elif isinstance(obj, (datetime.datetime, datetime.date)): elif isinstance(obj, (datetime.datetime, datetime.date)):
return obj.isoformat() return obj.isoformat()
elif isinstance(obj, decimal.Decimal):
return str(obj)
elif isinstance(obj, dict): elif isinstance(obj, dict):
obj_dict = obj obj_dict = obj
@ -455,6 +460,8 @@ class ApiClient:
return self.__deserialize_date(data) return self.__deserialize_date(data)
elif klass == datetime.datetime: elif klass == datetime.datetime:
return self.__deserialize_datetime(data) return self.__deserialize_datetime(data)
elif klass == decimal.Decimal:
return decimal.Decimal(data)
elif issubclass(klass, Enum): elif issubclass(klass, Enum):
return self.__deserialize_enum(data, klass) return self.__deserialize_enum(data, klass)
else: else:

View File

@ -15,6 +15,7 @@
import datetime import datetime
from dateutil.parser import parse from dateutil.parser import parse
from enum import Enum from enum import Enum
import decimal
import json import json
import mimetypes import mimetypes
import os import os
@ -66,6 +67,7 @@ class ApiClient:
'bool': bool, 'bool': bool,
'date': datetime.date, 'date': datetime.date,
'datetime': datetime.datetime, 'datetime': datetime.datetime,
'decimal': decimal.Decimal,
'object': object, 'object': object,
} }
_pool = None _pool = None
@ -341,6 +343,7 @@ class ApiClient:
If obj is str, int, long, float, bool, return directly. If obj is str, int, long, float, bool, return directly.
If obj is datetime.datetime, datetime.date If obj is datetime.datetime, datetime.date
convert to string in iso8601 format. convert to string in iso8601 format.
If obj is decimal.Decimal return string representation.
If obj is list, sanitize each element in the list. If obj is list, sanitize each element in the list.
If obj is dict, return the dict. If obj is dict, return the dict.
If obj is OpenAPI model, return the properties dict. If obj is OpenAPI model, return the properties dict.
@ -366,6 +369,8 @@ class ApiClient:
) )
elif isinstance(obj, (datetime.datetime, datetime.date)): elif isinstance(obj, (datetime.datetime, datetime.date)):
return obj.isoformat() return obj.isoformat()
elif isinstance(obj, decimal.Decimal):
return str(obj)
elif isinstance(obj, dict): elif isinstance(obj, dict):
obj_dict = obj obj_dict = obj
@ -457,6 +462,8 @@ class ApiClient:
return self.__deserialize_date(data) return self.__deserialize_date(data)
elif klass == datetime.datetime: elif klass == datetime.datetime:
return self.__deserialize_datetime(data) return self.__deserialize_datetime(data)
elif klass == decimal.Decimal:
return decimal.Decimal(data)
elif issubclass(klass, Enum): elif issubclass(klass, Enum):
return self.__deserialize_enum(data, klass) return self.__deserialize_enum(data, klass)
else: else:

View File

@ -15,6 +15,7 @@
import datetime import datetime
from dateutil.parser import parse from dateutil.parser import parse
from enum import Enum from enum import Enum
import decimal
import json import json
import mimetypes import mimetypes
import os import os
@ -66,6 +67,7 @@ class ApiClient:
'bool': bool, 'bool': bool,
'date': datetime.date, 'date': datetime.date,
'datetime': datetime.datetime, 'datetime': datetime.datetime,
'decimal': decimal.Decimal,
'object': object, 'object': object,
} }
_pool = None _pool = None
@ -338,6 +340,7 @@ class ApiClient:
If obj is str, int, long, float, bool, return directly. If obj is str, int, long, float, bool, return directly.
If obj is datetime.datetime, datetime.date If obj is datetime.datetime, datetime.date
convert to string in iso8601 format. convert to string in iso8601 format.
If obj is decimal.Decimal return string representation.
If obj is list, sanitize each element in the list. If obj is list, sanitize each element in the list.
If obj is dict, return the dict. If obj is dict, return the dict.
If obj is OpenAPI model, return the properties dict. If obj is OpenAPI model, return the properties dict.
@ -363,6 +366,8 @@ class ApiClient:
) )
elif isinstance(obj, (datetime.datetime, datetime.date)): elif isinstance(obj, (datetime.datetime, datetime.date)):
return obj.isoformat() return obj.isoformat()
elif isinstance(obj, decimal.Decimal):
return str(obj)
elif isinstance(obj, dict): elif isinstance(obj, dict):
obj_dict = obj obj_dict = obj
@ -454,6 +459,8 @@ class ApiClient:
return self.__deserialize_date(data) return self.__deserialize_date(data)
elif klass == datetime.datetime: elif klass == datetime.datetime:
return self.__deserialize_datetime(data) return self.__deserialize_datetime(data)
elif klass == decimal.Decimal:
return decimal.Decimal(data)
elif issubclass(klass, Enum): elif issubclass(klass, Enum):
return self.__deserialize_enum(data, klass) return self.__deserialize_enum(data, klass)
else: else:

View File

@ -10,6 +10,7 @@ $ pytest
""" """
import unittest import unittest
from decimal import Decimal
from enum import Enum from enum import Enum
from dateutil.parser import parse from dateutil.parser import parse
@ -180,6 +181,11 @@ class ApiClientTests(unittest.TestCase):
result = self.api_client.sanitize_for_serialization(data) result = self.api_client.sanitize_for_serialization(data)
self.assertEqual(result, "1997-07-16T19:20:30.450000+01:00") self.assertEqual(result, "1997-07-16T19:20:30.450000+01:00")
def test_sanitize_for_serialization_decimal(self):
data = Decimal("1.0")
result = self.api_client.sanitize_for_serialization(data)
self.assertEquals(result, "1.0")
def test_sanitize_for_serialization_list_enum(self): def test_sanitize_for_serialization_list_enum(self):
class EnumSerialization(int, Enum): class EnumSerialization(int, Enum):
NUMBER_0 = 0 NUMBER_0 = 0

View File

@ -14,6 +14,7 @@ import os
import time import time
import unittest import unittest
import datetime import datetime
from decimal import Decimal
import pytest as pytest import pytest as pytest
@ -130,6 +131,15 @@ class DeserializationTests(unittest.TestCase):
deserialized = self.deserialize(response, "datetime", 'application/json') deserialized = self.deserialize(response, "datetime", 'application/json')
self.assertTrue(isinstance(deserialized, datetime.datetime)) self.assertTrue(isinstance(deserialized, datetime.datetime))
def test_deserialize_decimal(self):
""" deserialize decimal """
data = 1.1
response = json.dumps(data)
deserialized = self.deserialize(response, "decimal", 'application/json')
self.assertTrue(isinstance(deserialized, Decimal))
self.assertEqual(deserialized, Decimal(1.1))
def test_deserialize_pet(self): def test_deserialize_pet(self):
""" deserialize pet """ """ deserialize pet """
data = { data = {