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
@@ -1,133 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- # # GraphQL::ScalarType
4
- #
5
- # Scalars are plain values. They are leaf nodes in a GraphQL query tree.
6
- #
7
- # ## Built-in Scalars
8
- #
9
- # `GraphQL` comes with standard built-in scalars:
10
- #
11
- # |Constant | `.define` helper|
12
- # |-------|--------|
13
- # |`GraphQL::STRING_TYPE` | `types.String`|
14
- # |`GraphQL::INT_TYPE` | `types.Int`|
15
- # |`GraphQL::FLOAT_TYPE` | `types.Float`|
16
- # |`GraphQL::ID_TYPE` | `types.ID`|
17
- # |`GraphQL::BOOLEAN_TYPE` | `types.Boolean`|
18
- #
19
- # (`types` is an instance of `GraphQL::Definition::TypeDefiner`; `.String`, `.Float`, etc are methods which return built-in scalars.)
20
- #
21
- # ## Custom Scalars
22
- #
23
- # You can define custom scalars for your GraphQL server. It requires some special functions:
24
- #
25
- # - `coerce_input` is used to prepare incoming values for GraphQL execution. (Incoming values come from variables or literal values in the query string.)
26
- # - `coerce_result` is used to turn Ruby values _back_ into serializable values for query responses.
27
- #
28
- # @example defining a type for Time
29
- # TimeType = GraphQL::ScalarType.define do
30
- # name "Time"
31
- # description "Time since epoch in seconds"
32
- #
33
- # coerce_input ->(value, ctx) { Time.at(Float(value)) }
34
- # coerce_result ->(value, ctx) { value.to_f }
35
- # end
36
- #
37
- #
38
- # You can customize the error message for invalid input values by raising a `GraphQL::CoercionError` within `coerce_input`:
39
- #
40
- # @example raising a custom error message
41
- # TimeType = GraphQL::ScalarType.define do
42
- # name "Time"
43
- # description "Time since epoch in seconds"
44
- #
45
- # coerce_input ->(value, ctx) do
46
- # begin
47
- # Time.at(Float(value))
48
- # rescue ArgumentError
49
- # raise GraphQL::CoercionError, "cannot coerce `#{value.inspect}` to Float"
50
- # end
51
- # end
52
- #
53
- # coerce_result ->(value, ctx) { value.to_f }
54
- # end
55
- #
56
- # This will result in the message of the `GraphQL::CoercionError` being used in the error response:
57
- #
58
- # @example custom error response
59
- # {"message"=>"cannot coerce `"2"` to Float", "locations"=>[{"line"=>3, "column"=>9}], "fields"=>["arg"]}
60
- #
61
- class ScalarType < GraphQL::BaseType
62
- accepts_definitions :coerce, :coerce_input, :coerce_result
63
- ensure_defined :coerce_non_null_input, :coerce_result
64
-
65
- module NoOpCoerce
66
- def self.call(val, ctx)
67
- val
68
- end
69
- end
70
-
71
- def initialize
72
- super
73
- self.coerce = NoOpCoerce
74
- end
75
-
76
- def coerce=(proc)
77
- self.coerce_input = proc
78
- self.coerce_result = proc
79
- end
80
-
81
- def coerce_input=(coerce_input_fn)
82
- if !coerce_input_fn.nil?
83
- @coerce_input_proc = ensure_two_arg(coerce_input_fn, :coerce_input)
84
- end
85
- end
86
-
87
- def coerce_result(value, ctx = nil)
88
- if ctx.nil?
89
- warn_deprecated_coerce("coerce_isolated_result")
90
- ctx = GraphQL::Query::NullContext
91
- end
92
- @coerce_result_proc.call(value, ctx)
93
- end
94
-
95
- def coerce_result=(coerce_result_fn)
96
- if !coerce_result_fn.nil?
97
- @coerce_result_proc = ensure_two_arg(coerce_result_fn, :coerce_result)
98
- end
99
- end
100
-
101
- def kind
102
- GraphQL::TypeKinds::SCALAR
103
- end
104
-
105
- private
106
-
107
- def ensure_two_arg(callable, method_name)
108
- GraphQL::BackwardsCompatibility.wrap_arity(callable, from: 1, to: 2, name: "#{name}.#{method_name}(val, ctx)")
109
- end
110
-
111
- def coerce_non_null_input(value, ctx)
112
- @coerce_input_proc.call(raw_coercion_input(value), ctx)
113
- end
114
-
115
- def raw_coercion_input(value)
116
- if value.is_a?(GraphQL::Language::Nodes::InputObject)
117
- value.to_h
118
- elsif value.is_a?(Array)
119
- value.map { |element| raw_coercion_input(element) }
120
- else
121
- value
122
- end
123
- end
124
-
125
- def validate_non_null_input(value, ctx)
126
- result = Query::InputValidationResult.new
127
- if value.is_a?(GraphQL::Language::Nodes::Enum) || coerce_non_null_input(value, ctx).nil?
128
- result.add_problem("Could not coerce value #{GraphQL::Language.serialize(value)} to #{name}")
129
- end
130
- result
131
- end
132
- end
133
- end
@@ -1,35 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- class Schema
4
- # In early GraphQL versions, errors would be "automatically"
5
- # rescued and replaced with `"Internal error"`. That behavior
6
- # was undesirable but this middleware is offered for people who
7
- # want to preserve it.
8
- #
9
- # It has a couple of differences from the previous behavior:
10
- #
11
- # - Other parts of the query _will_ be run (previously,
12
- # execution would stop when the error was raised and the result
13
- # would have no `"data"` key at all)
14
- # - The entry in {Query::Context#errors} is a {GraphQL::ExecutionError}, _not_
15
- # the originally-raised error.
16
- # - The entry in the `"errors"` key includes the location of the field
17
- # which raised the errors.
18
- #
19
- # @example Use CatchallMiddleware with your schema
20
- # # All errors will be suppressed and replaced with "Internal error" messages
21
- # MySchema.middleware << GraphQL::Schema::CatchallMiddleware
22
- #
23
- module CatchallMiddleware
24
- MESSAGE = "Internal error"
25
-
26
- # Rescue any error and replace it with a {GraphQL::ExecutionError}
27
- # whose message is {MESSAGE}
28
- def self.call(parent_type, parent_object, field_definition, field_args, query_context)
29
- yield
30
- rescue StandardError
31
- GraphQL::ExecutionError.new(MESSAGE)
32
- end
33
- end
34
- end
35
- end
@@ -1,10 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- class Schema
4
- module DefaultParseError
5
- def self.call(parse_error, ctx)
6
- ctx.errors.push(parse_error)
7
- end
8
- end
9
- end
10
- end
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- class Schema
4
- module DefaultTypeError
5
- def self.call(type_error, ctx)
6
- case type_error
7
- when GraphQL::InvalidNullError
8
- ctx.errors << type_error
9
- when GraphQL::UnresolvedTypeError, GraphQL::StringEncodingError, GraphQL::IntegerEncodingError
10
- raise type_error
11
- end
12
- end
13
- end
14
- end
15
- end
@@ -1,152 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module GraphQL
4
- class Schema
5
- class Member
6
- # Support for legacy `accepts_definitions` functions.
7
- #
8
- # Keep the legacy handler hooked up. Class-based types and fields
9
- # will call those legacy handlers during their `.to_graphql`
10
- # methods.
11
- #
12
- # This can help out while transitioning from one to the other.
13
- # Eventually, `GraphQL::{X}Type` objects will be removed entirely,
14
- # But this can help during the transition.
15
- #
16
- # @example Applying a function to base object class
17
- # # Here's the legacy-style config, which we're calling back to:
18
- # GraphQL::ObjectType.accepts_definition({
19
- # permission_level: ->(defn, value) { defn.metadata[:permission_level] = value }
20
- # })
21
- #
22
- # class BaseObject < GraphQL::Schema::Object
23
- # # Setup a named pass-through to the legacy config functions
24
- # accepts_definition :permission_level
25
- # end
26
- #
27
- # class Account < BaseObject
28
- # # This value will be passed to the legacy handler:
29
- # permission_level 1
30
- # end
31
- #
32
- # # The class gets a reader method which returns the args,
33
- # # only marginally useful.
34
- # Account.permission_level # => [1]
35
- #
36
- # # The legacy handler is called, as before:
37
- # Account.graphql_definition.metadata[:permission_level] # => 1
38
- module AcceptsDefinition
39
- def self.included(child)
40
- child.extend(AcceptsDefinitionDefinitionMethods)
41
- child.prepend(ToGraphQLExtension)
42
- child.prepend(InitializeExtension)
43
- end
44
-
45
- def self.extended(child)
46
- if defined?(child::DefinitionMethods)
47
- child::DefinitionMethods.include(AcceptsDefinitionDefinitionMethods)
48
- child::DefinitionMethods.prepend(ToGraphQLExtension)
49
- else
50
- child.extend(AcceptsDefinitionDefinitionMethods)
51
- # I tried to use `super`, but super isn't quite right
52
- # since the method is defined in the same class itself,
53
- # not the superclass
54
- child.class_eval do
55
- class << self
56
- prepend(ToGraphQLExtension)
57
- end
58
- end
59
- end
60
- end
61
-
62
- module AcceptsDefinitionDefinitionMethods
63
- def accepts_definition(name)
64
- own_accepts_definition_methods << name
65
-
66
- ivar_name = "@#{name}_args"
67
- if self.is_a?(Class)
68
- define_singleton_method(name) do |*args|
69
- if args.any?
70
- instance_variable_set(ivar_name, args)
71
- end
72
- instance_variable_get(ivar_name) || (superclass.respond_to?(name) ? superclass.public_send(name) : nil)
73
- end
74
-
75
- define_method(name) do |*args|
76
- if args.any?
77
- instance_variable_set(ivar_name, args)
78
- end
79
- instance_variable_get(ivar_name)
80
- end
81
- else
82
- # Special handling for interfaces, define it here
83
- # so it's appropriately passed down
84
- self::DefinitionMethods.module_eval do
85
- define_method(name) do |*args|
86
- if args.any?
87
- instance_variable_set(ivar_name, args)
88
- end
89
- instance_variable_get(ivar_name) || ((int = interfaces.first { |i| i.respond_to?()}) && int.public_send(name))
90
- end
91
- end
92
- end
93
- end
94
-
95
- def accepts_definition_methods
96
- inherited_methods = if self.is_a?(Class)
97
- superclass.respond_to?(:accepts_definition_methods) ? superclass.accepts_definition_methods : []
98
- elsif self.is_a?(Module)
99
- m = []
100
- ancestors.each do |a|
101
- if a.respond_to?(:own_accepts_definition_methods)
102
- m.concat(a.own_accepts_definition_methods)
103
- end
104
- end
105
- m
106
- else
107
- self.class.accepts_definition_methods
108
- end
109
-
110
- own_accepts_definition_methods + inherited_methods
111
- end
112
-
113
- def own_accepts_definition_methods
114
- @own_accepts_definition_methods ||= []
115
- end
116
- end
117
-
118
- module ToGraphQLExtension
119
- def to_graphql
120
- defn = super
121
- accepts_definition_methods.each do |method_name|
122
- value = public_send(method_name)
123
- if !value.nil?
124
- defn = defn.redefine { public_send(method_name, *value) }
125
- end
126
- end
127
- defn
128
- end
129
- end
130
-
131
- module InitializeExtension
132
- def initialize(*args, **kwargs, &block)
133
- self.class.accepts_definition_methods.each do |method_name|
134
- if kwargs.key?(method_name)
135
- value = kwargs.delete(method_name)
136
- if !value.is_a?(Array)
137
- value = [value]
138
- end
139
- instance_variable_set("@#{method_name}_args", value)
140
- end
141
- end
142
- super(*args, **kwargs, &block)
143
- end
144
-
145
- def accepts_definition_methods
146
- self.class.accepts_definition_methods
147
- end
148
- end
149
- end
150
- end
151
- end
152
- end
@@ -1,26 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module GraphQL
4
- class Schema
5
- class Member
6
- # Adds a layer of caching over user-supplied `.to_graphql` methods.
7
- # Users override `.to_graphql`, but all runtime code should use `.graphql_definition`.
8
- # @api private
9
- # @see concrete classes that extend this, eg {Schema::Object}
10
- module CachedGraphQLDefinition
11
- # A cached result of {.to_graphql}.
12
- # It's cached here so that user-overridden {.to_graphql} implementations
13
- # are also cached
14
- def graphql_definition
15
- @graphql_definition ||= to_graphql
16
- end
17
-
18
- # Wipe out the cached graphql_definition so that `.to_graphql` will be called again.
19
- def initialize_copy(original)
20
- super
21
- @graphql_definition = nil
22
- end
23
- end
24
- end
25
- end
26
- end
@@ -1,132 +0,0 @@
1
- # frozen_string_literal: true
2
- # test_via: ../object.rb
3
-
4
- module GraphQL
5
- class Schema
6
- class Member
7
- module Instrumentation
8
- module_function
9
- def instrument(type, field)
10
- return_type = field.type.unwrap
11
- if (return_type.is_a?(GraphQL::ObjectType) && return_type.metadata[:type_class]) ||
12
- return_type.is_a?(GraphQL::InterfaceType) ||
13
- (return_type.is_a?(GraphQL::UnionType) && return_type.possible_types.any? { |t| t.metadata[:type_class] })
14
- field = apply_proxy(field)
15
- end
16
-
17
- field
18
- end
19
-
20
- def before_query(query)
21
- # Get the root type for this query
22
- root_node = query.irep_selection
23
- if root_node.nil?
24
- # It's an invalid query, nothing to do here
25
- else
26
- root_type = query.irep_selection.return_type
27
- # If it has a wrapper, apply it
28
- wrapper_class = root_type.metadata[:type_class]
29
- if wrapper_class
30
- new_root_value = wrapper_class.authorized_new(query.root_value, query.context)
31
- new_root_value = query.schema.sync_lazy(new_root_value)
32
- if new_root_value.nil?
33
- # This is definitely a hack,
34
- # but we need some way to tell execute.rb not to run.
35
- query.context[:__root_unauthorized] = true
36
- end
37
- query.root_value = new_root_value
38
- end
39
- end
40
- end
41
-
42
- def after_query(_query)
43
- end
44
-
45
- private
46
-
47
- module_function
48
-
49
- def apply_proxy(field)
50
- resolve_proc = field.resolve_proc
51
- lazy_resolve_proc = field.lazy_resolve_proc
52
- inner_return_type = field.type.unwrap
53
- depth = list_depth(field.type)
54
-
55
- field.redefine(
56
- resolve: ProxiedResolve.new(inner_resolve: resolve_proc, list_depth: depth, inner_return_type: inner_return_type),
57
- lazy_resolve: ProxiedResolve.new(inner_resolve: lazy_resolve_proc, list_depth: depth, inner_return_type: inner_return_type),
58
- )
59
- end
60
-
61
- def list_depth(type, starting_at = 0)
62
- case type
63
- when GraphQL::ListType
64
- list_depth(type.of_type, starting_at + 1)
65
- when GraphQL::NonNullType
66
- list_depth(type.of_type, starting_at)
67
- else
68
- starting_at
69
- end
70
- end
71
-
72
- class ProxiedResolve
73
- def initialize(inner_resolve:, list_depth:, inner_return_type:)
74
- @inner_resolve = inner_resolve
75
- @inner_return_type = inner_return_type
76
- @list_depth = list_depth
77
- end
78
-
79
- def call(obj, args, ctx)
80
- result = @inner_resolve.call(obj, args, ctx)
81
- if ctx.skip == result || ctx.schema.lazy?(result) || result.nil? || execution_errors?(result) || ctx.wrapped_object
82
- result
83
- else
84
- ctx.wrapped_object = true
85
- proxy_to_depth(result, @list_depth, ctx)
86
- end
87
- end
88
-
89
- private
90
-
91
- def execution_errors?(result)
92
- result.is_a?(GraphQL::ExecutionError) ||
93
- (result.is_a?(Array) && result.any? && result.all? { |v| v.is_a?(GraphQL::ExecutionError) })
94
- end
95
-
96
- def proxy_to_depth(inner_obj, depth, ctx)
97
- if depth > 0
98
- inner_obj.map { |i| proxy_to_depth(i, depth - 1, ctx) }
99
- else
100
- ctx.schema.after_lazy(inner_obj) do |inner_obj|
101
- if inner_obj.nil?
102
- # For lists with nil, we need another nil check here
103
- nil
104
- else
105
- concrete_type_or_lazy = case @inner_return_type
106
- when GraphQL::UnionType, GraphQL::InterfaceType
107
- ctx.query.resolve_type(@inner_return_type, inner_obj)
108
- when GraphQL::ObjectType
109
- @inner_return_type
110
- else
111
- raise "unexpected proxying type #{@inner_return_type} for #{inner_obj} at #{ctx.owner_type}.#{ctx.field.name}"
112
- end
113
-
114
- # .resolve_type may have returned a lazy
115
- ctx.schema.after_lazy(concrete_type_or_lazy) do |concrete_type|
116
- if concrete_type && (object_class = concrete_type.metadata[:type_class])
117
- # use the query-level context here, since it won't be field-specific anyways
118
- query_ctx = ctx.query.context
119
- object_class.authorized_new(inner_obj, query_ctx)
120
- else
121
- inner_obj
122
- end
123
- end
124
- end
125
- end
126
- end
127
- end
128
- end
129
- end
130
- end
131
- end
132
- end
@@ -1,82 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- class Schema
4
- # Given {steps} and {arguments}, call steps in order, passing `(*arguments, next_step)`.
5
- #
6
- # Steps should call `next_step.call` to continue the chain, or _not_ call it to stop the chain.
7
- class MiddlewareChain
8
- extend Forwardable
9
-
10
- # @return [Array<#call(*args)>] Steps in this chain, will be called with arguments and `next_middleware`
11
- attr_reader :steps, :final_step
12
-
13
- def initialize(steps: [], final_step: nil)
14
- @steps = steps
15
- @final_step = final_step
16
- end
17
-
18
- def initialize_copy(other)
19
- super
20
- @steps = other.steps.dup
21
- end
22
-
23
- def_delegators :@steps, :[], :first, :insert, :delete
24
-
25
- def <<(callable)
26
- add_middleware(callable)
27
- end
28
-
29
- def push(callable)
30
- add_middleware(callable)
31
- end
32
-
33
- def ==(other)
34
- steps == other.steps && final_step == other.final_step
35
- end
36
-
37
- def invoke(arguments)
38
- invoke_core(0, arguments)
39
- end
40
-
41
- def concat(callables)
42
- callables.each { |c| add_middleware(c) }
43
- end
44
-
45
- private
46
-
47
- def invoke_core(index, arguments)
48
- if index >= steps.length
49
- final_step.call(*arguments)
50
- else
51
- steps[index].call(*arguments) { |next_args = arguments| invoke_core(index + 1, next_args) }
52
- end
53
- end
54
-
55
- def add_middleware(callable)
56
- # TODO: Stop wrapping callables once deprecated middleware becomes unsupported
57
- steps << wrap(callable)
58
- end
59
-
60
- # TODO: Remove this code once deprecated middleware becomes unsupported
61
- class MiddlewareWrapper
62
- attr_reader :callable
63
- def initialize(callable)
64
- @callable = callable
65
- end
66
-
67
- def call(*args, &next_middleware)
68
- callable.call(*args, next_middleware)
69
- end
70
- end
71
-
72
- def wrap(callable)
73
- if BackwardsCompatibility.get_arity(callable) == 6
74
- warn("Middleware that takes a next_middleware parameter is deprecated (#{callable.inspect}); instead, accept a block and use yield.")
75
- MiddlewareWrapper.new(callable)
76
- else
77
- callable
78
- end
79
- end
80
- end
81
- end
82
- end
@@ -1,39 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- class Schema
4
- # Find the members of a union or interface within a given schema.
5
- #
6
- # (Although its members never change, unions are handled this way to simplify execution code.)
7
- #
8
- # Internally, the calculation is cached. It's assumed that schema members _don't_ change after creating the schema!
9
- #
10
- # @example Get an interface's possible types
11
- # possible_types = GraphQL::Schema::PossibleTypes(MySchema)
12
- # possible_types.possible_types(MyInterface)
13
- # # => [MyObjectType, MyOtherObjectType]
14
- class PossibleTypes
15
- def initialize(schema)
16
- @object_types = schema.types.values.select { |type| type.kind.object? }
17
-
18
- @interface_implementers = Hash.new do |hash, key|
19
- hash[key] = @object_types.select { |type| type.interfaces.include?(key) }.sort_by(&:name)
20
- end
21
- end
22
-
23
- def possible_types(type_defn, ctx)
24
- case type_defn
25
- when Module
26
- possible_types(type_defn.graphql_definition, ctx)
27
- when GraphQL::UnionType
28
- type_defn.possible_types(ctx)
29
- when GraphQL::InterfaceType
30
- @interface_implementers[type_defn]
31
- when GraphQL::BaseType
32
- [type_defn]
33
- else
34
- raise "Unexpected possible_types object: #{type_defn.inspect}"
35
- end
36
- end
37
- end
38
- end
39
- end
@@ -1,60 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- class Schema
4
- # - Store a table of errors & handlers
5
- # - Rescue errors in a middleware chain, then check for a handler
6
- # - If a handler is found, use it & return a {GraphQL::ExecutionError}
7
- # - If no handler is found, re-raise the error
8
- class RescueMiddleware
9
- # @return [Hash] `{class => proc}` pairs for handling errors
10
- attr_reader :rescue_table
11
- def initialize
12
- @rescue_table = {}
13
- end
14
-
15
- # @example Rescue from not-found by telling the user
16
- # MySchema.rescue_from(ActiveRecord::RecordNotFound) { "An item could not be found" }
17
- #
18
- # @param error_classes [Class] one or more classes of errors to rescue from
19
- # @yield [err] A handler to return a message for these error instances
20
- # @yieldparam [Exception] an error that was rescued
21
- # @yieldreturn [String] message to put in GraphQL response
22
- def rescue_from(*error_classes, &block)
23
- error_classes.map{ |error_class| rescue_table[error_class] = block }
24
- end
25
-
26
- # Remove the handler for `error_classs`
27
- # @param error_class [Class] the error class whose handler should be removed
28
- def remove_handler(*error_classes)
29
- error_classes.map{ |error_class| rescue_table.delete(error_class) }
30
- end
31
-
32
- # Implement the requirement for {GraphQL::Schema::MiddlewareChain}
33
- def call(*args)
34
- begin
35
- yield
36
- rescue StandardError => err
37
- attempt_rescue(err)
38
- end
39
- end
40
-
41
- private
42
-
43
- def attempt_rescue(err)
44
- rescue_table.each { |klass, handler|
45
- if klass.is_a?(Class) && err.is_a?(klass) && handler
46
- result = handler.call(err)
47
- case result
48
- when String
49
- return GraphQL::ExecutionError.new(result)
50
- when GraphQL::ExecutionError
51
- return result
52
- end
53
- end
54
- }
55
-
56
- raise(err)
57
- end
58
- end
59
- end
60
- end