graphql 2.6.12 → 2.6.13

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 +2 -1
  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 +8 -7
  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 +91 -42
  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 +22 -6
  61. data/lib/graphql/execution/finalize.rb +12 -6
  62. data/lib/graphql/execution/input_values.rb +2 -1
  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 +66 -23
  71. data/lib/graphql/execution/interpreter.rb +15 -6
  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 +1 -0
  79. data/lib/graphql/execution/resolve_type_step.rb +2 -1
  80. data/lib/graphql/execution/runner.rb +9 -3
  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 +1 -0
  85. data/lib/graphql/float_encoding_error.rb +7 -2
  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 +5 -0
  110. data/lib/graphql/language/nodes.rb +2094 -419
  111. data/lib/graphql/language/parser.rb +17 -11
  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 +13 -7
  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 +20 -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 +118 -21
  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 -15
  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 +1 -0
  137. data/lib/graphql/query/variables.rb +4 -1
  138. data/lib/graphql/query.rb +193 -49
  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 +18 -6
  153. data/lib/graphql/schema/always_visible.rb +1 -0
  154. data/lib/graphql/schema/argument.rb +265 -42
  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 +94 -27
  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 +12 -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 +621 -109
  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 +16 -5
  186. data/lib/graphql/schema/member/graphql_type_names.rb +10 -6
  187. data/lib/graphql/schema/member/has_arguments.rb +115 -48
  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 +38 -10
  193. data/lib/graphql/schema/member/has_fields.rb +151 -70
  194. data/lib/graphql/schema/member/has_interfaces.rb +10 -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 +33 -12
  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 +20 -17
  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 +1046 -300
  235. data/lib/graphql/static_validation/all_rules.rb +2 -1
  236. data/lib/graphql/static_validation/base_visitor.rb +48 -8
  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 +295 -134
  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 +4 -1
  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 +58 -19
  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 +12 -5
  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 +1 -0
  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 +37 -9
  380. data/readme.md +1 -1
  381. metadata +89 -5
  382. data/.yardopts +0 -5
data/lib/graphql/dig.rb CHANGED
@@ -1,13 +1,22 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
  module GraphQL
3
4
  module Dig
4
5
  # implemented using the old activesupport #dig instead of the ruby built-in
5
6
  # so we can use some of the magic in Schema::InputObject and Interpreter::Arguments
6
7
  # to handle stringified/symbolized keys.
7
8
  #
8
- # @param own_key [String, Symbol] A key to retrieve
9
- # @param rest_keys [Array<[String, Symbol>] Retrieves the value object corresponding to the each key objects repeatedly
10
- # @return [Object]
9
+ # **Parameters**
10
+ #
11
+ # - `own_key` (`String, Symbol`) — A key to retrieve
12
+ # - `rest_keys` (`Array<[String, Symbol]>`) — Keys to use for retrieving nested values
13
+ #
14
+ # **Returns**
15
+ #
16
+ # - `Object`
17
+ #
18
+ # :call-seq:
19
+ # dig(String | Symbol own_key, Array[[String, Symbol]] *rest_keys) -> Object
11
20
  def dig(own_key, *rest_keys)
12
21
  val = self[own_key]
13
22
  if val.nil? || rest_keys.empty?
@@ -1,9 +1,10 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
  module GraphQL
3
4
  # This error is raised when `Types::ISO8601Duration` is asked to return a value
4
5
  # that cannot be parsed as an ISO8601-formatted duration by ActiveSupport::Duration.
5
6
  #
6
- # @see GraphQL::Types::ISO8601Duration which raises this error
7
+ # See [GraphQL::Types::ISO8601Duration](rdoc-ref:GraphQL::Types::ISO8601Duration) which raises this error
7
8
  class DurationEncodingError < GraphQL::RuntimeTypeError
8
9
  # The value which couldn't be encoded
9
10
  attr_reader :duration_value
@@ -1,16 +1,21 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
  module GraphQL
3
4
  module Execution
4
5
  # Boolean checks for how an AST node's directives should
