graphql 1.13.10 → 1.13.13

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.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5f0c0383f875c956752600647f437e48e61308c8f69384f8743ef91340c8e32a
4
- data.tar.gz: d6253ec483446638d4cb699b8f4375937166b46325b56f89566b7f8475f68b76
3
+ metadata.gz: 2a586eb14f15e3215e732634aa6edd2204127fe1dbf356c7ff45a0b96b794832
4
+ data.tar.gz: 69acba1a940532a8010160fd0bbd4ab4d2a22d6985f4057d030815599f13f5fb
5
5
  SHA512:
6
- metadata.gz: 969ab4479ebbe513ca239d9713711885dea4285eaf0256ec6d8a39bf4799cd8c489f7ba041d303a4ee6143cd847f592fa94e95c4f9a9655af714bd1e1daedf98
7
- data.tar.gz: 5f8e5be245480970e62e7713989ba2170171c824682214b740481be02ccf6e8a8f2cd0f317ed2cf9154328115d65ba06569c576231634aea8909452577d84902
6
+ metadata.gz: db2ab29ba5535a1f60ee549542bb528323af2cb8789cc0c3e05586bc20ebb02b11b67a1d3ee7224180f437ee07e52d59f76974e5d5a476a6add5e0142ea7557e
7
+ data.tar.gz: 6c5e5c0ada2c8a293c86e338ede7bf22dee1a699b0ac8aa866993ce849de95e0683a576e2459eb199d45d30b17d745654e4ce73a95bf77704d2cd5af0a31d50f
@@ -3,7 +3,7 @@ module GraphQL
3
3
  # @api deprecated
4
4
  class Argument
5
5
  include GraphQL::Define::InstanceDefinable
6
- accepts_definitions :name, :type, :description, :default_value, :as, :prepare, :method_access, :deprecation_reason
6
+ deprecated_accepts_definitions :name, :type, :description, :default_value, :as, :prepare, :method_access, :deprecation_reason
7
7
  attr_reader :default_value
8
8
  attr_accessor :description, :name, :as, :deprecation_reason
9
9
  attr_accessor :ast_node
@@ -8,7 +8,7 @@ module GraphQL
8
8
  include GraphQL::Define::InstanceDefinable
9
9
  include GraphQL::Relay::TypeExtensions
10
10
 
11
- accepts_definitions :name, :description,
11
+ deprecated_accepts_definitions :name, :description,
12
12
  :introspection,
13
13
  :default_scalar,
14
14
  :default_relay,
@@ -167,6 +167,21 @@ ERR
167
167
  # Each symbol in `accepts` will be assigned with `{key}=`.
168
168
  # The last entry in accepts may be a hash of name-proc pairs for custom definitions.
169
169
  def accepts_definitions(*accepts)
170
+ deprecated_caller = caller(0, 1).first
171
+ if deprecated_caller.include?("lib/graphql")
172
+ deprecated_caller = caller(2, 10).find { |c| !c.include?("lib/graphql") }
173
+ end
174
+
175
+ if deprecated_caller
176
+ GraphQL::Deprecation.warn <<-ERR
177
+ #{self}.accepts_definitions will be removed in GraphQL-Ruby 2.0; use a class-based definition instead. See https://graphql-ruby.org/schema/class_based_api.html.
178
+ -> called from #{deprecated_caller}
179
+ ERR
180
+ end
181
+ deprecated_accepts_definitions(*accepts)
182
+ end
183
+
184
+ def deprecated_accepts_definitions(*accepts)
170
185
  new_assignments = if accepts.last.is_a?(Hash)
171
186
  accepts.pop.dup
172
187
  else
@@ -8,7 +8,7 @@ module GraphQL
8
8
  #
9
9
  class Directive
10
10
  include GraphQL::Define::InstanceDefinable
11
- accepts_definitions :locations, :name, :description, :arguments, :default_directive, argument: GraphQL::Define::AssignArgument
11
+ deprecated_accepts_definitions :locations, :name, :description, :arguments, :default_directive, argument: GraphQL::Define::AssignArgument
12
12
 
13
13
  attr_accessor :locations, :arguments, :name, :description, :arguments_class
14
14
  attr_accessor :ast_node
