graphql 1.12.12 → 2.4.8

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 (428) hide show
  1. checksums.yaml +4 -4
  2. data/lib/generators/graphql/core.rb +3 -8
  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 +60 -4
  10. data/lib/generators/graphql/interface_generator.rb +7 -7
  11. data/lib/generators/graphql/mutation_create_generator.rb +22 -0
  12. data/lib/generators/graphql/mutation_delete_generator.rb +22 -0
  13. data/lib/generators/graphql/mutation_generator.rb +5 -30
  14. data/lib/generators/graphql/mutation_update_generator.rb +22 -0
  15. data/lib/generators/graphql/object_generator.rb +10 -38
  16. data/lib/generators/graphql/orm_mutations_base.rb +40 -0
  17. data/lib/generators/graphql/relay.rb +23 -12
  18. data/lib/generators/graphql/scalar_generator.rb +4 -2
  19. data/lib/generators/graphql/templates/base_argument.erb +2 -0
  20. data/lib/generators/graphql/templates/base_connection.erb +2 -0
  21. data/lib/generators/graphql/templates/base_edge.erb +2 -0
  22. data/lib/generators/graphql/templates/base_enum.erb +2 -0
  23. data/lib/generators/graphql/templates/base_field.erb +2 -0
  24. data/lib/generators/graphql/templates/base_input_object.erb +2 -0
  25. data/lib/generators/graphql/templates/base_interface.erb +2 -0
  26. data/lib/generators/graphql/templates/base_object.erb +2 -0
  27. data/lib/generators/graphql/templates/base_resolver.erb +8 -0
  28. data/lib/generators/graphql/templates/base_scalar.erb +2 -0
  29. data/lib/generators/graphql/templates/base_union.erb +2 -0
  30. data/lib/generators/graphql/templates/enum.erb +5 -1
  31. data/lib/generators/graphql/templates/graphql_controller.erb +2 -0
  32. data/lib/generators/graphql/templates/input.erb +9 -0
  33. data/lib/generators/graphql/templates/interface.erb +4 -2
  34. data/lib/generators/graphql/templates/loader.erb +2 -0
  35. data/lib/generators/graphql/templates/mutation.erb +3 -1
  36. data/lib/generators/graphql/templates/mutation_create.erb +20 -0
  37. data/lib/generators/graphql/templates/mutation_delete.erb +20 -0
  38. data/lib/generators/graphql/templates/mutation_update.erb +21 -0
  39. data/lib/generators/graphql/templates/node_type.erb +2 -0
  40. data/lib/generators/graphql/templates/object.erb +4 -2
  41. data/lib/generators/graphql/templates/query_type.erb +2 -0
  42. data/lib/generators/graphql/templates/scalar.erb +3 -1
  43. data/lib/generators/graphql/templates/schema.erb +22 -2
  44. data/lib/generators/graphql/templates/union.erb +4 -2
  45. data/lib/generators/graphql/type_generator.rb +46 -10
  46. data/lib/generators/graphql/union_generator.rb +5 -5
  47. data/lib/graphql/analysis/analyzer.rb +89 -0
  48. data/lib/graphql/analysis/field_usage.rb +65 -28
  49. data/lib/graphql/analysis/max_query_complexity.rb +11 -17
  50. data/lib/graphql/analysis/max_query_depth.rb +13 -19
  51. data/lib/graphql/analysis/query_complexity.rb +156 -61
  52. data/lib/graphql/analysis/query_depth.rb +38 -23
  53. data/lib/graphql/analysis/visitor.rb +283 -0
  54. data/lib/graphql/analysis.rb +90 -6
  55. data/lib/graphql/autoload.rb +38 -0
  56. data/lib/graphql/backtrace/inspect_result.rb +0 -12
  57. data/lib/graphql/backtrace/table.rb +4 -22
  58. data/lib/graphql/backtrace/trace.rb +93 -0
  59. data/lib/graphql/backtrace/tracer.rb +8 -6
  60. data/lib/graphql/backtrace.rb +3 -8
  61. data/lib/graphql/coercion_error.rb +1 -9
  62. data/lib/graphql/current.rb +52 -0
  63. data/lib/graphql/dataloader/async_dataloader.rb +89 -0
  64. data/lib/graphql/dataloader/null_dataloader.rb +4 -2
  65. data/lib/graphql/dataloader/request.rb +5 -0
  66. data/lib/graphql/dataloader/source.rb +125 -33
  67. data/lib/graphql/dataloader.rb +193 -143
  68. data/lib/graphql/date_encoding_error.rb +16 -0
  69. data/lib/graphql/dig.rb +1 -1
  70. data/lib/graphql/duration_encoding_error.rb +16 -0
  71. data/lib/graphql/execution/errors.rb +12 -81
  72. data/lib/graphql/execution/interpreter/argument_value.rb +5 -1
  73. data/lib/graphql/execution/interpreter/arguments.rb +2 -2
  74. data/lib/graphql/execution/interpreter/arguments_cache.rb +33 -36
  75. data/lib/graphql/execution/interpreter/resolve.rb +38 -4
  76. data/lib/graphql/execution/interpreter/runtime/graphql_result.rb +175 -0
  77. data/lib/graphql/execution/interpreter/runtime.rb +447 -403
  78. data/lib/graphql/execution/interpreter.rb +126 -80
  79. data/lib/graphql/execution/lazy.rb +11 -21
  80. data/lib/graphql/execution/lookahead.rb +133 -55
  81. data/lib/graphql/execution/multiplex.rb +4 -172
  82. data/lib/graphql/execution.rb +11 -4
  83. data/lib/graphql/integer_encoding_error.rb +18 -2
  84. data/lib/graphql/introspection/directive_location_enum.rb +2 -2
  85. data/lib/graphql/introspection/directive_type.rb +6 -4
  86. data/lib/graphql/introspection/dynamic_fields.rb +3 -8
  87. data/lib/graphql/introspection/entry_points.rb +11 -18
  88. data/lib/graphql/introspection/enum_value_type.rb +2 -2
  89. data/lib/graphql/introspection/field_type.rb +4 -4
  90. data/lib/graphql/introspection/input_value_type.rb +10 -4
  91. data/lib/graphql/introspection/schema_type.rb +17 -15
  92. data/lib/graphql/introspection/type_type.rb +29 -16
  93. data/lib/graphql/introspection.rb +6 -2
  94. data/lib/graphql/invalid_null_error.rb +1 -1
  95. data/lib/graphql/language/block_string.rb +37 -25
  96. data/lib/graphql/language/cache.rb +13 -0
  97. data/lib/graphql/language/comment.rb +18 -0
  98. data/lib/graphql/language/definition_slice.rb +1 -1
  99. data/lib/graphql/language/document_from_schema_definition.rb +122 -81
  100. data/lib/graphql/language/lexer.rb +364 -1467
  101. data/lib/graphql/language/nodes.rb +197 -106
  102. data/lib/graphql/language/parser.rb +799 -1920
  103. data/lib/graphql/language/printer.rb +372 -160
  104. data/lib/graphql/language/sanitized_printer.rb +25 -27
  105. data/lib/graphql/language/static_visitor.rb +167 -0
  106. data/lib/graphql/language/visitor.rb +188 -141
  107. data/lib/graphql/language.rb +62 -1
  108. data/lib/graphql/load_application_object_failed_error.rb +5 -1
  109. data/lib/graphql/name_validator.rb +0 -4
  110. data/lib/graphql/pagination/active_record_relation_connection.rb +37 -8
  111. data/lib/graphql/pagination/array_connection.rb +8 -6
  112. data/lib/graphql/pagination/connection.rb +61 -7
  113. data/lib/graphql/pagination/connections.rb +22 -23
  114. data/lib/graphql/pagination/mongoid_relation_connection.rb +1 -2
  115. data/lib/graphql/pagination/relation_connection.rb +60 -28
  116. data/lib/graphql/query/context/scoped_context.rb +101 -0
  117. data/lib/graphql/query/context.rb +146 -222
  118. data/lib/graphql/query/input_validation_result.rb +10 -1
  119. data/lib/graphql/query/null_context.rb +15 -32
  120. data/lib/graphql/query/validation_pipeline.rb +15 -39
  121. data/lib/graphql/query/variable_validation_error.rb +3 -3
  122. data/lib/graphql/query/variables.rb +35 -17
  123. data/lib/graphql/query.rb +149 -82
  124. data/lib/graphql/railtie.rb +15 -109
  125. data/lib/graphql/rake_task/validate.rb +1 -1
  126. data/lib/graphql/rake_task.rb +30 -11
  127. data/lib/graphql/relay/range_add.rb +9 -16
  128. data/lib/graphql/relay.rb +0 -15
  129. data/lib/graphql/rubocop/graphql/base_cop.rb +36 -0
  130. data/lib/graphql/rubocop/graphql/default_null_true.rb +43 -0
  131. data/lib/graphql/rubocop/graphql/default_required_true.rb +43 -0
  132. data/lib/graphql/rubocop/graphql/field_type_in_block.rb +144 -0
  133. data/lib/graphql/rubocop/graphql/root_types_in_block.rb +38 -0
  134. data/lib/graphql/rubocop.rb +6 -0
  135. data/lib/graphql/schema/addition.rb +98 -54
  136. data/lib/graphql/schema/always_visible.rb +14 -0
  137. data/lib/graphql/schema/argument.rb +179 -82
  138. data/lib/graphql/schema/base_64_encoder.rb +3 -5
  139. data/lib/graphql/schema/build_from_definition.rb +77 -39
  140. data/lib/graphql/schema/directive/feature.rb +1 -1
  141. data/lib/graphql/schema/directive/flagged.rb +4 -4
  142. data/lib/graphql/schema/directive/include.rb +1 -1
  143. data/lib/graphql/schema/directive/one_of.rb +24 -0
  144. data/lib/graphql/schema/directive/skip.rb +1 -1
  145. data/lib/graphql/schema/directive/specified_by.rb +14 -0
  146. data/lib/graphql/schema/directive/transform.rb +2 -2
  147. data/lib/graphql/schema/directive.rb +36 -22
  148. data/lib/graphql/schema/enum.rb +158 -63
  149. data/lib/graphql/schema/enum_value.rb +12 -21
  150. data/lib/graphql/schema/field/connection_extension.rb +7 -17
  151. data/lib/graphql/schema/field/scope_extension.rb +8 -1
  152. data/lib/graphql/schema/field.rb +521 -359
  153. data/lib/graphql/schema/field_extension.rb +86 -2
  154. data/lib/graphql/schema/find_inherited_value.rb +3 -7
  155. data/lib/graphql/schema/finder.rb +5 -5
  156. data/lib/graphql/schema/has_single_input_argument.rb +160 -0
  157. data/lib/graphql/schema/input_object.rb +148 -99
  158. data/lib/graphql/schema/interface.rb +41 -64
  159. data/lib/graphql/schema/introspection_system.rb +12 -26
  160. data/lib/graphql/schema/late_bound_type.rb +12 -2
  161. data/lib/graphql/schema/list.rb +18 -7
  162. data/lib/graphql/schema/loader.rb +6 -5
  163. data/lib/graphql/schema/member/base_dsl_methods.rb +32 -18
  164. data/lib/graphql/schema/member/build_type.rb +16 -13
  165. data/lib/graphql/schema/member/has_arguments.rb +270 -86
  166. data/lib/graphql/schema/member/has_ast_node.rb +12 -0
  167. data/lib/graphql/schema/member/has_deprecation_reason.rb +3 -4
  168. data/lib/graphql/schema/member/has_directives.rb +81 -61
  169. data/lib/graphql/schema/member/has_fields.rb +169 -31
  170. data/lib/graphql/schema/member/has_interfaces.rb +143 -0
  171. data/lib/graphql/schema/member/has_unresolved_type_error.rb +5 -1
  172. data/lib/graphql/schema/member/has_validators.rb +32 -6
  173. data/lib/graphql/schema/member/relay_shortcuts.rb +47 -2
  174. data/lib/graphql/schema/member/scoped.rb +19 -0
  175. data/lib/graphql/schema/member/type_system_helpers.rb +16 -0
  176. data/lib/graphql/schema/member/validates_input.rb +6 -6
  177. data/lib/graphql/schema/member.rb +1 -6
  178. data/lib/graphql/schema/mutation.rb +7 -9
  179. data/lib/graphql/schema/non_null.rb +7 -7
  180. data/lib/graphql/schema/object.rb +38 -119
  181. data/lib/graphql/schema/printer.rb +24 -25
  182. data/lib/graphql/schema/relay_classic_mutation.rb +13 -91
  183. data/lib/graphql/schema/resolver/has_payload_type.rb +46 -11
  184. data/lib/graphql/schema/resolver.rb +118 -115
  185. data/lib/graphql/schema/scalar.rb +20 -21
  186. data/lib/graphql/schema/subscription.rb +95 -21
  187. data/lib/graphql/schema/timeout.rb +25 -29
  188. data/lib/graphql/schema/type_expression.rb +2 -2
  189. data/lib/graphql/schema/type_membership.rb +21 -4
  190. data/lib/graphql/schema/union.rb +16 -16
  191. data/lib/graphql/schema/unique_within_type.rb +1 -1
  192. data/lib/graphql/schema/validator/all_validator.rb +62 -0
  193. data/lib/graphql/schema/validator/allow_blank_validator.rb +29 -0
  194. data/lib/graphql/schema/validator/allow_null_validator.rb +26 -0
  195. data/lib/graphql/schema/validator/exclusion_validator.rb +3 -1
  196. data/lib/graphql/schema/validator/format_validator.rb +4 -5
  197. data/lib/graphql/schema/validator/inclusion_validator.rb +3 -1
  198. data/lib/graphql/schema/validator/length_validator.rb +5 -3
  199. data/lib/graphql/schema/validator/numericality_validator.rb +13 -2
  200. data/lib/graphql/schema/validator/required_validator.rb +56 -18
  201. data/lib/graphql/schema/validator.rb +38 -28
  202. data/lib/graphql/schema/visibility/migration.rb +188 -0
  203. data/lib/graphql/schema/visibility/profile.rb +359 -0
  204. data/lib/graphql/schema/visibility/visit.rb +190 -0
  205. data/lib/graphql/schema/visibility.rb +294 -0
  206. data/lib/graphql/schema/warden.rb +423 -134
  207. data/lib/graphql/schema/wrapper.rb +0 -5
  208. data/lib/graphql/schema.rb +1015 -1057
  209. data/lib/graphql/static_validation/all_rules.rb +3 -1
  210. data/lib/graphql/static_validation/base_visitor.rb +15 -28
  211. data/lib/graphql/static_validation/definition_dependencies.rb +7 -2
  212. data/lib/graphql/static_validation/error.rb +3 -1
  213. data/lib/graphql/static_validation/literal_validator.rb +24 -7
  214. data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +1 -1
  215. data/lib/graphql/static_validation/rules/argument_names_are_unique.rb +1 -1
  216. data/lib/graphql/static_validation/rules/arguments_are_defined.rb +4 -3
  217. data/lib/graphql/static_validation/rules/directives_are_defined.rb +13 -7
  218. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +15 -13
  219. data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +12 -2
  220. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +13 -5
  221. data/lib/graphql/static_validation/rules/fields_will_merge.rb +62 -35
  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/fragment_types_exist.rb +12 -2
  225. data/lib/graphql/static_validation/rules/fragments_are_finite.rb +2 -2
  226. data/lib/graphql/static_validation/rules/fragments_are_on_composite_types.rb +1 -1
  227. data/lib/graphql/static_validation/rules/mutation_root_exists.rb +1 -1
  228. data/lib/graphql/static_validation/rules/no_definitions_are_present.rb +1 -1
  229. data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid.rb +66 -0
  230. data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid_error.rb +29 -0
  231. data/lib/graphql/static_validation/rules/query_root_exists.rb +17 -0
  232. data/lib/graphql/static_validation/rules/query_root_exists_error.rb +26 -0
  233. data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +7 -5
  234. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +5 -5
  235. data/lib/graphql/static_validation/rules/subscription_root_exists.rb +1 -1
  236. data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +14 -8
  237. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +18 -27
  238. data/lib/graphql/static_validation/rules/variable_names_are_unique.rb +1 -1
  239. data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +14 -8
  240. data/lib/graphql/static_validation/rules/variables_are_input_types.rb +11 -2
  241. data/lib/graphql/static_validation/validation_context.rb +32 -6
  242. data/lib/graphql/static_validation/validator.rb +11 -27
  243. data/lib/graphql/static_validation.rb +0 -3
  244. data/lib/graphql/string_encoding_error.rb +13 -3
  245. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +49 -11
  246. data/lib/graphql/subscriptions/broadcast_analyzer.rb +11 -5
  247. data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +40 -1
  248. data/lib/graphql/subscriptions/event.rb +87 -38
  249. data/lib/graphql/subscriptions/serialize.rb +27 -3
  250. data/lib/graphql/subscriptions.rb +63 -49
  251. data/lib/graphql/testing/helpers.rb +155 -0
  252. data/lib/graphql/testing.rb +2 -0
  253. data/lib/graphql/tracing/active_support_notifications_trace.rb +16 -0
  254. data/lib/graphql/tracing/active_support_notifications_tracing.rb +6 -20
  255. data/lib/graphql/tracing/appoptics_trace.rb +253 -0
  256. data/lib/graphql/tracing/appoptics_tracing.rb +4 -2
  257. data/lib/graphql/tracing/appsignal_trace.rb +79 -0
  258. data/lib/graphql/tracing/appsignal_tracing.rb +17 -0
  259. data/lib/graphql/tracing/call_legacy_tracers.rb +66 -0
  260. data/lib/graphql/tracing/data_dog_trace.rb +185 -0
  261. data/lib/graphql/tracing/data_dog_tracing.rb +27 -15
  262. data/lib/graphql/{execution/instrumentation.rb → tracing/legacy_hooks_trace.rb} +11 -28
  263. data/lib/graphql/tracing/legacy_trace.rb +12 -0
  264. data/lib/graphql/tracing/new_relic_trace.rb +77 -0
  265. data/lib/graphql/tracing/new_relic_tracing.rb +2 -0
  266. data/lib/graphql/tracing/notifications_trace.rb +45 -0
  267. data/lib/graphql/tracing/notifications_tracing.rb +61 -0
  268. data/lib/graphql/tracing/null_trace.rb +9 -0
  269. data/lib/graphql/tracing/platform_trace.rb +118 -0
  270. data/lib/graphql/tracing/platform_tracing.rb +46 -49
  271. data/lib/graphql/tracing/{prometheus_tracing → prometheus_trace}/graphql_collector.rb +6 -2
  272. data/lib/graphql/tracing/prometheus_trace.rb +94 -0
  273. data/lib/graphql/tracing/prometheus_tracing.rb +5 -3
  274. data/lib/graphql/tracing/scout_trace.rb +74 -0
  275. data/lib/graphql/tracing/scout_tracing.rb +2 -0
  276. data/lib/graphql/tracing/sentry_trace.rb +114 -0
  277. data/lib/graphql/tracing/statsd_trace.rb +58 -0
  278. data/lib/graphql/tracing/statsd_tracing.rb +2 -0
  279. data/lib/graphql/tracing/trace.rb +79 -0
  280. data/lib/graphql/tracing.rb +29 -52
  281. data/lib/graphql/type_kinds.rb +7 -4
  282. data/lib/graphql/types/big_int.rb +5 -1
  283. data/lib/graphql/types/int.rb +1 -1
  284. data/lib/graphql/types/iso_8601_date.rb +17 -6
  285. data/lib/graphql/types/iso_8601_date_time.rb +12 -1
  286. data/lib/graphql/types/iso_8601_duration.rb +77 -0
  287. data/lib/graphql/types/relay/base_connection.rb +16 -6
  288. data/lib/graphql/types/relay/connection_behaviors.rb +92 -32
  289. data/lib/graphql/types/relay/edge_behaviors.rb +46 -7
  290. data/lib/graphql/types/relay/has_node_field.rb +2 -2
  291. data/lib/graphql/types/relay/has_nodes_field.rb +2 -2
  292. data/lib/graphql/types/relay/node_behaviors.rb +12 -2
  293. data/lib/graphql/types/relay/page_info_behaviors.rb +11 -2
  294. data/lib/graphql/types/relay.rb +0 -3
  295. data/lib/graphql/types/string.rb +2 -2
  296. data/lib/graphql/types.rb +18 -10
  297. data/lib/graphql/unauthorized_enum_value_error.rb +13 -0
  298. data/lib/graphql/unauthorized_error.rb +1 -1
  299. data/lib/graphql/version.rb +1 -1
  300. data/lib/graphql.rb +82 -137
  301. data/readme.md +13 -6
  302. metadata +127 -186
  303. data/lib/graphql/analysis/analyze_query.rb +0 -98
  304. data/lib/graphql/analysis/ast/analyzer.rb +0 -84
  305. data/lib/graphql/analysis/ast/field_usage.rb +0 -28
  306. data/lib/graphql/analysis/ast/max_query_complexity.rb +0 -23
  307. data/lib/graphql/analysis/ast/max_query_depth.rb +0 -22
  308. data/lib/graphql/analysis/ast/query_complexity.rb +0 -234
  309. data/lib/graphql/analysis/ast/query_depth.rb +0 -56
  310. data/lib/graphql/analysis/ast/visitor.rb +0 -268
  311. data/lib/graphql/analysis/ast.rb +0 -91
  312. data/lib/graphql/analysis/reducer_state.rb +0 -48
  313. data/lib/graphql/argument.rb +0 -131
  314. data/lib/graphql/authorization.rb +0 -82
  315. data/lib/graphql/backtrace/legacy_tracer.rb +0 -56
  316. data/lib/graphql/backwards_compatibility.rb +0 -61
  317. data/lib/graphql/base_type.rb +0 -230
  318. data/lib/graphql/boolean_type.rb +0 -2
  319. data/lib/graphql/compatibility/execution_specification/counter_schema.rb +0 -53
  320. data/lib/graphql/compatibility/execution_specification/specification_schema.rb +0 -200
  321. data/lib/graphql/compatibility/execution_specification.rb +0 -436
  322. data/lib/graphql/compatibility/lazy_execution_specification/lazy_schema.rb +0 -111
  323. data/lib/graphql/compatibility/lazy_execution_specification.rb +0 -215
  324. data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +0 -87
  325. data/lib/graphql/compatibility/query_parser_specification/query_assertions.rb +0 -79
  326. data/lib/graphql/compatibility/query_parser_specification.rb +0 -266
  327. data/lib/graphql/compatibility/schema_parser_specification.rb +0 -682
  328. data/lib/graphql/compatibility.rb +0 -5
  329. data/lib/graphql/define/assign_argument.rb +0 -12
  330. data/lib/graphql/define/assign_connection.rb +0 -13
  331. data/lib/graphql/define/assign_enum_value.rb +0 -18
  332. data/lib/graphql/define/assign_global_id_field.rb +0 -11
  333. data/lib/graphql/define/assign_mutation_function.rb +0 -34
  334. data/lib/graphql/define/assign_object_field.rb +0 -42
  335. data/lib/graphql/define/defined_object_proxy.rb +0 -53
  336. data/lib/graphql/define/instance_definable.rb +0 -240
  337. data/lib/graphql/define/no_definition_error.rb +0 -7
  338. data/lib/graphql/define/non_null_with_bang.rb +0 -16
  339. data/lib/graphql/define/type_definer.rb +0 -31
  340. data/lib/graphql/define.rb +0 -31
  341. data/lib/graphql/deprecated_dsl.rb +0 -47
  342. data/lib/graphql/deprecation.rb +0 -13
  343. data/lib/graphql/directive/deprecated_directive.rb +0 -2
  344. data/lib/graphql/directive/include_directive.rb +0 -2
  345. data/lib/graphql/directive/skip_directive.rb +0 -2
  346. data/lib/graphql/directive.rb +0 -111
  347. data/lib/graphql/enum_type.rb +0 -129
  348. data/lib/graphql/execution/execute.rb +0 -333
  349. data/lib/graphql/execution/flatten.rb +0 -40
  350. data/lib/graphql/execution/lazy/resolve.rb +0 -91
  351. data/lib/graphql/execution/typecast.rb +0 -50
  352. data/lib/graphql/field/resolve.rb +0 -59
  353. data/lib/graphql/field.rb +0 -226
  354. data/lib/graphql/filter.rb +0 -53
  355. data/lib/graphql/float_type.rb +0 -2
  356. data/lib/graphql/function.rb +0 -128
  357. data/lib/graphql/id_type.rb +0 -2
  358. data/lib/graphql/input_object_type.rb +0 -138
  359. data/lib/graphql/int_type.rb +0 -2
  360. data/lib/graphql/interface_type.rb +0 -72
  361. data/lib/graphql/internal_representation/document.rb +0 -27
  362. data/lib/graphql/internal_representation/node.rb +0 -206
  363. data/lib/graphql/internal_representation/print.rb +0 -51
  364. data/lib/graphql/internal_representation/rewrite.rb +0 -184
  365. data/lib/graphql/internal_representation/scope.rb +0 -88
  366. data/lib/graphql/internal_representation/visit.rb +0 -36
  367. data/lib/graphql/internal_representation.rb +0 -7
  368. data/lib/graphql/language/lexer.rl +0 -262
  369. data/lib/graphql/language/parser.y +0 -543
  370. data/lib/graphql/language/token.rb +0 -38
  371. data/lib/graphql/list_type.rb +0 -80
  372. data/lib/graphql/non_null_type.rb +0 -71
  373. data/lib/graphql/object_type.rb +0 -130
  374. data/lib/graphql/query/arguments.rb +0 -189
  375. data/lib/graphql/query/arguments_cache.rb +0 -24
  376. data/lib/graphql/query/executor.rb +0 -52
  377. data/lib/graphql/query/literal_input.rb +0 -136
  378. data/lib/graphql/query/serial_execution/field_resolution.rb +0 -92
  379. data/lib/graphql/query/serial_execution/operation_resolution.rb +0 -19
  380. data/lib/graphql/query/serial_execution/selection_resolution.rb +0 -23
  381. data/lib/graphql/query/serial_execution/value_resolution.rb +0 -87
  382. data/lib/graphql/query/serial_execution.rb +0 -40
  383. data/lib/graphql/relay/array_connection.rb +0 -83
  384. data/lib/graphql/relay/base_connection.rb +0 -189
  385. data/lib/graphql/relay/connection_instrumentation.rb +0 -54
  386. data/lib/graphql/relay/connection_resolve.rb +0 -43
  387. data/lib/graphql/relay/connection_type.rb +0 -41
  388. data/lib/graphql/relay/edge.rb +0 -27
  389. data/lib/graphql/relay/edge_type.rb +0 -19
  390. data/lib/graphql/relay/edges_instrumentation.rb +0 -40
  391. data/lib/graphql/relay/global_id_resolve.rb +0 -18
  392. data/lib/graphql/relay/mongo_relation_connection.rb +0 -50
  393. data/lib/graphql/relay/mutation/instrumentation.rb +0 -23
  394. data/lib/graphql/relay/mutation/resolve.rb +0 -56
  395. data/lib/graphql/relay/mutation/result.rb +0 -38
  396. data/lib/graphql/relay/mutation.rb +0 -106
  397. data/lib/graphql/relay/node.rb +0 -39
  398. data/lib/graphql/relay/page_info.rb +0 -7
  399. data/lib/graphql/relay/relation_connection.rb +0 -188
  400. data/lib/graphql/relay/type_extensions.rb +0 -32
  401. data/lib/graphql/scalar_type.rb +0 -91
  402. data/lib/graphql/schema/base_64_bp.rb +0 -26
  403. data/lib/graphql/schema/catchall_middleware.rb +0 -35
  404. data/lib/graphql/schema/default_parse_error.rb +0 -10
  405. data/lib/graphql/schema/default_type_error.rb +0 -17
  406. data/lib/graphql/schema/invalid_type_error.rb +0 -7
  407. data/lib/graphql/schema/member/accepts_definition.rb +0 -152
  408. data/lib/graphql/schema/member/cached_graphql_definition.rb +0 -31
  409. data/lib/graphql/schema/member/instrumentation.rb +0 -131
  410. data/lib/graphql/schema/middleware_chain.rb +0 -82
  411. data/lib/graphql/schema/possible_types.rb +0 -44
  412. data/lib/graphql/schema/rescue_middleware.rb +0 -60
  413. data/lib/graphql/schema/timeout_middleware.rb +0 -88
  414. data/lib/graphql/schema/traversal.rb +0 -228
  415. data/lib/graphql/schema/validation.rb +0 -313
  416. data/lib/graphql/static_validation/default_visitor.rb +0 -15
  417. data/lib/graphql/static_validation/no_validate_visitor.rb +0 -10
  418. data/lib/graphql/static_validation/type_stack.rb +0 -216
  419. data/lib/graphql/string_type.rb +0 -2
  420. data/lib/graphql/subscriptions/instrumentation.rb +0 -79
  421. data/lib/graphql/subscriptions/subscription_root.rb +0 -76
  422. data/lib/graphql/tracing/skylight_tracing.rb +0 -70
  423. data/lib/graphql/types/relay/default_relay.rb +0 -27
  424. data/lib/graphql/types/relay/node_field.rb +0 -25
  425. data/lib/graphql/types/relay/nodes_field.rb +0 -27
  426. data/lib/graphql/union_type.rb +0 -115
  427. data/lib/graphql/upgrader/member.rb +0 -937
  428. data/lib/graphql/upgrader/schema.rb +0 -38
