graphql 1.9.21 → 2.0.16

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 (403) 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 +17 -8
  53. data/lib/graphql/analysis/ast.rb +14 -14
  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 +44 -25
  75. data/lib/graphql/execution/interpreter/runtime.rb +755 -395
  76. data/lib/graphql/execution/interpreter.rb +201 -74
  77. data/lib/graphql/execution/lazy/lazy_method_map.rb +4 -0
  78. data/lib/graphql/execution/lazy.rb +5 -9
  79. data/lib/graphql/execution/lookahead.rb +65 -136
  80. data/lib/graphql/execution/multiplex.rb +5 -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 +11 -5
  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 +10 -10
  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 +104 -68
  102. data/lib/graphql/language/lexer.rb +83 -40
  103. data/lib/graphql/language/lexer.rl +31 -9
  104. data/lib/graphql/language/nodes.rb +64 -93
  105. data/lib/graphql/language/parser.rb +940 -896
  106. data/lib/graphql/language/parser.y +130 -103
  107. data/lib/graphql/language/printer.rb +48 -23
  108. data/lib/graphql/language/sanitized_printer.rb +222 -0
  109. data/lib/graphql/language/token.rb +0 -4
  110. data/lib/graphql/language/visitor.rb +2 -2
  111. data/lib/graphql/language.rb +3 -1
  112. data/lib/graphql/name_validator.rb +2 -7
  113. data/lib/graphql/pagination/active_record_relation_connection.rb +85 -0
  114. data/lib/graphql/pagination/array_connection.rb +79 -0
  115. data/lib/graphql/pagination/connection.rb +253 -0
  116. data/lib/graphql/pagination/connections.rb +135 -0
  117. data/lib/graphql/pagination/mongoid_relation_connection.rb +25 -0
  118. data/lib/graphql/pagination/relation_connection.rb +228 -0
  119. data/lib/graphql/pagination/sequel_dataset_connection.rb +28 -0
  120. data/lib/graphql/pagination.rb +6 -0
  121. data/lib/graphql/parse_error.rb +0 -1
  122. data/lib/graphql/query/context.rb +172 -198
  123. data/lib/graphql/query/fingerprint.rb +26 -0
  124. data/lib/graphql/query/input_validation_result.rb +33 -7
  125. data/lib/graphql/query/null_context.rb +21 -8
  126. data/lib/graphql/query/validation_pipeline.rb +16 -38
  127. data/lib/graphql/query/variable_validation_error.rb +3 -3
  128. data/lib/graphql/query/variables.rb +39 -12
  129. data/lib/graphql/query.rb +74 -38
  130. data/lib/graphql/railtie.rb +6 -102
  131. data/lib/graphql/rake_task/validate.rb +4 -1
  132. data/lib/graphql/rake_task.rb +41 -10
  133. data/lib/graphql/relay/range_add.rb +17 -10
  134. data/lib/graphql/relay.rb +0 -15
  135. data/lib/graphql/rubocop/graphql/base_cop.rb +36 -0
  136. data/lib/graphql/rubocop/graphql/default_null_true.rb +43 -0
  137. data/lib/graphql/rubocop/graphql/default_required_true.rb +43 -0
  138. data/lib/graphql/rubocop.rb +4 -0
  139. data/lib/graphql/schema/addition.rb +245 -0
  140. data/lib/graphql/schema/argument.rb +286 -31
  141. data/lib/graphql/schema/base_64_encoder.rb +2 -0
  142. data/lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb +1 -1
  143. data/lib/graphql/schema/build_from_definition/resolve_map.rb +13 -5
  144. data/lib/graphql/schema/build_from_definition.rb +334 -220
  145. data/lib/graphql/schema/built_in_types.rb +5 -5
  146. data/lib/graphql/schema/directive/deprecated.rb +18 -0
  147. data/lib/graphql/schema/directive/feature.rb +1 -1
  148. data/lib/graphql/schema/directive/flagged.rb +57 -0
  149. data/lib/graphql/schema/directive/include.rb +2 -2
  150. data/lib/graphql/schema/directive/one_of.rb +12 -0
  151. data/lib/graphql/schema/directive/skip.rb +2 -2
  152. data/lib/graphql/schema/directive/transform.rb +14 -2
  153. data/lib/graphql/schema/directive.rb +117 -14
  154. data/lib/graphql/schema/enum.rb +113 -22
  155. data/lib/graphql/schema/enum_value.rb +16 -21
  156. data/lib/graphql/schema/field/connection_extension.rb +50 -20
  157. data/lib/graphql/schema/field/scope_extension.rb +1 -1
  158. data/lib/graphql/schema/field.rb +491 -329
  159. data/lib/graphql/schema/field_extension.rb +89 -2
  160. data/lib/graphql/schema/find_inherited_value.rb +17 -1
  161. data/lib/graphql/schema/finder.rb +16 -14
  162. data/lib/graphql/schema/input_object.rb +182 -60
  163. data/lib/graphql/schema/interface.rb +28 -43
  164. data/lib/graphql/schema/introspection_system.rb +101 -38
  165. data/lib/graphql/schema/late_bound_type.rb +7 -2
  166. data/lib/graphql/schema/list.rb +61 -3
  167. data/lib/graphql/schema/loader.rb +144 -102
  168. data/lib/graphql/schema/member/base_dsl_methods.rb +33 -32
  169. data/lib/graphql/schema/member/build_type.rb +24 -15
  170. data/lib/graphql/schema/member/has_arguments.rb +261 -24
  171. data/lib/graphql/schema/member/has_ast_node.rb +20 -0
  172. data/lib/graphql/schema/member/has_deprecation_reason.rb +25 -0
  173. data/lib/graphql/schema/member/has_directives.rb +113 -0
  174. data/lib/graphql/schema/member/has_fields.rb +99 -34
  175. data/lib/graphql/schema/member/has_interfaces.rb +88 -0
  176. data/lib/graphql/schema/member/has_unresolved_type_error.rb +15 -0
  177. data/lib/graphql/schema/member/has_validators.rb +31 -0
  178. data/lib/graphql/schema/member/relay_shortcuts.rb +28 -2
  179. data/lib/graphql/schema/member/type_system_helpers.rb +3 -3
  180. data/lib/graphql/schema/member/validates_input.rb +33 -0
  181. data/lib/graphql/schema/member.rb +11 -6
  182. data/lib/graphql/schema/mutation.rb +4 -9
  183. data/lib/graphql/schema/non_null.rb +34 -4
  184. data/lib/graphql/schema/object.rb +38 -60
  185. data/lib/graphql/schema/printer.rb +16 -35
  186. data/lib/graphql/schema/relay_classic_mutation.rb +90 -43
  187. data/lib/graphql/schema/resolver/has_payload_type.rb +46 -6
  188. data/lib/graphql/schema/resolver.rb +146 -93
  189. data/lib/graphql/schema/scalar.rb +40 -15
  190. data/lib/graphql/schema/subscription.rb +55 -26
  191. data/lib/graphql/schema/timeout.rb +29 -15
  192. data/lib/graphql/schema/type_expression.rb +21 -13
  193. data/lib/graphql/schema/type_membership.rb +22 -5
  194. data/lib/graphql/schema/union.rb +48 -14
  195. data/lib/graphql/schema/unique_within_type.rb +1 -2
  196. data/lib/graphql/schema/validator/allow_blank_validator.rb +29 -0
  197. data/lib/graphql/schema/validator/allow_null_validator.rb +26 -0
  198. data/lib/graphql/schema/validator/exclusion_validator.rb +33 -0
  199. data/lib/graphql/schema/validator/format_validator.rb +48 -0
  200. data/lib/graphql/schema/validator/inclusion_validator.rb +35 -0
  201. data/lib/graphql/schema/validator/length_validator.rb +59 -0
  202. data/lib/graphql/schema/validator/numericality_validator.rb +82 -0
  203. data/lib/graphql/schema/validator/required_validator.rb +82 -0
  204. data/lib/graphql/schema/validator.rb +171 -0
  205. data/lib/graphql/schema/warden.rb +187 -33
  206. data/lib/graphql/schema/wrapper.rb +0 -5
  207. data/lib/graphql/schema.rb +773 -892
  208. data/lib/graphql/static_validation/all_rules.rb +3 -0
  209. data/lib/graphql/static_validation/base_visitor.rb +21 -31
  210. data/lib/graphql/static_validation/definition_dependencies.rb +7 -2
  211. data/lib/graphql/static_validation/error.rb +3 -1
  212. data/lib/graphql/static_validation/literal_validator.rb +55 -26
  213. data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +45 -83
  214. data/lib/graphql/static_validation/rules/argument_literals_are_compatible_error.rb +22 -6
  215. data/lib/graphql/static_validation/rules/arguments_are_defined.rb +35 -26
  216. data/lib/graphql/static_validation/rules/arguments_are_defined_error.rb +4 -2
  217. data/lib/graphql/static_validation/rules/directives_are_defined.rb +12 -6
  218. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +14 -14
  219. data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +4 -4
  220. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +5 -5
  221. data/lib/graphql/static_validation/rules/fields_will_merge.rb +94 -51
  222. data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +25 -4
  223. data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +3 -3
  224. data/lib/graphql/static_validation/rules/fragments_are_finite.rb +2 -2
  225. data/lib/graphql/static_validation/rules/input_object_names_are_unique.rb +30 -0
  226. data/lib/graphql/static_validation/rules/input_object_names_are_unique_error.rb +30 -0
  227. data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid.rb +66 -0
  228. data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid_error.rb +29 -0
  229. data/lib/graphql/static_validation/rules/query_root_exists.rb +17 -0
  230. data/lib/graphql/static_validation/rules/query_root_exists_error.rb +26 -0
  231. data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +4 -2
  232. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +9 -10
  233. data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +13 -7
  234. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +12 -13
  235. data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +19 -14
  236. data/lib/graphql/static_validation/rules/variables_are_input_types.rb +1 -1
  237. data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +5 -3
  238. data/lib/graphql/static_validation/type_stack.rb +2 -2
  239. data/lib/graphql/static_validation/validation_context.rb +13 -3
  240. data/lib/graphql/static_validation/validation_timeout_error.rb +25 -0
  241. data/lib/graphql/static_validation/validator.rb +31 -19
  242. data/lib/graphql/static_validation.rb +1 -2
  243. data/lib/graphql/string_encoding_error.rb +13 -3
  244. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +129 -22
  245. data/lib/graphql/subscriptions/broadcast_analyzer.rb +81 -0
  246. data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +58 -0
  247. data/lib/graphql/subscriptions/event.rb +85 -31
  248. data/lib/graphql/subscriptions/instrumentation.rb +0 -47
  249. data/lib/graphql/subscriptions/serialize.rb +53 -6
  250. data/lib/graphql/subscriptions.rb +137 -57
  251. data/lib/graphql/tracing/active_support_notifications_tracing.rb +8 -17
  252. data/lib/graphql/tracing/appoptics_tracing.rb +173 -0
  253. data/lib/graphql/tracing/appsignal_tracing.rb +23 -0
  254. data/lib/graphql/tracing/data_dog_tracing.rb +34 -2
  255. data/lib/graphql/tracing/new_relic_tracing.rb +9 -12
  256. data/lib/graphql/tracing/notifications_tracing.rb +59 -0
  257. data/lib/graphql/tracing/platform_tracing.rb +67 -38
  258. data/lib/graphql/tracing/prometheus_tracing/graphql_collector.rb +4 -1
  259. data/lib/graphql/tracing/prometheus_tracing.rb +8 -0
  260. data/lib/graphql/tracing/scout_tracing.rb +19 -0
  261. data/lib/graphql/tracing/statsd_tracing.rb +42 -0
  262. data/lib/graphql/tracing.rb +15 -36
  263. data/lib/graphql/types/big_int.rb +5 -1
  264. data/lib/graphql/types/int.rb +10 -3
  265. data/lib/graphql/types/iso_8601_date.rb +20 -9
  266. data/lib/graphql/types/iso_8601_date_time.rb +36 -10
  267. data/lib/graphql/types/relay/base_connection.rb +18 -90
  268. data/lib/graphql/types/relay/base_edge.rb +2 -34
  269. data/lib/graphql/types/relay/connection_behaviors.rb +158 -0
  270. data/lib/graphql/types/relay/default_relay.rb +27 -0
  271. data/lib/graphql/types/relay/edge_behaviors.rb +65 -0
  272. data/lib/graphql/types/relay/has_node_field.rb +41 -0
  273. data/lib/graphql/types/relay/has_nodes_field.rb +41 -0
  274. data/lib/graphql/types/relay/node.rb +2 -4
  275. data/lib/graphql/types/relay/node_behaviors.rb +19 -0
  276. data/lib/graphql/types/relay/page_info.rb +2 -14
  277. data/lib/graphql/types/relay/page_info_behaviors.rb +25 -0
  278. data/lib/graphql/types/relay.rb +11 -5
  279. data/lib/graphql/types/string.rb +8 -2
  280. data/lib/graphql/unauthorized_error.rb +2 -2
  281. data/lib/graphql/unresolved_type_error.rb +2 -2
  282. data/lib/graphql/version.rb +1 -1
  283. data/lib/graphql.rb +41 -58
  284. data/readme.md +3 -6
  285. metadata +103 -237
  286. data/lib/graphql/analysis/analyze_query.rb +0 -91
  287. data/lib/graphql/analysis/field_usage.rb +0 -45
  288. data/lib/graphql/analysis/max_query_complexity.rb +0 -26
  289. data/lib/graphql/analysis/max_query_depth.rb +0 -26
  290. data/lib/graphql/analysis/query_complexity.rb +0 -88
  291. data/lib/graphql/analysis/query_depth.rb +0 -43
  292. data/lib/graphql/analysis/reducer_state.rb +0 -48
  293. data/lib/graphql/argument.rb +0 -159
  294. data/lib/graphql/authorization.rb +0 -82
  295. data/lib/graphql/backwards_compatibility.rb +0 -60
  296. data/lib/graphql/base_type.rb +0 -226
  297. data/lib/graphql/boolean_type.rb +0 -2
  298. data/lib/graphql/compatibility/execution_specification/counter_schema.rb +0 -53
  299. data/lib/graphql/compatibility/execution_specification/specification_schema.rb +0 -200
  300. data/lib/graphql/compatibility/execution_specification.rb +0 -435
  301. data/lib/graphql/compatibility/lazy_execution_specification/lazy_schema.rb +0 -111
  302. data/lib/graphql/compatibility/lazy_execution_specification.rb +0 -213
  303. data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +0 -91
  304. data/lib/graphql/compatibility/query_parser_specification/query_assertions.rb +0 -79
  305. data/lib/graphql/compatibility/query_parser_specification.rb +0 -264
  306. data/lib/graphql/compatibility/schema_parser_specification.rb +0 -680
  307. data/lib/graphql/compatibility.rb +0 -5
  308. data/lib/graphql/define/assign_argument.rb +0 -12
  309. data/lib/graphql/define/assign_connection.rb +0 -13
  310. data/lib/graphql/define/assign_enum_value.rb +0 -18
  311. data/lib/graphql/define/assign_global_id_field.rb +0 -11
  312. data/lib/graphql/define/assign_mutation_function.rb +0 -34
  313. data/lib/graphql/define/assign_object_field.rb +0 -42
  314. data/lib/graphql/define/defined_object_proxy.rb +0 -53
  315. data/lib/graphql/define/instance_definable.rb +0 -311
  316. data/lib/graphql/define/no_definition_error.rb +0 -7
  317. data/lib/graphql/define/non_null_with_bang.rb +0 -16
  318. data/lib/graphql/define/type_definer.rb +0 -31
  319. data/lib/graphql/define.rb +0 -31
  320. data/lib/graphql/deprecated_dsl.rb +0 -42
  321. data/lib/graphql/directive/deprecated_directive.rb +0 -13
  322. data/lib/graphql/directive/include_directive.rb +0 -2
  323. data/lib/graphql/directive/skip_directive.rb +0 -2
  324. data/lib/graphql/directive.rb +0 -104
  325. data/lib/graphql/enum_type.rb +0 -193
  326. data/lib/graphql/execution/execute.rb +0 -326
  327. data/lib/graphql/execution/flatten.rb +0 -40
  328. data/lib/graphql/execution/instrumentation.rb +0 -92
  329. data/lib/graphql/execution/interpreter/hash_response.rb +0 -46
  330. data/lib/graphql/execution/lazy/resolve.rb +0 -91
  331. data/lib/graphql/execution/typecast.rb +0 -50
  332. data/lib/graphql/field/resolve.rb +0 -59
  333. data/lib/graphql/field.rb +0 -330
  334. data/lib/graphql/float_type.rb +0 -2
  335. data/lib/graphql/function.rb +0 -153
  336. data/lib/graphql/id_type.rb +0 -2
  337. data/lib/graphql/input_object_type.rb +0 -154
  338. data/lib/graphql/int_type.rb +0 -2
  339. data/lib/graphql/interface_type.rb +0 -86
  340. data/lib/graphql/internal_representation/document.rb +0 -27
  341. data/lib/graphql/internal_representation/node.rb +0 -206
  342. data/lib/graphql/internal_representation/print.rb +0 -51
  343. data/lib/graphql/internal_representation/rewrite.rb +0 -184
  344. data/lib/graphql/internal_representation/scope.rb +0 -88
  345. data/lib/graphql/internal_representation/visit.rb +0 -36
  346. data/lib/graphql/internal_representation.rb +0 -7
  347. data/lib/graphql/list_type.rb +0 -80
  348. data/lib/graphql/literal_validation_error.rb +0 -6
  349. data/lib/graphql/non_null_type.rb +0 -81
  350. data/lib/graphql/object_type.rb +0 -141
  351. data/lib/graphql/query/arguments.rb +0 -187
  352. data/lib/graphql/query/arguments_cache.rb +0 -25
  353. data/lib/graphql/query/executor.rb +0 -53
  354. data/lib/graphql/query/literal_input.rb +0 -116
  355. data/lib/graphql/query/serial_execution/field_resolution.rb +0 -92
  356. data/lib/graphql/query/serial_execution/operation_resolution.rb +0 -19
  357. data/lib/graphql/query/serial_execution/selection_resolution.rb +0 -23
  358. data/lib/graphql/query/serial_execution/value_resolution.rb +0 -87
  359. data/lib/graphql/query/serial_execution.rb +0 -39
  360. data/lib/graphql/relay/array_connection.rb +0 -85
  361. data/lib/graphql/relay/base_connection.rb +0 -172
  362. data/lib/graphql/relay/connection_instrumentation.rb +0 -54
  363. data/lib/graphql/relay/connection_resolve.rb +0 -43
  364. data/lib/graphql/relay/connection_type.rb +0 -40
  365. data/lib/graphql/relay/edge.rb +0 -27
  366. data/lib/graphql/relay/edge_type.rb +0 -18
  367. data/lib/graphql/relay/edges_instrumentation.rb +0 -40
  368. data/lib/graphql/relay/global_id_resolve.rb +0 -18
  369. data/lib/graphql/relay/mongo_relation_connection.rb +0 -50
  370. data/lib/graphql/relay/mutation/instrumentation.rb +0 -23
  371. data/lib/graphql/relay/mutation/resolve.rb +0 -56
  372. data/lib/graphql/relay/mutation/result.rb +0 -38
  373. data/lib/graphql/relay/mutation.rb +0 -190
  374. data/lib/graphql/relay/node.rb +0 -36
  375. data/lib/graphql/relay/page_info.rb +0 -7
  376. data/lib/graphql/relay/relation_connection.rb +0 -190
  377. data/lib/graphql/relay/type_extensions.rb +0 -30
  378. data/lib/graphql/scalar_type.rb +0 -133
  379. data/lib/graphql/schema/catchall_middleware.rb +0 -35
  380. data/lib/graphql/schema/default_parse_error.rb +0 -10
  381. data/lib/graphql/schema/default_type_error.rb +0 -15
  382. data/lib/graphql/schema/member/accepts_definition.rb +0 -152
  383. data/lib/graphql/schema/member/cached_graphql_definition.rb +0 -26
  384. data/lib/graphql/schema/member/instrumentation.rb +0 -132
  385. data/lib/graphql/schema/middleware_chain.rb +0 -82
  386. data/lib/graphql/schema/possible_types.rb +0 -39
  387. data/lib/graphql/schema/rescue_middleware.rb +0 -60
  388. data/lib/graphql/schema/timeout_middleware.rb +0 -86
  389. data/lib/graphql/schema/traversal.rb +0 -228
  390. data/lib/graphql/schema/validation.rb +0 -303
  391. data/lib/graphql/static_validation/default_visitor.rb +0 -15
  392. data/lib/graphql/static_validation/no_validate_visitor.rb +0 -10
  393. data/lib/graphql/string_type.rb +0 -2
  394. data/lib/graphql/subscriptions/subscription_root.rb +0 -74
  395. data/lib/graphql/tracing/skylight_tracing.rb +0 -62
  396. data/lib/graphql/types/relay/base_field.rb +0 -22
  397. data/lib/graphql/types/relay/base_interface.rb +0 -29
  398. data/lib/graphql/types/relay/base_object.rb +0 -26
  399. data/lib/graphql/types/relay/node_field.rb +0 -43
  400. data/lib/graphql/types/relay/nodes_field.rb +0 -45
  401. data/lib/graphql/union_type.rb +0 -135
  402. data/lib/graphql/upgrader/member.rb +0 -936
  403. data/lib/graphql/upgrader/schema.rb +0 -37
