graphql 2.0.30 → 2.1.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.

@@ -3,18 +3,20 @@
3
3
  module GraphQL
4
4
  module Tracing
5
5
  module DataDogTrace
6
- # @param tracer [#trace] Deprecated
7
6
  # @param analytics_enabled [Boolean] Deprecated
8
7
  # @param analytics_sample_rate [Float] Deprecated
9
- def initialize(tracer: nil, analytics_enabled: false, analytics_sample_rate: 1.0, service: nil, **rest)
8
+ def initialize(tracer: nil, analytics_enabled: false, analytics_sample_rate: 1.0, service: "ruby-graphql", **rest)
10
9
  if tracer.nil?
11
10
  tracer = defined?(Datadog::Tracing) ? Datadog::Tracing : Datadog.tracer
12
11
  end
13
12
  @tracer = tracer
14
13
 
15
- @analytics_enabled = analytics_enabled
16
- @analytics_sample_rate = analytics_sample_rate
14
+ analytics_available = defined?(Datadog::Contrib::Analytics) \
15
+ && Datadog::Contrib::Analytics.respond_to?(:enabled?) \
16
+ && Datadog::Contrib::Analytics.respond_to?(:set_sample_rate)
17
17
 
18
+ @analytics_enabled = analytics_available && Datadog::Contrib::Analytics.enabled?(analytics_enabled)
19
+ @analytics_sample_rate = analytics_sample_rate
18
20
  @service_name = service
19
21
  @has_prepare_span = respond_to?(:prepare_span)
20
22
  super
@@ -32,9 +34,12 @@ module GraphQL
32
34
  }.each do |trace_method, trace_key|
33
35
  module_eval <<-RUBY, __FILE__, __LINE__
34
36
  def #{trace_method}(**data)
35
- @tracer.trace("#{trace_key}", service: @service_name, type: 'custom') do |span|
36
- span.set_tag('component', 'graphql')
37
- span.set_tag('operation', '#{trace_method}')
37
+ @tracer.trace("#{trace_key}", service: @service_name) do |span|
38
+ span.span_type = 'custom'
39
+ if defined?(Datadog::Tracing::Metadata::Ext) # Introduced in ddtrace 1.0
40
+ span.set_tag(Datadog::Tracing::Metadata::Ext::TAG_COMPONENT, 'graphql')
41
+ span.set_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION, '#{trace_method}')
42
+ end
38
43
 
39
44
  #{
40
45
  if trace_method == 'execute_multiplex'
@@ -49,8 +54,10 @@ module GraphQL
49
54
  end
50
55
  span.resource = resource if resource
51
56
 
52
- # [Deprecated] will be removed in the future
53
- span.set_metric('_dd1.sr.eausr', @analytics_sample_rate) if @analytics_enabled
57
+ # For top span of query, set the analytics sample rate tag, if available.
58
+ if @analytics_enabled
59
+ Datadog::Contrib::Analytics.set_sample_rate(span, @analytics_sample_rate)
60
+ end
54
61
  RUBY
55
62
  elsif trace_method == 'execute_query'
56
63
  <<-RUBY
@@ -82,10 +89,12 @@ module GraphQL
82
89
  nil
83
90
  end
84
91
  if platform_key && trace_field
85
- @tracer.trace(platform_key, service: @service_name, type: 'custom') do |span|
86
- span.set_tag('component', 'graphql')
87
- span.set_tag('operation', span_key)
88
-
92
+ @tracer.trace(platform_key, service: @service_name) do |span|
93
+ span.span_type = 'custom'
94
+ if defined?(Datadog::Tracing::Metadata::Ext) # Introduced in ddtrace 1.0
95
+ span.set_tag(Datadog::Tracing::Metadata::Ext::TAG_COMPONENT, 'graphql')
96
+ span.set_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION, span_key)
97
+ end
89
98
  if @has_prepare_span
90
99
  prepare_span_data = { query: query, field: field, ast_node: ast_node, arguments: arguments, object: object }
91
100
  prepare_span(span_key, prepare_span_data, span)
@@ -116,10 +125,12 @@ module GraphQL
116
125
 
117
126
  def authorized_span(span_key, object, type, query)
118
127
  platform_key = @platform_key_cache[DataDogTrace].platform_authorized_key_cache[type]
