graphql 2.6.9 → 2.6.14

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.
Files changed (382) hide show
  1. checksums.yaml +4 -4
  2. data/.rdoc_options +4 -0
  3. data/lib/generators/graphql/core.rb +1 -0
  4. data/lib/generators/graphql/detailed_trace_generator.rb +1 -0
  5. data/lib/generators/graphql/enum_generator.rb +1 -0
  6. data/lib/generators/graphql/field_extractor.rb +1 -0
  7. data/lib/generators/graphql/input_generator.rb +1 -0
  8. data/lib/generators/graphql/install/mutation_root_generator.rb +1 -0
  9. data/lib/generators/graphql/install_generator.rb +1 -0
  10. data/lib/generators/graphql/interface_generator.rb +1 -0
  11. data/lib/generators/graphql/loader_generator.rb +8 -2
  12. data/lib/generators/graphql/mutation_create_generator.rb +8 -2
  13. data/lib/generators/graphql/mutation_delete_generator.rb +8 -2
  14. data/lib/generators/graphql/mutation_generator.rb +8 -2
  15. data/lib/generators/graphql/mutation_update_generator.rb +8 -2
  16. data/lib/generators/graphql/object_generator.rb +1 -0
  17. data/lib/generators/graphql/orm_mutations_base.rb +8 -2
  18. data/lib/generators/graphql/relay.rb +1 -0
  19. data/lib/generators/graphql/relay_generator.rb +1 -0
  20. data/lib/generators/graphql/scalar_generator.rb +1 -0
  21. data/lib/generators/graphql/type_generator.rb +38 -8
  22. data/lib/generators/graphql/union_generator.rb +1 -0
  23. data/lib/graphql/analysis/analyzer.rb +35 -9
  24. data/lib/graphql/analysis/field_usage.rb +1 -0
  25. data/lib/graphql/analysis/max_query_complexity.rb +3 -2
  26. data/lib/graphql/analysis/max_query_depth.rb +1 -0
  27. data/lib/graphql/analysis/query_complexity.rb +57 -20
  28. data/lib/graphql/analysis/query_depth.rb +17 -12
  29. data/lib/graphql/analysis/visitor.rb +79 -16
  30. data/lib/graphql/analysis.rb +23 -6
  31. data/lib/graphql/analysis_error.rb +1 -0
  32. data/lib/graphql/autoload.rb +30 -7
  33. data/lib/graphql/backtrace/table.rb +21 -5
  34. data/lib/graphql/backtrace/traced_error.rb +8 -3
  35. data/lib/graphql/backtrace.rb +14 -9
  36. data/lib/graphql/coercion_error.rb +1 -0
  37. data/lib/graphql/current.rb +44 -19
  38. data/lib/graphql/dashboard/application_controller.rb +1 -0
  39. data/lib/graphql/dashboard/detailed_traces.rb +1 -0
  40. data/lib/graphql/dashboard/installable.rb +1 -0
  41. data/lib/graphql/dashboard/landings_controller.rb +1 -0
  42. data/lib/graphql/dashboard/limiters.rb +1 -0
  43. data/lib/graphql/dashboard/operation_store.rb +1 -0
  44. data/lib/graphql/dashboard/statics_controller.rb +1 -0
  45. data/lib/graphql/dashboard/subscriptions.rb +1 -0
  46. data/lib/graphql/dashboard.rb +36 -22
  47. data/lib/graphql/dataloader/active_record_association_source.rb +1 -0
  48. data/lib/graphql/dataloader/active_record_source.rb +1 -0
  49. data/lib/graphql/dataloader/async_dataloader.rb +45 -16
  50. data/lib/graphql/dataloader/null_dataloader.rb +4 -3
  51. data/lib/graphql/dataloader/request.rb +8 -2
  52. data/lib/graphql/dataloader/request_all.rb +8 -2
  53. data/lib/graphql/dataloader/source.rb +127 -35
  54. data/lib/graphql/dataloader.rb +98 -44
  55. data/lib/graphql/date_encoding_error.rb +2 -1
  56. data/lib/graphql/dig.rb +12 -3
  57. data/lib/graphql/duration_encoding_error.rb +2 -1
  58. data/lib/graphql/execution/directive_checks.rb +8 -3
  59. data/lib/graphql/execution/errors.rb +20 -6
  60. data/lib/graphql/execution/field_resolve_step.rb +288 -168
  61. data/lib/graphql/execution/finalize.rb +12 -6
  62. data/lib/graphql/execution/input_values.rb +5 -2
  63. data/lib/graphql/execution/interpreter/argument_value.rb +17 -5
  64. data/lib/graphql/execution/interpreter/arguments.rb +24 -9
  65. data/lib/graphql/execution/interpreter/arguments_cache.rb +2 -1
  66. data/lib/graphql/execution/interpreter/execution_errors.rb +1 -0
  67. data/lib/graphql/execution/interpreter/handles_raw_value.rb +1 -0
  68. data/lib/graphql/execution/interpreter/resolve.rb +18 -8
  69. data/lib/graphql/execution/interpreter/runtime/graphql_result.rb +4 -1
  70. data/lib/graphql/execution/interpreter/runtime.rb +72 -25
  71. data/lib/graphql/execution/interpreter.rb +18 -7
  72. data/lib/graphql/execution/lazy/lazy_method_map.rb +21 -8
  73. data/lib/graphql/execution/lazy.rb +34 -10
  74. data/lib/graphql/execution/load_argument_step.rb +1 -0
  75. data/lib/graphql/execution/lookahead.rb +137 -54
  76. data/lib/graphql/execution/multiplex.rb +4 -4
  77. data/lib/graphql/execution/next.rb +7 -0
  78. data/lib/graphql/execution/prepare_object_step.rb +38 -13
  79. data/lib/graphql/execution/resolve_type_step.rb +2 -1
  80. data/lib/graphql/execution/runner.rb +32 -15
  81. data/lib/graphql/execution/selections_step.rb +3 -2
  82. data/lib/graphql/execution.rb +2 -2
  83. data/lib/graphql/execution_error.rb +19 -10
  84. data/lib/graphql/float_decoding_error.rb +14 -0
  85. data/lib/graphql/float_encoding_error.rb +33 -0
  86. data/lib/graphql/integer_decoding_error.rb +2 -1
  87. data/lib/graphql/integer_encoding_error.rb +8 -3
  88. data/lib/graphql/introspection/base_object.rb +3 -1
  89. data/lib/graphql/introspection/directive_location_enum.rb +1 -0
  90. data/lib/graphql/introspection/directive_type.rb +1 -0
  91. data/lib/graphql/introspection/dynamic_fields.rb +1 -0
  92. data/lib/graphql/introspection/entry_points.rb +1 -0
  93. data/lib/graphql/introspection/enum_value_type.rb +1 -0
  94. data/lib/graphql/introspection/field_type.rb +1 -0
  95. data/lib/graphql/introspection/input_value_type.rb +1 -0
  96. data/lib/graphql/introspection/introspection_query.rb +1 -0
  97. data/lib/graphql/introspection/schema_type.rb +1 -0
  98. data/lib/graphql/introspection/type_kind_enum.rb +1 -0
  99. data/lib/graphql/introspection/type_type.rb +1 -0
  100. data/lib/graphql/introspection.rb +1 -0
  101. data/lib/graphql/invalid_name_error.rb +1 -0
  102. data/lib/graphql/invalid_null_error.rb +19 -6
  103. data/lib/graphql/language/block_string.rb +2 -1
  104. data/lib/graphql/language/cache.rb +10 -4
  105. data/lib/graphql/language/comment.rb +1 -0
  106. data/lib/graphql/language/definition_slice.rb +1 -0
  107. data/lib/graphql/language/document_from_schema_definition.rb +9 -10
  108. data/lib/graphql/language/generation.rb +23 -9
  109. data/lib/graphql/language/lexer.rb +16 -8
  110. data/lib/graphql/language/nodes.rb +2094 -419
  111. data/lib/graphql/language/parser.rb +29 -18
  112. data/lib/graphql/language/printer.rb +31 -16
  113. data/lib/graphql/language/sanitized_printer.rb +16 -5
  114. data/lib/graphql/language/static_visitor.rb +19 -4
  115. data/lib/graphql/language/visitor.rb +51 -29
  116. data/lib/graphql/language.rb +15 -9
  117. data/lib/graphql/load_application_object_failed_error.rb +14 -5
  118. data/lib/graphql/name_validator.rb +1 -0
  119. data/lib/graphql/pagination/active_record_relation_connection.rb +1 -0
  120. data/lib/graphql/pagination/array_connection.rb +24 -6
  121. data/lib/graphql/pagination/connection.rb +178 -48
  122. data/lib/graphql/pagination/connections.rb +21 -14
  123. data/lib/graphql/pagination/mongoid_relation_connection.rb +1 -0
  124. data/lib/graphql/pagination/relation_connection.rb +164 -27
  125. data/lib/graphql/pagination/sequel_dataset_connection.rb +1 -0
  126. data/lib/graphql/pagination.rb +1 -0
  127. data/lib/graphql/parse_error.rb +1 -0
  128. data/lib/graphql/query/context/scoped_context.rb +2 -1
  129. data/lib/graphql/query/context.rb +106 -35
  130. data/lib/graphql/query/fingerprint.rb +15 -7
  131. data/lib/graphql/query/input_validation_result.rb +1 -0
  132. data/lib/graphql/query/null_context.rb +1 -0
  133. data/lib/graphql/query/partial.rb +28 -16
  134. data/lib/graphql/query/result.rb +15 -5
  135. data/lib/graphql/query/validation_pipeline.rb +16 -6
  136. data/lib/graphql/query/variable_validation_error.rb +17 -1
  137. data/lib/graphql/query/variables.rb +9 -2
  138. data/lib/graphql/query.rb +195 -50
  139. data/lib/graphql/railtie.rb +7 -3
  140. data/lib/graphql/rake_task/validate.rb +72 -17
  141. data/lib/graphql/rake_task.rb +55 -23
  142. data/lib/graphql/relay/range_add.rb +32 -21
  143. data/lib/graphql/relay.rb +1 -0
  144. data/lib/graphql/rubocop/graphql/base_cop.rb +1 -0
  145. data/lib/graphql/rubocop/graphql/default_null_true.rb +9 -6
  146. data/lib/graphql/rubocop/graphql/default_required_true.rb +9 -6
  147. data/lib/graphql/rubocop/graphql/field_type_in_block.rb +12 -8
  148. data/lib/graphql/rubocop/graphql/root_types_in_block.rb +9 -5
  149. data/lib/graphql/rubocop.rb +1 -0
  150. data/lib/graphql/runtime_error.rb +1 -0
  151. data/lib/graphql/runtime_type_error.rb +1 -0
  152. data/lib/graphql/schema/addition.rb +69 -50
  153. data/lib/graphql/schema/always_visible.rb +1 -0
  154. data/lib/graphql/schema/argument.rb +279 -45
  155. data/lib/graphql/schema/base_64_encoder.rb +2 -2
  156. data/lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb +1 -0
  157. data/lib/graphql/schema/build_from_definition/resolve_map.rb +2 -2
  158. data/lib/graphql/schema/build_from_definition.rb +507 -178
  159. data/lib/graphql/schema/built_in_types.rb +1 -0
  160. data/lib/graphql/schema/directive/deprecated.rb +1 -0
  161. data/lib/graphql/schema/directive/feature.rb +39 -22
  162. data/lib/graphql/schema/directive/flagged.rb +6 -1
  163. data/lib/graphql/schema/directive/include.rb +1 -0
  164. data/lib/graphql/schema/directive/one_of.rb +1 -0
  165. data/lib/graphql/schema/directive/skip.rb +1 -0
  166. data/lib/graphql/schema/directive/specified_by.rb +1 -0
  167. data/lib/graphql/schema/directive/transform.rb +17 -8
  168. data/lib/graphql/schema/directive.rb +33 -7
  169. data/lib/graphql/schema/enum.rb +99 -38
  170. data/lib/graphql/schema/enum_value.rb +21 -13
  171. data/lib/graphql/schema/field/connection_extension.rb +10 -2
  172. data/lib/graphql/schema/field/scope_extension.rb +1 -0
  173. data/lib/graphql/schema/field.rb +622 -110
  174. data/lib/graphql/schema/field_extension.rb +89 -34
  175. data/lib/graphql/schema/find_inherited_value.rb +5 -3
  176. data/lib/graphql/schema/finder.rb +22 -8
  177. data/lib/graphql/schema/has_single_input_argument.rb +39 -6
  178. data/lib/graphql/schema/input_object.rb +40 -13
  179. data/lib/graphql/schema/interface.rb +33 -17
  180. data/lib/graphql/schema/introspection_system.rb +7 -3
  181. data/lib/graphql/schema/late_bound_type.rb +2 -2
  182. data/lib/graphql/schema/list.rb +15 -4
  183. data/lib/graphql/schema/loader.rb +23 -12
  184. data/lib/graphql/schema/member/base_dsl_methods.rb +58 -12
  185. data/lib/graphql/schema/member/build_type.rb +21 -7
  186. data/lib/graphql/schema/member/graphql_type_names.rb +10 -6
  187. data/lib/graphql/schema/member/has_arguments.rb +112 -49
  188. data/lib/graphql/schema/member/has_ast_node.rb +1 -0
  189. data/lib/graphql/schema/member/has_authorization.rb +5 -0
  190. data/lib/graphql/schema/member/has_dataloader.rb +91 -34
  191. data/lib/graphql/schema/member/has_deprecation_reason.rb +15 -2
  192. data/lib/graphql/schema/member/has_directives.rb +45 -11
  193. data/lib/graphql/schema/member/has_fields.rb +151 -70
  194. data/lib/graphql/schema/member/has_interfaces.rb +8 -2
  195. data/lib/graphql/schema/member/has_path.rb +14 -5
  196. data/lib/graphql/schema/member/has_unresolved_type_error.rb +1 -0
  197. data/lib/graphql/schema/member/has_validators.rb +19 -4
  198. data/lib/graphql/schema/member/relay_shortcuts.rb +10 -2
  199. data/lib/graphql/schema/member/scoped.rb +14 -3
  200. data/lib/graphql/schema/member/type_system_helpers.rb +36 -6
  201. data/lib/graphql/schema/member/validates_input.rb +1 -0
  202. data/lib/graphql/schema/member.rb +9 -2
  203. data/lib/graphql/schema/mutation.rb +50 -46
  204. data/lib/graphql/schema/non_null.rb +21 -5
  205. data/lib/graphql/schema/object.rb +44 -15
  206. data/lib/graphql/schema/printer.rb +52 -31
  207. data/lib/graphql/schema/ractor_shareable.rb +6 -2
  208. data/lib/graphql/schema/relay_classic_mutation.rb +3 -3
  209. data/lib/graphql/schema/resolver/has_payload_type.rb +29 -7
  210. data/lib/graphql/schema/resolver.rb +156 -45
  211. data/lib/graphql/schema/scalar.rb +1 -0
  212. data/lib/graphql/schema/subscription.rb +67 -28
  213. data/lib/graphql/schema/timeout.rb +65 -25
  214. data/lib/graphql/schema/type_expression.rb +14 -5
  215. data/lib/graphql/schema/type_membership.rb +29 -10
  216. data/lib/graphql/schema/union.rb +4 -2
  217. data/lib/graphql/schema/unique_within_type.rb +24 -5
  218. data/lib/graphql/schema/validator/all_validator.rb +17 -9
  219. data/lib/graphql/schema/validator/allow_blank_validator.rb +8 -2
  220. data/lib/graphql/schema/validator/allow_null_validator.rb +8 -2
  221. data/lib/graphql/schema/validator/exclusion_validator.rb +14 -5
  222. data/lib/graphql/schema/validator/format_validator.rb +21 -10
  223. data/lib/graphql/schema/validator/inclusion_validator.rb +15 -6
  224. data/lib/graphql/schema/validator/length_validator.rb +23 -12
  225. data/lib/graphql/schema/validator/numericality_validator.rb +29 -16
  226. data/lib/graphql/schema/validator/required_validator.rb +45 -31
  227. data/lib/graphql/schema/validator.rb +89 -25
  228. data/lib/graphql/schema/visibility/migration.rb +14 -7
  229. data/lib/graphql/schema/visibility/profile.rb +73 -19
  230. data/lib/graphql/schema/visibility/visit.rb +12 -10
  231. data/lib/graphql/schema/visibility.rb +24 -20
  232. data/lib/graphql/schema/warden.rb +117 -31
  233. data/lib/graphql/schema/wrapper.rb +4 -1
  234. data/lib/graphql/schema.rb +1052 -304
  235. data/lib/graphql/static_validation/all_rules.rb +2 -1
  236. data/lib/graphql/static_validation/base_visitor.rb +59 -9
  237. data/lib/graphql/static_validation/definition_dependencies.rb +27 -7
  238. data/lib/graphql/static_validation/error.rb +3 -0
  239. data/lib/graphql/static_validation/interpreter_visitor.rb +1 -0
  240. data/lib/graphql/static_validation/literal_validator.rb +1 -0
  241. data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +4 -0
  242. data/lib/graphql/static_validation/rules/argument_literals_are_compatible_error.rb +1 -0
  243. data/lib/graphql/static_validation/rules/argument_names_are_unique.rb +3 -0
  244. data/lib/graphql/static_validation/rules/argument_names_are_unique_error.rb +1 -0
  245. data/lib/graphql/static_validation/rules/arguments_are_defined.rb +3 -0
  246. data/lib/graphql/static_validation/rules/arguments_are_defined_error.rb +1 -0
  247. data/lib/graphql/static_validation/rules/directives_are_defined.rb +3 -0
  248. data/lib/graphql/static_validation/rules/directives_are_defined_error.rb +1 -0
  249. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +3 -0
  250. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations_error.rb +1 -0
  251. data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +3 -0
  252. data/lib/graphql/static_validation/rules/fields_are_defined_on_type_error.rb +1 -0
  253. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +9 -1
  254. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections_error.rb +1 -0
  255. data/lib/graphql/static_validation/rules/fields_will_merge.rb +355 -157
  256. data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +14 -2
  257. data/lib/graphql/static_validation/rules/fragment_names_are_unique.rb +3 -0
  258. data/lib/graphql/static_validation/rules/fragment_names_are_unique_error.rb +1 -0
  259. data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +3 -0
  260. data/lib/graphql/static_validation/rules/fragment_spreads_are_possible_error.rb +1 -0
  261. data/lib/graphql/static_validation/rules/fragment_types_exist.rb +3 -0
  262. data/lib/graphql/static_validation/rules/fragment_types_exist_error.rb +1 -0
  263. data/lib/graphql/static_validation/rules/fragments_are_finite.rb +3 -0
  264. data/lib/graphql/static_validation/rules/fragments_are_finite_error.rb +1 -0
  265. data/lib/graphql/static_validation/rules/fragments_are_named.rb +3 -0
  266. data/lib/graphql/static_validation/rules/fragments_are_named_error.rb +1 -0
  267. data/lib/graphql/static_validation/rules/fragments_are_on_composite_types.rb +3 -0
  268. data/lib/graphql/static_validation/rules/fragments_are_on_composite_types_error.rb +1 -0
  269. data/lib/graphql/static_validation/rules/fragments_are_used.rb +3 -0
  270. data/lib/graphql/static_validation/rules/fragments_are_used_error.rb +1 -0
  271. data/lib/graphql/static_validation/rules/input_object_names_are_unique.rb +3 -0
  272. data/lib/graphql/static_validation/rules/input_object_names_are_unique_error.rb +1 -0
  273. data/lib/graphql/static_validation/rules/mutation_root_exists.rb +3 -0
  274. data/lib/graphql/static_validation/rules/mutation_root_exists_error.rb +1 -0
  275. data/lib/graphql/static_validation/rules/no_definitions_are_present.rb +3 -0
  276. data/lib/graphql/static_validation/rules/no_definitions_are_present_error.rb +1 -0
  277. data/lib/graphql/static_validation/rules/not_single_subscription_error.rb +1 -0
  278. data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid.rb +4 -0
  279. data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid_error.rb +1 -0
  280. data/lib/graphql/static_validation/rules/operation_names_are_valid.rb +3 -0
  281. data/lib/graphql/static_validation/rules/operation_names_are_valid_error.rb +1 -0
  282. data/lib/graphql/static_validation/rules/query_root_exists.rb +3 -0
  283. data/lib/graphql/static_validation/rules/query_root_exists_error.rb +1 -0
  284. data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +4 -1
  285. data/lib/graphql/static_validation/rules/required_arguments_are_present_error.rb +1 -0
  286. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +4 -0
  287. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present_error.rb +1 -0
  288. data/lib/graphql/static_validation/rules/subscription_root_exists_and_single_subscription_selection.rb +43 -5
  289. data/lib/graphql/static_validation/rules/subscription_root_exists_error.rb +1 -0
  290. data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +3 -0
  291. data/lib/graphql/static_validation/rules/unique_directives_per_location_error.rb +1 -0
  292. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +3 -0
  293. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed_error.rb +1 -0
  294. data/lib/graphql/static_validation/rules/variable_names_are_unique.rb +3 -0
  295. data/lib/graphql/static_validation/rules/variable_names_are_unique_error.rb +1 -0
  296. data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +207 -51
  297. data/lib/graphql/static_validation/rules/variable_usages_are_allowed_error.rb +1 -0
  298. data/lib/graphql/static_validation/rules/variables_are_input_types.rb +3 -0
  299. data/lib/graphql/static_validation/rules/variables_are_input_types_error.rb +1 -0
  300. data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +6 -3
  301. data/lib/graphql/static_validation/rules/variables_are_used_and_defined_error.rb +1 -0
  302. data/lib/graphql/static_validation/validation_context.rb +3 -2
  303. data/lib/graphql/static_validation/validation_timeout_error.rb +1 -0
  304. data/lib/graphql/static_validation/validator.rb +41 -16
  305. data/lib/graphql/static_validation.rb +1 -0
  306. data/lib/graphql/string_encoding_error.rb +1 -0
  307. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +85 -65
  308. data/lib/graphql/subscriptions/broadcast_analyzer.rb +10 -4
  309. data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +1 -0
  310. data/lib/graphql/subscriptions/event.rb +25 -6
  311. data/lib/graphql/subscriptions/serialize.rb +89 -23
  312. data/lib/graphql/subscriptions.rb +172 -46
  313. data/lib/graphql/testing/helpers.rb +17 -4
  314. data/lib/graphql/testing/mock_action_cable.rb +55 -33
  315. data/lib/graphql/testing.rb +1 -0
  316. data/lib/graphql/tracing/active_support_notifications_trace.rb +17 -9
  317. data/lib/graphql/tracing/active_support_notifications_tracing.rb +2 -1
  318. data/lib/graphql/tracing/appoptics_trace.rb +2 -1
  319. data/lib/graphql/tracing/appoptics_tracing.rb +2 -1
  320. data/lib/graphql/tracing/appsignal_trace.rb +16 -7
  321. data/lib/graphql/tracing/appsignal_tracing.rb +7 -3
  322. data/lib/graphql/tracing/call_legacy_tracers.rb +1 -0
  323. data/lib/graphql/tracing/data_dog_trace.rb +17 -6
  324. data/lib/graphql/tracing/data_dog_tracing.rb +10 -3
  325. data/lib/graphql/tracing/detailed_trace/active_record_backend.rb +1 -0
  326. data/lib/graphql/tracing/detailed_trace/memory_backend.rb +1 -0
  327. data/lib/graphql/tracing/detailed_trace/redis_backend.rb +1 -0
  328. data/lib/graphql/tracing/detailed_trace.rb +105 -42
  329. data/lib/graphql/tracing/legacy_hooks_trace.rb +5 -0
  330. data/lib/graphql/tracing/legacy_trace.rb +1 -0
  331. data/lib/graphql/tracing/monitor_trace.rb +17 -11
  332. data/lib/graphql/tracing/new_relic_trace.rb +17 -8
  333. data/lib/graphql/tracing/new_relic_tracing.rb +7 -3
  334. data/lib/graphql/tracing/notifications_trace.rb +11 -8
  335. data/lib/graphql/tracing/notifications_tracing.rb +23 -7
  336. data/lib/graphql/tracing/null_trace.rb +1 -0
  337. data/lib/graphql/tracing/perfetto_trace/trace_pb.rb +1 -0
  338. data/lib/graphql/tracing/perfetto_trace.rb +41 -19
  339. data/lib/graphql/tracing/platform_trace.rb +3 -1
  340. data/lib/graphql/tracing/platform_tracing.rb +16 -7
  341. data/lib/graphql/tracing/prometheus_trace/graphql_collector.rb +1 -0
  342. data/lib/graphql/tracing/prometheus_trace.rb +22 -13
  343. data/lib/graphql/tracing/prometheus_tracing.rb +1 -0
  344. data/lib/graphql/tracing/scout_trace.rb +10 -4
  345. data/lib/graphql/tracing/scout_tracing.rb +7 -3
  346. data/lib/graphql/tracing/sentry_trace.rb +25 -6
  347. data/lib/graphql/tracing/statsd_trace.rb +12 -6
  348. data/lib/graphql/tracing/statsd_tracing.rb +7 -1
  349. data/lib/graphql/tracing/trace.rb +231 -58
  350. data/lib/graphql/tracing.rb +25 -9
  351. data/lib/graphql/type_kinds.rb +2 -1
  352. data/lib/graphql/types/big_int.rb +1 -0
  353. data/lib/graphql/types/boolean.rb +1 -0
  354. data/lib/graphql/types/float.rb +19 -4
  355. data/lib/graphql/types/id.rb +1 -0
  356. data/lib/graphql/types/int.rb +2 -1
  357. data/lib/graphql/types/iso_8601_date.rb +21 -4
  358. data/lib/graphql/types/iso_8601_date_time.rb +33 -6
  359. data/lib/graphql/types/iso_8601_duration.rb +42 -9
  360. data/lib/graphql/types/json.rb +1 -0
  361. data/lib/graphql/types/relay/base_connection.rb +38 -32
  362. data/lib/graphql/types/relay/base_edge.rb +15 -9
  363. data/lib/graphql/types/relay/connection_behaviors.rb +19 -3
  364. data/lib/graphql/types/relay/edge_behaviors.rb +17 -4
  365. data/lib/graphql/types/relay/has_node_field.rb +6 -1
  366. data/lib/graphql/types/relay/has_nodes_field.rb +6 -1
  367. data/lib/graphql/types/relay/node.rb +1 -0
  368. data/lib/graphql/types/relay/node_behaviors.rb +5 -1
  369. data/lib/graphql/types/relay/page_info.rb +1 -0
  370. data/lib/graphql/types/relay/page_info_behaviors.rb +1 -0
  371. data/lib/graphql/types/relay.rb +4 -3
  372. data/lib/graphql/types/string.rb +1 -0
  373. data/lib/graphql/types.rb +1 -0
  374. data/lib/graphql/unauthorized_enum_value_error.rb +4 -1
  375. data/lib/graphql/unauthorized_error.rb +11 -4
  376. data/lib/graphql/unauthorized_field_error.rb +4 -1
  377. data/lib/graphql/unresolved_type_error.rb +16 -5
  378. data/lib/graphql/version.rb +2 -1
  379. data/lib/graphql.rb +39 -9
  380. data/readme.md +1 -1
  381. metadata +91 -5
  382. data/.yardopts +0 -5
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
 
