graphql 1.9.21 → 1.10.0.pre1

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.
Files changed (125) hide show
  1. checksums.yaml +4 -4
  2. data/lib/generators/graphql/core.rb +0 -1
  3. data/lib/generators/graphql/install_generator.rb +0 -1
  4. data/lib/generators/graphql/mutation_generator.rb +1 -1
  5. data/lib/generators/graphql/templates/base_field.erb +4 -0
  6. data/lib/generators/graphql/templates/graphql_controller.erb +0 -5
  7. data/lib/generators/graphql/templates/mutation.erb +1 -1
  8. data/lib/generators/graphql/templates/schema.erb +1 -1
  9. data/lib/graphql.rb +1 -11
  10. data/lib/graphql/analysis/ast.rb +2 -2
  11. data/lib/graphql/analysis/ast/analyzer.rb +4 -23
  12. data/lib/graphql/analysis/ast/max_query_complexity.rb +3 -3
  13. data/lib/graphql/analysis/ast/max_query_depth.rb +3 -7
  14. data/lib/graphql/analysis/ast/query_complexity.rb +2 -2
  15. data/lib/graphql/argument.rb +6 -2
  16. data/lib/graphql/backtrace/table.rb +10 -2
  17. data/lib/graphql/base_type.rb +5 -1
  18. data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +5 -9
  19. data/lib/graphql/define/assign_object_field.rb +2 -2
  20. data/lib/graphql/define/defined_object_proxy.rb +0 -3
  21. data/lib/graphql/define/instance_definable.rb +3 -14
  22. data/lib/graphql/enum_type.rb +4 -0
  23. data/lib/graphql/execution/directive_checks.rb +2 -2
  24. data/lib/graphql/execution/errors.rb +14 -15
  25. data/lib/graphql/execution/execute.rb +1 -1
  26. data/lib/graphql/execution/interpreter/runtime.rb +17 -39
  27. data/lib/graphql/execution/multiplex.rb +3 -3
  28. data/lib/graphql/field.rb +8 -0
  29. data/lib/graphql/filter.rb +1 -1
  30. data/lib/graphql/function.rb +1 -1
  31. data/lib/graphql/input_object_type.rb +1 -2
  32. data/lib/graphql/introspection/entry_points.rb +1 -2
  33. data/lib/graphql/introspection/input_value_type.rb +27 -9
  34. data/lib/graphql/introspection/schema_type.rb +1 -2
  35. data/lib/graphql/language/block_string.rb +2 -2
  36. data/lib/graphql/language/document_from_schema_definition.rb +5 -11
  37. data/lib/graphql/language/lexer.rb +48 -49
  38. data/lib/graphql/language/lexer.rl +48 -49
  39. data/lib/graphql/language/nodes.rb +11 -14
  40. data/lib/graphql/language/parser.rb +645 -650
  41. data/lib/graphql/language/parser.y +7 -8
  42. data/lib/graphql/language/token.rb +1 -1
  43. data/lib/graphql/non_null_type.rb +0 -10
  44. data/lib/graphql/pagination.rb +6 -0
  45. data/lib/graphql/pagination/active_record_relation_connection.rb +35 -0
  46. data/lib/graphql/pagination/array_connection.rb +78 -0
  47. data/lib/graphql/pagination/connection.rb +150 -0
  48. data/lib/graphql/pagination/connections.rb +103 -0
  49. data/lib/graphql/pagination/mongoid_relation_connection.rb +25 -0
  50. data/lib/graphql/pagination/relation_connection.rb +157 -0
  51. data/lib/graphql/pagination/sequel_dataset_connection.rb +28 -0
  52. data/lib/graphql/query.rb +1 -7
  53. data/lib/graphql/query/arguments.rb +3 -9
  54. data/lib/graphql/query/context.rb +9 -31
  55. data/lib/graphql/query/literal_input.rb +29 -10
  56. data/lib/graphql/query/null_context.rb +0 -4
  57. data/lib/graphql/query/variable_validation_error.rb +1 -1
  58. data/lib/graphql/query/variables.rb +2 -4
  59. data/lib/graphql/relay/base_connection.rb +7 -3
  60. data/lib/graphql/relay/edges_instrumentation.rb +1 -1
  61. data/lib/graphql/relay/node.rb +2 -2
  62. data/lib/graphql/relay/relation_connection.rb +5 -9
  63. data/lib/graphql/schema.rb +27 -68
  64. data/lib/graphql/schema/argument.rb +31 -5
  65. data/lib/graphql/schema/base_64_bp.rb +2 -3
  66. data/lib/graphql/schema/build_from_definition.rb +113 -179
  67. data/lib/graphql/schema/build_from_definition/resolve_map.rb +10 -4
  68. data/lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb +1 -1
  69. data/lib/graphql/schema/directive.rb +6 -7
  70. data/lib/graphql/schema/directive/feature.rb +1 -1
  71. data/lib/graphql/schema/enum.rb +1 -0
  72. data/lib/graphql/schema/enum_value.rb +4 -1
  73. data/lib/graphql/schema/field.rb +37 -39
  74. data/lib/graphql/schema/field/connection_extension.rb +11 -1
  75. data/lib/graphql/schema/input_object.rb +2 -5
  76. data/lib/graphql/schema/interface.rb +2 -0
  77. data/lib/graphql/schema/introspection_system.rb +1 -4
  78. data/lib/graphql/schema/loader.rb +6 -12
  79. data/lib/graphql/schema/member.rb +2 -0
  80. data/lib/graphql/schema/member/base_dsl_methods.rb +2 -2
  81. data/lib/graphql/schema/member/build_type.rb +4 -0
  82. data/lib/graphql/schema/member/cached_graphql_definition.rb +5 -0
  83. data/lib/graphql/schema/member/has_ast_node.rb +17 -0
  84. data/lib/graphql/schema/member/has_fields.rb +10 -16
  85. data/lib/graphql/schema/member/instrumentation.rb +1 -6
  86. data/lib/graphql/schema/member/type_system_helpers.rb +1 -1
  87. data/lib/graphql/schema/mutation.rb +1 -1
  88. data/lib/graphql/schema/object.rb +5 -6
  89. data/lib/graphql/schema/possible_types.rb +3 -3
  90. data/lib/graphql/schema/printer.rb +1 -3
  91. data/lib/graphql/schema/relay_classic_mutation.rb +2 -6
  92. data/lib/graphql/schema/resolver.rb +5 -35
  93. data/lib/graphql/schema/scalar.rb +1 -0
  94. data/lib/graphql/schema/subscription.rb +6 -6
  95. data/lib/graphql/schema/timeout_middleware.rb +2 -3
  96. data/lib/graphql/schema/type_expression.rb +27 -17
  97. data/lib/graphql/schema/union.rb +7 -26
  98. data/lib/graphql/schema/validation.rb +1 -17
  99. data/lib/graphql/schema/warden.rb +3 -77
  100. data/lib/graphql/schema/wrapper.rb +1 -1
  101. data/lib/graphql/static_validation/definition_dependencies.rb +12 -21
  102. data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +9 -4
  103. data/lib/graphql/static_validation/rules/arguments_are_defined.rb +10 -7
  104. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +1 -1
  105. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +5 -5
  106. data/lib/graphql/static_validation/rules/fields_will_merge.rb +4 -4
  107. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +3 -3
  108. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +3 -3
  109. data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +5 -6
  110. data/lib/graphql/static_validation/rules/variables_are_input_types.rb +1 -1
  111. data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +1 -1
  112. data/lib/graphql/subscriptions.rb +7 -7
  113. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +2 -2
  114. data/lib/graphql/subscriptions/event.rb +5 -19
  115. data/lib/graphql/subscriptions/instrumentation.rb +9 -4
  116. data/lib/graphql/subscriptions/subscription_root.rb +2 -10
  117. data/lib/graphql/tracing/skylight_tracing.rb +0 -1
  118. data/lib/graphql/types/int.rb +1 -1
  119. data/lib/graphql/types/relay/base_connection.rb +3 -1
  120. data/lib/graphql/union_type.rb +23 -58
  121. data/lib/graphql/upgrader/member.rb +1 -1
  122. data/lib/graphql/version.rb +1 -1
  123. metadata +20 -13
  124. data/lib/generators/graphql/templates/base_mutation.erb +0 -8
  125. data/lib/graphql/schema/type_membership.rb +0 -34
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+ require "graphql/pagination/relation_connection"
3
+
4
+ module GraphQL
5
+ module Pagination
6
+ class MongoidRelationConnection < Pagination::RelationConnection
7
+ def relation_offset(relation)
8
+ relation.options.skip
9
+ end
10
+
11
+ def relation_limit(relation)
12
+ relation.options.limit
13
+ end
14
+
15
+ def relation_count(relation)
16
+ # Mongo's `.count` doesn't apply limit or skip, which we need. So we have to load _everything_!
17
+ relation.to_a.count
18
+ end
19
+
20
+ def null_relation(relation)
21
+ relation.without_options.none
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,157 @@
1
+ # frozen_string_literal: true
2
+ require "graphql/pagination/connection"
3
+
4
+ module GraphQL
5
+ module Pagination
6
+ # A generic class for working with database query objects.
7
+ class RelationConnection < Pagination::Connection
8
+ def nodes
9
+ load_nodes
10
+ @nodes
11
+ end
12
+
13
+ def has_previous_page
14
+ load_nodes
15
+ @has_previous_page
16
+ end
17
+
18
+ def has_next_page
19
+ load_nodes
20
+ @has_next_page
21
+ end
22
+
23
+ def cursor_for(item)
24
+ load_nodes
25
+ # index in nodes + existing offset + 1 (because it's offset, not index)
26
+ offset = nodes.index(item) + 1 + (@paged_nodes_offset || 0) + (relation_offset(items) || 0)
27
+ context.schema.cursor_encoder.encode(offset.to_s)
28
+ end
29
+
30
+ private
31
+
32
+ # @param relation [Object] A database query object
33
+ # @return [Integer, nil] The offset value, or nil if there isn't one
34
+ def relation_offset(relation)
35
+ raise "#{self.class}#relation_offset(relation) must return the offset value for a #{relation.class} (#{relation.inspect})"
36
+ end
37
+
38
+ # @param relation [Object] A database query object
39
+ # @return [Integer, nil] The limit value, or nil if there isn't one
40
+ def relation_limit(relation)
41
+ raise "#{self.class}#relation_limit(relation) must return the limit value for a #{relation.class} (#{relation.inspect})"
42
+ end
43
+
44
+ # @param relation [Object] A database query object
45
+ # @return [Integer, nil] The number of items in this relation (hopefully determined without loading all records into memory!)
46
+ def relation_count(relation)
47
+ raise "#{self.class}#relation_count(relation) must return the count of records for a #{relation.class} (#{relation.inspect})"
48
+ end
49
+
50
+ # @param relation [Object] A database query object
51
+ # @return [Object] A modified query object which will return no records
52
+ def null_relation(relation)
53
+ raise "#{self.class}#null_relation(relation) must return an empty relation for a #{relation.class} (#{relation.inspect})"
54
+ end
55
+
56
+ def offset_from_cursor(cursor)
57
+ decode(cursor).to_i
58
+ end
59
+
60
+ # Abstract this operation so we can always ignore inputs less than zero.
61
+ # (Sequel doesn't like it, understandably.)
62
+ def set_offset(relation, offset_value)
63
+ if offset_value >= 0
64
+ relation.offset(offset_value)
65
+ else
66
+ relation.offset(0)
67
+ end
68
+ end
69
+
70
+ # Abstract this operation so we can always ignore inputs less than zero.
71
+ # (Sequel doesn't like it, understandably.)
72
+ def set_limit(relation, limit_value)
73
+ if limit_value > 0
74
+ relation.limit(limit_value)
75
+ elsif limit_value == 0
76
+ null_relation(relation)
77
+ else
78
+ relation
79
+ end
80
+ end
81
+
82
+ # Populate all the pagination info _once_,
83
+ # It doesn't do anything on subsequent calls.
84
+ def load_nodes
85
+ @nodes ||= begin
86
+ paginated_nodes = items
87
+ after_offset = after && offset_from_cursor(after)
88
+ before_offset = before && offset_from_cursor(before)
89
+
90
+ if after_offset
91
+ previous_offset = relation_offset(items) || 0
92
+ paginated_nodes = set_offset(paginated_nodes, previous_offset + after_offset)
93
+ end
94
+
95
+ if before_offset && after_offset
96
+ if after_offset < before_offset
97
+ # Get the number of items between the two cursors
98
+ space_between = before_offset - after_offset - 1
99
+ paginated_nodes = set_limit(paginated_nodes, space_between)
100
+ else
101
+ # TODO I think this is untested
102
+ # The cursors overextend one another to an empty set
103
+ paginated_nodes = null_relation(paginated_nodes)
104
+ end
105
+ elsif before_offset
106
+ # Use limit to cut off the tail of the relation
107
+ paginated_nodes = set_limit(paginated_nodes, before_offset - 1)
108
+ end
109
+
110
+ sliced_nodes_count = relation_count(paginated_nodes)
111
+
112
+ if first && (relation_limit(paginated_nodes).nil? || relation_limit(paginated_nodes) > first)
113
+ # `first` would create a stricter limit that the one already applied, so add it
114
+ paginated_nodes = set_limit(paginated_nodes, first)
115
+ end
116
+
117
+ if last
118
+ if (lv = relation_limit(paginated_nodes))
119
+ if last <= lv
120
+ # `last` is a smaller slice than the current limit, so apply it
121
+ offset = (relation_offset(paginated_nodes) || 0) + (lv - last)
122
+ paginated_nodes = set_offset(paginated_nodes, offset)
123
+ paginated_nodes = set_limit(paginated_nodes, last)
124
+ end
125
+ else
126
+ # No limit, so get the last items
127
+ offset = (relation_offset(paginated_nodes) || 0) + sliced_nodes_count - [last, sliced_nodes_count].min
128
+ paginated_nodes = set_offset(paginated_nodes, offset)
129
+ paginated_nodes = set_limit(paginated_nodes, last)
130
+ end
131
+ end
132
+
133
+ # Apply max page size if nothing else was applied
134
+ if max_page_size && !first && !last
135
+ if relation_limit(paginated_nodes).nil? || relation_limit(paginated_nodes) > max_page_size
136
+ paginated_nodes = set_limit(paginated_nodes, max_page_size)
137
+ end
138
+ end
139
+
140
+ @has_next_page = !!(
141
+ (before_offset && before_offset > 0) ||
142
+ (first && sliced_nodes_count > first)
143
+ )
144
+
145
+ @has_previous_page = !!(
146
+ (after_offset && after_offset > 0) ||
147
+ (last && sliced_nodes_count > last)
148
+ )
149
+
150
+ @paged_nodes_offset = relation_offset(paginated_nodes)
151
+ # Return an array so we can consistently use `.index(node)` on it
152
+ paginated_nodes.to_a
153
+ end
154
+ end
155
+ end
156
+ end
157
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+ require "graphql/pagination/relation_connection"
3
+
4
+ module GraphQL
5
+ module Pagination
6
+ # Customizes `RelationConnection` to work with `Sequel::Dataset`s.
7
+ class SequelDatasetConnection < Pagination::RelationConnection
8
+ private
9
+
10
+ def relation_offset(relation)
11
+ relation.opts[:offset]
12
+ end
13
+
14
+ def relation_limit(relation)
15
+ relation.opts[:limit]
16
+ end
17
+
18
+ def relation_count(relation)
19
+ # Remove order to make it faster
20
+ relation.order(nil).count
21
+ end
22
+
23
+ def null_relation(relation)
24
+ relation.where(false)
25
+ end
26
+ end
27
+ end
28
+ end
@@ -134,6 +134,7 @@ module GraphQL
134
134
  @executed = false
