graphql 1.9.17 → 2.0.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of graphql might be problematic. Click here for more details.

Files changed (413) hide show
  1. checksums.yaml +4 -4
  2. data/lib/generators/graphql/core.rb +21 -10
  3. data/lib/generators/graphql/enum_generator.rb +4 -10
  4. data/lib/generators/graphql/field_extractor.rb +31 -0
  5. data/lib/generators/graphql/input_generator.rb +50 -0
  6. data/lib/generators/graphql/install/mutation_root_generator.rb +34 -0
  7. data/lib/generators/graphql/{templates → install/templates}/base_mutation.erb +2 -0
  8. data/lib/generators/graphql/{templates → install/templates}/mutation_type.erb +2 -0
  9. data/lib/generators/graphql/install_generator.rb +45 -8
  10. data/lib/generators/graphql/interface_generator.rb +7 -7
  11. data/lib/generators/graphql/loader_generator.rb +1 -0
  12. data/lib/generators/graphql/mutation_create_generator.rb +22 -0
  13. data/lib/generators/graphql/mutation_delete_generator.rb +22 -0
  14. data/lib/generators/graphql/mutation_generator.rb +6 -30
  15. data/lib/generators/graphql/mutation_update_generator.rb +22 -0
  16. data/lib/generators/graphql/object_generator.rb +28 -12
  17. data/lib/generators/graphql/orm_mutations_base.rb +40 -0
  18. data/lib/generators/graphql/relay.rb +49 -0
  19. data/lib/generators/graphql/relay_generator.rb +21 -0
  20. data/lib/generators/graphql/scalar_generator.rb +4 -2
  21. data/lib/generators/graphql/templates/base_argument.erb +2 -0
  22. data/lib/generators/graphql/templates/base_connection.erb +8 -0
  23. data/lib/generators/graphql/templates/base_edge.erb +8 -0
  24. data/lib/generators/graphql/templates/base_enum.erb +2 -0
  25. data/lib/generators/graphql/templates/base_field.erb +2 -0
  26. data/lib/generators/graphql/templates/base_input_object.erb +2 -0
  27. data/lib/generators/graphql/templates/base_interface.erb +2 -0
  28. data/lib/generators/graphql/templates/base_object.erb +2 -0
  29. data/lib/generators/graphql/templates/base_scalar.erb +2 -0
  30. data/lib/generators/graphql/templates/base_union.erb +2 -0
  31. data/lib/generators/graphql/templates/enum.erb +7 -1
  32. data/lib/generators/graphql/templates/graphql_controller.erb +16 -12
  33. data/lib/generators/graphql/templates/input.erb +9 -0
  34. data/lib/generators/graphql/templates/interface.erb +6 -2
  35. data/lib/generators/graphql/templates/loader.erb +2 -0
  36. data/lib/generators/graphql/templates/mutation.erb +3 -1
  37. data/lib/generators/graphql/templates/mutation_create.erb +20 -0
  38. data/lib/generators/graphql/templates/mutation_delete.erb +20 -0
  39. data/lib/generators/graphql/templates/mutation_update.erb +21 -0
  40. data/lib/generators/graphql/templates/node_type.erb +9 -0
  41. data/lib/generators/graphql/templates/object.erb +7 -3
  42. data/lib/generators/graphql/templates/query_type.erb +3 -3
  43. data/lib/generators/graphql/templates/scalar.erb +5 -1
  44. data/lib/generators/graphql/templates/schema.erb +25 -27
  45. data/lib/generators/graphql/templates/union.erb +6 -2
  46. data/lib/generators/graphql/type_generator.rb +47 -10
  47. data/lib/generators/graphql/union_generator.rb +5 -5
  48. data/lib/graphql/analysis/ast/field_usage.rb +31 -2
  49. data/lib/graphql/analysis/ast/max_query_complexity.rb +0 -1
  50. data/lib/graphql/analysis/ast/query_complexity.rb +175 -68
  51. data/lib/graphql/analysis/ast/query_depth.rb +0 -1
  52. data/lib/graphql/analysis/ast/visitor.rb +54 -38
  53. data/lib/graphql/analysis/ast.rb +16 -16
  54. data/lib/graphql/analysis.rb +0 -7
  55. data/lib/graphql/backtrace/inspect_result.rb +0 -1
  56. data/lib/graphql/backtrace/table.rb +37 -16
  57. data/lib/graphql/backtrace/traced_error.rb +0 -1
  58. data/lib/graphql/backtrace/tracer.rb +39 -9
  59. data/lib/graphql/backtrace.rb +20 -17
  60. data/lib/graphql/dataloader/null_dataloader.rb +24 -0
  61. data/lib/graphql/dataloader/request.rb +19 -0
  62. data/lib/graphql/dataloader/request_all.rb +19 -0
  63. data/lib/graphql/dataloader/source.rb +164 -0
  64. data/lib/graphql/dataloader.rb +311 -0
  65. data/lib/graphql/date_encoding_error.rb +16 -0
  66. data/lib/graphql/deprecation.rb +9 -0
  67. data/lib/graphql/dig.rb +1 -1
  68. data/lib/graphql/execution/directive_checks.rb +2 -2
  69. data/lib/graphql/execution/errors.rb +77 -45
  70. data/lib/graphql/execution/interpreter/argument_value.rb +28 -0
  71. data/lib/graphql/execution/interpreter/arguments.rb +88 -0
  72. data/lib/graphql/execution/interpreter/arguments_cache.rb +105 -0
  73. data/lib/graphql/execution/interpreter/handles_raw_value.rb +18 -0
  74. data/lib/graphql/execution/interpreter/resolve.rb +62 -24
  75. data/lib/graphql/execution/interpreter/runtime.rb +773 -399
  76. data/lib/graphql/execution/interpreter.rb +206 -74
  77. data/lib/graphql/execution/lazy/lazy_method_map.rb +4 -0
  78. data/lib/graphql/execution/lazy.rb +11 -21
  79. data/lib/graphql/execution/lookahead.rb +65 -136
  80. data/lib/graphql/execution/multiplex.rb +6 -152
  81. data/lib/graphql/execution.rb +11 -4
  82. data/lib/graphql/filter.rb +1 -1
  83. data/lib/graphql/integer_decoding_error.rb +17 -0
  84. data/lib/graphql/integer_encoding_error.rb +18 -2
  85. data/lib/graphql/introspection/base_object.rb +2 -5
  86. data/lib/graphql/introspection/directive_location_enum.rb +2 -2
  87. data/lib/graphql/introspection/directive_type.rb +12 -6
  88. data/lib/graphql/introspection/dynamic_fields.rb +3 -8
  89. data/lib/graphql/introspection/entry_points.rb +5 -18
  90. data/lib/graphql/introspection/enum_value_type.rb +2 -2
  91. data/lib/graphql/introspection/field_type.rb +9 -5
  92. data/lib/graphql/introspection/input_value_type.rb +41 -11
  93. data/lib/graphql/introspection/introspection_query.rb +6 -92
  94. data/lib/graphql/introspection/schema_type.rb +12 -12
  95. data/lib/graphql/introspection/type_type.rb +34 -17
  96. data/lib/graphql/introspection.rb +100 -0
  97. data/lib/graphql/invalid_null_error.rb +18 -0
  98. data/lib/graphql/language/block_string.rb +20 -5
  99. data/lib/graphql/language/cache.rb +37 -0
  100. data/lib/graphql/language/definition_slice.rb +21 -10
  101. data/lib/graphql/language/document_from_schema_definition.rb +113 -71
  102. data/lib/graphql/language/lexer.rb +216 -1462
  103. data/lib/graphql/language/nodes.rb +128 -131
  104. data/lib/graphql/language/parser.rb +957 -912
  105. data/lib/graphql/language/parser.y +148 -120
  106. data/lib/graphql/language/printer.rb +48 -23
  107. data/lib/graphql/language/sanitized_printer.rb +222 -0
  108. data/lib/graphql/language/token.rb +0 -4
  109. data/lib/graphql/language/visitor.rb +192 -84
  110. data/lib/graphql/language.rb +3 -1
  111. data/lib/graphql/name_validator.rb +2 -7
  112. data/lib/graphql/pagination/active_record_relation_connection.rb +77 -0
  113. data/lib/graphql/pagination/array_connection.rb +79 -0
  114. data/lib/graphql/pagination/connection.rb +253 -0
  115. data/lib/graphql/pagination/connections.rb +135 -0
  116. data/lib/graphql/pagination/mongoid_relation_connection.rb +25 -0
  117. data/lib/graphql/pagination/relation_connection.rb +228 -0
  118. data/lib/graphql/pagination/sequel_dataset_connection.rb +28 -0
  119. data/lib/graphql/pagination.rb +6 -0
  120. data/lib/graphql/parse_error.rb +0 -1
  121. data/lib/graphql/query/context.rb +204 -203
  122. data/lib/graphql/query/fingerprint.rb +26 -0
  123. data/lib/graphql/query/input_validation_result.rb +33 -7
  124. data/lib/graphql/query/null_context.rb +21 -8
  125. data/lib/graphql/query/validation_pipeline.rb +16 -38
  126. data/lib/graphql/query/variable_validation_error.rb +3 -3
  127. data/lib/graphql/query/variables.rb +39 -12
  128. data/lib/graphql/query.rb +88 -40
  129. data/lib/graphql/railtie.rb +6 -102
  130. data/lib/graphql/rake_task/validate.rb +4 -1
  131. data/lib/graphql/rake_task.rb +41 -10
  132. data/lib/graphql/relay/range_add.rb +17 -10
  133. data/lib/graphql/relay.rb +0 -15
  134. data/lib/graphql/rubocop/graphql/base_cop.rb +36 -0
  135. data/lib/graphql/rubocop/graphql/default_null_true.rb +43 -0
  136. data/lib/graphql/rubocop/graphql/default_required_true.rb +43 -0
  137. data/lib/graphql/rubocop.rb +4 -0
  138. data/lib/graphql/schema/addition.rb +245 -0
  139. data/lib/graphql/schema/argument.rb +284 -33
  140. data/lib/graphql/schema/base_64_encoder.rb +2 -0
  141. data/lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb +1 -1
  142. data/lib/graphql/schema/build_from_definition/resolve_map.rb +13 -5
  143. data/lib/graphql/schema/build_from_definition.rb +336 -205
  144. data/lib/graphql/schema/built_in_types.rb +5 -5
  145. data/lib/graphql/schema/directive/deprecated.rb +18 -0
  146. data/lib/graphql/schema/directive/feature.rb +1 -1
  147. data/lib/graphql/schema/directive/flagged.rb +57 -0
  148. data/lib/graphql/schema/directive/include.rb +2 -2
  149. data/lib/graphql/schema/directive/one_of.rb +12 -0
  150. data/lib/graphql/schema/directive/skip.rb +2 -2
  151. data/lib/graphql/schema/directive/transform.rb +14 -2
  152. data/lib/graphql/schema/directive.rb +134 -15
  153. data/lib/graphql/schema/enum.rb +137 -39
  154. data/lib/graphql/schema/enum_value.rb +20 -23
  155. data/lib/graphql/schema/field/connection_extension.rb +50 -20
  156. data/lib/graphql/schema/field/scope_extension.rb +1 -1
  157. data/lib/graphql/schema/field.rb +503 -331
  158. data/lib/graphql/schema/field_extension.rb +89 -2
  159. data/lib/graphql/schema/find_inherited_value.rb +17 -1
  160. data/lib/graphql/schema/finder.rb +16 -14
  161. data/lib/graphql/schema/input_object.rb +182 -60
  162. data/lib/graphql/schema/interface.rb +24 -49
  163. data/lib/graphql/schema/introspection_system.rb +103 -37
  164. data/lib/graphql/schema/late_bound_type.rb +9 -2
  165. data/lib/graphql/schema/list.rb +61 -3
  166. data/lib/graphql/schema/loader.rb +144 -96
  167. data/lib/graphql/schema/member/base_dsl_methods.rb +41 -37
  168. data/lib/graphql/schema/member/build_type.rb +24 -15
  169. data/lib/graphql/schema/member/has_arguments.rb +310 -26
  170. data/lib/graphql/schema/member/has_ast_node.rb +32 -0
  171. data/lib/graphql/schema/member/has_deprecation_reason.rb +24 -0
  172. data/lib/graphql/schema/member/has_directives.rb +120 -0
  173. data/lib/graphql/schema/member/has_fields.rb +112 -34
  174. data/lib/graphql/schema/member/has_interfaces.rb +129 -0
  175. data/lib/graphql/schema/member/has_unresolved_type_error.rb +15 -0
  176. data/lib/graphql/schema/member/has_validators.rb +57 -0
  177. data/lib/graphql/schema/member/relay_shortcuts.rb +47 -2
  178. data/lib/graphql/schema/member/type_system_helpers.rb +20 -3
  179. data/lib/graphql/schema/member/validates_input.rb +33 -0
  180. data/lib/graphql/schema/member.rb +11 -6
  181. data/lib/graphql/schema/mutation.rb +4 -9
  182. data/lib/graphql/schema/non_null.rb +34 -4
  183. data/lib/graphql/schema/object.rb +36 -60
  184. data/lib/graphql/schema/printer.rb +16 -35
  185. data/lib/graphql/schema/relay_classic_mutation.rb +91 -44
  186. data/lib/graphql/schema/resolver/has_payload_type.rb +51 -11
  187. data/lib/graphql/schema/resolver.rb +147 -94
  188. data/lib/graphql/schema/scalar.rb +40 -15
  189. data/lib/graphql/schema/subscription.rb +60 -31
  190. data/lib/graphql/schema/timeout.rb +45 -35
  191. data/lib/graphql/schema/type_expression.rb +21 -13
  192. data/lib/graphql/schema/type_membership.rb +23 -6
  193. data/lib/graphql/schema/union.rb +49 -15
  194. data/lib/graphql/schema/unique_within_type.rb +1 -2
  195. data/lib/graphql/schema/validator/allow_blank_validator.rb +29 -0
  196. data/lib/graphql/schema/validator/allow_null_validator.rb +26 -0
  197. data/lib/graphql/schema/validator/exclusion_validator.rb +33 -0
  198. data/lib/graphql/schema/validator/format_validator.rb +48 -0
  199. data/lib/graphql/schema/validator/inclusion_validator.rb +35 -0
  200. data/lib/graphql/schema/validator/length_validator.rb +59 -0
  201. data/lib/graphql/schema/validator/numericality_validator.rb +82 -0
  202. data/lib/graphql/schema/validator/required_validator.rb +82 -0
  203. data/lib/graphql/schema/validator.rb +171 -0
  204. data/lib/graphql/schema/warden.rb +211 -35
  205. data/lib/graphql/schema/wrapper.rb +0 -5
  206. data/lib/graphql/schema.rb +833 -889
  207. data/lib/graphql/static_validation/all_rules.rb +3 -0
  208. data/lib/graphql/static_validation/base_visitor.rb +21 -31
  209. data/lib/graphql/static_validation/definition_dependencies.rb +7 -2
  210. data/lib/graphql/static_validation/error.rb +3 -1
  211. data/lib/graphql/static_validation/literal_validator.rb +69 -26
  212. data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +45 -83
  213. data/lib/graphql/static_validation/rules/argument_literals_are_compatible_error.rb +22 -6
  214. data/lib/graphql/static_validation/rules/arguments_are_defined.rb +35 -26
  215. data/lib/graphql/static_validation/rules/arguments_are_defined_error.rb +4 -2
  216. data/lib/graphql/static_validation/rules/directives_are_defined.rb +12 -6
  217. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +14 -14
  218. data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +4 -4
  219. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +5 -5
  220. data/lib/graphql/static_validation/rules/fields_will_merge.rb +94 -51
  221. data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +25 -4
  222. data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +3 -3
  223. data/lib/graphql/static_validation/rules/fragments_are_finite.rb +2 -2
  224. data/lib/graphql/static_validation/rules/input_object_names_are_unique.rb +30 -0
  225. data/lib/graphql/static_validation/rules/input_object_names_are_unique_error.rb +30 -0
  226. data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid.rb +66 -0
  227. data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid_error.rb +29 -0
  228. data/lib/graphql/static_validation/rules/query_root_exists.rb +17 -0
  229. data/lib/graphql/static_validation/rules/query_root_exists_error.rb +26 -0
  230. data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +4 -2
  231. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +9 -10
  232. data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +13 -7
  233. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +12 -13
  234. data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +19 -14
  235. data/lib/graphql/static_validation/rules/variables_are_input_types.rb +1 -1
  236. data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +5 -3
  237. data/lib/graphql/static_validation/type_stack.rb +2 -2
  238. data/lib/graphql/static_validation/validation_context.rb +13 -3
  239. data/lib/graphql/static_validation/validation_timeout_error.rb +25 -0
  240. data/lib/graphql/static_validation/validator.rb +32 -20
  241. data/lib/graphql/static_validation.rb +1 -2
  242. data/lib/graphql/string_encoding_error.rb +13 -3
  243. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +129 -22
  244. data/lib/graphql/subscriptions/broadcast_analyzer.rb +81 -0
  245. data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +58 -0
  246. data/lib/graphql/subscriptions/event.rb +84 -35
  247. data/lib/graphql/subscriptions/instrumentation.rb +0 -47
  248. data/lib/graphql/subscriptions/serialize.rb +53 -6
  249. data/lib/graphql/subscriptions.rb +137 -57
  250. data/lib/graphql/tracing/active_support_notifications_trace.rb +16 -0
  251. data/lib/graphql/tracing/active_support_notifications_tracing.rb +8 -17
  252. data/lib/graphql/tracing/appoptics_trace.rb +231 -0
  253. data/lib/graphql/tracing/appoptics_tracing.rb +173 -0
  254. data/lib/graphql/tracing/appsignal_trace.rb +71 -0
  255. data/lib/graphql/tracing/appsignal_tracing.rb +23 -0
  256. data/lib/graphql/tracing/data_dog_trace.rb +148 -0
  257. data/lib/graphql/tracing/data_dog_tracing.rb +34 -2
  258. data/lib/graphql/tracing/new_relic_trace.rb +75 -0
  259. data/lib/graphql/tracing/new_relic_tracing.rb +9 -12
  260. data/lib/graphql/tracing/notifications_trace.rb +41 -0
  261. data/lib/graphql/tracing/notifications_tracing.rb +59 -0
  262. data/lib/graphql/tracing/platform_trace.rb +107 -0
  263. data/lib/graphql/tracing/platform_tracing.rb +76 -35
  264. data/lib/graphql/tracing/prometheus_trace.rb +89 -0
  265. data/lib/graphql/tracing/prometheus_tracing/graphql_collector.rb +4 -1
  266. data/lib/graphql/tracing/prometheus_tracing.rb +11 -3
  267. data/lib/graphql/tracing/scout_trace.rb +72 -0
  268. data/lib/graphql/tracing/scout_tracing.rb +19 -0
  269. data/lib/graphql/tracing/statsd_trace.rb +56 -0
  270. data/lib/graphql/tracing/statsd_tracing.rb +42 -0
  271. data/lib/graphql/tracing.rb +143 -67
  272. data/lib/graphql/type_kinds.rb +6 -3
  273. data/lib/graphql/types/big_int.rb +5 -1
  274. data/lib/graphql/types/int.rb +10 -3
  275. data/lib/graphql/types/iso_8601_date.rb +20 -9
  276. data/lib/graphql/types/iso_8601_date_time.rb +36 -10
  277. data/lib/graphql/types/relay/base_connection.rb +18 -90
  278. data/lib/graphql/types/relay/base_edge.rb +2 -34
  279. data/lib/graphql/types/relay/connection_behaviors.rb +176 -0
  280. data/lib/graphql/types/relay/edge_behaviors.rb +75 -0
  281. data/lib/graphql/types/relay/has_node_field.rb +41 -0
  282. data/lib/graphql/types/relay/has_nodes_field.rb +41 -0
  283. data/lib/graphql/types/relay/node.rb +2 -4
  284. data/lib/graphql/types/relay/node_behaviors.rb +25 -0
  285. data/lib/graphql/types/relay/page_info.rb +2 -14
  286. data/lib/graphql/types/relay/page_info_behaviors.rb +30 -0
  287. data/lib/graphql/types/relay.rb +10 -5
  288. data/lib/graphql/types/string.rb +8 -2
  289. data/lib/graphql/unauthorized_error.rb +2 -2
  290. data/lib/graphql/unresolved_type_error.rb +2 -2
  291. data/lib/graphql/version.rb +1 -1
  292. data/lib/graphql.rb +60 -66
  293. data/readme.md +3 -6
  294. metadata +124 -236
  295. data/lib/graphql/analysis/analyze_query.rb +0 -91
  296. data/lib/graphql/analysis/field_usage.rb +0 -45
  297. data/lib/graphql/analysis/max_query_complexity.rb +0 -26
  298. data/lib/graphql/analysis/max_query_depth.rb +0 -26
  299. data/lib/graphql/analysis/query_complexity.rb +0 -88
  300. data/lib/graphql/analysis/query_depth.rb +0 -43
  301. data/lib/graphql/analysis/reducer_state.rb +0 -48
  302. data/lib/graphql/argument.rb +0 -159
  303. data/lib/graphql/authorization.rb +0 -82
  304. data/lib/graphql/backwards_compatibility.rb +0 -60
  305. data/lib/graphql/base_type.rb +0 -226
  306. data/lib/graphql/boolean_type.rb +0 -2
  307. data/lib/graphql/compatibility/execution_specification/counter_schema.rb +0 -53
  308. data/lib/graphql/compatibility/execution_specification/specification_schema.rb +0 -200
  309. data/lib/graphql/compatibility/execution_specification.rb +0 -435
  310. data/lib/graphql/compatibility/lazy_execution_specification/lazy_schema.rb +0 -111
  311. data/lib/graphql/compatibility/lazy_execution_specification.rb +0 -213
  312. data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +0 -91
  313. data/lib/graphql/compatibility/query_parser_specification/query_assertions.rb +0 -79
  314. data/lib/graphql/compatibility/query_parser_specification.rb +0 -264
  315. data/lib/graphql/compatibility/schema_parser_specification.rb +0 -680
  316. data/lib/graphql/compatibility.rb +0 -5
  317. data/lib/graphql/define/assign_argument.rb +0 -12
  318. data/lib/graphql/define/assign_connection.rb +0 -13
  319. data/lib/graphql/define/assign_enum_value.rb +0 -18
  320. data/lib/graphql/define/assign_global_id_field.rb +0 -11
  321. data/lib/graphql/define/assign_mutation_function.rb +0 -34
  322. data/lib/graphql/define/assign_object_field.rb +0 -42
  323. data/lib/graphql/define/defined_object_proxy.rb +0 -50
  324. data/lib/graphql/define/instance_definable.rb +0 -300
  325. data/lib/graphql/define/no_definition_error.rb +0 -7
  326. data/lib/graphql/define/non_null_with_bang.rb +0 -16
  327. data/lib/graphql/define/type_definer.rb +0 -31
  328. data/lib/graphql/define.rb +0 -31
  329. data/lib/graphql/deprecated_dsl.rb +0 -42
  330. data/lib/graphql/directive/deprecated_directive.rb +0 -13
  331. data/lib/graphql/directive/include_directive.rb +0 -2
  332. data/lib/graphql/directive/skip_directive.rb +0 -2
  333. data/lib/graphql/directive.rb +0 -104
  334. data/lib/graphql/enum_type.rb +0 -193
  335. data/lib/graphql/execution/execute.rb +0 -326
  336. data/lib/graphql/execution/flatten.rb +0 -40
  337. data/lib/graphql/execution/instrumentation.rb +0 -92
  338. data/lib/graphql/execution/interpreter/hash_response.rb +0 -46
  339. data/lib/graphql/execution/lazy/resolve.rb +0 -91
  340. data/lib/graphql/execution/typecast.rb +0 -50
  341. data/lib/graphql/field/resolve.rb +0 -59
  342. data/lib/graphql/field.rb +0 -330
  343. data/lib/graphql/float_type.rb +0 -2
  344. data/lib/graphql/function.rb +0 -153
  345. data/lib/graphql/id_type.rb +0 -2
  346. data/lib/graphql/input_object_type.rb +0 -154
  347. data/lib/graphql/int_type.rb +0 -2
  348. data/lib/graphql/interface_type.rb +0 -86
  349. data/lib/graphql/internal_representation/document.rb +0 -27
  350. data/lib/graphql/internal_representation/node.rb +0 -206
  351. data/lib/graphql/internal_representation/print.rb +0 -51
  352. data/lib/graphql/internal_representation/rewrite.rb +0 -184
  353. data/lib/graphql/internal_representation/scope.rb +0 -88
  354. data/lib/graphql/internal_representation/visit.rb +0 -36
  355. data/lib/graphql/internal_representation.rb +0 -7
  356. data/lib/graphql/language/lexer.rl +0 -258
  357. data/lib/graphql/list_type.rb +0 -80
  358. data/lib/graphql/literal_validation_error.rb +0 -6
  359. data/lib/graphql/non_null_type.rb +0 -81
  360. data/lib/graphql/object_type.rb +0 -141
  361. data/lib/graphql/query/arguments.rb +0 -187
  362. data/lib/graphql/query/arguments_cache.rb +0 -25
  363. data/lib/graphql/query/executor.rb +0 -53
  364. data/lib/graphql/query/literal_input.rb +0 -116
  365. data/lib/graphql/query/serial_execution/field_resolution.rb +0 -92
  366. data/lib/graphql/query/serial_execution/operation_resolution.rb +0 -19
  367. data/lib/graphql/query/serial_execution/selection_resolution.rb +0 -23
  368. data/lib/graphql/query/serial_execution/value_resolution.rb +0 -87
  369. data/lib/graphql/query/serial_execution.rb +0 -39
  370. data/lib/graphql/relay/array_connection.rb +0 -85
  371. data/lib/graphql/relay/base_connection.rb +0 -172
  372. data/lib/graphql/relay/connection_instrumentation.rb +0 -54
  373. data/lib/graphql/relay/connection_resolve.rb +0 -43
  374. data/lib/graphql/relay/connection_type.rb +0 -40
  375. data/lib/graphql/relay/edge.rb +0 -27
  376. data/lib/graphql/relay/edge_type.rb +0 -18
  377. data/lib/graphql/relay/edges_instrumentation.rb +0 -40
  378. data/lib/graphql/relay/global_id_resolve.rb +0 -18
  379. data/lib/graphql/relay/mongo_relation_connection.rb +0 -50
  380. data/lib/graphql/relay/mutation/instrumentation.rb +0 -23
  381. data/lib/graphql/relay/mutation/resolve.rb +0 -56
  382. data/lib/graphql/relay/mutation/result.rb +0 -38
  383. data/lib/graphql/relay/mutation.rb +0 -190
  384. data/lib/graphql/relay/node.rb +0 -36
  385. data/lib/graphql/relay/page_info.rb +0 -7
  386. data/lib/graphql/relay/relation_connection.rb +0 -190
  387. data/lib/graphql/relay/type_extensions.rb +0 -30
  388. data/lib/graphql/scalar_type.rb +0 -133
  389. data/lib/graphql/schema/catchall_middleware.rb +0 -35
  390. data/lib/graphql/schema/default_parse_error.rb +0 -10
  391. data/lib/graphql/schema/default_type_error.rb +0 -15
  392. data/lib/graphql/schema/member/accepts_definition.rb +0 -152
  393. data/lib/graphql/schema/member/cached_graphql_definition.rb +0 -26
  394. data/lib/graphql/schema/member/instrumentation.rb +0 -132
  395. data/lib/graphql/schema/middleware_chain.rb +0 -82
  396. data/lib/graphql/schema/possible_types.rb +0 -39
  397. data/lib/graphql/schema/rescue_middleware.rb +0 -60
  398. data/lib/graphql/schema/timeout_middleware.rb +0 -86
  399. data/lib/graphql/schema/traversal.rb +0 -228
  400. data/lib/graphql/schema/validation.rb +0 -303
  401. data/lib/graphql/static_validation/default_visitor.rb +0 -15
  402. data/lib/graphql/static_validation/no_validate_visitor.rb +0 -10
  403. data/lib/graphql/string_type.rb +0 -2
  404. data/lib/graphql/subscriptions/subscription_root.rb +0 -66
  405. data/lib/graphql/tracing/skylight_tracing.rb +0 -62
  406. data/lib/graphql/types/relay/base_field.rb +0 -22
  407. data/lib/graphql/types/relay/base_interface.rb +0 -29
  408. data/lib/graphql/types/relay/base_object.rb +0 -26
  409. data/lib/graphql/types/relay/node_field.rb +0 -43
  410. data/lib/graphql/types/relay/nodes_field.rb +0 -45
  411. data/lib/graphql/union_type.rb +0 -128
  412. data/lib/graphql/upgrader/member.rb +0 -936
  413. data/lib/graphql/upgrader/schema.rb +0 -37
