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
@@ -48,15 +48,15 @@ module GraphQL
48
48
  raise InvalidDocumentError.new('Must provide only one schema definition.') if schema_definition
49
49
  schema_definition = definition
50
50
  when GraphQL::Language::Nodes::EnumTypeDefinition
51
- types[definition.name] = build_enum_type(definition, type_resolver)
51
+ types[definition.name] = build_enum_type(definition, type_resolver).graphql_definition
52
52
  when GraphQL::Language::Nodes::ObjectTypeDefinition
53
- types[definition.name] = build_object_type(definition, type_resolver, default_resolve: default_resolve)
53
+ types[definition.name] = build_object_type(definition, type_resolver, default_resolve: default_resolve).graphql_definition
54
54
  when GraphQL::Language::Nodes::InterfaceTypeDefinition
55
- types[definition.name] = build_interface_type(definition, type_resolver)
55
+ types[definition.name] = build_interface_type(definition, type_resolver).graphql_definition
56
56
  when GraphQL::Language::Nodes::UnionTypeDefinition
57
- types[definition.name] = build_union_type(definition, type_resolver)
57
+ types[definition.name] = build_union_type(definition, type_resolver).graphql_definition
58
58
  when GraphQL::Language::Nodes::ScalarTypeDefinition
59
- types[definition.name] = build_scalar_type(definition, type_resolver, default_resolve: default_resolve)
59
+ types[definition.name] = build_scalar_type(definition, type_resolver, default_resolve: default_resolve).graphql_definition
60
60
  when GraphQL::Language::Nodes::InputObjectTypeDefinition
61
61
  types[definition.name] = build_input_object_type(definition, type_resolver)
62
62
  when GraphQL::Language::Nodes::DirectiveDefinition
@@ -89,54 +89,51 @@ module GraphQL
89
89
 
90
90
  raise InvalidDocumentError.new('Must provide schema definition with query type or a type named Query.') unless query_root_type
91
91
 
92
- schema = Schema.define do
93
- raise_definition_error true
94
-
92
+ Class.new(GraphQL::Schema) do
95
93
  query query_root_type
96
94
  mutation mutation_root_type
97
95
  subscription subscription_root_type
98
96
  orphan_types types.values
99
97
  if default_resolve.respond_to?(:resolve_type)
100
- resolve_type(default_resolve.method(:resolve_type))
98
+ define_singleton_method(:resolve_type) do |*args|
99
+ default_resolve.resolve_type(*args)
100
+ end
101
101
  else
102
- resolve_type(NullResolveType)
102
+ define_singleton_method(:resolve_type) do |*args|
103
+ NullResolveType.call(*args)
104
+ end
103
105
  end
104
106
 
105
107
  directives directives.values
106
- end
107
108
 
108
- schema.ast_node = schema_definition if schema_definition
109
+ if schema_definition
110
+ ast_node(schema_definition)
111
+ end
109
112
 
110
- schema
113
+ # Load caches, check for errors
114
+ graphql_definition
115
+ end
111
116
  end
112
117
 
113
118
  NullResolveType = ->(type, obj, ctx) {
114
- raise(GraphQL::RequiredImplementationMissingError, "Generated Schema cannot use Interface or Union types for execution. Implement resolve_type on your resolver.")
119
+ raise(NotImplementedError, "Generated Schema cannot use Interface or Union types for execution. Implement resolve_type on your resolver.")
115
120
  }
116
121
 
117
- NullScalarCoerce = ->(val, _ctx) { val }
118
-
119
122
  def build_enum_type(enum_type_definition, type_resolver)
