Skip to content

Commit

Permalink
Merge pull request #726 from picturedots/issue-703
Browse files Browse the repository at this point in the history
Issue 703 -- support for Decimal type
  • Loading branch information
syrusakbary authored Jul 24, 2018
2 parents d28dc68 + 00cc978 commit d728b84
Show file tree
Hide file tree
Showing 4 changed files with 81 additions and 0 deletions.
2 changes: 2 additions & 0 deletions graphene/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
Date,
DateTime,
Time,
Decimal,
JSONString,
UUID,
List,
Expand Down Expand Up @@ -65,6 +66,7 @@
"Date",
"DateTime",
"Time",
"Decimal",
"JSONString",
"UUID",
"List",
Expand Down
2 changes: 2 additions & 0 deletions graphene/types/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
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
Expand Down Expand Up @@ -40,6 +41,7 @@
"Date",
"DateTime",
"Time",
"Decimal",
"JSONString",
"UUID",
"Boolean",
Expand Down
34 changes: 34 additions & 0 deletions graphene/types/decimal.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
from __future__ import absolute_import

from decimal import Decimal as _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):
if isinstance(dec, str):
dec = _Decimal(dec)
assert isinstance(dec, _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(value)
except ValueError:
return None
43 changes: 43 additions & 0 deletions graphene/types/tests/test_decimal.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
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)}
assert decimal.Decimal(result.data["decimal"]) == 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)}
assert decimal.Decimal(result.data["decimal"]) == 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 is None

0 comments on commit d728b84

Please sign in to comment.