@@ -5,23 +5,17 @@ module GraphQL
5
5
  class Schema
6
6
  module BuildFromDefinition
7
7
  class << self
8
- def from_definition(definition_string, default_resolve:, parser: DefaultParser)
9
- document = parser.parse(definition_string)
10
- Builder.build(document, default_resolve: default_resolve)
8
+ # @see {Schema.from_definition}
9
+ def from_definition(schema_superclass, definition_string, parser: GraphQL.default_parser, **kwargs)
10
+ from_document(schema_superclass, parser.parse(definition_string), **kwargs)
11
11
  end
12
- end
13
12
 
14
- # @api private
15
- DefaultParser = GraphQL::Language::Parser
13
+ def from_definition_path(schema_superclass, definition_path, parser: GraphQL.default_parser, **kwargs)
14
+ from_document(schema_superclass, parser.parse_file(definition_path), **kwargs)
15
+ end
16
16
 
17
- # @api private
18
- module DefaultResolve
19
- def self.call(type, field, obj, args, ctx)
20
- if field.arguments.any?
21
- obj.public_send(field.name, args, ctx)
22
- else
23
- obj.public_send(field.name)
24
- end
17
+ def from_document(schema_superclass, document, default_resolve:, using: {}, relay: false)
18
+ Builder.build(schema_superclass, document, default_resolve: default_resolve || {}, relay: relay, using: using)
25
19
  end
