graphql 1.9.21 → 2.0.0

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