@@ -2,9 +2,12 @@
2
2
  module GraphQL
3
3
  class Schema
4
4
  class Argument
5
- include GraphQL::Schema::Member::CachedGraphQLDefinition
6
- include GraphQL::Schema::Member::AcceptsDefinition
7
5
  include GraphQL::Schema::Member::HasPath
6
+ include GraphQL::Schema::Member::HasAstNode
7
+ include GraphQL::Schema::Member::HasDirectives
8
+ include GraphQL::Schema::Member::HasDeprecationReason
9
+ include GraphQL::Schema::Member::HasValidators
10
+ include GraphQL::Schema::FindInheritedValue::EmptyObjects
8
11
 
9
12
  NO_DEFAULT = :__no_default__
10
13
 
@@ -15,8 +18,14 @@ module GraphQL
15
18
  # @return [GraphQL::Schema::Field, Class] The field or input object this argument belongs to
16
19
  attr_reader :owner
17
20
 
18
- # @return [Symbol] A method to call to transform this value before sending it to field resolution method
19
- attr_reader :prepare
21
+ # @param new_prepare [Method, Proc]
22
+ # @return [Symbol] A method or proc to call to transform this value before sending it to field resolution method
23
+ def prepare(new_prepare = NO_DEFAULT)
24
+ if new_prepare != NO_DEFAULT
25
+ @prepare = new_prepare
26
+ end
27
+ @prepare
28
+ end
20
29
 