119
- @tracer.trace(platform_key, service: @service_name, type: 'custom') do |span|
120
- span.set_tag('component', 'graphql')
121
- span.set_tag('operation', span_key)
122
-
128
+ @tracer.trace(platform_key, service: @service_name) do |span|
129
+ span.span_type = 'custom'
130
+ if defined?(Datadog::Tracing::Metadata::Ext) # Introduced in ddtrace 1.0
131
+ span.set_tag(Datadog::Tracing::Metadata::Ext::TAG_COMPONENT, 'graphql')
132
+ span.set_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION, span_key)
133
+ end
123
134
  if @has_prepare_span
124
135
  prepare_span(span_key, {object: object, type: type, query: query}, span)
125
136
  end
@@ -147,10 +158,12 @@ module GraphQL
147
158
 
148
159
  def resolve_type_span(span_key, object, type, query)
149
160
  platform_key = @platform_key_cache[DataDogTrace].platform_resolve_type_key_cache[type]
150
- @tracer.trace(platform_key, service: @service_name, type: 'custom') do |span|
151
- span.set_tag('component', 'graphql')
152
- span.set_tag('operation', span_key)
153
-
161
+ @tracer.trace(platform_key, service: @service_name) do |span|
162
+ span.span_type = 'custom'
163
+ if defined?(Datadog::Tracing::Metadata::Ext) # Introduced in ddtrace 1.0
164
+ span.set_tag(Datadog::Tracing::Metadata::Ext::TAG_COMPONENT, 'graphql')
165
+ span.set_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION, span_key)
166
+ end
154
167
  if @has_prepare_span
155
168
  prepare_span(span_key, {object: object, type: type, query: query}, span)
156
169
  end
@@ -15,9 +15,12 @@ module GraphQL
15
15
  }
16
16
 
17
17
  def platform_trace(platform_key, key, data)
18
- tracer.trace(platform_key, service: options[:service], type: 'custom') do |span|
19
- span.set_tag('component', 'graphql')
20
- span.set_tag('operation', key)
18
+ tracer.trace(platform_key, service: service_name) do |span|
19
+ span.span_type = 'custom'
20
+ if defined?(Datadog::Tracing::Metadata::Ext) # Introduced in ddtrace 1.0
21
+ span.set_tag(Datadog::Tracing::Metadata::Ext::TAG_COMPONENT, 'graphql')
22
+ span.set_tag(Datadog::Tracing::Metadata::Ext::TAG_OPERATION, key)
23
+ end
21
24
 
22
25
  if key == 'execute_multiplex'
23
26
  operations = data[:multiplex].queries.map(&:selected_operation_name).join(', ')
@@ -30,8 +33,10 @@ module GraphQL
30
33
  end
31
34
  span.resource = resource if resource
32
35
 
33
- # [Deprecated] will be removed in the future
34
- span.set_metric('_dd1.sr.eausr', analytics_sample_rate) if analytics_enabled?
36
+ # For top span of query, set the analytics sample rate tag, if available.
37
+ if analytics_enabled?
38
+ Datadog::Contrib::Analytics.set_sample_rate(span, analytics_sample_rate)
39
+ end
35
40
  end
36
41
 
37
42
  if key == 'execute_query'
@@ -46,6 +51,10 @@ module GraphQL
46
51
  end
47
52
  end
48
53
 
54
+ def service_name
55
+ options.fetch(:service, 'ruby-graphql')
56
+ end
57
+
49
58
  # Implement this method in a subclass to apply custom tags to datadog spans
50
59
  # @param key [String] The event being traced
51
60
  # @param data [Hash] The runtime data for this event (@see GraphQL::Tracing for keys for each event)
@@ -56,13 +65,18 @@ module GraphQL
56
65
  def tracer
57
66
  default_tracer = defined?(Datadog::Tracing) ? Datadog::Tracing : Datadog.tracer
58
67
 
59
- # [Deprecated] options[:tracer] will be removed in the future
60
68
  options.fetch(:tracer, default_tracer)
61
69
  end
62
70
 
71
+ def analytics_available?
72
+ defined?(Datadog::Contrib::Analytics) \
73
+ && Datadog::Contrib::Analytics.respond_to?(:enabled?) \
74
+ && Datadog::Contrib::Analytics.respond_to?(:set_sample_rate)
75
+ end
76
+
63
77
  def analytics_enabled?
