Skip to content

Commit 330d530

Browse files
committed
improve new leaf type coerce_input_literal() method
Rename the new scalar/enum leaf method `parse_const_literal()` to `coerce_input_literal()`, and the type alias `GraphQLScalarConstLiteralParser` to `GraphQLScalarInputLiteralCoercer` (now the public coercer type). The old `GraphQLScalarLiteralParser` alias is kept but marked deprecated. Replicates graphql/graphql-js@755d591
1 parent e739d69 commit 330d530

11 files changed

Lines changed: 72 additions & 71 deletions

File tree

src/graphql/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -360,7 +360,7 @@
360360
GraphQLScalarSerializer,
361361
GraphQLScalarValueParser,
362362
GraphQLScalarLiteralParser,
363-
GraphQLScalarConstLiteralParser,
363+
GraphQLScalarInputLiteralCoercer,
364364
GraphQLScalarValueToLiteral,
365365
GraphQLDefaultValueUsage,
366366
GraphQLIsTypeOfFn,
@@ -587,7 +587,7 @@
587587
"GraphQLOneOfDirective",
588588
"GraphQLOutputType",
589589
"GraphQLResolveInfo",
590-
"GraphQLScalarConstLiteralParser",
590+
"GraphQLScalarInputLiteralCoercer",
591591
"GraphQLScalarLiteralParser",
592592
"GraphQLScalarSerializer",
593593
"GraphQLScalarType",

src/graphql/type/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@
103103
GraphQLScalarSerializer,
104104
GraphQLScalarValueParser,
105105
GraphQLScalarLiteralParser,
106-
GraphQLScalarConstLiteralParser,
106+
GraphQLScalarInputLiteralCoercer,
107107
GraphQLScalarValueToLiteral,
108108
GraphQLDefaultValueUsage,
109109
# Keyword Args
@@ -236,7 +236,7 @@
236236
"GraphQLOneOfDirective",
237237
"GraphQLOutputType",
238238
"GraphQLResolveInfo",
239-
"GraphQLScalarConstLiteralParser",
239+
"GraphQLScalarInputLiteralCoercer",
240240
"GraphQLScalarLiteralParser",
241241
"GraphQLScalarSerializer",
242242
"GraphQLScalarType",

src/graphql/type/definition.py

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@
109109
"GraphQLObjectTypeKwargs",
110110
"GraphQLOutputType",
111111
"GraphQLResolveInfo",
112-
"GraphQLScalarConstLiteralParser",
112+
"GraphQLScalarInputLiteralCoercer",
113113
"GraphQLScalarLiteralParser",
114114
"GraphQLScalarSerializer",
115115
"GraphQLScalarType",
@@ -315,10 +315,11 @@ def resolve_thunk(thunk: Thunk[T]) -> T:
315315

316316
GraphQLScalarSerializer: TypeAlias = Callable[[Any], Any]
317317
GraphQLScalarValueParser: TypeAlias = Callable[[Any], Any]
318+
# Deprecated in favor of GraphQLScalarInputLiteralCoercer, will be removed in v3.4
318319
GraphQLScalarLiteralParser: TypeAlias = Callable[
319320
[ValueNode, dict[str, Any] | None], Any
320321
]
321-
GraphQLScalarConstLiteralParser: TypeAlias = Callable[[ConstValueNode], Any]
322+
GraphQLScalarInputLiteralCoercer: TypeAlias = Callable[[ConstValueNode], Any]
322323
GraphQLScalarValueToLiteral: TypeAlias = Callable[[Any], "ConstValueNode | None"]
323324

324325

@@ -328,7 +329,7 @@ class GraphQLScalarTypeKwargs(GraphQLNamedTypeKwargs, total=False):
328329
serialize: GraphQLScalarSerializer | None
329330
parse_value: GraphQLScalarValueParser | None
330331
parse_literal: GraphQLScalarLiteralParser | None
331-
parse_const_literal: GraphQLScalarConstLiteralParser | None
332+
coerce_input_literal: GraphQLScalarInputLiteralCoercer | None
332333
value_to_literal: GraphQLScalarValueToLiteral | None
333334
specified_by_url: str | None
334335

@@ -365,7 +366,7 @@ def serialize_odd(value: Any) -> int:
365366
ast_node: ScalarTypeDefinitionNode | None
366367
extension_ast_nodes: tuple[ScalarTypeExtensionNode, ...]
367368

368-
parse_const_literal: GraphQLScalarConstLiteralParser | None
369+
coerce_input_literal: GraphQLScalarInputLiteralCoercer | None
369370
value_to_literal: GraphQLScalarValueToLiteral | None
370371

