From 9e03fede1a2e8ee17f4c5eb773a6569649b548cd Mon Sep 17 00:00:00 2001 From: Paul Bailey Date: Thu, 27 Aug 2020 16:08:44 -0500 Subject: [PATCH] add BigInt type --- graphene/types/scalars.py | 27 +++++++++++++++++++++++++++ graphene/types/tests/test_scalar.py | 13 ++++++++++++- 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/graphene/types/scalars.py b/graphene/types/scalars.py index 245fa570..472f2d41 100644 --- a/graphene/types/scalars.py +++ b/graphene/types/scalars.py @@ -82,6 +82,33 @@ class Int(Scalar): return num +class BigInt(Scalar): + """ + The `BigInt` scalar type represents non-fractional whole numeric values. + `BigInt` is not constrained to 32-bit like the `Int` type and thus is a less + compatible type. + """ + + @staticmethod + def coerce_int(value): + try: + num = int(value) + except ValueError: + try: + num = int(float(value)) + except ValueError: + return None + return num + + serialize = coerce_int + parse_value = coerce_int + + @staticmethod + def parse_literal(ast): + if isinstance(ast, IntValueNode): + return int(ast.value) + + class Float(Scalar): """ The `Float` scalar type represents signed double-precision fractional diff --git a/graphene/types/tests/test_scalar.py b/graphene/types/tests/test_scalar.py index 559c0ce6..659cbb0a 100644 --- a/graphene/types/tests/test_scalar.py +++ b/graphene/types/tests/test_scalar.py @@ -1,4 +1,4 @@ -from ..scalars import Scalar +from ..scalars import Scalar, Int, BigInt def test_scalar(): @@ -7,3 +7,14 @@ def test_scalar(): assert JSONScalar._meta.name == "JSONScalar" assert JSONScalar._meta.description == "Documentation" + + +def test_ints(): + assert Int.parse_value(2 ** 31 - 1) is not None + assert Int.parse_value(2 ** 31) is None + + assert Int.parse_value(-2 ** 31) is not None + assert Int.parse_value(-2 ** 31 - 1) is None + + assert BigInt.parse_value(2 ** 31) is not None + assert BigInt.parse_value(-2 ** 31 - 1) is not None