64
78
  # [Deprecated] options[:analytics_enabled] will be removed in the future
65
- options.fetch(:analytics_enabled, false)
79
+ analytics_available? && Datadog::Contrib::Analytics.enabled?(options.fetch(:analytics_enabled, false))
66
80
  end
67
81
 
68
82
  def analytics_sample_rate
@@ -67,9 +67,8 @@ module GraphQL
67
67
  type: [edge_type_class, null: edge_nullable],
68
68
  null: edges_nullable,
69
69
  description: "A list of edges.",
70
+ scope: false, # Assume that the connection was already scoped.
70
71
  connection: false,
71
- # Assume that the connection was scoped before this step:
72
- scope: false,
73
72
  }
74
73
 
75
74
  if field_options
@@ -170,6 +169,24 @@ module GraphQL
170
169
  obj_type.field :page_info, GraphQL::Types::Relay::PageInfo, null: false, description: "Information to aid in pagination."
171
170
  end
172
171
  end
172
+
173
+ def edges
174
+ # Assume that whatever authorization needed to happen
175
+ # already happened at the connection level.
176
+ current_runtime_state = Thread.current[:__graphql_runtime_info]
177
+ query_runtime_state = current_runtime_state[context.query]
178
+ query_runtime_state.was_authorized_by_scope_items = @object.was_authorized_by_scope_items?
179
+ @object.edges
180
+ end
181
+
182
+ def nodes
183
+ # Assume that whatever authorization needed to happen
184
+ # already happened at the connection level.
185
+ current_runtime_state = Thread.current[:__graphql_runtime_info]
186
+ query_runtime_state = current_runtime_state[context.query]
187
+ query_runtime_state.was_authorized_by_scope_items = @object.was_authorized_by_scope_items?
188
+ @object.nodes
189
+ end
173
190
  end
174
191
  end
175
192
  end
@@ -12,6 +12,13 @@ module GraphQL
12
12
  child_class.node_nullable(true)
13
13
  end
14
14
 
15
+ def node
16
+ current_runtime_state = Thread.current[:__graphql_runtime_info]
17
+ query_runtime_state = current_runtime_state[context.query]
18
+ query_runtime_state.was_authorized_by_scope_items = @object.was_authorized_by_scope_items?
19
+ @object.node
20
+ end
21
+
15
22
  module ClassMethods
16
23
  def inherited(child_class)
17
24
  super
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module GraphQL
3
- VERSION = "2.0.30"
3
+ VERSION = "2.1.0"
4
4
  end
data/lib/graphql.rb CHANGED
@@ -103,7 +103,6 @@ require "graphql/schema"
103
103
  require "graphql/query"
104
104
  require "graphql/types"
105
105
  require "graphql/dataloader"
106
- require "graphql/filter"
107
106
  require "graphql/static_validation"
108
107
  require "graphql/execution"
109
108
  require "graphql/schema/built_in_types"
metadata CHANGED
@@ -1,29 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: graphql
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.30
4
+ version: 2.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robert Mosolgo
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-05-09 00:00:00.000000000 Z
11
+ date: 2023-08-30 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: base64
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: '0'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: '0'
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: benchmark-ips
29
15
  requirement: !ruby/object:Gem::Requirement
@@ -67,61 +53,61 @@ dependencies:
67
53
  - !ruby/object:Gem::Version
68
54
  version: '0'
69
55
  - !ruby/object:Gem::Dependency
70
- name: racc
56
+ name: minitest
71
57
  requirement: !ruby/object:Gem::Requirement
72
58
  requirements:
73
59
  - - "~>"
74
60
  - !ruby/object:Gem::Version
75
- version: '1.4'
61
+ version: 5.9.0
76
62
  type: :development
77
63
  prerelease: false
78
64
  version_requirements: !ruby/object:Gem::Requirement
79
65
  requirements:
80
66
  - - "~>"
81
67
  - !ruby/object:Gem::Version
82
- version: '1.4'
68
+ version: 5.9.0
83
69
  - !ruby/object:Gem::Dependency
84
- name: minitest
70
+ name: minitest-focus
85
71
  requirement: !ruby/object:Gem::Requirement
