graphql 2.0.21 → 2.0.32
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.
- checksums.yaml +4 -4
- data/lib/generators/graphql/mutation_delete_generator.rb +1 -1
- data/lib/generators/graphql/mutation_update_generator.rb +1 -1
- data/lib/generators/graphql/relay.rb +18 -1
- data/lib/graphql/backtrace.rb +0 -4
- data/lib/graphql/dataloader/source.rb +69 -45
- data/lib/graphql/dataloader.rb +4 -4
- data/lib/graphql/execution/interpreter/arguments_cache.rb +31 -30
- data/lib/graphql/execution/interpreter/runtime.rb +122 -101
- data/lib/graphql/execution/interpreter.rb +1 -2
- data/lib/graphql/execution/lookahead.rb +1 -1
- data/lib/graphql/filter.rb +2 -1
- data/lib/graphql/introspection/entry_points.rb +1 -1
- data/lib/graphql/language/document_from_schema_definition.rb +16 -9
- data/lib/graphql/language/lexer.rb +89 -57
- data/lib/graphql/language/nodes.rb +3 -0
- data/lib/graphql/language/parser.rb +706 -691
- data/lib/graphql/language/parser.y +1 -0
- data/lib/graphql/language/printer.rb +28 -14
- data/lib/graphql/language/visitor.rb +64 -61
- data/lib/graphql/query/context.rb +16 -7
- data/lib/graphql/query/null_context.rb +8 -18
- data/lib/graphql/query/validation_pipeline.rb +2 -1
- data/lib/graphql/query.rb +37 -12
- data/lib/graphql/schema/addition.rb +38 -12
- data/lib/graphql/schema/always_visible.rb +10 -0
- data/lib/graphql/schema/argument.rb +8 -10
- data/lib/graphql/schema/build_from_definition.rb +8 -7
- data/lib/graphql/schema/directive.rb +1 -1
- data/lib/graphql/schema/enum_value.rb +2 -2
- data/lib/graphql/schema/field/connection_extension.rb +1 -1
- data/lib/graphql/schema/field.rb +26 -15
- data/lib/graphql/schema/input_object.rb +9 -7
- data/lib/graphql/schema/interface.rb +5 -1
- data/lib/graphql/schema/introspection_system.rb +1 -1
- data/lib/graphql/schema/member/build_type.rb +10 -2
- data/lib/graphql/schema/member/has_arguments.rb +9 -7
- data/lib/graphql/schema/member/has_directives.rb +1 -1
- data/lib/graphql/schema/member/has_fields.rb +1 -1
- data/lib/graphql/schema/member/has_interfaces.rb +1 -1
- data/lib/graphql/schema/member/type_system_helpers.rb +1 -1
- data/lib/graphql/schema/object.rb +6 -1
- data/lib/graphql/schema/printer.rb +3 -1
- data/lib/graphql/schema/relay_classic_mutation.rb +1 -1
- data/lib/graphql/schema/resolver.rb +12 -10
- data/lib/graphql/schema/timeout.rb +1 -1
- data/lib/graphql/schema/validator.rb +1 -1
- data/lib/graphql/schema/warden.rb +37 -4
- data/lib/graphql/schema.rb +92 -23
- data/lib/graphql/tracing/appoptics_trace.rb +35 -11
- data/lib/graphql/tracing/appsignal_trace.rb +4 -0
- data/lib/graphql/tracing/data_dog_trace.rb +89 -50
- data/lib/graphql/tracing/data_dog_tracing.rb +7 -21
- data/lib/graphql/tracing/legacy_trace.rb +5 -1
- data/lib/graphql/tracing/notifications_trace.rb +7 -0
- data/lib/graphql/tracing/platform_trace.rb +26 -12
- data/lib/graphql/tracing/prometheus_trace.rb +4 -0
- data/lib/graphql/tracing/scout_trace.rb +3 -0
- data/lib/graphql/tracing/statsd_trace.rb +4 -0
- data/lib/graphql/tracing.rb +1 -0
- data/lib/graphql/types/relay/connection_behaviors.rb +1 -1
- data/lib/graphql/types/relay/edge_behaviors.rb +1 -1
- data/lib/graphql/version.rb +1 -1
- data/readme.md +1 -1
- metadata +36 -24
@@ -4,7 +4,7 @@ require "strscan"
|
|
4
4
|
|
5
5
|
module GraphQL
|
6
6
|
module Language
|
7
|
-
|
7
|
+
class Lexer
|
8
8
|
IDENTIFIER = /[_A-Za-z][_0-9A-Za-z]*/
|
9
9
|
NEWLINE = /[\c\r\n]/
|
10
10
|
BLANK = /[, \t]+/
|
@@ -87,58 +87,81 @@ module GraphQL
|
|
87
87
|
# # catch-all for anything else. must be at the bottom for precedence.
|
88
88
|
UNKNOWN_CHAR = /./
|
89
89
|
|
90
|
-
def
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
90
|
+
def initialize(value)
|
91
|
+
@line = 1
|
92
|
+
@col = 1
|
93
|
+
@previous_token = nil
|
94
|
+
|
95
|
+
@scan = scanner value
|
96
|
+
end
|
97
|
+
|
98
|
+
class BadEncoding < Lexer # :nodoc:
|
99
|
+
def scanner(value)
|
100
|
+
[emit(:BAD_UNICODE_ESCAPE, 0, 0, value)]
|
101
101
|
end
|
102
102
|
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
when str = scan.scan(UNKNOWN_CHAR) then emit(:UNKNOWN_CHAR, pos, scan.pos, meta, str)
|
122
|
-
else
|
123
|
-
# This should never happen since `UNKNOWN_CHAR` ensures we make progress
|
124
|
-
raise "Unknown string?"
|
125
|
-
end
|
103
|
+
def next_token
|
104
|
+
@scan.pop
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def self.tokenize(string)
|
109
|
+
value = string.dup.force_encoding(Encoding::UTF_8)
|
110
|
+
|
111
|
+
scanner = if value.valid_encoding?
|
112
|
+
new value
|
113
|
+
else
|
114
|
+
BadEncoding.new value
|
115
|
+
end
|
116
|
+
|
117
|
+
toks = []
|
118
|
+
|
119
|
+
while tok = scanner.next_token
|
120
|
+
toks << tok
|
126
121
|
end
|
127
122
|
|
128
|
-
|
123
|
+
toks
|
124
|
+
end
|
125
|
+
|
126
|
+
def next_token
|
127
|
+
return if @scan.eos?
|
128
|
+
|
129
|
+
pos = @scan.pos
|
130
|
+
|
131
|
+
case
|
132
|
+
when str = @scan.scan(FLOAT) then emit(:FLOAT, pos, @scan.pos, str)
|
133
|
+
when str = @scan.scan(INT) then emit(:INT, pos, @scan.pos, str)
|
134
|
+
when str = @scan.scan(LIT) then emit(LIT_NAME_LUT[str], pos, @scan.pos, -str)
|
135
|
+
when str = @scan.scan(IDENTIFIER) then emit(:IDENTIFIER, pos, @scan.pos, str)
|
136
|
+
when str = @scan.scan(BLOCK_STRING) then emit_block(pos, @scan.pos, str.gsub(/\A#{BLOCK_QUOTE}|#{BLOCK_QUOTE}\z/, ''))
|
137
|
+
when str = @scan.scan(QUOTED_STRING) then emit_string(pos, @scan.pos, str.gsub(/^"|"$/, ''))
|
138
|
+
when str = @scan.scan(COMMENT) then record_comment(pos, @scan.pos, str)
|
139
|
+
when str = @scan.scan(NEWLINE)
|
140
|
+
@line += 1
|
141
|
+
@col = 1
|
142
|
+
next_token
|
143
|
+
when @scan.scan(BLANK)
|
144
|
+
@col += @scan.pos - pos
|
145
|
+
next_token
|
146
|
+
when str = @scan.scan(UNKNOWN_CHAR) then emit(:UNKNOWN_CHAR, pos, @scan.pos, str)
|
147
|
+
else
|
148
|
+
# This should never happen since `UNKNOWN_CHAR` ensures we make progress
|
149
|
+
raise "Unknown string?"
|
150
|
+
end
|
129
151
|
end
|
130
152
|
|
131
|
-
def
|
132
|
-
|
153
|
+
def emit(token_name, ts, te, token_value)
|
154
|
+
token = [
|
133
155
|
token_name,
|
134
|
-
|
135
|
-
|
156
|
+
@line,
|
157
|
+
@col,
|
136
158
|
token_value,
|
137
|
-
|
159
|
+
@previous_token,
|
138
160
|
]
|
139
|
-
|
161
|
+
@previous_token = token
|
140
162
|
# Bump the column counter for the next token
|
141
|
-
|
163
|
+
@col += te - ts
|
164
|
+
token
|
142
165
|
end
|
143
166
|
|
144
167
|
# Replace any escaped unicode or whitespace with the _actual_ characters
|
@@ -167,18 +190,19 @@ module GraphQL
|
|
167
190
|
nil
|
168
191
|
end
|
169
192
|
|
170
|
-
def
|
193
|
+
def record_comment(ts, te, str)
|
171
194
|
token = [
|
172
195
|
:COMMENT,
|
173
|
-
|
174
|
-
|
196
|
+
@line,
|
197
|
+
@col,
|
175
198
|
str,
|
176
|
-
|
199
|
+
@previous_token,
|
177
200
|
]
|
178
201
|
|
179
|
-
|
202
|
+
@previous_token = token
|
180
203
|
|
181
|
-
|
204
|
+
@col += te - ts
|
205
|
+
next_token
|
182
206
|
end
|
183
207
|
|
184
208
|
ESCAPES = /\\["\\\/bfnrt]/
|
@@ -195,26 +219,34 @@ module GraphQL
|
|
195
219
|
UTF_8 = /\\u(?:([\dAa-f]{4})|\{([\da-f]{4,})\})(?:\\u([\dAa-f]{4}))?/i
|
196
220
|
VALID_STRING = /\A(?:[^\\]|#{ESCAPES}|#{UTF_8})*\z/o
|
197
221
|
|
198
|
-
def
|
222
|
+
def emit_block(ts, te, value)
|
199
223
|
line_incr = value.count("\n")
|
200
224
|
value = GraphQL::Language::BlockString.trim_whitespace(value)
|
201
|
-
emit_string(ts, te,
|
202
|
-
|
225
|
+
tok = emit_string(ts, te, value)
|
226
|
+
@line += line_incr
|
227
|
+
tok
|
203
228
|
end
|
204
229
|
|
205
|
-
def
|
230
|
+
def emit_string(ts, te, value)
|
206
231
|
if !value.valid_encoding? || !value.match?(VALID_STRING)
|
207
|
-
emit(:BAD_UNICODE_ESCAPE, ts, te,
|
232
|
+
emit(:BAD_UNICODE_ESCAPE, ts, te, value)
|
208
233
|
else
|
209
|
-
replace_escaped_characters_in_place(value)
|
234
|
+
self.class.replace_escaped_characters_in_place(value)
|
210
235
|
|
211
236
|
if !value.valid_encoding?
|
212
|
-
emit(:BAD_UNICODE_ESCAPE, ts, te,
|
237
|
+
emit(:BAD_UNICODE_ESCAPE, ts, te, value)
|
213
238
|
else
|
214
|
-
emit(:STRING, ts, te,
|
239
|
+
emit(:STRING, ts, te, value)
|
215
240
|
end
|
216
241
|
end
|
217
242
|
end
|
243
|
+
|
244
|
+
private
|
245
|
+
|
246
|
+
def scanner(value)
|
247
|
+
StringScanner.new value
|
248
|
+
end
|
249
|
+
|
218
250
|
end
|
219
251
|
end
|
220
252
|
end
|
@@ -138,6 +138,8 @@ module GraphQL
|
|
138
138
|
end
|
139
139
|
|
140
140
|
class << self
|
141
|
+
# rubocop:disable Development/NoEvalCop This eval takes static inputs at load-time
|
142
|
+
|
141
143
|
# Add a default `#visit_method` and `#children_method_name` using the class name
|
142
144
|
def inherited(child_class)
|
143
145
|
super
|
@@ -296,6 +298,7 @@ module GraphQL
|
|
296
298
|
RUBY
|
297
299
|
end
|
298
300
|
end
|
301
|
+
# rubocop:enable Development/NoEvalCop
|
299
302
|
end
|
300
303
|
end
|
301
304
|
|