371372
def __init__(
@@ -374,7 +375,7 @@ def __init__(
374375
serialize: GraphQLScalarSerializer | None = None,
375376
parse_value: GraphQLScalarValueParser | None = None,
376377
parse_literal: GraphQLScalarLiteralParser | None = None,
377-
parse_const_literal: GraphQLScalarConstLiteralParser | None = None,
378+
coerce_input_literal: GraphQLScalarInputLiteralCoercer | None = None,
378379
value_to_literal: GraphQLScalarValueToLiteral | None = None,
379380
description: str | None = None,
380381
specified_by_url: str | None = None,
@@ -396,17 +397,17 @@ def __init__(
396397
self.parse_value = parse_value # type: ignore
397398
if parse_literal is not None:
398399
self.parse_literal = parse_literal # type: ignore
399-
self.parse_const_literal = parse_const_literal
400+
self.coerce_input_literal = coerce_input_literal
400401
self.value_to_literal = value_to_literal
401402
if parse_literal is not None and parse_value is None:
402403
msg = (
403404
f"{name} must provide both 'parse_value' and 'parse_literal' functions."
404405
)
405406
raise TypeError(msg)
406-
if parse_const_literal is not None and parse_value is None:
407+
if coerce_input_literal is not None and parse_value is None:
407408
msg = (
408409
f"{name} must provide both 'parse_value'"
409-
" and 'parse_const_literal' functions."
410+
" and 'coerce_input_literal' functions."
410411
)
411412
raise TypeError(msg)
412413
self.specified_by_url = specified_by_url
@@ -444,7 +445,7 @@ def parse_literal(
444445
with a more specific version when creating a scalar type.
445446
446447
.. deprecated:: 3.3
447-
Use ``replace_variables()`` and ``parse_const_literal()`` instead.
448+
Use ``replace_variables()`` and ``coerce_input_literal()`` instead.
448449
``parse_literal()`` will be removed in a future version.
449450
"""
450451
return self.parse_value(value_from_ast_untyped(node, variables))
@@ -463,7 +464,7 @@ def to_kwargs(self) -> GraphQLScalarTypeKwargs:
463464
if getattr(self.parse_literal, "__func__", None)
464465
is GraphQLScalarType.parse_literal
465466
else self.parse_literal,
466-
parse_const_literal=self.parse_const_literal,
467+
coerce_input_literal=self.coerce_input_literal,
467468
value_to_literal=self.value_to_literal,
468469
specified_by_url=self.specified_by_url,
469470
)
@@ -1259,18 +1260,18 @@ def parse_literal(
12591260
"""Parse literal value.
12601261
12611262
.. deprecated:: 3.3
1262-
Use ``parse_const_literal()`` instead. ``parse_literal()`` will be
1263+
Use ``coerce_input_literal()`` instead. ``parse_literal()`` will be
12631264
removed in a future version.
12641265
"""
12651266
# Note: variables will be resolved before calling this method.
1266-
return self.parse_const_literal(
1267+
return self.coerce_input_literal(
12671268
cast("ConstValueNode", value_node), hide_suggestions
12681269
)
12691270

1270-
def parse_const_literal(
1271+
def coerce_input_literal(
12711272
self, value_node: ConstValueNode, hide_suggestions: bool = False
12721273
) -> Any:
1273-
"""Parse const literal value."""
1274+
"""Coerce a const input literal value."""
12741275
if isinstance(value_node, EnumValueNode):
12751276
try:
12761277
enum_value = self.values[value_node.value]

src/graphql/type/scalars.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ def int_value_to_literal(value: Any) -> ConstValueNode | None:
129129
" Int can represent values between -(2^31) and 2^31 - 1.",
130130
serialize=serialize_int,
131131
parse_value=coerce_int,
132-
parse_const_literal=parse_int_literal,
132+
coerce_input_literal=parse_int_literal,
133133
value_to_literal=int_value_to_literal,
134134
)
135135

@@ -186,7 +186,7 @@ def float_value_to_literal(value: Any) -> ConstValueNode | None:
186186
"(https://en.wikipedia.org/wiki/IEEE_floating_point).",
187187
serialize=serialize_float,
188188
parse_value=coerce_float,
189-
parse_const_literal=parse_float_literal,
189+
coerce_input_literal=parse_float_literal,
190190
value_to_literal=float_value_to_literal,
191191
)
192192

@@ -241,7 +241,7 @@ def string_value_to_literal(value: Any) -> ConstValueNode | None:
241241
" to represent free-form human-readable text.",
242242
serialize=serialize_string,
243243
parse_value=coerce_string,
244-
parse_const_literal=parse_string_literal,
244+
coerce_input_literal=parse_string_literal,
245245
value_to_literal=string_value_to_literal,
246246
)
247247

@@ -289,7 +289,7 @@ def boolean_value_to_literal(value: Any) -> ConstValueNode | None:
289289
description="The `Boolean` scalar type represents `true` or `false`.",
290290
serialize=serialize_boolean,
291291
parse_value=coerce_boolean,
292-
parse_const_literal=parse_boolean_literal,
292+
coerce_input_literal=parse_boolean_literal,
293293
value_to_literal=boolean_value_to_literal,
294294
)
295295

@@ -368,7 +368,7 @@ def id_value_to_literal(value: Any) -> ConstValueNode | None:
368368
" `4`) input value will be accepted as an ID.",
369369
serialize=serialize_id,
370370
parse_value=coerce_id,
371-
parse_const_literal=parse_id_literal,
371+
coerce_input_literal=parse_id_literal,
372372
value_to_literal=id_value_to_literal,
373373
)
374374

src/graphql/utilities/coerce_input_value.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -345,17 +345,17 @@ def coerce_input_literal(
345345
leaf_type = assert_leaf_type(type_)
346346
try:
347347
# Note: only enum types accept `hide_suggestions`, since scalar
348-
# `parse_const_literal`/`parse_literal` functions are user-provided
348+
# `coerce_input_literal`/`parse_literal` functions are user-provided
349349
# with a fixed signature.
350350
if is_enum_type(leaf_type):
351-
return leaf_type.parse_const_literal(
351+
return leaf_type.coerce_input_literal(
352352
replace_variables(
353353
value_node, variable_values, fragment_variable_values
354354
),
355355
hide_suggestions,
356356
)
357-
if leaf_type.parse_const_literal is not None:
358-
return leaf_type.parse_const_literal(
357+
if leaf_type.coerce_input_literal is not None:
358+
return leaf_type.coerce_input_literal(
359359
replace_variables(value_node, variable_values, fragment_variable_values)
360360
)
361361
return leaf_type.parse_literal(

src/graphql/validation/rules/values_of_correct_type.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -169,18 +169,18 @@ def is_valid_value_node(self, node: ValueNode) -> None:
169169
return
170170

171171
# Scalars and Enums determine if a literal value is valid via
172-
# `parse_const_literal()`, which may raise or return ``Undefined`` to
172+
# `coerce_input_literal()`, which may raise or return ``Undefined`` to
173173
# indicate an invalid value.
174174
# Note: only enum types accept `hide_suggestions`, since scalar
175-
# `parse_const_literal`/`parse_literal` functions are user-provided
175+
# `coerce_input_literal`/`parse_literal` functions are user-provided
176176
# with a fixed signature.
177177
try:
178178
if is_enum_type(type_):
179-
parse_result = type_.parse_const_literal(
179+
parse_result = type_.coerce_input_literal(
180180
replace_variables(node), self.context.hide_suggestions
181181
)
182-
elif type_.parse_const_literal is not None:
183-
parse_result = type_.parse_const_literal(replace_variables(node))
182+
elif type_.coerce_input_literal is not None:
183+
parse_result = type_.coerce_input_literal(replace_variables(node))
184184
else:
185185
parse_result = type_.parse_literal(node)
186186
if parse_result is Undefined:

tests/execution/test_variables.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,14 @@ def faulty_parse_value(_value: str) -> str:
3333
raise TestFaultyScalarGraphQLError
3434

3535

36-
def faulty_parse_const_literal(_ast: ValueNode) -> str:
36+
def faulty_coerce_input_literal(_ast: ValueNode) -> str:
3737
raise TestFaultyScalarGraphQLError
3838

3939

4040
TestFaultyScalar = GraphQLScalarType(
4141
name="FaultyScalar",
4242
parse_value=faulty_parse_value,
43-
parse_const_literal=faulty_parse_const_literal,
43+
coerce_input_literal=faulty_coerce_input_literal,
4444
)
4545

4646

@@ -49,7 +49,7 @@ def parse_serialized_value(value: str) -> str:
4949
return "DeserializedValue"
5050

5151

52-
def parse_const_literal_value(ast: ValueNode) -> str:
52+
def coerce_input_literal_value(ast: ValueNode) -> str:
5353
assert isinstance(ast, StringValueNode)
5454
assert ast.value == "SerializedValue"
5555
return parse_serialized_value(ast.value)
@@ -58,7 +58,7 @@ def parse_const_literal_value(ast: ValueNode) -> str:
5858
TestComplexScalar = GraphQLScalarType(
5959
name="ComplexScalar",
6060
parse_value=parse_serialized_value,
61-
parse_const_literal=parse_const_literal_value,
61+
coerce_input_literal=coerce_input_literal_value,
6262
)
6363

6464

@@ -279,7 +279,7 @@ def does_not_use_incorrect_value():
279279
],
280280
)
281281

282-
def properly_runs_parse_const_literal_on_complex_scalar_types():
282+
def properly_runs_coerce_input_literal_on_complex_scalar_types():
283283
result = execute_query(
284284
"""
285285
{

tests/type/test_custom_scalars.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ def parse_money_value(input_value: Any) -> Money:
4747
return input_value
4848

4949

50-
def parse_money_const_literal(value_node: ConstValueNode) -> Money:
50+
def coerce_money_input_literal(value_node: ConstValueNode) -> Money:
5151
money = value_from_ast_untyped(value_node)
5252
amount: Any = money.get("amount") if isinstance(money, dict) else None
5353
currency: Any = money.get("currency") if isinstance(money, dict) else None
@@ -65,7 +65,7 @@ def parse_money_const_literal(value_node: ConstValueNode) -> Money:
6565
name="Money",
6666
serialize=serialize_money,
6767
parse_value=parse_money_value,
68-
parse_const_literal=parse_money_const_literal,
68+
coerce_input_literal=coerce_money_input_literal,
6969
)
7070

7171

tests/type/test_definition.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ def defines_a_scalar_type():
107107
"serialize": None,
108108
"parse_value": None,
109109
"parse_literal": None,
110-
"parse_const_literal": None,
110+
"coerce_input_literal": None,
111111
"value_to_literal": None,
112112
"extensions": {},
113113
"ast_node": None,
@@ -124,7 +124,7 @@ def can_be_converted_to_a_configuration_object():
124124
"serialize": pass_through,
125125
"parse_value": pass_through,
126126
"parse_literal": pass_through,
127-
"parse_const_literal": pass_through,
127+
"coerce_input_literal": pass_through,
128128
"value_to_literal": pass_through,
129129
"extensions": {"some_extension": "extension"},
130130
"ast_node": ast_node,
@@ -170,24 +170,24 @@ def parse_literal(_value_node, _variables):
170170
assert kwargs["parse_value"] is parse_value
171171
assert kwargs["parse_literal"] is parse_literal
172172

173-
def accepts_a_scalar_type_defining_parse_value_and_parse_const_literal():
173+
def accepts_a_scalar_type_defining_parse_value_and_coerce_input_literal():
174174
def parse_value(_value):
175175
pass
176176

177-
def parse_const_literal(_value_node):
177+
def coerce_input_literal(_value_node):
178178
pass
179179

180180
scalar = GraphQLScalarType(
181181
"SomeScalar",
182182
parse_value=parse_value,
183-
parse_const_literal=parse_const_literal,
183+
coerce_input_literal=coerce_input_literal,
184184
)
185185
assert scalar.parse_value is parse_value
186-
assert scalar.parse_const_literal is parse_const_literal
186+
assert scalar.coerce_input_literal is coerce_input_literal
187187

188188
kwargs = scalar.to_kwargs()
189189
assert kwargs["parse_value"] is parse_value
190-
assert kwargs["parse_const_literal"] is parse_const_literal
190+
assert kwargs["coerce_input_literal"] is coerce_input_literal
191191

192192
def provides_default_methods_if_omitted():
193193
scalar = GraphQLScalarType("Foo")
@@ -199,7 +199,7 @@ def provides_default_methods_if_omitted():
199199
is GraphQLScalarType.parse_literal
200200
)
201201
# A default will be provided in v18 when parse_literal is removed.
202-
assert scalar.parse_const_literal is None
202+
assert scalar.coerce_input_literal is None
203203
assert scalar.value_to_literal is None
204204

205205
# The default serialize and parse_value methods just pass values through.
@@ -211,7 +211,7 @@ def provides_default_methods_if_omitted():
211211
assert kwargs["serialize"] is None
212212
assert kwargs["parse_value"] is None
213213
assert kwargs["parse_literal"] is None
214-
assert kwargs["parse_const_literal"] is None
214+
assert kwargs["coerce_input_literal"] is None
215215
assert kwargs["value_to_literal"] is None
216216

217217
def use_parse_value_for_parsing_literals_if_parse_literal_omitted():
@@ -268,15 +268,15 @@ def parse_literal(_node: ValueNode, _vars=None):
268268
"SomeScalar must provide both 'parse_value' and 'parse_literal' functions."
269269
)
270270

271-
def rejects_a_scalar_type_defining_parse_const_literal_but_not_parse_value():
272-
def parse_const_literal(_node: ValueNode):
271+
def rejects_a_scalar_type_defining_coerce_input_literal_but_not_parse_value():
272+
def coerce_input_literal(_node: ValueNode):
273273
return Undefined # pragma: no cover
274274

275275
with pytest.raises(TypeError) as exc_info:
276-
GraphQLScalarType("SomeScalar", parse_const_literal=parse_const_literal)
276+
GraphQLScalarType("SomeScalar", coerce_input_literal=coerce_input_literal)
277277
assert str(exc_info.value) == (
278278
"SomeScalar must provide both 'parse_value'"
279-
" and 'parse_const_literal' functions."
279+
" and 'coerce_input_literal' functions."
280280
)
281281

282282
def pickles_a_custom_scalar_type():

0 commit comments

Comments
 (0)