graphql 2.1.15 → 2.2.0

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.

Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/lib/graphql/dataloader/async_dataloader.rb +88 -0
  3. data/lib/graphql/dataloader/source.rb +5 -8
  4. data/lib/graphql/dataloader.rb +35 -21
  5. data/lib/graphql/language/lexer.rb +271 -177
  6. data/lib/graphql/language/nodes.rb +72 -57
  7. data/lib/graphql/language/parser.rb +686 -1986
  8. data/lib/graphql/language/printer.rb +16 -12
  9. data/lib/graphql/language/static_visitor.rb +33 -37
  10. data/lib/graphql/language/visitor.rb +55 -59
  11. data/lib/graphql/schema/argument.rb +5 -3
  12. data/lib/graphql/schema/build_from_definition.rb +7 -8
  13. data/lib/graphql/schema/directive.rb +1 -1
  14. data/lib/graphql/schema/enum_value.rb +1 -1
  15. data/lib/graphql/schema/field.rb +1 -1
  16. data/lib/graphql/schema/input_object.rb +6 -8
  17. data/lib/graphql/schema/interface.rb +2 -6
  18. data/lib/graphql/schema/member/has_directives.rb +1 -1
  19. data/lib/graphql/schema/member/has_fields.rb +1 -1
  20. data/lib/graphql/schema/member/has_interfaces.rb +1 -1
  21. data/lib/graphql/schema/member/scoped.rb +1 -1
  22. data/lib/graphql/schema/member/type_system_helpers.rb +1 -1
  23. data/lib/graphql/schema.rb +6 -5
  24. data/lib/graphql/testing/helpers.rb +125 -0
  25. data/lib/graphql/testing.rb +2 -0
  26. data/lib/graphql/tracing/appoptics_trace.rb +0 -4
  27. data/lib/graphql/tracing/appsignal_trace.rb +0 -4
  28. data/lib/graphql/tracing/data_dog_trace.rb +34 -25
  29. data/lib/graphql/tracing/data_dog_tracing.rb +21 -7
  30. data/lib/graphql/tracing/notifications_trace.rb +0 -4
  31. data/lib/graphql/tracing/platform_trace.rb +0 -5
  32. data/lib/graphql/tracing/prometheus_trace.rb +0 -4
  33. data/lib/graphql/tracing/scout_trace.rb +0 -3
  34. data/lib/graphql/tracing/statsd_trace.rb +0 -4
  35. data/lib/graphql/tracing/trace.rb +1 -0
  36. data/lib/graphql/types/relay/connection_behaviors.rb +1 -1
  37. data/lib/graphql/types/relay/edge_behaviors.rb +1 -1
  38. data/lib/graphql/version.rb +1 -1
  39. data/lib/graphql.rb +1 -0
  40. metadata +21 -19
  41. data/lib/graphql/language/parser.y +0 -560
@@ -16,30 +16,30 @@ module GraphQL
16
16
  # @return [Integer] The first line of the definition (not the description)
17
17
  attr_reader :definition_line
18
18
 
19
- def initialize(options = {})
20
- @definition_line = options.delete(:definition_line)
21
- super(options)
19
+ def initialize(definition_line: nil, **_rest)
20
+ @definition_line = definition_line
21
+ super(**_rest)
22
22
  end
23
23
  end
24
24
 
25
- attr_reader :line, :col, :filename
25
+ attr_reader :filename
26
26
 
27
- # Initialize a node by extracting its position,
28
- # then calling the class's `initialize_node` method.
29
- # @param options [Hash] Initial attributes for this node
30
- def initialize(options = {})
31
- if options.key?(:position_source)
32
- position_source = options.delete(:position_source)
33
- @line = position_source[1]
34
- @col = position_source[2]
35
- else
36
- @line = options.delete(:line)
37
- @col = options.delete(:col)
38
- end
27
+ def line
28
+ @line ||= (@source_string && @pos) ? @source_string[0..@pos].count("\n") + 1 : nil
29
+ end
39
30
 
40
- @filename = options.delete(:filename)
31
+ def col
32
+ @col ||= if @source_string && @pos
33
+ if @pos == 0
34
+ 1
35
+ else
36
+ @source_string[0..@pos].split("\n").last.length
37
+ end
38
+ end
39
+ end
41
40
 
42
- initialize_node(**options)
41
+ def definition_line
42
+ @definition_line ||= (@source_string && @definition_pos) ? @source_string[0..@definition_pos].count("\n") + 1 : nil
43
43
  end
44
44
 
45
45
  # Value equality
@@ -138,8 +138,6 @@ 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
-
143
141
  # Add a default `#visit_method` and `#children_method_name` using the class name
144
142
  def inherited(child_class)
145
143
  super
@@ -198,8 +196,8 @@ module GraphQL
198
196
  module_eval <<-RUBY, __FILE__, __LINE__
199
197
  # Singular method: create a node with these options
200
198
  # and return a new `self` which includes that node in this list.
