graphql 2.4.4 → 2.4.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/lib/graphql/analysis/visitor.rb +1 -1
  3. data/lib/graphql/analysis.rb +3 -3
  4. data/lib/graphql/autoload.rb +37 -0
  5. data/lib/graphql/current.rb +1 -1
  6. data/lib/graphql/dataloader/async_dataloader.rb +4 -4
  7. data/lib/graphql/dataloader/source.rb +1 -1
  8. data/lib/graphql/dataloader.rb +6 -9
  9. data/lib/graphql/execution/interpreter/resolve.rb +3 -3
  10. data/lib/graphql/execution/interpreter/runtime.rb +7 -7
  11. data/lib/graphql/execution/interpreter.rb +4 -4
  12. data/lib/graphql/language/cache.rb +13 -0
  13. data/lib/graphql/language/document_from_schema_definition.rb +8 -7
  14. data/lib/graphql/language/lexer.rb +4 -1
  15. data/lib/graphql/language/printer.rb +8 -8
  16. data/lib/graphql/pagination/connection.rb +1 -1
  17. data/lib/graphql/query/context/scoped_context.rb +1 -1
  18. data/lib/graphql/query/context.rb +6 -5
  19. data/lib/graphql/query/variable_validation_error.rb +1 -1
  20. data/lib/graphql/query.rb +12 -10
  21. data/lib/graphql/railtie.rb +7 -0
  22. data/lib/graphql/schema/addition.rb +1 -1
  23. data/lib/graphql/schema/directive/flagged.rb +1 -1
  24. data/lib/graphql/schema/directive.rb +1 -1
  25. data/lib/graphql/schema/field/scope_extension.rb +1 -1
  26. data/lib/graphql/schema/field.rb +10 -10
  27. data/lib/graphql/schema/field_extension.rb +1 -1
  28. data/lib/graphql/schema/has_single_input_argument.rb +3 -1
  29. data/lib/graphql/schema/input_object.rb +64 -27
  30. data/lib/graphql/schema/interface.rb +1 -1
  31. data/lib/graphql/schema/loader.rb +1 -1
  32. data/lib/graphql/schema/member/has_arguments.rb +12 -12
  33. data/lib/graphql/schema/member/has_directives.rb +3 -3
  34. data/lib/graphql/schema/member/has_fields.rb +18 -0
  35. data/lib/graphql/schema/member/has_interfaces.rb +4 -4
  36. data/lib/graphql/schema/member/has_validators.rb +1 -1
  37. data/lib/graphql/schema/object.rb +8 -0
  38. data/lib/graphql/schema/relay_classic_mutation.rb +0 -1
  39. data/lib/graphql/schema/resolver.rb +5 -5
  40. data/lib/graphql/schema/subscription.rb +2 -2
  41. data/lib/graphql/schema/union.rb +1 -1
  42. data/lib/graphql/schema/validator.rb +1 -1
  43. data/lib/graphql/schema/visibility/profile.rb +4 -2
  44. data/lib/graphql/schema/visibility/visit.rb +2 -2
  45. data/lib/graphql/schema/visibility.rb +33 -19
  46. data/lib/graphql/schema/warden.rb +4 -4
  47. data/lib/graphql/schema.rb +15 -9
  48. data/lib/graphql/static_validation/rules/argument_names_are_unique.rb +1 -1
  49. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +1 -1
  50. data/lib/graphql/static_validation/rules/no_definitions_are_present.rb +1 -1
  51. data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +1 -1
  52. data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +1 -1
  53. data/lib/graphql/static_validation/rules/variable_names_are_unique.rb +1 -1
  54. data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +1 -1
  55. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +1 -1
  56. data/lib/graphql/subscriptions.rb +1 -1
  57. data/lib/graphql/testing/helpers.rb +2 -2
  58. data/lib/graphql/types/relay/connection_behaviors.rb +2 -2
  59. data/lib/graphql/types/relay/edge_behaviors.rb +1 -1
  60. data/lib/graphql/types.rb +18 -11
  61. data/lib/graphql/version.rb +1 -1
  62. data/lib/graphql.rb +80 -47
  63. metadata +3 -2
