graphql 2.3.3 → 2.3.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d1511256e7812b5c2de2a01ffa44f8a77f2e8959837344eaf1c8780d0b1bf700
4
- data.tar.gz: 87a0734b541d8f2cbbd3fb293a63663cbc57c61e6ab39242449596c6ca759442
3
+ metadata.gz: c8f2d38dd0c349521f7f22050bb70cee1f06a7832de74d5afe523a35310ed318
4
+ data.tar.gz: da047a5e11a1441060411c47468daad16300db1dc7064ab1b1a76d2e519e76fd
5
5
  SHA512:
6
- metadata.gz: fff5ef36d8e8dff310cac664178ebf0e902cd067a893fedd164902625751fe457a070f1daf2a2251d0dd2ec57fb16daccc81b54267048bbb71c027caf7905100
7
- data.tar.gz: 5fc4e6c4a44398e9f77d99c5224d22128a9c80e64a17a156500337b4d658270da9aa7af71f8d06cc065939cc42b41de3e07d66cb7622704ad179424c312dd7a0
6
+ metadata.gz: 73bd380530a4183241587083beb2ef6c96709657fb18e702a294a37c22f26e2141b2111b96c79570b9588d330e9c8d851fd532cdaf6d6fbd55f9dd5b30c6fe4e
7
+ data.tar.gz: 917e88d0cec3cbc760ec89714cf31325088f94f0a93094b3fcbf1cc3c07f52a99e30f0e418e561518c0a7deef0358dfa0ae457b8bad88fb50883aacb9d7dae7f
@@ -77,6 +77,7 @@ module GraphQL
77
77
  set_fiber_variables(fiber_vars)
78
78
  Thread.current[:graphql_dataloader_next_tick] = condition
79
79
  pending_sources.each(&:run_pending_keys)
80
+ cleanup_fiber
80
81
  end
81
82
  end
82
83
  end
@@ -88,6 +88,11 @@ module GraphQL
88
88
  nil
89
89
  end
90
90
 
91
+ # This method is called when Dataloader is finished using a fiber.
92
+ # Use it to perform any cleanup, such as releasing database connections (if required manually)
93
+ def cleanup_fiber
94
+ end
95
+
91
96
  # Get a Source instance from this dataloader, for calling `.load(...)` or `.request(...)` on.
92
97
  #
93
98
  # @param source_class [Class<GraphQL::Dataloader::Source]
@@ -231,9 +236,7 @@ module GraphQL
231
236
  Fiber.new(blocking: !@nonblocking) {
232
237
  set_fiber_variables(fiber_vars)
233
238
  yield
234
- # With `.transfer`, you have to explicitly pass back to the parent --
235
- # if the fiber is allowed to terminate normally, control is passed to the main fiber instead.
236
- true
239
+ cleanup_fiber
237
240
  }
238
241
  end
239
242
 
@@ -127,7 +127,6 @@ module GraphQL
127
127
  end
128
128
 
129
129
  def gather_selections(owner_object, owner_type, selections, selections_to_run = nil, selections_by_name = {})
130
-
131
130
  selections.each do |node|
132
131
  # Skip gathering this if the directive says so
133
132
  if !directives_include?(node, owner_object, owner_type)
@@ -172,17 +171,26 @@ module GraphQL
172
171
  type_defn = schema.get_type(node.type.name, context)
173
172
 
174
173
  if query.warden.possible_types(type_defn).include?(owner_type)
175
- gather_selections(owner_object, owner_type, node.selections, selections_to_run, next_selections)
174
+ result = gather_selections(owner_object, owner_type, node.selections, selections_to_run, next_selections)
175
+ if !result.equal?(next_selections)
176
+ selections_to_run = result
177
+ end
176
178
  end
177
179
  else
178
180
  # it's an untyped fragment, definitely continue
179
- gather_selections(owner_object, owner_type, node.selections, selections_to_run, next_selections)
181
+ result = gather_selections(owner_object, owner_type, node.selections, selections_to_run, next_selections)
182
+ if !result.equal?(next_selections)
183
+ selections_to_run = result
184
+ end
180
185
  end