26
20
  end
27
21
 
@@ -29,42 +23,66 @@ module GraphQL
29
23
  module Builder
30
24
  extend self
31
25
 
32
- def build(document, default_resolve: DefaultResolve)
26
+ def build(schema_superclass, document, default_resolve:, using: {}, relay:)
33
27
  raise InvalidDocumentError.new('Must provide a document ast.') if !document || !document.is_a?(GraphQL::Language::Nodes::Document)
34
28
 
35
29
  if default_resolve.is_a?(Hash)
36
30
  default_resolve = ResolveMap.new(default_resolve)
37
31
  end
38
32
 
39
- schema_definition = nil
33
+ schema_defns = document.definitions.select { |d| d.is_a?(GraphQL::Language::Nodes::SchemaDefinition) }
34
+ if schema_defns.size > 1
35
+ raise InvalidDocumentError.new('Must provide only one schema definition.')
36
+ end
37
+ schema_definition = schema_defns.first
40
38
  types = {}
41
- types.merge!(GraphQL::Schema::BUILT_IN_TYPES)
42
- directives = {}
43
- type_resolver = ->(type) { -> { resolve_type(types, type) } }
39
+ directives = schema_superclass.directives.dup
40
+ type_resolver = build_resolve_type(types, directives, ->(type_name) { types[type_name] ||= Schema::LateBoundType.new(type_name)})
41
+ # Make a different type resolver because we need to coerce directive arguments
42
+ # _while_ building the schema.
43
+ # It will dig for a type if it encounters a custom type. This could be a problem if there are cycles.
44
+ directive_type_resolver = nil
45
+ directive_type_resolver = build_resolve_type(types, directives, ->(type_name) {
46
+ types[type_name] ||= begin
47
+ defn = document.definitions.find { |d| d.respond_to?(:name) && d.name == type_name }
48
+ if defn
49
+ build_definition_from_node(defn, directive_type_resolver, default_resolve)
50
+ elsif (built_in_defn = GraphQL::Schema::BUILT_IN_TYPES[type_name])
51
+ built_in_defn
52
+ else
53
+ raise "No definition for #{type_name.inspect} found in schema document or built-in types. Add a definition for it or remove it."
54
+ end
55
+ end
56
+ })
44
57
 
