graphql 2.0.16 → 2.0.17.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/lib/graphql/analysis/ast/visitor.rb +42 -35
  3. data/lib/graphql/execution/interpreter/runtime.rb +14 -4
  4. data/lib/graphql/execution/interpreter.rb +10 -0
  5. data/lib/graphql/execution/lazy.rb +4 -8
  6. data/lib/graphql/introspection/directive_type.rb +2 -2
  7. data/lib/graphql/introspection/field_type.rb +1 -1
  8. data/lib/graphql/introspection/schema_type.rb +2 -2
  9. data/lib/graphql/introspection/type_type.rb +5 -5
  10. data/lib/graphql/language/nodes.rb +39 -31
  11. data/lib/graphql/language/visitor.rb +191 -83
  12. data/lib/graphql/schema/argument.rb +0 -4
  13. data/lib/graphql/schema/directive.rb +12 -2
  14. data/lib/graphql/schema/enum.rb +24 -17
  15. data/lib/graphql/schema/enum_value.rb +5 -3
  16. data/lib/graphql/schema/field.rb +24 -26
  17. data/lib/graphql/schema/interface.rb +0 -10
  18. data/lib/graphql/schema/late_bound_type.rb +2 -0
  19. data/lib/graphql/schema/member/base_dsl_methods.rb +15 -14
  20. data/lib/graphql/schema/member/has_arguments.rb +104 -57
  21. data/lib/graphql/schema/member/has_fields.rb +8 -1
  22. data/lib/graphql/schema/member/has_interfaces.rb +49 -8
  23. data/lib/graphql/schema/member/has_validators.rb +31 -5
  24. data/lib/graphql/schema/member/type_system_helpers.rb +17 -0
  25. data/lib/graphql/schema/warden.rb +18 -3
  26. data/lib/graphql/schema.rb +3 -19
  27. data/lib/graphql/static_validation/literal_validator.rb +15 -1
  28. data/lib/graphql/subscriptions/event.rb +2 -7
  29. data/lib/graphql/types/relay/connection_behaviors.rb +0 -4
  30. data/lib/graphql/types/relay/edge_behaviors.rb +0 -4
  31. data/lib/graphql/types/string.rb +1 -1
  32. data/lib/graphql/version.rb +1 -1
  33. metadata +3 -3
@@ -11,6 +11,7 @@ module GraphQL
11
11
  def self.extended(cls)
12
12
  cls.extend(ArgumentClassAccessor)
13
13
  cls.include(ArgumentObjectLoader)
14
+ cls.extend(ClassConfigured)
14
15
  end
15
16
 
16
17
  # @see {GraphQL::Schema::Argument#initialize} for parameters
@@ -109,14 +110,6 @@ module GraphQL
109
110
 
110
111
  # @return [Hash<String => GraphQL::Schema::Argument] Arguments defined on this thing, keyed by name. Includes inherited definitions
111
112
  def arguments(context = GraphQL::Query::NullContext)
112
- inherited_arguments = if self.is_a?(Class) && superclass.respond_to?(:arguments)
113
- superclass.arguments(context)
114
- elsif defined?(@resolver_class) && @resolver_class
115
- @resolver_class.field_arguments(context)
116
- else
117
- nil
118
- end
119
- # Local definitions override inherited ones
120
113
  if own_arguments.any?
121
114
  own_arguments_that_apply = {}
122
115
  own_arguments.each do |name, args_entry|
@@ -125,47 +118,107 @@ module GraphQL
125
118
  end
126
119
  end
127
120
  end
121
+ # might be nil if there are actually no arguments
122
+ own_arguments_that_apply || own_arguments
123
+ end
128
124
 