181
186
  when GraphQL::Language::Nodes::FragmentSpread
182
187
  fragment_def = query.fragments[node.name]
183
188
  type_defn = query.get_type(fragment_def.type.name)
184
189
  if query.warden.possible_types(type_defn).include?(owner_type)
185
- gather_selections(owner_object, owner_type, fragment_def.selections, selections_to_run, next_selections)
190
+ result = gather_selections(owner_object, owner_type, fragment_def.selections, selections_to_run, next_selections)
191
+ if !result.equal?(next_selections)
192
+ selections_to_run = result
193
+ end
186
194
  end
187
195
  else
188
196
  raise "Invariant: unexpected selection class: #{node.class}"
@@ -20,6 +20,15 @@ module GraphQL
20
20
  @definition_line = definition_line
21
21
  super(**_rest)
22
22
  end
23
+
24
+ def marshal_dump
25
+ super << @definition_line
26
+ end
27
+
28
+ def marshal_load(values)
29
+ @definition_line = values.pop
30
+ super
31
+ end
23
32
  end
24
33
 
25
34
  attr_reader :filename
@@ -273,18 +282,20 @@ module GraphQL
273
282
  end
274
283
  end
275
284
 
276
- all_method_names = scalar_method_names + @children_methods.keys
285
+ children_method_names = @children_methods.keys
286
+
287
+ all_method_names = scalar_method_names + children_method_names
277
288
  if all_method_names.include?(:alias)
278
289
  # Rather than complicating this special case,
279
290
  # let it be overridden (in field)
280
291
  return
281
292
  else
282
293
  arguments = scalar_method_names.map { |m| "#{m}: nil"} +
283
- @children_methods.keys.map { |m| "#{m}: NO_CHILDREN" } +
294
+ children_method_names.map { |m| "#{m}: NO_CHILDREN" } +
284
295
  DEFAULT_INITIALIZE_OPTIONS
285
296
 
286
297
  assignments = scalar_method_names.map { |m| "@#{m} = #{m}"} +
287
- @children_methods.keys.map { |m| "@#{m} = #{m}.freeze" }
298
+ children_method_names.map { |m| "@#{m} = #{m}.freeze" }
288
299
 
289
300
  if name.end_with?("Definition") && name != "FragmentDefinition"
290
301
  arguments << "definition_pos: nil"
@@ -292,7 +303,7 @@ module GraphQL
292
303
  end
293
304
 
294
305
  keywords = scalar_method_names.map { |m| "#{m}: #{m}"} +
295
- @children_methods.keys.map { |m| "#{m}: #{m}" }
306
+ children_method_names.map { |m| "#{m}: #{m}" }
296
307
 
297
308
  module_eval <<-RUBY, __FILE__, __LINE__