58
+ directives.merge!(GraphQL::Schema.default_directives)
59
+ document.definitions.each do |definition|
60
+ if definition.is_a?(GraphQL::Language::Nodes::DirectiveDefinition)
61
+ directives[definition.name] = build_directive(definition, directive_type_resolver)
62
+ end
63
+ end
64
+
65
+ # In case any directives referenced built-in types for their arguments:
66
+ replace_late_bound_types_with_built_in(types)
67
+
68
+ schema_extensions = nil
45
69
  document.definitions.each do |definition|
46
70
  case definition
47
- when GraphQL::Language::Nodes::SchemaDefinition
48
- raise InvalidDocumentError.new('Must provide only one schema definition.') if schema_definition
49
- schema_definition = definition
50
- when GraphQL::Language::Nodes::EnumTypeDefinition
51
- types[definition.name] = build_enum_type(definition, type_resolver)
52
- when GraphQL::Language::Nodes::ObjectTypeDefinition
53
- types[definition.name] = build_object_type(definition, type_resolver, default_resolve: default_resolve)
54
- when GraphQL::Language::Nodes::InterfaceTypeDefinition
55
- types[definition.name] = build_interface_type(definition, type_resolver)
56
- when GraphQL::Language::Nodes::UnionTypeDefinition
57
- types[definition.name] = build_union_type(definition, type_resolver)
58
- when GraphQL::Language::Nodes::ScalarTypeDefinition
59
- types[definition.name] = build_scalar_type(definition, type_resolver, default_resolve: default_resolve)
60
- when GraphQL::Language::Nodes::InputObjectTypeDefinition
61
- types[definition.name] = build_input_object_type(definition, type_resolver)
62
- when GraphQL::Language::Nodes::DirectiveDefinition
63
- directives[definition.name] = build_directive(definition, type_resolver)
71
+ when GraphQL::Language::Nodes::SchemaDefinition, GraphQL::Language::Nodes::DirectiveDefinition
72
+ nil # already handled
73
+ when GraphQL::Language::Nodes::SchemaExtension
74
+ schema_extensions ||= []
75
+ schema_extensions << definition
76
+ else
77
+ # It's possible that this was already loaded by the directives
78
+ prev_type = types[definition.name]
79
+ if prev_type.nil? || prev_type.is_a?(Schema::LateBoundType)
80
+ types[definition.name] = build_definition_from_node(definition, type_resolver, default_resolve)
81
+ end
64
82
  end
