graphql 1.12.10 → 1.13.4
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.
- checksums.yaml +4 -4
- data/lib/generators/graphql/core.rb +3 -1
- data/lib/generators/graphql/install_generator.rb +9 -2
- data/lib/generators/graphql/mutation_generator.rb +1 -1
- data/lib/generators/graphql/object_generator.rb +2 -1
- data/lib/generators/graphql/relay.rb +19 -11
- data/lib/generators/graphql/templates/schema.erb +14 -2
- data/lib/generators/graphql/type_generator.rb +0 -1
- data/lib/graphql/analysis/ast/field_usage.rb +28 -1
- data/lib/graphql/analysis/ast/query_complexity.rb +10 -14
- data/lib/graphql/analysis/ast/visitor.rb +4 -4
- data/lib/graphql/backtrace/table.rb +15 -3
- data/lib/graphql/backtrace/tracer.rb +7 -4
- data/lib/graphql/base_type.rb +4 -2
- data/lib/graphql/boolean_type.rb +1 -1
- data/lib/graphql/dataloader/null_dataloader.rb +1 -0
- data/lib/graphql/dataloader/source.rb +50 -2
- data/lib/graphql/dataloader.rb +110 -41
- data/lib/graphql/define/instance_definable.rb +1 -1
- data/lib/graphql/deprecated_dsl.rb +11 -3
- data/lib/graphql/deprecation.rb +1 -5
- data/lib/graphql/directive/deprecated_directive.rb +1 -1
- data/lib/graphql/directive/include_directive.rb +1 -1
- data/lib/graphql/directive/skip_directive.rb +1 -1
- data/lib/graphql/directive.rb +0 -4
- data/lib/graphql/enum_type.rb +5 -1
- data/lib/graphql/execution/errors.rb +1 -0
- data/lib/graphql/execution/execute.rb +1 -1
- data/lib/graphql/execution/interpreter/arguments.rb +1 -1
- data/lib/graphql/execution/interpreter/arguments_cache.rb +5 -4
- data/lib/graphql/execution/interpreter/resolve.rb +6 -2
- data/lib/graphql/execution/interpreter/runtime.rb +513 -213
- data/lib/graphql/execution/interpreter.rb +4 -8
- data/lib/graphql/execution/lazy.rb +5 -1
- data/lib/graphql/execution/lookahead.rb +2 -2
- data/lib/graphql/execution/multiplex.rb +4 -1
- data/lib/graphql/float_type.rb +1 -1
- data/lib/graphql/id_type.rb +1 -1
- data/lib/graphql/int_type.rb +1 -1
- data/lib/graphql/integer_encoding_error.rb +18 -2
- data/lib/graphql/introspection/directive_type.rb +1 -1
- data/lib/graphql/introspection/entry_points.rb +2 -2
- data/lib/graphql/introspection/enum_value_type.rb +2 -2
- data/lib/graphql/introspection/field_type.rb +2 -2
- data/lib/graphql/introspection/input_value_type.rb +10 -4
- data/lib/graphql/introspection/schema_type.rb +3 -3
- data/lib/graphql/introspection/type_type.rb +10 -10
- data/lib/graphql/language/block_string.rb +2 -6
- data/lib/graphql/language/document_from_schema_definition.rb +10 -4
- data/lib/graphql/language/lexer.rb +0 -3
- data/lib/graphql/language/lexer.rl +0 -4
- data/lib/graphql/language/nodes.rb +13 -3
- data/lib/graphql/language/parser.rb +442 -434
- data/lib/graphql/language/parser.y +5 -4
- data/lib/graphql/language/printer.rb +6 -1
- data/lib/graphql/language/sanitized_printer.rb +5 -5
- data/lib/graphql/language/token.rb +0 -4
- data/lib/graphql/name_validator.rb +0 -4
- data/lib/graphql/pagination/active_record_relation_connection.rb +43 -6
- data/lib/graphql/pagination/connections.rb +40 -16
- data/lib/graphql/pagination/relation_connection.rb +57 -27
- data/lib/graphql/query/arguments.rb +1 -1
- data/lib/graphql/query/arguments_cache.rb +1 -1
- data/lib/graphql/query/context.rb +15 -2
- data/lib/graphql/query/literal_input.rb +1 -1
- data/lib/graphql/query/null_context.rb +12 -7
- data/lib/graphql/query/serial_execution/field_resolution.rb +1 -1
- data/lib/graphql/query/validation_pipeline.rb +1 -1
- data/lib/graphql/query/variables.rb +5 -1
- data/lib/graphql/query.rb +5 -1
- data/lib/graphql/relay/edges_instrumentation.rb +0 -1
- data/lib/graphql/relay/global_id_resolve.rb +1 -1
- data/lib/graphql/relay/page_info.rb +1 -1
- data/lib/graphql/rubocop/graphql/base_cop.rb +36 -0
- data/lib/graphql/rubocop/graphql/default_null_true.rb +43 -0
- data/lib/graphql/rubocop/graphql/default_required_true.rb +43 -0
- data/lib/graphql/rubocop.rb +4 -0
- data/lib/graphql/schema/addition.rb +247 -0
- data/lib/graphql/schema/argument.rb +103 -45
- data/lib/graphql/schema/build_from_definition.rb +13 -7
- data/lib/graphql/schema/directive/feature.rb +1 -1
- data/lib/graphql/schema/directive/flagged.rb +2 -2
- data/lib/graphql/schema/directive/include.rb +1 -1
- data/lib/graphql/schema/directive/skip.rb +1 -1
- data/lib/graphql/schema/directive/transform.rb +14 -2
- data/lib/graphql/schema/directive.rb +7 -3
- data/lib/graphql/schema/enum.rb +70 -11
- data/lib/graphql/schema/enum_value.rb +6 -0
- data/lib/graphql/schema/field/connection_extension.rb +1 -1
- data/lib/graphql/schema/field.rb +243 -81
- data/lib/graphql/schema/field_extension.rb +89 -2
- data/lib/graphql/schema/find_inherited_value.rb +1 -0
- data/lib/graphql/schema/finder.rb +5 -5
- data/lib/graphql/schema/input_object.rb +39 -29
- data/lib/graphql/schema/interface.rb +11 -20
- data/lib/graphql/schema/introspection_system.rb +1 -1
- data/lib/graphql/schema/list.rb +3 -1
- data/lib/graphql/schema/member/accepts_definition.rb +15 -3
- data/lib/graphql/schema/member/build_type.rb +1 -4
- data/lib/graphql/schema/member/cached_graphql_definition.rb +29 -2
- data/lib/graphql/schema/member/has_arguments.rb +145 -57
- data/lib/graphql/schema/member/has_deprecation_reason.rb +1 -1
- data/lib/graphql/schema/member/has_fields.rb +76 -18
- data/lib/graphql/schema/member/has_interfaces.rb +90 -0
- data/lib/graphql/schema/member.rb +1 -0
- data/lib/graphql/schema/non_null.rb +7 -1
- data/lib/graphql/schema/object.rb +10 -75
- data/lib/graphql/schema/printer.rb +12 -17
- data/lib/graphql/schema/relay_classic_mutation.rb +37 -3
- data/lib/graphql/schema/resolver/has_payload_type.rb +27 -2
- data/lib/graphql/schema/resolver.rb +75 -65
- data/lib/graphql/schema/scalar.rb +2 -0
- data/lib/graphql/schema/subscription.rb +36 -8
- data/lib/graphql/schema/traversal.rb +1 -1
- data/lib/graphql/schema/type_expression.rb +1 -1
- data/lib/graphql/schema/type_membership.rb +18 -4
- data/lib/graphql/schema/union.rb +8 -1
- data/lib/graphql/schema/validator/allow_blank_validator.rb +29 -0
- data/lib/graphql/schema/validator/allow_null_validator.rb +26 -0
- data/lib/graphql/schema/validator/exclusion_validator.rb +3 -1
- data/lib/graphql/schema/validator/format_validator.rb +4 -5
- data/lib/graphql/schema/validator/inclusion_validator.rb +3 -1
- data/lib/graphql/schema/validator/length_validator.rb +5 -3
- data/lib/graphql/schema/validator/numericality_validator.rb +13 -2
- data/lib/graphql/schema/validator/required_validator.rb +29 -15
- data/lib/graphql/schema/validator.rb +33 -25
- data/lib/graphql/schema/warden.rb +116 -52
- data/lib/graphql/schema.rb +162 -227
- data/lib/graphql/static_validation/all_rules.rb +1 -0
- data/lib/graphql/static_validation/base_visitor.rb +8 -5
- data/lib/graphql/static_validation/definition_dependencies.rb +0 -1
- data/lib/graphql/static_validation/error.rb +3 -1
- data/lib/graphql/static_validation/literal_validator.rb +1 -1
- data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +1 -1
- data/lib/graphql/static_validation/rules/fields_will_merge.rb +52 -26
- data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +25 -4
- data/lib/graphql/static_validation/rules/fragments_are_finite.rb +2 -2
- data/lib/graphql/static_validation/rules/query_root_exists.rb +17 -0
- data/lib/graphql/static_validation/rules/query_root_exists_error.rb +26 -0
- data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +3 -1
- data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +4 -4
- data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +13 -7
- data/lib/graphql/static_validation/validation_context.rb +8 -2
- data/lib/graphql/static_validation/validator.rb +15 -12
- data/lib/graphql/string_encoding_error.rb +13 -3
- data/lib/graphql/string_type.rb +1 -1
- data/lib/graphql/subscriptions/action_cable_subscriptions.rb +36 -6
- data/lib/graphql/subscriptions/event.rb +68 -31
- data/lib/graphql/subscriptions/serialize.rb +23 -3
- data/lib/graphql/subscriptions.rb +17 -19
- data/lib/graphql/tracing/active_support_notifications_tracing.rb +6 -20
- data/lib/graphql/tracing/appsignal_tracing.rb +15 -0
- data/lib/graphql/tracing/notifications_tracing.rb +59 -0
- data/lib/graphql/types/big_int.rb +5 -1
- data/lib/graphql/types/int.rb +1 -1
- data/lib/graphql/types/relay/connection_behaviors.rb +26 -9
- data/lib/graphql/types/relay/default_relay.rb +5 -1
- data/lib/graphql/types/relay/edge_behaviors.rb +13 -2
- data/lib/graphql/types/relay/has_node_field.rb +2 -2
- data/lib/graphql/types/relay/has_nodes_field.rb +2 -2
- data/lib/graphql/types/relay/node_field.rb +15 -4
- data/lib/graphql/types/relay/nodes_field.rb +14 -4
- data/lib/graphql/types/string.rb +1 -1
- data/lib/graphql/unauthorized_error.rb +1 -1
- data/lib/graphql/version.rb +1 -1
- data/lib/graphql.rb +10 -28
- data/readme.md +1 -4
- metadata +17 -21
- data/lib/graphql/execution/interpreter/hash_response.rb +0 -46
data/lib/graphql/dataloader.rb
CHANGED
|
@@ -23,23 +23,42 @@ module GraphQL
|
|
|
23
23
|
# end
|
|
24
24
|
#
|
|
25
25
|
class Dataloader
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
class << self
|
|
27
|
+
attr_accessor :default_nonblocking
|
|
28
28
|
end
|
|
29
29
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
30
|
+
AsyncDataloader = Class.new(self) { self.default_nonblocking = true }
|
|
31
|
+
|
|
32
|
+
def self.use(schema, nonblocking: nil)
|
|
33
|
+
schema.dataloader_class = if nonblocking
|
|
34
|
+
AsyncDataloader
|
|
35
|
+
else
|
|
36
|
+
self
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Call the block with a Dataloader instance,
|
|
41
|
+
# then run all enqueued jobs and return the result of the block.
|
|
42
|
+
def self.with_dataloading(&block)
|
|
43
|
+
dataloader = self.new
|
|
44
|
+
result = nil
|
|
45
|
+
dataloader.append_job {
|
|
46
|
+
result = block.call(dataloader)
|
|
41
47
|
}
|
|
48
|
+
dataloader.run
|
|
49
|
+
result
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def initialize(nonblocking: self.class.default_nonblocking)
|
|
53
|
+
@source_cache = Hash.new { |h, k| h[k] = {} }
|
|
42
54
|
@pending_jobs = []
|
|
55
|
+
if !nonblocking.nil?
|
|
56
|
+
@nonblocking = nonblocking
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def nonblocking?
|
|
61
|
+
@nonblocking
|
|
43
62
|
end
|
|
44
63
|
|
|
45
64
|
# Get a Source instance from this dataloader, for calling `.load(...)` or `.request(...)` on.
|
|
@@ -48,17 +67,25 @@ module GraphQL
|
|
|
48
67
|
# @param batch_parameters [Array<Object>]
|
|
49
68
|
# @return [GraphQL::Dataloader::Source] An instance of {source_class}, initialized with `self, *batch_parameters`,
|
|
50
69
|
# and cached for the lifetime of this {Multiplex}.
|
|
51
|
-
if RUBY_VERSION < "3"
|
|
52
|
-
def with(source_class, *
|
|
53
|
-
|
|
70
|
+
if RUBY_VERSION < "3" || RUBY_ENGINE != "ruby" # truffle-ruby wasn't doing well with the implementation below
|
|
71
|
+
def with(source_class, *batch_args)
|
|
72
|
+
batch_key = source_class.batch_key_for(*batch_args)
|
|
73
|
+
@source_cache[source_class][batch_key] ||= begin
|
|
74
|
+
source = source_class.new(*batch_args)
|
|
75
|
+
source.setup(self)
|
|
76
|
+
source
|
|
77
|
+
end
|
|
54
78
|
end
|
|
55
79
|
else
|
|
56
80
|
def with(source_class, *batch_args, **batch_kwargs)
|
|
57
|
-
|
|
58
|
-
@source_cache[source_class][
|
|
81
|
+
batch_key = source_class.batch_key_for(*batch_args, **batch_kwargs)
|
|
82
|
+
@source_cache[source_class][batch_key] ||= begin
|
|
83
|
+
source = source_class.new(*batch_args, **batch_kwargs)
|
|
84
|
+
source.setup(self)
|
|
85
|
+
source
|
|
86
|
+
end
|
|
59
87
|
end
|
|
60
88
|
end
|
|
61
|
-
|
|
62
89
|
# Tell the dataloader that this fiber is waiting for data.
|
|
63
90
|
#
|
|
64
91
|
# Dataloader will resume the fiber after the requested data has been loaded (by another Fiber).
|
|
@@ -77,8 +104,39 @@ module GraphQL
|
|
|
77
104
|
nil
|
|
78
105
|
end
|
|
79
106
|
|
|
107
|
+
# Use a self-contained queue for the work in the block.
|
|
108
|
+
def run_isolated
|
|
109
|
+
prev_queue = @pending_jobs
|
|
110
|
+
prev_pending_keys = {}
|
|
111
|
+
@source_cache.each do |source_class, batched_sources|
|
|
112
|
+
batched_sources.each do |batch_args, batched_source_instance|
|
|
113
|
+
if batched_source_instance.pending?
|
|
114
|
+
prev_pending_keys[batched_source_instance] = batched_source_instance.pending_keys.dup
|
|
115
|
+
batched_source_instance.pending_keys.clear
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
@pending_jobs = []
|
|
121
|
+
res = nil
|
|
122
|
+
# Make sure the block is inside a Fiber, so it can `Fiber.yield`
|
|
123
|
+
append_job {
|
|
124
|
+
res = yield
|
|
125
|
+
}
|
|
126
|
+
run
|
|
127
|
+
res
|
|
128
|
+
ensure
|
|
129
|
+
@pending_jobs = prev_queue
|
|
130
|
+
prev_pending_keys.each do |source_instance, pending_keys|
|
|
131
|
+
source_instance.pending_keys.concat(pending_keys)
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
|
|
80
135
|
# @api private Move along, move along
|
|
81
136
|
def run
|
|
137
|
+
if @nonblocking && !Fiber.scheduler
|
|
138
|
+
raise "`nonblocking: true` requires `Fiber.scheduler`, assign one with `Fiber.set_scheduler(...)` before executing GraphQL."
|
|
139
|
+
end
|
|
82
140
|
# At a high level, the algorithm is:
|
|
83
141
|
#
|
|
84
142
|
# A) Inside Fibers, run jobs from the queue one-by-one
|
|
@@ -99,6 +157,8 @@ module GraphQL
|
|
|
99
157
|
#
|
|
100
158
|
pending_fibers = []
|
|
101
159
|
next_fibers = []
|
|
160
|
+
pending_source_fibers = []
|
|
161
|
+
next_source_fibers = []
|
|
102
162
|
first_pass = true
|
|
103
163
|
|
|
104
164
|
while first_pass || (f = pending_fibers.shift)
|
|
@@ -136,33 +196,27 @@ module GraphQL
|
|
|
136
196
|
# This is where an evented approach would be even better -- can we tell which
|
|
137
197
|
# fibers are ready to continue, and continue execution there?
|
|
138
198
|
#
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
else
|
|
142
|
-
nil
|
|
199
|
+
if (first_source_fiber = create_source_fiber)
|
|
200
|
+
pending_source_fibers << first_source_fiber
|
|
143
201
|
end
|
|
144
202
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
# that newly-pending source will run _before_ the one that depends on it.
|
|
148
|
-
# (See below where the old fiber is pushed to the stack, then the new fiber is pushed on the stack.)
|
|
149
|
-
while (outer_source_fiber = source_fiber_stack.pop)
|
|
203
|
+
while pending_source_fibers.any?
|
|
204
|
+
while (outer_source_fiber = pending_source_fibers.pop)
|
|
150
205
|
resume(outer_source_fiber)
|
|
151
|
-
|
|
152
206
|
if outer_source_fiber.alive?
|
|
153
|
-
|
|
207
|
+
next_source_fibers << outer_source_fiber
|
|
154
208
|
end
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
if next_source_fiber
|
|
158
|
-
source_fiber_stack << next_source_fiber
|
|
209
|
+
if (next_source_fiber = create_source_fiber)
|
|
210
|
+
pending_source_fibers << next_source_fiber
|
|
159
211
|
end
|
|
160
212
|
end
|
|
213
|
+
join_queues(pending_source_fibers, next_source_fibers)
|
|
214
|
+
next_source_fibers.clear
|
|
161
215
|
end
|
|
162
216
|
# Move newly-enqueued Fibers on to the list to be resumed.
|
|
163
217
|
# Clear out the list of next-round Fibers, so that
|
|
164
218
|
# any Fibers that pause can be put on it.
|
|
165
|
-
pending_fibers
|
|
219
|
+
join_queues(pending_fibers, next_fibers)
|
|
166
220
|
next_fibers.clear
|
|
167
221
|
end
|
|
168
222
|
end
|
|
@@ -177,6 +231,14 @@ module GraphQL
|
|
|
177
231
|
nil
|
|
178
232
|
end
|
|
179
233
|
|
|
234
|
+
def join_queues(previous_queue, next_queue)
|
|
235
|
+
if @nonblocking
|
|
236
|
+
Fiber.scheduler.run
|
|
237
|
+
next_queue.select!(&:alive?)
|
|
238
|
+
end
|
|
239
|
+
previous_queue.concat(next_queue)
|
|
240
|
+
end
|
|
241
|
+
|
|
180
242
|
private
|
|
181
243
|
|
|
182
244
|
# If there are pending sources, return a fiber for running them.
|
|
@@ -224,16 +286,23 @@ module GraphQL
|
|
|
224
286
|
#
|
|
225
287
|
# @see https://github.com/rmosolgo/graphql-ruby/issues/3449
|
|
226
288
|
def spawn_fiber
|
|
227
|
-
fiber_locals = {}
|
|
289
|
+
fiber_locals = {}
|
|
228
290
|
|
|
229
291
|
Thread.current.keys.each do |fiber_var_key|
|
|
230
292
|
fiber_locals[fiber_var_key] = Thread.current[fiber_var_key]
|
|
231
|
-
end
|
|
293
|
+
end
|
|
232
294
|
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
295
|
+
if @nonblocking
|
|
296
|
+
Fiber.new(blocking: false) do
|
|
297
|
+
fiber_locals.each { |k, v| Thread.current[k] = v }
|
|
298
|
+
yield
|
|
299
|
+
end
|
|
300
|
+
else
|
|
301
|
+
Fiber.new do
|
|
302
|
+
fiber_locals.each { |k, v| Thread.current[k] = v }
|
|
303
|
+
yield
|
|
304
|
+
end
|
|
305
|
+
end
|
|
237
306
|
end
|
|
238
307
|
end
|
|
239
308
|
end
|
|
@@ -76,7 +76,7 @@ ERR
|
|
|
76
76
|
# Apply definition from `define(...)` kwargs
|
|
77
77
|
defn.define_keywords.each do |keyword, value|
|
|
78
78
|
# Don't splat string hashes, which blows up on Rubies before 2.7
|
|
79
|
-
if value.is_a?(Hash) && value.each_key.all? { |k| k.is_a?(Symbol) }
|
|
79
|
+
if value.is_a?(Hash) && !value.empty? && value.each_key.all? { |k| k.is_a?(Symbol) }
|
|
80
80
|
defn_proxy.public_send(keyword, **value)
|
|
81
81
|
else
|
|
82
82
|
defn_proxy.public_send(keyword, value)
|
|
@@ -38,9 +38,17 @@ module GraphQL
|
|
|
38
38
|
end
|
|
39
39
|
end
|
|
40
40
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
41
|
+
if defined?(::Refinement) && Refinement.private_method_defined?(:import_methods)
|
|
42
|
+
TYPE_CLASSES.each do |type_class|
|
|
43
|
+
refine type_class.singleton_class do
|
|
44
|
+
import_methods Methods
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
else
|
|
48
|
+
TYPE_CLASSES.each do |type_class|
|
|
49
|
+
refine type_class.singleton_class do
|
|
50
|
+
include Methods
|
|
51
|
+
end
|
|
44
52
|
end
|
|
45
53
|
end
|
|
46
54
|
end
|
data/lib/graphql/deprecation.rb
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
GraphQL::Directive::DeprecatedDirective = GraphQL::Schema::Directive::Deprecated.graphql_definition
|
|
2
|
+
GraphQL::Directive::DeprecatedDirective = GraphQL::Schema::Directive::Deprecated.graphql_definition(silence_deprecation_warning: true)
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
GraphQL::Directive::IncludeDirective = GraphQL::Schema::Directive::Include.graphql_definition
|
|
2
|
+
GraphQL::Directive::IncludeDirective = GraphQL::Schema::Directive::Include.graphql_definition(silence_deprecation_warning: true)
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
GraphQL::Directive::SkipDirective = GraphQL::Schema::Directive::Skip.graphql_definition
|
|
2
|
+
GraphQL::Directive::SkipDirective = GraphQL::Schema::Directive::Skip.graphql_definition(silence_deprecation_warning: true)
|
data/lib/graphql/directive.rb
CHANGED
data/lib/graphql/enum_type.rb
CHANGED
|
@@ -34,10 +34,14 @@ module GraphQL
|
|
|
34
34
|
end
|
|
35
35
|
|
|
36
36
|
# @return [Hash<String => EnumValue>] `{name => value}` pairs contained in this type
|
|
37
|
-
def values
|
|
37
|
+
def values(_context = nil)
|
|
38
38
|
@values_by_name
|
|
39
39
|
end
|
|
40
40
|
|
|
41
|
+
def enum_values(_context = nil)
|
|
42
|
+
values.values
|
|
43
|
+
end
|
|
44
|
+
|
|
41
45
|
def kind
|
|
42
46
|
GraphQL::TypeKinds::ENUM
|
|
43
47
|
end
|
|
@@ -111,6 +111,7 @@ module GraphQL
|
|
|
111
111
|
runtime_info = ctx.namespace(:interpreter) || {}
|
|
112
112
|
obj = runtime_info[:current_object]
|
|
113
113
|
args = runtime_info[:current_arguments]
|
|
114
|
+
args = args && args.keyword_arguments
|
|
114
115
|
field = runtime_info[:current_field]
|
|
115
116
|
if obj.is_a?(GraphQL::Schema::Object)
|
|
116
117
|
obj = obj.object
|
|
@@ -59,7 +59,7 @@ module GraphQL
|
|
|
59
59
|
@empty
|
|
60
60
|
end
|
|
61
61
|
|
|
62
|
-
def_delegators :keyword_arguments, :key?, :[], :fetch, :keys, :each, :values
|
|
62
|
+
def_delegators :keyword_arguments, :key?, :[], :fetch, :keys, :each, :values, :size, :to_h
|
|
63
63
|
def_delegators :argument_values, :each_value
|
|
64
64
|
|
|
65
65
|
def inspect
|
|
@@ -28,11 +28,12 @@ module GraphQL
|
|
|
28
28
|
end
|
|
29
29
|
|
|
30
30
|
def fetch(ast_node, argument_owner, parent_object)
|
|
31
|
-
@storage[ast_node][argument_owner][parent_object]
|
|
32
31
|
# If any jobs were enqueued, run them now,
|
|
33
32
|
# since this might have been called outside of execution.
|
|
34
33
|
# (The jobs are responsible for updating `result` in-place.)
|
|
35
|
-
@dataloader.
|
|
34
|
+
@dataloader.run_isolated do
|
|
35
|
+
@storage[ast_node][argument_owner][parent_object]
|
|
36
|
+
end
|
|
36
37
|
# Ack, the _hash_ is updated, but the key is eventually
|
|
37
38
|
# overridden with an immutable arguments instance.
|
|
38
39
|
# The first call queues up the job,
|
|
@@ -70,11 +71,11 @@ module GraphQL
|
|
|
70
71
|
when Array
|
|
71
72
|
ast_arg_or_hash_or_value.map { |v| prepare_args_hash(query, v) }
|
|
72
73
|
when GraphQL::Language::Nodes::Field, GraphQL::Language::Nodes::InputObject, GraphQL::Language::Nodes::Directive
|
|
73
|
-
if ast_arg_or_hash_or_value.arguments.empty?
|
|
74
|
+
if ast_arg_or_hash_or_value.arguments.empty? # rubocop:disable Development/ContextIsPassedCop -- AST-related
|
|
74
75
|
return NO_ARGUMENTS
|
|
75
76
|
end
|
|
76
77
|
args_hash = {}
|
|
77
|
-
ast_arg_or_hash_or_value.arguments.each do |arg|
|
|
78
|
+
ast_arg_or_hash_or_value.arguments.each do |arg| # rubocop:disable Development/ContextIsPassedCop -- AST-related
|
|
78
79
|
v = prepare_args_hash(query, arg.value)
|
|
79
80
|
if v != NO_VALUE_GIVEN
|
|
80
81
|
args_hash[arg.name] = v
|
|
@@ -34,7 +34,10 @@ module GraphQL
|
|
|
34
34
|
next_results = []
|
|
35
35
|
while results.any?
|
|
36
36
|
result_value = results.shift
|
|
37
|
-
if result_value.is_a?(Hash)
|
|
37
|
+
if result_value.is_a?(Runtime::GraphQLResultHash) || result_value.is_a?(Hash)
|
|
38
|
+
results.concat(result_value.values)
|
|
39
|
+
next
|
|
40
|
+
elsif result_value.is_a?(Runtime::GraphQLResultArray)
|
|
38
41
|
results.concat(result_value.values)
|
|
39
42
|
next
|
|
40
43
|
elsif result_value.is_a?(Array)
|
|
@@ -46,7 +49,8 @@ module GraphQL
|
|
|
46
49
|
# Since this field returned another lazy,
|
|
47
50
|
# add it to the same queue
|
|
48
51
|
results << loaded_value
|
|
49
|
-
elsif loaded_value.is_a?(
|
|
52
|
+
elsif loaded_value.is_a?(Runtime::GraphQLResultHash) || loaded_value.is_a?(Runtime::GraphQLResultArray) ||
|
|
53
|
+
loaded_value.is_a?(Hash) || loaded_value.is_a?(Array)
|
|
50
54
|
# Add these values in wholesale --
|
|
51
55
|
# they might be modified by later work in the dataloader.
|
|
52
56
|
next_results << loaded_value
|