298
309
  def initialize(#{arguments.join(", ")})
@@ -304,9 +315,21 @@ module GraphQL
304
315
  #{assignments.join("\n")}
305
316
  end
306
317
 
307
- def self.from_a(filename, line, col, #{(scalar_method_names + @children_methods.keys).join(", ")})
318
+ def self.from_a(filename, line, col, #{all_method_names.join(", ")})
308
319
  self.new(filename: filename, line: line, col: col, #{keywords.join(", ")})
309
320
  end
321
+
322
+ def marshal_dump
323
+ [
324
+ line, col, # use methods here to force them to be calculated
325
+ @filename,
326
+ #{all_method_names.map { |n| "@#{n}," }.join}
327
+ ]
328
+ end
329
+
330
+ def marshal_load(values)
331
+ @line, @col, @filename #{all_method_names.map { |n| ", @#{n}"}.join} = values
332
+ end
310
333
  RUBY
311
334
  end
312
335
  end
@@ -397,6 +420,14 @@ module GraphQL
397
420
  self.new(filename: filename, line: line, col: col, field_alias: field_alias, name: name, arguments: arguments, directives: directives, selections: selections)
398
421
  end
399
422
 
423
+ def marshal_dump
424
+ [line, col, @filename, @name, @arguments, @directives, @selections, @alias]
425
+ end
426
+
427
+ def marshal_load(values)
428
+ @line, @col, @filename, @name, @arguments, @directives, @selections, @alias = values
429
+ end
430
+
400
431
  # Override this because default is `:fields`
401
432
  self.children_method_name = :selections
402
433
  end
@@ -430,6 +461,14 @@ module GraphQL
430
461
  def self.from_a(filename, line, col, name, type, directives, selections)
431
462
  self.new(filename: filename, line: line, col: col, name: name, type: type, directives: directives, selections: selections)
432
463
  end
464
+
465
+ def marshal_dump
466
+ [line, col, @filename, @name, @type, @directives, @selections]
467
+ end
468
+
469
+ def marshal_load(values)
470
+ @line, @col, @filename, @name, @type, @directives, @selections = values
471
+ end
433
472
  end
434
473
 
435
474
  # Application of a named fragment in a selection
@@ -478,7 +478,7 @@ module GraphQL
478
478
  end
479
479
 
480
480
  if at?(:BANG)
481
- type = Nodes::NonNullType.new(pos: pos, of_type: type)
481
+ type = Nodes::NonNullType.new(pos: pos, of_type: type, source: self)
482
482
  expect_token(:BANG)
483
483
  end
484
484
  type
@@ -487,7 +487,7 @@ module GraphQL
487
487
  def list_type
488
488
  loc = pos
489
489
  expect_token(:LBRACKET)
490
- type = Nodes::ListType.new(pos: loc, of_type: self.type)
490
+ type = Nodes::ListType.new(pos: loc, of_type: self.type, source: self)
491
491
  expect_token(:RBRACKET)
492
492
  type
493
493
  end
data/lib/graphql/query.rb CHANGED
@@ -304,7 +304,7 @@ module GraphQL
304
304
 
305
305
  # @return [String] An opaque hash for identifying this query's given query string and selected operation
306
306
  def operation_fingerprint
307
- @operation_fingerprint ||= "#{selected_operation_name || "anonymous"}/#{Fingerprint.generate(query_string)}"
307
+ @operation_fingerprint ||= "#{selected_operation_name || "anonymous"}/#{Fingerprint.generate(query_string || "")}"
308
308
  end
309
309
 
310
310
  # @return [String] An opaque hash for identifying this query's given a variable values (not including defaults)
@@ -25,33 +25,33 @@ module GraphQL
25
25
  }.each do |trace_method, platform_key|
26
26
  module_eval <<-RUBY, __FILE__, __LINE__
27
27
  def #{trace_method}(**data)
28
- instrument_execution("#{platform_key}", "#{trace_method}") { super }
28
+ instrument_prometheus_execution("#{platform_key}", "#{trace_method}") { super }
29
29
  end
30
30
  RUBY
31
31
  end
32
32
 
33
33
  def platform_execute_field(platform_key, &block)
34
- instrument_execution(platform_key, "execute_field", &block)
34
+ instrument_prometheus_execution(platform_key, "execute_field", &block)
35
35
  end
36
36
 
37
37
  def platform_execute_field_lazy(platform_key, &block)
38
- instrument_execution(platform_key, "execute_field_lazy", &block)
38
+ instrument_prometheus_execution(platform_key, "execute_field_lazy", &block)
39
39
  end
40
40
 
41
41
  def platform_authorized(platform_key, &block)
42
- instrument_execution(platform_key, "authorized", &block)
42
+ instrument_prometheus_execution(platform_key, "authorized", &block)
43
43
  end
44
44
 
45
45
  def platform_authorized_lazy(platform_key, &block)
46
- instrument_execution(platform_key, "authorized_lazy", &block)
46
+ instrument_prometheus_execution(platform_key, "authorized_lazy", &block)
47
47
  end
48
48
 
49
49
  def platform_resolve_type(platform_key, &block)
50
- instrument_execution(platform_key, "resolve_type", &block)
50
+ instrument_prometheus_execution(platform_key, "resolve_type", &block)
51
51
  end
52
52
 
53
53
  def platform_resolve_type_lazy(platform_key, &block)
54
- instrument_execution(platform_key, "resolve_type_lazy", &block)
54
+ instrument_prometheus_execution(platform_key, "resolve_type_lazy", &block)
55
55
  end
56
56
 
57
57
  def platform_field_key(field)
@@ -68,7 +68,7 @@ module GraphQL
68
68
 
69
69
  private
70
70
 
71
- def instrument_execution(platform_key, key, &block)
71
+ def instrument_prometheus_execution(platform_key, key, &block)
72
72
  if @keys_whitelist.include?(key)
73
73
  start = ::Process.clock_gettime ::Process::CLOCK_MONOTONIC
74
74
  result = block.call
@@ -12,7 +12,7 @@ module GraphQL
12
12
  @set_transaction_name = set_transaction_name
13
13
  super
14
14
  end
15
-
15
+
16
16
  def execute_query(**data)
17
17
  set_this_txn_name = data[:query].context[:set_sentry_transaction_name]
18
18
  if set_this_txn_name == true || (set_this_txn_name.nil? && @set_transaction_name)
@@ -20,7 +20,7 @@ module GraphQL
20
20
  scope.set_transaction_name(transaction_name(data[:query]))
21
21
  end
22
22
  end
23
- instrument_execution("graphql.execute", "execute_query", data) { super }
23
+ instrument_sentry_execution("graphql.execute", "execute_query", data) { super }
24
24
  end
25
25
 
26
26
  {
@@ -34,33 +34,33 @@ module GraphQL
34
34
  }.each do |trace_method, platform_key|
35
35
  module_eval <<-RUBY, __FILE__, __LINE__
36
36
  def #{trace_method}(**data)
37
- instrument_execution("#{platform_key}", "#{trace_method}", data) { super }
37
+ instrument_sentry_execution("#{platform_key}", "#{trace_method}", data) { super }
38
38
  end
39
39
  RUBY
40
40
  end
41
41
 
42
42
  def platform_execute_field(platform_key, &block)
43
- instrument_execution(platform_key, "execute_field", &block)
43
+ instrument_sentry_execution(platform_key, "execute_field", &block)
44
44
  end
45
45
 
46
46
  def platform_execute_field_lazy(platform_key, &block)
47
- instrument_execution(platform_key, "execute_field_lazy", &block)
47
+ instrument_sentry_execution(platform_key, "execute_field_lazy", &block)
48
48
  end
49
49
 
50
50
  def platform_authorized(platform_key, &block)
51
- instrument_execution(platform_key, "authorized", &block)
51
+ instrument_sentry_execution(platform_key, "authorized", &block)
52
52
  end
53
53
 
54
54
  def platform_authorized_lazy(platform_key, &block)
55
- instrument_execution(platform_key, "authorized_lazy", &block)
55
+ instrument_sentry_execution(platform_key, "authorized_lazy", &block)
56
56
  end
57
57
 
58
58
  def platform_resolve_type(platform_key, &block)
59
- instrument_execution(platform_key, "resolve_type", &block)
59
+ instrument_sentry_execution(platform_key, "resolve_type", &block)
60
60
  end
61
61
 
62
62
  def platform_resolve_type_lazy(platform_key, &block)
63
- instrument_execution(platform_key, "resolve_type_lazy", &block)
63
+ instrument_sentry_execution(platform_key, "resolve_type_lazy", &block)
64
64
  end
65
65
 
66
66
  def platform_field_key(field)
@@ -77,7 +77,7 @@ module GraphQL
77
77
 
78
78
  private
79
79
 
80
- def instrument_execution(platform_key, trace_method, data=nil, &block)
80
+ def instrument_sentry_execution(platform_key, trace_method, data=nil, &block)
81
81
  return yield unless Sentry.initialized?
82
82
 
83
83
  Sentry.with_child_span(op: platform_key, start_timestamp: Sentry.utc_now.to_f) do |span|
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module GraphQL
3
- VERSION = "2.3.3"
3
+ VERSION = "2.3.4"
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: graphql
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.3.3
4
+ version: 2.3.4
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: 2024-05-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: base64