@@ -42,8 +42,8 @@ module GraphQL
42
42
  end
43
43
 
44
44
  def directives
45
- if @resolver_class && (r_dirs = @resolver_class.directives).any?
46
- if (own_dirs = super).any?
45
+ if @resolver_class && !(r_dirs = @resolver_class.directives).empty?
46
+ if !(own_dirs = super).empty?
47
47
  own_dirs + r_dirs
48
48
  else
49
49
  r_dirs
@@ -81,7 +81,7 @@ module GraphQL
81
81
  end
82
82
 
83
83
  def inspect
84
- "#<#{self.class} #{path}#{all_argument_definitions.any? ? "(...)" : ""}: #{type.to_type_signature}>"
84
+ "#<#{self.class} #{path}#{!all_argument_definitions.empty? ? "(...)" : ""}: #{type.to_type_signature}>"
85
85
  end
86
86
 
87
87
  alias :mutation :resolver
@@ -335,15 +335,15 @@ module GraphQL
335
335
  @call_after_define = false
336
336
  set_pagination_extensions(connection_extension: connection_extension)
337
337
  # Do this last so we have as much context as possible when initializing them:
338
- if extensions.any?
338
+ if !extensions.empty?
339
339
  self.extensions(extensions)
340
340
  end
341
341
 
342
- if resolver_class && resolver_class.extensions.any?
342
+ if resolver_class && !resolver_class.extensions.empty?
343
343
  self.extensions(resolver_class.extensions)
344
344
  end
345
345
 
346
- if directives.any?
346
+ if !directives.empty?
347
347
  directives.each do |(dir_class, options)|
348
348
  self.directive(dir_class, **options)
349
349
  end
@@ -482,7 +482,7 @@ module GraphQL
482
482
  if new_extras.nil?
483
483
  # Read the value
484
484
  field_extras = @extras
485
- if @resolver_class && @resolver_class.extras.any?
485
+ if @resolver_class && !@resolver_class.extras.empty?
486
486
  field_extras + @resolver_class.extras
487
487
  else
488
488
  field_extras
@@ -732,7 +732,7 @@ module GraphQL
732
732
  method_to_call = resolver_method
733
733
  method_receiver = obj
734
734
  # Call the method with kwargs, if there are any
735
- if ruby_kwargs.any?
735
+ if !ruby_kwargs.empty?
736
736
  obj.public_send(resolver_method, **ruby_kwargs)
737
737
  else
738
738
  obj.public_send(resolver_method)
@@ -752,7 +752,7 @@ module GraphQL
752
752
  elsif inner_object.respond_to?(@method_sym)
753
753
  method_to_call = @method_sym
754
754
  method_receiver = obj.object
755
- if ruby_kwargs.any?
755
+ if !ruby_kwargs.empty?
756
756
  inner_object.public_send(@method_sym, **ruby_kwargs)
757
757
  else
758
758
  inner_object.public_send(@method_sym)
@@ -839,7 +839,7 @@ module GraphQL
839
839
  unsatisfied_ruby_kwargs.clear
840
840
  end
841
841
 
842
- if unsatisfied_ruby_kwargs.any? || unsatisfied_method_params.any?
842
+ if !unsatisfied_ruby_kwargs.empty? || !unsatisfied_method_params.empty?
843
843
  raise FieldImplementationFailed.new, <<-ERR
844
844
  Failed to call `#{method_name.inspect}` on #{receiver.inspect} because the Ruby method params were incompatible with the GraphQL arguments:
845
845
 
@@ -104,7 +104,7 @@ module GraphQL
104
104
  end
105
105
  end
106
106
  end
107
- if (extras = self.class.extras).any?
107
+ if !(extras = self.class.extras).empty?
108
108
  @added_extras = extras - field.extras
109
109
  field.extras(@added_extras)
110
110
  else
@@ -32,7 +32,7 @@ module GraphQL
32
32
  input_kwargs = {}
33
33
  end
34
34
 