135
135
 
136
136
  # TODO add a general way to define schema-level filters
137
+ # TODO also add this to schema dumps
137
138
  if @schema.respond_to?(:visible?)
138
139
  merge_filters(only: @schema.method(:visible?))
139
140
  end
@@ -299,13 +300,6 @@ module GraphQL
299
300
  with_prepared_ast { @subscription }
300
301
  end
301
302
 
302
- # @api private
303
- def with_error_handling
304
- schema.error_handler.with_error_handling(context) do
305
- yield
306
- end
307
- end
308
-
309
303
  private
310
304
 
311
305
  def find_operation(operations, operation_name)
@@ -11,6 +11,7 @@ module GraphQL
11
11
  def self.construct_arguments_class(argument_owner)
12
12
  argument_definitions = argument_owner.arguments
13
13
  argument_owner.arguments_class = Class.new(self) do
14
+ self.argument_owner = argument_owner
14
15
  self.argument_definitions = argument_definitions
15
16
 
16
17
  argument_definitions.each do |_arg_name, arg_definition|
@@ -87,10 +88,6 @@ module GraphQL
87
88
 
88
89
  def_delegators :to_h, :keys, :values, :each, :any?
89
90
 
90
- def prepare
91
- self
92
- end
93
-
94
91
  # Access each key, value and type for the arguments in this set.