65
83
  end
66
84
 
67
- directives = GraphQL::Schema.default_directives.merge(directives)
85
+ replace_late_bound_types_with_built_in(types)
68
86
 
69
87
  if schema_definition
70
88
  if schema_definition.query
@@ -89,54 +107,170 @@ module GraphQL
89
107
 
90
108
  raise InvalidDocumentError.new('Must provide schema definition with query type or a type named Query.') unless query_root_type
91
109
 
92
- schema = Schema.define do
93
- raise_definition_error true
110
+ schema_class = Class.new(schema_superclass) do
111
+ begin
112
+ # Add these first so that there's some chance of resolving late-bound types
113
+ orphan_types types.values
114
+ query query_root_type
115
+ mutation mutation_root_type
116
+ subscription subscription_root_type
117
+ rescue Schema::UnresolvedLateBoundTypeError => err
118
+ type_name = err.type.name
119
+ err_backtrace = err.backtrace
120
+ raise InvalidDocumentError, "Type \"#{type_name}\" not found in document.", err_backtrace
121
+ end
94
122
 
95
- query query_root_type
96
- mutation mutation_root_type
97
- subscription subscription_root_type
98
- orphan_types types.values
99
123
  if default_resolve.respond_to?(:resolve_type)
100
- resolve_type(default_resolve.method(:resolve_type))
124
+ def self.resolve_type(*args)
125
+ self.definition_default_resolve.resolve_type(*args)
126
+ end
101
127
  else