@@ -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,17 +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
- when GraphQL::IntegerDecodingError
12
- nil
13
- end
14
- end
15
- end
16
- end
17
- end
@@ -1,7 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- class Schema
4
- class InvalidTypeError < GraphQL::Error
5
- end
6
- end
7
- 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,31 +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
- # This is for a common interface with .define-based types
19
- def type_class
20
- self
21
- end
22
-
23
- # Wipe out the cached graphql_definition so that `.to_graphql` will be called again.
24
- def initialize_copy(original)
25
- super
26
- @graphql_definition = nil
27
- end
28
- end
29
- end
30
- end
31
- end
@@ -1,131 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module GraphQL
4
- class Schema
5
- class Member
6
- module Instrumentation
7
- module_function
8
- def instrument(type, field)
9
- return_type = field.type.unwrap
10
- if (return_type.is_a?(GraphQL::ObjectType) && return_type.metadata[:type_class]) ||
11
- return_type.is_a?(GraphQL::InterfaceType) ||
12
- (return_type.is_a?(GraphQL::UnionType) && return_type.possible_types.any? { |t| t.metadata[:type_class] })
13
- field = apply_proxy(field)
14
- end
15
-
16
- field
17
- end
18
-
19
- def before_query(query)
20
- # Get the root type for this query
21
- root_node = query.irep_selection
22
- if root_node.nil?
23
- # It's an invalid query, nothing to do here
24
- else
25
- root_type = query.irep_selection.return_type
26
- # If it has a wrapper, apply it
27
- wrapper_class = root_type.metadata[:type_class]
28
- if wrapper_class
29
- new_root_value = wrapper_class.authorized_new(query.root_value, query.context)
30
- new_root_value = query.schema.sync_lazy(new_root_value)
31
- if new_root_value.nil?
32
- # This is definitely a hack,
33
- # but we need some way to tell execute.rb not to run.
34
- query.context[:__root_unauthorized] = true
35
- end
36
- query.root_value = new_root_value
37
- end
38
- end
39
- end
40
-
41
- def after_query(_query)
42
- end
43
-
44
- private
45
-
46
- module_function
47
-
48
- def apply_proxy(field)
49
- resolve_proc = field.resolve_proc
50
- lazy_resolve_proc = field.lazy_resolve_proc
51
- inner_return_type = field.type.unwrap
52
- depth = list_depth(field.type)
53
-
54
- field.redefine(
55
- resolve: ProxiedResolve.new(inner_resolve: resolve_proc, list_depth: depth, inner_return_type: inner_return_type),
56
- lazy_resolve: ProxiedResolve.new(inner_resolve: lazy_resolve_proc, list_depth: depth, inner_return_type: inner_return_type),
57
- )
58
- end
59
-
60
- def list_depth(type, starting_at = 0)
61
- case type
62
- when GraphQL::ListType
63
- list_depth(type.of_type, starting_at + 1)
64
- when GraphQL::NonNullType
65
- list_depth(type.of_type, starting_at)
66
- else
67
- starting_at
68
- end
69
- end
70
-
71
- class ProxiedResolve
72
- def initialize(inner_resolve:, list_depth:, inner_return_type:)
73
- @inner_resolve = inner_resolve
74
- @inner_return_type = inner_return_type
75
- @list_depth = list_depth
76
- end
77
-
78
- def call(obj, args, ctx)
79
- result = @inner_resolve.call(obj, args, ctx)
80
- if ctx.skip == result || ctx.schema.lazy?(result) || result.nil? || execution_errors?(result) || ctx.wrapped_object
81
- result
82
- else
83
- ctx.wrapped_object = true
84
- proxy_to_depth(result, @list_depth, ctx)
85
- end
86
- end
87
-
88
- private
89
-
90
- def execution_errors?(result)
91
- result.is_a?(GraphQL::ExecutionError) ||
92
- (result.is_a?(Array) && result.any? && result.all? { |v| v.is_a?(GraphQL::ExecutionError) })
93
- end
94
-
95
- def proxy_to_depth(inner_obj, depth, ctx)
96
- if depth > 0
97
- inner_obj.map { |i| proxy_to_depth(i, depth - 1, ctx) }
98
- else
99
- ctx.schema.after_lazy(inner_obj) do |inner_obj|
100
- if inner_obj.nil?
101
- # For lists with nil, we need another nil check here
102
- nil
103
- else
104
- concrete_type_or_lazy = case @inner_return_type
105
- when GraphQL::UnionType, GraphQL::InterfaceType
106
- ctx.query.resolve_type(@inner_return_type, inner_obj)
107
- when GraphQL::ObjectType
108
- @inner_return_type
109
- else
110
- raise "unexpected proxying type #{@inner_return_type} for #{inner_obj} at #{ctx.owner_type}.#{ctx.field.name}"
111
- end
112
-
113
- # .resolve_type may have returned a lazy
114
- ctx.schema.after_lazy(concrete_type_or_lazy) do |concrete_type|
115
- if concrete_type && (object_class = concrete_type.metadata[:type_class])
116
- # use the query-level context here, since it won't be field-specific anyways
117
- query_ctx = ctx.query.context
118
- object_class.authorized_new(inner_obj, query_ctx)
119
- else
120
- inner_obj
121
- end
122
- end
123
- end
124
- end
125
- end
126
- end
127
- end
128
- end
129
- end
130
- end
131
- 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
- GraphQL::Deprecation.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,44 +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
- @interface_implementers = Hash.new do |h1, ctx|
18
- h1[ctx] = Hash.new do |h2, int_type|
19
- h2[int_type] = @object_types.select { |type| type.interfaces(ctx).include?(int_type) }.sort_by(&:name)
20
- end
21
- end
22
- end
23
-
24
- def possible_types(type_defn, ctx)
25
- case type_defn
26
- when Module
27
- possible_types(type_defn.graphql_definition, ctx)
28
- when GraphQL::UnionType
29
- type_defn.possible_types(ctx)
30
- when GraphQL::InterfaceType
31
- interface_implementers(ctx, type_defn)
32
- when GraphQL::BaseType
33
- [type_defn]
34
- else
35
- raise "Unexpected possible_types object: #{type_defn.inspect}"
36
- end
37
- end
38
-
39
- def interface_implementers(ctx, type_defn)
40
- @interface_implementers[ctx][type_defn]
41
- end
42
- end
43
- end
44
- 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
@@ -1,88 +0,0 @@
1
- # frozen_string_literal: true
2
- require "delegate"
3
-
4
- module GraphQL
5
- class Schema
6
- # This middleware will stop resolving new fields after `max_seconds` have elapsed.
7
- # After the time has passed, any remaining fields will be `nil`, with errors added
8
- # to the `errors` key. Any already-resolved fields will be in the `data` key, so
9
- # you'll get a partial response.
10
- #
11
- # You can provide a block which will be called with any timeout errors that occur.
12
- #
13
- # Note that this will stop a query _in between_ field resolutions, but
14
- # it doesn't interrupt long-running `resolve` functions. Be sure to use
15
- # timeout options for external connections. For more info, see
16
- # www.mikeperham.com/2015/05/08/timeout-rubys-most-dangerous-api/
17
- #
18
- # @example Stop resolving fields after 2 seconds
19
- # MySchema.middleware << GraphQL::Schema::TimeoutMiddleware.new(max_seconds: 2)
20
- #
21
- # @example Notifying Bugsnag on a timeout
22
- # MySchema.middleware << GraphQL::Schema::TimeoutMiddleware(max_seconds: 1.5) do |timeout_error, query|
23
- # Bugsnag.notify(timeout_error, {query_string: query_ctx.query.query_string})
24
- # end
25
- #
26
- # @api deprecated
27
- # @see Schema::Timeout
28
- class TimeoutMiddleware
29
- # @param max_seconds [Numeric] how many seconds the query should be allowed to resolve new fields
30
- def initialize(max_seconds:, context_key: nil, &block)
31
- @max_seconds = max_seconds
32
- if context_key
33
- GraphQL::Deprecation.warn("TimeoutMiddleware's `context_key` is ignored, timeout data is now stored in isolated storage")
34
- end
35
- @error_handler = block
36
- end
37
-
38
- def call(parent_type, parent_object, field_definition, field_args, query_context)
39
- ns = query_context.namespace(self.class)
40
- now = Process.clock_gettime(Process::CLOCK_MONOTONIC)
41
- timeout_at = ns[:timeout_at] ||= now + @max_seconds
42
-
43
- if timeout_at < now
44
- on_timeout(parent_type, parent_object, field_definition, field_args, query_context)
45
- else
46
- yield
47
- end
48
- end
49
-
50
- # This is called when a field _would_ be resolved, except that we're over the time limit.
51
- # @return [GraphQL::Schema::TimeoutMiddleware::TimeoutError] An error whose message will be added to the `errors` key
52
- def on_timeout(parent_type, parent_object, field_definition, field_args, field_context)
53
- err = GraphQL::Schema::TimeoutMiddleware::TimeoutError.new(parent_type, field_definition)
54
- if @error_handler
55
- query_proxy = TimeoutQueryProxy.new(field_context.query, field_context)
56
- @error_handler.call(err, query_proxy)
57
- end
58
- err
59
- end
60
-
61
- # This behaves like {GraphQL::Query} but {#context} returns
62
- # the _field-level_ context, not the query-level context.
63
- # This means you can reliably get the `irep_node` and `path`
64
- # from it after the fact.
65
- class TimeoutQueryProxy < SimpleDelegator
66
- def initialize(query, ctx)
67
- @context = ctx
68
- super(query)
69
- end
70
-
71
- attr_reader :context
72
- end
73
-
74
- # This error is raised when a query exceeds `max_seconds`.
75
- # Since it's a child of {GraphQL::ExecutionError},
76
- # its message will be added to the response's `errors` key.
77
- #
78
- # To raise an error that will stop query resolution, use a custom block
79
- # to take this error and raise a new one which _doesn't_ descend from {GraphQL::ExecutionError},
80
- # such as `RuntimeError`.
81
- class TimeoutError < GraphQL::ExecutionError
82
- def initialize(parent_type, field_defn)
83
- super("Timeout on #{parent_type.name}.#{field_defn.name}")
84
- end
85
- end
86
- end
87
- end
88
- end