95
92
  # @yield [argument_value] The {ArgumentValue} for each argument
96
93
  # @yieldparam argument_value [ArgumentValue]
@@ -101,7 +98,7 @@ module GraphQL
101
98
  end
102
99
 
103
100
  class << self
104
- attr_accessor :argument_definitions
101
+ attr_accessor :argument_definitions, :argument_owner
105
102
  end
106
103
 
107
104
  NoArguments = Class.new(self) do
@@ -122,8 +119,6 @@ module GraphQL
122
119
  ruby_kwargs
123
120
  end
124
121
 
125
- alias :to_hash :to_kwargs
126
-
127
122
  private
128
123
 
129
124
  class ArgumentValue
@@ -156,8 +151,7 @@ module GraphQL
156
151
  wrap_value(value, arg_defn_type.of_type, context)
157
152
  when GraphQL::InputObjectType
158
153
  if value.is_a?(Hash)
159
- result = arg_defn_type.arguments_class.new(value, context: context, defaults_used: Set.new)
160
- result.prepare
154
+ arg_defn_type.arguments_class.new(value, context: context, defaults_used: Set.new)
161
155
  else
162
156
  value
163
157
  end
@@ -143,9 +143,9 @@ module GraphQL
143
143
  # Make a new context which delegates key lookup to `values`
