graphql 1.9.17 → 2.0.20

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

Potentially problematic release.


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

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