graphql 1.9.17 → 1.11.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (230) hide show
  1. checksums.yaml +4 -4
  2. data/lib/generators/graphql/core.rb +18 -2
  3. data/lib/generators/graphql/install_generator.rb +27 -0
  4. data/lib/generators/graphql/object_generator.rb +52 -8
  5. data/lib/generators/graphql/templates/base_argument.erb +2 -0
  6. data/lib/generators/graphql/templates/base_enum.erb +2 -0
  7. data/lib/generators/graphql/templates/base_field.erb +2 -0
  8. data/lib/generators/graphql/templates/base_input_object.erb +2 -0
  9. data/lib/generators/graphql/templates/base_interface.erb +2 -0
  10. data/lib/generators/graphql/templates/base_mutation.erb +2 -0
  11. data/lib/generators/graphql/templates/base_object.erb +2 -0
  12. data/lib/generators/graphql/templates/base_scalar.erb +2 -0
  13. data/lib/generators/graphql/templates/base_union.erb +2 -0
  14. data/lib/generators/graphql/templates/enum.erb +2 -0
  15. data/lib/generators/graphql/templates/graphql_controller.erb +14 -10
  16. data/lib/generators/graphql/templates/interface.erb +2 -0
  17. data/lib/generators/graphql/templates/loader.erb +2 -0
  18. data/lib/generators/graphql/templates/mutation.erb +2 -0
  19. data/lib/generators/graphql/templates/mutation_type.erb +2 -0
  20. data/lib/generators/graphql/templates/object.erb +2 -0
  21. data/lib/generators/graphql/templates/query_type.erb +2 -0
  22. data/lib/generators/graphql/templates/scalar.erb +2 -0
  23. data/lib/generators/graphql/templates/schema.erb +10 -0
  24. data/lib/generators/graphql/templates/union.erb +3 -1
  25. data/lib/graphql/analysis/ast/field_usage.rb +1 -1
  26. data/lib/graphql/analysis/ast/query_complexity.rb +178 -67
  27. data/lib/graphql/analysis/ast/visitor.rb +3 -3
  28. data/lib/graphql/analysis/ast.rb +12 -11
  29. data/lib/graphql/argument.rb +10 -38
  30. data/lib/graphql/backtrace/table.rb +10 -2
  31. data/lib/graphql/backtrace/tracer.rb +2 -1
  32. data/lib/graphql/base_type.rb +4 -0
  33. data/lib/graphql/compatibility/execution_specification/specification_schema.rb +2 -2
  34. data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +5 -9
  35. data/lib/graphql/define/assign_enum_value.rb +1 -1
  36. data/lib/graphql/define/assign_global_id_field.rb +2 -2
  37. data/lib/graphql/define/assign_object_field.rb +3 -3
  38. data/lib/graphql/define/defined_object_proxy.rb +3 -0
  39. data/lib/graphql/define/instance_definable.rb +18 -108
  40. data/lib/graphql/directive/deprecated_directive.rb +1 -12
  41. data/lib/graphql/directive.rb +8 -1
  42. data/lib/graphql/enum_type.rb +5 -71
  43. data/lib/graphql/execution/directive_checks.rb +2 -2
  44. data/lib/graphql/execution/errors.rb +2 -3
  45. data/lib/graphql/execution/execute.rb +1 -1
  46. data/lib/graphql/execution/instrumentation.rb +1 -1
  47. data/lib/graphql/execution/interpreter/argument_value.rb +28 -0
  48. data/lib/graphql/execution/interpreter/arguments.rb +51 -0
  49. data/lib/graphql/execution/interpreter/arguments_cache.rb +79 -0
  50. data/lib/graphql/execution/interpreter/handles_raw_value.rb +25 -0
  51. data/lib/graphql/execution/interpreter/runtime.rb +227 -254
  52. data/lib/graphql/execution/interpreter.rb +34 -11
  53. data/lib/graphql/execution/lazy/lazy_method_map.rb +4 -0
  54. data/lib/graphql/execution/lookahead.rb +39 -114
  55. data/lib/graphql/execution/multiplex.rb +14 -5
  56. data/lib/graphql/field.rb +14 -118
  57. data/lib/graphql/filter.rb +1 -1
  58. data/lib/graphql/function.rb +1 -30
  59. data/lib/graphql/input_object_type.rb +6 -24
  60. data/lib/graphql/integer_decoding_error.rb +17 -0
  61. data/lib/graphql/interface_type.rb +7 -23
  62. data/lib/graphql/internal_representation/scope.rb +2 -2
  63. data/lib/graphql/internal_representation/visit.rb +2 -2
  64. data/lib/graphql/introspection/base_object.rb +2 -5
  65. data/lib/graphql/introspection/directive_type.rb +1 -1
  66. data/lib/graphql/introspection/entry_points.rb +7 -7
  67. data/lib/graphql/introspection/field_type.rb +7 -3
  68. data/lib/graphql/introspection/input_value_type.rb +33 -9
  69. data/lib/graphql/introspection/introspection_query.rb +6 -92
  70. data/lib/graphql/introspection/schema_type.rb +4 -9
  71. data/lib/graphql/introspection/type_type.rb +11 -7
  72. data/lib/graphql/introspection.rb +96 -0
  73. data/lib/graphql/invalid_null_error.rb +18 -0
  74. data/lib/graphql/language/block_string.rb +24 -5
  75. data/lib/graphql/language/definition_slice.rb +21 -10
  76. data/lib/graphql/language/document_from_schema_definition.rb +89 -64
  77. data/lib/graphql/language/lexer.rb +7 -3
  78. data/lib/graphql/language/lexer.rl +7 -3
  79. data/lib/graphql/language/nodes.rb +52 -91
  80. data/lib/graphql/language/parser.rb +719 -717
  81. data/lib/graphql/language/parser.y +104 -98
  82. data/lib/graphql/language/printer.rb +1 -1
  83. data/lib/graphql/language/sanitized_printer.rb +222 -0
  84. data/lib/graphql/language/visitor.rb +2 -2
  85. data/lib/graphql/language.rb +2 -1
  86. data/lib/graphql/name_validator.rb +6 -7
  87. data/lib/graphql/non_null_type.rb +0 -10
  88. data/lib/graphql/object_type.rb +45 -56
  89. data/lib/graphql/pagination/active_record_relation_connection.rb +41 -0
  90. data/lib/graphql/pagination/array_connection.rb +77 -0
  91. data/lib/graphql/pagination/connection.rb +208 -0
  92. data/lib/graphql/pagination/connections.rb +145 -0
  93. data/lib/graphql/pagination/mongoid_relation_connection.rb +25 -0
  94. data/lib/graphql/pagination/relation_connection.rb +185 -0
  95. data/lib/graphql/pagination/sequel_dataset_connection.rb +28 -0
  96. data/lib/graphql/pagination.rb +6 -0
  97. data/lib/graphql/query/arguments.rb +4 -2
  98. data/lib/graphql/query/context.rb +36 -9
  99. data/lib/graphql/query/fingerprint.rb +26 -0
  100. data/lib/graphql/query/input_validation_result.rb +23 -6
  101. data/lib/graphql/query/literal_input.rb +30 -10
  102. data/lib/graphql/query/null_context.rb +5 -1
  103. data/lib/graphql/query/validation_pipeline.rb +4 -1
  104. data/lib/graphql/query/variable_validation_error.rb +1 -1
  105. data/lib/graphql/query/variables.rb +16 -7
  106. data/lib/graphql/query.rb +64 -15
  107. data/lib/graphql/rake_task/validate.rb +3 -0
  108. data/lib/graphql/rake_task.rb +9 -9
  109. data/lib/graphql/relay/array_connection.rb +10 -12
  110. data/lib/graphql/relay/base_connection.rb +23 -13
  111. data/lib/graphql/relay/connection_type.rb +2 -1
  112. data/lib/graphql/relay/edge_type.rb +1 -0
  113. data/lib/graphql/relay/edges_instrumentation.rb +1 -1
  114. data/lib/graphql/relay/mutation.rb +1 -86
  115. data/lib/graphql/relay/node.rb +2 -2
  116. data/lib/graphql/relay/range_add.rb +14 -5
  117. data/lib/graphql/relay/relation_connection.rb +8 -10
  118. data/lib/graphql/scalar_type.rb +15 -59
  119. data/lib/graphql/schema/argument.rb +113 -11
  120. data/lib/graphql/schema/base_64_encoder.rb +2 -0
  121. data/lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb +1 -1
  122. data/lib/graphql/schema/build_from_definition/resolve_map.rb +13 -5
  123. data/lib/graphql/schema/build_from_definition.rb +212 -190
  124. data/lib/graphql/schema/built_in_types.rb +5 -5
  125. data/lib/graphql/schema/default_type_error.rb +2 -0
  126. data/lib/graphql/schema/directive/deprecated.rb +18 -0
  127. data/lib/graphql/schema/directive/include.rb +1 -1
  128. data/lib/graphql/schema/directive/skip.rb +1 -1
  129. data/lib/graphql/schema/directive.rb +34 -3
  130. data/lib/graphql/schema/enum.rb +52 -4
  131. data/lib/graphql/schema/enum_value.rb +6 -1
  132. data/lib/graphql/schema/field/connection_extension.rb +44 -20
  133. data/lib/graphql/schema/field/scope_extension.rb +1 -1
  134. data/lib/graphql/schema/field.rb +200 -129
  135. data/lib/graphql/schema/find_inherited_value.rb +13 -0
  136. data/lib/graphql/schema/finder.rb +13 -11
  137. data/lib/graphql/schema/input_object.rb +131 -22
  138. data/lib/graphql/schema/interface.rb +26 -8
  139. data/lib/graphql/schema/introspection_system.rb +108 -37
  140. data/lib/graphql/schema/late_bound_type.rb +3 -2
  141. data/lib/graphql/schema/list.rb +47 -0
  142. data/lib/graphql/schema/loader.rb +134 -96
  143. data/lib/graphql/schema/member/base_dsl_methods.rb +29 -12
  144. data/lib/graphql/schema/member/build_type.rb +19 -5
  145. data/lib/graphql/schema/member/cached_graphql_definition.rb +5 -0
  146. data/lib/graphql/schema/member/has_arguments.rb +105 -5
  147. data/lib/graphql/schema/member/has_ast_node.rb +20 -0
  148. data/lib/graphql/schema/member/has_fields.rb +20 -10
  149. data/lib/graphql/schema/member/has_unresolved_type_error.rb +15 -0
  150. data/lib/graphql/schema/member/type_system_helpers.rb +2 -2
  151. data/lib/graphql/schema/member/validates_input.rb +33 -0
  152. data/lib/graphql/schema/member.rb +6 -0
  153. data/lib/graphql/schema/mutation.rb +5 -1
  154. data/lib/graphql/schema/non_null.rb +30 -0
  155. data/lib/graphql/schema/object.rb +65 -12
  156. data/lib/graphql/schema/possible_types.rb +9 -4
  157. data/lib/graphql/schema/printer.rb +0 -15
  158. data/lib/graphql/schema/relay_classic_mutation.rb +5 -3
  159. data/lib/graphql/schema/resolver/has_payload_type.rb +5 -2
  160. data/lib/graphql/schema/resolver.rb +26 -18
  161. data/lib/graphql/schema/scalar.rb +27 -3
  162. data/lib/graphql/schema/subscription.rb +8 -18
  163. data/lib/graphql/schema/timeout.rb +29 -15
  164. data/lib/graphql/schema/traversal.rb +1 -1
  165. data/lib/graphql/schema/type_expression.rb +21 -13
  166. data/lib/graphql/schema/type_membership.rb +2 -2
  167. data/lib/graphql/schema/union.rb +37 -3
  168. data/lib/graphql/schema/unique_within_type.rb +1 -2
  169. data/lib/graphql/schema/validation.rb +10 -2
  170. data/lib/graphql/schema/warden.rb +115 -29
  171. data/lib/graphql/schema.rb +903 -195
  172. data/lib/graphql/static_validation/all_rules.rb +1 -0
  173. data/lib/graphql/static_validation/base_visitor.rb +10 -6
  174. data/lib/graphql/static_validation/literal_validator.rb +52 -27
  175. data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +43 -83
  176. data/lib/graphql/static_validation/rules/argument_literals_are_compatible_error.rb +17 -5
  177. data/lib/graphql/static_validation/rules/arguments_are_defined.rb +33 -25
  178. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +1 -1
  179. data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +4 -4
  180. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +5 -5
  181. data/lib/graphql/static_validation/rules/fields_will_merge.rb +29 -21
  182. data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +3 -3
  183. data/lib/graphql/static_validation/rules/input_object_names_are_unique.rb +30 -0
  184. data/lib/graphql/static_validation/rules/input_object_names_are_unique_error.rb +30 -0
  185. data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +2 -2
  186. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +4 -5
  187. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +12 -13
  188. data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +5 -6
  189. data/lib/graphql/static_validation/rules/variables_are_input_types.rb +1 -1
  190. data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +5 -3
  191. data/lib/graphql/static_validation/type_stack.rb +2 -2
  192. data/lib/graphql/static_validation/validation_context.rb +1 -1
  193. data/lib/graphql/static_validation/validation_timeout_error.rb +25 -0
  194. data/lib/graphql/static_validation/validator.rb +30 -8
  195. data/lib/graphql/static_validation.rb +1 -0
  196. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +89 -19
  197. data/lib/graphql/subscriptions/broadcast_analyzer.rb +84 -0
  198. data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +21 -0
  199. data/lib/graphql/subscriptions/event.rb +23 -5
  200. data/lib/graphql/subscriptions/instrumentation.rb +10 -5
  201. data/lib/graphql/subscriptions/serialize.rb +22 -4
  202. data/lib/graphql/subscriptions/subscription_root.rb +15 -5
  203. data/lib/graphql/subscriptions.rb +108 -35
  204. data/lib/graphql/tracing/active_support_notifications_tracing.rb +14 -10
  205. data/lib/graphql/tracing/appoptics_tracing.rb +171 -0
  206. data/lib/graphql/tracing/appsignal_tracing.rb +8 -0
  207. data/lib/graphql/tracing/data_dog_tracing.rb +8 -0
  208. data/lib/graphql/tracing/new_relic_tracing.rb +9 -12
  209. data/lib/graphql/tracing/platform_tracing.rb +53 -9
  210. data/lib/graphql/tracing/prometheus_tracing/graphql_collector.rb +4 -1
  211. data/lib/graphql/tracing/prometheus_tracing.rb +8 -0
  212. data/lib/graphql/tracing/scout_tracing.rb +19 -0
  213. data/lib/graphql/tracing/skylight_tracing.rb +8 -0
  214. data/lib/graphql/tracing/statsd_tracing.rb +42 -0
  215. data/lib/graphql/tracing.rb +14 -34
  216. data/lib/graphql/types/big_int.rb +1 -1
  217. data/lib/graphql/types/int.rb +9 -2
  218. data/lib/graphql/types/iso_8601_date.rb +3 -3
  219. data/lib/graphql/types/iso_8601_date_time.rb +25 -10
  220. data/lib/graphql/types/relay/base_connection.rb +11 -7
  221. data/lib/graphql/types/relay/base_edge.rb +2 -1
  222. data/lib/graphql/types/string.rb +7 -1
  223. data/lib/graphql/unauthorized_error.rb +1 -1
  224. data/lib/graphql/union_type.rb +13 -28
  225. data/lib/graphql/unresolved_type_error.rb +2 -2
  226. data/lib/graphql/version.rb +1 -1
  227. data/lib/graphql.rb +31 -6
  228. data/readme.md +1 -1
  229. metadata +34 -9
  230. data/lib/graphql/literal_validation_error.rb +0 -6