5
6
  # influence its execution
6
- # @api private
7
- module DirectiveChecks
7
+ module DirectiveChecks # :nodoc:
8
8
  SKIP = "skip"
9
9
  INCLUDE = "include"
10
10
 
11
11
  module_function
12
12
 
13
- # @return [Boolean] Should this node be included in the query?
13
+ # **Returns**
14
+ #
15
+ # - `Boolean` — Should this node be included in the query?
16
+ #
17
+ # :call-seq:
18
+ # include?(directive_ast_nodes, query) -> bool
14
19
  def include?(directive_ast_nodes, query)
15
20
  directive_ast_nodes.each do |directive_ast_node|
16
21
  name = directive_ast_node.name
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
 
3
4
  module GraphQL
4
5
  module Execution
@@ -6,10 +7,18 @@ module GraphQL
6
7
  # Register this handler, updating the
7
8
  # internal handler index to maintain least-to-most specific.
8
9
  #
9
- # @param error_class [Class<Exception>]
10
- # @param error_handlers [Hash]
11
- # @param error_handler [Proc]
12
- # @return [void]
10
+ # **Parameters**
11
+ #
12
+ # - `error_class` (`Class<Exception>`)
13
+ # - `error_handlers` (`Hash`)
14
+ # - `error_handler` (`Proc`)
15
+ #
16
+ # **Returns**
17
+ #
18
+ # - `void`
19
+ #
20
+ # :call-seq:
21
+ # register_rescue_from(Class[Exception] error_class, Hash error_handlers, Proc error_handler) -> void
13
22
  def self.register_rescue_from(error_class, error_handlers, error_handler)
14
23
  subclasses_handlers = {}
15
24
  this_level_subclasses = []
@@ -52,10 +61,15 @@ module GraphQL
52
61
  nil
53
62
  end
54
63
 
55
- # @return [Proc, nil] The handler for `error_class`, if one was registered on this schema or inherited
64
+ # **Returns**
65
+ #
66
+ # - `Proc, nil` — The handler for `error_class`, if one was registered on this schema or inherited
67
+ #
68
+ # :call-seq:
69
+ # find_handler_for(schema, error_class) -> Proc | nil
56
70
  def self.find_handler_for(schema, error_class)
57
71
  handlers = schema.error_handlers[:subclass_handlers]
58
- handler = nil
72
+ handler = nil #: untyped
59
73
  while (handlers) do
60
74
  _err_class, next_handler = handlers.find { |err_class, handler| error_class <= err_class }
61
75
  if next_handler
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # typed: false
2
3
  module GraphQL
3
4
  module Execution
4
5
  class FieldResolveStep
@@ -418,11 +419,15 @@ module GraphQL
418
419
  case ext
419
420
  when Schema::Field::ConnectionExtension
420
421
  conns = ctx.schema.connections
422
+ lookahead = @arguments[:lookahead]
423
+ # The memo omits the extension's extras (`:lookahead`)
424
+ conn_arguments = memos[@finish_extension_idx] || @arguments
421
425
  @field_results.map!.each_with_index do |value, idx|
422
426
  object = @extended.object[idx]
423
- conn = conns.populate_connection(@field_definition, object, value, @arguments, ctx)
427
+ conn = conns.populate_connection(@field_definition, object, value, conn_arguments, ctx)
424
428
  if conn
425
429
  conn.was_authorized_by_scope_items = @was_scoped
430
+ conn.lookahead ||= lookahead
426
431
  end
427
432
  conn
428
433
  rescue GraphQL::RuntimeError => err
@@ -514,7 +519,7 @@ module GraphQL
514
519
  def build_leaf_result(result_h, result_key, field_result, return_type, ctx, is_from_array)
515
520
  if field_result.nil?
516
521
  if return_type.non_null?
517
- add_non_null_error(is_from_array)
522
+ add_non_null_error(is_from_array, return_type: return_type)
518
523
  else
519
524
  nil
520
525
  end