86
72
  requirements:
87
- - - ">="
73
+ - - "~>"
88
74
  - !ruby/object:Gem::Version
89
- version: '0'
75
+ version: '1.1'
90
76
  type: :development
91
77
  prerelease: false
92
78
  version_requirements: !ruby/object:Gem::Requirement
93
79
  requirements:
94
- - - ">="
80
+ - - "~>"
95
81
  - !ruby/object:Gem::Version
96
- version: '0'
82
+ version: '1.1'
97
83
  - !ruby/object:Gem::Dependency
98
- name: minitest-focus
84
+ name: minitest-reporters
99
85
  requirement: !ruby/object:Gem::Requirement
100
86
  requirements:
101
- - - ">="
87
+ - - "~>"
102
88
  - !ruby/object:Gem::Version
103
- version: '0'
89
+ version: '1.0'
104
90
  type: :development
105
91
  prerelease: false
106
92
  version_requirements: !ruby/object:Gem::Requirement
107
93
  requirements:
108
- - - ">="
94
+ - - "~>"
109
95
  - !ruby/object:Gem::Version
110
- version: '0'
96
+ version: '1.0'
111
97
  - !ruby/object:Gem::Dependency
112
- name: minitest-reporters
98
+ name: racc
113
99
  requirement: !ruby/object:Gem::Requirement
114
100
  requirements:
115
- - - ">="
101
+ - - "~>"
116
102
  - !ruby/object:Gem::Version
117
- version: '0'
103
+ version: '1.4'
118
104
  type: :development
119
105
  prerelease: false
120
106
  version_requirements: !ruby/object:Gem::Requirement
121
107
  requirements:
122
- - - ">="
108
+ - - "~>"
123
109
  - !ruby/object:Gem::Version
124
- version: '0'
110
+ version: '1.4'
125
111
  - !ruby/object:Gem::Dependency
126
112
  name: rake
127
113
  requirement: !ruby/object:Gem::Requirement
@@ -345,7 +331,6 @@ files:
345
331
  - lib/graphql/execution/lookahead.rb
346
332
  - lib/graphql/execution/multiplex.rb
347
333
  - lib/graphql/execution_error.rb
348
- - lib/graphql/filter.rb
349
334
  - lib/graphql/integer_decoding_error.rb
350
335
  - lib/graphql/integer_encoding_error.rb
351
336
  - lib/graphql/introspection.rb
@@ -550,7 +535,6 @@ files:
550
535
  - lib/graphql/static_validation/rules/variables_are_input_types_error.rb
551
536
  - lib/graphql/static_validation/rules/variables_are_used_and_defined.rb
552
537
  - lib/graphql/static_validation/rules/variables_are_used_and_defined_error.rb
553
- - lib/graphql/static_validation/type_stack.rb
554
538
  - lib/graphql/static_validation/validation_context.rb
555
539
  - lib/graphql/static_validation/validation_timeout_error.rb
556
540
  - lib/graphql/static_validation/validator.rb
@@ -637,7 +621,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
637
621
  - !ruby/object:Gem::Version
638
622
  version: '0'
639
623
  requirements: []
640
- rubygems_version: 3.5.3
624
+ rubygems_version: 3.4.10
641
625
  signing_key:
642
626
  specification_version: 4
643
627
  summary: A GraphQL language and runtime for Ruby