3
4
  module GraphQL
4
5
  class Dataloader
@@ -23,8 +24,7 @@ module GraphQL
23
24
  create_pending_run
24
25
  end
25
26
 
26
- # @api private
27
- attr_reader :pending_sources
27
+ attr_reader :pending_sources # :nodoc:
28
28
 
29
29
  def create_pending_run
30
30
  jobs_fiber_limit, total_fiber_limit = calculate_fiber_limit
@@ -36,10 +36,14 @@ module GraphQL
36
36
  run = task.graphql_async_dataloader_run
37
37
  trace = run.trace
38
38
  trace&.dataloader_fiber_yield(source)
39
- run.tasks_channel.push([:paused_task, task])
39
+ if !run.push_task_message(:paused_task, task)
40
+ task.stop
41
+ end
40
42
  condition = task.graphql_async_dataloader_condition
41
43
  condition.wait
42
- run.tasks_channel.push([:resumed_task, task])
44
+ if !run.push_task_message(:resumed_task, task)
45
+ task.stop
46
+ end
43
47
  trace&.dataloader_fiber_resume(source)
44
48
  nil
45
49
  end
@@ -69,7 +73,7 @@ module GraphQL
69
73
 
70
74
  attr_accessor :trace, :root_task
71
75
 
72
- attr_reader :jobs, :lazies_at_depth, :jobs_fiber_limit, :snoozed_jobs_condition, :snoozed_sources_condition, :tasks_channel
76
+ attr_reader :dataloader, :jobs, :lazies_at_depth, :jobs_fiber_limit, :snoozed_jobs_condition, :snoozed_sources_condition
73
77
 