@@ -609,8 +614,14 @@ module GraphQL
609
614
  end
610
615
  end
611
616
 
612
- def add_non_null_error(is_from_array)
613
- err = @parent_type::InvalidNullError.new(@parent_type, @field_definition, ast_nodes, is_from_array: is_from_array, path: path)
617
+ def add_non_null_error(is_from_array, return_type: nil)
618
+ if is_from_array && return_type
619
+ list_type = @field_definition.type
620
+ list_type = list_type.of_type if list_type.non_null?
621
+ # Preserve existing messages for single-level lists.
622
+ element_type = return_type.of_type if list_type.of_type.list?
623
+ end
624
+ err = @parent_type::InvalidNullError.new(@parent_type, @field_definition, ast_nodes, is_from_array: is_from_array, path: path, element_type: element_type)
614
625
  nn_result = @runner.schema.type_error(err, @selections_step.query.context)
615
626
  if nn_result.nil?
616
627
  propagate_nulls
@@ -797,8 +808,13 @@ module GraphQL
797
808
  end
798
809
  results
799
810
  when :resolve_legacy_instance_method
800
- @selections_step.graphql_objects.map do |obj_inst|
801
- obj_inst.public_send(@field_definition.execution_mode_key, **args_hash)
811
+ graphql_objects = if objects.equal?(@selections_step.objects)
812
+ @selections_step.graphql_objects
813
+ else
814
+ objects.map { |object| @parent_type.scoped_new(object, context) }
815
+ end
816
+ graphql_objects.map do |graphql_object|
817
+ graphql_object.public_send(@field_definition.execution_mode_key, **args_hash)
802
818
  rescue GraphQL::ExecutionError => exec_err
803
819
  exec_err
804
820
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
  module GraphQL
3
4
  module Execution
4
5
  class Finalize
@@ -39,11 +40,16 @@ module GraphQL
39
40
  tf[key] = err
40
41
  @finalizers_count += 1
41
42
  elsif value_at_key.is_a?(Array)
42
- value_at_key.each_with_index do |el, idx|
43
- if el.equal?(err)
44
- tf = @finalizers[value_at_key] ||= {}.compare_by_identity
45
- tf[idx] = err
46
- @finalizers_count += 1
43
+ pending_arrays = [value_at_key]
44
+ while (array = pending_arrays.pop)
45
+ array.each_with_index do |el, idx|
46
+ if el.equal?(err)
47
+ array_tf = @finalizers[array] ||= {}.compare_by_identity
48
+ array_tf[idx] = err
49
+ @finalizers_count += 1
50
+ elsif el.is_a?(Array)
51
+ pending_arrays << el
52
+ end
47
53
  end
48
54
  end
49
55
  end
@@ -175,7 +181,7 @@ module GraphQL
175
181
  inner_type = inner_type.of_type
176
182
  end
177
183
 
178
- new_invalid_null = false
184
+ new_invalid_null = false #: bool
179
185
 
180
186
  if (f = finalizers(result_arr, nil))
181
187
  run_finalizers(@current_result_path.dup, f, result_arr, nil)
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
  module GraphQL
3
4
  module Execution
4
5
  class InputValues
@@ -38,7 +39,7 @@ module GraphQL
38
39
  def argument_values(owner_defn, argument_nodes, field_resolve_step)
39
40
  arg_defns = @query.types.arguments(owner_defn)
40
41
  argument_values = {}
41
- errors = nil
42
+ errors = nil #: untyped
42
43
 
43
44
  arg_defns.each do |argument_definition|
44
45
  arg_ruby_key = argument_definition.keyword
@@ -1,10 +1,11 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
 
3
4
  module GraphQL
4
5
  module Execution
5
6
  class Interpreter
6
7
  # A container for metadata regarding arguments present in a GraphQL query.
7
- # @see Interpreter::Arguments#argument_values for a hash of these objects.
8
+ # See [Interpreter::Arguments#argument_values](rdoc-ref:Interpreter::Arguments#argument_values) for a hash of these objects.
8
9
  class ArgumentValue