@@ -1,59 +0,0 @@
1
- # frozen_string_literal: true
2
- require "graphql/deprecation"
3
-
4
- module GraphQL
5
- # @api private
6
- class Filter
7
- def initialize(only: nil, except: nil, silence_deprecation_warning: false)
8
- if !silence_deprecation_warning
9
- line = caller(2, 10).find { |l| !l.include?("lib/graphql") }
10
- GraphQL::Deprecation.warn("GraphQL::Filter, `only:`, `except:`, and `.merge_filters` are deprecated and will be removed in v2.1.0. Implement `visible?` on your schema members instead (https://graphql-ruby.org/authorization/visibility.html).\n #{line}")
11
- end
12
- @only = only
13
- @except = except
14
- end
15
-
16
- # Returns true if `member, ctx` passes this filter
17
- def call(member, ctx)
18
- (@only ? @only.call(member, ctx) : true) &&
19
- (@except ? !@except.call(member, ctx) : true)
20
- end
21
-
22
- def merge(only: nil, except: nil)
23
- onlies = [self].concat(Array(only))
24
- merged_only = MergedOnly.build(onlies)
25
- merged_except = MergedExcept.build(Array(except))
26
- self.class.new(only: merged_only, except: merged_except, silence_deprecation_warning: true)
27
- end
28
-
29
- private
30
-
31
- class MergedOnly
32
- def initialize(first, second)
33
- @first = first
34
- @second = second
35
- end
36
-
37
- def call(member, ctx)
38
- @first.call(member, ctx) && @second.call(member, ctx)
39
- end
40
-
41
- def self.build(onlies)
42
- case onlies.size
43
- when 0
44
- nil
45
- when 1
46
- onlies[0]
47
- else
48
- onlies.reduce { |memo, only| self.new(memo, only) }
49
- end
50
- end
51
- end
52
-
53
- class MergedExcept < MergedOnly
54
- def call(member, ctx)
55
- @first.call(member, ctx) || @second.call(member, ctx)
56
- end
57
- end
58
- end
59
- end
@@ -1,216 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- module StaticValidation
4
- # - Ride along with `GraphQL::Language::Visitor`
5
- # - Track type info, expose it to validators
6
- class TypeStack
7
- # These are jumping-off points for infering types down the tree
8
- TYPE_INFERRENCE_ROOTS = [
9
- GraphQL::Language::Nodes::OperationDefinition,
10
- GraphQL::Language::Nodes::FragmentDefinition,
11
- ]
12
-
13
- # @return [GraphQL::Schema] the schema whose types are present in this document
14
- attr_reader :schema
15
-
16
- # When it enters an object (starting with query or mutation root), it's pushed on this stack.
17
- # When it exits, it's popped off.
18
- # @return [Array<GraphQL::ObjectType, GraphQL::Union, GraphQL::Interface>]
19
- attr_reader :object_types
20
-
21
- # When it enters a field, it's pushed on this stack (useful for nested fields, args).
22
- # When it exits, it's popped off.
23
- # @return [Array<GraphQL::Field>] fields which have been entered
24
- attr_reader :field_definitions
25
-
26
- # Directives are pushed on, then popped off while traversing the tree
27
- # @return [Array<GraphQL::Node::Directive>] directives which have been entered
28
- attr_reader :directive_definitions
29
-
30
- # @return [Array<GraphQL::Node::Argument>] arguments which have been entered
31
- attr_reader :argument_definitions
32
-
33
- # @return [Array<String>] fields which have been entered (by their AST name)
34
- attr_reader :path
35
-
36
- # @param schema [GraphQL::Schema] the schema whose types to use when climbing this document
37
- # @param visitor [GraphQL::Language::Visitor] a visitor to follow & watch the types
38
- def initialize(schema, visitor)
39
- @schema = schema
40
- @object_types = []
41
- @field_definitions = []
42
- @directive_definitions = []
43
- @argument_definitions = []
44
- @path = []
45
-
46
- PUSH_STRATEGIES.each do |node_class, strategy|
47
- visitor[node_class].enter << EnterWithStrategy.new(self, strategy)
48
- visitor[node_class].leave << LeaveWithStrategy.new(self, strategy)
49
- end
50
- end
51
-
52
- private
53
-
54
-
55
- module FragmentWithTypeStrategy
56
- def push(stack, node)
57
- object_type = if node.type
58
- stack.schema.get_type(node.type.name)
59
- else
60
- stack.object_types.last
61
- end
62
- if !object_type.nil?
63
- object_type = object_type.unwrap
64
- end
65
- stack.object_types.push(object_type)
66
- push_path_member(stack, node)
67
- end
68
-
69
- def pop(stack, node)
70
- stack.object_types.pop
71
- stack.path.pop
72
- end
73
- end
74
-
75
- module FragmentDefinitionStrategy
76
- extend FragmentWithTypeStrategy
77
- module_function
78
- def push_path_member(stack, node)
79
- stack.path.push("fragment #{node.name}")
80
- end
81
- end
82
-
83
- module InlineFragmentStrategy
84
- extend FragmentWithTypeStrategy
85
- module_function
86
- def push_path_member(stack, node)
87
- stack.path.push("...#{node.type ? " on #{node.type.to_query_string}" : ""}")
88
- end
89
- end
90
-
91
- module OperationDefinitionStrategy
92
- module_function
93
- def push(stack, node)
94
- # eg, QueryType, MutationType
95
- object_type = stack.schema.root_type_for_operation(node.operation_type)
96
- stack.object_types.push(object_type)
97
- stack.path.push("#{node.operation_type}#{node.name ? " #{node.name}" : ""}")
98
- end
99
-
100
- def pop(stack, node)
101
- stack.object_types.pop
102
- stack.path.pop
103
- end
104
- end
105
-
106
- module FieldStrategy
107
- module_function
108
- def push(stack, node)
109
- parent_type = stack.object_types.last
110
- parent_type = parent_type.unwrap
111
-
112
- field_definition = stack.schema.get_field(parent_type, node.name)
113
- stack.field_definitions.push(field_definition)
114
- if !field_definition.nil?
115
- next_object_type = field_definition.type
116
- stack.object_types.push(next_object_type)
117
- else
118
- stack.object_types.push(nil)
119
- end
120
- stack.path.push(node.alias || node.name)
121
- end
122
-
123
- def pop(stack, node)
124
- stack.field_definitions.pop
125
- stack.object_types.pop
126
- stack.path.pop
127
- end
128
- end
129
-
130
- module DirectiveStrategy
131
- module_function
132
- def push(stack, node)
133
- directive_defn = stack.schema.directives[node.name]
134
- stack.directive_definitions.push(directive_defn)
135
- end
136
-
137
- def pop(stack, node)
138
- stack.directive_definitions.pop
139
- end
140
- end
141
-
142
- module ArgumentStrategy
143
- module_function
144
- # Push `argument_defn` onto the stack.
145
- # It's possible that `argument_defn` will be nil.
146
- # Push it anyways so `pop` has something to pop.
147
- def push(stack, node)
148
- if stack.argument_definitions.last
149
- arg_type = stack.argument_definitions.last.type.unwrap
150
- if arg_type.kind.input_object?
151
- argument_defn = arg_type.arguments[node.name]
152
- else
153
- argument_defn = nil
154
- end
155
- elsif stack.directive_definitions.last
156
- argument_defn = stack.directive_definitions.last.arguments[node.name]
157
- elsif stack.field_definitions.last
158
- argument_defn = stack.field_definitions.last.arguments[node.name]
159
- else
160
- argument_defn = nil
161
- end
162
- stack.argument_definitions.push(argument_defn)
163
- stack.path.push(node.name)
164
- end
165
-
166
- def pop(stack, node)
167
- stack.argument_definitions.pop
168
- stack.path.pop
169
- end
170
- end
171
-
172
- module FragmentSpreadStrategy
173
- module_function
174
- def push(stack, node)
175
- stack.path.push("... #{node.name}")
176
- end
177
-
178
- def pop(stack, node)
179
- stack.path.pop
180
- end
181
- end
182
-
183
- PUSH_STRATEGIES = {
184
- GraphQL::Language::Nodes::FragmentDefinition => FragmentDefinitionStrategy,
185
- GraphQL::Language::Nodes::InlineFragment => InlineFragmentStrategy,
186
- GraphQL::Language::Nodes::FragmentSpread => FragmentSpreadStrategy,
187
- GraphQL::Language::Nodes::Argument => ArgumentStrategy,
188
- GraphQL::Language::Nodes::Field => FieldStrategy,
189
- GraphQL::Language::Nodes::Directive => DirectiveStrategy,
190
- GraphQL::Language::Nodes::OperationDefinition => OperationDefinitionStrategy,
191
- }
192
-
193
- class EnterWithStrategy
194
- def initialize(stack, strategy)
195
- @stack = stack
196
- @strategy = strategy
197
- end
198
-
199
- def call(node, parent)
200
- @strategy.push(@stack, node)
201
- end
202
- end
203
-
204
- class LeaveWithStrategy
205
- def initialize(stack, strategy)
206
- @stack = stack
207
- @strategy = strategy
208
- end
209
-
210
- def call(node, parent)
211
- @strategy.pop(@stack, node)
212
- end
213
- end
214
- end
215
- end
216
- end