Merge pull request #726 from picturedots/issue-703

Issue 703 -- support for Decimal type
This commit is contained in:
Syrus Akbary 2018-07-24 09:19:58 -07:00 committed by GitHub
commit d728b84e48
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 81 additions and 0 deletions

View File

@ -18,6 +18,7 @@ from .types import (
Date, Date,
DateTime, DateTime,
Time, Time,
Decimal,
JSONString, JSONString,
UUID, UUID,
List, List,
@ -65,6 +66,7 @@ __all__ = [
"Date", "Date",
"DateTime", "DateTime",
"Time", "Time",
"Decimal",
"JSONString", "JSONString",
"UUID", "UUID",
"List", "List",

View File

@ -6,6 +6,7 @@ from .interface import Interface
from .mutation import Mutation from .mutation import Mutation
from .scalars import Scalar, String, ID, Int, Float, Boolean from .scalars import Scalar, String, ID, Int, Float, Boolean
from .datetime import Date, DateTime, Time from .datetime import Date, DateTime, Time
from .decimal import Decimal
from .json import JSONString from .json import JSONString
from .uuid import UUID from .uuid import UUID
from .schema import Schema from .schema import Schema
@ -40,6 +41,7 @@ __all__ = [
"Date", "Date",
"DateTime", "DateTime",
"Time", "Time",
"Decimal",
"JSONString", "JSONString",
"UUID", "UUID",
"Boolean", "Boolean",

34
graphene/types/decimal.py Normal file
View File

@ -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

View File

@ -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