From 49258193edb7f8debe3f53c941c3bae70f796766 Mon Sep 17 00:00:00 2001 From: Mark Chackerian Date: Tue, 15 May 2018 11:36:08 -0400 Subject: [PATCH] adds decimal type and associated tests --- graphene/__init__.py | 1 + graphene/types/__init__.py | 1 + graphene/types/decimal.py | 29 ++++++++++++++++++ graphene/types/tests/test_decimal.py | 44 ++++++++++++++++++++++++++++ 4 files changed, 75 insertions(+) create mode 100644 graphene/types/decimal.py create mode 100644 graphene/types/tests/test_decimal.py diff --git a/graphene/__init__.py b/graphene/__init__.py index 57e6b0ec..695cdb1d 100644 --- a/graphene/__init__.py +++ b/graphene/__init__.py @@ -12,6 +12,7 @@ from .types import ( Scalar, String, ID, Int, Float, Boolean, Date, DateTime, Time, + Decimal, JSONString, UUID, List, NonNull, diff --git a/graphene/types/__init__.py b/graphene/types/__init__.py index b5b9427c..52a7244a 100644 --- a/graphene/types/__init__.py +++ b/graphene/types/__init__.py @@ -6,6 +6,7 @@ from .interface import Interface from .mutation import Mutation from .scalars import Scalar, String, ID, Int, Float, Boolean from .datetime import Date, DateTime, Time +from .decimal import Decimal from .json import JSONString from .uuid import UUID from .schema import Schema diff --git a/graphene/types/decimal.py b/graphene/types/decimal.py new file mode 100644 index 00000000..8965ecad --- /dev/null +++ b/graphene/types/decimal.py @@ -0,0 +1,29 @@ +import decimal + +from graphql.language import ast + +from .scalars import Scalar + + +class Decimal(Scalar): + """ + The `Decimal` scalar type represents a python Decimal. + """ + @staticmethod + def serialize(dec): + assert isinstance(dec, decimal.Decimal), ( + 'Received not compatible Decimal "{}"'.format(repr(dec)) + ) + return str(dec) + + @classmethod + def parse_literal(cls, node): + if isinstance(node, ast.StringValue): + return cls.parse_value(node.value) + + @staticmethod + def parse_value(value): + try: + return decimal.Decimal(value) + except ValueError: + return None diff --git a/graphene/types/tests/test_decimal.py b/graphene/types/tests/test_decimal.py new file mode 100644 index 00000000..ac8d2d58 --- /dev/null +++ b/graphene/types/tests/test_decimal.py @@ -0,0 +1,44 @@ +import decimal + +from ..decimal import Decimal +from ..objecttype import ObjectType +from ..schema import Schema + + +class Query(ObjectType): + decimal = Decimal(input=Decimal()) + + def resolve_decimal(self, info, input): + return input + +schema = Schema(query=Query) + + +def test_decimal_string_query(): + decimal_value = decimal.Decimal('1969.1974') + result = schema.execute('''{ decimal(input: "%s") }''' % decimal_value) + assert not result.errors + assert result.data == { + 'decimal': str(decimal_value) + } + + +def test_decimal_string_query_variable(): + decimal_value = decimal.Decimal('1969.1974') + + result = schema.execute( + '''query Test($decimal: Decimal){ decimal(input: $decimal) }''', + variable_values={'decimal': decimal_value} + ) + assert not result.errors + assert result.data == { + 'decimal': str(decimal_value) + } + + +def test_bad_decimal_query(): + not_a_decimal = "Nobody expects the Spanish Inquisition!" + + result = schema.execute('''{ decimal(input: "%s") }''' % not_a_decimal) + assert len(result.errors) == 1 + assert result.data == None