129
- if inherited_arguments
130
- if own_arguments_that_apply
131
- inherited_arguments.merge(own_arguments_that_apply)
132
- else
133
- inherited_arguments
125
+ module ClassConfigured
126
+ def inherited(child_class)
127
+ super
128
+ child_class.extend(InheritedArguments)
129
+ end
130
+
131
+ module InheritedArguments
132
+ def arguments(context = GraphQL::Query::NullContext)
133
+ own_arguments = super
134
+ inherited_arguments = superclass.arguments(context)
135
+
136
+ if own_arguments.any?
137
+ if inherited_arguments.any?
138
+ # Local definitions override inherited ones
139
+ inherited_arguments.merge(own_arguments)
140
+ else
141
+ own_arguments
142
+ end
143
+ else
144
+ inherited_arguments
145
+ end
146
+ end
147
+
148
+ def all_argument_definitions
149
+ all_defns = {}
150
+ ancestors.reverse_each do |ancestor|
151
+ if ancestor.respond_to?(:own_arguments)
152
+ all_defns.merge!(ancestor.own_arguments)
153
+ end
154
+ end
155
+ all_defns = all_defns.values
156
+ all_defns.flatten!
157
+ all_defns
158
+ end
159
+
160
+
161
+ def get_argument(argument_name, context = GraphQL::Query::NullContext)
162
+ warden = Warden.from_context(context)
163
+ for ancestor in ancestors
164
+ if ancestor.respond_to?(:own_arguments) &&
165
+ (a = ancestor.own_arguments[argument_name]) &&
166
+ (a = Warden.visible_entry?(:visible_argument?, a, context, warden))
167
+ return a
168
+ end
169
+ end
170
+ nil
134
171
  end
135
- else
136
- # might be nil if there are actually no arguments
137
- own_arguments_that_apply || own_arguments
138
172
  end
139
173
  end
140
174
 
141
- def all_argument_definitions
142
- if self.is_a?(Class)
143
- all_defns = {}
144
- ancestors.reverse_each do |ancestor|
145
- if ancestor.respond_to?(:own_arguments)
146
- all_defns.merge!(ancestor.own_arguments)
175
+ module FieldConfigured
176
+ def arguments(context = GraphQL::Query::NullContext)
177
+ own_arguments = super
178
+ if defined?(@resolver_class) && @resolver_class
179
+ inherited_arguments = @resolver_class.field_arguments(context)
180
+ if own_arguments.any?
181
+ if inherited_arguments.any?
182
+ inherited_arguments.merge(own_arguments)
183
+ else
184
+ own_arguments
185
+ end
186
+ else
187
+ inherited_arguments
147
188
  end
189
+ else
190
+ own_arguments
148
191
  end
149
- elsif defined?(@resolver_class) && @resolver_class
150
- all_defns = {}
151
- @resolver_class.all_field_argument_definitions.each do |arg_defn|
152
- key = arg_defn.graphql_name
153
- case (current_value = all_defns[key])
154
- when nil
155
- all_defns[key] = arg_defn
156
- when Array
157
- current_value << arg_defn
158
- when GraphQL::Schema::Argument
159
- all_defns[key] = [current_value, arg_defn]
160
- else
161
- raise "Invariant: Unexpected argument definition, #{current_value.class}: #{current_value.inspect}"
192
+ end
193
+
194
+ def all_argument_definitions
195
+ if defined?(@resolver_class) && @resolver_class
196
+ all_defns = {}
197
+ @resolver_class.all_field_argument_definitions.each do |arg_defn|
198
+ key = arg_defn.graphql_name
199
+ case (current_value = all_defns[key])
200
+ when nil
201
+ all_defns[key] = arg_defn
202
+ when Array
203
+ current_value << arg_defn
204
+ when GraphQL::Schema::Argument
205
+ all_defns[key] = [current_value, arg_defn]
206
+ else
207
+ raise "Invariant: Unexpected argument definition, #{current_value.class}: #{current_value.inspect}"
208
+ end
162
209
  end
210
+ all_defns.merge!(own_arguments)
211
+ all_defns = all_defns.values
212
+ all_defns.flatten!
213
+ all_defns
214
+ else
215
+ super
163
216
  end
164
- all_defns.merge!(own_arguments)
165
- else
166
- all_defns = own_arguments
167
217
  end
168
- all_defns = all_defns.values
218
+ end
219
+
220
+ def all_argument_definitions
221
+ all_defns = own_arguments.values
169
222
  all_defns.flatten!
170
223
  all_defns
171
224
  end
@@ -173,22 +226,11 @@ module GraphQL
173
226
  # @return [GraphQL::Schema::Argument, nil] Argument defined on this thing, fetched by name.
174
227
  def get_argument(argument_name, context = GraphQL::Query::NullContext)
175
228
  warden = Warden.from_context(context)