21
30
  # @return [Symbol] This argument's name in Ruby keyword arguments
22
31
  attr_reader :keyword
@@ -32,30 +41,53 @@ module GraphQL
32
41
  # @param arg_name [Symbol]
33
42
  # @param type_expr
34
43
  # @param desc [String]
35
- # @param required [Boolean] if true, this argument is non-null; if false, this argument is nullable
44
+ # @param required [Boolean, :nullable] if true, this argument is non-null; if false, this argument is nullable. If `:nullable`, then the argument must be provided, though it may be `null`.
36
45
  # @param description [String]
37
46
  # @param default_value [Object]
38
47
  # @param as [Symbol] Override the keyword name when passed to a method
39
48
  # @param prepare [Symbol] A method to call to transform this argument's valuebefore sending it to field resolution
40
49
  # @param camelize [Boolean] if true, the name will be camelized when building the schema
41
50
  # @param from_resolver [Boolean] if true, a Resolver class defined this argument
42
- # @param method_access [Boolean] If false, don't build method access on legacy {Query::Arguments} instances.
43
- def initialize(arg_name = nil, type_expr = nil, desc = nil, required:, type: nil, name: nil, loads: nil, description: nil, ast_node: nil, default_value: NO_DEFAULT, as: nil, from_resolver: false, camelize: true, prepare: nil, method_access: true, owner:, &definition_block)
51
+ # @param directives [Hash{Class => Hash}]
52
+ # @param deprecation_reason [String]
53
+ # @param validates [Hash, nil] Options for building validators, if any should be applied
54
+ # @param replace_null_with_default [Boolean] if `true`, incoming values of `null` will be replaced with the configured `default_value`
55
+ def initialize(arg_name = nil, type_expr = nil, desc = nil, required: true, type: nil, name: nil, loads: nil, description: nil, ast_node: nil, default_value: NO_DEFAULT, as: nil, from_resolver: false, camelize: true, prepare: nil, owner:, validates: nil, directives: nil, deprecation_reason: nil, replace_null_with_default: false, &definition_block)
44
56
  arg_name ||= name
