graphql 1.10.2 → 1.10.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/lib/generators/graphql/core.rb +10 -2
  3. data/lib/generators/graphql/templates/schema.erb +1 -0
  4. data/lib/graphql/define/defined_object_proxy.rb +1 -1
  5. data/lib/graphql/define/instance_definable.rb +1 -1
  6. data/lib/graphql/execution/interpreter.rb +3 -0
  7. data/lib/graphql/execution/interpreter/handles_raw_value.rb +25 -0
  8. data/lib/graphql/execution/interpreter/runtime.rb +37 -121
  9. data/lib/graphql/field.rb +1 -1
  10. data/lib/graphql/language/nodes.rb +41 -83
  11. data/lib/graphql/language/parser.rb +96 -96
  12. data/lib/graphql/language/parser.y +96 -96
  13. data/lib/graphql/pagination/connections.rb +21 -5
  14. data/lib/graphql/query/null_context.rb +5 -1
  15. data/lib/graphql/query/variables.rb +9 -3
  16. data/lib/graphql/schema.rb +18 -2
  17. data/lib/graphql/schema/build_from_definition.rb +15 -1
  18. data/lib/graphql/schema/enum.rb +4 -1
  19. data/lib/graphql/schema/field.rb +11 -0
  20. data/lib/graphql/schema/field/connection_extension.rb +2 -1
  21. data/lib/graphql/schema/input_object.rb +21 -38
  22. data/lib/graphql/schema/member/base_dsl_methods.rb +11 -4
  23. data/lib/graphql/schema/member/has_arguments.rb +53 -2
  24. data/lib/graphql/schema/member/has_ast_node.rb +4 -1
  25. data/lib/graphql/schema/member/has_fields.rb +1 -1
  26. data/lib/graphql/schema/resolver.rb +2 -2
  27. data/lib/graphql/schema/resolver/has_payload_type.rb +3 -1
  28. data/lib/graphql/schema/warden.rb +10 -0
  29. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +0 -1
  30. data/lib/graphql/subscriptions.rb +14 -9
  31. data/lib/graphql/subscriptions/subscription_root.rb +2 -1
  32. data/lib/graphql/version.rb +1 -1
  33. metadata +4 -3
@@ -2,10 +2,10 @@ class GraphQL::Language::Parser
2
2
  rule
3
3
  target: document
4
4
 
5
- document: definitions_list { return make_node(:Document, definitions: val[0])}
5
+ document: definitions_list { result = make_node(:Document, definitions: val[0])}
6
6
 
7
7
  definitions_list:
8
- definition { return [val[0]]}
8
+ definition { result = [val[0]]}
9
9
  | definitions_list definition { val[0] << val[1] }
10
10
 
11
11
  definition:
@@ -19,7 +19,7 @@ rule
19
19
 
20
20
  operation_definition:
21
21
  operation_type operation_name_opt variable_definitions_opt directives_list_opt selection_set {
22
- return make_node(
22
+ result = make_node(
23
23
  :OperationDefinition, {
24
24
  operation_type: val[0],
25
25
  name: val[1],
@@ -31,7 +31,7 @@ rule
31
31
  )
32
32
  }
33
33
  | LCURLY selection_list RCURLY {
34
- return make_node(
34
+ result = make_node(
35
35
  :OperationDefinition, {
36
36
  operation_type: "query",
37
37
  selections: val[1],
@@ -40,7 +40,7 @@ rule
40
40
  )
41
41
  }
42
42
  | LCURLY RCURLY {
43
- return make_node(
43
+ result = make_node(
44
44
  :OperationDefinition, {
45
45
  operation_type: "query",
46
46
  selections: [],
@@ -55,20 +55,20 @@ rule
55
55
  | SUBSCRIPTION
56
56
 
57
57
  operation_name_opt:
58
- /* none */ { return nil }
58
+ /* none */ { result = nil }
59
59
  | name
60
60
 
61
61
  variable_definitions_opt:
62
- /* none */ { return EMPTY_ARRAY }
63
- | LPAREN variable_definitions_list RPAREN { return val[1] }
62
+ /* none */ { result = EMPTY_ARRAY }
63
+ | LPAREN variable_definitions_list RPAREN { result = val[1] }
64
64
 
65
65
  variable_definitions_list:
66
- variable_definition { return [val[0]] }
66
+ variable_definition { result = [val[0]] }
67
67
  | variable_definitions_list variable_definition { val[0] << val[1] }
68
68
 
69
69
  variable_definition:
70
70
  VAR_SIGN name COLON type default_value_opt {
71
- return make_node(:VariableDefinition, {
71
+ result = make_node(:VariableDefinition, {
72
72
  name: val[1],
73
73
  type: val[3],
74
74
  default_value: val[4],
@@ -77,26 +77,26 @@ rule
77
77
  }
78
78
 
79
79
  type:
80
- nullable_type { return val[0] }
81
- | nullable_type BANG { return make_node(:NonNullType, of_type: val[0]) }
80
+ nullable_type { result = val[0] }
81
+ | nullable_type BANG { result = make_node(:NonNullType, of_type: val[0]) }
82
82
 
83
83
  nullable_type:
84
- name { return make_node(:TypeName, name: val[0])}
85
- | LBRACKET type RBRACKET { return make_node(:ListType, of_type: val[1]) }
84
+ name { result = make_node(:TypeName, name: val[0])}
85
+ | LBRACKET type RBRACKET { result = make_node(:ListType, of_type: val[1]) }
86
86
 
87
87
  default_value_opt:
88
- /* none */ { return nil }
89
- | EQUALS literal_value { return val[1] }
88
+ /* none */ { result = nil }
89
+ | EQUALS literal_value { result = val[1] }
90
90
 
91
91
  selection_set:
92
- LCURLY selection_list RCURLY { return val[1] }
92
+ LCURLY selection_list RCURLY { result = val[1] }
93
93
 
94
94
  selection_set_opt:
95
- /* none */ { return EMPTY_ARRAY }
96
- | selection_set { return val[0] }
95
+ /* none */ { result = EMPTY_ARRAY }
96
+ | selection_set { result = val[0] }
97
97
 
98
98
  selection_list:
99
- selection { return [result] }
99
+ selection { result = [result] }
100
100
  | selection_list selection { val[0] << val[1] }
101
101
 
102
102
  selection:
@@ -106,7 +106,7 @@ rule
106
106
 
107
107
  field:
108
108
  name arguments_opt directives_list_opt selection_set_opt {
109
- return make_node(
109
+ result = make_node(
110
110
  :Field, {
111
111
  name: val[0],
112
112
  arguments: val[1],
@@ -117,7 +117,7 @@ rule
117
117
  )
118
118
  }
119
119
  | name COLON name arguments_opt directives_list_opt selection_set_opt {
120
- return make_node(
120
+ result = make_node(
121
121
  :Field, {
122
122
  alias: val[0],
123
123
  name: val[2],
@@ -160,29 +160,29 @@ rule
160
160
  | schema_keyword
161
161
 
162
162
  enum_value_definition:
163
- description_opt enum_name directives_list_opt { return make_node(:EnumValueDefinition, name: val[1], directives: val[2], description: val[0] || get_description(val[1]), definition_line: val[1].line, position_source: val[0] || val[1]) }
163
+ description_opt enum_name directives_list_opt { result = make_node(:EnumValueDefinition, name: val[1], directives: val[2], description: val[0] || get_description(val[1]), definition_line: val[1].line, position_source: val[0] || val[1]) }
164
164
 
165
165
  enum_value_definitions:
166
- enum_value_definition { return [val[0]] }
167
- | enum_value_definitions enum_value_definition { return val[0] << val[1] }
166
+ enum_value_definition { result = [val[0]] }
167
+ | enum_value_definitions enum_value_definition { result = val[0] << val[1] }
168
168
 
169
169
  arguments_opt:
170
- /* none */ { return EMPTY_ARRAY }
171
- | LPAREN arguments_list RPAREN { return val[1] }
170
+ /* none */ { result = EMPTY_ARRAY }
171
+ | LPAREN arguments_list RPAREN { result = val[1] }
172
172
 
173
173
  arguments_list:
174
- argument { return [val[0]] }
174
+ argument { result = [val[0]] }
175
175
  | arguments_list argument { val[0] << val[1] }
176
176
 
177
177
  argument:
178
- name COLON input_value { return make_node(:Argument, name: val[0], value: val[2], position_source: val[0])}
178
+ name COLON input_value { result = make_node(:Argument, name: val[0], value: val[2], position_source: val[0])}
179
179
 
180
180
  literal_value:
181
- FLOAT { return val[0].to_f }
182
- | INT { return val[0].to_i }
183
- | STRING { return val[0].to_s }
184
- | TRUE { return true }
185
- | FALSE { return false }
181
+ FLOAT { result = val[0].to_f }
182
+ | INT { result = val[0].to_i }
183
+ | STRING { result = val[0].to_s }
184
+ | TRUE { result = true }
185
+ | FALSE { result = false }
186
186
  | null_value
187
187
  | enum_value
188
188
  | list_value
@@ -193,58 +193,58 @@ rule
193
193
  | variable
194
194
  | object_value
195
195
 
196
- null_value: NULL { return make_node(:NullValue, name: val[0], position_source: val[0]) }
197
- variable: VAR_SIGN name { return make_node(:VariableIdentifier, name: val[1], position_source: val[0]) }
196
+ null_value: NULL { result = make_node(:NullValue, name: val[0], position_source: val[0]) }
197
+ variable: VAR_SIGN name { result = make_node(:VariableIdentifier, name: val[1], position_source: val[0]) }
198
198
 
199
199
  list_value:
200
- LBRACKET RBRACKET { return EMPTY_ARRAY }
201
- | LBRACKET list_value_list RBRACKET { return val[1] }
200
+ LBRACKET RBRACKET { result = EMPTY_ARRAY }
201
+ | LBRACKET list_value_list RBRACKET { result = val[1] }
202
202
 
203
203
  list_value_list:
204
- input_value { return [val[0]] }
204
+ input_value { result = [val[0]] }
205
205
  | list_value_list input_value { val[0] << val[1] }
206
206
 
207
207
  object_value:
208
- LCURLY RCURLY { return make_node(:InputObject, arguments: [], position_source: val[0])}
209
- | LCURLY object_value_list RCURLY { return make_node(:InputObject, arguments: val[1], position_source: val[0])}
208
+ LCURLY RCURLY { result = make_node(:InputObject, arguments: [], position_source: val[0])}
209
+ | LCURLY object_value_list RCURLY { result = make_node(:InputObject, arguments: val[1], position_source: val[0])}
210
210
 
211
211
  object_value_list:
212
- object_value_field { return [val[0]] }
212
+ object_value_field { result = [val[0]] }
213
213
  | object_value_list object_value_field { val[0] << val[1] }
214
214
 
215
215
  object_value_field:
216
- name COLON input_value { return make_node(:Argument, name: val[0], value: val[2], position_source: val[0])}
216
+ name COLON input_value { result = make_node(:Argument, name: val[0], value: val[2], position_source: val[0])}
217
217
 
218
218
  /* like the previous, but with literals only: */
219
219
  object_literal_value:
220
- LCURLY RCURLY { return make_node(:InputObject, arguments: [], position_source: val[0])}
221
- | LCURLY object_literal_value_list RCURLY { return make_node(:InputObject, arguments: val[1], position_source: val[0])}
220
+ LCURLY RCURLY { result = make_node(:InputObject, arguments: [], position_source: val[0])}
221
+ | LCURLY object_literal_value_list RCURLY { result = make_node(:InputObject, arguments: val[1], position_source: val[0])}
222
222
 
223
223
  object_literal_value_list:
224
- object_literal_value_field { return [val[0]] }
224
+ object_literal_value_field { result = [val[0]] }
225
225
  | object_literal_value_list object_literal_value_field { val[0] << val[1] }
226
226
 
227
227
  object_literal_value_field:
228
- name COLON literal_value { return make_node(:Argument, name: val[0], value: val[2], position_source: val[0])}
228
+ name COLON literal_value { result = make_node(:Argument, name: val[0], value: val[2], position_source: val[0])}
229
229
 
230
- enum_value: enum_name { return make_node(:Enum, name: val[0], position_source: val[0]) }
230
+ enum_value: enum_name { result = make_node(:Enum, name: val[0], position_source: val[0]) }
231
231
 
232
232
  directives_list_opt:
233
- /* none */ { return EMPTY_ARRAY }
233
+ /* none */ { result = EMPTY_ARRAY }
234
234
  | directives_list
235
235
 
236
236
  directives_list:
237
- directive { return [val[0]] }
237
+ directive { result = [val[0]] }
238
238
  | directives_list directive { val[0] << val[1] }
239
239
 
240
- directive: DIR_SIGN name arguments_opt { return make_node(:Directive, name: val[1], arguments: val[2], position_source: val[0]) }
240
+ directive: DIR_SIGN name arguments_opt { result = make_node(:Directive, name: val[1], arguments: val[2], position_source: val[0]) }
241
241
 
242
242
  fragment_spread:
243
- ELLIPSIS name_without_on directives_list_opt { return make_node(:FragmentSpread, name: val[1], directives: val[2], position_source: val[0]) }
243
+ ELLIPSIS name_without_on directives_list_opt { result = make_node(:FragmentSpread, name: val[1], directives: val[2], position_source: val[0]) }
244
244
 
245
245
  inline_fragment:
246
246
  ELLIPSIS ON type directives_list_opt selection_set {
247
- return make_node(:InlineFragment, {
247
+ result = make_node(:InlineFragment, {
248
248
  type: val[2],
249
249
  directives: val[3],
250
250
  selections: val[4],
@@ -252,7 +252,7 @@ rule
252
252
  })
253
253
  }
254
254
  | ELLIPSIS directives_list_opt selection_set {
255
- return make_node(:InlineFragment, {
255
+ result = make_node(:InlineFragment, {
256
256
  type: nil,
257
257
  directives: val[1],
258
258
  selections: val[2],
@@ -262,7 +262,7 @@ rule
262
262
 
263
263
  fragment_definition:
264
264
  FRAGMENT fragment_name_opt ON type directives_list_opt selection_set {
265
- return make_node(:FragmentDefinition, {
265
+ result = make_node(:FragmentDefinition, {
266
266
  name: val[1],
267
267
  type: val[3],
268
268
  directives: val[4],
@@ -273,7 +273,7 @@ rule
273
273
  }
274
274
 
275
275
  fragment_name_opt:
276
- /* none */ { return nil }
276
+ /* none */ { result = nil }
277
277
  | name_without_on
278
278
 
279
279
  type_system_definition:
@@ -282,14 +282,14 @@ rule
282
282
  | directive_definition
283
283
 
284
284
  schema_definition:
285
- SCHEMA directives_list_opt LCURLY operation_type_definition_list RCURLY { return make_node(:SchemaDefinition, position_source: val[0], definition_line: val[0].line, directives: val[1], **val[3]) }
285
+ SCHEMA directives_list_opt LCURLY operation_type_definition_list RCURLY { result = make_node(:SchemaDefinition, position_source: val[0], definition_line: val[0].line, directives: val[1], **val[3]) }
286
286
 
287
287
  operation_type_definition_list:
288
288
  operation_type_definition
289
- | operation_type_definition_list operation_type_definition { return val[0].merge(val[1]) }
289
+ | operation_type_definition_list operation_type_definition { result = val[0].merge(val[1]) }
290
290
 
291
291
  operation_type_definition:
292
- operation_type COLON name { return { val[0].to_s.to_sym => val[2] } }
292
+ operation_type COLON name { result = { val[0].to_s.to_sym => val[2] } }
293
293
 
294
294
  type_definition:
295
295
  scalar_type_definition
@@ -304,8 +304,8 @@ rule
304
304
  | type_extension
305
305
 
306
306
  schema_extension:
307
- EXTEND SCHEMA directives_list_opt LCURLY operation_type_definition_list RCURLY { return make_node(:SchemaExtension, position_source: val[0], directives: val[2], **val[4]) }
308
- | EXTEND SCHEMA directives_list { return make_node(:SchemaExtension, position_source: val[0], directives: val[2]) }
307
+ EXTEND SCHEMA directives_list_opt LCURLY operation_type_definition_list RCURLY { result = make_node(:SchemaExtension, position_source: val[0], directives: val[2], **val[4]) }
308
+ | EXTEND SCHEMA directives_list { result = make_node(:SchemaExtension, position_source: val[0], directives: val[2]) }
309
309
 
310
310
  type_extension:
311
311
  scalar_type_extension
@@ -315,30 +315,30 @@ rule
315
315
  | enum_type_extension
316
316
  | input_object_type_extension
317
317
 
318
- scalar_type_extension: EXTEND SCALAR name directives_list { return make_node(:ScalarTypeExtension, name: val[2], directives: val[3], position_source: val[0]) }
318
+ scalar_type_extension: EXTEND SCALAR name directives_list { result = make_node(:ScalarTypeExtension, name: val[2], directives: val[3], position_source: val[0]) }
319
319
 
320
320
  object_type_extension:
321
321
  /* TODO - This first one shouldn't be necessary but parser is getting confused */
322
- EXTEND TYPE name implements LCURLY field_definition_list RCURLY { return make_node(:ObjectTypeExtension, name: val[2], interfaces: val[3], directives: [], fields: val[5], position_source: val[0]) }
323
- | EXTEND TYPE name implements_opt directives_list_opt LCURLY field_definition_list RCURLY { return make_node(:ObjectTypeExtension, name: val[2], interfaces: val[3], directives: val[4], fields: val[6], position_source: val[0]) }
324
- | EXTEND TYPE name implements_opt directives_list { return make_node(:ObjectTypeExtension, name: val[2], interfaces: val[3], directives: val[4], fields: [], position_source: val[0]) }
325
- | EXTEND TYPE name implements { return make_node(:ObjectTypeExtension, name: val[2], interfaces: val[3], directives: [], fields: [], position_source: val[0]) }
322
+ EXTEND TYPE name implements LCURLY field_definition_list RCURLY { result = make_node(:ObjectTypeExtension, name: val[2], interfaces: val[3], directives: [], fields: val[5], position_source: val[0]) }
323
+ | EXTEND TYPE name implements_opt directives_list_opt LCURLY field_definition_list RCURLY { result = make_node(:ObjectTypeExtension, name: val[2], interfaces: val[3], directives: val[4], fields: val[6], position_source: val[0]) }
324
+ | EXTEND TYPE name implements_opt directives_list { result = make_node(:ObjectTypeExtension, name: val[2], interfaces: val[3], directives: val[4], fields: [], position_source: val[0]) }
325
+ | EXTEND TYPE name implements { result = make_node(:ObjectTypeExtension, name: val[2], interfaces: val[3], directives: [], fields: [], position_source: val[0]) }
326
326
 
327
327
  interface_type_extension:
328
- EXTEND INTERFACE name directives_list_opt LCURLY field_definition_list RCURLY { return make_node(:InterfaceTypeExtension, name: val[2], directives: val[3], fields: val[5], position_source: val[0]) }
329
- | EXTEND INTERFACE name directives_list { return make_node(:InterfaceTypeExtension, name: val[2], directives: val[3], fields: [], position_source: val[0]) }
328
+ EXTEND INTERFACE name directives_list_opt LCURLY field_definition_list RCURLY { result = make_node(:InterfaceTypeExtension, name: val[2], directives: val[3], fields: val[5], position_source: val[0]) }
329
+ | EXTEND INTERFACE name directives_list { result = make_node(:InterfaceTypeExtension, name: val[2], directives: val[3], fields: [], position_source: val[0]) }
330
330
 
331
331
  union_type_extension:
332
- EXTEND UNION name directives_list_opt EQUALS union_members { return make_node(:UnionTypeExtension, name: val[2], directives: val[3], types: val[5], position_source: val[0]) }
333
- | EXTEND UNION name directives_list { return make_node(:UnionTypeExtension, name: val[2], directives: val[3], types: [], position_source: val[0]) }
332
+ EXTEND UNION name directives_list_opt EQUALS union_members { result = make_node(:UnionTypeExtension, name: val[2], directives: val[3], types: val[5], position_source: val[0]) }
333
+ | EXTEND UNION name directives_list { result = make_node(:UnionTypeExtension, name: val[2], directives: val[3], types: [], position_source: val[0]) }
334
334
 
335
335
  enum_type_extension:
336
- EXTEND ENUM name directives_list_opt LCURLY enum_value_definitions RCURLY { return make_node(:EnumTypeExtension, name: val[2], directives: val[3], values: val[5], position_source: val[0]) }
337
- | EXTEND ENUM name directives_list { return make_node(:EnumTypeExtension, name: val[2], directives: val[3], values: [], position_source: val[0]) }
336
+ EXTEND ENUM name directives_list_opt LCURLY enum_value_definitions RCURLY { result = make_node(:EnumTypeExtension, name: val[2], directives: val[3], values: val[5], position_source: val[0]) }
337
+ | EXTEND ENUM name directives_list { result = make_node(:EnumTypeExtension, name: val[2], directives: val[3], values: [], position_source: val[0]) }
338
338
 
339
339
  input_object_type_extension:
340
- EXTEND INPUT name directives_list_opt LCURLY input_value_definition_list RCURLY { return make_node(:InputObjectTypeExtension, name: val[2], directives: val[3], fields: val[5], position_source: val[0]) }
341
- | EXTEND INPUT name directives_list { return make_node(:InputObjectTypeExtension, name: val[2], directives: val[3], fields: [], position_source: val[0]) }
340
+ EXTEND INPUT name directives_list_opt LCURLY input_value_definition_list RCURLY { result = make_node(:InputObjectTypeExtension, name: val[2], directives: val[3], fields: val[5], position_source: val[0]) }
341
+ | EXTEND INPUT name directives_list { result = make_node(:InputObjectTypeExtension, name: val[2], directives: val[3], fields: [], position_source: val[0]) }
342
342
 
343
343
  description: STRING
344
344
 
@@ -348,85 +348,85 @@ rule
348
348
 
349
349
  scalar_type_definition:
350
350
  description_opt SCALAR name directives_list_opt {
351
- return make_node(:ScalarTypeDefinition, name: val[2], directives: val[3], description: val[0] || get_description(val[1]), definition_line: val[1].line, position_source: val[0] || val[1])
351
+ result = make_node(:ScalarTypeDefinition, name: val[2], directives: val[3], description: val[0] || get_description(val[1]), definition_line: val[1].line, position_source: val[0] || val[1])
352
352
  }
353
353
 
354
354
  object_type_definition:
355
355
  description_opt TYPE name implements_opt directives_list_opt LCURLY field_definition_list RCURLY {
356
- return make_node(:ObjectTypeDefinition, name: val[2], interfaces: val[3], directives: val[4], fields: val[6], description: val[0] || get_description(val[1]), definition_line: val[1].line, position_source: val[0] || val[1])
356
+ result = make_node(:ObjectTypeDefinition, name: val[2], interfaces: val[3], directives: val[4], fields: val[6], description: val[0] || get_description(val[1]), definition_line: val[1].line, position_source: val[0] || val[1])
357
357
  }
358
358
 
359
359
  implements_opt:
360
- /* none */ { return EMPTY_ARRAY }
360
+ /* none */ { result = EMPTY_ARRAY }
361
361
  | implements
362
362
 
363
363
  implements:
364
- IMPLEMENTS AMP interfaces_list { return val[2] }
365
- | IMPLEMENTS interfaces_list { return val[1] }
366
- | IMPLEMENTS legacy_interfaces_list { return val[1] }
364
+ IMPLEMENTS AMP interfaces_list { result = val[2] }
365
+ | IMPLEMENTS interfaces_list { result = val[1] }
366
+ | IMPLEMENTS legacy_interfaces_list { result = val[1] }
367
367
 
368
368
  interfaces_list:
369
- name { return [make_node(:TypeName, name: val[0], position_source: val[0])] }
369
+ name { result = [make_node(:TypeName, name: val[0], position_source: val[0])] }
370
370
  | interfaces_list AMP name { val[0] << make_node(:TypeName, name: val[2], position_source: val[2]) }
371
371
 
372
372
  legacy_interfaces_list:
373
- name { return [make_node(:TypeName, name: val[0], position_source: val[0])] }
373
+ name { result = [make_node(:TypeName, name: val[0], position_source: val[0])] }
374
374
  | legacy_interfaces_list name { val[0] << make_node(:TypeName, name: val[1], position_source: val[1]) }
375
375
 
376
376
  input_value_definition:
377
377
  description_opt name COLON type default_value_opt directives_list_opt {
378
- return make_node(:InputValueDefinition, name: val[1], type: val[3], default_value: val[4], directives: val[5], description: val[0] || get_description(val[1]), definition_line: val[1].line, position_source: val[0] || val[1])
378
+ result = make_node(:InputValueDefinition, name: val[1], type: val[3], default_value: val[4], directives: val[5], description: val[0] || get_description(val[1]), definition_line: val[1].line, position_source: val[0] || val[1])
379
379
  }
380
380
 
381
381
  input_value_definition_list:
382
- input_value_definition { return [val[0]] }
382
+ input_value_definition { result = [val[0]] }
383
383
  | input_value_definition_list input_value_definition { val[0] << val[1] }
384
384
 
385
385
  arguments_definitions_opt:
386
- /* none */ { return EMPTY_ARRAY }
387
- | LPAREN input_value_definition_list RPAREN { return val[1] }
386
+ /* none */ { result = EMPTY_ARRAY }
387
+ | LPAREN input_value_definition_list RPAREN { result = val[1] }
388
388
 
389
389
  field_definition:
390
390
  description_opt name arguments_definitions_opt COLON type directives_list_opt {
391
- return make_node(:FieldDefinition, name: val[1], arguments: val[2], type: val[4], directives: val[5], description: val[0] || get_description(val[1]), definition_line: val[1].line, position_source: val[0] || val[1])
391
+ result = make_node(:FieldDefinition, name: val[1], arguments: val[2], type: val[4], directives: val[5], description: val[0] || get_description(val[1]), definition_line: val[1].line, position_source: val[0] || val[1])
392
392
  }
393
393
 
394
394
  field_definition_list:
395
- /* none */ { return EMPTY_ARRAY }
396
- | field_definition { return [val[0]] }
395
+ /* none */ { result = EMPTY_ARRAY }
396
+ | field_definition { result = [val[0]] }
397
397
  | field_definition_list field_definition { val[0] << val[1] }
398
398
 
399
399
  interface_type_definition:
400
400
  description_opt INTERFACE name directives_list_opt LCURLY field_definition_list RCURLY {
401
- return make_node(:InterfaceTypeDefinition, name: val[2], directives: val[3], fields: val[5], description: val[0] || get_description(val[1]), definition_line: val[1].line, position_source: val[0] || val[1])
401
+ result = make_node(:InterfaceTypeDefinition, name: val[2], directives: val[3], fields: val[5], description: val[0] || get_description(val[1]), definition_line: val[1].line, position_source: val[0] || val[1])
402
402
  }
403
403
 
404
404
  union_members:
405
- name { return [make_node(:TypeName, name: val[0], position_source: val[0])]}
405
+ name { result = [make_node(:TypeName, name: val[0], position_source: val[0])]}
406
406
  | union_members PIPE name { val[0] << make_node(:TypeName, name: val[2], position_source: val[2]) }
407
407
 
408
408
  union_type_definition:
409
409
  description_opt UNION name directives_list_opt EQUALS union_members {
410
- return make_node(:UnionTypeDefinition, name: val[2], directives: val[3], types: val[5], description: val[0] || get_description(val[1]), definition_line: val[1].line, position_source: val[0] || val[1])
410
+ result = make_node(:UnionTypeDefinition, name: val[2], directives: val[3], types: val[5], description: val[0] || get_description(val[1]), definition_line: val[1].line, position_source: val[0] || val[1])
411
411
  }
412
412
 
413
413
  enum_type_definition:
414
414
  description_opt ENUM name directives_list_opt LCURLY enum_value_definitions RCURLY {
415
- return make_node(:EnumTypeDefinition, name: val[2], directives: val[3], values: val[5], description: val[0] || get_description(val[1]), definition_line: val[1].line, position_source: val[0] || val[1])
415
+ result = make_node(:EnumTypeDefinition, name: val[2], directives: val[3], values: val[5], description: val[0] || get_description(val[1]), definition_line: val[1].line, position_source: val[0] || val[1])
416
416
  }
417
417
 
418
418
  input_object_type_definition:
419
419
  description_opt INPUT name directives_list_opt LCURLY input_value_definition_list RCURLY {
420
- return make_node(:InputObjectTypeDefinition, name: val[2], directives: val[3], fields: val[5], description: val[0] || get_description(val[1]), definition_line: val[1].line, position_source: val[0] || val[1])
420
+ result = make_node(:InputObjectTypeDefinition, name: val[2], directives: val[3], fields: val[5], description: val[0] || get_description(val[1]), definition_line: val[1].line, position_source: val[0] || val[1])
421
421
  }
422
422
 
423
423
  directive_definition:
424
424
  description_opt DIRECTIVE DIR_SIGN name arguments_definitions_opt ON directive_locations {
425
- return make_node(:DirectiveDefinition, name: val[3], arguments: val[4], locations: val[6], description: val[0] || get_description(val[1]), definition_line: val[1].line, position_source: val[0] || val[1])
425
+ result = make_node(:DirectiveDefinition, name: val[3], arguments: val[4], locations: val[6], description: val[0] || get_description(val[1]), definition_line: val[1].line, position_source: val[0] || val[1])
426
426
  }
427
427
 
428
428
  directive_locations:
429
- name { return [make_node(:DirectiveLocation, name: val[0].to_s, position_source: val[0])] }
429
+ name { result = [make_node(:DirectiveLocation, name: val[0].to_s, position_source: val[0])] }
430
430
  | directive_locations PIPE name { val[0] << make_node(:DirectiveLocation, name: val[2].to_s, position_source: val[2]) }
431
431
  end
432
432
 
@@ -30,16 +30,17 @@ module GraphQL
30
30
 
31
31
  def self.use(schema_defn)
32
32
  if schema_defn.is_a?(Class)
33
- schema_defn.connections = self.new
33
+ schema_defn.connections = self.new(schema: schema_defn)
34
34
  else
35
35
  # Unwrap a `.define` object
36
36
  schema_defn = schema_defn.target
37
- schema_defn.connections = self.new
37
+ schema_defn.connections = self.new(schema: schema_defn)
38
38
  schema_defn.class.connections = schema_defn.connections
39
39
  end
40
40
  end
41
41
 
42
- def initialize
42
+ def initialize(schema:)
43
+ @schema = schema
43
44
  @wrappers = {}
44
45
  add_default
45
46
  end
@@ -52,12 +53,23 @@ module GraphQL
52
53
  @wrappers.delete(nodes_class)
53
54
  end
54
55
 
56
+ def all_wrappers
57
+ all_wrappers = {}
58
+ @schema.ancestors.reverse_each do |schema_class|
59
+ if schema_class.respond_to?(:connections) && (c = schema_class.connections)
60
+ all_wrappers.merge!(c.wrappers)
61
+ end
62
+ end
63
+ all_wrappers
64
+ end
65
+
55
66
  # Used by the runtime to wrap values in connection wrappers.
56
67
  # @api Private
57
- def wrap(field, object, arguments, context)
68
+ def wrap(field, object, arguments, context, wrappers: all_wrappers)
58
69
  impl = nil
70
+
59
71
  object.class.ancestors.each { |cls|
60
- impl = @wrappers[cls]
72
+ impl = wrappers[cls]
61
73
  break if impl
62
74
  }
63
75
 
@@ -76,6 +88,10 @@ module GraphQL
76
88
  )
77
89
  end
78
90
 
91
+ protected
92
+
93
+ attr_reader :wrappers
94
+
79
95
  private
80
96
 
81
97
  def add_default