@@ -4,7 +4,7 @@ module GraphQL
4
4
  class EnumType < GraphQL::BaseType
5
5
  extend Define::InstanceDefinable::DeprecatedDefine
6
6
 
7
- accepts_definitions :values, value: GraphQL::Define::AssignEnumValue
7
+ deprecated_accepts_definitions :values, value: GraphQL::Define::AssignEnumValue
8
8
  ensure_defined(:values, :validate_non_null_input, :coerce_non_null_input, :coerce_result)
9
9
  attr_accessor :ast_node
10
10
 
@@ -72,7 +72,7 @@ module GraphQL
72
72
  class EnumValue
73
73
  include GraphQL::Define::InstanceDefinable
74
74
  ATTRIBUTES = [:name, :description, :deprecation_reason, :value]
75
- accepts_definitions(*ATTRIBUTES)
75
+ deprecated_accepts_definitions(*ATTRIBUTES)
76
76
  attr_accessor(*ATTRIBUTES)
77
77
  attr_accessor :ast_node
78
78
  ensure_defined(*ATTRIBUTES)
data/lib/graphql/field.rb CHANGED
@@ -5,7 +5,7 @@ module GraphQL
5
5
  # @api deprecated
6
6
  class Field
7
7
  include GraphQL::Define::InstanceDefinable
8
- accepts_definitions :name, :description, :deprecation_reason,
8
+ deprecated_accepts_definitions :name, :description, :deprecation_reason,
9
9
  :resolve, :lazy_resolve,
10
10
  :type, :arguments,
11
11
  :property, :hash_key, :complexity,
@@ -4,7 +4,7 @@ module GraphQL
4
4
  class InputObjectType < GraphQL::BaseType
5
5
  extend Define::InstanceDefinable::DeprecatedDefine
6
6
 
