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.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/lib/generators/graphql/mutation_delete_generator.rb +1 -1
  3. data/lib/generators/graphql/mutation_update_generator.rb +1 -1
  4. data/lib/generators/graphql/relay.rb +18 -1
  5. data/lib/graphql/backtrace.rb +0 -4
  6. data/lib/graphql/dataloader/source.rb +69 -45
  7. data/lib/graphql/dataloader.rb +4 -4
  8. data/lib/graphql/execution/interpreter/arguments_cache.rb +31 -30
  9. data/lib/graphql/execution/interpreter/runtime.rb +122 -101
  10. data/lib/graphql/execution/interpreter.rb +1 -2
  11. data/lib/graphql/execution/lookahead.rb +1 -1
  12. data/lib/graphql/filter.rb +2 -1
  13. data/lib/graphql/introspection/entry_points.rb +1 -1
  14. data/lib/graphql/language/document_from_schema_definition.rb +16 -9
  15. data/lib/graphql/language/lexer.rb +89 -57
  16. data/lib/graphql/language/nodes.rb +3 -0
  17. data/lib/graphql/language/parser.rb +706 -691
  18. data/lib/graphql/language/parser.y +1 -0
  19. data/lib/graphql/language/printer.rb +28 -14
  20. data/lib/graphql/language/visitor.rb +64 -61
  21. data/lib/graphql/query/context.rb +16 -7
  22. data/lib/graphql/query/null_context.rb +8 -18
  23. data/lib/graphql/query/validation_pipeline.rb +2 -1
  24. data/lib/graphql/query.rb +37 -12
  25. data/lib/graphql/schema/addition.rb +38 -12
  26. data/lib/graphql/schema/always_visible.rb +10 -0
  27. data/lib/graphql/schema/argument.rb +8 -10
  28. data/lib/graphql/schema/build_from_definition.rb +8 -7
  29. data/lib/graphql/schema/directive.rb +1 -1
  30. data/lib/graphql/schema/enum_value.rb +2 -2
  31. data/lib/graphql/schema/field/connection_extension.rb +1 -1
  32. data/lib/graphql/schema/field.rb +26 -15
  33. data/lib/graphql/schema/input_object.rb +9 -7
  34. data/lib/graphql/schema/interface.rb +5 -1
  35. data/lib/graphql/schema/introspection_system.rb +1 -1
  36. data/lib/graphql/schema/member/build_type.rb +10 -2
  37. data/lib/graphql/schema/member/has_arguments.rb +9 -7
  38. data/lib/graphql/schema/member/has_directives.rb +1 -1
  39. data/lib/graphql/schema/member/has_fields.rb +1 -1
  40. data/lib/graphql/schema/member/has_interfaces.rb +1 -1
  41. data/lib/graphql/schema/member/type_system_helpers.rb +1 -1
  42. data/lib/graphql/schema/object.rb +6 -1
  43. data/lib/graphql/schema/printer.rb +3 -1
  44. data/lib/graphql/schema/relay_classic_mutation.rb +1 -1
  45. data/lib/graphql/schema/resolver.rb +12 -10
  46. data/lib/graphql/schema/timeout.rb +1 -1
  47. data/lib/graphql/schema/validator.rb +1 -1
  48. data/lib/graphql/schema/warden.rb +37 -4
  49. data/lib/graphql/schema.rb +92 -23
  50. data/lib/graphql/tracing/appoptics_trace.rb +35 -11
  51. data/lib/graphql/tracing/appsignal_trace.rb +4 -0
  52. data/lib/graphql/tracing/data_dog_trace.rb +89 -50
  53. data/lib/graphql/tracing/data_dog_tracing.rb +7 -21
  54. data/lib/graphql/tracing/legacy_trace.rb +5 -1
  55. data/lib/graphql/tracing/notifications_trace.rb +7 -0
  56. data/lib/graphql/tracing/platform_trace.rb +26 -12
  57. data/lib/graphql/tracing/prometheus_trace.rb +4 -0
  58. data/lib/graphql/tracing/scout_trace.rb +3 -0
  59. data/lib/graphql/tracing/statsd_trace.rb +4 -0
  60. data/lib/graphql/tracing.rb +1 -0
  61. data/lib/graphql/types/relay/connection_behaviors.rb +1 -1
  62. data/lib/graphql/types/relay/edge_behaviors.rb +1 -1
  63. data/lib/graphql/version.rb +1 -1
  64. data/readme.md +1 -1
  65. metadata +36 -24