45
- name_str = camelize ? Member::BuildType.camelize(arg_name.to_s) : arg_name.to_s
46
- @name = name_str.freeze
57
+ @name = -(camelize ? Member::BuildType.camelize(arg_name.to_s) : arg_name.to_s)
47
58
  @type_expr = type_expr || type
48
59
  @description = desc || description
49
- @null = !required
60
+ @null = required != true
50
61
  @default_value = default_value
62
+ if replace_null_with_default
63
+ if !default_value?
64
+ raise ArgumentError, "`replace_null_with_default: true` requires a default value, please provide one with `default_value: ...`"
65
+ end
66
+ @replace_null_with_default = true
67
+ end
68
+
51
69
  @owner = owner
52
70
  @as = as
53
71
  @loads = loads
54
- @keyword = as || Schema::Member::BuildType.underscore(@name).to_sym
72
+ @keyword = as || (arg_name.is_a?(Symbol) ? arg_name : Schema::Member::BuildType.underscore(@name).to_sym)
55
73
  @prepare = prepare
56
74
  @ast_node = ast_node
57
75
  @from_resolver = from_resolver
58
- @method_access = method_access
76
+ self.deprecation_reason = deprecation_reason
77
+
78
+ if directives
79
+ directives.each do |dir_class, dir_options|
80
+ directive(dir_class, **dir_options)
81
+ end
82
+ end
83
+
84
+ if validates && !validates.empty?
85
+ self.validates(validates)
86
+ end
87
+
88
+ if required == :nullable
89
+ self.owner.validates(required: { argument: arg_name })
90
+ end
59
91
 