74
78
  def jobs_bandwidth?
75
79
  running_count < @jobs_fiber_limit
@@ -84,6 +88,20 @@ module GraphQL
84
88
  @tasks_channel_task.cancel
85
89
  end
86
90
 
91
+ # Push to the tasks_channel, tolerating a closed channel: on the error path, `run_queue`
92
+ # closes the channel while sibling tasks can still run one more slice before
93
+ # `root_task.cancel` reaches them. Record `:task_error` payloads so they aren't lost, and
94
+ # return false so the caller can stop the task instead of raising `ClosedError` into user code.
95
+ def push_task_message(msg, data)
96
+ @tasks_channel.push([msg, data])
97
+ true
98
+ rescue Async::Queue::ClosedError
99
+ if msg == :task_error
100
+ @task_error ||= data
101
+ end
102
+ false
103
+ end
104
+
87
105
  def wait_for_activity
88
106
  @activity.wait
89
107
  end
@@ -175,12 +193,20 @@ module GraphQL
175
193
  end
176
194
 
177
195
  def active_run
178
- @pending_run || Async::Task.current?&.graphql_async_dataloader_run || raise(GraphQL::Error, "No available Run to append to, GraphQL-Ruby bug")
196
+ @pending_run || current_task_run || raise(GraphQL::Error, "No available Run to append to, GraphQL-Ruby bug")
197
+ end
198
+
199
+ # The current task's run, but only if it belongs to this dataloader. A different
200
+ # dataloader may be running inside one of our tasks (or vice versa), e.g. a query
201
+ # executed from a resolver or a subscription trigger; its run must not be reused.
202
+ def current_task_run
203
+ run = Async::Task.current?&.graphql_async_dataloader_run
204
+ run if run&.dataloader.equal?(self)
179
205
  end
