graphql 2.0.20 → 2.0.21
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 +4 -4
- data/lib/graphql/backtrace/trace.rb +96 -0
- data/lib/graphql/backtrace.rb +6 -1
- data/lib/graphql/execution/interpreter/arguments.rb +1 -1
- data/lib/graphql/execution/interpreter/arguments_cache.rb +2 -3
- data/lib/graphql/execution/interpreter/runtime.rb +200 -161
- data/lib/graphql/execution/interpreter.rb +1 -1
- data/lib/graphql/filter.rb +7 -2
- data/lib/graphql/language/document_from_schema_definition.rb +25 -9
- data/lib/graphql/language/nodes.rb +2 -2
- data/lib/graphql/language/parser.rb +475 -458
- data/lib/graphql/language/parser.y +5 -1
- data/lib/graphql/pagination/connection.rb +5 -5
- data/lib/graphql/query/context.rb +13 -12
- data/lib/graphql/query/null_context.rb +1 -1
- data/lib/graphql/query.rb +9 -5
- data/lib/graphql/schema/argument.rb +7 -9
- data/lib/graphql/schema/build_from_definition.rb +15 -3
- data/lib/graphql/schema/enum_value.rb +2 -5
- data/lib/graphql/schema/field.rb +14 -13
- data/lib/graphql/schema/field_extension.rb +1 -4
- data/lib/graphql/schema/find_inherited_value.rb +2 -7
- data/lib/graphql/schema/member/has_arguments.rb +1 -1
- data/lib/graphql/schema/member/has_directives.rb +4 -6
- data/lib/graphql/schema/member/has_fields.rb +80 -36
- data/lib/graphql/schema/member/has_validators.rb +2 -2
- data/lib/graphql/schema/resolver.rb +4 -4
- data/lib/graphql/schema/validator.rb +1 -1
- data/lib/graphql/schema/warden.rb +3 -1
- data/lib/graphql/schema.rb +40 -11
- data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +12 -4
- data/lib/graphql/static_validation/rules/fields_will_merge.rb +2 -2
- data/lib/graphql/tracing/appsignal_trace.rb +6 -0
- data/lib/graphql/tracing/legacy_trace.rb +65 -0
- data/lib/graphql/tracing/notifications_trace.rb +2 -1
- data/lib/graphql/tracing/platform_trace.rb +21 -19
- data/lib/graphql/tracing/prometheus_tracing/graphql_collector.rb +1 -1
- data/lib/graphql/tracing/trace.rb +75 -0
- data/lib/graphql/tracing.rb +3 -123
- data/lib/graphql/version.rb +1 -1
- data/lib/graphql.rb +4 -0
- metadata +5 -2
data/lib/graphql/schema.rb
CHANGED
@@ -145,18 +145,41 @@ module GraphQL
|
|
145
145
|
|
146
146
|
def trace_class(new_class = nil)
|
147
147
|
if new_class
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
148
|
+
trace_mode(:default, new_class)
|
149
|
+
backtrace_class = Class.new(new_class)
|
150
|
+
backtrace_class.include(GraphQL::Backtrace::Trace)
|
151
|
+
trace_mode(:default_backtrace, backtrace_class)
|
152
|
+
end
|
153
|
+
trace_class_for(:default)
|
154
|
+
end
|
155
|
+
|
156
|
+
# @return [Class] Return the trace class to use for this mode, looking one up on the superclass if this Schema doesn't have one defined.
|
157
|
+
def trace_class_for(mode)
|
158
|
+
@trace_modes ||= {}
|
159
|
+
@trace_modes[mode] ||= begin
|
160
|
+
base_class = if superclass.respond_to?(:trace_class_for)
|
161
|
+
superclass.trace_class_for(mode)
|
162
|
+
elsif mode == :default_backtrace
|
163
|
+
GraphQL::Backtrace::DefaultBacktraceTrace
|
152
164
|
else
|
153
165
|
GraphQL::Tracing::Trace
|
154
166
|
end
|
155
|
-
|
167
|
+
Class.new(base_class)
|
156
168
|
end
|
157
|
-
@trace_class
|
158
169
|
end
|
159
170
|
|
171
|
+
# Configure `trace_class` to be used whenever `context: { trace_mode: mode_name }` is requested.
|
172
|
+
# `:default` is used when no `trace_mode: ...` is requested.
|
173
|
+
# @param mode_name [Symbol]
|
174
|
+
# @param trace_class [Class] subclass of GraphQL::Tracing::Trace
|
175
|
+
# @return void
|
176
|
+
def trace_mode(mode_name, trace_class)
|
177
|
+
@trace_modes ||= {}
|
178
|
+
@trace_modes[mode_name] = trace_class
|
179
|
+
nil
|
180
|
+
end
|
181
|
+
|
182
|
+
|
160
183
|
# Returns the JSON response of {Introspection::INTROSPECTION_QUERY}.
|
161
184
|
# @see {#as_json}
|
162
185
|
# @return [String]
|
@@ -221,7 +244,7 @@ module GraphQL
|
|
221
244
|
end
|
222
245
|
|
223
246
|
def default_filter
|
224
|
-
GraphQL::Filter.new(except: default_mask)
|
247
|
+
GraphQL::Filter.new(except: default_mask, silence_deprecation_warning: true)
|
225
248
|
end
|
226
249
|
|
227
250
|
def default_mask(new_mask = nil)
|
@@ -936,10 +959,10 @@ module GraphQL
|
|
936
959
|
end
|
937
960
|
|
938
961
|
def tracer(new_tracer)
|
939
|
-
if defined?(@
|
962
|
+
if defined?(@trace_modes) && !(trace_class_for(:default) < GraphQL::Tracing::LegacyTrace)
|
940
963
|
raise ArgumentError, "Can't add tracer after configuring a `trace_class`, use GraphQL::Tracing::LegacyTrace to merge legacy tracers into a trace class instead."
|
941
|
-
|
942
|
-
|
964
|
+
else
|
965
|
+
trace_mode(:default, Class.new(GraphQL::Tracing::LegacyTrace))
|
943
966
|
end
|
944
967
|
|
945
968
|
own_tracers << new_tracer
|
@@ -968,7 +991,13 @@ module GraphQL
|
|
968
991
|
if defined?(@trace_options)
|
969
992
|
options = trace_options.merge(options)
|
970
993
|
end
|
971
|
-
|
994
|
+
trace_mode = if (target = options[:query] || options[:multiplex]) && target.context[:backtrace]
|
995
|
+
:default_backtrace
|
996
|
+
else
|
997
|
+
:default
|
998
|
+
end
|
999
|
+
trace = trace_class_for(trace_mode).new(**options)
|
1000
|
+
trace
|
972
1001
|
end
|
973
1002
|
|
974
1003
|
def query_analyzer(new_analyzer)
|
@@ -26,11 +26,19 @@ module GraphQL
|
|
26
26
|
msg = if resolved_type.nil?
|
27
27
|
nil
|
28
28
|
elsif resolved_type.kind.scalar? && ast_node.selections.any?
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
29
|
+
selection_strs = ast_node.selections.map do |n|
|
30
|
+
case n
|
31
|
+
when GraphQL::Language::Nodes::InlineFragment
|
32
|
+
"\"... on #{n.type.name} { ... }\""
|
33
|
+
when GraphQL::Language::Nodes::Field
|
34
|
+
"\"#{n.name}\""
|
35
|
+
when GraphQL::Language::Nodes::FragmentSpread
|
36
|
+
"\"#{n.name}\""
|
37
|
+
else
|
38
|
+
raise "Invariant: unexpected selection node: #{n}"
|
39
|
+
end
|
33
40
|
end
|
41
|
+
"Selections can't be made on scalars (%{node_name} returns #{resolved_type.graphql_name} but has selections [#{selection_strs.join(", ")}])"
|
34
42
|
elsif resolved_type.kind.fields? && ast_node.selections.empty?
|
35
43
|
"Field must have selections (%{node_name} returns #{resolved_type.graphql_name} but has no selections. Did you mean '#{ast_node.name} { ... }'?)"
|
36
44
|
else
|
@@ -9,7 +9,7 @@ module GraphQL
|
|
9
9
|
# without ambiguity.
|
10
10
|
#
|
11
11
|
# Original Algorithm: https://github.com/graphql/graphql-js/blob/master/src/validation/rules/OverlappingFieldsCanBeMerged.js
|
12
|
-
NO_ARGS =
|
12
|
+
NO_ARGS = GraphQL::EmptyObjects::EMPTY_HASH
|
13
13
|
|
14
14
|
Field = Struct.new(:node, :definition, :owner_type, :parents)
|
15
15
|
FragmentSpread = Struct.new(:name, :parents)
|
@@ -323,7 +323,7 @@ module GraphQL
|
|
323
323
|
end
|
324
324
|
end
|
325
325
|
|
326
|
-
NO_SELECTIONS = [
|
326
|
+
NO_SELECTIONS = [GraphQL::EmptyObjects::EMPTY_HASH, GraphQL::EmptyObjects::EMPTY_ARRAY].freeze
|
327
327
|
|
328
328
|
def fields_and_fragments_from_selection(node, owner_type:, parents:)
|
329
329
|
if node.selections.empty?
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module GraphQL
|
3
|
+
module Tracing
|
4
|
+
# This trace class calls legacy-style tracer with payload hashes.
|
5
|
+
# New-style `trace_with` modules significantly reduce the overhead of tracing,
|
6
|
+
# but that advantage is lost when legacy-style tracers are also used (since the payload hashes are still constructed).
|
7
|
+
class LegacyTrace < Trace
|
8
|
+
def lex(query_string:)
|
9
|
+
(@multiplex || @query).trace("lex", { query_string: query_string }) { super }
|
10
|
+
end
|
11
|
+
|
12
|
+
def parse(query_string:)
|
13
|
+
(@multiplex || @query).trace("parse", { query_string: query_string }) { super }
|
14
|
+
end
|
15
|
+
|
16
|
+
def validate(query:, validate:)
|
17
|
+
query.trace("validate", { validate: validate, query: query }) { super }
|
18
|
+
end
|
19
|
+
|
20
|
+
def analyze_multiplex(multiplex:)
|
21
|
+
multiplex.trace("analyze_multiplex", { multiplex: multiplex }) { super }
|
22
|
+
end
|
23
|
+
|
24
|
+
def analyze_query(query:)
|
25
|
+
query.trace("analyze_query", { query: query }) { super }
|
26
|
+
end
|
27
|
+
|
28
|
+
def execute_multiplex(multiplex:)
|
29
|
+
multiplex.trace("execute_multiplex", { multiplex: multiplex }) { super }
|
30
|
+
end
|
31
|
+
|
32
|
+
def execute_query(query:)
|
33
|
+
query.trace("execute_query", { query: query }) { super }
|
34
|
+
end
|
35
|
+
|
36
|
+
def execute_query_lazy(query:, multiplex:)
|
37
|
+
multiplex.trace("execute_query_lazy", { multiplex: multiplex, query: query }) { super }
|
38
|
+
end
|
39
|
+
|
40
|
+
def execute_field(field:, query:, ast_node:, arguments:, object:)
|
41
|
+
query.trace("execute_field", { field: field, query: query, ast_node: ast_node, arguments: arguments, object: object, owner: field.owner, path: query.context[:current_path] }) { super }
|
42
|
+
end
|
43
|
+
|
44
|
+
def execute_field_lazy(field:, query:, ast_node:, arguments:, object:)
|
45
|
+
query.trace("execute_field_lazy", { field: field, query: query, ast_node: ast_node, arguments: arguments, object: object, owner: field.owner, path: query.context[:current_path] }) { super }
|
46
|
+
end
|
47
|
+
|
48
|
+
def authorized(query:, type:, object:)
|
49
|
+
query.trace("authorized", { context: query.context, type: type, object: object, path: query.context[:current_path] }) { super }
|
50
|
+
end
|
51
|
+
|
52
|
+
def authorized_lazy(query:, type:, object:)
|
53
|
+
query.trace("authorized_lazy", { context: query.context, type: type, object: object, path: query.context[:current_path] }) { super }
|
54
|
+
end
|
55
|
+
|
56
|
+
def resolve_type(query:, type:, object:)
|
57
|
+
query.trace("resolve_type", { context: query.context, type: type, object: object, path: query.context[:current_path] }) { super }
|
58
|
+
end
|
59
|
+
|
60
|
+
def resolve_type_lazy(query:, type:, object:)
|
61
|
+
query.trace("resolve_type_lazy", { context: query.context, type: type, object: object, path: query.context[:current_path] }) { super }
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -6,7 +6,6 @@ module GraphQL
|
|
6
6
|
# ActiveSupport::Notifications or Dry::Monitor::Notifications)
|
7
7
|
# with a `graphql` suffix.
|
8
8
|
module NotificationsTrace
|
9
|
-
include PlatformTrace
|
10
9
|
# Initialize a new NotificationsTracing instance
|
11
10
|
#
|
12
11
|
# @param engine [#instrument(key, metadata, block)] The notifications engine to use
|
@@ -36,6 +35,8 @@ module GraphQL
|
|
36
35
|
end
|
37
36
|
RUBY
|
38
37
|
end
|
38
|
+
|
39
|
+
include PlatformTrace
|
39
40
|
end
|
40
41
|
end
|
41
42
|
end
|
@@ -29,28 +29,30 @@ module GraphQL
|
|
29
29
|
child_class.instance_method(:platform_execute_field).arity != 1
|
30
30
|
|
31
31
|
[:execute_field, :execute_field_lazy].each do |field_trace_method|
|
32
|
-
child_class.
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
32
|
+
if !child_class.method_defined?(field_trace_method)
|
33
|
+
child_class.module_eval <<-RUBY, __FILE__, __LINE__
|
34
|
+
def #{field_trace_method}(query:, field:, ast_node:, arguments:, object:)
|
35
|
+
return_type = field.type.unwrap
|
36
|
+
trace_field = if return_type.kind.scalar? || return_type.kind.enum?
|
37
|
+
(field.trace.nil? && @trace_scalars) || field.trace
|
38
|
+
else
|
39
|
+
true
|
40
|
+
end
|
41
|
+
platform_key = if trace_field
|
42
|
+
@platform_field_key_cache[field]
|
43
|
+
else
|
44
|
+
nil
|
45
|
+
end
|
46
|
+
if platform_key && trace_field
|
47
|
+
platform_#{field_trace_method}(platform_key#{pass_data_to_execute_field ? ", { query: query, field: field, ast_node: ast_node, arguments: arguments, object: object }" : ""}) do
|
48
|
+
super
|
49
|
+
end
|
50
|
+
else
|
47
51
|
super
|
48
52
|
end
|
49
|
-
else
|
50
|
-
super
|
51
53
|
end
|
52
|
-
|
53
|
-
|
54
|
+
RUBY
|
55
|
+
end
|
54
56
|
end
|
55
57
|
|
56
58
|
|
@@ -5,7 +5,7 @@ module GraphQL
|
|
5
5
|
class PrometheusTracing < PlatformTracing
|
6
6
|
class GraphQLCollector < ::PrometheusExporter::Server::TypeCollector
|
7
7
|
def initialize
|
8
|
-
@graphql_gauge = PrometheusExporter::Metric::
|
8
|
+
@graphql_gauge = PrometheusExporter::Metric::Base.default_aggregation.new(
|
9
9
|
'graphql_duration_seconds',
|
10
10
|
'Time spent in GraphQL operations, in seconds'
|
11
11
|
)
|
@@ -0,0 +1,75 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module GraphQL
|
3
|
+
module Tracing
|
4
|
+
# This is the base class for a `trace` instance whose methods are called during query execution.
|
5
|
+
# "Trace modes" are subclasses of this with custom tracing modules mixed in.
|
6
|
+
#
|
7
|
+
# A trace module may implement any of the methods on `Trace`, being sure to call `super`
|
8
|
+
# to continue any tracing hooks and call the actual runtime behavior. See {GraphQL::Backtrace::Trace} for example.
|
9
|
+
#
|
10
|
+
class Trace
|
11
|
+
# @param multiplex [GraphQL::Execution::Multiplex, nil]
|
12
|
+
# @param query [GraphQL::Query, nil]
|
13
|
+
def initialize(multiplex: nil, query: nil, **_options)
|
14
|
+
@multiplex = multiplex
|
15
|
+
@query = query
|
16
|
+
end
|
17
|
+
|
18
|
+
def lex(query_string:)
|
19
|
+
yield
|
20
|
+
end
|
21
|
+
|
22
|
+
def parse(query_string:)
|
23
|
+
yield
|
24
|
+
end
|
25
|
+
|
26
|
+
def validate(query:, validate:)
|
27
|
+
yield
|
28
|
+
end
|
29
|
+
|
30
|
+
def analyze_multiplex(multiplex:)
|
31
|
+
yield
|
32
|
+
end
|
33
|
+
|
34
|
+
def analyze_query(query:)
|
35
|
+
yield
|
36
|
+
end
|
37
|
+
|
38
|
+
def execute_multiplex(multiplex:)
|
39
|
+
yield
|
40
|
+
end
|
41
|
+
|
42
|
+
def execute_query(query:)
|
43
|
+
yield
|
44
|
+
end
|
45
|
+
|
46
|
+
def execute_query_lazy(query:, multiplex:)
|
47
|
+
yield
|
48
|
+
end
|
49
|
+
|
50
|
+
def execute_field(field:, query:, ast_node:, arguments:, object:)
|
51
|
+
yield
|
52
|
+
end
|
53
|
+
|
54
|
+
def execute_field_lazy(field:, query:, ast_node:, arguments:, object:)
|
55
|
+
yield
|
56
|
+
end
|
57
|
+
|
58
|
+
def authorized(query:, type:, object:)
|
59
|
+
yield
|
60
|
+
end
|
61
|
+
|
62
|
+
def authorized_lazy(query:, type:, object:)
|
63
|
+
yield
|
64
|
+
end
|
65
|
+
|
66
|
+
def resolve_type(query:, type:, object:)
|
67
|
+
yield
|
68
|
+
end
|
69
|
+
|
70
|
+
def resolve_type_lazy(query:, type:, object:)
|
71
|
+
yield
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
data/lib/graphql/tracing.rb
CHANGED
@@ -1,4 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
require "graphql/tracing/trace"
|
3
|
+
require "graphql/tracing/legacy_trace"
|
4
|
+
|
2
5
|
# Legacy tracing:
|
3
6
|
require "graphql/tracing/active_support_notifications_tracing"
|
4
7
|
require "graphql/tracing/platform_tracing"
|
@@ -26,131 +29,8 @@ end
|
|
26
29
|
|
27
30
|
module GraphQL
|
28
31
|
module Tracing
|
29
|
-
class Trace
|
30
|
-
# @param multiplex [GraphQL::Execution::Multiplex, nil]
|
31
|
-
# @param query [GraphQL::Query, nil]
|
32
|
-
def initialize(multiplex: nil, query: nil, **_options)
|
33
|
-
@multiplex = multiplex
|
34
|
-
@query = query
|
35
|
-
end
|
36
|
-
|
37
|
-
def lex(query_string:)
|
38
|
-
yield
|
39
|
-
end
|
40
|
-
|
41
|
-
def parse(query_string:)
|
42
|
-
yield
|
43
|
-
end
|
44
|
-
|
45
|
-
def validate(query:, validate:)
|
46
|
-
yield
|
47
|
-
end
|
48
|
-
|
49
|
-
def analyze_multiplex(multiplex:)
|
50
|
-
yield
|
51
|
-
end
|
52
|
-
|
53
|
-
def analyze_query(query:)
|
54
|
-
yield
|
55
|
-
end
|
56
|
-
|
57
|
-
def execute_multiplex(multiplex:)
|
58
|
-
yield
|
59
|
-
end
|
60
|
-
|
61
|
-
def execute_query(query:)
|
62
|
-
yield
|
63
|
-
end
|
64
|
-
|
65
|
-
def execute_query_lazy(query:, multiplex:)
|
66
|
-
yield
|
67
|
-
end
|
68
|
-
|
69
|
-
def execute_field(field:, query:, ast_node:, arguments:, object:)
|
70
|
-
yield
|
71
|
-
end
|
72
|
-
|
73
|
-
def execute_field_lazy(field:, query:, ast_node:, arguments:, object:)
|
74
|
-
yield
|
75
|
-
end
|
76
|
-
|
77
|
-
def authorized(query:, type:, object:)
|
78
|
-
yield
|
79
|
-
end
|
80
|
-
|
81
|
-
def authorized_lazy(query:, type:, object:)
|
82
|
-
yield
|
83
|
-
end
|
84
|
-
|
85
|
-
def resolve_type(query:, type:, object:)
|
86
|
-
yield
|
87
|
-
end
|
88
|
-
|
89
|
-
def resolve_type_lazy(query:, type:, object:)
|
90
|
-
yield
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
32
|
NullTrace = Trace.new
|
95
33
|
|
96
|
-
class LegacyTrace < Trace
|
97
|
-
def lex(query_string:, &block)
|
98
|
-
(@multiplex || @query).trace("lex", { query_string: query_string }, &block)
|
99
|
-
end
|
100
|
-
|
101
|
-
def parse(query_string:, &block)
|
102
|
-
(@multiplex || @query).trace("parse", { query_string: query_string }, &block)
|
103
|
-
end
|
104
|
-
|
105
|
-
def validate(query:, validate:, &block)
|
106
|
-
query.trace("validate", { validate: validate, query: query }, &block)
|
107
|
-
end
|
108
|
-
|
109
|
-
def analyze_multiplex(multiplex:, &block)
|
110
|
-
multiplex.trace("analyze_multiplex", { multiplex: multiplex }, &block)
|
111
|
-
end
|
112
|
-
|
113
|
-
def analyze_query(query:, &block)
|
114
|
-
query.trace("analyze_query", { query: query }, &block)
|
115
|
-
end
|
116
|
-
|
117
|
-
def execute_multiplex(multiplex:, &block)
|
118
|
-
multiplex.trace("execute_multiplex", { multiplex: multiplex }, &block)
|
119
|
-
end
|
120
|
-
|
121
|
-
def execute_query(query:, &block)
|
122
|
-
query.trace("execute_query", { query: query }, &block)
|
123
|
-
end
|
124
|
-
|
125
|
-
def execute_query_lazy(query:, multiplex:, &block)
|
126
|
-
multiplex.trace("execute_query_lazy", { multiplex: multiplex, query: query }, &block)
|
127
|
-
end
|
128
|
-
|
129
|
-
def execute_field(field:, query:, ast_node:, arguments:, object:, &block)
|
130
|
-
query.trace("execute_field", { field: field, query: query, ast_node: ast_node, arguments: arguments, object: object, owner: field.owner, path: query.context[:current_path] }, &block)
|
131
|
-
end
|
132
|
-
|
133
|
-
def execute_field_lazy(field:, query:, ast_node:, arguments:, object:, &block)
|
134
|
-
query.trace("execute_field_lazy", { field: field, query: query, ast_node: ast_node, arguments: arguments, object: object, owner: field.owner, path: query.context[:current_path] }, &block)
|
135
|
-
end
|
136
|
-
|
137
|
-
def authorized(query:, type:, object:, &block)
|
138
|
-
query.trace("authorized", { context: query.context, type: type, object: object, path: query.context[:current_path] }, &block)
|
139
|
-
end
|
140
|
-
|
141
|
-
def authorized_lazy(query:, type:, object:, &block)
|
142
|
-
query.trace("authorized_lazy", { context: query.context, type: type, object: object, path: query.context[:current_path] }, &block)
|
143
|
-
end
|
144
|
-
|
145
|
-
def resolve_type(query:, type:, object:, &block)
|
146
|
-
query.trace("resolve_type", { context: query.context, type: type, object: object, path: query.context[:current_path] }, &block)
|
147
|
-
end
|
148
|
-
|
149
|
-
def resolve_type_lazy(query:, type:, object:, &block)
|
150
|
-
query.trace("resolve_type_lazy", { context: query.context, type: type, object: object, path: query.context[:current_path] }, &block)
|
151
|
-
end
|
152
|
-
end
|
153
|
-
|
154
34
|
# Objects may include traceable to gain a `.trace(...)` method.
|
155
35
|
# The object must have a `@tracers` ivar of type `Array<<#trace(k, d, &b)>>`.
|
156
36
|
# @api private
|
data/lib/graphql/version.rb
CHANGED
data/lib/graphql.rb
CHANGED
@@ -69,6 +69,10 @@ This is probably a bug in GraphQL-Ruby, please report this error on GitHub: http
|
|
69
69
|
|
70
70
|
NOT_CONFIGURED = Object.new
|
71
71
|
private_constant :NOT_CONFIGURED
|
72
|
+
module EmptyObjects
|
73
|
+
EMPTY_HASH = {}.freeze
|
74
|
+
EMPTY_ARRAY = [].freeze
|
75
|
+
end
|
72
76
|
end
|
73
77
|
|
74
78
|
# Order matters for these:
|
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.0.
|
4
|
+
version: 2.0.21
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robert Mosolgo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-04-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: benchmark-ips
|
@@ -303,6 +303,7 @@ files:
|
|
303
303
|
- lib/graphql/backtrace.rb
|
304
304
|
- lib/graphql/backtrace/inspect_result.rb
|
305
305
|
- lib/graphql/backtrace/table.rb
|
306
|
+
- lib/graphql/backtrace/trace.rb
|
306
307
|
- lib/graphql/backtrace/traced_error.rb
|
307
308
|
- lib/graphql/backtrace/tracer.rb
|
308
309
|
- lib/graphql/coercion_error.rb
|
@@ -555,6 +556,7 @@ files:
|
|
555
556
|
- lib/graphql/tracing/appsignal_tracing.rb
|
556
557
|
- lib/graphql/tracing/data_dog_trace.rb
|
557
558
|
- lib/graphql/tracing/data_dog_tracing.rb
|
559
|
+
- lib/graphql/tracing/legacy_trace.rb
|
558
560
|
- lib/graphql/tracing/new_relic_trace.rb
|
559
561
|
- lib/graphql/tracing/new_relic_tracing.rb
|
560
562
|
- lib/graphql/tracing/notifications_trace.rb
|
@@ -568,6 +570,7 @@ files:
|
|
568
570
|
- lib/graphql/tracing/scout_tracing.rb
|
569
571
|
- lib/graphql/tracing/statsd_trace.rb
|
570
572
|
- lib/graphql/tracing/statsd_tracing.rb
|
573
|
+
- lib/graphql/tracing/trace.rb
|
571
574
|
- lib/graphql/type_kinds.rb
|
572
575
|
- lib/graphql/types.rb
|
573
576
|
- lib/graphql/types/big_int.rb
|