graphql 2.4.3 → 2.4.5
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/graphql/analysis/visitor.rb +1 -1
- data/lib/graphql/analysis.rb +3 -3
- data/lib/graphql/autoload.rb +37 -0
- data/lib/graphql/current.rb +1 -1
- data/lib/graphql/dataloader/async_dataloader.rb +4 -4
- data/lib/graphql/dataloader/source.rb +1 -1
- data/lib/graphql/dataloader.rb +6 -9
- data/lib/graphql/execution/interpreter/resolve.rb +3 -3
- data/lib/graphql/execution/interpreter/runtime.rb +7 -7
- data/lib/graphql/execution/interpreter.rb +4 -4
- data/lib/graphql/language/cache.rb +13 -0
- data/lib/graphql/language/document_from_schema_definition.rb +8 -7
- data/lib/graphql/language/lexer.rb +4 -1
- data/lib/graphql/language/printer.rb +8 -8
- data/lib/graphql/pagination/connection.rb +1 -1
- data/lib/graphql/query/context/scoped_context.rb +1 -1
- data/lib/graphql/query/context.rb +6 -5
- data/lib/graphql/query/variable_validation_error.rb +1 -1
- data/lib/graphql/query.rb +12 -10
- data/lib/graphql/railtie.rb +7 -0
- data/lib/graphql/schema/addition.rb +1 -1
- data/lib/graphql/schema/directive/flagged.rb +1 -1
- data/lib/graphql/schema/directive.rb +1 -1
- data/lib/graphql/schema/field/scope_extension.rb +1 -1
- data/lib/graphql/schema/field.rb +10 -10
- data/lib/graphql/schema/field_extension.rb +1 -1
- data/lib/graphql/schema/has_single_input_argument.rb +3 -1
- data/lib/graphql/schema/input_object.rb +64 -27
- data/lib/graphql/schema/interface.rb +1 -1
- data/lib/graphql/schema/loader.rb +1 -1
- data/lib/graphql/schema/member/has_arguments.rb +12 -12
- data/lib/graphql/schema/member/has_directives.rb +3 -3
- data/lib/graphql/schema/member/has_fields.rb +18 -0
- data/lib/graphql/schema/member/has_interfaces.rb +4 -4
- data/lib/graphql/schema/member/has_validators.rb +1 -1
- data/lib/graphql/schema/object.rb +8 -0
- data/lib/graphql/schema/relay_classic_mutation.rb +0 -1
- data/lib/graphql/schema/resolver.rb +5 -5
- data/lib/graphql/schema/subscription.rb +2 -2
- data/lib/graphql/schema/union.rb +1 -1
- data/lib/graphql/schema/validator.rb +1 -1
- data/lib/graphql/schema/visibility/profile.rb +61 -235
- data/lib/graphql/schema/visibility/visit.rb +190 -0
- data/lib/graphql/schema/visibility.rb +162 -26
- data/lib/graphql/schema/warden.rb +4 -4
- data/lib/graphql/schema.rb +33 -12
- data/lib/graphql/static_validation/rules/argument_names_are_unique.rb +1 -1
- data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +1 -1
- data/lib/graphql/static_validation/rules/no_definitions_are_present.rb +1 -1
- data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +1 -1
- data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +1 -1
- data/lib/graphql/static_validation/rules/variable_names_are_unique.rb +1 -1
- data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +1 -1
- data/lib/graphql/static_validation/validation_context.rb +1 -0
- data/lib/graphql/subscriptions/action_cable_subscriptions.rb +1 -1
- data/lib/graphql/subscriptions.rb +1 -1
- data/lib/graphql/testing/helpers.rb +2 -2
- data/lib/graphql/types/relay/connection_behaviors.rb +2 -2
- data/lib/graphql/types/relay/edge_behaviors.rb +1 -1
- data/lib/graphql/types.rb +18 -11
- data/lib/graphql/version.rb +1 -1
- data/lib/graphql.rb +80 -47
- metadata +4 -2
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
require "graphql/schema/visibility/profile"
|
3
3
|
require "graphql/schema/visibility/migration"
|
4
|
+
require "graphql/schema/visibility/visit"
|
4
5
|
|
5
6
|
module GraphQL
|
6
7
|
class Schema
|
@@ -13,40 +14,76 @@ module GraphQL
|
|
13
14
|
# @param migration_errors [Boolean] if `true`, raise an error when `Visibility` and `Warden` return different results
|
14
15
|
def self.use(schema, dynamic: false, profiles: EmptyObjects::EMPTY_HASH, preload: (defined?(Rails) ? Rails.env.production? : nil), migration_errors: false)
|
15
16
|
schema.visibility = self.new(schema, dynamic: dynamic, preload: preload, profiles: profiles, migration_errors: migration_errors)
|
17
|
+
if preload
|
18
|
+
schema.visibility.preload
|
19
|
+
end
|
16
20
|
end
|
17
21
|
|
18
22
|
def initialize(schema, dynamic:, preload:, profiles:, migration_errors:)
|
19
23
|
@schema = schema
|
20
24
|
schema.use_visibility_profile = true
|
21
|
-
if migration_errors
|
22
|
-
|
25
|
+
schema.visibility_profile_class = if migration_errors
|
26
|
+
Visibility::Migration
|
27
|
+
else
|
28
|
+
Visibility::Profile
|
23
29
|
end
|
24
30
|
@preload = preload
|
25
31
|
@profiles = profiles
|
26
32
|
@cached_profiles = {}
|
27
33
|
@dynamic = dynamic
|
28
34
|
@migration_errors = migration_errors
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
35
|
+
# Top-level type caches:
|
36
|
+
@visit = nil
|
37
|
+
@interface_type_memberships = nil
|
38
|
+
@directives = nil
|
39
|
+
@types = nil
|
40
|
+
@all_references = nil
|
41
|
+
@loaded_all = false
|
42
|
+
end
|
43
|
+
|
44
|
+
def all_directives
|
45
|
+
load_all
|
46
|
+
@directives
|
47
|
+
end
|
48
|
+
|
49
|
+
def all_interface_type_memberships
|
50
|
+
load_all
|
51
|
+
@interface_type_memberships
|
52
|
+
end
|
53
|
+
|
54
|
+
def all_references
|
55
|
+
load_all
|
56
|
+
@all_references
|
57
|
+
end
|
58
|
+
|
59
|
+
def get_type(type_name)
|
60
|
+
load_all
|
61
|
+
@types[type_name]
|
62
|
+
end
|
63
|
+
|
64
|
+
def preload?
|
65
|
+
@preload
|
66
|
+
end
|
67
|
+
|
68
|
+
def preload
|
69
|
+
# Traverse the schema now (and in the *_configured hooks below)
|
70
|
+
# To make sure things are loaded during boot
|
71
|
+
@preloaded_types = Set.new
|
72
|
+
types_to_visit = [
|
73
|
+
@schema.query,
|
74
|
+
@schema.mutation,
|
75
|
+
@schema.subscription,
|
76
|
+
*@schema.introspection_system.types.values,
|
77
|
+
*@schema.introspection_system.entry_points.map { |ep| ep.type.unwrap },
|
78
|
+
*@schema.orphan_types,
|
79
|
+
]
|
80
|
+
# Root types may have been nil:
|
81
|
+
types_to_visit.compact!
|
82
|
+
ensure_all_loaded(types_to_visit)
|
83
|
+
@profiles.each do |profile_name, example_ctx|
|
84
|
+
example_ctx[:visibility_profile] = profile_name
|
85
|
+
prof = profile_for(example_ctx, profile_name)
|
86
|
+
prof.all_types # force loading
|
50
87
|
end
|
51
88
|
end
|
52
89
|
|
@@ -109,7 +146,7 @@ module GraphQL
|
|
109
146
|
attr_reader :cached_profiles
|
110
147
|
|
111
148
|
def profile_for(context, visibility_profile)
|
112
|
-
if
|
149
|
+
if !@profiles.empty?
|
113
150
|
if visibility_profile.nil?
|
114
151
|
if @dynamic
|
115
152
|
if context.is_a?(Query::NullContext)
|
@@ -117,7 +154,7 @@ module GraphQL
|
|
117
154
|
else
|
118
155
|
@schema.visibility_profile_class.new(context: context, schema: @schema)
|
119
156
|
end
|
120
|
-
elsif
|
157
|
+
elsif !@profiles.empty?
|
121
158
|
raise ArgumentError, "#{@schema} expects a visibility profile, but `visibility_profile:` wasn't passed. Provide a `visibility_profile:` value or add `dynamic: true` to your visibility configuration."
|
122
159
|
end
|
123
160
|
elsif !@profiles.include?(visibility_profile)
|
@@ -132,7 +169,10 @@ module GraphQL
|
|
132
169
|
end
|
133
170
|
end
|
134
171
|
|
135
|
-
|
172
|
+
attr_reader :top_level
|
173
|
+
|
174
|
+
# @api private
|
175
|
+
attr_reader :unfiltered_interface_type_memberships
|
136
176
|
|
137
177
|
def top_level_profile(refresh: false)
|
138
178
|
if refresh
|
@@ -141,6 +181,8 @@ module GraphQL
|
|
141
181
|
@top_level_profile ||= @schema.visibility_profile_class.new(context: Query::NullContext.instance, schema: @schema)
|
142
182
|
end
|
143
183
|
|
184
|
+
private
|
185
|
+
|
144
186
|
def ensure_all_loaded(types_to_visit)
|
145
187
|
while (type = types_to_visit.shift)
|
146
188
|
if type.kind.fields? && @preloaded_types.add?(type)
|
@@ -153,6 +195,100 @@ module GraphQL
|
|
153
195
|
top_level_profile(refresh: true)
|
154
196
|
nil
|
155
197
|
end
|
198
|
+
|
199
|
+
def load_all(types: nil)
|
200
|
+
if @visit.nil?
|
201
|
+
# Set up the visit system
|
202
|
+
@interface_type_memberships = Hash.new { |h, interface_type| h[interface_type] = [] }.compare_by_identity
|
203
|
+
@directives = []
|
204
|
+
@types = {} # String => Module
|
205
|
+
@all_references = Hash.new { |h, member| h[member] = Set.new.compare_by_identity }.compare_by_identity
|
206
|
+
@unions_for_references = Set.new
|
207
|
+
@visit = Visibility::Visit.new(@schema) do |member|
|
208
|
+
if member.is_a?(Module)
|
209
|
+
type_name = member.graphql_name
|
210
|
+
if (prev_t = @types[type_name])
|
211
|
+
if prev_t.is_a?(Array)
|
212
|
+
prev_t << member
|
213
|
+
else
|
214
|
+
@types[type_name] = [member, prev_t]
|
215
|
+
end
|
216
|
+
else
|
217
|
+
@types[member.graphql_name] = member
|
218
|
+
end
|
219
|
+
member.directives.each { |dir| @all_references[dir.class] << member }
|
220
|
+
if member < GraphQL::Schema::Directive
|
221
|
+
@directives << member
|
222
|
+
elsif member.respond_to?(:interface_type_memberships)
|
223
|
+
member.interface_type_memberships.each do |itm|
|
224
|
+
@all_references[itm.abstract_type] << member
|
225
|
+
@interface_type_memberships[itm.abstract_type] << itm
|
226
|
+
end
|
227
|
+
elsif member < GraphQL::Schema::Union
|
228
|
+
@unions_for_references << member
|
229
|
+
end
|
230
|
+
elsif member.is_a?(GraphQL::Schema::Argument)
|
231
|
+
member.validate_default_value
|
232
|
+
@all_references[member.type.unwrap] << member
|
233
|
+
if !(dirs = member.directives).empty?
|
234
|
+
dir_owner = member.owner
|
235
|
+
if dir_owner.respond_to?(:owner)
|
236
|
+
dir_owner = dir_owner.owner
|
237
|
+
end
|
238
|
+
dirs.each { |dir| @all_references[dir.class] << dir_owner }
|
239
|
+
end
|
240
|
+
elsif member.is_a?(GraphQL::Schema::Field)
|
241
|
+
@all_references[member.type.unwrap] << member
|
242
|
+
if !(dirs = member.directives).empty?
|
243
|
+
dir_owner = member.owner
|
244
|
+
dirs.each { |dir| @all_references[dir.class] << dir_owner }
|
245
|
+
end
|
246
|
+
elsif member.is_a?(GraphQL::Schema::EnumValue)
|
247
|
+
if !(dirs = member.directives).empty?
|
248
|
+
dir_owner = member.owner
|
249
|
+
dirs.each { |dir| @all_references[dir.class] << dir_owner }
|
250
|
+
end
|
251
|
+
end
|
252
|
+
true
|
253
|
+
end
|
254
|
+
|
255
|
+
@schema.root_types.each { |t| @all_references[t] << true }
|
256
|
+
@schema.introspection_system.types.each_value { |t| @all_references[t] << true }
|
257
|
+
@schema.directives.each_value { |dir_class| @all_references[dir_class] << true }
|
258
|
+
|
259
|
+
@visit.visit_each(types: []) # visit default directives
|
260
|
+
end
|
261
|
+
|
262
|
+
if types
|
263
|
+
@visit.visit_each(types: types, directives: [])
|
264
|
+
elsif @loaded_all == false
|
265
|
+
@loaded_all = true
|
266
|
+
@visit.visit_each
|
267
|
+
else
|
268
|
+
# already loaded all
|
269
|
+
return
|
270
|
+
end
|
271
|
+
|
272
|
+
# TODO: somehow don't iterate over all these,
|
273
|
+
# only the ones that may have been modified
|
274
|
+
@interface_type_memberships.each do |int_type, type_memberships|
|
275
|
+
referers = @all_references[int_type].select { |r| r.is_a?(GraphQL::Schema::Field) }
|
276
|
+
if !referers.empty?
|
277
|
+
type_memberships.each do |type_membership|
|
278
|
+
implementor_type = type_membership.object_type
|
279
|
+
# Add new items only:
|
280
|
+
@all_references[implementor_type] |= referers
|
281
|
+
end
|
282
|
+
end
|
283
|
+
end
|
284
|
+
|
285
|
+
@unions_for_references.each do |union_type|
|
286
|
+
refs = @all_references[union_type]
|
287
|
+
union_type.all_possible_types.each do |object_type|
|
288
|
+
@all_references[object_type] |= refs # Add new items
|
289
|
+
end
|
290
|
+
end
|
291
|
+
end
|
156
292
|
end
|
157
293
|
end
|
158
294
|
end
|
@@ -297,7 +297,7 @@ module GraphQL
|
|
297
297
|
def arguments(argument_owner, ctx = nil)
|
298
298
|
@visible_arguments ||= read_through { |o|
|
299
299
|
args = o.arguments(@context)
|
300
|
-
if args.
|
300
|
+
if !args.empty?
|
301
301
|
args = args.values
|
302
302
|
args.select! { |a| visible_argument?(a, @context) }
|
303
303
|
args
|
@@ -329,7 +329,7 @@ module GraphQL
|
|
329
329
|
def interfaces(obj_type)
|
330
330
|
@visible_interfaces ||= read_through { |t|
|
331
331
|
ints = t.interfaces(@context)
|
332
|
-
if ints.
|
332
|
+
if !ints.empty?
|
333
333
|
ints.select! { |i| visible_type?(i) }
|
334
334
|
end
|
335
335
|
ints
|
@@ -389,9 +389,9 @@ module GraphQL
|
|
389
389
|
next true if root_type?(type_defn) || type_defn.introspection?
|
390
390
|
|
391
391
|
if type_defn.kind.union?
|
392
|
-
possible_types(type_defn).
|
392
|
+
!possible_types(type_defn).empty? && (referenced?(type_defn) || orphan_type?(type_defn))
|
393
393
|
elsif type_defn.kind.interface?
|
394
|
-
if possible_types(type_defn).
|
394
|
+
if !possible_types(type_defn).empty?
|
395
395
|
true
|
396
396
|
else
|
397
397
|
if @context.respond_to?(:logger) && (logger = @context.logger)
|
data/lib/graphql/schema.rb
CHANGED
@@ -47,6 +47,8 @@ require "graphql/schema/relay_classic_mutation"
|
|
47
47
|
require "graphql/schema/subscription"
|
48
48
|
require "graphql/schema/visibility"
|
49
49
|
|
50
|
+
GraphQL.ensure_eager_load!
|
51
|
+
|
50
52
|
module GraphQL
|
51
53
|
# A GraphQL schema which may be queried with {GraphQL::Query}.
|
52
54
|
#
|
@@ -233,7 +235,7 @@ module GraphQL
|
|
233
235
|
add_trace_options_for(mode, default_options)
|
234
236
|
|
235
237
|
Class.new(base_class) do
|
236
|
-
mods.
|
238
|
+
!mods.empty? && include(*mods)
|
237
239
|
end
|
238
240
|
end
|
239
241
|
end
|
@@ -321,7 +323,7 @@ module GraphQL
|
|
321
323
|
# @param plugin [#use] A Schema plugin
|
322
324
|
# @return void
|
323
325
|
def use(plugin, **kwargs)
|
324
|
-
if kwargs.
|
326
|
+
if !kwargs.empty?
|
325
327
|
plugin.use(self, **kwargs)
|
326
328
|
else
|
327
329
|
plugin.use(self)
|
@@ -446,7 +448,12 @@ module GraphQL
|
|
446
448
|
raise GraphQL::Error, "Second definition of `query(...)` (#{dup_defn.inspect}) is invalid, already configured with #{@query_object.inspect}"
|
447
449
|
elsif use_visibility_profile?
|
448
450
|
if block_given?
|
449
|
-
|
451
|
+
if visibility.preload?
|
452
|
+
@query_object = lazy_load_block.call
|
453
|
+
self.visibility.query_configured(@query_object)
|
454
|
+
else
|
455
|
+
@query_object = lazy_load_block
|
456
|
+
end
|
450
457
|
else
|
451
458
|
@query_object = new_query_object
|
452
459
|
self.visibility.query_configured(@query_object)
|
@@ -480,7 +487,12 @@ module GraphQL
|
|
480
487
|
raise GraphQL::Error, "Second definition of `mutation(...)` (#{dup_defn.inspect}) is invalid, already configured with #{@mutation_object.inspect}"
|
481
488
|
elsif use_visibility_profile?
|
482
489
|
if block_given?
|
483
|
-
|
490
|
+
if visibility.preload?
|
491
|
+
@mutation_object = lazy_load_block.call
|
492
|
+
self.visibility.mutation_configured(@mutation_object)
|
493
|
+
else
|
494
|
+
@mutation_object = lazy_load_block
|
495
|
+
end
|
484
496
|
else
|
485
497
|
@mutation_object = new_mutation_object
|
486
498
|
self.visibility.mutation_configured(@mutation_object)
|
@@ -514,7 +526,12 @@ module GraphQL
|
|
514
526
|
raise GraphQL::Error, "Second definition of `subscription(...)` (#{dup_defn.inspect}) is invalid, already configured with #{@subscription_object.inspect}"
|
515
527
|
elsif use_visibility_profile?
|
516
528
|
if block_given?
|
517
|
-
|
529
|
+
if visibility.preload?
|
530
|
+
@subscription_object = lazy_load_block.call
|
531
|
+
visibility.subscription_configured(@subscription_object)
|
532
|
+
else
|
533
|
+
@subscription_object = lazy_load_block
|
534
|
+
end
|
518
535
|
else
|
519
536
|
@subscription_object = new_subscription_object
|
520
537
|
self.visibility.subscription_configured(@subscription_object)
|
@@ -676,7 +693,7 @@ module GraphQL
|
|
676
693
|
# and generally speaking, we won't inherit any values.
|
677
694
|
# So optimize the most common case -- don't create a duplicate Hash.
|
678
695
|
inherited_value = find_inherited_value(:references_to, EMPTY_HASH)
|
679
|
-
if inherited_value.
|
696
|
+
if !inherited_value.empty?
|
680
697
|
inherited_value.merge(own_references_to)
|
681
698
|
else
|
682
699
|
own_references_to
|
@@ -962,7 +979,7 @@ module GraphQL
|
|
962
979
|
# @param new_extra_types [Module] Type definitions to include in printing and introspection, even though they aren't referenced in the schema
|
963
980
|
# @return [Array<Module>] Type definitions added to this schema
|
964
981
|
def extra_types(*new_extra_types)
|
965
|
-
if new_extra_types.
|
982
|
+
if !new_extra_types.empty?
|
966
983
|
new_extra_types = new_extra_types.flatten
|
967
984
|
@own_extra_types ||= []
|
968
985
|
@own_extra_types.concat(new_extra_types)
|
@@ -987,10 +1004,10 @@ module GraphQL
|
|
987
1004
|
# @param new_orphan_types [Array<Class<GraphQL::Schema::Object>>] Object types to register as implementations of interfaces in the schema.
|
988
1005
|
# @return [Array<Class<GraphQL::Schema::Object>>] All previously-registered orphan types for this schema
|
989
1006
|
def orphan_types(*new_orphan_types)
|
990
|
-
if new_orphan_types.
|
1007
|
+
if !new_orphan_types.empty?
|
991
1008
|
new_orphan_types = new_orphan_types.flatten
|
992
1009
|
non_object_types = new_orphan_types.reject { |ot| ot.is_a?(Class) && ot < GraphQL::Schema::Object }
|
993
|
-
if non_object_types.
|
1010
|
+
if !non_object_types.empty?
|
994
1011
|
raise ArgumentError, <<~ERR
|
995
1012
|
Only object type classes should be added as `orphan_types(...)`.
|
996
1013
|
|
@@ -1007,7 +1024,7 @@ module GraphQL
|
|
1007
1024
|
|
1008
1025
|
inherited_ot = find_inherited_value(:orphan_types, nil)
|
1009
1026
|
if inherited_ot
|
1010
|
-
if own_orphan_types.
|
1027
|
+
if !own_orphan_types.empty?
|
1011
1028
|
inherited_ot + own_orphan_types
|
1012
1029
|
else
|
1013
1030
|
inherited_ot
|
@@ -1317,12 +1334,12 @@ module GraphQL
|
|
1317
1334
|
# Add several directives at once
|
1318
1335
|
# @param new_directives [Class]
|
1319
1336
|
def directives(*new_directives)
|
1320
|
-
if new_directives.
|
1337
|
+
if !new_directives.empty?
|
1321
1338
|
new_directives.flatten.each { |d| directive(d) }
|
1322
1339
|
end
|
1323
1340
|
|
1324
1341
|
inherited_dirs = find_inherited_value(:directives, default_directives)
|
1325
|
-
if own_directives.
|
1342
|
+
if !own_directives.empty?
|
1326
1343
|
inherited_dirs.merge(own_directives)
|
1327
1344
|
else
|
1328
1345
|
inherited_dirs
|
@@ -1787,3 +1804,7 @@ module GraphQL
|
|
1787
1804
|
end
|
1788
1805
|
end
|
1789
1806
|
end
|
1807
|
+
|
1808
|
+
require "graphql/schema/built_in_types"
|
1809
|
+
require "graphql/schema/loader"
|
1810
|
+
require "graphql/schema/printer"
|
@@ -16,7 +16,7 @@ module GraphQL
|
|
16
16
|
|
17
17
|
def validate_arguments(node)
|
18
18
|
argument_defns = node.arguments
|
19
|
-
if argument_defns.
|
19
|
+
if !argument_defns.empty?
|
20
20
|
args_by_name = Hash.new { |h, k| h[k] = [] }
|
21
21
|
argument_defns.each { |a| args_by_name[a.name] << a }
|
22
22
|
args_by_name.each do |name, defns|
|
@@ -25,7 +25,7 @@ module GraphQL
|
|
25
25
|
def validate_field_selections(ast_node, resolved_type)
|
26
26
|
msg = if resolved_type.nil?
|
27
27
|
nil
|
28
|
-
elsif ast_node.selections.
|
28
|
+
elsif !ast_node.selections.empty? && resolved_type.kind.leaf?
|
29
29
|
selection_strs = ast_node.selections.map do |n|
|
30
30
|
case n
|
31
31
|
when GraphQL::Language::Nodes::InlineFragment
|
@@ -32,7 +32,7 @@ module GraphQL
|
|
32
32
|
|
33
33
|
def on_document(node, parent)
|
34
34
|
super
|
35
|
-
if
|
35
|
+
if !@schema_definition_nodes.empty?
|
36
36
|
add_error(GraphQL::StaticValidation::NoDefinitionsArePresentError.new(%|Query cannot contain schema definitions|, nodes: @schema_definition_nodes))
|
37
37
|
end
|
38
38
|
end
|
@@ -24,7 +24,7 @@ module GraphQL
|
|
24
24
|
.map!(&:name)
|
25
25
|
|
26
26
|
missing_names = required_argument_names - present_argument_names
|
27
|
-
if missing_names.
|
27
|
+
if !missing_names.empty?
|
28
28
|
add_error(GraphQL::StaticValidation::RequiredArgumentsArePresentError.new(
|
29
29
|
"#{ast_node.class.name.split("::").last} '#{ast_node.name}' is missing required arguments: #{missing_names.join(", ")}",
|
30
30
|
nodes: ast_node,
|
@@ -4,7 +4,7 @@ module GraphQL
|
|
4
4
|
module VariableNamesAreUnique
|
5
5
|
def on_operation_definition(node, parent)
|
6
6
|
var_defns = node.variables
|
7
|
-
if var_defns.
|
7
|
+
if !var_defns.empty?
|
8
8
|
vars_by_name = Hash.new { |h, k| h[k] = [] }
|
9
9
|
var_defns.each { |v| vars_by_name[v.name] << v }
|
10
10
|
vars_by_name.each do |name, defns|
|
@@ -21,7 +21,7 @@ module GraphQL
|
|
21
21
|
end
|
22
22
|
node_values = node_values.select { |value| value.is_a? GraphQL::Language::Nodes::VariableIdentifier }
|
23
23
|
|
24
|
-
if node_values.
|
24
|
+
if !node_values.empty?
|
25
25
|
argument_owner = case parent
|
26
26
|
when GraphQL::Language::Nodes::Field
|
27
27
|
context.field_definition
|
@@ -29,6 +29,7 @@ module GraphQL
|
|
29
29
|
@visitor = visitor_class.new(document, self)
|
30
30
|
end
|
31
31
|
|
32
|
+
# TODO stop using def_delegators because of Array allocations
|
32
33
|
def_delegators :@visitor,
|
33
34
|
:path, :type_definition, :field_definition, :argument_definition,
|
34
35
|
:parent_type_definition, :directive_definition, :object_types, :dependencies
|
@@ -171,7 +171,7 @@ module GraphQL
|
|
171
171
|
events_by_fingerprint = @events[topic]
|
172
172
|
object = nil
|
173
173
|
events_by_fingerprint.each do |_fingerprint, events|
|
174
|
-
if events.
|
174
|
+
if !events.empty? && events.first == initial_event
|
175
175
|
# The fingerprint has told us that this response should be shared by all subscribers,
|
176
176
|
# so just run it once, then deliver the result to every subscriber
|
177
177
|
first_event = events.first
|
@@ -58,7 +58,7 @@ module GraphQL
|
|
58
58
|
query_context[:current_field] = visible_field
|
59
59
|
field_args = visible_field.coerce_arguments(graphql_result, arguments, query_context)
|
60
60
|
field_args = schema.sync_lazy(field_args)
|
61
|
-
if visible_field.extras.
|
61
|
+
if !visible_field.extras.empty?
|
62
62
|
extra_args = {}
|
63
63
|
visible_field.extras.each do |extra|
|
64
64
|
extra_args[extra] = case extra
|
@@ -92,7 +92,7 @@ module GraphQL
|
|
92
92
|
end
|
93
93
|
graphql_result
|
94
94
|
else
|
95
|
-
unfiltered_type =
|
95
|
+
unfiltered_type = schema.use_visibility_profile? ? schema.visibility.get_type(type_name) : schema.get_type(type_name) # rubocop:disable Development/ContextIsPassedCop
|
96
96
|
if unfiltered_type
|
97
97
|
raise TypeNotVisibleError.new(type_name: type_name)
|
98
98
|
else
|
@@ -196,7 +196,7 @@ module GraphQL
|
|
196
196
|
def edges
|
197
197
|
# Assume that whatever authorization needed to happen
|
198
198
|
# already happened at the connection level.
|
199
|
-
current_runtime_state =
|
199
|
+
current_runtime_state = Fiber[:__graphql_runtime_info]
|
200
200
|
query_runtime_state = current_runtime_state[context.query]
|
201
201
|
query_runtime_state.was_authorized_by_scope_items = @object.was_authorized_by_scope_items?
|
202
202
|
@object.edges
|
@@ -205,7 +205,7 @@ module GraphQL
|
|
205
205
|
def nodes
|
206
206
|
# Assume that whatever authorization needed to happen
|
207
207
|
# already happened at the connection level.
|
208
|
-
current_runtime_state =
|
208
|
+
current_runtime_state = Fiber[:__graphql_runtime_info]
|
209
209
|
query_runtime_state = current_runtime_state[context.query]
|
210
210
|
query_runtime_state.was_authorized_by_scope_items = @object.was_authorized_by_scope_items?
|
211
211
|
@object.nodes
|
@@ -14,7 +14,7 @@ module GraphQL
|
|
14
14
|
end
|
15
15
|
|
16
16
|
def node
|
17
|
-
current_runtime_state =
|
17
|
+
current_runtime_state = Fiber[:__graphql_runtime_info]
|
18
18
|
query_runtime_state = current_runtime_state[context.query]
|
19
19
|
query_runtime_state.was_authorized_by_scope_items = @object.was_authorized_by_scope_items?
|
20
20
|
@object.node
|
data/lib/graphql/types.rb
CHANGED
@@ -1,12 +1,19 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
2
|
+
|
3
|
+
module GraphQL
|
4
|
+
module Types
|
5
|
+
extend Autoload
|
6
|
+
|
7
|
+
autoload :Boolean, "graphql/types/boolean"
|
8
|
+
autoload :BigInt, "graphql/types/big_int"
|
9
|
+
autoload :Float, "graphql/types/float"
|
10
|
+
autoload :ID, "graphql/types/id"
|
11
|
+
autoload :Int, "graphql/types/int"
|
12
|
+
autoload :JSON, "graphql/types/json"
|
13
|
+
autoload :String, "graphql/types/string"
|
14
|
+
autoload :ISO8601Date, "graphql/types/iso_8601_date"
|
15
|
+
autoload :ISO8601DateTime, "graphql/types/iso_8601_date_time"
|
16
|
+
autoload :ISO8601Duration, "graphql/types/iso_8601_duration"
|
17
|
+
autoload :Relay, "graphql/types/relay"
|
18
|
+
end
|
19
|
+
end
|
data/lib/graphql/version.rb
CHANGED