44from six import string_types
55
66from ..error import GraphQLError
7+ from ..language import ast
78from ..language .printer import print_ast
89from ..type import (GraphQLEnumType , GraphQLInputObjectType , GraphQLList ,
910 GraphQLNonNull , GraphQLScalarType , is_input_type )
@@ -23,8 +24,43 @@ def get_variable_values(schema, definition_asts, inputs):
2324 values = {}
2425 for def_ast in definition_asts :
2526 var_name = def_ast .variable .name .value
26- value = get_variable_value (schema , def_ast , inputs .get (var_name ))
27- values [var_name ] = value
27+ var_type = type_from_ast (schema , def_ast .type )
28+ value = inputs .get (var_name )
29+
30+ if not is_input_type (var_type ):
31+ raise GraphQLError (
32+ 'Variable "${var_name}" expected value of type "{var_type}" which cannot be used as an input type.' .format (
33+ var_name = var_name ,
34+ var_type = print_ast (def_ast .type ),
35+ ),
36+ [def_ast ]
37+ )
38+ elif value is None :
39+ if def_ast .default_value is not None :
40+ values [var_name ] = value_from_ast (def_ast .default_value , var_type )
41+ if isinstance (var_type , GraphQLNonNull ):
42+ raise GraphQLError (
43+ 'Variable "${var_name}" of required type "{var_type}" was not provided.' .format (
44+ var_name = var_name , var_type = var_type
45+ ), [def_ast ]
46+ )
47+ else :
48+ errors = is_valid_value (value , var_type )
49+ if errors :
50+ message = u'\n ' + u'\n ' .join (errors )
51+ raise GraphQLError (
52+ 'Variable "${}" got invalid value {}.{}' .format (
53+ var_name ,
54+ json .dumps (value , sort_keys = True ),
55+ message
56+ ),
57+ [def_ast ]
58+ )
59+ coerced_value = coerce_value (var_type , value )
60+ if coerced_value is None :
61+ raise Exception ('Should have reported error.' )
62+
63+ values [var_name ] = coerced_value
2864
2965 return values
3066
@@ -42,72 +78,52 @@ def get_argument_values(arg_defs, arg_asts, variables=None):
4278
4379 result = {}
4480 for name , arg_def in arg_defs .items ():
81+ arg_type = arg_def .type
4582 value_ast = arg_ast_map .get (name )
46- if value_ast :
47- value_ast = value_ast .value
48-
49- value = value_from_ast (
50- value_ast ,
51- arg_def .type ,
52- variables
53- )
83+ if name not in arg_ast_map :
84+ if arg_def .default_value is not None :
85+ result [arg_def .out_name or name ] = arg_def .default_value
86+ continue
87+ elif isinstance (arg_type , GraphQLNonNull ):
88+ raise GraphQLError ('Argument "{name}" of required type {arg_type}" was not provided.' .format (
89+ name = name ,
90+ arg_type = arg_type
91+ ), arg_asts )
92+ elif isinstance (value_ast .value , ast .Variable ):
93+ variable_name = value_ast .value .name .value
94+ variable_value = variables .get (variable_name )
95+ if variables and variable_name in variables :
96+ result [arg_def .out_name or name ] = variable_value
97+ elif arg_def .default_value is not None :
98+ result [arg_def .out_name or name ] = arg_def .default_value
99+ elif isinstance (arg_type , GraphQLNonNull ):
100+ raise GraphQLError ('Argument "{name}" of required type {arg_type}" provided the variable "${variable_name}" which was not provided' .format (
101+ name = name ,
102+ arg_type = arg_type ,
103+ variable_name = variable_name
104+ ), arg_asts )
105+ continue
54106
55- if value is None :
56- value = arg_def . default_value
107+ else :
108+ value_ast = value_ast . value
57109
58- if value is not None :
59- # We use out_name as the output name for the
60- # dict if exists
61- result [arg_def .out_name or name ] = value
110+ value = value_from_ast (
111+ value_ast ,
112+ arg_type ,
113+ variables
114+ )
115+ if value is None :
116+ if arg_def .default_value is not None :
117+ value = arg_def .default_value
118+ result [arg_def .out_name or name ] = value
119+ else :
120+ # We use out_name as the output name for the
121+ # dict if exists
122+ result [arg_def .out_name or name ] = value
62123
63124 return result
64125
65126
66- def get_variable_value (schema , definition_ast , input ):
67- """Given a variable definition, and any value of input, return a value which adheres to the variable definition,
68- or throw an error."""
69- type = type_from_ast (schema , definition_ast .type )
70- variable = definition_ast .variable
71-
72- if not type or not is_input_type (type ):
73- raise GraphQLError (
74- 'Variable "${}" expected value of type "{}" which cannot be used as an input type.' .format (
75- variable .name .value ,
76- print_ast (definition_ast .type ),
77- ),
78- [definition_ast ]
79- )
80-
81- input_type = type
82- errors = is_valid_value (input , input_type )
83- if not errors :
84- if input is None :
85- default_value = definition_ast .default_value
86- if default_value :
87- return value_from_ast (default_value , input_type )
88-
89- return coerce_value (input_type , input )
90-
91- if input is None :
92- raise GraphQLError (
93- 'Variable "${}" of required type "{}" was not provided.' .format (
94- variable .name .value ,
95- print_ast (definition_ast .type )
96- ),
97- [definition_ast ]
98- )
99-
100- message = (u'\n ' + u'\n ' .join (errors )) if errors else u''
101- raise GraphQLError (
102- 'Variable "${}" got invalid value {}.{}' .format (
103- variable .name .value ,
104- json .dumps (input , sort_keys = True ),
105- message
106- ),
107- [definition_ast ]
108- )
109-
110-
111127def coerce_value (type , value ):
112128 """Given a type and any value, return a runtime value coerced to match the type."""
113129 if isinstance (type , GraphQLNonNull ):
@@ -130,16 +146,15 @@ def coerce_value(type, value):
130146 fields = type .fields
131147 obj = {}
132148 for field_name , field in fields .items ():
133- field_value = coerce_value (field .type , value .get (field_name ))
134- if field_value is None :
135- field_value = field .default_value
136-
137- if field_value is not None :
138- # We use out_name as the output name for the
139- # dict if exists
149+ if field_name not in value :
150+ if field .default_value is not None :
151+ field_value = field .default_value
152+ obj [field .out_name or field_name ] = field_value
153+ else :
154+ field_value = coerce_value (field .type , value .get (field_name ))
140155 obj [field .out_name or field_name ] = field_value
141156
142- return obj
157+ return type . create_container ( obj )
143158
144159 assert isinstance (type , (GraphQLScalarType , GraphQLEnumType )), \
145160 'Must be input type'
0 commit comments