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
from dateutil.parser import parse
from enum import Enum
import decimal
import json
import mimetypes
import os
@ -59,6 +60,7 @@ class ApiClient:
'bool': bool,
'date': datetime.date,
'datetime': datetime.datetime,
'decimal': decimal.Decimal,
'object': object,
}
_pool = None
@ -346,6 +348,7 @@ class ApiClient:
If obj is str, int, long, float, bool, return directly.
If obj is datetime.datetime, datetime.date
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 dict, return the dict.
If obj is OpenAPI model, return the properties dict.
@ -371,6 +374,8 @@ class ApiClient:
)
elif isinstance(obj, (datetime.datetime, datetime.date)):
return obj.isoformat()
elif isinstance(obj, decimal.Decimal):
return str(obj)
elif isinstance(obj, dict):
obj_dict = obj
@ -462,6 +467,8 @@ class ApiClient:
return self.__deserialize_date(data)
elif klass == datetime.datetime:
return self.__deserialize_datetime(data)
elif klass == decimal.Decimal:
return decimal.Decimal(data)
elif issubclass(klass, Enum):
return self.__deserialize_enum(data, klass)
else:

View File

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

View File

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

View File

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

View File

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

View File

@ -10,6 +10,7 @@ $ pytest
"""
import unittest
from decimal import Decimal
from enum import Enum
from dateutil.parser import parse
@ -180,6 +181,11 @@ class ApiClientTests(unittest.TestCase):
result = self.api_client.sanitize_for_serialization(data)
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):
class EnumSerialization(int, Enum):
NUMBER_0 = 0

View File

@ -14,6 +14,7 @@ import os
import time
import unittest
import datetime
from decimal import Decimal
import pytest as pytest
@ -130,6 +131,15 @@ class DeserializationTests(unittest.TestCase):
deserialized = self.deserialize(response, "datetime", 'application/json')
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):
""" deserialize pet """
data = {