Skip to content

Commit 0f81d95

Browse files
committed
Use proper type hints for serializers
1 parent 1711fac commit 0f81d95

File tree

4 files changed

+22
-13
lines changed

4 files changed

+22
-13
lines changed

src/graphql/type/definition.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -293,10 +293,9 @@ def resolve_thunk(thunk: Any) -> Any:
293293
return thunk() if callable(thunk) else thunk
294294

295295

296-
# Unfortunately these types cannot be specified any better in Python:
297-
GraphQLScalarSerializer = Callable
298-
GraphQLScalarValueParser = Callable
299-
GraphQLScalarLiteralParser = Callable
296+
GraphQLScalarSerializer = Callable[[Any], Any]
297+
GraphQLScalarValueParser = Callable[[Any], Any]
298+
GraphQLScalarLiteralParser = Callable[[ValueNode, Optional[Dict[str, Any]]], Any]
300299

301300

302301
class GraphQLScalarType(GraphQLNamedType):

tests/execution/test_variables.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from graphql.execution import execute
44
from graphql.execution.values import get_variable_values
5-
from graphql.language import parse, OperationDefinitionNode
5+
from graphql.language import parse, OperationDefinitionNode, StringValueNode, ValueNode
66
from graphql.pyutils import Undefined
77
from graphql.type import (
88
GraphQLArgument,
@@ -26,10 +26,15 @@ def parse_serialized_value(value: str) -> str:
2626
return "DeserializedValue"
2727

2828

29+
def parse_literal_value(ast: ValueNode, _variables=None) -> str:
30+
assert isinstance(ast, StringValueNode)
31+
return parse_serialized_value(ast.value)
32+
33+
2934
TestComplexScalar = GraphQLScalarType(
3035
name="ComplexScalar",
31-
parse_value=lambda value: parse_serialized_value(value),
32-
parse_literal=lambda ast, _variables=None: parse_serialized_value(ast.value),
36+
parse_value=parse_serialized_value,
37+
parse_literal=parse_literal_value,
3338
)
3439

3540

tests/type/test_definition.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
StringValueNode,
2323
TypeDefinitionNode,
2424
TypeExtensionNode,
25+
ValueNode,
2526
UnionTypeDefinitionNode,
2627
UnionTypeExtensionNode,
2728
)
@@ -185,10 +186,11 @@ def rejects_a_scalar_type_defining_serialize_with_incorrect_type():
185186
)
186187

187188
def rejects_a_scalar_type_defining_parse_literal_but_not_parse_value():
189+
def parse_literal(_node: ValueNode, _vars=None):
190+
return Undefined # pragma: no cover
191+
188192
with raises(TypeError) as exc_info:
189-
GraphQLScalarType(
190-
"SomeScalar", parse_literal=lambda: None # pragma: no cover
191-
)
193+
GraphQLScalarType("SomeScalar", parse_literal=parse_literal)
192194
assert str(exc_info.value) == (
193195
"SomeScalar must provide both"
194196
" 'parse_value' and 'parse_literal' as functions."

tests/utilities/test_value_from_ast.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from math import isnan, nan
22

3-
from graphql.language import parse_value
3+
from graphql.language import parse_value, ValueNode
44
from graphql.pyutils import Undefined
55
from graphql.type import (
66
GraphQLBoolean,
@@ -60,7 +60,7 @@ def pass_through_parse_literal(node, _vars=None):
6060

6161
assert _value_from('"value"', pass_through_scalar) == "value"
6262

63-
def throw_parse_literal(_node, _vars=None):
63+
def throw_parse_literal(_node: ValueNode, _vars=None):
6464
raise RuntimeError("Test")
6565

6666
throw_scalar = GraphQLScalarType(
@@ -71,9 +71,12 @@ def throw_parse_literal(_node, _vars=None):
7171

7272
assert _value_from("value", throw_scalar) is Undefined
7373

74+
def undefined_parse_literal(_node: ValueNode, _vars=None):
75+
return Undefined
76+
7477
return_undefined_scalar = GraphQLScalarType(
7578
"ReturnUndefinedScalar",
76-
parse_literal=lambda _node, _vars=None: Undefined,
79+
parse_literal=undefined_parse_literal,
7780
parse_value=lambda value: value, # pragma: no cover
7881
)
7982

0 commit comments

Comments
 (0)