Skip to content

Commit

Permalink
Merge pull request #76 from herdigiorgi/decimal
Browse files Browse the repository at this point in the history
add Decimal support
  • Loading branch information
ramonhagenaars committed Dec 4, 2019
2 parents 2237c1f + b654e22 commit 8f37580
Show file tree
Hide file tree
Showing 6 changed files with 49 additions and 0 deletions.
5 changes: 5 additions & 0 deletions jsons/__init__.py
Expand Up @@ -90,6 +90,7 @@
from enum import Enum
from typing import Union, List, Tuple, Iterable
from uuid import UUID
from decimal import Decimal
from jsons._common_impl import NoneType
from jsons._key_transformers import snakecase, camelcase, pascalcase, lispcase
from jsons import (
Expand Down Expand Up @@ -150,6 +151,7 @@
default_timedelta_serializer = serializers.default_timedelta_serializer
default_primitive_serializer = serializers.default_primitive_serializer
default_object_serializer = serializers.default_object_serializer
default_decimal_serializer = serializers.default_decimal_serializer
default_uuid_serializer = serializers.default_uuid_serializer

default_list_deserializer = deserializers.default_list_deserializer
Expand All @@ -169,6 +171,7 @@
default_iterable_deserializer = deserializers.default_iterable_deserializer
default_object_deserializer = deserializers.default_object_deserializer
default_uuid_deserializer = deserializers.default_uuid_deserializer
default_decimal_deserializer = deserializers.default_decimal_deserializer
default_complex_serializer = deserializers.default_complex_deserializer

# Set the serializers:
Expand All @@ -184,6 +187,7 @@
set_serializer(default_iterable_serializer, Iterable, False)
set_serializer(default_object_serializer, object, False)
set_serializer(default_uuid_serializer, UUID)
set_serializer(default_decimal_serializer, Decimal)

# Set the deserializers:
set_deserializer(default_list_deserializer, (list, List))
Expand All @@ -202,4 +206,5 @@
set_deserializer(default_iterable_deserializer, Iterable, False)
set_deserializer(default_object_deserializer, object, False)
set_deserializer(default_uuid_deserializer, UUID)
set_deserializer(default_decimal_deserializer, Decimal)
set_deserializer(default_complex_serializer, complex)
1 change: 1 addition & 0 deletions jsons/deserializers/__init__.py
Expand Up @@ -28,6 +28,7 @@
default_tuple_deserializer,
default_namedtuple_deserializer
)
from jsons.deserializers.default_decimal import default_decimal_deserializer


KEY_TRANSFORMER_SNAKECASE = snakecase
Expand Down
16 changes: 16 additions & 0 deletions jsons/deserializers/default_decimal.py
@@ -0,0 +1,16 @@
from typing import Optional, Union
from decimal import Decimal


def default_decimal_deserializer(obj: Union[str, float, int],
cls: Optional[type] = None,
**kwargs) -> Decimal:
"""
Deserialize a Decimal. Expects a string representation of a number, or
the number itself as a float or int.
:param obj: the string float or int that is to be deserialized.
:param cls: not used.
:param kwargs: any keyword arguments.
:return: the deserialized obj.
"""
return Decimal(obj)
1 change: 1 addition & 0 deletions jsons/serializers/__init__.py
Expand Up @@ -17,6 +17,7 @@
from jsons.serializers.default_primitive import default_primitive_serializer
from jsons.serializers.default_tuple import default_tuple_serializer
from jsons.serializers.default_uuid import default_uuid_serializer
from jsons.serializers.default_decimal import default_decimal_serializer


KEY_TRANSFORMER_SNAKECASE = snakecase
Expand Down
11 changes: 11 additions & 0 deletions jsons/serializers/default_decimal.py
@@ -0,0 +1,11 @@
from decimal import Decimal


def default_decimal_serializer(obj: Decimal, **kwargs) -> str:
"""
Serialize a Decimal.
:param obj: an instance of a Decimal.
:param kwargs: any keyword arguments.
:return: ``obj`` serialized as a string.
"""
return str(obj)
15 changes: 15 additions & 0 deletions tests/test_decimal.py
@@ -0,0 +1,15 @@
from decimal import Decimal
from unittest import TestCase
import jsons


class TestDecimal(TestCase):
def test_dump_decimal(self):
self.assertEqual('12.345', jsons.dump(Decimal('12.345')))
self.assertEqual('2.5', jsons.dump(Decimal(2.5)))
self.assertEqual('25', jsons.dump(Decimal(25)))

def test_load_decimal(self):
self.assertEqual(Decimal('12.345'), jsons.load('12.345', Decimal))
self.assertEqual(Decimal(2.5), jsons.load(2.5, Decimal))
self.assertEqual(Decimal(25), jsons.load(25, Decimal))

0 comments on commit 8f37580

Please sign in to comment.