180
206
 
181
207
  def run_isolated
182
- previous_run = Async::Task.current?&.graphql_async_dataloader_run
183
- prev_pending_keys = {}
208
+ previous_run = current_task_run
209
+ prev_pending_keys = {} #: Hash[GraphQL::Dataloader::Source, Hash[untyped, untyped]]
184
210
  # Clear pending loads but keep already-cached records
185
211
  # in case they are useful to the given block.
186
212
  @source_cache.each do |source_class, batched_sources|
@@ -192,7 +218,7 @@ module GraphQL
192
218
  end
193
219
  end
194
220
 
195
- res = nil
221
+ res = nil #: untyped
196
222
  create_pending_run
197
223
  @pending_run.jobs << -> { res = yield }
198
224
  run
@@ -203,6 +229,7 @@ module GraphQL
203
229
  # clear the one created in #run:
204
230
  @pending_run = nil
205
231
  end
232
+ prev_pending_keys = prev_pending_keys #: as !nil
206
233
  prev_pending_keys.each do |source_instance, pending|
207
234
  pending.each do |key, value|
208
235
  next if source_instance.results.key?(key)
@@ -215,19 +242,21 @@ module GraphQL
215
242
 
216
243
  def run(trace_query_lazy: nil)
217
244
  trace = Fiber[:__graphql_current_multiplex]&.current_trace