35
- if input_kwargs.any?
35
+ if !input_kwargs.empty?
36
36
  super(**input_kwargs)
37
37
  else
38
38
  super()
@@ -136,6 +136,8 @@ module GraphQL
136
136
  super || "Autogenerated input type of #{self.mutation.graphql_name}"
137
137
  end
138
138
  end
139
+ # For compatibility, in case no arguments are defined:
140
+ has_no_arguments(true)
139
141
  mutation(mutation_class)
140
142
  # these might be inherited:
141
143
  mutation_args.each do |arg|
@@ -10,6 +10,14 @@ module GraphQL
10
10
 
11
11
  include GraphQL::Dig
12
12
 
13
+ # Raised when an InputObject doesn't have any arguments defined and hasn't explicitly opted out of this requirement
14
+ class ArgumentsAreRequiredError < GraphQL::Error
15
+ def initialize(input_object_type)
16
+ message = "Input Object types must have arguments, but #{input_object_type.graphql_name} doesn't have any. Define an argument for this type, remove it from your schema, or add `has_no_arguments(true)` to its definition."
17
+ super(message)
18
+ end
19
+ end
20
+
13
21
  # @return [GraphQL::Query::Context] The context for this query
14
22
  attr_reader :context
15
23
  # @return [GraphQL::Execution::Interpereter::Arguments] The underlying arguments instance
@@ -45,6 +53,16 @@ module GraphQL
45
53
  to_h
46
54
  end
47
55
 
56
+ def deconstruct_keys(keys = nil)
57
+ if keys.nil?
58
+ @ruby_style_hash
59
+ else
60
+ new_h = {}
61
+ keys.each { |k| @ruby_style_hash.key?(k) && new_h[k] = @ruby_style_hash[k] }
62
+ new_h
63
+ end
64
+ end
65
+
48
66
  def prepare
49
67
  if @context
50
68
  object = @context[:current_object]
@@ -56,33 +74,6 @@ module GraphQL
56
74
  end
57
75
  end
58
76
 
59
- def self.authorized?(obj, value, ctx)
60
- # Authorize each argument (but this doesn't apply if `prepare` is implemented):
61
- if value.respond_to?(:key?)
62
- ctx.types.arguments(self).each do |input_obj_arg|
63
- if value.key?(input_obj_arg.keyword) &&
64
- !input_obj_arg.authorized?(obj, value[input_obj_arg.keyword], ctx)
65
- return false
66
- end
67
- end
68
- end
69
- # It didn't early-return false:
70
- true
71
- end
72
-
73
- def self.one_of
74
- if !one_of?
75
- if all_argument_definitions.any? { |arg| arg.type.non_null? }
76
- raise ArgumentError, "`one_of` may not be used with required arguments -- add `required: false` to argument definitions to use `one_of`"
77
- end
78
- directive(GraphQL::Schema::Directive::OneOf)
79
- end
80
- end
81
-
82
- def self.one_of?
83
- false # Re-defined when `OneOf` is added
84
- end
85
-
86
77
  def unwrap_value(value)
87
78
  case value
88
79
  when Array
@@ -121,6 +112,33 @@ module GraphQL
121
112
  end
122
113
 
123
114
  class << self
115
+ def authorized?(obj, value, ctx)
116
+ # Authorize each argument (but this doesn't apply if `prepare` is implemented):
117
+ if value.respond_to?(:key?)
118
+ ctx.types.arguments(self).each do |input_obj_arg|
119
+ if value.key?(input_obj_arg.keyword) &&
120
+ !input_obj_arg.authorized?(obj, value[input_obj_arg.keyword], ctx)
121
+ return false
122
+ end
123
+ end
124
+ end
125
+ # It didn't early-return false:
126
+ true
127
+ end
128
+
129
+ def one_of
130
+ if !one_of?
131
+ if all_argument_definitions.any? { |arg| arg.type.non_null? }
132
+ raise ArgumentError, "`one_of` may not be used with required arguments -- add `required: false` to argument definitions to use `one_of`"
133
+ end
134
+ directive(GraphQL::Schema::Directive::OneOf)
135
+ end
136
+ end
137
+
138
+ def one_of?
139
+ false # Re-defined when `OneOf` is added
140
+ end
141
+
124
142
  def argument(*args, **kwargs, &block)
