graphql 1.12.10 → 1.12.11
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/graphql/backtrace/table.rb +14 -2
- data/lib/graphql/dataloader.rb +12 -14
- data/lib/graphql/execution/execute.rb +1 -1
- data/lib/graphql/execution/interpreter.rb +4 -8
- data/lib/graphql/execution/interpreter/runtime.rb +179 -156
- data/lib/graphql/introspection/schema_type.rb +1 -1
- data/lib/graphql/schema.rb +26 -200
- data/lib/graphql/schema/addition.rb +238 -0
- data/lib/graphql/schema/argument.rb +56 -39
- data/lib/graphql/schema/directive/transform.rb +13 -1
- data/lib/graphql/schema/resolver.rb +22 -2
- data/lib/graphql/version.rb +1 -1
- metadata +7 -7
- data/lib/graphql/execution/interpreter/hash_response.rb +0 -46
@@ -240,62 +240,79 @@ module GraphQL
|
|
240
240
|
def coerce_into_values(parent_object, values, context, argument_values)
|
241
241
|
arg_name = graphql_name
|
242
242
|
arg_key = keyword
|
243
|
-
has_value = false
|
244
243
|
default_used = false
|
244
|
+
|
245
245
|
if values.key?(arg_name)
|
246
|
-
has_value = true
|
247
246
|
value = values[arg_name]
|
248
247
|
elsif values.key?(arg_key)
|
249
|
-
has_value = true
|
250
248
|
value = values[arg_key]
|
251
249
|
elsif default_value?
|
252
|
-
has_value = true
|
253
250
|
value = default_value
|
254
251
|
default_used = true
|
252
|
+
else
|
253
|
+
# no value at all
|
254
|
+
owner.validate_directive_argument(self, nil)
|
255
|
+
return
|
255
256
|
end
|
256
257
|
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
end
|
258
|
+
loaded_value = nil
|
259
|
+
coerced_value = context.schema.error_handler.with_error_handling(context) do
|
260
|
+
type.coerce_input(value, context)
|
261
|
+
end
|
262
262
|
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
end
|
263
|
+
# TODO this should probably be inside after_lazy
|
264
|
+
if loads && !from_resolver?
|
265
|
+
loaded_value = if type.list?
|
266
|
+
loaded_values = coerced_value.map { |val| owner.load_application_object(self, loads, val, context) }
|
267
|
+
context.schema.after_any_lazies(loaded_values) { |result| result }
|
268
|
+
else
|
269
|
+
context.query.with_error_handling do
|
270
|
+
owner.load_application_object(self, loads, coerced_value, context)
|
272
271
|
end
|
273
272
|
end
|
273
|
+
end
|
274
274
|
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
275
|
+
coerced_value = if loaded_value
|
276
|
+
loaded_value
|
277
|
+
else
|
278
|
+
coerced_value
|
279
|
+
end
|
280
|
+
|
281
|
+
# If this isn't lazy, then the block returns eagerly and assigns the result here
|
282
|
+
# If it _is_ lazy, then we write the lazy to the hash, then update it later
|
283
|
+
argument_values[arg_key] = context.schema.after_lazy(coerced_value) do |coerced_value|
|
284
|
+
owner.validate_directive_argument(self, coerced_value)
|
285
|
+
prepared_value = context.schema.error_handler.with_error_handling(context) do
|
286
|
+
prepare_value(parent_object, coerced_value, context: context)
|
279
287
|
end
|
280
288
|
|
281
|
-
#
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
289
|
+
# TODO code smell to access such a deeply-nested constant in a distant module
|
290
|
+
argument_values[arg_key] = GraphQL::Execution::Interpreter::ArgumentValue.new(
|
291
|
+
value: prepared_value,
|
292
|
+
definition: self,
|
293
|
+
default_used: default_used,
|
294
|
+
)
|
295
|
+
end
|
296
|
+
end
|
288
297
|
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
298
|
+
# @api private
|
299
|
+
def validate_default_value
|
300
|
+
coerced_default_value = begin
|
301
|
+
type.coerce_isolated_result(default_value) unless default_value.nil?
|
302
|
+
rescue GraphQL::Schema::Enum::UnresolvedValueError
|
303
|
+
# It raises this, which is helpful at runtime, but not here...
|
304
|
+
default_value
|
305
|
+
end
|
306
|
+
res = type.valid_isolated_input?(coerced_default_value)
|
307
|
+
if !res
|
308
|
+
raise InvalidDefaultValueError.new(self)
|
309
|
+
end
|
310
|
+
end
|
311
|
+
|
312
|
+
class InvalidDefaultValueError < GraphQL::Error
|
313
|
+
def initialize(argument)
|
314
|
+
message = "`#{argument.path}` has an invalid default value: `#{argument.default_value.inspect}` isn't accepted by `#{argument.type.to_type_signature}`; update the default value or the argument type."
|
315
|
+
super(message)
|
299
316
|
end
|
300
317
|
end
|
301
318
|
|
@@ -39,7 +39,19 @@ module GraphQL
|
|
39
39
|
transform_name = arguments[:by]
|
40
40
|
if TRANSFORMS.include?(transform_name) && return_value.respond_to?(transform_name)
|
41
41
|
return_value = return_value.public_send(transform_name)
|
42
|
-
context.namespace(:interpreter)[:runtime].
|
42
|
+
response = context.namespace(:interpreter)[:runtime].response
|
43
|
+
*keys, last = path
|
44
|
+
keys.each do |key|
|
45
|
+
if response && (response = response[key])
|
46
|
+
next
|
47
|
+
else
|
48
|
+
break
|
49
|
+
end
|
50
|
+
end
|
51
|
+
if response
|
52
|
+
response[last] = return_value
|
53
|
+
end
|
54
|
+
nil
|
43
55
|
end
|
44
56
|
end
|
45
57
|
end
|
@@ -374,16 +374,36 @@ module GraphQL
|
|
374
374
|
# @param extension [Class] Extension class
|
375
375
|
# @param options [Hash] Optional extension options
|
376
376
|
def extension(extension, **options)
|
377
|
-
|
377
|
+
@own_extensions ||= []
|
378
|
+
@own_extensions << {extension => options}
|
378
379
|
end
|
379
380
|
|
380
381
|
# @api private
|
381
382
|
def extensions
|
382
|
-
|
383
|
+
own_exts = @own_extensions
|
384
|
+
# Jump through some hoops to avoid creating arrays when we don't actually need them
|
385
|
+
if superclass.respond_to?(:extensions)
|
386
|
+
s_exts = superclass.extensions
|
387
|
+
if own_exts
|
388
|
+
if s_exts.any?
|
389
|
+
own_exts + s_exts
|
390
|
+
else
|
391
|
+
own_exts
|
392
|
+
end
|
393
|
+
else
|
394
|
+
s_exts
|
395
|
+
end
|
396
|
+
else
|
397
|
+
own_exts || EMPTY_ARRAY
|
398
|
+
end
|
383
399
|
end
|
384
400
|
|
385
401
|
private
|
386
402
|
|
403
|
+
def own_extensions
|
404
|
+
@own_extensions
|
405
|
+
end
|
406
|
+
|
387
407
|
def own_arguments_loads_as_type
|
388
408
|
@own_arguments_loads_as_type ||= {}
|
389
409
|
end
|
data/lib/graphql/version.rb
CHANGED
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.12.
|
4
|
+
version: 1.12.11
|
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: 2021-05-
|
11
|
+
date: 2021-05-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: benchmark-ips
|
@@ -369,7 +369,6 @@ files:
|
|
369
369
|
- lib/graphql/execution/interpreter/arguments_cache.rb
|
370
370
|
- lib/graphql/execution/interpreter/execution_errors.rb
|
371
371
|
- lib/graphql/execution/interpreter/handles_raw_value.rb
|
372
|
-
- lib/graphql/execution/interpreter/hash_response.rb
|
373
372
|
- lib/graphql/execution/interpreter/resolve.rb
|
374
373
|
- lib/graphql/execution/interpreter/runtime.rb
|
375
374
|
- lib/graphql/execution/lazy.rb
|
@@ -485,6 +484,7 @@ files:
|
|
485
484
|
- lib/graphql/runtime_type_error.rb
|
486
485
|
- lib/graphql/scalar_type.rb
|
487
486
|
- lib/graphql/schema.rb
|
487
|
+
- lib/graphql/schema/addition.rb
|
488
488
|
- lib/graphql/schema/argument.rb
|
489
489
|
- lib/graphql/schema/base_64_bp.rb
|
490
490
|
- lib/graphql/schema/base_64_encoder.rb
|
@@ -699,7 +699,7 @@ metadata:
|
|
699
699
|
source_code_uri: https://github.com/rmosolgo/graphql-ruby
|
700
700
|
bug_tracker_uri: https://github.com/rmosolgo/graphql-ruby/issues
|
701
701
|
mailing_list_uri: https://tinyletter.com/graphql-ruby
|
702
|
-
post_install_message:
|
702
|
+
post_install_message:
|
703
703
|
rdoc_options: []
|
704
704
|
require_paths:
|
705
705
|
- lib
|
@@ -714,8 +714,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
714
714
|
- !ruby/object:Gem::Version
|
715
715
|
version: '0'
|
716
716
|
requirements: []
|
717
|
-
rubygems_version: 3.
|
718
|
-
signing_key:
|
717
|
+
rubygems_version: 3.1.4
|
718
|
+
signing_key:
|
719
719
|
specification_version: 4
|
720
720
|
summary: A GraphQL language and runtime for Ruby
|
721
721
|
test_files: []
|
@@ -1,46 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module GraphQL
|
4
|
-
module Execution
|
5
|
-
class Interpreter
|
6
|
-
# This response class handles `#write` by accumulating
|
7
|
-
# values into a Hash.
|
8
|
-
class HashResponse
|
9
|
-
def initialize
|
10
|
-
@result = {}
|
11
|
-
end
|
12
|
-
|
13
|
-
def final_value
|
14
|
-
@result
|
15
|
-
end
|
16
|
-
|
17
|
-
def inspect
|
18
|
-
"#<#{self.class.name} result=#{@result.inspect}>"
|
19
|
-
end
|
20
|
-
|
21
|
-
# Add `value` at `path`.
|
22
|
-
# @return [void]
|
23
|
-
def write(path, value)
|
24
|
-
if path.empty?
|
25
|
-
@result = value
|
26
|
-
elsif (write_target = @result)
|
27
|
-
i = 0
|
28
|
-
prefinal_steps = path.size - 1
|
29
|
-
# Use `while` to avoid a closure
|
30
|
-
while i < prefinal_steps
|
31
|
-
path_part = path[i]
|
32
|
-
i += 1
|
33
|
-
write_target = write_target[path_part]
|
34
|
-
end
|
35
|
-
path_part = path[i]
|
36
|
-
write_target[path_part] = value
|
37
|
-
else
|
38
|
-
# The response is completely nulled out
|
39
|
-
end
|
40
|
-
|
41
|
-
nil
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|