120
- enum = GraphQL::EnumType.define(
121
- name: enum_type_definition.name,
122
- description: enum_type_definition.description,
123
- values: enum_type_definition.values.map do |enum_value_definition|
124
- value = EnumType::EnumValue.define(
125
- name: enum_value_definition.name,
123
+ builder = self
124
+ Class.new(GraphQL::Schema::Enum) do
125
+ graphql_name(enum_type_definition.name)
126
+ description(enum_type_definition.description)
127
+ ast_node(enum_type_definition)
128
+ enum_type_definition.values.each do |enum_value_definition|
129
+ value(enum_value_definition.name,
126
130
  value: enum_value_definition.name,
127
- deprecation_reason: build_deprecation_reason(enum_value_definition.directives),
131
+ deprecation_reason: builder.build_deprecation_reason(enum_value_definition.directives),
128
132
  description: enum_value_definition.description,
133
+ ast_node: enum_value_definition,
129
134
  )
130
-
131
- value.ast_node = enum_value_definition
132
-
133
- value
134
135
  end
135
- )
136
-
137
- enum.ast_node = enum_type_definition
138
-
139
- enum
136
+ end
140
137
  end
141
138
 
142
139
  def build_deprecation_reason(directives)
@@ -150,63 +147,59 @@ module GraphQL
150
147
  end
151
148
 
152
149
  def build_scalar_type(scalar_type_definition, type_resolver, default_resolve:)
153
- scalar_type = GraphQL::ScalarType.define(
154
- name: scalar_type_definition.name,
155
- description: scalar_type_definition.description,
156
- coerce: NullScalarCoerce,
157
- )
158
-
159
- scalar_type.ast_node = scalar_type_definition
160
-
161
- if default_resolve.respond_to?(:coerce_input)
162
- scalar_type = scalar_type.redefine(
163
- coerce_input: ->(val, ctx) { default_resolve.coerce_input(scalar_type, val, ctx) },
164
- coerce_result: ->(val, ctx) { default_resolve.coerce_result(scalar_type, val, ctx) },
165
- )
166
- end
150
+ Class.new(GraphQL::Schema::Scalar) do
151
+ graphql_name(scalar_type_definition.name)
152
+ description(scalar_type_definition.description)
153
+ ast_node(scalar_type_definition)
154
+
155
+ if default_resolve.respond_to?(:coerce_input)
156
+ define_singleton_method(:coerce_input) do |val, ctx|
157
+ default_resolve.coerce_input(self, val, ctx)
158
+ end
167
159
 
168
- scalar_type
160
+ define_singleton_method(:coerce_result) do |val, ctx|
161
+ default_resolve.coerce_result(self, val, ctx)
162
+ end
163
+ end
164
+ end
169
165
  end
170
166
 
171
167
  def build_union_type(union_type_definition, type_resolver)
172
- union = GraphQL::UnionType.define(
173
- name: union_type_definition.name,
174
- description: union_type_definition.description,
175
- possible_types: union_type_definition.types.map{ |type_name| type_resolver.call(type_name) },
176
- )
177
-
178
- union.ast_node = union_type_definition
179
-
180
- union
168
+ Class.new(GraphQL::Schema::Union) do
169
+ graphql_name(union_type_definition.name)
170
+ description(union_type_definition.description)
171
+ possible_types(*union_type_definition.types.map { |type_name| type_resolver.call(type_name) })
172
+ ast_node(union_type_definition)
173
+ end
181
174
  end
182
175
 
183
176
  def build_object_type(object_type_definition, type_resolver, default_resolve:)
177
+ builder = self
184
178
  type_def = nil
185
- typed_resolve_fn = ->(field, obj, args, ctx) { default_resolve.call(type_def, field, obj, args, ctx) }
186
- defns = {
187
- name: object_type_definition.name,
188
- description: object_type_definition.description,
189
- interfaces: object_type_definition.interfaces.map{ |interface_name| type_resolver.call(interface_name) },
190
- }
191
- obj_fields = Hash[build_fields(object_type_definition.fields, type_resolver, default_resolve: typed_resolve_fn)]
192
- if obj_fields.any?
193
- defns[:fields] = obj_fields
179
+ typed_resolve_fn = ->(field, obj, args, ctx) { default_resolve.call(type_def.graphql_definition, field, obj, args, ctx) }
180
+ Class.new(GraphQL::Schema::Object) do
181
+ type_def = self
182
+ graphql_name(object_type_definition.name)
183
+ description(object_type_definition.description)
184
+ ast_node(object_type_definition)
185
+
186
+ object_type_definition.interfaces.each do |interface_name|
187
+ interface_defn = type_resolver.call(interface_name)
188
+ implements(interface_defn)
189
+ end
190
+
191
+ builder.build_fields(self, object_type_definition.fields, type_resolver, default_resolve: typed_resolve_fn)
194
192
  end
195
- type_def = GraphQL::ObjectType.define(**defns)
196
- type_def.ast_node = object_type_definition
197
- type_def
198
193
  end
199
194
 
200
195
  def build_input_object_type(input_object_type_definition, type_resolver)
201
- input = GraphQL::InputObjectType.define(
202
- name: input_object_type_definition.name,
203
- description: input_object_type_definition.description,
204
- arguments: Hash[build_input_arguments(input_object_type_definition, type_resolver)],
205
- )
206
-
207
- input.ast_node = input_object_type_definition
208
-
209
- input
196
+ builder = self
197
+ Class.new(GraphQL::Schema::InputObject) do
198
+ graphql_name(input_object_type_definition.name)
199
+ description(input_object_type_definition.description)
200
+ ast_node(input_object_type_definition)
201
+ builder.build_arguments(self, input_object_type_definition.fields, type_resolver)
202
+ end
210
203
  end
211
204
 
212
205
  def build_default_value(default_value)
@@ -224,130 +217,71 @@ module GraphQL
224
217
  end
225
218
  end
226
219
 
227
- def build_input_arguments(input_object_type_definition, type_resolver)
228
- input_object_type_definition.fields.map do |input_argument|
229
- kwargs = {}
220
+ def build_arguments(type_class, arguments, type_resolver)
221
+ builder = self
230
222
 
231
- if !input_argument.default_value.nil?
232
- kwargs[:default_value] = build_default_value(input_argument.default_value)
223
+ arguments.each do |argument_defn|
224
+ default_value_kwargs = {}
225
+ if !argument_defn.default_value.nil?
226
+ default_value_kwargs[:default_value] = builder.build_default_value(argument_defn.default_value)
233
227
  end
234
228
 
235
- argument = GraphQL::Argument.define(
236
- name: input_argument.name,
237
- type: type_resolver.call(input_argument.type),
238
- description: input_argument.description,
229
+ type_class.argument(
230
+ argument_defn.name,
231
+ type: type_resolver.call(argument_defn.type),
232
+ required: false,
233
+ description: argument_defn.description,
234
+ ast_node: argument_defn,
235
+ camelize: false,
239
236
  method_access: false,
240
- **kwargs,
237
+ **default_value_kwargs
241
238
  )
242
-
243
- argument.ast_node = input_argument
244
-
245
- [
246
- input_argument.name,
247
- argument
248
- ]
249
239
  end
250
240
  end
251
241
 
252
242
  def build_directive(directive_definition, type_resolver)
253
- directive_args = Hash[build_directive_arguments(directive_definition, type_resolver)]
254
-
255
- defn = {
256
- name: directive_definition.name,
257
- description: directive_definition.description,
258
- locations: directive_definition.locations.map { |location| location.name.to_sym },
259
- }
260
-
261
- if directive_args.any?
262
- defn[:arguments] = directive_args
243
+ builder = self
244
+ Class.new(GraphQL::Schema::Directive) do
245
+ graphql_name(directive_definition.name)
246
+ description(directive_definition.description)
247
+ locations(*directive_definition.locations.map { |location| location.name.to_sym })
248
+ ast_node(directive_definition)
249
+ builder.build_arguments(self, directive_definition.arguments, type_resolver)
263
250
  end
264
-
265
- directive = GraphQL::Directive.define(**defn)
266
- directive.ast_node = directive_definition
267
-
268
- directive
269
251
  end
270
252
 
271
- def build_directive_arguments(directive_definition, type_resolver)
272
- directive_definition.arguments.map do |directive_argument|
273
- kwargs = {}
274
-
275
- if !directive_argument.default_value.nil?
276
- kwargs[:default_value] = build_default_value(directive_argument.default_value)
277
- end
278
-
279
- argument = GraphQL::Argument.define(
280
- name: directive_argument.name,
281
- type: type_resolver.call(directive_argument.type),
282
- description: directive_argument.description,
283
- method_access: false,
284
- **kwargs,
285
- )
286
-
287
- argument.ast_node = directive_argument
288
-
289
- [
290
- directive_argument.name,
291
- argument
292
- ]
253
+ def build_interface_type(interface_type_definition, type_resolver)
254
+ builder = self
255
+ Module.new do
256
+ include GraphQL::Schema::Interface
257
+ graphql_name(interface_type_definition.name)
258
+ description(interface_type_definition.description)
259
+ ast_node(interface_type_definition)
260
+
261
+ builder.build_fields(self, interface_type_definition.fields, type_resolver, default_resolve: nil)
293
262
  end
294
263
  end
295
264
 
296
- def build_interface_type(interface_type_definition, type_resolver)
297
- interface = GraphQL::InterfaceType.define(
298
- name: interface_type_definition.name,
299
- description: interface_type_definition.description,
300
- fields: Hash[build_fields(interface_type_definition.fields, type_resolver, default_resolve: nil)],
301
- )
302
-
303
- interface.ast_node = interface_type_definition
304
-
305
- interface
306
- end
265
+ def build_fields(owner, field_definitions, type_resolver, default_resolve:)
266
+ builder = self
307
267
 
308
- def build_fields(field_definitions, type_resolver, default_resolve:)
309
268
  field_definitions.map do |field_definition|
310
- field_arguments = Hash[field_definition.arguments.map do |argument|
311
- kwargs = {}
312
-
313
- if !argument.default_value.nil?
314
- kwargs[:default_value] = build_default_value(argument.default_value)
315
- end
316
-
317
- arg = GraphQL::Argument.define(
318
- name: argument.name,
319
- description: argument.description,
320
- type: type_resolver.call(argument.type),
321
- method_access: false,
322
- **kwargs,
323
- )
324
-
325
- arg.ast_node = argument
326
-
327
- [argument.name, arg]
328
- end]
329
-
330
- field = nil
269
+ type_name = resolve_type_name(field_definition.type)
331
270
 
332
- defns = {
333
- name: field_definition.name,
271
+ field = owner.field(
272
+ field_definition.name,
334
273
  description: field_definition.description,
335
274
  type: type_resolver.call(field_definition.type),
336
- resolve: ->(obj, args, ctx) { default_resolve.call(field, obj, args, ctx) },
275
+ null: true,
276
+ connection: type_name.end_with?("Connection"),
277
+ resolve: ->(obj, args, ctx) { default_resolve.call(field.graphql_definition, obj, args, ctx) },
337
278
  deprecation_reason: build_deprecation_reason(field_definition.directives),
338
- }
339
-
340
- if field_arguments.any?
341
- defns[:arguments] = field_arguments
279
+ ast_node: field_definition,
280
+ method_conflict_warning: false,
281
+ camelize: false,
282
+ ) do
283
+ builder.build_arguments(self, field_definition.arguments, type_resolver)
342
284
  end
343
-
344
- field = GraphQL::Field.define(**defns)
345
-
346
- field.ast_node = field_definition
347
-
348
- type_name = resolve_type_name(field_definition.type)
349
- field.connection = type_name.end_with?("Connection")
350
- [field_definition.name, field]
351
285
  end
352
286
  end
353
287
 
@@ -14,6 +14,12 @@ module GraphQL
14
14
  #
15
15
  # @api private
16
16
  class ResolveMap
17
+ module NullScalarCoerce
18
+ def self.call(val, _ctx)
19
+ val
20
+ end
21
+ end
22
+
17
23
  def initialize(user_resolve_hash)
18
24
  @resolve_hash = Hash.new do |h, k|
19
25
  # For each type name, provide a new hash if one wasn't given:
@@ -21,7 +27,7 @@ module GraphQL
21
27
  if k2 == "coerce_input" || k2 == "coerce_result"
22
28
  # This isn't an object field, it's a scalar coerce function.
23
29
  # Use a passthrough
24
- Builder::NullScalarCoerce
30
+ NullScalarCoerce
25
31
  else
26
32
  # For each field, provide a resolver that will
27
33
  # make runtime checks & replace itself
@@ -53,16 +59,16 @@ module GraphQL
53
59
  end
54
60
 
55
61
  def call(type, field, obj, args, ctx)
56
- resolver = @resolve_hash[type.name][field.name]
62
+ resolver = @resolve_hash[type.graphql_name][field.graphql_name]
57
63
  resolver.call(obj, args, ctx)
58
64
  end
59
65
 
60
66
  def coerce_input(type, value, ctx)
61
- @resolve_hash[type.name]["coerce_input"].call(value, ctx)
67
+ @resolve_hash[type.graphql_name]["coerce_input"].call(value, ctx)
62
68
  end
63
69
 
64
70
  def coerce_result(type, value, ctx)
65
- @resolve_hash[type.name]["coerce_result"].call(value, ctx)
71
+ @resolve_hash[type.graphql_name]["coerce_result"].call(value, ctx)
66
72
  end
67
73
  end
68
74
  end
@@ -20,7 +20,7 @@ module GraphQL
20
20
  def call(obj, args, ctx)
21
21
  method_name = @field_name
22
22
  if !obj.respond_to?(method_name)
23
- raise KeyError, "Can't resolve field #{method_name} on #{obj}"
23
+ raise KeyError, "Can't resolve field #{method_name} on #{obj.inspect}"
24
24
  else
25
25
  method_arity = obj.method(method_name).arity
26
26
  resolver = case method_arity
@@ -9,14 +9,8 @@ module GraphQL
9
9
  class Directive < GraphQL::Schema::Member
10
10
  extend GraphQL::Schema::Member::HasArguments
11
11
  class << self
12
- # Return a name based on the class name,
13
- # but downcase the first letter.
14
12
  def default_graphql_name
15
- @default_graphql_name ||= begin
16
- camelized_name = super
17
- camelized_name[0] = camelized_name[0].downcase
18
- camelized_name
19
- end
13
+ super.downcase
20
14
  end
21
15
 
22
16
  def locations(*new_locations)
@@ -37,12 +31,17 @@ module GraphQL
37
31
  end
38
32
  end
39
33
 
34
+ def default_directive?
35
+ default_directive
36
+ end
37
+
40
38
  def to_graphql
41
39
  defn = GraphQL::Directive.new
42
40
  defn.name = self.graphql_name
43
41
  defn.description = self.description
44
42
  defn.locations = self.locations
45
43
  defn.default_directive = self.default_directive
44
+ defn.ast_node = ast_node
46
45
  defn.metadata[:type_class] = self
47
46
  arguments.each do |name, arg_defn|
48
47
  arg_graphql = arg_defn.to_graphql