9
10
  def initialize(definition:, value:, original_value:, default_used:)
10
11
  @definition = definition
@@ -13,16 +14,27 @@ module GraphQL
13
14
  @default_used = default_used
14
15
  end
15
16
 
16
- # @return [Object] The Ruby-ready value for this Argument
17
+ # **Returns**
18
+ #
19
+ # - `Object` — The Ruby-ready value for this Argument
17
20
  attr_reader :value
18
21
 
19
- # @return [Object] The value of this argument _before_ `prepare` is applied.
22
+ # **Returns**
23
+ #
24
+ # - `Object` — The value of this argument _before_ `prepare` is applied.
20
25
  attr_reader :original_value
21
26
 
22
- # @return [GraphQL::Schema::Argument] The definition instance for this argument
27
+ # **Returns**
28
+ #
29
+ # - `GraphQL::Schema::Argument` — The definition instance for this argument
23
30
  attr_reader :definition
24
31
 
25
- # @return [Boolean] `true` if the schema-defined `default_value:` was applied in this case. (No client-provided value was present.)
32
+ # **Returns**
33
+ #
34
+ # - `Boolean` — `true` if the schema-defined `default_value:` was applied in this case. (No client-provided value was present.)
35
+ #
36
+ # :call-seq:
37
+ # default_used?() -> bool
26
38
  def default_used?
27
39
  @default_used
28
40
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
 
3
4
  module GraphQL
4
5
  module Execution
@@ -8,7 +9,7 @@ module GraphQL
8
9
  # This object is immutable so that the runtime code can be sure that
9
10
  # modifications don't leak from one use to another
10
11
  #
11
- # @see GraphQL::Query#arguments_for to get access to these objects.
12
+ # See [GraphQL::Query#arguments_for](rdoc-ref:GraphQL::Query#arguments_for) to get access to these objects.
12
13
  class Arguments
13
14
  extend Forwardable
14
15
  include GraphQL::Dig
@@ -16,11 +17,18 @@ module GraphQL
16
17
  # The Ruby-style arguments hash, ready for a resolver.
17
18
  # This hash is the one used at runtime.
18
19
  #
19
- # @return [Hash<Symbol, Object>]
20
+ # **Returns**
21
+ #
22
+ # - `Hash<Symbol, Object>`
20
23
  attr_reader :keyword_arguments
21
24
 
22
- # @param argument_values [nil, Hash{Symbol => ArgumentValue}]
23
- # @param keyword_arguments [nil, Hash{Symbol => Object}]
25
+ # **Parameters**
26
+ #
27
+ # - `argument_values` (`nil, Hash{Symbol => ArgumentValue}`)
28
+ # - `keyword_arguments` (`nil, Hash{Symbol => Object}`)
29
+ #
30
+ # :call-seq:
31
+ # initialize(nil | Hash[Symbol, Object] keyword_arguments:, nil | Hash[Symbol, ArgumentValue] argument_values:)
24
32
  def initialize(keyword_arguments: nil, argument_values:)
25
33
  @empty = argument_values.nil? || argument_values.empty?
26
34
  # This is only present when `extras` have been merged in:
@@ -52,7 +60,9 @@ module GraphQL
52
60
  freeze
53
61
  end
54
62
 
55
- # @return [Hash{Symbol => ArgumentValue}]
63
+ # **Returns**
64
+ #
65
+ # - `Hash{Symbol => ArgumentValue}`
56
66
  attr_reader :argument_values
57
67
 
58
68
  def empty?
@@ -70,10 +80,15 @@ module GraphQL
70
80
  #
71
81
  # This is called by the runtime to implement field `extras: [...]`
72
82
  #