201
- def merge_#{method_name.to_s.sub(/s$/, "")}(node_opts)
202
- merge(#{method_name}: #{method_name} + [#{node_type.name}.new(node_opts)])
199
+ def merge_#{method_name.to_s.sub(/s$/, "")}(**node_opts)
200
+ merge(#{method_name}: #{method_name} + [#{node_type.name}.new(**node_opts)])
203
201
  end
204
202
  RUBY
205
203
  end
@@ -228,13 +226,14 @@ module GraphQL
228
226
  end
229
227
 
230
228
  if defined?(@scalar_methods)
231
- if !method_defined?(:initialize_node)
232
- generate_initialize_node
229
+ if !@initialize_was_generated
230
+ @initialize_was_generated = true
231
+ generate_initialize
233
232
  else
234
233
  # This method was defined manually
235
234
  end
236
235
  else
237
- raise "Can't generate_initialize_node because scalar_methods wasn't called; call it before children_methods"
236
+ raise "Can't generate_initialize because scalar_methods wasn't called; call it before children_methods"
238
237
  end
239
238
  end
240
239
 
@@ -263,7 +262,15 @@ module GraphQL
263
262
  end
264
263
  end
265
264
 
266
- def generate_initialize_node
265
+ DEFAULT_INITIALIZE_OPTIONS = [
266
+ "line: nil",
267
+ "col: nil",
268
+ "pos: nil",
269
+ "filename: nil",
270
+ "source_string: nil",
271
+ ]
272
+
273
+ def generate_initialize
267
274
  scalar_method_names = @scalar_methods
268
275
  # TODO: These probably should be scalar methods, but `types` returns an array
269
276
  [:types, :description].each do |extra_method|
@@ -279,16 +286,27 @@ module GraphQL
279
286
  return
280
287
  else
281
288
  arguments = scalar_method_names.map { |m| "#{m}: nil"} +
282
- @children_methods.keys.map { |m| "#{m}: NO_CHILDREN" }
289
+ @children_methods.keys.map { |m| "#{m}: NO_CHILDREN" } +
290
+ DEFAULT_INITIALIZE_OPTIONS
283
291
 
284
292
  assignments = scalar_method_names.map { |m| "@#{m} = #{m}"} +
285
293
  @children_methods.keys.map { |m| "@#{m} = #{m}.freeze" }
286
294
 
295
+ if name.end_with?("Definition") && name != "FragmentDefinition"
296
+ arguments << "definition_pos: nil"
297
+ assignments << "@definition_pos = definition_pos"
298
+ end
299
+
287
300
  keywords = scalar_method_names.map { |m| "#{m}: #{m}"} +
288
301
  @children_methods.keys.map { |m| "#{m}: #{m}" }
289
302
 
290
303
  module_eval <<-RUBY, __FILE__, __LINE__
291
- def initialize_node #{arguments.join(", ")}
304
+ def initialize(#{arguments.join(", ")})
305
+ @line = line
306
+ @col = col
307
+ @pos = pos
308
+ @filename = filename
309
+ @source_string = source_string
292
310
  #{assignments.join("\n")}
293
311
  end
294
312
 
@@ -298,7 +316,6 @@ module GraphQL
298
316
  RUBY
299
317
  end
300
318
  end
301
- # rubocop:enable Development/NoEvalCop
302
319
  end
303
320
  end
304
321
 
@@ -339,7 +356,6 @@ module GraphQL
339
356
  end
340
357
 
341
358
  class DirectiveDefinition < AbstractNode
342
- include DefinitionNode
343
359
  attr_reader :description
344
360
  scalar_methods :name, :repeatable
345
361
  children_methods(
@@ -368,17 +384,22 @@ module GraphQL
368
384
  # @!attribute selections
369
385
  # @return [Array<Nodes::Field>] Selections on this object (or empty array if this is a scalar field)
370
386
 
371
- def initialize_node(attributes)
372
- @name = attributes[:name]
373
- @arguments = attributes[:arguments] || NONE
374
- @directives = attributes[:directives] || NONE
375
- @selections = attributes[:selections] || NONE
387
+ def initialize(name: nil, arguments: NONE, directives: NONE, selections: NONE, field_alias: nil, line: nil, col: nil, pos: nil, filename: nil, source_string: nil)
388
+ @name = name
389
+ @arguments = arguments || NONE
390
+ @directives = directives || NONE
391
+ @selections = selections || NONE
376
392
  # oops, alias is a keyword:
377
- @alias = attributes[:alias]
393
+ @alias = field_alias
394
+ @line = line
395
+ @col = col
396
+ @pos = pos
397
+ @filename = filename
398
+ @source_string = source_string
378
399
  end
379
400
 
380
- def self.from_a(filename, line, col, graphql_alias, name, arguments, directives, selections) # rubocop:disable Metrics/ParameterLists
381
- self.new(filename: filename, line: line, col: col, alias: graphql_alias, name: name, arguments: arguments, directives: directives, selections: selections)
401
+ def self.from_a(filename, line, col, field_alias, name, arguments, directives, selections) # rubocop:disable Metrics/ParameterLists
402
+ self.new(filename: filename, line: line, col: col, field_alias: field_alias, name: name, arguments: arguments, directives: directives, selections: selections)
382
403
  end
383
404
 
384
405
  # Override this because default is `:fields`
@@ -387,29 +408,33 @@ module GraphQL
387
408
 
388
409
  # A reusable fragment, defined at document-level.
389
410
  class FragmentDefinition < AbstractNode
411
+ scalar_methods :name, :type
412
+ children_methods({
413
+ selections: GraphQL::Language::Nodes::Field,
414
+ directives: GraphQL::Language::Nodes::Directive,
415
+ })
416
+
417
+ self.children_method_name = :definitions
390
418
  # @!attribute name
391
419
  # @return [String] the identifier for this fragment, which may be applied with `...#{name}`
392
420
 
393
421
  # @!attribute type
394
422
  # @return [String] the type condition for this fragment (name of type which it may apply to)
395
- def initialize_node(name: nil, type: nil, directives: [], selections: [])
423
+ def initialize(name: nil, type: nil, directives: NONE, selections: NONE, filename: nil, pos: nil, source_string: nil, line: nil, col: nil)
396
424
  @name = name
397
425
  @type = type
398
426
  @directives = directives
399
427
  @selections = selections
428
+ @filename = filename
429
+ @pos = pos
430
+ @source_string = source_string
431
+ @line = line
432
+ @col = col
400
433
  end
401
434
 
402
435
  def self.from_a(filename, line, col, name, type, directives, selections)
403
436
  self.new(filename: filename, line: line, col: col, name: name, type: type, directives: directives, selections: selections)
404
437
  end
405
-
406
- scalar_methods :name, :type
407
- children_methods({
408
- selections: GraphQL::Language::Nodes::Field,
409
- directives: GraphQL::Language::Nodes::Directive,
410
- })
411
-
412
- self.children_method_name = :definitions
413
438
  end
414
439
 
415
440
  # Application of a named fragment in a selection
@@ -565,7 +590,6 @@ module GraphQL
565
590
  end
566
591
 
567
592
  class SchemaDefinition < AbstractNode
568
- include DefinitionNode
569
593
  scalar_methods :query, :mutation, :subscription
570
594
  children_methods({
571
595
  directives: GraphQL::Language::Nodes::Directive,
@@ -582,7 +606,6 @@ module GraphQL
582
606
  end
583
607
 
584
608
  class ScalarTypeDefinition < AbstractNode
585
- include DefinitionNode
586
609
  attr_reader :description
587
610
  scalar_methods :name
588
611
  children_methods({
@@ -600,7 +623,6 @@ module GraphQL
600
623
  end
601
624
 
602
625
  class InputValueDefinition < AbstractNode
603
- include DefinitionNode
604
626
  attr_reader :description
605
627
  scalar_methods :name, :type, :default_value
606
628
  children_methods({
@@ -610,7 +632,6 @@ module GraphQL
610
632
  end
611
633
 
612
634
  class FieldDefinition < AbstractNode
613
- include DefinitionNode
614
635
  attr_reader :description
615
636
  scalar_methods :name, :type
616
637
  children_methods({
@@ -631,7 +652,6 @@ module GraphQL
631
652
  end
632
653
 
633
654
  class ObjectTypeDefinition < AbstractNode
634
- include DefinitionNode
635
655
  attr_reader :description
636
656
  scalar_methods :name, :interfaces
637
657
  children_methods({
@@ -651,7 +671,6 @@ module GraphQL
651
671
  end
652
672
 
653
673
  class InterfaceTypeDefinition < AbstractNode
654
- include DefinitionNode
655
674
  attr_reader :description
656
675
  scalar_methods :name
657
676
  children_methods({
@@ -673,7 +692,6 @@ module GraphQL
673
692
  end
674
693
 
675
694
  class UnionTypeDefinition < AbstractNode
676
- include DefinitionNode
677
695
  attr_reader :description, :types
678
696
  scalar_methods :name
679
697
  children_methods({
@@ -692,7 +710,6 @@ module GraphQL
692
710
  end
693
711
 
694
712
  class EnumValueDefinition < AbstractNode
695
- include DefinitionNode
696
713
  attr_reader :description
697
714
  scalar_methods :name
698
715
  children_methods({
@@ -702,7 +719,6 @@ module GraphQL
702
719
  end
703
720
 
704
721
  class EnumTypeDefinition < AbstractNode
705
- include DefinitionNode
706
722
  attr_reader :description
707
723
  scalar_methods :name
708
724
  children_methods({
@@ -722,7 +738,6 @@ module GraphQL
722
738
  end
723
739
 
724
740
  class InputObjectTypeDefinition < AbstractNode
725
- include DefinitionNode
726
741
  attr_reader :description
727
742
  scalar_methods :name
728
743
  children_methods({