7
- accepts_definitions(
7
+ deprecated_accepts_definitions(
8
8
  :arguments, :mutation,
9
9
  input_field: GraphQL::Define::AssignArgument,
10
10
  argument: GraphQL::Define::AssignArgument
@@ -4,7 +4,7 @@ module GraphQL
4
4
  class InterfaceType < GraphQL::BaseType
5
5
  extend Define::InstanceDefinable::DeprecatedDefine
6
6
 
7
- accepts_definitions :fields, :orphan_types, :resolve_type, field: GraphQL::Define::AssignObjectField
7
+ deprecated_accepts_definitions :fields, :orphan_types, :resolve_type, field: GraphQL::Define::AssignObjectField
8
8
 
9
9
  attr_accessor :fields, :orphan_types, :resolve_type_proc
10
10
  attr_writer :type_membership_class
@@ -4,8 +4,8 @@ module GraphQL
4
4
  class ObjectType < GraphQL::BaseType
5
5
  extend Define::InstanceDefinable::DeprecatedDefine
6
6
 
7
- accepts_definitions :interfaces, :fields, :mutation, :relay_node_type, field: GraphQL::Define::AssignObjectField
8
- accepts_definitions implements: ->(type, *interfaces, inherit: false) { type.implements(interfaces, inherit: inherit) }
7
+ deprecated_accepts_definitions :interfaces, :fields, :mutation, :relay_node_type, field: GraphQL::Define::AssignObjectField
8
+ deprecated_accepts_definitions implements: ->(type, *interfaces, inherit: false) { type.implements(interfaces, inherit: inherit) }
9
9
 
10
10
  attr_accessor :fields, :mutation, :relay_node_type
11
11
  ensure_defined(:fields, :mutation, :interfaces, :relay_node_type)
@@ -8,7 +8,7 @@ module GraphQL
8
8
  # @api deprecated
9
9
  class Mutation
10
10
  include GraphQL::Define::InstanceDefinable
11
- accepts_definitions(
11
+ deprecated_accepts_definitions(
12
12
  :name, :description, :resolve,
13
13
  :return_type,
14
14
  :return_interfaces,
@@ -35,6 +35,10 @@ module GraphQL
35
35
  # @param context [GraphQL::Query::Context] The surrounding `ctx`, will be passed to the connection if provided (this is required for cursor encoders)
36
36
  # @param edge_class [Class] The class to wrap `item` with (defaults to the connection's edge class)
37
37
  def initialize(collection:, item:, parent: nil, context: nil, edge_class: nil)
38
+ if context.nil?
39
+ caller_loc = caller(2, 1).first
40
+ GraphQL::Deprecation.warn("`context: ...` will be required by `RangeAdd.new` in GraphQL-Ruby 2.0. Add `context: context` to the call at #{caller_loc}.")
41
+ end
38
42
  if context && context.schema.new_connections?
39
43
  conn_class = context.schema.connections.wrapper_for(collection)
40
44
  # The rest will be added by ConnectionExtension
@@ -4,7 +4,7 @@ module GraphQL
4
4
  class ScalarType < GraphQL::BaseType
5
5
  extend Define::InstanceDefinable::DeprecatedDefine
6
6
 
7
- accepts_definitions :coerce, :coerce_input, :coerce_result
7
+ deprecated_accepts_definitions :coerce, :coerce_input, :coerce_result
8
8
  ensure_defined :coerce_non_null_input, :coerce_result
9
9
 
10
10
  module NoOpCoerce
@@ -161,7 +161,7 @@ module GraphQL
161
161
  include LazyHandlingMethods
162
162
  extend LazyHandlingMethods
163
163
 
164
- accepts_definitions \
164
+ deprecated_accepts_definitions \
165
165
  :query_execution_strategy, :mutation_execution_strategy, :subscription_execution_strategy,
166
166
  :validate_timeout, :validate_max_errors, :max_depth, :max_complexity, :default_max_page_size,
167
167
  :orphan_types, :resolve_type, :type_error, :parse_error,
@@ -1730,6 +1730,7 @@ module GraphQL
1730
1730
  {
1731
1731
  backtrace: ctx[:backtrace],
1732
1732
  tracers: ctx[:tracers],
1733
+ dataloader: ctx[:dataloader],
1733
1734
  }
1734
1735
  else
1735
1736
  {}
@@ -17,15 +17,21 @@ module GraphQL
17
17
  def platform_trace(platform_key, key, data)
18
18
  tracer.trace(platform_key, service: service_name) do |span|
19
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
20
24
 
21
25
  if key == 'execute_multiplex'
22
26
  operations = data[:multiplex].queries.map(&:selected_operation_name).join(', ')
23
- span.resource = if operations.empty?
27
+
28
+ resource = if operations.empty?
24
29
  first_query = data[:multiplex].queries.first
25
30
  fallback_transaction_name(first_query && first_query.context)
26
31
  else
27
32
  operations
28
33
  end
34
+ span.resource = resource if resource
29
35
 
30
36
  # For top span of query, set the analytics sample rate tag, if available.
31
37
  if analytics_enabled?
@@ -39,6 +45,8 @@ module GraphQL
39
45
  span.set_tag(:query_string, data[:query].query_string)
40
46
  end
41
47
 
48
+ prepare_span(key, data, span)
49
+
42
50
  yield
43
51
  end
44
52
  end
@@ -47,6 +55,13 @@ module GraphQL
47
55
  options.fetch(:service, 'ruby-graphql')
48
56
  end
49
57
 
58
+ # Implement this method in a subclass to apply custom tags to datadog spans
59
+ # @param key [String] The event being traced
60
+ # @param data [Hash] The runtime data for this event (@see GraphQL::Tracing for keys for each event)
61
+ # @param span [Datadog::Tracing::SpanOperation] The datadog span for this event
62
+ def prepare_span(key, data, span)
63
+ end
64
+
50
65
  def tracer
51
66
  options.fetch(:tracer, Datadog.tracer)
52
67
  end
@@ -0,0 +1,101 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GraphQL
4
+ module Tracing
5
+ class OpenTelemetryTracing < PlatformTracing
6
+ self.platform_keys = {
7
+ 'lex' => 'graphql.lex',
8
+ 'parse' => 'graphql.parse',
9
+ 'validate' => 'graphql.validate',
10
+ 'analyze_query' => 'graphql.analyze_query',
11
+ 'analyze_multiplex' => 'graphql.analyze_multiplex',
12
+ 'execute_query' => 'graphql.execute_query',
13
+ 'execute_query_lazy' => 'graphql.execute_query_lazy',
14
+ 'execute_multiplex' => 'graphql.execute_multiplex'
15
+ }
16
+
17
+ def platform_trace(platform_key, key, data)
18
+ return yield if platform_key.nil?
19
+
20
+ tracer.in_span(platform_key, attributes: attributes_for(key, data)) do |span, _context|
21
+ yield.tap do |response|
22
+ errors = response[:errors]&.compact&.map { |e| e.to_h }&.to_json if key == 'validate'
23
+ unless errors.nil?
24
+ span.add_event(
25
+ 'graphql.validation.error',
26
+ attributes: {
27
+ 'message' => errors
28
+ }
29
+ )
30
+ end
31
+ end
32
+ end
33
+ end
34
+
35
+ def platform_field_key(type, field)
36
+ "#{type.graphql_name}.#{field.graphql_name}"
37
+ end
38
+
39
+ def platform_authorized_key(type)
40
+ "#{type.graphql_name}.authorized"
41
+ end
42
+
43
+ def platform_resolve_type_key(type)
44
+ "#{type.graphql_name}.resolve_type"
45
+ end
46
+
47
+ private
48
+
49
+ def tracer
50
+ OpenTelemetry::Instrumentation::GraphQL::Instrumentation.instance.tracer
51
+ end
52
+
53
+ def config
54
+ OpenTelemetry::Instrumentation::GraphQL::Instrumentation.instance.config
55
+ end
56
+
57
+ def platform_key_enabled?(ctx, key)
58
+ return false unless config[key]
59
+
60
+ ns = ctx.namespace(:opentelemetry)
61
+ return true if ns.empty? # restores original behavior so that keys are returned if tracing is not set in context.
62
+ return false unless ns.key?(key) && ns[key]
63
+
64
+ return true
65
+ end
66
+
67
+ def attributes_for(key, data)
68
+ attributes = {}
69
+ case key
70
+ when 'execute_query'
71
+ attributes['selected_operation_name'] = data[:query].selected_operation_name if data[:query].selected_operation_name
72
+ attributes['selected_operation_type'] = data[:query].selected_operation.operation_type
73
+ attributes['query_string'] = data[:query].query_string
74
+ end
75
+ attributes
76
+ end
77
+
78
+ def cached_platform_key(ctx, key, trace_phase)
79
+ cache = ctx.namespace(self.class)[:platform_key_cache] ||= {}
80
+
81
+ cache.fetch(key) do
82
+ cache[key] = if trace_phase == :field
83
+ return unless platform_key_enabled?(ctx, :enable_platform_field)
84
+
85
+ yield
86
+ elsif trace_phase == :authorized
87
+ return unless platform_key_enabled?(ctx, :enable_platform_authorized)
88
+
89
+ yield
90
+ elsif trace_phase == :resolve_type
91
+ return unless platform_key_enabled?(ctx, :enable_platform_resolve_type)
92
+
93
+ yield
94
+ else
95
+ raise "Unknown trace phase"
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end
@@ -10,6 +10,10 @@ module GraphQL
10
10
  class PlatformTracing
11
11
  class << self
12
12
  attr_accessor :platform_keys
13
+
14
+ def inherited(child_class)
15
+ child_class.platform_keys = self.platform_keys
16
+ end
13
17
  end
14
18
 
15
19
  def initialize(options = {})
@@ -41,7 +45,7 @@ module GraphQL
41
45
 
42
46
  platform_key = if trace_field
43
47
  context = data.fetch(:query).context
44
- cached_platform_key(context, field) { platform_field_key(data[:owner], field) }
48
+ cached_platform_key(context, field, :field) { platform_field_key(data[:owner], field) }
45
49
  else
46
50
  nil
47
51
  end
@@ -57,14 +61,14 @@ module GraphQL
57
61
  when "authorized", "authorized_lazy"
58
62
  type = data.fetch(:type)
59
63
  context = data.fetch(:context)
60
- platform_key = cached_platform_key(context, type) { platform_authorized_key(type) }
64
+ platform_key = cached_platform_key(context, type, :authorized) { platform_authorized_key(type) }
61
65
  platform_trace(platform_key, key, data) do
62
66
  yield
63
67
  end
64
68
  when "resolve_type", "resolve_type_lazy"
65
69
  type = data.fetch(:type)
66
70
  context = data.fetch(:context)
67
- platform_key = cached_platform_key(context, type) { platform_resolve_type_key(type) }
71
+ platform_key = cached_platform_key(context, type, :resolve_type) { platform_resolve_type_key(type) }
68
72
  platform_trace(platform_key, key, data) do
69
73
  yield
70
74
  end
@@ -135,7 +139,7 @@ module GraphQL
135
139
  # If the key isn't present, the given block is called and the result is cached for `key`.
136
140
  #
137
141
  # @return [String]
138
- def cached_platform_key(ctx, key)
142
+ def cached_platform_key(ctx, key, trace_phase)
139
143
  cache = ctx.namespace(self.class)[:platform_key_cache] ||= {}
140
144
  cache.fetch(key) { cache[key] = yield }
141
145
  end
@@ -9,6 +9,7 @@ require "graphql/tracing/scout_tracing"
9
9
  require "graphql/tracing/skylight_tracing"
10
10
  require "graphql/tracing/statsd_tracing"
11
11
  require "graphql/tracing/prometheus_tracing"
12
+ require "graphql/tracing/opentelemetry_tracing"
12
13
 
13
14
  if defined?(PrometheusExporter::Server)
14
15
  require "graphql/tracing/prometheus_tracing/graphql_collector"
@@ -11,7 +11,7 @@ module GraphQL
11
11
  end
12
12
  end
13
13
 
14
- accepts_definitions :resolve_type, :type_membership_class,
14
+ deprecated_accepts_definitions :resolve_type, :type_membership_class,
15
15
  possible_types: AcceptPossibleTypesDefinition
16
16
  ensure_defined :possible_types, :resolve_type, :resolve_type_proc, :type_membership_class
17
17
 
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module GraphQL
3
- VERSION = "1.13.10"
3
+ VERSION = "1.13.13"
4
4
  end
data/lib/graphql.rb CHANGED
@@ -83,6 +83,7 @@ require "graphql/string_encoding_error"
83
83
  require "graphql/date_encoding_error"
84
84
 
85
85
  require "graphql/define"
86
+ require "graphql/deprecation"
86
87
  require "graphql/base_type"
87
88
  require "graphql/object_type"
88
89
  require "graphql/enum_type"
@@ -119,7 +120,6 @@ require "graphql/internal_representation"
119
120
  require "graphql/directive"
120
121
  require "graphql/static_validation"
121
122
  require "graphql/execution"
122
- require "graphql/deprecation"
123
123
  require "graphql/boolean_type"
124
124
  require "graphql/float_type"
125
125
  require "graphql/id_type"
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: 1.13.10
4
+ version: 1.13.13
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robert Mosolgo
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-02-14 00:00:00.000000000 Z
11
+ date: 2022-05-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: benchmark-ips
@@ -659,6 +659,7 @@ files:
659
659
  - lib/graphql/tracing/data_dog_tracing.rb
660
660
  - lib/graphql/tracing/new_relic_tracing.rb
661
661
  - lib/graphql/tracing/notifications_tracing.rb
662
+ - lib/graphql/tracing/opentelemetry_tracing.rb
662
663
  - lib/graphql/tracing/platform_tracing.rb
663
664
  - lib/graphql/tracing/prometheus_tracing.rb
664
665
  - lib/graphql/tracing/prometheus_tracing/graphql_collector.rb
@@ -707,7 +708,7 @@ metadata:
707
708
  source_code_uri: https://github.com/rmosolgo/graphql-ruby
708
709
  bug_tracker_uri: https://github.com/rmosolgo/graphql-ruby/issues
709
710
  mailing_list_uri: https://tinyletter.com/graphql-ruby
710
- post_install_message:
711
+ post_install_message:
711
712
  rdoc_options: []
712
713
  require_paths:
713
714
  - lib
@@ -722,8 +723,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
722
723
  - !ruby/object:Gem::Version
723
724
  version: '0'
724
725
  requirements: []
725
- rubygems_version: 3.1.6
726
- signing_key:
726
+ rubygems_version: 3.2.32
727
+ signing_key:
727
728
  specification_version: 4
728
729
  summary: A GraphQL language and runtime for Ruby
729
730
  test_files: []