176
- if !self.is_a?(Class)
177
- if (arg_config = own_arguments[argument_name]) && (visible_arg = Warden.visible_entry?(:visible_argument?, arg_config, context, warden))
178
- visible_arg
179
- elsif defined?(@resolver_class) && @resolver_class
180
- @resolver_class.get_field_argument(argument_name, context)
181
- else
182
- nil
183
- end
229
+ if (arg_config = own_arguments[argument_name]) && (visible_arg = Warden.visible_entry?(:visible_argument?, arg_config, context, warden))
230
+ visible_arg
231
+ elsif defined?(@resolver_class) && @resolver_class
232
+ @resolver_class.get_field_argument(argument_name, context)
184
233
  else
185
- for ancestor in ancestors
186
- if ancestor.respond_to?(:own_arguments) &&
187
- (a = ancestor.own_arguments[argument_name]) &&
188
- (a = Warden.visible_entry?(:visible_argument?, a, context, warden))
189
- return a
190
- end
191
- end
192
234
  nil
193
235
  end
194
236
  end
@@ -209,7 +251,7 @@ module GraphQL
209
251
  # @return [Interpreter::Arguments, Execution::Lazy<Interpeter::Arguments>]
210
252
  def coerce_arguments(parent_object, values, context, &block)
211
253
  # Cache this hash to avoid re-merging it
212
- arg_defns = self.arguments(context)
254
+ arg_defns = context.warden.arguments(self)
213
255
  total_args_count = arg_defns.size
214
256
 
215
257
  finished_args = nil
@@ -223,7 +265,7 @@ module GraphQL
223
265
  argument_values = {}
224
266
  resolved_args_count = 0
225
267
  raised_error = false
226
- arg_defns.each do |arg_name, arg_defn|
268
+ arg_defns.each do |arg_defn|
227
269
  context.dataloader.append_job do
228
270
  begin
229
271
  arg_defn.coerce_into_values(parent_object, values, context, argument_values)
@@ -265,7 +307,12 @@ module GraphQL
265
307
  # but not for directives.
266
308
  # TODO apply static validations on schema definitions?
267
309
  def validate_directive_argument(arg_defn, value)
268
- if arg_defn.owner.is_a?(Class) && arg_defn.owner < GraphQL::Schema::Directive
310
+ # this is only implemented on directives.
311
+ nil
312
+ end
313
+
314
+ module HasDirectiveArguments
315
+ def validate_directive_argument(arg_defn, value)
269
316
  if value.nil? && arg_defn.type.non_null?
270
317
  raise ArgumentError, "#{arg_defn.path} is required, but no value was given"
271
318
  end
@@ -129,12 +129,19 @@ module GraphQL
129
129
 
130
130
  private
131
131
 
132
+ def inherited(subclass)
133
+ super
134
+ subclass.class_eval do
135
+ @own_fields ||= nil
136
+ end
137
+ end
138
+
132
139
  # If `type` is an interface, and `self` has a type membership for `type`, then make sure it's visible.
133
140
  def visible_interface_implementation?(type, context, warden)
134
141
  if type.respond_to?(:kind) && type.kind.interface?
135
142
  implements_this_interface = false
136
143
  implementation_is_visible = false
137
- interface_type_memberships.each do |tm|
144
+ warden.interface_type_memberships(self, context).each do |tm|
138
145
  if tm.abstract_type == type
139
146
  implements_this_interface ||= true
140
147
  if warden.visible_type_membership?(tm, context)
@@ -55,7 +55,38 @@ module GraphQL
55
55
  end
56
56
 
57
57
  def interface_type_memberships
58
- own_interface_type_memberships + ((self.is_a?(Class) && superclass.respond_to?(:interface_type_memberships)) ? superclass.interface_type_memberships : [])
58
+ own_interface_type_memberships
59
+ end
60
+
61
+ module ClassConfigured
62
+ # This combination of extended -> inherited -> extended
63
+ # means that the base class (`Schema::Object`) *won't*
64
+ # have the superclass-related code in `InheritedInterfaces`,
65
+ # but child classes of `Schema::Object` will have it.
66
+ # That way, we don't need a `superclass.respond_to?(...)` check.
67
+ def inherited(child_class)
68
+ super
69
+ child_class.extend(InheritedInterfaces)
70
+ end
71
+
72
+ module InheritedInterfaces
73
+ def interfaces(context = GraphQL::Query::NullContext)
74
+ visible_interfaces = super
75
+ visible_interfaces.concat(superclass.interfaces(context))
76
+ visible_interfaces.uniq!
77
+ visible_interfaces
78
+ end
79
+
80
+ def interface_type_memberships
81
+ own_tms = super
82
+ inherited_tms = superclass.interface_type_memberships
83
+ if inherited_tms.size > 0
84
+ own_tms + inherited_tms
85
+ else
86
+ own_tms
87
+ end
88
+ end
89
+ end
59
90
  end
