From 0ecb066b9003b62ec02edebc4761c17a17f6c3b2 Mon Sep 17 00:00:00 2001 From: Benjamin Weise Date: Fri, 1 Apr 2022 14:17:08 +1100 Subject: [PATCH 1/4] Represent serialized floats to approximately python float precision --- src/graphql/utilities/ast_from_value.py | 2 +- tests/utilities/test_ast_from_value.py | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/graphql/utilities/ast_from_value.py b/src/graphql/utilities/ast_from_value.py index 1f072cd3..f27ce9a7 100644 --- a/src/graphql/utilities/ast_from_value.py +++ b/src/graphql/utilities/ast_from_value.py @@ -117,7 +117,7 @@ def ast_from_value(value: Any, type_: GraphQLInputType) -> Optional[ValueNode]: if isinstance(serialized, int): return IntValueNode(value=f"{serialized:d}") if isinstance(serialized, float) and isfinite(serialized): - return FloatValueNode(value=f"{serialized:g}") + return FloatValueNode(value=f"{serialized:.16g}") if isinstance(serialized, str): # Enum types use Enum literals. diff --git a/tests/utilities/test_ast_from_value.py b/tests/utilities/test_ast_from_value.py index 90788143..13d897ef 100644 --- a/tests/utilities/test_ast_from_value.py +++ b/tests/utilities/test_ast_from_value.py @@ -86,6 +86,10 @@ def converts_float_values_to_float_asts(): assert ast_from_value(1e40, GraphQLFloat) == FloatValueNode(value="1e+40") + assert ast_from_value(123456789.0123456, GraphQLFloat) == FloatValueNode( + value="123456789.0123456" + ) + def converts_string_values_to_string_asts(): assert ast_from_value("hello", GraphQLString) == StringValueNode(value="hello") From 37ae08c9510116827cbfe4005338e66f93b1b1b3 Mon Sep 17 00:00:00 2001 From: bennyweise Date: Sat, 2 Apr 2022 19:45:58 +1100 Subject: [PATCH 2/4] Use str method for float serialization --- src/graphql/utilities/ast_from_value.py | 5 ++++- tests/utilities/test_ast_from_value.py | 8 ++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/graphql/utilities/ast_from_value.py b/src/graphql/utilities/ast_from_value.py index f27ce9a7..f57da2fb 100644 --- a/src/graphql/utilities/ast_from_value.py +++ b/src/graphql/utilities/ast_from_value.py @@ -117,7 +117,10 @@ def ast_from_value(value: Any, type_: GraphQLInputType) -> Optional[ValueNode]: if isinstance(serialized, int): return IntValueNode(value=f"{serialized:d}") if isinstance(serialized, float) and isfinite(serialized): - return FloatValueNode(value=f"{serialized:.16g}") + value = str(serialized) + if value.endswith('.0'): + value = value[:-2] + return FloatValueNode(value=value) if isinstance(serialized, str): # Enum types use Enum literals. diff --git a/tests/utilities/test_ast_from_value.py b/tests/utilities/test_ast_from_value.py index 13d897ef..989d5c92 100644 --- a/tests/utilities/test_ast_from_value.py +++ b/tests/utilities/test_ast_from_value.py @@ -86,10 +86,14 @@ def converts_float_values_to_float_asts(): assert ast_from_value(1e40, GraphQLFloat) == FloatValueNode(value="1e+40") - assert ast_from_value(123456789.0123456, GraphQLFloat) == FloatValueNode( - value="123456789.0123456" + assert ast_from_value(123456789.01234567, GraphQLFloat) == FloatValueNode( + value="123456789.01234567" ) + assert ast_from_value(1.0, GraphQLFloat) == FloatValueNode(value="1") + + assert ast_from_value(1.1, GraphQLFloat) == FloatValueNode(value="1.1") + def converts_string_values_to_string_asts(): assert ast_from_value("hello", GraphQLString) == StringValueNode(value="hello") From bf2a8bc961c64ec5a0104912a8f8947b54422bfb Mon Sep 17 00:00:00 2001 From: bennyweise Date: Sat, 2 Apr 2022 20:24:27 +1100 Subject: [PATCH 3/4] Remove duplicated test --- tests/utilities/test_ast_from_value.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/utilities/test_ast_from_value.py b/tests/utilities/test_ast_from_value.py index 989d5c92..de037ca4 100644 --- a/tests/utilities/test_ast_from_value.py +++ b/tests/utilities/test_ast_from_value.py @@ -90,8 +90,6 @@ def converts_float_values_to_float_asts(): value="123456789.01234567" ) - assert ast_from_value(1.0, GraphQLFloat) == FloatValueNode(value="1") - assert ast_from_value(1.1, GraphQLFloat) == FloatValueNode(value="1.1") def converts_string_values_to_string_asts(): From fbded3de8658cc732ad0b85038d173cd1ddde646 Mon Sep 17 00:00:00 2001 From: bennyweise Date: Sat, 2 Apr 2022 20:39:54 +1100 Subject: [PATCH 4/4] Use str method for int serialization --- src/graphql/utilities/ast_from_value.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/graphql/utilities/ast_from_value.py b/src/graphql/utilities/ast_from_value.py index f57da2fb..0b3413cb 100644 --- a/src/graphql/utilities/ast_from_value.py +++ b/src/graphql/utilities/ast_from_value.py @@ -115,7 +115,7 @@ def ast_from_value(value: Any, type_: GraphQLInputType) -> Optional[ValueNode]: # Python ints and floats correspond nicely to Int and Float values. if isinstance(serialized, int): - return IntValueNode(value=f"{serialized:d}") + return IntValueNode(value=str(serialized)) if isinstance(serialized, float) and isfinite(serialized): value = str(serialized) if value.endswith('.0'):