218
- run = @pending_run || Async::Task.current?&.graphql_async_dataloader_run || raise(GraphQL::Error, "No available Run, GraphQL-Ruby internal bug")
245
+ run = @pending_run || current_task_run || raise(GraphQL::Error, "No available Run, GraphQL-Ruby internal bug")
219
246
  @pending_run = nil
220
247
  run.trace = trace
221
- first_pass = true
248
+ first_pass = true #: bool
222
249
  trace&.begin_dataloader(self)
223
250
  fiber_vars = get_fiber_variables
224
- raised_error = nil
251
+ raised_error = nil #: StandardError?
225
252
  jobs = run.jobs
226
253
  Sync do |_maybe_new_task|
227
254
  # Make sure there's a new task instance to hold `.graphql_...` state:
228
255
  task = Async::Task.new do |root_task|
229
256
  run.root_task = root_task
230
257
  root_task.graphql_async_dataloader_run = run
258
+ # Tasks inherit the spawning fiber's storage; give this run its own execution state.
259
+ Fiber[:__graphql_runtime_info] = nil
231
260
  set_fiber_variables(fiber_vars)
232
261
 
233
262
  while first_pass || run.running? || !jobs.empty?
@@ -263,7 +292,7 @@ module GraphQL
263
292
  private
264
293
 