102
- resolve_type(NullResolveType)
128
+ def self.resolve_type(*args)
129
+ NullResolveType.call(*args)
130
+ end
103
131
  end
104
132
 
105
133
  directives directives.values
134
+
135
+ if schema_definition
136
+ ast_node(schema_definition)
137
+ end
138
+
139
+ using.each do |plugin, options|
140
+ if options
141
+ use(plugin, **options)
142
+ else
143
+ use(plugin)
144
+ end
145
+ end
146
+
147
+ # Empty `orphan_types` -- this will make unreachable types ... unreachable.
148
+ own_orphan_types.clear
149
+
150
+ class << self
151
+ attr_accessor :definition_default_resolve
152
+ end
153
+
154
+ self.definition_default_resolve = default_resolve
155
+
156
+ def definition_default_resolve
157
+ self.class.definition_default_resolve
158
+ end
159
+
160
+ def self.inherited(child_class)
161
+ child_class.definition_default_resolve = self.definition_default_resolve
162
+ end
106
163
  end
107
164
 
108
- schema.ast_node = schema_definition if schema_definition
165
+ if schema_extensions
166
+ schema_extensions.each do |ext|
167
+ build_directives(schema_class, ext, type_resolver)
168
+ end
169
+ end
109
170
 
110
- schema
171
+ schema_class
111
172
  end
112
173
 
113
174
  NullResolveType = ->(type, obj, ctx) {
114
175
  raise(GraphQL::RequiredImplementationMissingError, "Generated Schema cannot use Interface or Union types for execution. Implement resolve_type on your resolver.")
115
176
  }
116
177
 
117
- NullScalarCoerce = ->(val, _ctx) { val }
178
+ def build_definition_from_node(definition, type_resolver, default_resolve)
179
+ case definition
180
+ when GraphQL::Language::Nodes::EnumTypeDefinition
181
+ build_enum_type(definition, type_resolver)
182
+ when GraphQL::Language::Nodes::ObjectTypeDefinition
183
+ build_object_type(definition, type_resolver)
184
+ when GraphQL::Language::Nodes::InterfaceTypeDefinition
185
+ build_interface_type(definition, type_resolver)
186
+ when GraphQL::Language::Nodes::UnionTypeDefinition
187
+ build_union_type(definition, type_resolver)
188
+ when GraphQL::Language::Nodes::ScalarTypeDefinition
189
+ build_scalar_type(definition, type_resolver, default_resolve: default_resolve)
190
+ when GraphQL::Language::Nodes::InputObjectTypeDefinition
191
+ build_input_object_type(definition, type_resolver)
192
+ end
193
+ end
118
194
 
119
- 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,
126
- value: enum_value_definition.name,
127
- deprecation_reason: build_deprecation_reason(enum_value_definition.directives),
128
- description: enum_value_definition.description,
129
- )
195
+ # Modify `types`, replacing any late-bound references to built-in types
196
+ # with their actual definitions.
197
+ #
198
+ # (Schema definitions are allowed to reference those built-ins without redefining them.)
199
+ # @return void
200
+ def replace_late_bound_types_with_built_in(types)
201
+ GraphQL::Schema::BUILT_IN_TYPES.each do |scalar_name, built_in_scalar|
202
+ existing_type = types[scalar_name]
203
+ if existing_type.is_a?(GraphQL::Schema::LateBoundType)
204
+ types[scalar_name] = built_in_scalar
205
+ end
206
+ end
207
+ end
130
208
 
131
- value.ast_node = enum_value_definition
209
+ def build_directives(definition, ast_node, type_resolver)
210
+ dirs = prepare_directives(ast_node, type_resolver)
211
+ dirs.each do |(dir_class, options)|
212
+ if definition.respond_to?(:schema_directive)
213
+ # it's a schema
214
+ definition.schema_directive(dir_class, **options)
215
+ else
216
+ definition.directive(dir_class, **options)
217
+ end
218
+ end
219
+ end
132
220
 
133
- value
221
+ def prepare_directives(ast_node, type_resolver)
222
+ dirs = []
223
+ ast_node.directives.each do |dir_node|
224
+ if dir_node.name == "deprecated"
225
+ # This is handled using `deprecation_reason`
226
+ next
227
+ else
228
+ dir_class = type_resolver.call(dir_node.name)
229
+ if dir_class.nil?
230
+ raise ArgumentError, "No definition for @#{dir_node.name} #{ast_node.respond_to?(:name) ? "on #{ast_node.name} " : ""}at #{ast_node.line}:#{ast_node.col}"
231
+ end
232
+ options = args_to_kwargs(dir_class, dir_node)
233
+ dirs << [dir_class, options]
134
234
  end
135
- )
235
+ end
236
+ dirs
237
+ end
136
238
 