60
91
 
61
92
  # param context [Query::Context] If omitted, skip filtering.
@@ -63,24 +94,34 @@ module GraphQL
63
94
  warden = Warden.from_context(context)
64
95
  visible_interfaces = []
65
96
  own_interface_type_memberships.each do |type_membership|
66
- # During initialization, `type_memberships` can hold late-bound types
67
97
  case type_membership
68
- when String, Schema::LateBoundType
69
- visible_interfaces << type_membership
70
98
  when Schema::TypeMembership
71
99
  if warden.visible_type_membership?(type_membership, context)
72
100
  visible_interfaces << type_membership.abstract_type
73
101
  end
102
+ when String, Schema::LateBoundType
103
+ # During initialization, `type_memberships` can hold late-bound types
104
+ visible_interfaces << type_membership
74
105
  else
75
106
  raise "Invariant: Unexpected type_membership #{type_membership.class}: #{type_membership.inspect}"
76
107
  end
77
108
  end
109
+ visible_interfaces.uniq!
78
110
 
79
- if self.is_a?(Class) && superclass <= GraphQL::Schema::Object
80
- visible_interfaces.concat(superclass.interfaces(context))
81
- end
111
+ visible_interfaces
112
+ end
82
113
 
83
- visible_interfaces.uniq
114
+ private
115
+
116
+ def self.extended(child_class)
117
+ child_class.extend(ClassConfigured)
118
+ end
119
+
120
+ def inherited(subclass)
121
+ super
122
+ subclass.class_eval do
123
+ @own_interface_type_memberships ||= nil
124
+ end
84
125
  end
85
126
  end
86
127
  end
@@ -18,12 +18,38 @@ module GraphQL
18
18
 
19
19
  # @return [Array<GraphQL::Schema::Validator>]
20
20
  def validators
21
- own_validators = @own_validators || EMPTY_ARRAY
22
- if self.is_a?(Class) && superclass.respond_to?(:validators) && (inherited_validators = superclass.validators).any?
23
- inherited_validators + own_validators
24
- else
25
- own_validators
21
+ @own_validators || EMPTY_ARRAY
22
+ end
23
+
24
+ module ClassConfigured
25
+ def inherited(child_cls)
26
+ super
27
+ child_cls.extend(ClassValidators)
26
28
  end
29
+
30
+ module ClassValidators
31
+ include Schema::FindInheritedValue::EmptyObjects
32
+
33
+ def validators
34
+ inherited_validators = superclass.validators
35
+ if inherited_validators.any?
36
+ if @own_validators.nil?
37
+ inherited_validators
38
+ else
39
+ inherited_validators + @own_validators
40
+ end
41
+ elsif @own_validators.nil?
42
+ EMPTY_ARRAY
43
+ else
44
+ @own_validators
45
+ end
46
+ end
47
+ end
48
+ end
49
+
50
+ def self.extended(child_cls)
51
+ super
52
+ child_cls.extend(ClassConfigured)
27
53
  end
28
54
  end
29
55
  end
@@ -4,6 +4,13 @@ module GraphQL
4
4
  class Schema
5
5
  class Member
6
6
  module TypeSystemHelpers
7
+ def initialize(*args, &block)
8
+ super
9
+ @to_non_null_type ||= nil
10
+ @to_list_type ||= nil
11
+ end
12
+ ruby2_keywords :initialize if respond_to?(:ruby2_keywords, true)
13
+
7
14
  # @return [Schema::NonNull] Make a non-null-type representation of this type
8
15
  def to_non_null_type
9
16
  @to_non_null_type ||= GraphQL::Schema::NonNull.new(self)
@@ -32,6 +39,16 @@ module GraphQL
32
39
  def kind
33
40
  raise GraphQL::RequiredImplementationMissingError, "No `.kind` defined for #{self}"
34
41
  end
42
+
43
+ private
44
+
45
+ def inherited(subclass)
46
+ super
47
+ subclass.class_eval do
48
+ @to_non_null_type ||= nil
49
+ @to_list_type ||= nil
50
+ end
51
+ end
35
52
  end
36
53
  end
37
54
  end