265
294
  def run_queue(run, condition, mode)
266
- opened_queues = false
295
+ opened_queues = false #: bool
267
296
 
268
297
  if condition.waiting?
269
298
  opened_queues = true
@@ -336,14 +365,14 @@ module GraphQL
336
365
  end
337
366
  nil
338
367
  rescue StandardError => err
339
- run.tasks_channel.push([:task_error, err])
368
+ run.push_task_message(:task_error, err)
340
369
  else
341
- run.tasks_channel.push([:finished_task, task])
370
+ run.push_task_message(:finished_task, task)
342
371
  ensure
343
372
  cleanup_fiber
344
373
  trace&.dataloader_fiber_exit
345
374
  end
346
- run.tasks_channel.push([:started_task, new_task])
375
+ run.push_task_message(:started_task, new_task)
347
376
  end
348
377
  end
349
378
  end
@@ -1,11 +1,12 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
 
3
4
  module GraphQL
4
5
  class Dataloader
5
6
  # GraphQL-Ruby uses this when Dataloader isn't enabled.
6
7
  #
7
8
  # It runs execution code inline and gathers lazy objects (eg. Promises)
8
- # and resolves them during {#run}.
9
+ # and resolves them during [run](rdoc-ref:#run).
9
10
  class NullDataloader < Dataloader
10
11
  def initialize(*)
11
12
  @lazies_at_depth = Hash.new { |h,k| h[k] = [] }
@@ -20,7 +21,7 @@ module GraphQL
20
21
  def run(trace_query_lazy: nil)
21
22
  with_trace_query_lazy(trace_query_lazy) do
22
23
  while !@lazies_at_depth.empty?
23
- smallest_depth = nil
24
+ smallest_depth = nil #: Integer?
24
25
  @lazies_at_depth.each_key do |depth_key|
25
26
  smallest_depth ||= depth_key
26
27
  if depth_key < smallest_depth
@@ -40,7 +41,7 @@ module GraphQL
40
41
  # Reuse this instance because execution code may already have a reference to _this_ `dataloader` inside the given block.
41
42
  prev_lazies_at_depth = @lazies_at_depth
42
43
  @lazies_at_depth = @lazies_at_depth.dup.clear
43
- res = nil
44
+ res = nil #: untyped
44
45
  append_job {
45
46
  res = yield
46
47
  }
@@ -1,7 +1,8 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
  module GraphQL
3
4
  class Dataloader
4
- # @see Source#request which returns an instance of this
5
+ # See [Source#request](rdoc-ref:Source#request) which returns an instance of this
5
6
  class Request
6
7
  def initialize(source, key)
7
8
  @source = source
@@ -10,7 +11,12 @@ module GraphQL
10
11
 
11
12
  # Call this method to cause the current Fiber to wait for the results of this request.
12
13
  #
13
- # @return [Object] the object loaded for `key`
14
+ # **Returns**
15
+ #
16
+ # - `Object` — the object loaded for `key`
17
+ #
18
+ # :call-seq:
19
+ # load() -> Object
14
20
  def load
15
21
  @source.load(@key)
16
22
  end
@@ -1,7 +1,8 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
  module GraphQL
3
4
  class Dataloader