73
- # @param extra_args [Hash<Symbol => Object>]
74
- # @return [Interpreter::Arguments]
75
- # @api private
76
- def merge_extras(extra_args)
83
+ #
84
+ # **Parameters**
85
+ #
86
+ # - `extra_args` (`Hash<Symbol => Object>`)
87
+ #
88
+ # **Returns**
89
+ #
90
+ # - `Interpreter::Arguments`
91
+ def merge_extras(extra_args) # :nodoc:
77
92
  self.class.new(
78
93
  argument_values: argument_values,
79
94
  keyword_arguments: keyword_arguments.merge(extra_args)
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
 
3
4
  module GraphQL
4
5
  module Execution
@@ -36,7 +37,7 @@ module GraphQL
36
37
  @storage[argument_owner][nil][ast_node]
37
38
  end
38
39
 
39
- # @yield [Interpreter::Arguments, Lazy<Interpreter::Arguments>] The finally-loaded arguments
40
+ # **Yields:** [Interpreter::Arguments, Lazy<Interpreter::Arguments>] The finally-loaded arguments
40
41
  def dataload_for(ast_node, argument_owner, parent_object, &block)
41
42
  # First, normalize all AST or Ruby values to a plain Ruby hash
42
43
  arg_storage = @storage[argument_owner][parent_object]
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
 
3
4
  module GraphQL
4
5
  module Execution
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
 
3
4
  module GraphQL
4
5
  module Execution
@@ -1,23 +1,32 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
 
3
4
  module GraphQL
4
5
  module Execution
5
6
  class Interpreter
6
7
  module Resolve
7
8
  # Continue field results in `results` until there's nothing else to continue.
8
- # @return [void]
9
- # @deprecated Call `dataloader.run` instead
9
+ # **Deprecated:** Call `dataloader.run` instead
10
+ #
11
+ # **Returns**
12
+ #
13
+ # - `void`
14
+ #
15
+ # :call-seq:
16
+ # resolve_all(results, dataloader) -> void
10
17
  def self.resolve_all(results, dataloader)
11
- warn "#{self}.#{__method__} is deprecated; Use `dataloader.run` instead.#{caller(1, 5).map { |l| "\n #{l}"}.join}"
18
+ backtrace = caller(1, 5) #: as !nil
19
+ warn "#{self}.#{__method__} is deprecated; Use `dataloader.run` instead.#{backtrace.map { |l| "\n #{l}"}.join}"
12
20
  dataloader.append_job { resolve(results, dataloader) }
13
21
  nil
14
22
  end
15
23
 
16
- # @deprecated Call `dataloader.run` instead
24
+ # **Deprecated:** Call `dataloader.run` instead
17
25
  def self.resolve_each_depth(lazies_at_depth, dataloader)
18
- warn "#{self}.#{__method__} is deprecated; Use `dataloader.run` instead.#{caller(1, 5).map { |l| "\n #{l}"}.join}"
26
+ backtrace = caller(1, 5) #: as !nil
27
+ warn "#{self}.#{__method__} is deprecated; Use `dataloader.run` instead.#{backtrace.map { |l| "\n #{l}"}.join}"
19
28
 
20
- smallest_depth = nil
29
+ smallest_depth = nil #: Integer?
21
30
  lazies_at_depth.each_key do |depth_key|
22
31
  smallest_depth ||= depth_key
23
32
  if depth_key < smallest_depth
@@ -39,9 +48,10 @@ module GraphQL
39
48
  nil
40
49
  end
41
50
 
42
- # @deprecated Call `dataloader.run` instead
51
+ # **Deprecated:** Call `dataloader.run` instead
43
52
  def self.resolve(results, dataloader)
44
- warn "#{self}.#{__method__} is deprecated; Use `dataloader.run` instead.#{caller(1, 5).map { |l| "\n #{l}"}.join}"
53
+ backtrace = caller(1, 5) #: as !nil
54
+ warn "#{self}.#{__method__} is deprecated; Use `dataloader.run` instead.#{backtrace.map { |l| "\n #{l}"}.join}"
45
55
  # There might be pending jobs here that _will_ write lazies
46
56
  # into the result hash. We should run them out, so we
47
57
  # can be sure that all lazies will be present in the result hashes.
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
 
3
4
  module GraphQL
4
5
  module Execution
@@ -54,7 +55,9 @@ module GraphQL
54
55
  attr_reader :graphql_parent, :graphql_result_name, :graphql_is_non_null_in_parent,
55
56
  :graphql_application_value, :graphql_result_type, :graphql_selections, :graphql_is_eager, :ast_node, :graphql_arguments, :graphql_field
56
57
 
57
- # @return [Hash] Plain-Ruby result data (`@graphql_metadata` contains Result wrapper objects)
58
+ # **Returns**
59
+ #
60
+ # - `Hash` — Plain-Ruby result data (`@graphql_metadata` contains Result wrapper objects)
58
61
  attr_accessor :graphql_result_data
59
62
  end
60
63
 
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
  require "graphql/execution/interpreter/runtime/graphql_result"
3
4
 
4
5
  module GraphQL
@@ -7,8 +8,7 @@ module GraphQL
7
8
  # I think it would be even better if we could somehow make
8
9
  # `continue_field` not recursive. "Trampolining" it somehow.
9
10
  #
10
- # @api private
11
- class Runtime
11
+ class Runtime # :nodoc:
12
12
  class CurrentState
13
13
  def initialize
14
14
  @current_field = nil
@@ -26,13 +26,19 @@ module GraphQL
26
26
  :current_arguments, :current_field, :was_authorized_by_scope_items
27
27
  end
28
28
 
29
- # @return [GraphQL::Query]
29
+ # **Returns**
30
+ #
31
+ # - `GraphQL::Query`
30
32
  attr_reader :query
31
33
 
32
- # @return [Class<GraphQL::Schema>]
34
+ # **Returns**
35
+ #
36
+ # - `Class<GraphQL::Schema>`
33
37
  attr_reader :schema
34
38
 
35
- # @return [GraphQL::Query::Context]
39
+ # **Returns**
40
+ #
41
+ # - `GraphQL::Query::Context`
36
42
  attr_reader :context
37
43
 
38
44
  def initialize(query:)
@@ -63,7 +69,12 @@ module GraphQL
63
69
  "#<#{self.class.name} response=#{@response.inspect}>"
64
70
  end
65
71
 
66
- # @return [void]
72
+ # **Returns**
73
+ #
74
+ # - `void`
75
+ #
76
+ # :call-seq:
77
+ # run_eager() -> void
67
78
  def run_eager
68
79
  root_type = query.root_type
69
80
  case query
@@ -138,7 +149,7 @@ module GraphQL
138
149
  else
139
150
  @response = GraphQLResultArray.new(nil, root_type, nil, nil, false, selections, false, ast_node, nil, nil)
140
151
  @response.base_path = base_path
141
- idx = nil
152
+ idx = nil #: Integer?
142
153
  object.each do |inner_value|
143
154
  idx ||= 0
144
155
  this_idx = idx
@@ -209,6 +220,7 @@ module GraphQL
209
220
  end
210
221
  end
211
222
 
223
+ #: (untyped, untyped, untyped, untyped, Array[untyped]?, untyped, untyped) -> untyped
212
224
  def gather_selections(graphql_response, owner_object, owner_type, selections, selections_to_run, selections_by_name, ordered_result_keys)
213
225
  selections.each do |node|
214
226
  if node.is_a?(GraphQL::Language::Nodes::Field)
@@ -242,7 +254,7 @@ module GraphQL
242
254
  if selections_to_run
243
255
  selections_to_run << next_selections
244
256
  else
245
- selections_to_run = []
257
+ selections_to_run = [] #: Array[untyped]
246
258
  selections_to_run << selections_by_name
247
259
  selections_to_run << next_selections
248
260
  end
@@ -253,7 +265,10 @@ module GraphQL
253
265
  case node
254
266
  when GraphQL::Language::Nodes::InlineFragment
255
267
  if node.type
256
- type_defn = query.types.type(node.type.name)
268
+ type_defn = query.types.type(
269
+ node.type #: as !nil
270
+ .name
271
+ )
257
272
 
258
273
  if query.types.possible_types(type_defn).include?(owner_type)
259
274
  result = gather_selections(graphql_response, owner_object, owner_type, node.selections, selections_to_run, next_selections, ordered_result_keys)
@@ -287,7 +302,12 @@ module GraphQL
287
302
 
288
303
  NO_ARGS = GraphQL::EmptyObjects::EMPTY_HASH
289
304
 
290
- # @return [void]
305
+ # **Returns**
306
+ #
307
+ # - `void`
308
+ #
309
+ # :call-seq:
310
+ # evaluate_selections(gathered_selections, selections_result, target_result, runtime_state) -> void
291
311
  def evaluate_selections(gathered_selections, selections_result, target_result, runtime_state) # rubocop:disable Metrics/ParameterLists
292
312
  runtime_state ||= get_current_runtime_state
293
313
  runtime_state.current_result_name = nil
@@ -325,7 +345,12 @@ module GraphQL
325
345
  end
326
346
  end
327
347
 
328
- # @return [void]
348
+ # **Returns**
349
+ #
350
+ # - `void`
351
+ #
352
+ # :call-seq:
353
+ # evaluate_selection(result_name, field_ast_nodes_or_ast_node, selections_result) -> void
329
354
  def evaluate_selection(result_name, field_ast_nodes_or_ast_node, selections_result) # rubocop:disable Metrics/ParameterLists
330
355
  return if selections_result.graphql_dead
331
356
  # As a performance optimization, the hash key will be a `Node` if
@@ -374,6 +399,7 @@ module GraphQL
374
399
  end
375
400
  end
376
401
 
402
+ #: (untyped, untyped, untyped, Array[untyped]?, untyped, untyped, untyped, untyped) -> untyped
377
403
  def evaluate_selection_with_args(arguments, field_defn, ast_node, field_ast_nodes, object, result_name, selection_result, runtime_state) # rubocop:disable Metrics/ParameterLists
378
404
  after_lazy(arguments, field: field_defn, ast_node: ast_node, owner_object: object, arguments: arguments, result_name: result_name, result: selection_result, runtime_state: runtime_state) do |resolved_arguments, runtime_state|
379
405
  if resolved_arguments.is_a?(GraphQL::ExecutionError) || resolved_arguments.is_a?(GraphQL::UnauthorizedError)
@@ -405,7 +431,7 @@ module GraphQL
405
431
  extra_args[:path] = current_path
406
432
  when :lookahead
407
433
  if !field_ast_nodes
408
- field_ast_nodes = [ast_node]
434
+ field_ast_nodes = [ast_node] #: Array[untyped]
409
435
  end
410
436
 
411
437
  extra_args[:lookahead] = Execution::Lookahead.new(
@@ -556,9 +582,13 @@ module GraphQL
556
582
  set_result(selection_result, result_name, nil, false, is_non_null) do
557
583
  # When this comes from a list item, use the parent object:
558
584
  is_from_array = selection_result.is_a?(GraphQLResultArray)
559
- parent_type = is_from_array ? selection_result.graphql_parent.graphql_result_type : selection_result.graphql_result_type
585
+ parent_result = selection_result
586
+ until parent_result.is_a?(GraphQLResultHash)
587
+ parent_result = parent_result.graphql_parent
588
+ end
589
+ parent_type = parent_result.graphql_result_type
560
590
  # This block is called if `result_name` is not dead. (Maybe a previous invalid nil caused it be marked dead.)
561
- err = parent_type::InvalidNullError.new(parent_type, field, ast_node, is_from_array: is_from_array)
591
+ err = parent_type.const_get(:InvalidNullError).new(parent_type, field, ast_node, is_from_array: is_from_array)
562
592
  schema.type_error(err, context)
563
593
  end
564
594
  else
@@ -657,7 +687,12 @@ module GraphQL
657
687
  #
658
688
  # Location information from `path` and `ast_node`.
659
689
  #
660
- # @return [Lazy, Array, Hash, Object] Lazy, Array, and Hash are all traversed to resolve lazy values later
690
+ # **Returns**
691
+ #
692
+ # - `Lazy, Array, Hash, Object` — Lazy, Array, and Hash are all traversed to resolve lazy values later
693
+ #
694
+ # :call-seq:
695
+ # continue_field(value, owner_type, field, current_type, ast_node, next_selections, is_non_null, owner_object, arguments, result_name, selection_result, was_scoped, runtime_state) -> Lazy | Array | Hash | Object
661
696
  def continue_field(value, owner_type, field, current_type, ast_node, next_selections, is_non_null, owner_object, arguments, result_name, selection_result, was_scoped, runtime_state) # rubocop:disable Metrics/ParameterLists
662
697
  if current_type.non_null?
663
698
  current_type = current_type.of_type
@@ -702,7 +737,7 @@ module GraphQL
702
737
  possible_types = query.types.possible_types(current_type)
703
738
  if !possible_types.include?(resolved_type)
704
739
  parent_type = field.owner_type
705
- err_class = current_type::UnresolvedTypeError
740
+ err_class = current_type.const_get(:UnresolvedTypeError)
706
741
  type_error = err_class.new(resolved_value, field, parent_type, resolved_type, possible_types)
707
742
  schema.type_error(type_error, context)
708
743
  set_result(selection_result, result_name, nil, false, is_non_null)
@@ -749,7 +784,7 @@ module GraphQL
749
784
  inner_type_non_null = inner_type.non_null?
750
785
  response_list = GraphQLResultArray.new(result_name, current_type, owner_object, selection_result, is_non_null, next_selections, false, ast_node, arguments, field)
751
786
  set_result(selection_result, result_name, response_list, true, is_non_null)
752
- idx = nil
787
+ idx = nil #: Integer?
753
788
  list_value = begin
754
789
  begin
755
790
  value.each do |inner_value|
@@ -853,7 +888,7 @@ module GraphQL
853
888
  end
854
889
  end
855
890
 
856
- # Check {Schema::Directive.include?} for each directive that's present
891
+ # Check [Schema::Directive.include?](rdoc-ref:Schema::Directive.include?) for each directive that's present
857
892
  def directives_include?(node, graphql_object, parent_type, selection_result, extra_path_part)
858
893
  node.directives.each do |dir_node|
859
894
  dir_defn = @schema_directives.fetch(dir_node.name)
@@ -902,11 +937,19 @@ module GraphQL
902
937
  end
903
938
  end
904
939
 
905
- # @param obj [Object] Some user-returned value that may want to be batched
906
- # @param field [GraphQL::Schema::Field]
907
- # @param eager [Boolean] Set to `true` for mutation root fields only
908
- # @param trace [Boolean] If `false`, don't wrap this with field tracing
909
- # @return [GraphQL::Execution::Lazy, Object] If loading `object` will be deferred, it's a wrapper over it.
940
+ # **Parameters**
941
+ #
942
+ # - `obj` (`Object`) — Some user-returned value that may want to be batched
943
+ # - `field` (`GraphQL::Schema::Field`)
944
+ # - `eager` (`Boolean`) — Set to `true` for mutation root fields only
945
+ # - `trace` (`Boolean`) — If `false`, don't wrap this with field tracing
946
+ #
947
+ # **Returns**
948
+ #
949
+ # - `GraphQL::Execution::Lazy, Object` — If loading `object` will be deferred, it's a wrapper over it.
950
+ #
951
+ # :call-seq:
952
+ # after_lazy(lazy_obj, GraphQL::Schema::Field field:, owner_object:, arguments:, ast_node:, result:, result_name:, bool eager:, runtime_state:, bool trace:, &block) -> GraphQL::Execution::Lazy | Object
910
953
  def after_lazy(lazy_obj, field:, owner_object:, arguments:, ast_node:, result:, result_name:, eager: false, runtime_state:, trace: true, &block)
911
954
  if lazy?(lazy_obj)
912
955
  was_authorized_by_scope_items = runtime_state.was_authorized_by_scope_items