144
144
  # @param query [GraphQL::Query] the query who owns this context
145
145
  # @param values [Hash] A hash of arbitrary values which will be accessible at query-time
146
- def initialize(query:, schema: query.schema, values:, object:)
146
+ def initialize(query:, values: , object:)
147
147
  @query = query
148
- @schema = schema
148
+ @schema = query.schema
149
149
  @provided_values = values || {}
150
150
  @object = object
151
151
  # Namespaced storage, where user-provided values are in `nil` namespace:
@@ -155,7 +155,6 @@ module GraphQL
155
155
  @path = []
156
156
  @value = nil
157
157
  @context = self # for SharedMethods
158
- @scoped_context = {}
159
158
  end
160
159
 
161
160
  # @api private
@@ -164,30 +163,15 @@ module GraphQL
164
163
  # @api private
165
164
  attr_writer :value
166
165
 
167
- # @api private
168
- attr_accessor :scoped_context
169
-
170
- def_delegators :@provided_values, :[]=
171
- def_delegators :to_h, :fetch, :dig
166
+ def_delegators :@provided_values, :[], :[]=, :to_h, :to_hash, :key?, :fetch, :dig
172
167
  def_delegators :@query, :trace, :interpreter?
173
168
 
169
+ # @!method [](key)
170
+ # Lookup `key` from the hash passed to {Schema#execute} as `context:`
171
+
174
172
  # @!method []=(key, value)