4
- # @see Source#request_all which returns an instance of this.
5
+ # See [Source#request_all](rdoc-ref:Source#request_all) which returns an instance of this.
5
6
  class RequestAll < Request
6
7
  def initialize(source, keys)
7
8
  @source = source
@@ -10,7 +11,12 @@ module GraphQL
10
11
 
11
12
  # Call this method to cause the current Fiber to wait for the results of this request.
12
13
  #
13
- # @return [Array<Object>] One object for each of `keys`
14
+ # **Returns**
15
+ #
16
+ # - `Array<Object>` — One object for each of `keys`
17
+ #
18
+ # :call-seq:
19
+ # load() -> Array[Object]
14
20
  def load
15
21
  @source.load_all(@keys)
16
22
  end
@@ -1,11 +1,11 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
 
3
4
  module GraphQL
4
5
  class Dataloader
5
6
  class Source
6
- # Called by {Dataloader} to prepare the {Source}'s internal state
7
- # @api private
8
- def setup(dataloader)
7
+ # Called by [Dataloader](rdoc-ref:Dataloader) to prepare the [Source](rdoc-ref:Source)'s internal state
8
+ def setup(dataloader) # :nodoc:
9
9
  # These keys have been requested but haven't been fetched yet
10
10
  @pending = {}
11
11
  # These keys have been passed to `fetch` but haven't been finished yet
@@ -17,7 +17,12 @@ module GraphQL
17
17
 
18
18
  attr_reader :dataloader
19
19
 
20
- # @return [Dataloader::Request] a pending request for a value from `key`. Call `.load` on that object to wait for the result.
20
+ # **Returns**
21
+ #
22
+ # - `Dataloader::Request` — a pending request for a value from `key`. Call `.load` on that object to wait for the result.
23
+ #
24
+ # :call-seq:
25
+ # request(value) -> Dataloader::Request
21
26
  def request(value)
22
27
  res_key = result_key_for(value)
23
28
  add_pending_key(res_key, value)
@@ -27,25 +32,46 @@ module GraphQL
27
32
  # Implement this method to return a stable identifier if different
28
33
  # key objects should load the same data value.
29
34
  #
30
- # @param value [Object] A value passed to `.request` or `.load`, for which a value will be loaded
31
- # @return [Object] The key for tracking this pending data
35
+ # **Parameters**
36
+ #
37
+ # - `value` (`Object`) — A value passed to `.request` or `.load`, for which a value will be loaded
38
+ #
39
+ # **Returns**
40
+ #
41
+ # - `Object` — The key for tracking this pending data
42
+ #
43
+ # :call-seq:
44
+ # result_key_for(Object value) -> Object
32
45
  def result_key_for(value)
33
46
  value
34
47
  end
35
48
 
36
- # Implement this method if varying values given to {load} (etc) should be consolidated
37
- # or normalized before being handed off to your {fetch} implementation.
49
+ # Implement this method if varying values given to [load](rdoc-ref:load) (etc) should be consolidated
50
+ # or normalized before being handed off to your [fetch](rdoc-ref:fetch) implementation.
38
51
  #
39
- # This is different than {result_key_for} because _that_ method handles unification inside Dataloader's cache,
40
- # but this method changes the value passed into {fetch}.
52
+ # This is different than [result_key_for](rdoc-ref:result_key_for) because _that_ method handles unification inside Dataloader's cache,
53
+ # but this method changes the value passed into [fetch](rdoc-ref:fetch).
41
54
  #
42
- # @param value [Object] The value passed to {load}, {load_all}, {request}, or {request_all}
43
- # @return [Object] The value given to {fetch}
55
+ # **Parameters**
56
+ #
57
+ # - `value` (`Object`) — The value passed to [load](rdoc-ref:load), [load_all](rdoc-ref:load_all), [request](rdoc-ref:request), or [request_all](rdoc-ref:request_all)
58
+ #
59
+ # **Returns**
60
+ #
61
+ # - `Object` — The value given to [fetch](rdoc-ref:fetch)
62
+ #
63
+ # :call-seq:
64
+ # normalize_fetch_key(Object value) -> Object
44
65
  def normalize_fetch_key(value)
45
66
  value
46
67
  end
47
68
 
48
- # @return [Dataloader::Request] a pending request for a values from `keys`. Call `.load` on that object to wait for the results.
69
+ # **Returns**
70
+ #
71
+ # - `Dataloader::Request` — a pending request for a values from `keys`. Call `.load` on that object to wait for the results.
72
+ #
73
+ # :call-seq:
74
+ # request_all(values) -> Dataloader::Request
49
75
  def request_all(values)
50
76
  values.each do |v|
51
77
  res_key = result_key_for(v)
@@ -54,8 +80,16 @@ module GraphQL
54
80
  Dataloader::RequestAll.new(self, values)
55
81
  end
56
82
 
57
- # @param value [Object] A loading value which will be passed to {#fetch} if it isn't already in the internal cache.
58
- # @return [Object] The result from {#fetch} for `key`. If `key` hasn't been loaded yet, the Fiber will yield until it's loaded.
83
+ # **Parameters**
84
+ #
85
+ # - `value` (`Object`) — A loading value which will be passed to [fetch](rdoc-ref:#fetch) if it isn't already in the internal cache.
86
+ #
87
+ # **Returns**
88
+ #
89
+ # - `Object` — The result from [fetch](rdoc-ref:#fetch) for `key`. If `key` hasn't been loaded yet, the Fiber will yield until it's loaded.
90
+ #
91
+ # :call-seq:
92
+ # load(Object value) -> Object
59
93
  def load(value)
60
94
  result_key = result_key_for(value)
61
95
  if @results.key?(result_key)
@@ -67,8 +101,16 @@ module GraphQL
67
101
  end
68
102
  end
69
103
 
70
- # @param values [Array<Object>] Loading keys which will be passed to `#fetch` (or read from the internal cache).
71
- # @return [Object] The result from {#fetch} for `keys`. If `keys` haven't been loaded yet, the Fiber will yield until they're loaded.
104
+ # **Parameters**
105
+ #
106
+ # - `values` (`Array<Object>`) — Loading keys which will be passed to `#fetch` (or read from the internal cache).
107
+ #
108
+ # **Returns**
109
+ #
110
+ # - `Object` — The result from [fetch](rdoc-ref:#fetch) for `keys`. If `keys` haven't been loaded yet, the Fiber will yield until they're loaded.
111
+ #
112
+ # :call-seq:
113
+ # load_all(Array[Object] values) -> Object
72
114
  def load_all(values)
