mirror of
https://github.com/graphql-python/graphene.git
synced 2025-05-10 19:33:40 +03:00
fix[Decimal]: converting from float -> decimal resulted in inaccurate values
Example:- Decimal(0.01) -> Decimal("0.01000000000000000020816681711721685132943093776702880859375") Additional: Decimal field now accepts string, int & float. Previously it was just string & int
This commit is contained in:
parent
8290326308
commit
2da461831a
|
@ -1,7 +1,7 @@
|
||||||
from decimal import Decimal as _Decimal
|
from decimal import Decimal as _Decimal
|
||||||
|
|
||||||
from graphql import Undefined
|
from graphql import Undefined
|
||||||
from graphql.language.ast import StringValueNode, IntValueNode
|
from graphql.language.ast import StringValueNode, IntValueNode, FloatValueNode
|
||||||
|
|
||||||
from .scalars import Scalar
|
from .scalars import Scalar
|
||||||
|
|
||||||
|
@ -22,13 +22,13 @@ class Decimal(Scalar):
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def parse_literal(cls, node, _variables=None):
|
def parse_literal(cls, node, _variables=None):
|
||||||
if isinstance(node, (StringValueNode, IntValueNode)):
|
if isinstance(node, (StringValueNode, IntValueNode, FloatValueNode)):
|
||||||
return cls.parse_value(node.value)
|
return cls.parse_value(node.value)
|
||||||
return Undefined
|
return Undefined
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def parse_value(value):
|
def parse_value(value):
|
||||||
try:
|
try:
|
||||||
return _Decimal(value)
|
return _Decimal(str(value))
|
||||||
except Exception:
|
except Exception:
|
||||||
return Undefined
|
return Undefined
|
||||||
|
|
|
@ -23,6 +23,26 @@ def test_decimal_string_query():
|
||||||
assert decimal.Decimal(result.data["decimal"]) == decimal_value
|
assert decimal.Decimal(result.data["decimal"]) == decimal_value
|
||||||
|
|
||||||
|
|
||||||
|
def test_decimal_float_query():
|
||||||
|
float_value = 1969.1974
|
||||||
|
decimal_value = decimal.Decimal(str(float_value))
|
||||||
|
result = schema.execute("""{ decimal(input: %s) }""" % float_value)
|
||||||
|
assert not result.errors
|
||||||
|
assert not result.errors
|
||||||
|
assert result.data == {"decimal": str(decimal_value)}
|
||||||
|
assert decimal.Decimal(result.data["decimal"]) == decimal_value
|
||||||
|
|
||||||
|
|
||||||
|
def test_decimal_int_query():
|
||||||
|
int_value = 1234
|
||||||
|
decimal_value = decimal.Decimal(str(int_value))
|
||||||
|
result = schema.execute("""{ decimal(input: %s) }""" % int_value)
|
||||||
|
assert not result.errors
|
||||||
|
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():
|
def test_decimal_string_query_variable():
|
||||||
decimal_value = decimal.Decimal("1969.1974")
|
decimal_value = decimal.Decimal("1969.1974")
|
||||||
|
|
||||||
|
@ -35,6 +55,32 @@ def test_decimal_string_query_variable():
|
||||||
assert decimal.Decimal(result.data["decimal"]) == decimal_value
|
assert decimal.Decimal(result.data["decimal"]) == decimal_value
|
||||||
|
|
||||||
|
|
||||||
|
def test_decimal_float_query_variable():
|
||||||
|
float_value = 1969.1974
|
||||||
|
decimal_value = decimal.Decimal(str(float_value))
|
||||||
|
|
||||||
|
result = schema.execute(
|
||||||
|
"""query Test($decimal: Decimal){ decimal(input: $decimal) }""",
|
||||||
|
variables={"decimal": float_value},
|
||||||
|
)
|
||||||
|
assert not result.errors
|
||||||
|
assert result.data == {"decimal": str(decimal_value)}
|
||||||
|
assert decimal.Decimal(result.data["decimal"]) == decimal_value
|
||||||
|
|
||||||
|
|
||||||
|
def test_decimal_int_query_variable():
|
||||||
|
int_value = 1234
|
||||||
|
decimal_value = decimal.Decimal(str(int_value))
|
||||||
|
|
||||||
|
result = schema.execute(
|
||||||
|
"""query Test($decimal: Decimal){ decimal(input: $decimal) }""",
|
||||||
|
variables={"decimal": int_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():
|
def test_bad_decimal_query():
|
||||||
not_a_decimal = "Nobody expects the Spanish Inquisition!"
|
not_a_decimal = "Nobody expects the Spanish Inquisition!"
|
||||||
|
|
||||||
|
@ -53,12 +99,6 @@ def test_bad_decimal_query():
|
||||||
assert result.data is None
|
assert result.data is None
|
||||||
assert result.errors[0].message == "Expected value of type 'Decimal', found true."
|
assert result.errors[0].message == "Expected value of type 'Decimal', found true."
|
||||||
|
|
||||||
result = schema.execute("{ decimal(input: 1.2) }")
|
|
||||||
assert result.errors
|
|
||||||
assert len(result.errors) == 1
|
|
||||||
assert result.data is None
|
|
||||||
assert result.errors[0].message == "Expected value of type 'Decimal', found 1.2."
|
|
||||||
|
|
||||||
|
|
||||||
def test_decimal_string_query_integer():
|
def test_decimal_string_query_integer():
|
||||||
decimal_value = 1
|
decimal_value = 1
|
||||||
|
|
Loading…
Reference in New Issue
Block a user