@@ -4,7 +4,7 @@ require "strscan"
4
4
 
5
5
  module GraphQL
6
6
  module Language
7
- module Lexer
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 self.tokenize string
91
- meta = {
92
- line: 1,
93
- col: 1,
94
- tokens: [],
95
- previous_token: nil,
96
- }
97
-
98
- unless string.valid_encoding?
99
- emit(:BAD_UNICODE_ESCAPE, 0, 0, meta, string)
100
- return meta[:tokens]
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
- scan = StringScanner.new string
104
-
105
- while !scan.eos?
106
- pos = scan.pos
107
-
108
- case
109
- when str = scan.scan(FLOAT) then emit(:FLOAT, pos, scan.pos, meta, str)
110
- when str = scan.scan(INT) then emit(:INT, pos, scan.pos, meta, str)
111
- when str = scan.scan(LIT) then emit(LIT_NAME_LUT[str], pos, scan.pos, meta, -str)
112
- when str = scan.scan(IDENTIFIER) then emit(:IDENTIFIER, pos, scan.pos, meta, str)
113
- when str = scan.scan(BLOCK_STRING) then emit_block(pos, scan.pos, meta, str.gsub(/^#{BLOCK_QUOTE}|#{BLOCK_QUOTE}$/, ''))
114
- when str = scan.scan(QUOTED_STRING) then emit_string(pos, scan.pos, meta, str.gsub(/^"|"$/, ''))
115
- when str = scan.scan(COMMENT) then record_comment(pos, scan.pos, meta, str)
116
- when str = scan.scan(NEWLINE)
117
- meta[:line] += 1
118
- meta[:col] = 1
119
- when scan.scan(BLANK)
120
- meta[:col] += scan.pos - pos
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
- meta[:tokens]
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 self.emit(token_name, ts, te, meta, token_value)
132
- meta[:tokens] << token = [
153
+ def emit(token_name, ts, te, token_value)
154
+ token = [
133
155
  token_name,
134
- meta[:line],
135
- meta[:col],
156
+ @line,
157
+ @col,
136
158
  token_value,
137
- meta[:previous_token],
159
+ @previous_token,
138
160
  ]
139
- meta[:previous_token] = token
161
+ @previous_token = token
140
162
  # Bump the column counter for the next token
141
- meta[:col] += te - ts
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 self.record_comment(ts, te, meta, str)
193
+ def record_comment(ts, te, str)
171
194
  token = [
172
195
  :COMMENT,
173
- meta[:line],
174
- meta[:col],
196
+ @line,
197
+ @col,
175
198
  str,
176
- meta[:previous_token],
199
+ @previous_token,
177
200
  ]
178
201
 
179
- meta[:previous_token] = token
202
+ @previous_token = token
180
203
 
181
- meta[:col] += te - ts
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 self.emit_block(ts, te, meta, value)
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, meta, value)
202
- meta[:line] += line_incr
225
+ tok = emit_string(ts, te, value)
226
+ @line += line_incr
227
+ tok
203
228
  end
204
229
 
205
- def self.emit_string(ts, te, meta, value)
230
+ def emit_string(ts, te, value)
206
231
  if !value.valid_encoding? || !value.match?(VALID_STRING)
207
- emit(:BAD_UNICODE_ESCAPE, ts, te, meta, value)
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, meta, value)
237
+ emit(:BAD_UNICODE_ESCAPE, ts, te, value)
213
238
  else
214
- emit(:STRING, ts, te, meta, value)
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