60
92
  if definition_block
61
93
  if definition_block.arity == 1
@@ -66,14 +98,28 @@ module GraphQL
66
98
  end
67
99
  end
68
100
 
101
+ def inspect
102
+ "#<#{self.class} #{path}: #{type.to_type_signature}#{description ? " @description=#{description.inspect}" : ""}>"
103
+ end
104
+
105
+ # @param default_value [Object] The value to use when the client doesn't provide one
69
106
  # @return [Object] the value used when the client doesn't provide a value for this argument
70
- attr_reader :default_value
107
+ def default_value(new_default_value = NO_DEFAULT)
108
+ if new_default_value != NO_DEFAULT
109
+ @default_value = new_default_value
110
+ end
111
+ @default_value
112
+ end
71
113
 
72
114
  # @return [Boolean] True if this argument has a default value
73
115
  def default_value?
74
116
  @default_value != NO_DEFAULT
75
117
  end
76
118
 
119
+ def replace_null_with_default?
120
+ @replace_null_with_default
121
+ end
122
+
77
123
  attr_writer :description
78
124
 
79
125
  # @return [String] Documentation for this argument
@@ -85,56 +131,261 @@ module GraphQL
85
131
  end
86
132
  end
87
133
 
134
+ # @return [String] Deprecation reason for this argument
135
+ def deprecation_reason(text = nil)
136
+ if text
137
+ self.deprecation_reason = text
138
+ else
139
+ super()
140
+ end
141
+ end
142
+
143
+ def deprecation_reason=(new_reason)
144
+ validate_deprecated_or_optional(null: @null, deprecation_reason: new_reason)
145
+ super
146
+ end
147
+
88
148
  def visible?(context)
