graphql 2.4.4 → 2.4.6
Sign up to get free protection for your applications and to get access to all the features.
- 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 +9 -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 +25 -17
- 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/migration.rb +1 -0
- data/lib/graphql/schema/visibility/profile.rb +10 -2
- data/lib/graphql/schema/visibility/visit.rb +2 -2
- data/lib/graphql/schema/visibility.rb +33 -19
- data/lib/graphql/schema/warden.rb +18 -5
- data/lib/graphql/schema.rb +17 -9
- 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/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 +81 -47
- metadata +3 -2
@@ -37,7 +37,7 @@ module GraphQL
|
|
37
37
|
@interface_type_memberships = nil
|
38
38
|
@directives = nil
|
39
39
|
@types = nil
|
40
|
-
@
|
40
|
+
@all_references = nil
|
41
41
|
@loaded_all = false
|
42
42
|
end
|
43
43
|
|
@@ -53,7 +53,7 @@ module GraphQL
|
|
53
53
|
|
54
54
|
def all_references
|
55
55
|
load_all
|
56
|
-
@
|
56
|
+
@all_references
|
57
57
|
end
|
58
58
|
|
59
59
|
def get_type(type_name)
|
@@ -146,7 +146,7 @@ module GraphQL
|
|
146
146
|
attr_reader :cached_profiles
|
147
147
|
|
148
148
|
def profile_for(context, visibility_profile)
|
149
|
-
if
|
149
|
+
if !@profiles.empty?
|
150
150
|
if visibility_profile.nil?
|
151
151
|
if @dynamic
|
152
152
|
if context.is_a?(Query::NullContext)
|
@@ -154,7 +154,7 @@ module GraphQL
|
|
154
154
|
else
|
155
155
|
@schema.visibility_profile_class.new(context: context, schema: @schema)
|
156
156
|
end
|
157
|
-
elsif
|
157
|
+
elsif !@profiles.empty?
|
158
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."
|
159
159
|
end
|
160
160
|
elsif !@profiles.include?(visibility_profile)
|
@@ -202,7 +202,7 @@ module GraphQL
|
|
202
202
|
@interface_type_memberships = Hash.new { |h, interface_type| h[interface_type] = [] }.compare_by_identity
|
203
203
|
@directives = []
|
204
204
|
@types = {} # String => Module
|
205
|
-
@
|
205
|
+
@all_references = Hash.new { |h, member| h[member] = Set.new.compare_by_identity }.compare_by_identity
|
206
206
|
@unions_for_references = Set.new
|
207
207
|
@visit = Visibility::Visit.new(@schema) do |member|
|
208
208
|
if member.is_a?(Module)
|
@@ -216,11 +216,12 @@ module GraphQL
|
|
216
216
|
else
|
217
217
|
@types[member.graphql_name] = member
|
218
218
|
end
|
219
|
+
member.directives.each { |dir| @all_references[dir.class] << member }
|
219
220
|
if member < GraphQL::Schema::Directive
|
220
221
|
@directives << member
|
221
222
|
elsif member.respond_to?(:interface_type_memberships)
|
222
223
|
member.interface_type_memberships.each do |itm|
|
223
|
-
@
|
224
|
+
@all_references[itm.abstract_type] << member
|
224
225
|
@interface_type_memberships[itm.abstract_type] << itm
|
225
226
|
end
|
226
227
|
elsif member < GraphQL::Schema::Union
|
@@ -228,20 +229,33 @@ module GraphQL
|
|
228
229
|
end
|
229
230
|
elsif member.is_a?(GraphQL::Schema::Argument)
|
230
231
|
member.validate_default_value
|
231
|
-
@
|
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
|
232
240
|
elsif member.is_a?(GraphQL::Schema::Field)
|
233
|
-
@
|
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
|
234
251
|
end
|
235
252
|
true
|
236
253
|
end
|
237
254
|
|
238
|
-
@schema.root_types.each
|
239
|
-
|
240
|
-
|
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 }
|
241
258
|
|
242
|
-
@schema.introspection_system.types.each_value do |t|
|
243
|
-
@references[t] << true
|
244
|
-
end
|
245
259
|
@visit.visit_each(types: []) # visit default directives
|
246
260
|
end
|
247
261
|
|
@@ -258,20 +272,20 @@ module GraphQL
|
|
258
272
|
# TODO: somehow don't iterate over all these,
|
259
273
|
# only the ones that may have been modified
|
260
274
|
@interface_type_memberships.each do |int_type, type_memberships|
|
261
|
-
referers = @
|
262
|
-
if referers.
|
275
|
+
referers = @all_references[int_type].select { |r| r.is_a?(GraphQL::Schema::Field) }
|
276
|
+
if !referers.empty?
|
263
277
|
type_memberships.each do |type_membership|
|
264
278
|
implementor_type = type_membership.object_type
|
265
279
|
# Add new items only:
|
266
|
-
@
|
280
|
+
@all_references[implementor_type] |= referers
|
267
281
|
end
|
268
282
|
end
|
269
283
|
end
|
270
284
|
|
271
285
|
@unions_for_references.each do |union_type|
|
272
|
-
refs = @
|
286
|
+
refs = @all_references[union_type]
|
273
287
|
union_type.all_possible_types.each do |object_type|
|
274
|
-
@
|
288
|
+
@all_references[object_type] |= refs # Add new items
|
275
289
|
end
|
276
290
|
end
|
277
291
|
end
|
@@ -72,6 +72,7 @@ module GraphQL
|
|
72
72
|
def interface_type_memberships(obj_t, ctx); obj_t.interface_type_memberships; end
|
73
73
|
def arguments(owner, ctx); owner.arguments(ctx); end
|
74
74
|
def loadable?(type, ctx); type.visible?(ctx); end
|
75
|
+
def loadable_possible_types(type, ctx); type.possible_types(ctx); end
|
75
76
|
def visibility_profile
|
76
77
|
@visibility_profile ||= Warden::VisibilityProfile.new(self)
|
77
78
|
end
|
@@ -106,6 +107,7 @@ module GraphQL
|
|
106
107
|
def get_field(parent_type, field_name); @schema.get_field(parent_type, field_name); end
|
107
108
|
def reachable_type?(type_name); true; end
|
108
109
|
def loadable?(type, _ctx); true; end
|
110
|
+
def loadable_possible_types(union_type, _ctx); union_type.possible_types; end
|
109
111
|
def reachable_types; @schema.types.values; end # rubocop:disable Development/ContextIsPassedCop
|
110
112
|
def possible_types(type_defn); @schema.possible_types(type_defn, Query::NullContext.instance, false); end
|
111
113
|
def interfaces(obj_type); obj_type.interfaces; end
|
@@ -180,6 +182,10 @@ module GraphQL
|
|
180
182
|
@warden.loadable?(t, ctx)
|
181
183
|
end
|
182
184
|
|
185
|
+
def loadable_possible_types(t, ctx)
|
186
|
+
@warden.loadable_possible_types(t, ctx)
|
187
|
+
end
|
188
|
+
|
183
189
|
def reachable_type?(type_name)
|
184
190
|
!!@warden.reachable_type?(type_name)
|
185
191
|
end
|
@@ -204,7 +210,7 @@ module GraphQL
|
|
204
210
|
@visible_possible_types = @visible_fields = @visible_arguments = @visible_enum_arrays =
|
205
211
|
@visible_enum_values = @visible_interfaces = @type_visibility = @type_memberships =
|
206
212
|
@visible_and_reachable_type = @unions = @unfiltered_interfaces =
|
207
|
-
@reachable_type_set = @visibility_profile =
|
213
|
+
@reachable_type_set = @visibility_profile = @loadable_possible_types =
|
208
214
|
nil
|
209
215
|
@skip_warning = schema.plugins.any? { |(plugin, _opts)| plugin == GraphQL::Schema::Warden }
|
210
216
|
end
|
@@ -229,6 +235,13 @@ module GraphQL
|
|
229
235
|
!reachable_type_set.include?(type) && visible_type?(type)
|
230
236
|
end
|
231
237
|
|
238
|
+
def loadable_possible_types(union_type, _ctx)
|
239
|
+
@loadable_possible_types ||= read_through do |t|
|
240
|
+
t.possible_types # unfiltered
|
241
|
+
end
|
242
|
+
@loadable_possible_types[union_type]
|
243
|
+
end
|
244
|
+
|
232
245
|
# @return [GraphQL::BaseType, nil] The type named `type_name`, if it exists (else `nil`)
|
233
246
|
def get_type(type_name)
|
234
247
|
@visible_types ||= read_through do |name|
|
@@ -297,7 +310,7 @@ module GraphQL
|
|
297
310
|
def arguments(argument_owner, ctx = nil)
|
298
311
|
@visible_arguments ||= read_through { |o|
|
299
312
|
args = o.arguments(@context)
|
300
|
-
if args.
|
313
|
+
if !args.empty?
|
301
314
|
args = args.values
|
302
315
|
args.select! { |a| visible_argument?(a, @context) }
|
303
316
|
args
|
@@ -329,7 +342,7 @@ module GraphQL
|
|
329
342
|
def interfaces(obj_type)
|
330
343
|
@visible_interfaces ||= read_through { |t|
|
331
344
|
ints = t.interfaces(@context)
|
332
|
-
if ints.
|
345
|
+
if !ints.empty?
|
333
346
|
ints.select! { |i| visible_type?(i) }
|
334
347
|
end
|
335
348
|
ints
|
@@ -389,9 +402,9 @@ module GraphQL
|
|
389
402
|
next true if root_type?(type_defn) || type_defn.introspection?
|
390
403
|
|
391
404
|
if type_defn.kind.union?
|
392
|
-
possible_types(type_defn).
|
405
|
+
!possible_types(type_defn).empty? && (referenced?(type_defn) || orphan_type?(type_defn))
|
393
406
|
elsif type_defn.kind.interface?
|
394
|
-
if possible_types(type_defn).
|
407
|
+
if !possible_types(type_defn).empty?
|
395
408
|
true
|
396
409
|
else
|
397
410
|
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
|
#
|
@@ -73,6 +75,9 @@ module GraphQL
|
|
73
75
|
class Schema
|
74
76
|
extend GraphQL::Schema::Member::HasAstNode
|
75
77
|
extend GraphQL::Schema::FindInheritedValue
|
78
|
+
extend Autoload
|
79
|
+
|
80
|
+
autoload :BUILT_IN_TYPES, "graphql/schema/built_in_types"
|
76
81
|
|
77
82
|
class DuplicateNamesError < GraphQL::Error
|
78
83
|
attr_reader :duplicated_name
|
@@ -233,7 +238,7 @@ module GraphQL
|
|
233
238
|
add_trace_options_for(mode, default_options)
|
234
239
|
|
235
240
|
Class.new(base_class) do
|
236
|
-
mods.
|
241
|
+
!mods.empty? && include(*mods)
|
237
242
|
end
|
238
243
|
end
|
239
244
|
end
|
@@ -321,7 +326,7 @@ module GraphQL
|
|
321
326
|
# @param plugin [#use] A Schema plugin
|
322
327
|
# @return void
|
323
328
|
def use(plugin, **kwargs)
|
324
|
-
if kwargs.
|
329
|
+
if !kwargs.empty?
|
325
330
|
plugin.use(self, **kwargs)
|
326
331
|
else
|
327
332
|
plugin.use(self)
|
@@ -691,7 +696,7 @@ module GraphQL
|
|
691
696
|
# and generally speaking, we won't inherit any values.
|
692
697
|
# So optimize the most common case -- don't create a duplicate Hash.
|
693
698
|
inherited_value = find_inherited_value(:references_to, EMPTY_HASH)
|
694
|
-
if inherited_value.
|
699
|
+
if !inherited_value.empty?
|
695
700
|
inherited_value.merge(own_references_to)
|
696
701
|
else
|
697
702
|
own_references_to
|
@@ -977,7 +982,7 @@ module GraphQL
|
|
977
982
|
# @param new_extra_types [Module] Type definitions to include in printing and introspection, even though they aren't referenced in the schema
|
978
983
|
# @return [Array<Module>] Type definitions added to this schema
|
979
984
|
def extra_types(*new_extra_types)
|
980
|
-
if new_extra_types.
|
985
|
+
if !new_extra_types.empty?
|
981
986
|
new_extra_types = new_extra_types.flatten
|
982
987
|
@own_extra_types ||= []
|
983
988
|
@own_extra_types.concat(new_extra_types)
|
@@ -1002,10 +1007,10 @@ module GraphQL
|
|
1002
1007
|
# @param new_orphan_types [Array<Class<GraphQL::Schema::Object>>] Object types to register as implementations of interfaces in the schema.
|
1003
1008
|
# @return [Array<Class<GraphQL::Schema::Object>>] All previously-registered orphan types for this schema
|
1004
1009
|
def orphan_types(*new_orphan_types)
|
1005
|
-
if new_orphan_types.
|
1010
|
+
if !new_orphan_types.empty?
|
1006
1011
|
new_orphan_types = new_orphan_types.flatten
|
1007
1012
|
non_object_types = new_orphan_types.reject { |ot| ot.is_a?(Class) && ot < GraphQL::Schema::Object }
|
1008
|
-
if non_object_types.
|
1013
|
+
if !non_object_types.empty?
|
1009
1014
|
raise ArgumentError, <<~ERR
|
1010
1015
|
Only object type classes should be added as `orphan_types(...)`.
|
1011
1016
|
|
@@ -1022,7 +1027,7 @@ module GraphQL
|
|
1022
1027
|
|
1023
1028
|
inherited_ot = find_inherited_value(:orphan_types, nil)
|
1024
1029
|
if inherited_ot
|
1025
|
-
if own_orphan_types.
|
1030
|
+
if !own_orphan_types.empty?
|
1026
1031
|
inherited_ot + own_orphan_types
|
1027
1032
|
else
|
1028
1033
|
inherited_ot
|
@@ -1332,12 +1337,12 @@ module GraphQL
|
|
1332
1337
|
# Add several directives at once
|
1333
1338
|
# @param new_directives [Class]
|
1334
1339
|
def directives(*new_directives)
|
1335
|
-
if new_directives.
|
1340
|
+
if !new_directives.empty?
|
1336
1341
|
new_directives.flatten.each { |d| directive(d) }
|
1337
1342
|
end
|
1338
1343
|
|
1339
1344
|
inherited_dirs = find_inherited_value(:directives, default_directives)
|
1340
|
-
if own_directives.
|
1345
|
+
if !own_directives.empty?
|
1341
1346
|
inherited_dirs.merge(own_directives)
|
1342
1347
|
else
|
1343
1348
|
inherited_dirs
|
@@ -1802,3 +1807,6 @@ module GraphQL
|
|
1802
1807
|
end
|
1803
1808
|
end
|
1804
1809
|
end
|
1810
|
+
|
1811
|
+
require "graphql/schema/loader"
|
1812
|
+
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
|
@@ -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 = schema.use_visibility_profile? ? schema.visibility.get_type(type_name) : schema.get_type(type_name) # rubocop:disable ContextIsPassedCop
|
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
data/lib/graphql.rb
CHANGED
@@ -5,8 +5,19 @@ require "set"
|
|
5
5
|
require "singleton"
|
6
6
|
require "forwardable"
|
7
7
|
require "fiber/storage"
|
8
|
+
require "graphql/autoload"
|
8
9
|
|
9
10
|
module GraphQL
|
11
|
+
extend Autoload
|
12
|
+
|
13
|
+
# Load all `autoload`-configured classes, and also eager-load dependents who have autoloads of their own.
|
14
|
+
def self.eager_load!
|
15
|
+
super
|
16
|
+
Query.eager_load!
|
17
|
+
Types.eager_load!
|
18
|
+
Schema.eager_load!
|
19
|
+
end
|
20
|
+
|
10
21
|
class Error < StandardError
|
11
22
|
end
|
12
23
|
|
@@ -71,56 +82,79 @@ This is probably a bug in GraphQL-Ruby, please report this error on GitHub: http
|
|
71
82
|
class << self
|
72
83
|
# If true, the parser should raise when an integer or float is followed immediately by an identifier (instead of a space or punctuation)
|
73
84
|
attr_accessor :reject_numbers_followed_by_names
|
85
|
+
|
86
|
+
# If `production?` is detected but `eager_load!` wasn't called, emit a warning.
|
87
|
+
# @return [void]
|
88
|
+
def ensure_eager_load!
|
89
|
+
if production? && !eager_loading?
|
90
|
+
warn <<~WARNING
|
91
|
+
GraphQL-Ruby thinks this is a production deployment but didn't eager-load its constants. Address this by:
|
92
|
+
|
93
|
+
- Calling `GraphQL.eager_load!` in a production-only initializer or setup hook
|
94
|
+
- Assign `GraphQL.env = "..."` to something _other_ than `"production"` (for example, `GraphQL.env = "development"`)
|
95
|
+
|
96
|
+
More details: https://graphql-ruby.org/schema/definition#production-considerations
|
97
|
+
WARNING
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
attr_accessor :env
|
102
|
+
|
103
|
+
private
|
104
|
+
|
105
|
+
# Detect whether this is a production deployment or not
|
106
|
+
def production?
|
107
|
+
if env
|
108
|
+
# Manually assigned to production?
|
109
|
+
env == "production"
|
110
|
+
else
|
111
|
+
(detected_env = ENV["RACK_ENV"] || ENV["RAILS_ENV"] || ENV["HANAMI_ENV"] || ENV["APP_ENV"]) && detected_env.to_s.downcase == "production"
|
112
|
+
end
|
113
|
+
end
|
74
114
|
end
|
75
115
|
|
76
116
|
self.reject_numbers_followed_by_names = false
|
77
|
-
end
|
78
117
|
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
118
|
+
autoload :ExecutionError, "graphql/execution_error"
|
119
|
+
autoload :RuntimeTypeError, "graphql/runtime_type_error"
|
120
|
+
autoload :UnresolvedTypeError, "graphql/unresolved_type_error"
|
121
|
+
autoload :InvalidNullError, "graphql/invalid_null_error"
|
122
|
+
autoload :AnalysisError, "graphql/analysis_error"
|
123
|
+
autoload :CoercionError, "graphql/coercion_error"
|
124
|
+
autoload :InvalidNameError, "graphql/invalid_name_error"
|
125
|
+
autoload :IntegerDecodingError, "graphql/integer_decoding_error"
|
126
|
+
autoload :IntegerEncodingError, "graphql/integer_encoding_error"
|
127
|
+
autoload :StringEncodingError, "graphql/string_encoding_error"
|
128
|
+
autoload :DateEncodingError, "graphql/date_encoding_error"
|
129
|
+
autoload :DurationEncodingError, "graphql/duration_encoding_error"
|
130
|
+
autoload :TypeKinds, "graphql/type_kinds"
|
131
|
+
autoload :NameValidator, "graphql/name_validator"
|
132
|
+
autoload :Language, "graphql/language"
|
133
|
+
|
134
|
+
autoload :Analysis, "graphql/analysis"
|
135
|
+
autoload :Tracing, "graphql/tracing"
|
136
|
+
autoload :Dig, "graphql/dig"
|
137
|
+
autoload :Execution, "graphql/execution"
|
138
|
+
autoload :Pagination, "graphql/pagination"
|
139
|
+
autoload :Schema, "graphql/schema"
|
140
|
+
autoload :Query, "graphql/query"
|
141
|
+
autoload :Dataloader, "graphql/dataloader"
|
142
|
+
autoload :Types, "graphql/types"
|
143
|
+
autoload :StaticValidation, "graphql/static_validation"
|
144
|
+
autoload :Execution, "graphql/execution"
|
145
|
+
autoload :Introspection, "graphql/introspection"
|
146
|
+
autoload :Relay, "graphql/relay"
|
147
|
+
autoload :Subscriptions, "graphql/subscriptions"
|
148
|
+
autoload :ParseError, "graphql/parse_error"
|
149
|
+
autoload :Backtrace, "graphql/backtrace"
|
150
|
+
|
151
|
+
autoload :UnauthorizedError, "graphql/unauthorized_error"
|
152
|
+
autoload :UnauthorizedEnumValueError, "graphql/unauthorized_enum_value_error"
|
153
|
+
autoload :UnauthorizedFieldError, "graphql/unauthorized_field_error"
|
154
|
+
autoload :LoadApplicationObjectFailedError, "graphql/load_application_object_failed_error"
|
155
|
+
autoload :Testing, "graphql/testing"
|
156
|
+
autoload :Current, "graphql/current"
|
157
|
+
end
|
115
158
|
|
116
159
|
require "graphql/version"
|
117
|
-
require "graphql/
|
118
|
-
require "graphql/parse_error"
|
119
|
-
require "graphql/backtrace"
|
120
|
-
|
121
|
-
require "graphql/unauthorized_error"
|
122
|
-
require "graphql/unauthorized_enum_value_error"
|
123
|
-
require "graphql/unauthorized_field_error"
|
124
|
-
require "graphql/load_application_object_failed_error"
|
125
|
-
require "graphql/testing"
|
126
|
-
require "graphql/current"
|
160
|
+
require "graphql/railtie" if defined? Rails::Railtie
|
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.4.
|
4
|
+
version: 2.4.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robert Mosolgo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-12-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: base64
|
@@ -328,6 +328,7 @@ files:
|
|
328
328
|
- lib/graphql/analysis/query_depth.rb
|
329
329
|
- lib/graphql/analysis/visitor.rb
|
330
330
|
- lib/graphql/analysis_error.rb
|
331
|
+
- lib/graphql/autoload.rb
|
331
332
|
- lib/graphql/backtrace.rb
|
332
333
|
- lib/graphql/backtrace/inspect_result.rb
|
333
334
|
- lib/graphql/backtrace/table.rb
|