graphql 1.9.17 → 2.0.21

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