@@ -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,23 +77,26 @@ rule
77
77
  }
78
78
 
79
79
  type:
80
- name { return make_node(:TypeName, name: val[0])}
81
- | type BANG { return make_node(:NonNullType, of_type: val[0]) }
82
- | LBRACKET type RBRACKET { return make_node(:ListType, of_type: val[1]) }
80
+ nullable_type { result = val[0] }
81
+ | nullable_type BANG { result = make_node(:NonNullType, of_type: val[0]) }
82
+
83
+ nullable_type:
84
+ name { result = make_node(:TypeName, name: val[0])}
85
+ | LBRACKET type RBRACKET { result = make_node(:ListType, of_type: val[1]) }
83
86
 
84
87
  default_value_opt:
85
- /* none */ { return nil }
86
- | EQUALS literal_value { return val[1] }
88
+ /* none */ { result = nil }
89
+ | EQUALS literal_value { result = val[1] }
87
90
 
88
91
  selection_set:
89
- LCURLY selection_list RCURLY { return val[1] }
92
+ LCURLY selection_list RCURLY { result = val[1] }
90
93
 
91
94
  selection_set_opt:
92
- /* none */ { return EMPTY_ARRAY }
93
- | selection_set { return val[0] }
95
+ /* none */ { result = EMPTY_ARRAY }
96
+ | selection_set { result = val[0] }
94
97
 