125
143
  argument_defn = super(*args, **kwargs, &block)
126
144
  if one_of?
@@ -246,6 +264,25 @@ module GraphQL
246
264
  result
247
265
  end
248
266
 
267
+ # @param new_has_no_arguments [Boolean] Call with `true` to make this InputObject type ignore the requirement to have any defined arguments.
268
+ # @return [void]
269
+ def has_no_arguments(new_has_no_arguments)
270
+ @has_no_arguments = new_has_no_arguments
271
+ nil
272
+ end
273
+
274
+ # @return [Boolean] `true` if `has_no_arguments(true)` was configued
275
+ def has_no_arguments?
276
+ @has_no_arguments
277
+ end
278
+
279
+ def arguments(context = GraphQL::Query::NullContext.instance, require_defined_arguments = true)
280
+ if require_defined_arguments && !has_no_arguments? && !any_arguments?
281
+ warn(GraphQL::Schema::InputObject::ArgumentsAreRequiredError.new(self).message + "\n\nThis will raise an error in a future GraphQL-Ruby version.")
282
+ end
283
+ super(context, false)
284
+ end
285
+
249
286
  private
250
287
 
251
288
  # Suppress redefinition warning for objectId arguments
@@ -90,7 +90,7 @@ module GraphQL
90
90
  # @param types [Class, Module]
91
91
  # @return [Array<Module, Class>] Implementers of this interface, if they're registered
92
92
  def orphan_types(*types)
93
- if types.any?
93
+ if !types.empty?
94
94
  @orphan_types ||= []
95
95
  @orphan_types.concat(types)
96
96
  else
@@ -187,7 +187,7 @@ module GraphQL
187
187
  camelize: false,
188
188
  connection_extension: nil,
189
189
  ) do
190
- if field_hash["args"].any?
190
+ if !field_hash["args"].empty?
191
191
  loader.build_arguments(self, field_hash["args"], type_resolver)
192
192
  end
193
193
  end
@@ -76,8 +76,8 @@ module GraphQL
76
76
  end
77
77
 
78
78
  # @return [Hash<String => GraphQL::Schema::Argument] Arguments defined on this thing, keyed by name. Includes inherited definitions
79
- def arguments(context = GraphQL::Query::NullContext.instance)
80
- if own_arguments.any?
79
+ def arguments(context = GraphQL::Query::NullContext.instance, _require_defined_arguments = nil)
80
+ if !own_arguments.empty?
81
81
  own_arguments_that_apply = {}
82
82
  own_arguments.each do |name, args_entry|
83
83
  if (visible_defn = Warden.visible_entry?(:visible_argument?, args_entry, context))
@@ -90,7 +90,7 @@ module GraphQL
90
90
  end
91
91
 
92
92
  def any_arguments?
93
- own_arguments.any?
93
+ !own_arguments.empty?
94
94
  end
95
95
 
96
96
  module ClassConfigured
@@ -100,12 +100,12 @@ module GraphQL
100
100
  end
101
101
 
102
102
  module InheritedArguments
103
- def arguments(context = GraphQL::Query::NullContext.instance)
104
- own_arguments = super
105
- inherited_arguments = superclass.arguments(context)
103
+ def arguments(context = GraphQL::Query::NullContext.instance, require_defined_arguments = true)
104
+ own_arguments = super(context, require_defined_arguments)
105
+ inherited_arguments = superclass.arguments(context, false)
106
106
 
107
- if own_arguments.any?
108
- if inherited_arguments.any?
107
+ if !own_arguments.empty?
108
+ if !inherited_arguments.empty?
109
109
  # Local definitions override inherited ones
110
110
  inherited_arguments.merge(own_arguments)
111
111
  else
@@ -149,12 +149,12 @@ module GraphQL
149
149
  end
150
150
 
151
151
  module FieldConfigured
