graphql 2.4.4 → 2.4.6
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/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
|