95
98
  selection_list:
96
- selection { return [result] }
99
+ selection { result = [result] }
97
100
  | selection_list selection { val[0] << val[1] }
98
101
 
99
102
  selection:
@@ -103,7 +106,7 @@ rule
103
106
 
104
107
  field:
105
108
  name arguments_opt directives_list_opt selection_set_opt {
106
- return make_node(
109
+ result = make_node(
107
110
  :Field, {
108
111
  name: val[0],
109
112
  arguments: val[1],
@@ -114,7 +117,7 @@ rule
114
117
  )
115
118
  }
116
119
  | name COLON name arguments_opt directives_list_opt selection_set_opt {
117
- return make_node(
120
+ result = make_node(
118
121
  :Field, {
119
122
  alias: val[0],
120
123
  name: val[2],
@@ -157,92 +160,91 @@ rule
157
160
  | schema_keyword
158
161
 
159
162
  enum_value_definition:
160
- 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]) }
161
164
 
162
165
  enum_value_definitions:
163
- enum_value_definition { return [val[0]] }
164
- | 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] }
165
168
 
166
169
  arguments_opt:
167
- /* none */ { return EMPTY_ARRAY }
168
- | LPAREN RPAREN { return EMPTY_ARRAY }
169
- | LPAREN arguments_list RPAREN { return val[1] }
170
+ /* none */ { result = EMPTY_ARRAY }
171
+ | LPAREN arguments_list RPAREN { result = val[1] }
170
172
 
171
173
  arguments_list:
172
- argument { return [val[0]] }
174
+ argument { result = [val[0]] }
173
175
  | arguments_list argument { val[0] << val[1] }
174
176
 
175
177
  argument:
176
- 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])}
177
179
 
