graphql 2.0.18 → 2.0.20
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.
Potentially problematic release.
This version of graphql might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/lib/graphql/execution/interpreter/runtime.rb +7 -11
- data/lib/graphql/language/lexer.rb +6 -6
- data/lib/graphql/language/nodes.rb +26 -8
- data/lib/graphql/language/parser.rb +31 -30
- data/lib/graphql/language/parser.y +30 -29
- data/lib/graphql/query/context.rb +32 -36
- data/lib/graphql/schema/field.rb +2 -0
- data/lib/graphql/schema/member/base_dsl_methods.rb +13 -11
- data/lib/graphql/schema/member/has_ast_node.rb +12 -0
- data/lib/graphql/schema/member/has_directives.rb +11 -4
- data/lib/graphql/schema/member/has_fields.rb +1 -0
- data/lib/graphql/schema/member/relay_shortcuts.rb +19 -0
- data/lib/graphql/schema/member/type_system_helpers.rb +1 -1
- data/lib/graphql/schema/timeout.rb +1 -1
- data/lib/graphql/schema.rb +13 -9
- data/lib/graphql/tracing/appsignal_trace.rb +7 -2
- data/lib/graphql/types/relay/base_connection.rb +1 -1
- data/lib/graphql/types/relay/connection_behaviors.rb +24 -2
- data/lib/graphql/types/relay/edge_behaviors.rb +16 -2
- data/lib/graphql/types/relay/node_behaviors.rb +7 -1
- data/lib/graphql/types/relay/page_info_behaviors.rb +7 -2
- data/lib/graphql/types/relay.rb +0 -1
- data/lib/graphql/version.rb +1 -1
- data/lib/graphql.rb +8 -4
- metadata +20 -9
- data/lib/graphql/graphql_ext.bundle +0 -0
- data/lib/graphql/language/lexer.ri +0 -744
- data/lib/graphql/types/relay/default_relay.rb +0 -27
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7b2e44f17a5ec90e92b165e06f843931585a3775096c7404966a51703a65fdb9
|
4
|
+
data.tar.gz: b79ce54109470f38f6cd50cd8ff79af7beaefbea4564ec7e876c3a58ffd0249f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 59c16753d159b0d25862dfa72e84a72037e19da288db049297d90ede697d4b4eb0456b5bd9b65b7517ef1f375a94c9d0d3cb246a34f5b6100fc347665f94f688
|
7
|
+
data.tar.gz: 96fb931b54905ee12fd04ac76847e7f20c69f66023b6241e39e69b6de862b7cb8b7ff2dc4db53725e11b0625c55c2c73fbe070a4278ce6eb839a99c2847ac306
|
@@ -599,16 +599,6 @@ module GraphQL
|
|
599
599
|
path
|
600
600
|
end
|
601
601
|
|
602
|
-
def current_depth
|
603
|
-
ti = thread_info
|
604
|
-
depth = 1
|
605
|
-
result = ti[:current_result]
|
606
|
-
while (result = result.graphql_parent)
|
607
|
-
depth += 1
|
608
|
-
end
|
609
|
-
depth
|
610
|
-
end
|
611
|
-
|
612
602
|
HALT = Object.new
|
613
603
|
def continue_value(value, parent_type, field, is_non_null, ast_node, result_name, selection_result) # rubocop:disable Metrics/ParameterLists
|
614
604
|
case value
|
@@ -925,8 +915,9 @@ module GraphQL
|
|
925
915
|
# @return [GraphQL::Execution::Lazy, Object] If loading `object` will be deferred, it's a wrapper over it.
|
926
916
|
def after_lazy(lazy_obj, owner:, field:, owner_object:, arguments:, ast_node:, result:, result_name:, eager: false, trace: true, &block)
|
927
917
|
if lazy?(lazy_obj)
|
918
|
+
orig_result = result
|
928
919
|
lazy = GraphQL::Execution::Lazy.new(field: field) do
|
929
|
-
set_all_interpreter_context(owner_object, field, arguments, result_name,
|
920
|
+
set_all_interpreter_context(owner_object, field, arguments, result_name, orig_result)
|
930
921
|
# Wrap the execution of _this_ method with tracing,
|
931
922
|
# but don't wrap the continuation below
|
932
923
|
inner_obj = begin
|
@@ -953,6 +944,11 @@ module GraphQL
|
|
953
944
|
lazy.value
|
954
945
|
else
|
955
946
|
set_result(result, result_name, lazy)
|
947
|
+
current_depth = 0
|
948
|
+
while result
|
949
|
+
current_depth += 1
|
950
|
+
result = result.graphql_parent
|
951
|
+
end
|
956
952
|
@lazies_at_depth[current_depth] << lazy
|
957
953
|
lazy
|
958
954
|
end
|
@@ -129,13 +129,13 @@ module GraphQL
|
|
129
129
|
end
|
130
130
|
|
131
131
|
def self.emit(token_name, ts, te, meta, token_value)
|
132
|
-
meta[:tokens] << token =
|
132
|
+
meta[:tokens] << token = [
|
133
133
|
token_name,
|
134
|
-
token_value,
|
135
134
|
meta[:line],
|
136
135
|
meta[:col],
|
136
|
+
token_value,
|
137
137
|
meta[:previous_token],
|
138
|
-
|
138
|
+
]
|
139
139
|
meta[:previous_token] = token
|
140
140
|
# Bump the column counter for the next token
|
141
141
|
meta[:col] += te - ts
|
@@ -168,13 +168,13 @@ module GraphQL
|
|
168
168
|
end
|
169
169
|
|
170
170
|
def self.record_comment(ts, te, meta, str)
|
171
|
-
token =
|
171
|
+
token = [
|
172
172
|
:COMMENT,
|
173
|
-
str,
|
174
173
|
meta[:line],
|
175
174
|
meta[:col],
|
175
|
+
str,
|
176
176
|
meta[:previous_token],
|
177
|
-
|
177
|
+
]
|
178
178
|
|
179
179
|
meta[:previous_token] = token
|
180
180
|
|
@@ -2,6 +2,7 @@
|
|
2
2
|
module GraphQL
|
3
3
|
module Language
|
4
4
|
module Nodes
|
5
|
+
NONE = [].freeze
|
5
6
|
# {AbstractNode} is the base class for all nodes in a GraphQL AST.
|
6
7
|
#
|
7
8
|
# It provides some APIs for working with ASTs:
|
@@ -9,6 +10,7 @@ module GraphQL
|
|
9
10
|
# - `scalars` returns all scalar (Ruby) values attached to this one. Used for comparing nodes.
|
10
11
|
# - `to_query_string` turns an AST node into a GraphQL string
|
11
12
|
class AbstractNode
|
13
|
+
|
12
14
|
module DefinitionNode
|
13
15
|
# This AST node's {#line} returns the first line, which may be the description.
|
14
16
|
# @return [Integer] The first line of the definition (not the description)
|
@@ -28,8 +30,11 @@ module GraphQL
|
|
28
30
|
def initialize(options = {})
|
29
31
|
if options.key?(:position_source)
|
30
32
|
position_source = options.delete(:position_source)
|
31
|
-
@line = position_source
|
32
|
-
@col = position_source
|
33
|
+
@line = position_source[1]
|
34
|
+
@col = position_source[2]
|
35
|
+
else
|
36
|
+
@line = options.delete(:line)
|
37
|
+
@col = options.delete(:col)
|
33
38
|
end
|
34
39
|
|
35
40
|
@filename = options.delete(:filename)
|
@@ -277,10 +282,17 @@ module GraphQL
|
|
277
282
|
assignments = scalar_method_names.map { |m| "@#{m} = #{m}"} +
|
278
283
|
@children_methods.keys.map { |m| "@#{m} = #{m}.freeze" }
|
279
284
|
|
285
|
+
keywords = scalar_method_names.map { |m| "#{m}: #{m}"} +
|
286
|
+
@children_methods.keys.map { |m| "#{m}: #{m}" }
|
287
|
+
|
280
288
|
module_eval <<-RUBY, __FILE__, __LINE__
|
281
289
|
def initialize_node #{arguments.join(", ")}
|
282
290
|
#{assignments.join("\n")}
|
283
291
|
end
|
292
|
+
|
293
|
+
def self.from_a(filename, line, col, #{(scalar_method_names + @children_methods.keys).join(", ")})
|
294
|
+
self.new(filename: filename, line: line, col: col, #{keywords.join(", ")})
|
295
|
+
end
|
284
296
|
RUBY
|
285
297
|
end
|
286
298
|
end
|
@@ -328,8 +340,8 @@ module GraphQL
|
|
328
340
|
attr_reader :description
|
329
341
|
scalar_methods :name, :repeatable
|
330
342
|
children_methods(
|
331
|
-
locations: Nodes::DirectiveLocation,
|
332
343
|
arguments: Nodes::Argument,
|
344
|
+
locations: Nodes::DirectiveLocation,
|
333
345
|
)
|
334
346
|
end
|
335
347
|
|
@@ -343,8 +355,6 @@ module GraphQL
|
|
343
355
|
|
344
356
|
# A single selection in a GraphQL query.
|
345
357
|
class Field < AbstractNode
|
346
|
-
NONE = [].freeze
|
347
|
-
|
348
358
|
scalar_methods :name, :alias
|
349
359
|
children_methods({
|
350
360
|
arguments: GraphQL::Language::Nodes::Argument,
|
@@ -364,6 +374,10 @@ module GraphQL
|
|
364
374
|
@alias = attributes[:alias]
|
365
375
|
end
|
366
376
|
|
377
|
+
def self.from_a(filename, line, col, graphql_alias, name, arguments, directives, selections) # rubocop:disable Metrics/ParameterLists
|
378
|
+
self.new(filename: filename, line: line, col: col, alias: graphql_alias, name: name, arguments: arguments, directives: directives, selections: selections)
|
379
|
+
end
|
380
|
+
|
367
381
|
# Override this because default is `:fields`
|
368
382
|
self.children_method_name = :selections
|
369
383
|
end
|
@@ -382,6 +396,10 @@ module GraphQL
|
|
382
396
|
@selections = selections
|
383
397
|
end
|
384
398
|
|
399
|
+
def self.from_a(filename, line, col, name, type, directives, selections)
|
400
|
+
self.new(filename: filename, line: line, col: col, name: name, type: type, directives: directives, selections: selections)
|
401
|
+
end
|
402
|
+
|
385
403
|
scalar_methods :name, :type
|
386
404
|
children_methods({
|
387
405
|
selections: GraphQL::Language::Nodes::Field,
|
@@ -406,8 +424,8 @@ module GraphQL
|
|
406
424
|
class InlineFragment < AbstractNode
|
407
425
|
scalar_methods :type
|
408
426
|
children_methods({
|
409
|
-
selections: GraphQL::Language::Nodes::Field,
|
410
427
|
directives: GraphQL::Language::Nodes::Directive,
|
428
|
+
selections: GraphQL::Language::Nodes::Field,
|
411
429
|
})
|
412
430
|
|
413
431
|
self.children_method_name = :selections
|
@@ -486,8 +504,8 @@ module GraphQL
|
|
486
504
|
scalar_methods :operation_type, :name
|
487
505
|
children_methods({
|
488
506
|
variables: GraphQL::Language::Nodes::VariableDefinition,
|
489
|
-
selections: GraphQL::Language::Nodes::Field,
|
490
507
|
directives: GraphQL::Language::Nodes::Directive,
|
508
|
+
selections: GraphQL::Language::Nodes::Field,
|
491
509
|
})
|
492
510
|
|
493
511
|
# @!attribute variables
|
@@ -593,8 +611,8 @@ module GraphQL
|
|
593
611
|
attr_reader :description
|
594
612
|
scalar_methods :name, :type
|
595
613
|
children_methods({
|
596
|
-
directives: GraphQL::Language::Nodes::Directive,
|
597
614
|
arguments: GraphQL::Language::Nodes::InputValueDefinition,
|
615
|
+
directives: GraphQL::Language::Nodes::Directive,
|
598
616
|
})
|
599
617
|
self.children_method_name = :fields
|
600
618
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
#
|
2
2
|
# DO NOT MODIFY!!!!
|
3
|
-
# This file is automatically generated by Racc 1.6.
|
3
|
+
# This file is automatically generated by Racc 1.6.2
|
4
4
|
# from Racc grammar file "".
|
5
5
|
#
|
6
6
|
|
@@ -28,7 +28,7 @@ def parse_document
|
|
28
28
|
@document ||= begin
|
29
29
|
# Break the string into tokens
|
30
30
|
@trace.lex(query_string: @query_string) do
|
31
|
-
@tokens ||= GraphQL.
|
31
|
+
@tokens ||= GraphQL::Language::Lexer.tokenize(@query_string)
|
32
32
|
end
|
33
33
|
# From the tokens, build an AST
|
34
34
|
@trace.parse(query_string: @query_string) do
|
@@ -66,7 +66,7 @@ def next_token
|
|
66
66
|
if lexer_token.nil?
|
67
67
|
nil
|
68
68
|
else
|
69
|
-
@reused_next_token[0] = lexer_token
|
69
|
+
@reused_next_token[0] = lexer_token[0]
|
70
70
|
@reused_next_token[1] = lexer_token
|
71
71
|
@reused_next_token
|
72
72
|
end
|
@@ -77,13 +77,13 @@ def get_description(token)
|
|
77
77
|
|
78
78
|
loop do
|
79
79
|
prev_token = token
|
80
|
-
token = token
|
80
|
+
token = token[4]
|
81
81
|
|
82
82
|
break if token.nil?
|
83
|
-
break if token
|
84
|
-
break if prev_token
|
83
|
+
break if token[0] != :COMMENT
|
84
|
+
break if prev_token[1] != token[1] + 1
|
85
85
|
|
86
|
-
comments.unshift(token.
|
86
|
+
comments.unshift(token[3].sub(/^#\s*/, ""))
|
87
87
|
end
|
88
88
|
|
89
89
|
return nil if comments.empty?
|
@@ -99,11 +99,12 @@ def on_error(parser_token_id, lexer_token, vstack)
|
|
99
99
|
if parser_token_name.nil?
|
100
100
|
raise GraphQL::ParseError.new("Parse Error on unknown token: {token_id: #{parser_token_id}, lexer_token: #{lexer_token}} from #{@query_string}", nil, nil, @query_string, filename: @filename)
|
101
101
|
else
|
102
|
-
line
|
103
|
-
|
104
|
-
|
102
|
+
line = lexer_token[1]
|
103
|
+
col = lexer_token[2]
|
104
|
+
if lexer_token[0] == :BAD_UNICODE_ESCAPE
|
105
|
+
raise GraphQL::ParseError.new("Parse error on bad Unicode escape sequence: #{lexer_token[3].inspect} (#{parser_token_name}) at [#{line}, #{col}]", line, col, @query_string, filename: @filename)
|
105
106
|
else
|
106
|
-
raise GraphQL::ParseError.new("Parse error on #{lexer_token.
|
107
|
+
raise GraphQL::ParseError.new("Parse error on #{lexer_token[3].inspect} (#{parser_token_name}) at [#{line}, #{col}]", line, col, @query_string, filename: @filename)
|
107
108
|
end
|
108
109
|
end
|
109
110
|
end
|
@@ -111,8 +112,8 @@ end
|
|
111
112
|
|
112
113
|
def make_node(node_name, assigns)
|
113
114
|
assigns.each do |key, value|
|
114
|
-
if key != :position_source && value.is_a?(
|
115
|
-
assigns[key] = value
|
115
|
+
if key != :position_source && value.is_a?(Array) && value[0].is_a?(Symbol)
|
116
|
+
assigns[key] = value[3]
|
116
117
|
end
|
117
118
|
end
|
118
119
|
|
@@ -1280,7 +1281,7 @@ module_eval(<<'.,.,', 'parser.y', 119)
|
|
1280
1281
|
|
1281
1282
|
module_eval(<<'.,.,', 'parser.y', 164)
|
1282
1283
|
def _reduce_63(val, _values, result)
|
1283
|
-
result = make_node(:EnumValueDefinition, name: val[1], directives: val[2], description: val[0] || get_description(val[1]), definition_line: val[1]
|
1284
|
+
result = make_node(:EnumValueDefinition, name: val[1], directives: val[2], description: val[0] || get_description(val[1]), definition_line: val[1][1], position_source: val[0] || val[1])
|
1284
1285
|
result
|
1285
1286
|
end
|
1286
1287
|
.,.,
|
@@ -1336,21 +1337,21 @@ module_eval(<<'.,.,', 'parser.y', 179)
|
|
1336
1337
|
|
1337
1338
|
module_eval(<<'.,.,', 'parser.y', 182)
|
1338
1339
|
def _reduce_71(val, _values, result)
|
1339
|
-
result = val[0].to_f
|
1340
|
+
result = val[0][3].to_f
|
1340
1341
|
result
|
1341
1342
|
end
|
1342
1343
|
.,.,
|
1343
1344
|
|
1344
1345
|
module_eval(<<'.,.,', 'parser.y', 183)
|
1345
1346
|
def _reduce_72(val, _values, result)
|
1346
|
-
result = val[0].to_i
|
1347
|
+
result = val[0][3].to_i
|
1347
1348
|
result
|
1348
1349
|
end
|
1349
1350
|
.,.,
|
1350
1351
|
|
1351
1352
|
module_eval(<<'.,.,', 'parser.y', 184)
|
1352
1353
|
def _reduce_73(val, _values, result)
|
1353
|
-
result = val[0]
|
1354
|
+
result = val[0][3]
|
1354
1355
|
result
|
1355
1356
|
end
|
1356
1357
|
.,.,
|
@@ -1597,7 +1598,7 @@ module_eval(<<'.,.,', 'parser.y', 277)
|
|
1597
1598
|
|
1598
1599
|
module_eval(<<'.,.,', 'parser.y', 286)
|
1599
1600
|
def _reduce_114(val, _values, result)
|
1600
|
-
result = make_node(:SchemaDefinition, position_source: val[0], definition_line: val[0]
|
1601
|
+
result = make_node(:SchemaDefinition, position_source: val[0], definition_line: val[0][1], directives: val[1], **val[3])
|
1601
1602
|
result
|
1602
1603
|
end
|
1603
1604
|
.,.,
|
@@ -1613,7 +1614,7 @@ module_eval(<<'.,.,', 'parser.y', 290)
|
|
1613
1614
|
|
1614
1615
|
module_eval(<<'.,.,', 'parser.y', 293)
|
1615
1616
|
def _reduce_117(val, _values, result)
|
1616
|
-
result = { val[0].
|
1617
|
+
result = { val[0][3].to_sym => val[2] }
|
1617
1618
|
result
|
1618
1619
|
end
|
1619
1620
|
.,.,
|
@@ -1766,7 +1767,7 @@ module_eval(<<'.,.,', 'parser.y', 343)
|
|
1766
1767
|
|
1767
1768
|
module_eval(<<'.,.,', 'parser.y', 353)
|
1768
1769
|
def _reduce_151(val, _values, result)
|
1769
|
-
result = make_node(:ScalarTypeDefinition, name: val[2], directives: val[3], description: val[0] || get_description(val[1]), definition_line: val[1]
|
1770
|
+
result = make_node(:ScalarTypeDefinition, name: val[2], directives: val[3], description: val[0] || get_description(val[1]), definition_line: val[1][1], position_source: val[0] || val[1])
|
1770
1771
|
|
1771
1772
|
result
|
1772
1773
|
end
|
@@ -1774,7 +1775,7 @@ module_eval(<<'.,.,', 'parser.y', 353)
|
|
1774
1775
|
|
1775
1776
|
module_eval(<<'.,.,', 'parser.y', 358)
|
1776
1777
|
def _reduce_152(val, _values, result)
|
1777
|
-
result = make_node(:ObjectTypeDefinition, name: val[2], interfaces: val[3], directives: val[4], fields: val[5], description: val[0] || get_description(val[1]), definition_line: val[1]
|
1778
|
+
result = make_node(:ObjectTypeDefinition, name: val[2], interfaces: val[3], directives: val[4], fields: val[5], description: val[0] || get_description(val[1]), definition_line: val[1][1], position_source: val[0] || val[1])
|
1778
1779
|
|
1779
1780
|
result
|
1780
1781
|
end
|
@@ -1840,7 +1841,7 @@ module_eval(<<'.,.,', 'parser.y', 376)
|
|
1840
1841
|
|
1841
1842
|
module_eval(<<'.,.,', 'parser.y', 380)
|
1842
1843
|
def _reduce_162(val, _values, result)
|
1843
|
-
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]
|
1844
|
+
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][1], position_source: val[0] || val[1])
|
1844
1845
|
|
1845
1846
|
result
|
1846
1847
|
end
|
@@ -1876,7 +1877,7 @@ module_eval(<<'.,.,', 'parser.y', 389)
|
|
1876
1877
|
|
1877
1878
|
module_eval(<<'.,.,', 'parser.y', 393)
|
1878
1879
|
def _reduce_167(val, _values, result)
|
1879
|
-
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]
|
1880
|
+
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][1], position_source: val[0] || val[1])
|
1880
1881
|
|
1881
1882
|
result
|
1882
1883
|
end
|
@@ -1919,7 +1920,7 @@ module_eval(<<'.,.,', 'parser.y', 403)
|
|
1919
1920
|
|
1920
1921
|
module_eval(<<'.,.,', 'parser.y', 407)
|
1921
1922
|
def _reduce_173(val, _values, result)
|
1922
|
-
result = make_node(:InterfaceTypeDefinition, name: val[2], interfaces: val[3], directives: val[4], fields: val[5], description: val[0] || get_description(val[1]), definition_line: val[1]
|
1923
|
+
result = make_node(:InterfaceTypeDefinition, name: val[2], interfaces: val[3], directives: val[4], fields: val[5], description: val[0] || get_description(val[1]), definition_line: val[1][1], position_source: val[0] || val[1])
|
1923
1924
|
|
1924
1925
|
result
|
1925
1926
|
end
|
@@ -1941,7 +1942,7 @@ module_eval(<<'.,.,', 'parser.y', 412)
|
|
1941
1942
|
|
1942
1943
|
module_eval(<<'.,.,', 'parser.y', 416)
|
1943
1944
|
def _reduce_176(val, _values, result)
|
1944
|
-
result = make_node(:UnionTypeDefinition, name: val[2], directives: val[3], types: val[5], description: val[0] || get_description(val[1]), definition_line: val[1]
|
1945
|
+
result = make_node(:UnionTypeDefinition, name: val[2], directives: val[3], types: val[5], description: val[0] || get_description(val[1]), definition_line: val[1][1], position_source: val[0] || val[1])
|
1945
1946
|
|
1946
1947
|
result
|
1947
1948
|
end
|
@@ -1949,7 +1950,7 @@ module_eval(<<'.,.,', 'parser.y', 416)
|
|
1949
1950
|
|
1950
1951
|
module_eval(<<'.,.,', 'parser.y', 421)
|
1951
1952
|
def _reduce_177(val, _values, result)
|
1952
|
-
result = make_node(:EnumTypeDefinition, name: val[2], directives: val[3], values: val[5], description: val[0] || get_description(val[1]), definition_line: val[1]
|
1953
|
+
result = make_node(:EnumTypeDefinition, name: val[2], directives: val[3], values: val[5], description: val[0] || get_description(val[1]), definition_line: val[1][1], position_source: val[0] || val[1])
|
1953
1954
|
|
1954
1955
|
result
|
1955
1956
|
end
|
@@ -1957,7 +1958,7 @@ module_eval(<<'.,.,', 'parser.y', 421)
|
|
1957
1958
|
|
1958
1959
|
module_eval(<<'.,.,', 'parser.y', 426)
|
1959
1960
|
def _reduce_178(val, _values, result)
|
1960
|
-
result = make_node(:InputObjectTypeDefinition, name: val[2], directives: val[3], fields: val[5], description: val[0] || get_description(val[1]), definition_line: val[1]
|
1961
|
+
result = make_node(:InputObjectTypeDefinition, name: val[2], directives: val[3], fields: val[5], description: val[0] || get_description(val[1]), definition_line: val[1][1], position_source: val[0] || val[1])
|
1961
1962
|
|
1962
1963
|
result
|
1963
1964
|
end
|
@@ -1965,7 +1966,7 @@ module_eval(<<'.,.,', 'parser.y', 426)
|
|
1965
1966
|
|
1966
1967
|
module_eval(<<'.,.,', 'parser.y', 431)
|
1967
1968
|
def _reduce_179(val, _values, result)
|
1968
|
-
result = make_node(:DirectiveDefinition, name: val[3], arguments: val[4], locations: val[7], repeatable: !!val[5], description: val[0] || get_description(val[1]), definition_line: val[1]
|
1969
|
+
result = make_node(:DirectiveDefinition, name: val[3], arguments: val[4], locations: val[7], repeatable: !!val[5], description: val[0] || get_description(val[1]), definition_line: val[1][1], position_source: val[0] || val[1])
|
1969
1970
|
|
1970
1971
|
result
|
1971
1972
|
end
|
@@ -1977,14 +1978,14 @@ module_eval(<<'.,.,', 'parser.y', 431)
|
|
1977
1978
|
|
1978
1979
|
module_eval(<<'.,.,', 'parser.y', 439)
|
1979
1980
|
def _reduce_182(val, _values, result)
|
1980
|
-
result = [make_node(:DirectiveLocation, name: val[0]
|
1981
|
+
result = [make_node(:DirectiveLocation, name: val[0][3], position_source: val[0])]
|
1981
1982
|
result
|
1982
1983
|
end
|
1983
1984
|
.,.,
|
1984
1985
|
|
1985
1986
|
module_eval(<<'.,.,', 'parser.y', 440)
|
1986
1987
|
def _reduce_183(val, _values, result)
|
1987
|
-
val[0] << make_node(:DirectiveLocation, name: val[2]
|
1988
|
+
val[0] << make_node(:DirectiveLocation, name: val[2][3], position_source: val[2])
|
1988
1989
|
result
|
1989
1990
|
end
|
1990
1991
|
.,.,
|
@@ -162,7 +162,7 @@ rule
|
|
162
162
|
| schema_keyword
|
163
163
|
|
164
164
|
enum_value_definition:
|
165
|
-
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]
|
165
|
+
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][1], position_source: val[0] || val[1]) }
|
166
166
|
|
167
167
|
enum_value_definitions:
|
168
168
|
enum_value_definition { result = [val[0]] }
|
@@ -180,9 +180,9 @@ rule
|
|
180
180
|
name COLON input_value { result = make_node(:Argument, name: val[0], value: val[2], position_source: val[0])}
|
181
181
|
|
182
182
|
literal_value:
|
183
|
-
FLOAT { result = val[0].to_f }
|
184
|
-
| INT { result = val[0].to_i }
|
185
|
-
| STRING { result = val[0]
|
183
|
+
FLOAT { result = val[0][3].to_f }
|
184
|
+
| INT { result = val[0][3].to_i }
|
185
|
+
| STRING { result = val[0][3] }
|
186
186
|
| TRUE { result = true }
|
187
187
|
| FALSE { result = false }
|
188
188
|
| null_value
|
@@ -284,14 +284,14 @@ rule
|
|
284
284
|
| directive_definition
|
285
285
|
|
286
286
|
schema_definition:
|
287
|
-
SCHEMA directives_list_opt LCURLY operation_type_definition_list RCURLY { result = make_node(:SchemaDefinition, position_source: val[0], definition_line: val[0]
|
287
|
+
SCHEMA directives_list_opt LCURLY operation_type_definition_list RCURLY { result = make_node(:SchemaDefinition, position_source: val[0], definition_line: val[0][1], directives: val[1], **val[3]) }
|
288
288
|
|
289
289
|
operation_type_definition_list:
|
290
290
|
operation_type_definition
|
291
291
|
| operation_type_definition_list operation_type_definition { result = val[0].merge(val[1]) }
|
292
292
|
|
293
293
|
operation_type_definition:
|
294
|
-
operation_type COLON name { result = { val[0].
|
294
|
+
operation_type COLON name { result = { val[0][3].to_sym => val[2] } }
|
295
295
|
|
296
296
|
type_definition:
|
297
297
|
scalar_type_definition
|
@@ -351,12 +351,12 @@ rule
|
|
351
351
|
|
352
352
|
scalar_type_definition:
|
353
353
|
description_opt SCALAR name directives_list_opt {
|
354
|
-
result = make_node(:ScalarTypeDefinition, name: val[2], directives: val[3], description: val[0] || get_description(val[1]), definition_line: val[1]
|
354
|
+
result = make_node(:ScalarTypeDefinition, name: val[2], directives: val[3], description: val[0] || get_description(val[1]), definition_line: val[1][1], position_source: val[0] || val[1])
|
355
355
|
}
|
356
356
|
|
357
357
|
object_type_definition:
|
358
358
|
description_opt TYPE name implements_opt directives_list_opt field_definition_list_opt {
|
359
|
-
result = make_node(:ObjectTypeDefinition, name: val[2], interfaces: val[3], directives: val[4], fields: val[5], description: val[0] || get_description(val[1]), definition_line: val[1]
|
359
|
+
result = make_node(:ObjectTypeDefinition, name: val[2], interfaces: val[3], directives: val[4], fields: val[5], description: val[0] || get_description(val[1]), definition_line: val[1][1], position_source: val[0] || val[1])
|
360
360
|
}
|
361
361
|
|
362
362
|
implements_opt:
|
@@ -378,7 +378,7 @@ rule
|
|
378
378
|
|
379
379
|
input_value_definition:
|
380
380
|
description_opt name COLON type default_value_opt directives_list_opt {
|
381
|
-
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]
|
381
|
+
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][1], position_source: val[0] || val[1])
|
382
382
|
}
|
383
383
|
|
384
384
|
input_value_definition_list:
|
@@ -391,7 +391,7 @@ rule
|
|
391
391
|
|
392
392
|
field_definition:
|
393
393
|
description_opt name arguments_definitions_opt COLON type directives_list_opt {
|
394
|
-
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]
|
394
|
+
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][1], position_source: val[0] || val[1])
|
395
395
|
}
|
396
396
|
|
397
397
|
field_definition_list_opt:
|
@@ -405,7 +405,7 @@ rule
|
|
405
405
|
|
406
406
|
interface_type_definition:
|
407
407
|
description_opt INTERFACE name implements_opt directives_list_opt field_definition_list_opt {
|
408
|
-
result = make_node(:InterfaceTypeDefinition, name: val[2], interfaces: val[3], directives: val[4], fields: val[5], description: val[0] || get_description(val[1]), definition_line: val[1]
|
408
|
+
result = make_node(:InterfaceTypeDefinition, name: val[2], interfaces: val[3], directives: val[4], fields: val[5], description: val[0] || get_description(val[1]), definition_line: val[1][1], position_source: val[0] || val[1])
|
409
409
|
}
|
410
410
|
|
411
411
|
union_members:
|
@@ -414,22 +414,22 @@ rule
|
|
414
414
|
|
415
415
|
union_type_definition:
|
416
416
|
description_opt UNION name directives_list_opt EQUALS union_members {
|
417
|
-
result = make_node(:UnionTypeDefinition, name: val[2], directives: val[3], types: val[5], description: val[0] || get_description(val[1]), definition_line: val[1]
|
417
|
+
result = make_node(:UnionTypeDefinition, name: val[2], directives: val[3], types: val[5], description: val[0] || get_description(val[1]), definition_line: val[1][1], position_source: val[0] || val[1])
|
418
418
|
}
|
419
419
|
|
420
420
|
enum_type_definition:
|
421
421
|
description_opt ENUM name directives_list_opt LCURLY enum_value_definitions RCURLY {
|
422
|
-
result = make_node(:EnumTypeDefinition, name: val[2], directives: val[3], values: val[5], description: val[0] || get_description(val[1]), definition_line: val[1]
|
422
|
+
result = make_node(:EnumTypeDefinition, name: val[2], directives: val[3], values: val[5], description: val[0] || get_description(val[1]), definition_line: val[1][1], position_source: val[0] || val[1])
|
423
423
|
}
|
424
424
|
|
425
425
|
input_object_type_definition:
|
426
426
|
description_opt INPUT name directives_list_opt LCURLY input_value_definition_list RCURLY {
|
427
|
-
result = make_node(:InputObjectTypeDefinition, name: val[2], directives: val[3], fields: val[5], description: val[0] || get_description(val[1]), definition_line: val[1]
|
427
|
+
result = make_node(:InputObjectTypeDefinition, name: val[2], directives: val[3], fields: val[5], description: val[0] || get_description(val[1]), definition_line: val[1][1], position_source: val[0] || val[1])
|
428
428
|
}
|
429
429
|
|
430
430
|
directive_definition:
|
431
431
|
description_opt DIRECTIVE DIR_SIGN name arguments_definitions_opt directive_repeatable_opt ON directive_locations {
|
432
|
-
result = make_node(:DirectiveDefinition, name: val[3], arguments: val[4], locations: val[7], repeatable: !!val[5], description: val[0] || get_description(val[1]), definition_line: val[1]
|
432
|
+
result = make_node(:DirectiveDefinition, name: val[3], arguments: val[4], locations: val[7], repeatable: !!val[5], description: val[0] || get_description(val[1]), definition_line: val[1][1], position_source: val[0] || val[1])
|
433
433
|
}
|
434
434
|
|
435
435
|
directive_repeatable_opt:
|
@@ -437,8 +437,8 @@ rule
|
|
437
437
|
| REPEATABLE
|
438
438
|
|
439
439
|
directive_locations:
|
440
|
-
name { result = [make_node(:DirectiveLocation, name: val[0]
|
441
|
-
| directive_locations PIPE name { val[0] << make_node(:DirectiveLocation, name: val[2]
|
440
|
+
name { result = [make_node(:DirectiveLocation, name: val[0][3], position_source: val[0])] }
|
441
|
+
| directive_locations PIPE name { val[0] << make_node(:DirectiveLocation, name: val[2][3], position_source: val[2]) }
|
442
442
|
end
|
443
443
|
|
444
444
|
---- header ----
|
@@ -460,7 +460,7 @@ def parse_document
|
|
460
460
|
@document ||= begin
|
461
461
|
# Break the string into tokens
|
462
462
|
@trace.lex(query_string: @query_string) do
|
463
|
-
@tokens ||= GraphQL.
|
463
|
+
@tokens ||= GraphQL::Language::Lexer.tokenize(@query_string)
|
464
464
|
end
|
465
465
|
# From the tokens, build an AST
|
466
466
|
@trace.parse(query_string: @query_string) do
|
@@ -498,7 +498,7 @@ def next_token
|
|
498
498
|
if lexer_token.nil?
|
499
499
|
nil
|
500
500
|
else
|
501
|
-
@reused_next_token[0] = lexer_token
|
501
|
+
@reused_next_token[0] = lexer_token[0]
|
502
502
|
@reused_next_token[1] = lexer_token
|
503
503
|
@reused_next_token
|
504
504
|
end
|
@@ -509,13 +509,13 @@ def get_description(token)
|
|
509
509
|
|
510
510
|
loop do
|
511
511
|
prev_token = token
|
512
|
-
token = token
|
512
|
+
token = token[4]
|
513
513
|
|
514
514
|
break if token.nil?
|
515
|
-
break if token
|
516
|
-
break if prev_token
|
515
|
+
break if token[0] != :COMMENT
|
516
|
+
break if prev_token[1] != token[1] + 1
|
517
517
|
|
518
|
-
comments.unshift(token.
|
518
|
+
comments.unshift(token[3].sub(/^#\s*/, ""))
|
519
519
|
end
|
520
520
|
|
521
521
|
return nil if comments.empty?
|
@@ -531,11 +531,12 @@ def on_error(parser_token_id, lexer_token, vstack)
|
|
531
531
|
if parser_token_name.nil?
|
532
532
|
raise GraphQL::ParseError.new("Parse Error on unknown token: {token_id: #{parser_token_id}, lexer_token: #{lexer_token}} from #{@query_string}", nil, nil, @query_string, filename: @filename)
|
533
533
|
else
|
534
|
-
line
|
535
|
-
|
536
|
-
|
534
|
+
line = lexer_token[1]
|
535
|
+
col = lexer_token[2]
|
536
|
+
if lexer_token[0] == :BAD_UNICODE_ESCAPE
|
537
|
+
raise GraphQL::ParseError.new("Parse error on bad Unicode escape sequence: #{lexer_token[3].inspect} (#{parser_token_name}) at [#{line}, #{col}]", line, col, @query_string, filename: @filename)
|
537
538
|
else
|
538
|
-
raise GraphQL::ParseError.new("Parse error on #{lexer_token.
|
539
|
+
raise GraphQL::ParseError.new("Parse error on #{lexer_token[3].inspect} (#{parser_token_name}) at [#{line}, #{col}]", line, col, @query_string, filename: @filename)
|
539
540
|
end
|
540
541
|
end
|
541
542
|
end
|
@@ -543,8 +544,8 @@ end
|
|
543
544
|
|
544
545
|
def make_node(node_name, assigns)
|
545
546
|
assigns.each do |key, value|
|
546
|
-
if key != :position_source && value.is_a?(
|
547
|
-
assigns[key] = value
|
547
|
+
if key != :position_source && value.is_a?(Array) && value[0].is_a?(Symbol)
|
548
|
+
assigns[key] = value[3]
|
548
549
|
end
|
549
550
|
end
|
550
551
|
|