73
115
  result_keys = []
74
116
  pending_keys = []
@@ -89,8 +131,17 @@ module GraphQL
89
131
  end
90
132
 
91
133
  # Subclasses must implement this method to return a value for each of `keys`
92
- # @param keys [Array<Object>] keys passed to {#load}, {#load_all}, {#request}, or {#request_all}
93
- # @return [Array<Object>] A loaded value for each of `keys`. The array must match one-for-one to the list of `keys`.
134
+ #
135
+ # **Parameters**
136
+ #
137
+ # - `keys` (`Array<Object>`) — keys passed to [load](rdoc-ref:#load), [load all](rdoc-ref:#load_all), [request](rdoc-ref:#request), or [request all](rdoc-ref:#request_all)
138
+ #
139
+ # **Returns**
140
+ #
141
+ # - `Array<Object>` — A loaded value for each of `keys`. The array must match one-for-one to the list of `keys`.
142
+ #
143
+ # :call-seq:
144
+ # fetch(Array[Object] keys) -> Array[Object]
94
145
  def fetch(keys)
95
146
  # somehow retrieve these from the backend
96
147
  raise "Implement `#{self.class}#fetch(#{keys.inspect}) to return a record for each of the keys"
@@ -99,7 +150,13 @@ module GraphQL
99
150
  MAX_ITERATIONS = 1000
100
151
  # Wait for a batch, if there's anything to batch.
101
152
  # Then run the batch and update the cache.
102
- # @return [void]
153
+ #
154
+ # **Returns**
155
+ #
156
+ # - `void`
157
+ #
158
+ # :call-seq:
159
+ # sync(pending_result_keys) -> void
103
160
  def sync(pending_result_keys)
104
161
  @dataloader.queue_pending_source(self) if pending?
105
162
  @dataloader.yield(self)
@@ -114,15 +171,29 @@ module GraphQL
114
171
  nil
115
172
  end
116
173
 
117
- # @return [Boolean] True if this source has any pending requests for data.
174
+ # **Returns**
175
+ #
176
+ # - `Boolean` — True if this source has any pending requests for data.
177
+ #
178
+ # :call-seq:
179
+ # pending?() -> bool
118
180
  def pending?
119
181
  !@pending.empty?
120
182
  end
121
183
 
122
184
  # Add these key-value pairs to this source's cache
123
185
  # (future loads will use these merged values).
124
- # @param new_results [Hash<Object => Object>] key-value pairs to cache in this source
125
- # @return [void]
186
+ #
187
+ # **Parameters**
188
+ #
189
+ # - `new_results` (`Hash<Object => Object>`) — key-value pairs to cache in this source
190
+ #
191
+ # **Returns**
192
+ #
193
+ # - `void`
194
+ #
195
+ # :call-seq:
196
+ # merge(Hash[Object, Object] new_results) -> void
126
197
  def merge(new_results)
127
198
  new_results.each do |new_k, new_v|
128
199
  key = result_key_for(new_k)
@@ -131,10 +202,12 @@ module GraphQL
131
202
  nil
132
203
  end
133
204
 
134
- # Called by {GraphQL::Dataloader} to resolve and pending requests to this source.
135
- # @api private
136
- # @return [void]
137
- def run_pending_keys
205
+ # Called by [GraphQL::Dataloader](rdoc-ref:GraphQL::Dataloader) to resolve and pending requests to this source.
206
+ #
207
+ # **Returns**
208
+ #
209
+ # - `void`
210
+ def run_pending_keys # :nodoc:
138
211
  @fetching.each_key { |k| @pending.delete(k) }
139
212
  return if @pending.empty?
140
213
  fetch_h = @pending
@@ -167,9 +240,17 @@ module GraphQL
167
240
  # this method to call `.to_sql` on them, thus merging `.load(...)` calls when they apply
168
241
  # to equivalent relations.
169
242
  #
170
- # @param batch_args [Array<Object>]
171
- # @param batch_kwargs [Hash]
172
- # @return [Object]
243
+ # **Parameters**
244
+ #
245
+ # - `batch_args` (`Array<Object>`)
246
+ # - `batch_kwargs` (`Hash`)
247
+ #
248
+ # **Returns**
249
+ #
250
+ # - `Object`
251
+ #
252
+ # :call-seq:
253
+ # batch_key_for(Array[Object] *batch_args, Hash **batch_kwargs) -> Object
173
254
  def self.batch_key_for(*batch_args, **batch_kwargs)
174
255
  if batch_kwargs.any? # rubocop:disable Development/NoneWithoutBlockCop
175
256
  [*batch_args, **batch_kwargs]
@@ -179,7 +260,13 @@ module GraphQL
179
260
  end
180
261
 
181
262
  # Clear any already-loaded objects for this source
182
- # @return [void]
263
+ #
264
+ # **Returns**
265
+ #
266
+ # - `void`
267
+ #
268
+ # :call-seq:
269
+ # clear_cache() -> void
183
270
  def clear_cache
184
271
  @results.clear
185
272
  nil
@@ -199,10 +286,15 @@ module GraphQL
199
286
  end
200
287
 
201
288
  # Reads and returns the result for the key from the internal cache, or raises an error if the result was an error
202
- # @param key [Object] key passed to {#load} or {#load_all}
203
- # @return [Object] The result from {#fetch} for `key`.
204
- # @api private
205
- def result_for(key)
289
+ #
290
+ # **Parameters**
291
+ #
292
+ # - `key` (`Object`) — key passed to [load](rdoc-ref:#load) or [load all](rdoc-ref:#load_all)
293
+ #
294
+ # **Returns**
295
+ #
296
+ # - `Object` — The result from [fetch](rdoc-ref:#fetch) for `key`.
297
+ def result_for(key) # :nodoc:
206
298
  if !@results.key?(key)
207
299
  raise GraphQL::InvariantError, <<-ERR
208
300
  Fetching result for a key on #{self.class} that hasn't been loaded yet (#{key.inspect}, loaded: #{@results.keys})