178
180
  literal_value:
179
- FLOAT { return val[0].to_f }
180
- | INT { return val[0].to_i }
181
- | STRING { return val[0].to_s }
182
- | TRUE { return true }
183
- | 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 }
184
186
  | null_value
185
187
  | enum_value
186
188
  | list_value
187
189
  | object_literal_value
188
190
 
189
191
  input_value:
190
- | literal_value
192
+ literal_value
191
193
  | variable
192
194
  | object_value
193
195
 
194
- null_value: NULL { return make_node(:NullValue, name: val[0], position_source: val[0]) }
195
- 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]) }
196
198
 
197
199
  list_value:
198
- LBRACKET RBRACKET { return EMPTY_ARRAY }
199
- | LBRACKET list_value_list RBRACKET { return val[1] }
200
+ LBRACKET RBRACKET { result = EMPTY_ARRAY }
201
+ | LBRACKET list_value_list RBRACKET { result = val[1] }
200
202
 
201
203
  list_value_list:
202
- input_value { return [val[0]] }
204
+ input_value { result = [val[0]] }
203
205
  | list_value_list input_value { val[0] << val[1] }
204
206
 
205
207
  object_value:
206
- LCURLY RCURLY { return make_node(:InputObject, arguments: [], position_source: val[0])}
207
- | 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])}
208
210
 