@@ -80,6 +80,8 @@ module GraphQL
80
80
  def visible_type?(type, ctx); type.visible?(ctx); end
81
81
  def visible_enum_value?(ev, ctx); ev.visible?(ctx); end
82
82
  def visible_type_membership?(tm, ctx); tm.visible?(ctx); end
83
+ def interface_type_memberships(obj_t, ctx); obj_t.interface_type_memberships; end
84
+ def arguments(owner, ctx); owner.arguments(ctx); end
83
85
  end
84
86
  end
85
87
 
@@ -174,14 +176,20 @@ module GraphQL
174
176
 
175
177
  # @param argument_owner [GraphQL::Field, GraphQL::InputObjectType]
176
178
  # @return [Array<GraphQL::Argument>] Visible arguments on `argument_owner`
177
- def arguments(argument_owner)
178
- @visible_arguments ||= read_through { |o| o.arguments(@context).each_value.select { |a| visible_argument?(a) } }
179
+ def arguments(argument_owner, ctx = nil)
180
+ @visible_arguments ||= read_through { |o| o.arguments(@context).each_value.select { |a| visible_argument?(a, @context) } }
179
181
  @visible_arguments[argument_owner]
180
182
  end
181
183
 
182
184
  # @return [Array<GraphQL::EnumType::EnumValue>] Visible members of `enum_defn`
183
185
  def enum_values(enum_defn)
184
- @visible_enum_arrays ||= read_through { |e| e.enum_values(@context) }
186
+ @visible_enum_arrays ||= read_through { |e|
187
+ values = e.enum_values(@context)
188
+ if values.size == 0
189
+ raise GraphQL::Schema::Enum::MissingValuesError.new(e)
190
+ end
191
+ values
192
+ }
185
193
  @visible_enum_arrays[enum_defn]
186
194
  end
187
195
 
@@ -233,6 +241,13 @@ module GraphQL
233
241
  visible?(type_membership)
234
242
  end
235
243
 
244
+ def interface_type_memberships(obj_type, _ctx = nil)
245
+ @type_memberships ||= read_through do |obj_t|
246
+ obj_t.interface_type_memberships
247
+ end
248
+ @type_memberships[obj_type]
249
+ end
250
+
236
251
  private
237
252
 
238
253
  def visible_and_reachable_type?(type_defn)
@@ -62,7 +62,7 @@ module GraphQL
62
62
  # Schemas can specify how queries should be executed against them.
63
63
  # `query_execution_strategy`, `mutation_execution_strategy` and `subscription_execution_strategy`
64
64
  # each apply to corresponding root types.
65
- # #
65
+ #
66
66
  # @example defining a schema
67
67
  # class MySchema < GraphQL::Schema
68
68
  # query QueryType
@@ -755,7 +755,7 @@ module GraphQL
755
755
  if handler
756
756
  obj = context[:current_object]
757
757
  args = context[:current_arguments]
758
- args = args && args.keyword_arguments
758
+ args = args && args.respond_to?(:keyword_arguments) ? args.keyword_arguments : nil
759
759
  field = context[:current_field]
760
760
  if obj.is_a?(GraphQL::Schema::Object)
761
761
  obj = obj.object
@@ -826,10 +826,6 @@ module GraphQL
826
826
  member.visible?(ctx)
827
827
  end
828
828
 
829
- def accessible?(member, ctx)
830
- member.accessible?(ctx)
831
- end
832
-
833
829
  def schema_directive(dir_class, **options)
834
830
  @own_schema_directives ||= []
835
831
  Member::HasDirectives.add_directive(self, @own_schema_directives, dir_class, options)
@@ -839,18 +835,6 @@ module GraphQL
839
835
  Member::HasDirectives.get_directives(self, @own_schema_directives, :schema_directives)
840
836
  end
841
837
 
842
- # This hook is called when a client tries to access one or more
843
- # fields that fail the `accessible?` check.
844
- #
845
- # By default, an error is added to the response. Override this hook to
846
- # track metrics or return a different error to the client.
847
- #
848
- # @param error [InaccessibleFieldsError] The analysis error for this check
849
- # @return [AnalysisError, nil] Return an error to skip the query
850
- def inaccessible_fields(error)
851
- error
852
- end
853
-
854
838
  # This hook is called when an object fails an `authorized?` check.
855
839
  # You might report to your bug tracker here, so you can correct
856
840
  # the field resolvers not to return unauthorized objects.