152
- def arguments(context = GraphQL::Query::NullContext.instance)
152
+ def arguments(context = GraphQL::Query::NullContext.instance, _require_defined_arguments = nil)
153
153
  own_arguments = super
154
154
  if @resolver_class
155
155
  inherited_arguments = @resolver_class.field_arguments(context)
156
- if own_arguments.any?
157
- if inherited_arguments.any?
156
+ if !own_arguments.empty?
157
+ if !inherited_arguments.empty?
158
158
  inherited_arguments.merge(own_arguments)
159
159
  else
160
160
  own_arguments
@@ -198,7 +198,7 @@ module GraphQL
198
198
  end
199
199
 
200
200
  def all_argument_definitions
201
- if own_arguments.any?
201
+ if !own_arguments.empty?
202
202
  all_defns = own_arguments.values
203
203
  all_defns.flatten!
204
204
  all_defns
@@ -55,14 +55,14 @@ module GraphQL
55
55
  else
56
56
  GraphQL::EmptyObjects::EMPTY_ARRAY
57
57
  end
58
- if inherited_directives.any? && directives
58
+ if !inherited_directives.empty? && directives
59
59
  dirs = []
60
60
  merge_directives(dirs, inherited_directives)
61
61
  merge_directives(dirs, directives)
62
62
  dirs
63
63
  elsif directives
64
64
  directives
65
- elsif inherited_directives.any?
65
+ elsif !inherited_directives.empty?
66
66
  inherited_directives
67
67
  else
68
68
  GraphQL::EmptyObjects::EMPTY_ARRAY
@@ -71,7 +71,7 @@ module GraphQL
71
71
  dirs = nil
72
72
  schema_member.ancestors.reverse_each do |ancestor|
73
73
  if ancestor.respond_to?(:own_directives) &&
74
- (anc_dirs = ancestor.own_directives).any?
74
+ !(anc_dirs = ancestor.own_directives).empty?
75
75
  dirs ||= []
76
76
  merge_directives(dirs, anc_dirs)
77
77
  end
@@ -79,6 +79,18 @@ module GraphQL
79
79
  end
80
80
  end
81
81
 
82
+ # @param new_has_no_fields [Boolean] Call with `true` to make this Object type ignore the requirement to have any defined fields.
83
+ # @return [void]
84
+ def has_no_fields(new_has_no_fields)
85
+ @has_no_fields = new_has_no_fields
86
+ nil
87
+ end
88
+
89
+ # @return [Boolean] `true` if `has_no_fields(true)` was configued
90
+ def has_no_fields?
91
+ @has_no_fields
92
+ end
93
+
82
94
  # @return [Hash<String => GraphQL::Schema::Field, Array<GraphQL::Schema::Field>>] Fields defined on this class _specifically_, not parent classes
83
95
  def own_fields
84
96
  @own_fields ||= {}
@@ -155,9 +167,11 @@ module GraphQL
155
167
  warden = Warden.from_context(context)
156
168
  # Local overrides take precedence over inherited fields
157
169
  visible_fields = {}
170
+ had_any_fields_at_all = false
158
171
  for ancestor in ancestors
159
172
  if ancestor.respond_to?(:own_fields) && visible_interface_implementation?(ancestor, context, warden)
160
173
  ancestor.own_fields.each do |field_name, fields_entry|
174
+ had_any_fields_at_all = true
161
175
  # Choose the most local definition that passes `.visible?` --
162
176
  # stop checking for fields by name once one has been found.
163
177
  if !visible_fields.key?(field_name) && (f = Warden.visible_entry?(:visible_field?, fields_entry, context, warden))
@@ -166,6 +180,9 @@ module GraphQL
166
180
  end
167
181
  end
168
182
  end
183
+ if !had_any_fields_at_all && !has_no_fields?
184
+ warn(GraphQL::Schema::Object::FieldsAreRequiredError.new(self).message + "\n\nThis will raise an error in a future GraphQL-Ruby version.")
185
+ end
169
186
  visible_fields
170
187
  end
171
188
  end
@@ -188,6 +205,7 @@ module GraphQL
188
205
  subclass.class_eval do