209
211
  object_value_list:
210
- object_value_field { return [val[0]] }
212
+ object_value_field { result = [val[0]] }
211
213
  | object_value_list object_value_field { val[0] << val[1] }
212
214
 
213
215
  object_value_field:
214
- 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])}
215
217
 
216
218
  /* like the previous, but with literals only: */
217
219
  object_literal_value:
218
- LCURLY RCURLY { return make_node(:InputObject, arguments: [], position_source: val[0])}
219
- | 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])}
220
222
 
221
223
  object_literal_value_list:
222
- object_literal_value_field { return [val[0]] }
224
+ object_literal_value_field { result = [val[0]] }
223
225
  | object_literal_value_list object_literal_value_field { val[0] << val[1] }
224
226
 
225
227
  object_literal_value_field:
226
- 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])}
227
229
 
228
- 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]) }
229
231
 
230
232
  directives_list_opt:
231
- /* none */ { return EMPTY_ARRAY }
233
+ /* none */ { result = EMPTY_ARRAY }
232
234
  | directives_list
233
235
 
234
236
  directives_list:
235
- directive { return [val[0]] }
237
+ directive { result = [val[0]] }
236
238
  | directives_list directive { val[0] << val[1] }
237
239
 
238
- 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]) }
239
241
 
240
242
  fragment_spread:
241
- 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]) }
242
244
 
243
245
  inline_fragment:
244
246
  ELLIPSIS ON type directives_list_opt selection_set {
245
- return make_node(:InlineFragment, {
247
+ result = make_node(:InlineFragment, {
246
248
  type: val[2],
247
249
  directives: val[3],
248
250
  selections: val[4],
@@ -250,7 +252,7 @@ rule
250
252
  })
251
253
  }
252
254
  | ELLIPSIS directives_list_opt selection_set {
253
- return make_node(:InlineFragment, {
255
+ result = make_node(:InlineFragment, {
254
256
  type: nil,
255
257
  directives: val[1],
256
258
  selections: val[2],
@@ -260,7 +262,7 @@ rule
260
262
 
261
263
  fragment_definition:
262
264
  FRAGMENT fragment_name_opt ON type directives_list_opt selection_set {
263
- return make_node(:FragmentDefinition, {
265
+ result = make_node(:FragmentDefinition, {
264
266
  name: val[1],
265
267
  type: val[3],
266
268
  directives: val[4],
@@ -271,7 +273,7 @@ rule
271
273
  }
272
274
 
273
275
  fragment_name_opt:
274
- /* none */ { return nil }
276
+ /* none */ { result = nil }
275
277
  | name_without_on
276
278
 
277
279
  type_system_definition:
@@ -280,14 +282,14 @@ rule
280
282
  | directive_definition
281
283
 
282
284
  schema_definition:
283
- 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]) }
284
286
 
285
287
  operation_type_definition_list:
286
288
  operation_type_definition
287
- | 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]) }
288
290
 
289
291
  operation_type_definition:
290
- 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] } }
291
293
 
292
294
  type_definition:
293
295
  scalar_type_definition
@@ -302,8 +304,8 @@ rule
302
304
  | type_extension
303
305
 
304
306
  schema_extension:
305
- EXTEND SCHEMA directives_list_opt LCURLY operation_type_definition_list RCURLY { return make_node(:SchemaExtension, position_source: val[0], directives: val[2], **val[4]) }
306
- | 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]) }
307
309
 
308
310
  type_extension:
309
311
  scalar_type_extension
@@ -313,30 +315,30 @@ rule
313
315
  | enum_type_extension
314
316
  | input_object_type_extension
315
317
 
316
- 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]) }
317
319
 
318
320
  object_type_extension:
319
321
  /* TODO - This first one shouldn't be necessary but parser is getting confused */
320
- 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]) }
321
- | 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]) }
322
- | 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]) }
323
- | 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]) }
324
326
 
325
327
  interface_type_extension:
326
- 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]) }
327
- | 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]) }
328
330
 
329
331
  union_type_extension:
330
- 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]) }
331
- | 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]) }
332
334
 
333
335
  enum_type_extension:
334
- 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]) }
335
- | 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]) }
336
338
 
337
339
  input_object_type_extension:
338
- 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]) }
339
- | 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]) }
340
342
 
341
343
  description: STRING
342
344
 
@@ -346,85 +348,85 @@ rule
346
348
 
347
349
  scalar_type_definition:
348
350
  description_opt SCALAR name directives_list_opt {
349
- 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])
350
352
  }
351
353
 
352
354
  object_type_definition:
353
355
  description_opt TYPE name implements_opt directives_list_opt LCURLY field_definition_list RCURLY {
354
- 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])
355
357
  }
356
358
 
357
359
  implements_opt:
358
- /* none */ { return EMPTY_ARRAY }
360
+ /* none */ { result = EMPTY_ARRAY }
359
361
  | implements
360
362
 
361
363
  implements:
362
- IMPLEMENTS AMP interfaces_list { return val[2] }
363
- | IMPLEMENTS interfaces_list { return val[1] }
364
- | 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] }
365
367
 
366
368
  interfaces_list:
367
- 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])] }
368
370
  | interfaces_list AMP name { val[0] << make_node(:TypeName, name: val[2], position_source: val[2]) }
369
371
 
370
372
  legacy_interfaces_list:
371
- 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])] }
372
374
  | legacy_interfaces_list name { val[0] << make_node(:TypeName, name: val[1], position_source: val[1]) }
373
375
 
374
376
  input_value_definition:
375
377
  description_opt name COLON type default_value_opt directives_list_opt {
376
- 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])
377
379
  }
378
380
 
379
381
  input_value_definition_list:
380
- input_value_definition { return [val[0]] }
382
+ input_value_definition { result = [val[0]] }
381
383
  | input_value_definition_list input_value_definition { val[0] << val[1] }
382
384
 
383
385
  arguments_definitions_opt:
384
- /* none */ { return EMPTY_ARRAY }
385
- | LPAREN input_value_definition_list RPAREN { return val[1] }
386
+ /* none */ { result = EMPTY_ARRAY }
387
+ | LPAREN input_value_definition_list RPAREN { result = val[1] }
386
388
 
387
389
  field_definition:
388
390
  description_opt name arguments_definitions_opt COLON type directives_list_opt {
389
- 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])
390
392
  }
391
393
 
392
394
  field_definition_list:
393
- /* none */ { return EMPTY_ARRAY }
394
- | field_definition { return [val[0]] }
395
+ /* none */ { result = EMPTY_ARRAY }
396
+ | field_definition { result = [val[0]] }
395
397
  | field_definition_list field_definition { val[0] << val[1] }
396
398
 
397
399
  interface_type_definition:
398
400
  description_opt INTERFACE name directives_list_opt LCURLY field_definition_list RCURLY {
399
- 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])
400
402
  }
401
403
 
402
404
  union_members:
403
- 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])]}
404
406
  | union_members PIPE name { val[0] << make_node(:TypeName, name: val[2], position_source: val[2]) }
405
407
 
406
408
  union_type_definition:
407
409
  description_opt UNION name directives_list_opt EQUALS union_members {
408
- 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])
409
411
  }
410
412
 
411
413
  enum_type_definition:
412
414
  description_opt ENUM name directives_list_opt LCURLY enum_value_definitions RCURLY {
413
- 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])
414
416
  }
415
417
 
416
418
  input_object_type_definition:
417
419
  description_opt INPUT name directives_list_opt LCURLY input_value_definition_list RCURLY {
418
- 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])
419
421
  }
420
422
 
421
423
  directive_definition:
422
424
  description_opt DIRECTIVE DIR_SIGN name arguments_definitions_opt ON directive_locations {
423
- 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])
424
426
  }
425
427
 
426
428
  directive_locations:
427
- 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])] }
428
430
  | directive_locations PIPE name { val[0] << make_node(:DirectiveLocation, name: val[2].to_s, position_source: val[2]) }
429
431
  end
430
432
 
@@ -452,7 +454,7 @@ def parse_document
452
454
  # From the tokens, build an AST
453
455
  @tracer.trace("parse", {query_string: @query_string}) do
454
456
  if @tokens.empty?
455
- make_node(:Document, definitions: [], filename: @filename)
457
+ raise GraphQL::ParseError.new("Unexpected end of document", nil, nil, @query_string)
456
458
  else
457
459
  do_parse
458
460
  end
@@ -464,6 +466,10 @@ def self.parse(query_string, filename: nil, tracer: GraphQL::Tracing::NullTracer
464
466
  self.new(query_string, filename: filename, tracer: tracer).parse_document
465
467
  end
466
468
 
469
+ def self.parse_file(filename, tracer: GraphQL::Tracing::NullTracer)
470
+ self.parse(File.read(filename), filename: filename, tracer: tracer)
471
+ end
472
+
467
473
  private
468
474
 
469
475
  def next_token
@@ -93,7 +93,7 @@ module GraphQL
93
93
  end
94
94
 
95
95
  def print_input_object(input_object)
96
- "{#{input_object.arguments.map { |a| "#{a.name}: #{print(a.value)}" }.join(", ")}}"
96
+ "{#{input_object.arguments.map { |a| print_argument(a) }.join(", ")}}"
97
97
  end
98
98
 
99
99
  def print_list_type(list_type)