@@ -900,7 +884,7 @@ module GraphQL
900
884
  # A function to call when {#execute} receives an invalid query string
901
885
  #
902
886
  # The default is to add the error to `context.errors`
903
- # @param err [GraphQL::ParseError] The error encountered during parsing
887
+ # @param parse_err [GraphQL::ParseError] The error encountered during parsing
904
888
  # @param ctx [GraphQL::Query::Context] The context for the query where the error occurred
905
889
  # @return void
906
890
  def parse_error(parse_err, ctx)
@@ -18,6 +18,19 @@ module GraphQL
18
18
 
19
19
  private
20
20
 
21
+ def replace_nulls_in(ast_value)
22
+ case ast_value
23
+ when Array
24
+ ast_value.map { |v| replace_nulls_in(v) }
25
+ when GraphQL::Language::Nodes::InputObject
26
+ ast_value.to_h
27
+ when GraphQL::Language::Nodes::NullValue
28
+ nil
29
+ else
30
+ ast_value
31
+ end
32
+ end
33
+
21
34
  def recursively_validate(ast_value, type)
22
35
  if type.nil?
23
36
  # this means we're an undefined argument, see #present_input_field_values_are_valid
@@ -42,7 +55,8 @@ module GraphQL
42
55
  @valid_response
43
56
  elsif type.kind.scalar? && constant_scalar?(ast_value)
44
57
  maybe_raise_if_invalid(ast_value) do
45
- type.validate_input(ast_value, @context)
58
+ ruby_value = replace_nulls_in(ast_value)
59
+ type.validate_input(ruby_value, @context)
46
60
  end
47
61
  elsif type.kind.enum?
48
62
  maybe_raise_if_invalid(ast_value) do
@@ -100,13 +100,8 @@ module GraphQL
100
100
  arg_name = k.to_s
101
101
  camelized_arg_name = GraphQL::Schema::Member::BuildType.camelize(arg_name)
102
102
  arg_defn = get_arg_definition(arg_owner, camelized_arg_name, context)
103
-
104
- if arg_defn
105
- normalized_arg_name = camelized_arg_name
106
- else
107
- normalized_arg_name = arg_name
108
- arg_defn = get_arg_definition(arg_owner, normalized_arg_name, context)
109
- end
103
+ arg_defn ||= get_arg_definition(arg_owner, arg_name, context)
104
+ normalized_arg_name = arg_defn.graphql_name
110
105
  arg_base_type = arg_defn.type.unwrap
111
106
  # In the case where the value being emitted is seen as a "JSON"
112
107
  # type, treat the value as one atomic unit of serialization
@@ -79,10 +79,6 @@ module GraphQL
79
79
  true # Let nodes be filtered out
80
80
  end
81
81
 
82
- def accessible?(ctx)
83
- node_type.accessible?(ctx)
84
- end
85
-
86
82
  def visible?(ctx)
87
83
  # if this is an abstract base class, there may be no `node_type`
88
84
  node_type ? node_type.visible?(ctx) : super
@@ -41,10 +41,6 @@ module GraphQL
41
41
  true
42
42
  end
43
43
 
44
- def accessible?(ctx)
45
- node_type.accessible?(ctx)
46
- end
47
-
48
44
  def visible?(ctx)
49
45
  node_type.visible?(ctx)
50
46
  end
@@ -7,7 +7,7 @@ module GraphQL
7
7
 
8
8
  def self.coerce_result(value, ctx)
9
9
  str = value.to_s
10
- if str.encoding == Encoding::UTF_8
10
+ if str.encoding == Encoding::UTF_8 || str.ascii_only?
11
11
  str
12
12
  elsif str.frozen?
13
13
  str.encode(Encoding::UTF_8)
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module GraphQL
3
- VERSION = "2.0.16"
3
+ VERSION = "2.0.17.1"
4
4
  end
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.0.16
4
+ version: 2.0.17.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robert Mosolgo
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-12-19 00:00:00.000000000 Z
11
+ date: 2023-03-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: benchmark-ips
@@ -597,7 +597,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
597
597
  - !ruby/object:Gem::Version
598
598
  version: '0'
599
599
  requirements: []
600
- rubygems_version: 3.3.3
600
+ rubygems_version: 3.4.1
601
601
  signing_key:
602
602
  specification_version: 4
603
603
  summary: A GraphQL language and runtime for Ruby