175
173
  # Reassign `key` to the hash passed to {Schema#execute} as `context:`
176
174
 
177
- # Lookup `key` from the hash passed to {Schema#execute} as `context:`
178
- def [](key)
179
- return @scoped_context[key] if @scoped_context.key?(key)
180
- @provided_values[key]
181
- end
182
-
183
- def to_h
184
- @provided_values.merge(@scoped_context)
185
- end
186
- alias :to_hash :to_h
187
-
188
- def key?(key)
189
- @scoped_context.key?(key) || @provided_values.key?(key)
190
- end
191
175
 
192
176
  # @return [GraphQL::Schema::Warden]
193
177
  def warden
@@ -211,15 +195,6 @@ module GraphQL
211
195
  @value = nil
212
196
  end
213
197
 
214
- def scoped_merge!(hash)
215
- @scoped_context = @scoped_context.merge(hash)
216
- end
217
-
218
- def scoped_set!(key, value)
219
- scoped_merge!(key => value)
220
- nil
221
- end
222
-
223
198
  class FieldResolutionContext
224
199
  include SharedMethods
225
200
  include Tracing::Traceable
@@ -334,3 +309,6 @@ module GraphQL
334
309
  end
335
310
  end
336
311
  end
312
+
313
+
314
+ GraphQL::Schema::Context = GraphQL::Query::Context
@@ -12,8 +12,8 @@ module GraphQL
12
12
  when Language::Nodes::VariableIdentifier
13
13
  variables[ast_node.name]