89
149
  true
90
150
  end
91
151
 
92
- def accessible?(context)
93
- true
152
+ def authorized?(obj, value, ctx)
153
+ authorized_as_type?(obj, value, ctx, as_type: type)
94
154
  end
95
155
 
96
- def authorized?(obj, ctx)
156
+ def authorized_as_type?(obj, value, ctx, as_type:)
157
+ if value.nil?
158
+ return true
159
+ end
160
+
161
+ if as_type.kind.non_null?
162
+ as_type = as_type.of_type
163
+ end
164
+
165
+ if as_type.kind.list?
166
+ value.each do |v|
167
+ if !authorized_as_type?(obj, v, ctx, as_type: as_type.of_type)
168
+ return false
169
+ end
170
+ end
171
+ elsif as_type.kind.input_object?
172
+ return as_type.authorized?(obj, value, ctx)
173
+ end
174
+ # None of the early-return conditions were activated,
175
+ # so this is authorized.
97
176
  true
98
177
  end
99
178
 
100
- def to_graphql
101
- argument = GraphQL::Argument.new
102
- argument.name = @name
103
- argument.type = -> { type }
104
- argument.description = @description
105
- argument.metadata[:type_class] = self
106
- argument.as = @as
107
- argument.method_access = @method_access
108
- if NO_DEFAULT != @default_value
109
- argument.default_value = @default_value
179
+ def type=(new_type)
180
+ validate_input_type(new_type)
181
+ # This isn't true for LateBoundTypes, but we can assume those will
182
+ # be updated via this codepath later in schema setup.
183
+ if new_type.respond_to?(:non_null?)
184
+ validate_deprecated_or_optional(null: !new_type.non_null?, deprecation_reason: deprecation_reason)
110
185
  end