137
- enum.ast_node = enum_type_definition
239
+ def args_to_kwargs(arg_owner, node)
240
+ if node.respond_to?(:arguments)
241
+ kwargs = {}
242
+ node.arguments.each do |arg_node|
243
+ arg_defn = arg_owner.get_argument(arg_node.name)
244
+ kwargs[arg_defn.keyword] = args_to_kwargs(arg_defn.type.unwrap, arg_node.value)
245
+ end
246
+ kwargs
247
+ elsif node.is_a?(Array)
248
+ node.map { |n| args_to_kwargs(arg_owner, n) }
249
+ elsif node.is_a?(Language::Nodes::Enum)
250
+ node.name
251
+ else
252
+ # scalar
253
+ node
254
+ end
255
+ end
138
256
 
139
- enum
257
+ def build_enum_type(enum_type_definition, type_resolver)
258
+ builder = self
259
+ Class.new(GraphQL::Schema::Enum) do
260
+ graphql_name(enum_type_definition.name)
261
+ builder.build_directives(self, enum_type_definition, type_resolver)
262
+ description(enum_type_definition.description)
263
+ ast_node(enum_type_definition)
264
+ enum_type_definition.values.each do |enum_value_definition|
265
+ value(enum_value_definition.name,
266
+ value: enum_value_definition.name,
267
+ deprecation_reason: builder.build_deprecation_reason(enum_value_definition.directives),
268
+ description: enum_value_definition.description,
269
+ directives: builder.prepare_directives(enum_value_definition, type_resolver),
270
+ ast_node: enum_value_definition,
271
+ )
272
+ end
273
+ end
140
274
  end
141
275
 
142
276
  def build_deprecation_reason(directives)
@@ -144,69 +278,72 @@ module GraphQL
144
278
  return unless deprecated_directive
145
279
 
146
280
  reason = deprecated_directive.arguments.find{ |a| a.name == 'reason' }
147
- return GraphQL::Directive::DEFAULT_DEPRECATION_REASON unless reason
281
+ return GraphQL::Schema::Directive::DEFAULT_DEPRECATION_REASON unless reason
148
282
 
149
283
  reason.value
150
284
  end
151
285
 
152
286
  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
- )
287
+ builder = self
288
+ Class.new(GraphQL::Schema::Scalar) do
289
+ graphql_name(scalar_type_definition.name)
290
+ description(scalar_type_definition.description)
291
+ ast_node(scalar_type_definition)
292
+ builder.build_directives(self, scalar_type_definition, type_resolver)
293
+
294
+ if default_resolve.respond_to?(:coerce_input)
295
+ # Put these method definitions in another method to avoid retaining `type_resolve`
296
+ # from this method's bindiing
297
+ builder.build_scalar_type_coerce_method(self, :coerce_input, default_resolve)
298
+ builder.build_scalar_type_coerce_method(self, :coerce_result, default_resolve)
299
+ end
166
300
  end
301
+ end
167
302
 
168
- scalar_type
303
+ def build_scalar_type_coerce_method(scalar_class, method_name, default_definition_resolve)
304
+ scalar_class.define_singleton_method(method_name) do |val, ctx|
305
+ default_definition_resolve.public_send(method_name, self, val, ctx)
306
+ end
169
307
  end
170
308
 
171
309
  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
- )
310
+ builder = self
311
+ Class.new(GraphQL::Schema::Union) do
312
+ graphql_name(union_type_definition.name)
313
+ description(union_type_definition.description)
314
+ possible_types(*union_type_definition.types.map { |type_name| type_resolver.call(type_name) })
315
+ ast_node(union_type_definition)
316
+ builder.build_directives(self, union_type_definition, type_resolver)
317
+ end
318
+ end
177
319
 
178
- union.ast_node = union_type_definition
320
+ def build_object_type(object_type_definition, type_resolver)
321
+ builder = self
179
322
 
180
- union
181
- end
323
+ Class.new(GraphQL::Schema::Object) do
324
+ graphql_name(object_type_definition.name)
325
+ description(object_type_definition.description)
326
+ ast_node(object_type_definition)
327
+ builder.build_directives(self, object_type_definition, type_resolver)
182
328
 
183
- def build_object_type(object_type_definition, type_resolver, default_resolve:)
184
- 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
329
+ object_type_definition.interfaces.each do |interface_name|
330
+ interface_defn = type_resolver.call(interface_name)
331
+ implements(interface_defn)
332
+ end
333
+
334
+ builder.build_fields(self, object_type_definition.fields, type_resolver, default_resolve: true)
194
335
  end
195
- type_def = GraphQL::ObjectType.define(**defns)
196
- type_def.ast_node = object_type_definition
197
- type_def
198
336
  end
199
337
 
200
338
  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
339
+ builder = self
340
+ Class.new(GraphQL::Schema::InputObject) do
341
+ graphql_name(input_object_type_definition.name)
342
+ description(input_object_type_definition.description)
343
+ ast_node(input_object_type_definition)
344
+ builder.build_directives(self, input_object_type_definition, type_resolver)
345
+ builder.build_arguments(self, input_object_type_definition.fields, type_resolver)
346
+ end
210
347
  end
211
348
 
212
349
  def build_default_value(default_value)
@@ -224,142 +361,119 @@ module GraphQL
224
361
  end
225
362
  end
226
363
 
227
- def build_input_arguments(input_object_type_definition, type_resolver)
228
- input_object_type_definition.fields.map do |input_argument|
229
- kwargs = {}
364
+ NO_DEFAULT_VALUE = {}.freeze
365
+
366
+ def build_arguments(type_class, arguments, type_resolver)
367
+ builder = self
230
368
 
