graphql 1.12.12 → 1.12.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 +4 -4
- data/lib/graphql/backtrace/table.rb +1 -1
- data/lib/graphql/backtrace/tracer.rb +1 -1
- data/lib/graphql/execution/interpreter.rb +3 -3
- data/lib/graphql/execution/interpreter/resolve.rb +6 -2
- data/lib/graphql/execution/interpreter/runtime.rb +144 -29
- data/lib/graphql/execution/lazy.rb +5 -1
- data/lib/graphql/schema/directive/transform.rb +1 -1
- data/lib/graphql/schema/enum.rb +10 -1
- data/lib/graphql/schema/input_object.rb +11 -15
- data/lib/graphql/schema/printer.rb +11 -16
- data/lib/graphql/schema/resolver.rb +6 -1
- data/lib/graphql/types/relay/has_node_field.rb +1 -1
- data/lib/graphql/types/relay/has_nodes_field.rb +1 -1
- data/lib/graphql/types/relay/node_field.rb +2 -2
- data/lib/graphql/types/relay/nodes_field.rb +2 -2
- data/lib/graphql/version.rb +1 -1
- data/readme.md +0 -3
- metadata +6 -34
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2cad71b0084305ae219dd00e6c6ed48871f126d90c38cf47b9708db1eaf1feb6
|
4
|
+
data.tar.gz: afe00c0b1f14134068015098392817c0c0f0841f8016863789d319590dc5a9ba
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8fc7bee0a1a2bdc836358338d41d56c394f495dcc78d17403c60efd47ae8f807ad447fcb96a9c270137fa247fde43b5936961436efb6d1276768f945bd5be077
|
7
|
+
data.tar.gz: a0da8f32b54df7b1254dac3749ffe1e9a9b2d93ec273313280d755b5c2bf3910880f2a13f4861d7efb0b2e39a5aefc63491918a89bcdfa223893769a0a9a1ddf
|
@@ -22,7 +22,7 @@ module GraphQL
|
|
22
22
|
when "execute_field", "execute_field_lazy"
|
23
23
|
query = metadata[:query] || raise(ArgumentError, "Add `legacy: true` to use GraphQL::Backtrace without the interpreter runtime.")
|
24
24
|
multiplex = query.multiplex
|
25
|
-
push_key = metadata[:path]
|
25
|
+
push_key = metadata[:path]
|
26
26
|
parent_frame = multiplex.context[:graphql_backtrace_contexts][push_key[0..-2]]
|
27
27
|
|
28
28
|
if parent_frame.is_a?(GraphQL::Query)
|
@@ -18,7 +18,7 @@ module GraphQL
|
|
18
18
|
def execute(_operation, _root_type, query)
|
19
19
|
runtime = evaluate(query)
|
20
20
|
sync_lazies(query: query)
|
21
|
-
runtime.
|
21
|
+
runtime.final_result
|
22
22
|
end
|
23
23
|
|
24
24
|
def self.use(schema_class)
|
@@ -56,7 +56,7 @@ module GraphQL
|
|
56
56
|
|
57
57
|
def self.finish_query(query, _multiplex)
|
58
58
|
{
|
59
|
-
"data" => query.context.namespace(:interpreter)[:runtime].
|
59
|
+
"data" => query.context.namespace(:interpreter)[:runtime].final_result
|
60
60
|
}
|
61
61
|
end
|
62
62
|
|
@@ -87,7 +87,7 @@ module GraphQL
|
|
87
87
|
final_values = queries.map do |query|
|
88
88
|
runtime = query.context.namespace(:interpreter)[:runtime]
|
89
89
|
# it might not be present if the query has an error
|
90
|
-
runtime ? runtime.
|
90
|
+
runtime ? runtime.final_result : nil
|
91
91
|
end
|
92
92
|
final_values.compact!
|
93
93
|
tracer.trace("execute_query_lazy", {multiplex: multiplex, query: query}) do
|
@@ -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
|
@@ -10,8 +10,6 @@ module GraphQL
|
|
10
10
|
class Runtime
|
11
11
|
|
12
12
|
module GraphQLResult
|
13
|
-
# These methods are private concerns of GraphQL-Ruby,
|
14
|
-
# they aren't guaranteed to continue working in the future.
|
15
13
|
attr_accessor :graphql_dead, :graphql_parent, :graphql_result_name
|
16
14
|
# Although these are used by only one of the Result classes,
|
17
15
|
# it's handy to have the methods implemented on both (even though they just return `nil`)
|
@@ -20,9 +18,18 @@ module GraphQL
|
|
20
18
|
attr_accessor :graphql_non_null_field_names
|
21
19
|
# @return [nil, true]
|
22
20
|
attr_accessor :graphql_non_null_list_items
|
21
|
+
|
22
|
+
# @return [Hash] Plain-Ruby result data (`@graphql_metadata` contains Result wrapper objects)
|
23
|
+
attr_accessor :graphql_result_data
|
23
24
|
end
|
24
25
|
|
25
|
-
class GraphQLResultHash
|
26
|
+
class GraphQLResultHash
|
27
|
+
def initialize
|
28
|
+
# Jump through some hoops to avoid creating this duplicate hash if at all possible.
|
29
|
+
@graphql_metadata = nil
|
30
|
+
@graphql_result_data = {}
|
31
|
+
end
|
32
|
+
|
26
33
|
include GraphQLResult
|
27
34
|
|
28
35
|
attr_accessor :graphql_merged_into
|
@@ -39,12 +46,84 @@ module GraphQL
|
|
39
46
|
if (t = @graphql_merged_into)
|
40
47
|
t[key] = value
|
41
48
|
end
|
42
|
-
|
49
|
+
|
50
|
+
if value.respond_to?(:graphql_result_data)
|
51
|
+
@graphql_result_data[key] = value.graphql_result_data
|
52
|
+
# If we encounter some part of this response that requires metadata tracking,
|
53
|
+
# then create the metadata hash if necessary. It will be kept up-to-date after this.
|
54
|
+
(@graphql_metadata ||= @graphql_result_data.dup)[key] = value
|
55
|
+
else
|
56
|
+
@graphql_result_data[key] = value
|
57
|
+
# keep this up-to-date if it's been initialized
|
58
|
+
@graphql_metadata && @graphql_metadata[key] = value
|
59
|
+
end
|
60
|
+
|
61
|
+
value
|
62
|
+
end
|
63
|
+
|
64
|
+
def delete(key)
|
65
|
+
@graphql_metadata && @graphql_metadata.delete(key)
|
66
|
+
@graphql_result_data.delete(key)
|
67
|
+
end
|
68
|
+
|
69
|
+
def each
|
70
|
+
(@graphql_metadata || @graphql_result_data).each { |k, v| yield(k, v) }
|
71
|
+
end
|
72
|
+
|
73
|
+
def values
|
74
|
+
(@graphql_metadata || @graphql_result_data).values
|
75
|
+
end
|
76
|
+
|
77
|
+
def key?(k)
|
78
|
+
@graphql_result_data.key?(k)
|
79
|
+
end
|
80
|
+
|
81
|
+
def [](k)
|
82
|
+
(@graphql_metadata || @graphql_result_data)[k]
|
43
83
|
end
|
44
84
|
end
|
45
85
|
|
46
|
-
class GraphQLResultArray
|
86
|
+
class GraphQLResultArray
|
47
87
|
include GraphQLResult
|
88
|
+
|
89
|
+
def initialize
|
90
|
+
# Avoid this duplicate allocation if possible -
|
91
|
+
# but it will require some work to keep it up-to-date if it's created.
|
92
|
+
@graphql_metadata = nil
|
93
|
+
@graphql_result_data = []
|
94
|
+
end
|
95
|
+
|
96
|
+
def graphql_skip_at(index)
|
97
|
+
# Mark this index as dead. It's tricky because some indices may already be storing
|
98
|
+
# `Lazy`s. So the runtime is still holding indexes _before_ skipping,
|
99
|
+
# this object has to coordinate incoming writes to account for any already-skipped indices.
|
100
|
+
@skip_indices ||= []
|
101
|
+
@skip_indices << index
|
102
|
+
offset_by = @skip_indices.count { |skipped_idx| skipped_idx < index}
|
103
|
+
delete_at_index = index - offset_by
|
104
|
+
@graphql_metadata && @graphql_metadata.delete_at(delete_at_index)
|
105
|
+
@graphql_result_data.delete_at(delete_at_index)
|
106
|
+
end
|
107
|
+
|
108
|
+
def []=(idx, value)
|
109
|
+
if @skip_indices
|
110
|
+
offset_by = @skip_indices.count { |skipped_idx| skipped_idx < idx }
|
111
|
+
idx -= offset_by
|
112
|
+
end
|
113
|
+
if value.respond_to?(:graphql_result_data)
|
114
|
+
@graphql_result_data[idx] = value.graphql_result_data
|
115
|
+
(@graphql_metadata ||= @graphql_result_data.dup)[idx] = value
|
116
|
+
else
|
117
|
+
@graphql_result_data[idx] = value
|
118
|
+
@graphql_metadata && @graphql_metadata[idx] = value
|
119
|
+
end
|
120
|
+
|
121
|
+
value
|
122
|
+
end
|
123
|
+
|
124
|
+
def values
|
125
|
+
(@graphql_metadata || @graphql_result_data)
|
126
|
+
end
|
48
127
|
end
|
49
128
|
|
50
129
|
class GraphQLSelectionSet < Hash
|
@@ -60,9 +139,6 @@ module GraphQL
|
|
60
139
|
# @return [GraphQL::Query::Context]
|
61
140
|
attr_reader :context
|
62
141
|
|
63
|
-
# @return [Hash]
|
64
|
-
attr_reader :response
|
65
|
-
|
66
142
|
def initialize(query:)
|
67
143
|
@query = query
|
68
144
|
@dataloader = query.multiplex.dataloader
|
@@ -87,6 +163,10 @@ module GraphQL
|
|
87
163
|
@lazy_cache = {}
|
88
164
|
end
|
89
165
|
|
166
|
+
def final_result
|
167
|
+
@response && @response.graphql_result_data
|
168
|
+
end
|
169
|
+
|
90
170
|
def inspect
|
91
171
|
"#<#{self.class.name} response=#{@response.inspect}>"
|
92
172
|
end
|
@@ -167,7 +247,7 @@ module GraphQL
|
|
167
247
|
into_result[key] = value
|
168
248
|
else
|
169
249
|
case value
|
170
|
-
when
|
250
|
+
when GraphQLResultHash
|
171
251
|
deep_merge_selection_result(value, into_result[key])
|
172
252
|
else
|
173
253
|
# We have to assume that, since this passed the `fields_will_merge` selection,
|
@@ -439,15 +519,7 @@ module GraphQL
|
|
439
519
|
end
|
440
520
|
|
441
521
|
def dead_result?(selection_result)
|
442
|
-
|
443
|
-
while r
|
444
|
-
if r.graphql_dead
|
445
|
-
return true
|
446
|
-
else
|
447
|
-
r = r.graphql_parent
|
448
|
-
end
|
449
|
-
end
|
450
|
-
false
|
522
|
+
selection_result.graphql_dead || ((parent = selection_result.graphql_parent) && parent.graphql_dead)
|
451
523
|
end
|
452
524
|
|
453
525
|
def set_result(selection_result, result_name, value)
|
@@ -471,9 +543,7 @@ module GraphQL
|
|
471
543
|
@response = nil
|
472
544
|
else
|
473
545
|
set_result(parent, name_in_parent, nil)
|
474
|
-
|
475
|
-
# a `nil`, it's marked dead. TODO: check the spec, is there a reason for this?
|
476
|
-
parent.graphql_dead = true
|
546
|
+
set_graphql_dead(selection_result)
|
477
547
|
end
|
478
548
|
else
|
479
549
|
selection_result[result_name] = value
|
@@ -481,6 +551,21 @@ module GraphQL
|
|
481
551
|
end
|
482
552
|
end
|
483
553
|
|
554
|
+
# Mark this node and any already-registered children as dead,
|
555
|
+
# so that it accepts no more writes.
|
556
|
+
def set_graphql_dead(selection_result)
|
557
|
+
case selection_result
|
558
|
+
when GraphQLResultArray
|
559
|
+
selection_result.graphql_dead = true
|
560
|
+
selection_result.values.each { |v| set_graphql_dead(v) }
|
561
|
+
when GraphQLResultHash
|
562
|
+
selection_result.graphql_dead = true
|
563
|
+
selection_result.each { |k, v| set_graphql_dead(v) }
|
564
|
+
else
|
565
|
+
# It's a scalar, no way to mark it dead.
|
566
|
+
end
|
567
|
+
end
|
568
|
+
|
484
569
|
HALT = Object.new
|
485
570
|
def continue_value(path, value, parent_type, field, is_non_null, ast_node, result_name, selection_result) # rubocop:disable Metrics/ParameterLists
|
486
571
|
case value
|
@@ -500,11 +585,13 @@ module GraphQL
|
|
500
585
|
# to avoid the overhead of checking three different classes
|
501
586
|
# every time.
|
502
587
|
if value.is_a?(GraphQL::ExecutionError)
|
503
|
-
if !dead_result?(selection_result)
|
588
|
+
if selection_result.nil? || !dead_result?(selection_result)
|
504
589
|
value.path ||= path
|
505
590
|
value.ast_node ||= ast_node
|
506
591
|
context.errors << value
|
507
|
-
|
592
|
+
if selection_result
|
593
|
+
set_result(selection_result, result_name, nil)
|
594
|
+
end
|
508
595
|
end
|
509
596
|
HALT
|
510
597
|
elsif value.is_a?(GraphQL::UnauthorizedError)
|
@@ -517,6 +604,17 @@ module GraphQL
|
|
517
604
|
end
|
518
605
|
continue_value(path, next_value, parent_type, field, is_non_null, ast_node, result_name, selection_result)
|
519
606
|
elsif GraphQL::Execution::Execute::SKIP == value
|
607
|
+
# It's possible a lazy was already written here
|
608
|
+
case selection_result
|
609
|
+
when GraphQLResultHash
|
610
|
+
selection_result.delete(result_name)
|
611
|
+
when GraphQLResultArray
|
612
|
+
selection_result.graphql_skip_at(result_name)
|
613
|
+
when nil
|
614
|
+
# this can happen with directives
|
615
|
+
else
|
616
|
+
raise "Invariant: unexpected result class #{selection_result.class} (#{selection_result.inspect})"
|
617
|
+
end
|
520
618
|
HALT
|
521
619
|
else
|
522
620
|
# What could this actually _be_? Anyhow,
|
@@ -526,13 +624,15 @@ module GraphQL
|
|
526
624
|
when Array
|
527
625
|
# It's an array full of execution errors; add them all.
|
528
626
|
if value.any? && value.all? { |v| v.is_a?(GraphQL::ExecutionError) }
|
529
|
-
if !dead_result?(selection_result)
|
627
|
+
if selection_result.nil? || !dead_result?(selection_result)
|
530
628
|
value.each_with_index do |error, index|
|
531
629
|
error.ast_node ||= ast_node
|
532
|
-
error.path ||= path + (field.type.list? ? [index] : [])
|
630
|
+
error.path ||= path + ((field && field.type.list?) ? [index] : [])
|
533
631
|
context.errors << error
|
534
632
|
end
|
535
|
-
|
633
|
+
if selection_result
|
634
|
+
set_result(selection_result, result_name, nil)
|
635
|
+
end
|
536
636
|
end
|
537
637
|
HALT
|
538
638
|
else
|
@@ -689,9 +789,24 @@ module GraphQL
|
|
689
789
|
if !dir_defn.is_a?(Class)
|
690
790
|
dir_defn = dir_defn.type_class || raise("Only class-based directives are supported (not `@#{dir_node.name}`)")
|
691
791
|
end
|
692
|
-
|
693
|
-
|
694
|
-
|
792
|
+
raw_dir_args = arguments(nil, dir_defn, dir_node)
|
793
|
+
dir_args = continue_value(
|
794
|
+
@context[:current_path], # path
|
795
|
+
raw_dir_args, # value
|
796
|
+
dir_defn, # parent_type
|
797
|
+
nil, # field
|
798
|
+
false, # is_non_null
|
799
|
+
dir_node, # ast_node
|
800
|
+
nil, # result_name
|
801
|
+
nil, # selection_result
|
802
|
+
)
|
803
|
+
|
804
|
+
if dir_args == HALT
|
805
|
+
nil
|
806
|
+
else
|
807
|
+
dir_defn.resolve(object, dir_args, context) do
|
808
|
+
run_directive(object, directives, idx + 1, &block)
|
809
|
+
end
|
695
810
|
end
|
696
811
|
end
|
697
812
|
end
|
@@ -48,7 +48,11 @@ module GraphQL
|
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
51
|
-
|
51
|
+
# `SKIP` was made into a subclass of `GraphQL::Error` to improve runtime performance
|
52
|
+
# (fewer clauses in a hot `case` block), but now it requires special handling here.
|
53
|
+
# I think it's still worth it for the performance win, but if the number of special
|
54
|
+
# cases grows, then maybe it's worth rethinking somehow.
|
55
|
+
if @value.is_a?(StandardError) && @value != GraphQL::Execution::Execute::SKIP
|
52
56
|
raise @value
|
53
57
|
else
|
54
58
|
@value
|
@@ -39,7 +39,7 @@ 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
|
-
response = context.namespace(:interpreter)[:runtime].
|
42
|
+
response = context.namespace(:interpreter)[:runtime].final_result
|
43
43
|
*keys, last = path
|
44
44
|
keys.each do |key|
|
45
45
|
if response && (response = response[key])
|
data/lib/graphql/schema/enum.rb
CHANGED
@@ -24,6 +24,15 @@ module GraphQL
|
|
24
24
|
extend GraphQL::Schema::Member::ValidatesInput
|
25
25
|
|
26
26
|
class UnresolvedValueError < GraphQL::EnumType::UnresolvedValueError
|
27
|
+
def initialize(value:, enum:, context:)
|
28
|
+
fix_message = ", but this isn't a valid value for `#{enum.graphql_name}`. Update the field or resolver to return one of `#{enum.graphql_name}`'s values instead."
|
29
|
+
message = if (cp = context[:current_path]) && (cf = context[:current_field])
|
30
|
+
"`#{cf.path}` returned `#{value.inspect}` at `#{cp.join(".")}`#{fix_message}"
|
31
|
+
else
|
32
|
+
"`#{value.inspect}` was returned for `#{enum.graphql_name}`#{fix_message}"
|
33
|
+
end
|
34
|
+
super(message)
|
35
|
+
end
|
27
36
|
end
|
28
37
|
|
29
38
|
class << self
|
@@ -100,7 +109,7 @@ module GraphQL
|
|
100
109
|
if enum_value
|
101
110
|
enum_value.graphql_name
|
102
111
|
else
|
103
|
-
raise
|
112
|
+
raise self::UnresolvedValueError.new(enum: self, value: value, context: ctx)
|
104
113
|
end
|
105
114
|
end
|
106
115
|
|
@@ -11,6 +11,14 @@ module GraphQL
|
|
11
11
|
|
12
12
|
include GraphQL::Dig
|
13
13
|
|
14
|
+
# @return [GraphQL::Query::Context] The context for this query
|
15
|
+
attr_reader :context
|
16
|
+
# @return [GraphQL::Query::Arguments, GraphQL::Execution::Interpereter::Arguments] The underlying arguments instance
|
17
|
+
attr_reader :arguments
|
18
|
+
|
19
|
+
# Ruby-like hash behaviors, read-only
|
20
|
+
def_delegators :@ruby_style_hash, :keys, :values, :each, :map, :any?, :empty?
|
21
|
+
|
14
22
|
def initialize(arguments = nil, ruby_kwargs: nil, context:, defaults_used:)
|
15
23
|
@context = context
|
16
24
|
if ruby_kwargs
|
@@ -54,19 +62,8 @@ module GraphQL
|
|
54
62
|
@maybe_lazies = maybe_lazies
|
55
63
|
end
|
56
64
|
|
57
|
-
# @return [GraphQL::Query::Context] The context for this query
|
58
|
-
attr_reader :context
|
59
|
-
|
60
|
-
# @return [GraphQL::Query::Arguments, GraphQL::Execution::Interpereter::Arguments] The underlying arguments instance
|
61
|
-
attr_reader :arguments
|
62
|
-
|
63
|
-
# Ruby-like hash behaviors, read-only
|
64
|
-
def_delegators :@ruby_style_hash, :keys, :values, :each, :map, :any?, :empty?
|
65
|
-
|
66
65
|
def to_h
|
67
|
-
@ruby_style_hash
|
68
|
-
h.merge(key => unwrap_value(value))
|
69
|
-
end
|
66
|
+
unwrap_value(@ruby_style_hash)
|
70
67
|
end
|
71
68
|
|
72
69
|
def to_hash
|
@@ -91,8 +88,8 @@ module GraphQL
|
|
91
88
|
when Array
|
92
89
|
value.map { |item| unwrap_value(item) }
|
93
90
|
when Hash
|
94
|
-
value.
|
95
|
-
h.merge(key => unwrap_value(value))
|
91
|
+
value.reduce({}) do |h, (key, value)|
|
92
|
+
h.merge!(key => unwrap_value(value))
|
96
93
|
end
|
97
94
|
when InputObject
|
98
95
|
value.to_h
|
@@ -162,7 +159,6 @@ module GraphQL
|
|
162
159
|
# @api private
|
163
160
|
INVALID_OBJECT_MESSAGE = "Expected %{object} to be a key-value object responding to `to_h` or `to_unsafe_h`."
|
164
161
|
|
165
|
-
|
166
162
|
def validate_non_null_input(input, ctx)
|
167
163
|
result = GraphQL::Query::InputValidationResult.new
|
168
164
|
|
@@ -4,37 +4,32 @@ module GraphQL
|
|
4
4
|
# Used to convert your {GraphQL::Schema} to a GraphQL schema string
|
5
5
|
#
|
6
6
|
# @example print your schema to standard output (via helper)
|
7
|
-
# MySchema = GraphQL::Schema.define(query: QueryType)
|
8
7
|
# puts GraphQL::Schema::Printer.print_schema(MySchema)
|
9
8
|
#
|
10
9
|
# @example print your schema to standard output
|
11
|
-
# MySchema = GraphQL::Schema.define(query: QueryType)
|
12
10
|
# puts GraphQL::Schema::Printer.new(MySchema).print_schema
|
13
11
|
#
|
14
12
|
# @example print a single type to standard output
|
15
|
-
#
|
16
|
-
# name "Query"
|
13
|
+
# class Types::Query < GraphQL::Schema::Object
|
17
14
|
# description "The query root of this schema"
|
18
15
|
#
|
19
|
-
# field :post
|
20
|
-
# type post_type
|
21
|
-
# resolve ->(obj, args, ctx) { Post.find(args["id"]) }
|
22
|
-
# end
|
16
|
+
# field :post, Types::Post, null: true
|
23
17
|
# end
|
24
18
|
#
|
25
|
-
#
|
26
|
-
# name "Post"
|
19
|
+
# class Types::Post < GraphQL::Schema::Object
|
27
20
|
# description "A blog post"
|
28
21
|
#
|
29
|
-
# field :id,
|
30
|
-
# field :title,
|
31
|
-
# field :body,
|
22
|
+
# field :id, ID, null: false
|
23
|
+
# field :title, String, null: false
|
24
|
+
# field :body, String, null: false
|
32
25
|
# end
|
33
26
|
#
|
34
|
-
# MySchema
|
27
|
+
# class MySchema < GraphQL::Schema
|
28
|
+
# query(Types::Query)
|
29
|
+
# end
|
35
30
|
#
|
36
31
|
# printer = GraphQL::Schema::Printer.new(MySchema)
|
37
|
-
# puts printer.print_type(
|
32
|
+
# puts printer.print_type(Types::Post)
|
38
33
|
#
|
39
34
|
class Printer < GraphQL::Language::Printer
|
40
35
|
attr_reader :schema, :warden
|
@@ -87,7 +82,7 @@ module GraphQL
|
|
87
82
|
|
88
83
|
# Return a GraphQL schema string for the defined types in the schema
|
89
84
|
def print_schema
|
90
|
-
print(@document)
|
85
|
+
print(@document) + "\n"
|
91
86
|
end
|
92
87
|
|
93
88
|
def print_type(type)
|
@@ -307,10 +307,15 @@ module GraphQL
|
|
307
307
|
arguments: arguments,
|
308
308
|
null: null,
|
309
309
|
complexity: complexity,
|
310
|
-
extensions: extensions,
|
311
310
|
broadcastable: broadcastable?,
|
312
311
|
}
|
313
312
|
|
313
|
+
# If there aren't any, then the returned array is `[].freeze`,
|
314
|
+
# but passing that along breaks some user code.
|
315
|
+
if (exts = extensions).any?
|
316
|
+
field_opts[:extensions] = exts
|
317
|
+
end
|
318
|
+
|
314
319
|
if has_max_page_size?
|
315
320
|
field_opts[:max_page_size] = max_page_size
|
316
321
|
end
|
@@ -3,6 +3,7 @@
|
|
3
3
|
module GraphQL
|
4
4
|
module Types
|
5
5
|
module Relay
|
6
|
+
# Include this module to your root Query type to get a Relay-compliant `node(id: ID!): Node` field that uses the schema's `object_from_id` hook.
|
6
7
|
module HasNodeField
|
7
8
|
def self.included(child_class)
|
8
9
|
child_class.field(**field_options, &field_block)
|
@@ -12,7 +13,6 @@ module GraphQL
|
|
12
13
|
def field_options
|
13
14
|
{
|
14
15
|
name: "node",
|
15
|
-
owner: nil,
|
16
16
|
type: GraphQL::Types::Relay::Node,
|
17
17
|
null: true,
|
18
18
|
description: "Fetches an object given its ID.",
|
@@ -3,6 +3,7 @@
|
|
3
3
|
module GraphQL
|
4
4
|
module Types
|
5
5
|
module Relay
|
6
|
+
# Include this module to your root Query type to get a Relay-style `nodes(id: ID!): [Node]` field that uses the schema's `object_from_id` hook.
|
6
7
|
module HasNodesField
|
7
8
|
def self.included(child_class)
|
8
9
|
child_class.field(**field_options, &field_block)
|
@@ -12,7 +13,6 @@ module GraphQL
|
|
12
13
|
def field_options
|
13
14
|
{
|
14
15
|
name: "nodes",
|
15
|
-
owner: nil,
|
16
16
|
type: [GraphQL::Types::Relay::Node, null: true],
|
17
17
|
null: false,
|
18
18
|
description: "Fetches a list of objects given a list of IDs.",
|
@@ -6,7 +6,7 @@ module GraphQL
|
|
6
6
|
# or use it for inspiration for your own field definition.
|
7
7
|
#
|
8
8
|
# @example Adding this field directly
|
9
|
-
#
|
9
|
+
# include GraphQL::Types::Relay::HasNodeField
|
10
10
|
#
|
11
11
|
# @example Implementing a similar field in your own Query root
|
12
12
|
#
|
@@ -19,7 +19,7 @@ module GraphQL
|
|
19
19
|
# context.schema.object_from_id(id, context)
|
20
20
|
# end
|
21
21
|
#
|
22
|
-
NodeField = GraphQL::Schema::Field.new(**HasNodeField.field_options, &HasNodeField.field_block)
|
22
|
+
NodeField = GraphQL::Schema::Field.new(owner: nil, **HasNodeField.field_options, &HasNodeField.field_block)
|
23
23
|
end
|
24
24
|
end
|
25
25
|
end
|
@@ -6,7 +6,7 @@ module GraphQL
|
|
6
6
|
# or use it for inspiration for your own field definition.
|
7
7
|
#
|
8
8
|
# @example Adding this field directly
|
9
|
-
#
|
9
|
+
# include GraphQL::Types::Relay::HasNodesField
|
10
10
|
#
|
11
11
|
# @example Implementing a similar field in your own Query root
|
12
12
|
#
|
@@ -21,7 +21,7 @@ module GraphQL
|
|
21
21
|
# end
|
22
22
|
# end
|
23
23
|
#
|
24
|
-
NodesField = GraphQL::Schema::Field.new(**HasNodesField.field_options, &HasNodesField.field_block)
|
24
|
+
NodesField = GraphQL::Schema::Field.new(owner: nil, **HasNodesField.field_options, &HasNodesField.field_block)
|
25
25
|
end
|
26
26
|
end
|
27
27
|
end
|
data/lib/graphql/version.rb
CHANGED
data/readme.md
CHANGED
@@ -2,9 +2,6 @@
|
|
2
2
|
|
3
3
|
[](https://github.com/rmosolgo/graphql-ruby/actions/workflows/ci.yaml)
|
4
4
|
[](https://rubygems.org/gems/graphql)
|
5
|
-
[](https://codeclimate.com/github/rmosolgo/graphql-ruby)
|
6
|
-
[](https://codeclimate.com/github/rmosolgo/graphql-ruby)
|
7
|
-
[](https://rmosolgo.github.io/react-badges/)
|
8
5
|
|
9
6
|
A Ruby implementation of [GraphQL](https://graphql.org/).
|
10
7
|
|
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.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: 2021-
|
11
|
+
date: 2021-06-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: benchmark-ips
|
@@ -24,20 +24,6 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: codeclimate-test-reporter
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - "~>"
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '0.4'
|
34
|
-
type: :development
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - "~>"
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '0.4'
|
41
27
|
- !ruby/object:Gem::Dependency
|
42
28
|
name: concurrent-ruby
|
43
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -150,20 +136,6 @@ dependencies:
|
|
150
136
|
- - '='
|
151
137
|
- !ruby/object:Gem::Version
|
152
138
|
version: '0.68'
|
153
|
-
- !ruby/object:Gem::Dependency
|
154
|
-
name: stackprof
|
155
|
-
requirement: !ruby/object:Gem::Requirement
|
156
|
-
requirements:
|
157
|
-
- - ">="
|
158
|
-
- !ruby/object:Gem::Version
|
159
|
-
version: '0'
|
160
|
-
type: :development
|
161
|
-
prerelease: false
|
162
|
-
version_requirements: !ruby/object:Gem::Requirement
|
163
|
-
requirements:
|
164
|
-
- - ">="
|
165
|
-
- !ruby/object:Gem::Version
|
166
|
-
version: '0'
|
167
139
|
- !ruby/object:Gem::Dependency
|
168
140
|
name: parser
|
169
141
|
requirement: !ruby/object:Gem::Requirement
|
@@ -713,7 +685,7 @@ metadata:
|
|
713
685
|
source_code_uri: https://github.com/rmosolgo/graphql-ruby
|
714
686
|
bug_tracker_uri: https://github.com/rmosolgo/graphql-ruby/issues
|
715
687
|
mailing_list_uri: https://tinyletter.com/graphql-ruby
|
716
|
-
post_install_message:
|
688
|
+
post_install_message:
|
717
689
|
rdoc_options: []
|
718
690
|
require_paths:
|
719
691
|
- lib
|
@@ -728,8 +700,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
728
700
|
- !ruby/object:Gem::Version
|
729
701
|
version: '0'
|
730
702
|
requirements: []
|
731
|
-
rubygems_version: 3.
|
732
|
-
signing_key:
|
703
|
+
rubygems_version: 3.2.15
|
704
|
+
signing_key:
|
733
705
|
specification_version: 4
|
734
706
|
summary: A GraphQL language and runtime for Ruby
|
735
707
|
test_files: []
|