14
14
  else
15
- case type
16
- when GraphQL::ScalarType
15
+ case type.kind.name
16
+ when "SCALAR"
17
17
  # TODO smell
18
18
  # This gets used for plain values during subscriber.trigger
19
19
  if variables
@@ -21,7 +21,7 @@ module GraphQL
21
21
  else
22
22
  type.coerce_isolated_input(ast_node)
23
23
  end
24
- when GraphQL::EnumType
24
+ when "ENUM"
25
25
  # TODO smell
26
26
  # This gets used for plain values sometimes
27
27
  v = ast_node.is_a?(GraphQL::Language::Nodes::Enum) ? ast_node.name : ast_node
@@ -30,18 +30,20 @@ module GraphQL
30
30
  else
31
31
  type.coerce_isolated_input(v)
32
32
  end
33
- when GraphQL::NonNullType
33
+ when "NON_NULL"
34
34
  LiteralInput.coerce(type.of_type, ast_node, variables)
35
- when GraphQL::ListType
35
+ when "LIST"
36
36
  if ast_node.is_a?(Array)
37
37
  ast_node.map { |element_ast| LiteralInput.coerce(type.of_type, element_ast, variables) }
38
38
  else
39
39
  [LiteralInput.coerce(type.of_type, ast_node, variables)]
40
40
  end
41
- when GraphQL::InputObjectType
41
+ when "INPUT_OBJECT"
42
42
  # TODO smell: handling AST vs handling plain Ruby
43
43
  next_args = ast_node.is_a?(Hash) ? ast_node : ast_node.arguments
44
44
  from_arguments(next_args, type, variables)
45
+ else
46
+ raise "Invariant: unexpected type to coerce to: #{type}"
45
47
  end
46
48
  end
47
49
  end
@@ -78,7 +80,10 @@ module GraphQL
78
80
  if (!value_is_a_variable || (value_is_a_variable && variables.key?(arg_value.name)))
79
81
 
80
82
  value = coerce(arg_defn.type, arg_value, variables)
81
- value = arg_defn.prepare(value, context)
83
+ # Legacy `prepare` application
84
+ if arg_defn.is_a?(GraphQL::Argument)
85
+ value = arg_defn.prepare(value, context)
86
+ end
82
87
 
83
88
  if value.is_a?(GraphQL::ExecutionError)
84
89
  value.ast_node = ast_arg
@@ -98,7 +103,9 @@ module GraphQL
98
103
  defaults_used << arg_name
99
104
  # `context` isn't present when pre-calculating defaults
100
105
  if context
101
- value = arg_defn.prepare(value, context)
106
+ if arg_defn.is_a?(GraphQL::Argument)
107
+ value = arg_defn.prepare(value, context)
108
+ end
102
109
  if value.is_a?(GraphQL::ExecutionError)
103
110
  value.ast_node = ast_arg
104
111
  raise value
@@ -108,8 +115,20 @@ module GraphQL
108
115
  end
109
116
  end
110
117
 
111
- result = argument_owner.arguments_class.new(values_hash, context: context, defaults_used: defaults_used)
112
- result.prepare
118
+ if argument_owner.is_a?(Class) || argument_owner.is_a?(GraphQL::Schema::Field)
119
+ # A Schema::InputObject, Schema::GraphQL::Field, Schema::Directive, logic from Query::Arguments#to_kwargs
120
+ ruby_kwargs = {}
121
+ values_hash.each do |key, value|
122
+ ruby_kwargs[Schema::Member::BuildType.underscore(key).to_sym] = value
123
+ end
124
+ if argument_owner.is_a?(Class) && argument_owner < GraphQL::Schema::InputObject
125
+ argument_owner.new(ruby_kwargs: ruby_kwargs, context: context, defaults_used: defaults_used)
126
+ else
127
+ ruby_kwargs
128
+ end
129
+ else
130
+ argument_owner.arguments_class.new(values_hash, context: context, defaults_used: defaults_used)
131
+ end
113
132
  end
114
133
  end
115
134
  end
@@ -21,13 +21,9 @@ module GraphQL
21
21
  )
22
22
  end
23
23
 
24
- def [](key); end
25
-
26
24
  class << self
27
25
  extend Forwardable
28
26
 
29
- def [](key); end
30
-
31
27
  def instance
32
28
  @instance = self.new
33
29
  end