111
- argument
186
+ @type = new_type
112
187
  end
113
188
 
114
189
  def type
115
- @type ||= Member::BuildType.parse_type(@type_expr, null: @null)
116
- rescue StandardError => err
117
- raise ArgumentError, "Couldn't build type for Argument #{@owner.name}.#{name}: #{err.class.name}: #{err.message}", err.backtrace
190
+ @type ||= begin
191
+ parsed_type = begin
192
+ Member::BuildType.parse_type(@type_expr, null: @null)
193
+ rescue StandardError => err
194
+ raise ArgumentError, "Couldn't build type for Argument #{@owner.name}.#{name}: #{err.class.name}: #{err.message}", err.backtrace
195
+ end
196
+ # Use the setter method to get validations
197
+ self.type = parsed_type
198
+ end
199
+ end
200
+
201
+ def statically_coercible?
202
+ return @statically_coercible if defined?(@statically_coercible)
203
+
204
+ @statically_coercible = !@prepare.is_a?(String) && !@prepare.is_a?(Symbol)
118
205
  end
119
206
 
120
207
  # Apply the {prepare} configuration to `value`, using methods from `obj`.
121
208
  # Used by the runtime.
122
209
  # @api private
123
- def prepare_value(obj, value)
210
+ def prepare_value(obj, value, context: nil)
124
211
  if value.is_a?(GraphQL::Schema::InputObject)
125
212
  value = value.prepare
126
213
  end
127
214
 
215
+ Schema::Validator.validate!(validators, obj, context, value)
216
+
128
217
  if @prepare.nil?
129
218
  value
130
219
  elsif @prepare.is_a?(String) || @prepare.is_a?(Symbol)
131
- obj.public_send(@prepare, value)
220
+ if obj.nil?
221
+ # The problem here is, we _used to_ prepare while building variables.
222
+ # But now we don't have the runtime object there.
223
+ #
224
+ # This will have to be called later, when the runtime object _is_ available.
225
+ value
226
+ else
227
+ obj.public_send(@prepare, value)
228
+ end
132
229
  elsif @prepare.respond_to?(:call)
133
- @prepare.call(value, obj.context)
230
+ @prepare.call(value, context || obj.context)
134
231
  else
135
232
  raise "Invalid prepare for #{@owner.name}.name: #{@prepare.inspect}"
136
233
  end
137
234
  end