189
206
  @own_fields ||= nil
190
207
  @field_class ||= nil
208
+ @has_no_fields ||= false
191
209
  end
192
210
  end
193
211
 
@@ -24,7 +24,7 @@ module GraphQL
24
24
  implements(next_interface)
25
25
  end
26
26
  elsif int.is_a?(String) || int.is_a?(GraphQL::Schema::LateBoundType)
27
- if options.any?
27
+ if !options.empty?
28
28
  raise ArgumentError, "`implements(...)` doesn't support options with late-loaded types yet. Remove #{options} and open an issue to request this feature."
29
29
  end
30
30
  new_memberships << int
@@ -73,13 +73,13 @@ module GraphQL
73
73
  def interfaces(context = GraphQL::Query::NullContext.instance)
74
74
  visible_interfaces = super
75
75
  inherited_interfaces = superclass.interfaces(context)
76
- if visible_interfaces.any?
77
- if inherited_interfaces.any?
76
+ if !visible_interfaces.empty?
77
+ if !inherited_interfaces.empty?
78
78
  visible_interfaces.concat(inherited_interfaces)
79
79
  visible_interfaces.uniq!
80
80
  end
81
81
  visible_interfaces
82
- elsif inherited_interfaces.any?
82
+ elsif !inherited_interfaces.empty?
83
83
  inherited_interfaces
84
84
  else
85
85
  EmptyObjects::EMPTY_ARRAY
@@ -32,7 +32,7 @@ module GraphQL
32
32
 
33
33
  def validators
34
34
  inherited_validators = superclass.validators
35
- if inherited_validators.any?
35
+ if !inherited_validators.empty?
36
36
  if @own_validators.nil?
37
37
  inherited_validators
38
38
  else
@@ -8,6 +8,14 @@ module GraphQL
8
8
  extend GraphQL::Schema::Member::HasFields
9
9
  extend GraphQL::Schema::Member::HasInterfaces
10
10
 
11
+ # Raised when an Object doesn't have any field defined and hasn't explicitly opted out of this requirement
12
+ class FieldsAreRequiredError < GraphQL::Error
13
+ def initialize(object_type)
14
+ message = "Object types must have fields, but #{object_type.graphql_name} doesn't have any. Define a field for this type, remove it from your schema, or add `has_no_fields(true)` to its definition."
15
+ super(message)
16
+ end
17
+ end
18
+
11
19
  # @return [Object] the application object this type is wrapping
12
20
  attr_reader :object
13
21
 
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- require "graphql/types/string"
3
2
 
4
3
  module GraphQL
5
4
  class Schema
@@ -67,7 +67,7 @@ module GraphQL
67
67
  # @api private
68
68
  def resolve_with_support(**args)
69
69
  # First call the ready? hook which may raise
70
- raw_ready_val = if args.any?
70
+ raw_ready_val = if !args.empty?
71
71
  ready?(**args)
72
72
  else
73
73
  ready?
@@ -88,7 +88,7 @@ module GraphQL
88
88
  @prepared_arguments = loaded_args
89
89
  Schema::Validator.validate!(self.class.validators, object, context, loaded_args, as: @field)
90
90
  # Then call `authorized?`, which may raise or may return a lazy object
91
- raw_authorized_val = if loaded_args.any?
91
+ raw_authorized_val = if !loaded_args.empty?
92
92
  authorized?(**loaded_args)
93
93
  else
94
94
  authorized?
@@ -117,7 +117,7 @@ module GraphQL
117
117
 
118
118
  # @api private {GraphQL::Schema::Mutation} uses this to clear the dataloader cache
119
119
  def call_resolve(args_hash)
120
- if args_hash.any?
120
+ if !args_hash.empty?
121
121
  public_send(self.class.resolve_method, **args_hash)
122
122
  else
123
123
  public_send(self.class.resolve_method)
@@ -208,7 +208,7 @@ module GraphQL
208
208
  end
209
209
 
210
210
  # Avoid returning a lazy if none are needed