231
- if !input_argument.default_value.nil?
232
- kwargs[:default_value] = build_default_value(input_argument.default_value)
369
+ arguments.each do |argument_defn|
370
+ default_value_kwargs = if !argument_defn.default_value.nil?
371
+ { default_value: builder.build_default_value(argument_defn.default_value) }
372
+ else
373
+ NO_DEFAULT_VALUE
233
374
  end
234
375
 
235
- argument = GraphQL::Argument.define(
236
- name: input_argument.name,
237
- type: type_resolver.call(input_argument.type),
238
- description: input_argument.description,
239
- method_access: false,
240
- **kwargs,
376
+ type_class.argument(
377
+ argument_defn.name,
378
+ type: type_resolver.call(argument_defn.type),
379
+ required: false,
380
+ description: argument_defn.description,
381
+ deprecation_reason: builder.build_deprecation_reason(argument_defn.directives),
382
+ ast_node: argument_defn,
383
+ camelize: false,
384
+ directives: prepare_directives(argument_defn, type_resolver),
385
+ **default_value_kwargs
241
386
  )
242
-
243
- argument.ast_node = input_argument
244
-
245
- [
246
- input_argument.name,
247
- argument
248
- ]
249
387
  end
250
388
  end
251
389
 
252
390
  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
391
+ builder = self
392
+ Class.new(GraphQL::Schema::Directive) do
393
+ graphql_name(directive_definition.name)
394
+ description(directive_definition.description)
395
+ repeatable(directive_definition.repeatable)
396
+ locations(*directive_definition.locations.map { |location| location.name.to_sym })
397
+ ast_node(directive_definition)
398
+ builder.build_arguments(self, directive_definition.arguments, type_resolver)
263
399
  end
264
-
265
- directive = GraphQL::Directive.define(**defn)
266
- directive.ast_node = directive_definition
267
-
268
- directive
269
400
  end
270
401
 
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)
402
+ def build_interface_type(interface_type_definition, type_resolver)
403
+ builder = self
404
+ Module.new do
405
+ include GraphQL::Schema::Interface
406
+ graphql_name(interface_type_definition.name)
407
+ description(interface_type_definition.description)
408
+ interface_type_definition.interfaces.each do |interface_name|
409
+ interface_defn = type_resolver.call(interface_name)
410
+ implements(interface_defn)
277
411
  end
412
+ ast_node(interface_type_definition)
413
+ builder.build_directives(self, interface_type_definition, type_resolver)
278
414
 
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
- ]
415
+ builder.build_fields(self, interface_type_definition.fields, type_resolver, default_resolve: nil)
293
416
  end
294
417
  end
295
418
 
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
307
-
308
- def build_fields(field_definitions, type_resolver, default_resolve:)
309
- 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
419
+ def build_fields(owner, field_definitions, type_resolver, default_resolve:)
420
+ builder = self
331
421
 
332
- defns = {
333
- name: field_definition.name,
422
+ field_definitions.each do |field_definition|
423
+ type_name = resolve_type_name(field_definition.type)
424
+ resolve_method_name = -"resolve_field_#{field_definition.name}"
425
+ schema_field_defn = owner.field(
426
+ field_definition.name,
334
427
  description: field_definition.description,
335
428
  type: type_resolver.call(field_definition.type),
336
- resolve: ->(obj, args, ctx) { default_resolve.call(field, obj, args, ctx) },
429
+ null: true,
430
+ connection: type_name.end_with?("Connection"),
431
+ connection_extension: nil,
337
432
  deprecation_reason: build_deprecation_reason(field_definition.directives),
338
- }
433
+ ast_node: field_definition,
434
+ method_conflict_warning: false,
435
+ camelize: false,
436
+ directives: prepare_directives(field_definition, type_resolver),
437
+ resolver_method: resolve_method_name,
438
+ )
339
439
 
340
- if field_arguments.any?
341
- defns[:arguments] = field_arguments
440
+ builder.build_arguments(schema_field_defn, field_definition.arguments, type_resolver)
441
+
442
+ # Don't do this for interfaces
443
+ if default_resolve
444
+ owner.class_eval <<-RUBY, __FILE__, __LINE__
445
+ # frozen_string_literal: true
446
+ def #{resolve_method_name}(**args)
447
+ field_instance = self.class.get_field("#{field_definition.name}")
448
+ context.schema.definition_default_resolve.call(self.class, field_instance, object, args, context)
449
+ end
450
+ RUBY
342
451
  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
452
  end
352
453
  end
353
454
 
354
- def resolve_type(types, ast_node)
355
- type = GraphQL::Schema::TypeExpression.build_type(types, ast_node)
356
- if type.nil?
357
- while ast_node.respond_to?(:of_type)
358
- ast_node = ast_node.of_type
455
+ def build_resolve_type(lookup_hash, directives, missing_type_handler)
456
+ resolve_type_proc = nil
457
+ resolve_type_proc = ->(ast_node) {
458
+ case ast_node
459
+ when GraphQL::Language::Nodes::TypeName
460
+ type_name = ast_node.name
461
+ if lookup_hash.key?(type_name)
462
+ lookup_hash[type_name]
463
+ else
464
+ missing_type_handler.call(type_name)
465
+ end
466
+ when GraphQL::Language::Nodes::NonNullType
467
+ resolve_type_proc.call(ast_node.of_type).to_non_null_type
468
+ when GraphQL::Language::Nodes::ListType
469
+ resolve_type_proc.call(ast_node.of_type).to_list_type
470
+ when String
471
+ directives[ast_node]
472
+ else
473
+ raise "Unexpected ast_node: #{ast_node.inspect}"
359
474
  end
360
- raise InvalidDocumentError.new("Type \"#{ast_node.name}\" not found in document.")
361
- end
362
- type
475
+ }
476
+ resolve_type_proc
363
477
  end
364
478
 
365
479
  def resolve_type_name(type)