235
+
236
+ # @api private
237
+ def coerce_into_values(parent_object, values, context, argument_values)
238
+ arg_name = graphql_name
239
+ arg_key = keyword
240
+ default_used = false
241
+
242
+ if values.key?(arg_name)
243
+ value = values[arg_name]
244
+ elsif values.key?(arg_key)
245
+ value = values[arg_key]
246
+ elsif default_value?
247
+ value = default_value
248
+ default_used = true
249
+ else
250
+ # no value at all
251
+ owner.validate_directive_argument(self, nil)
252
+ return
253
+ end
254
+
255
+ if value.nil? && replace_null_with_default?
256
+ value = default_value
257
+ default_used = true
258
+ end
259
+
260
+ loaded_value = nil
261
+ coerced_value = begin
262
+ type.coerce_input(value, context)
263
+ rescue StandardError => err
264
+ context.schema.handle_or_reraise(context, err)
265
+ end
266
+
267
+ # If this isn't lazy, then the block returns eagerly and assigns the result here
268
+ # If it _is_ lazy, then we write the lazy to the hash, then update it later
269
+ argument_values[arg_key] = context.schema.after_lazy(coerced_value) do |resolved_coerced_value|
270
+ owner.validate_directive_argument(self, resolved_coerced_value)
271
+ prepared_value = begin
272
+ prepare_value(parent_object, resolved_coerced_value, context: context)
273
+ rescue StandardError => err
274
+ context.schema.handle_or_reraise(context, err)
275
+ end
276
+
277
+ if loads && !from_resolver?
278
+ loaded_value = begin
279
+ load_and_authorize_value(owner, prepared_value, context)
280
+ rescue StandardError => err
281
+ context.schema.handle_or_reraise(context, err)
282
+ end
283
+ end
284
+
285
+ maybe_loaded_value = loaded_value || prepared_value
286
+ context.schema.after_lazy(maybe_loaded_value) do |resolved_loaded_value|
287
+ # TODO code smell to access such a deeply-nested constant in a distant module
288
+ argument_values[arg_key] = GraphQL::Execution::Interpreter::ArgumentValue.new(
289
+ value: resolved_loaded_value,
290
+ definition: self,
291
+ default_used: default_used,
292
+ )
293
+ end
294
+ end
295
+ end
296
+
297
+ def load_and_authorize_value(load_method_owner, coerced_value, context)
298
+ if coerced_value.nil?
299
+ return nil
300
+ end
301
+ arg_load_method = "load_#{keyword}"
302
+ if load_method_owner.respond_to?(arg_load_method)
303
+ custom_loaded_value = if load_method_owner.is_a?(Class)
304
+ load_method_owner.public_send(arg_load_method, coerced_value, context)
305
+ else
306
+ load_method_owner.public_send(arg_load_method, coerced_value)
307
+ end
308
+ context.schema.after_lazy(custom_loaded_value) do |custom_value|
309
+ if loads
310
+ if type.list?
311
+ loaded_values = custom_value.each_with_index.map { |custom_val, idx|
312
+ id = coerced_value[idx]
313
+ load_method_owner.authorize_application_object(self, id, context, custom_val)
314
+ }
315
+ context.schema.after_any_lazies(loaded_values, &:itself)
316
+ else
317
+ load_method_owner.authorize_application_object(self, coerced_value, context, custom_loaded_value)
318
+ end
319
+ else
320
+ custom_value
321
+ end
322
+ end
323
+ elsif loads
324
+ if type.list?
325
+ loaded_values = coerced_value.map { |val| load_method_owner.load_and_authorize_application_object(self, val, context) }
326
+ context.schema.after_any_lazies(loaded_values, &:itself)
327
+ else
328
+ load_method_owner.load_and_authorize_application_object(self, coerced_value, context)
329
+ end
330
+ else
331
+ coerced_value
332
+ end
333
+ end
334
+
335
+ # @api private
336
+ def validate_default_value
337
+ coerced_default_value = begin
338
+ # This is weird, but we should accept single-item default values for list-type arguments.
339
+ # If we used `coerce_isolated_input` below, it would do this for us, but it's not really
340
+ # the right thing here because we expect default values in application format (Ruby values)
341
+ # not GraphQL format (scalar values).
342
+ #
343
+ # But I don't think Schema::List#coerce_result should apply wrapping to single-item lists.
344
+ prepped_default_value = if default_value.nil?
345
+ nil
346
+ elsif (type.kind.list? || (type.kind.non_null? && type.of_type.list?)) && !default_value.respond_to?(:map)
347
+ [default_value]
348
+ else
349
+ default_value
350
+ end
351
+
352
+ type.coerce_isolated_result(prepped_default_value) unless prepped_default_value.nil?
353
+ rescue GraphQL::Schema::Enum::UnresolvedValueError
354
+ # It raises this, which is helpful at runtime, but not here...
355
+ default_value
356
+ end
357
+ res = type.valid_isolated_input?(coerced_default_value)
358
+ if !res
359
+ raise InvalidDefaultValueError.new(self)
360
+ end
361
+ end
362
+
363
+ class InvalidDefaultValueError < GraphQL::Error
364
+ def initialize(argument)
365
+ message = "`#{argument.path}` has an invalid default value: `#{argument.default_value.inspect}` isn't accepted by `#{argument.type.to_type_signature}`; update the default value or the argument type."
366
+ super(message)
367
+ end
368
+ end
369
+
370
+ private
371
+
372
+ def validate_input_type(input_type)
373
+ if input_type.is_a?(String) || input_type.is_a?(GraphQL::Schema::LateBoundType)
374
+ # Do nothing; assume this will be validated later
375
+ elsif input_type.kind.non_null? || input_type.kind.list?
376
+ validate_input_type(input_type.unwrap)
377
+ elsif !input_type.kind.input?
378
+ raise ArgumentError, "Invalid input type for #{path}: #{input_type.graphql_name}. Must be scalar, enum, or input object, not #{input_type.kind.name}."
379
+ else
380
+ # It's an input type, we're OK
381
+ end
382
+ end
383
+
384
+ def validate_deprecated_or_optional(null:, deprecation_reason:)
385
+ if deprecation_reason && !null
386
+ raise ArgumentError, "Required arguments cannot be deprecated: #{path}."
387
+ end
388
+ end
138
389
  end
139
390
  end
140
391
  end
@@ -13,6 +13,8 @@ module GraphQL
13
13
  def self.decode(encoded_text, nonce: false)
14
14
  # urlsafe_decode64 is for forward compatibility
15
15
  Base64Bp.urlsafe_decode64(encoded_text)
16
+ rescue ArgumentError
17
+ raise GraphQL::ExecutionError, "Invalid input: #{encoded_text.inspect}"
16
18
  end
17
19
  end
18
20
  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
@@ -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
@@ -39,8 +45,10 @@ module GraphQL
39
45
  @resolve_hash[type_name_s][field_name.to_s] = resolve_fn
40
46
  end
41
47
  when Proc
42
- # for example, __resolve_type
48
+ # for example, "resolve_type"
43
49
  @resolve_hash[type_name_s] = fields
50
+ else
51
+ raise ArgumentError, "Unexpected resolve hash value for #{type_name.inspect}: #{fields.inspect} (#{fields.class})"
44
52
  end
45
53
  end
46
54
 
@@ -53,16 +61,16 @@ module GraphQL
53
61
  end
54
62
 
55
63
  def call(type, field, obj, args, ctx)
56
- resolver = @resolve_hash[type.name][field.name]
64
+ resolver = @resolve_hash[type.graphql_name][field.graphql_name]
57
65
  resolver.call(obj, args, ctx)
58
66
  end
59
67
 
60
68
  def coerce_input(type, value, ctx)
61
- @resolve_hash[type.name]["coerce_input"].call(value, ctx)
69
+ @resolve_hash[type.graphql_name]["coerce_input"].call(value, ctx)
62
70
  end
63
71
 
64
72
  def coerce_result(type, value, ctx)
65
- @resolve_hash[type.name]["coerce_result"].call(value, ctx)
73
+ @resolve_hash[type.graphql_name]["coerce_result"].call(value, ctx)
66
74
  end
67
75
  end
68
76
  end