211
- if prepare_lazies.any?
211
+ if !prepare_lazies.empty?
212
212
  GraphQL::Execution::Lazy.all(prepare_lazies).then { prepared_args }
213
213
  else
214
214
  prepared_args
@@ -394,7 +394,7 @@ module GraphQL
394
394
  if superclass.respond_to?(:extensions)
395
395
  s_exts = superclass.extensions
396
396
  if own_exts
397
- if s_exts.any?
397
+ if !s_exts.empty?
398
398
  own_exts + s_exts
399
399
  else
400
400
  own_exts
@@ -55,7 +55,7 @@ module GraphQL
55
55
 
56
56
  # Wrap the user-defined `#subscribe` hook
57
57
  def resolve_subscribe(**args)
58
- ret_val = args.any? ? subscribe(**args) : subscribe
58
+ ret_val = !args.empty? ? subscribe(**args) : subscribe
59
59
  if ret_val == :no_response
60
60
  context.skip
61
61
  else
@@ -72,7 +72,7 @@ module GraphQL
72
72
 
73
73
  # Wrap the user-provided `#update` hook
74
74
  def resolve_update(**args)
75
- ret_val = args.any? ? update(**args) : update
75
+ ret_val = !args.empty? ? update(**args) : update
76
76
  if ret_val == NO_UPDATE
77
77
  context.namespace(:subscriptions)[:no_update] = true
78
78
  context.skip
@@ -11,7 +11,7 @@ module GraphQL
11
11
  end
12
12
 
13
13
  def possible_types(*types, context: GraphQL::Query::NullContext.instance, **options)
14
- if types.any?
14
+ if !types.empty?
15
15
  types.each do |t|
16
16
  assert_valid_union_member(t)
17
17
  type_memberships << type_membership_class.new(self, t, **options)
@@ -143,7 +143,7 @@ module GraphQL
143
143
  end
144
144
  end
145
145
 
146
- if all_errors.any?
146
+ if !all_errors.empty?
147
147
  raise ValidationFailedError.new(errors: all_errors)
148
148
  end
149
149
  nil
@@ -111,7 +111,7 @@ module GraphQL
111
111
  end
112
112
 
113
113
  def type(type_name)
114
- t = @schema.visibility.get_type(type_name) # rubocop:disable ContextIsPassedCop
114
+ t = @schema.visibility.get_type(type_name) # rubocop:disable Development/ContextIsPassedCop
115
115
  if t
116
116
  if t.is_a?(Array)
117
117
  vis_t = nil
@@ -239,7 +239,9 @@ module GraphQL
239
239
  end
240
240
 
241
241
  def directives
242
- @all_directives ||= @schema.visibility.all_directives.select { |dir| @cached_visible[dir] }
242
+ @all_directives ||= @schema.visibility.all_directives.select { |dir|
243
+ @cached_visible[dir] && @schema.visibility.all_references[dir].any? { |ref| ref == true || (@cached_visible[ref] && referenced?(ref)) }
244
+ }
243
245
  end
244
246
 
245
247
  def loadable?(t, _ctx)
@@ -35,7 +35,7 @@ module GraphQL
35
35
  @late_bound_types = []
36
36
  directives_to_visit = directives
37
37
 
38
- while @unvisited_types.any? || @late_bound_types.any?
38
+ while !@unvisited_types.empty? || !@late_bound_types.empty?
39
39
  while (type = @unvisited_types.pop)
40
40
  if @visited_types.add?(type) && @visit_block.call(type)
41
41
  directives_to_visit.concat(type.directives)
@@ -156,7 +156,7 @@ module GraphQL
156
156
  pt << owner
157
157
  end
158
158
  int.interfaces.each do |indirect_int|
159
- if indirect_int.is_a?(LateBoundType) && (indirect_int_type = get_type(indirect_int.graphql_name)) # rubocop:disable ContextIsPassedCop
159
+ if indirect_int.is_a?(LateBoundType) && (indirect_int_type = get_type(indirect_int.graphql_name)) # rubocop:disable Development/ContextIsPassedCop
160
160
  update_type_owner(owner, indirect_int_type)
161
161
  end
162
162
  end