graphql 2.6.11 → 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 +10 -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 +93 -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 +40 -13
  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 +72 -25
  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 +24 -17
  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 +123 -22
  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 +9 -2
  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 +65 -20
  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 +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 +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 +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 +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
@@ -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
@@ -619,7 +649,9 @@ module GraphQL
619
649
  when Array
620
650
  # It's an array full of execution errors; add them all.
621
651
  if !value.empty? && value.all?(GraphQL::ExecutionError)
622
- list_type_at_all = (field && (field.type.list?))
652
+ list_type = field && field.type
653
+ list_type = list_type.of_type if list_type && list_type.non_null?
654
+ list_type_at_all = list_type && list_type.list?
623
655
  if selection_result.nil? || !selection_result.graphql_dead
624
656
  value.each_with_index do |error, index|
625
657
  error.ast_node ||= ast_node
@@ -627,7 +659,7 @@ module GraphQL
627
659
  context.errors << error
628
660
  end
629
661
  if selection_result
630
- if list_type_at_all
662
+ if list_type_at_all && !list_type.of_type.non_null?
631
663
  result_without_errors = value.map { |v| v.is_a?(GraphQL::ExecutionError) ? nil : v }
632
664
  set_result(selection_result, result_name, result_without_errors, false, is_non_null)
633
665
  else
@@ -655,7 +687,12 @@ module GraphQL
655
687
  #
656
688
  # Location information from `path` and `ast_node`.
657
689
  #
658
- # @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
659
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
660
697
  if current_type.non_null?
661
698
  current_type = current_type.of_type
@@ -700,7 +737,7 @@ module GraphQL
700
737
  possible_types = query.types.possible_types(current_type)
701
738
  if !possible_types.include?(resolved_type)
702
739
  parent_type = field.owner_type
703
- err_class = current_type::UnresolvedTypeError
740
+ err_class = current_type.const_get(:UnresolvedTypeError)
704
741
  type_error = err_class.new(resolved_value, field, parent_type, resolved_type, possible_types)
705
742
  schema.type_error(type_error, context)
706
743
  set_result(selection_result, result_name, nil, false, is_non_null)
@@ -747,7 +784,7 @@ module GraphQL
747
784
  inner_type_non_null = inner_type.non_null?
748
785
  response_list = GraphQLResultArray.new(result_name, current_type, owner_object, selection_result, is_non_null, next_selections, false, ast_node, arguments, field)
749
786
  set_result(selection_result, result_name, response_list, true, is_non_null)
750
- idx = nil
787
+ idx = nil #: Integer?
751
788
  list_value = begin
752
789
  begin
753
790
  value.each do |inner_value|
@@ -798,6 +835,8 @@ module GraphQL
798
835
 
799
836
  def resolve_list_item(inner_value, inner_type, inner_type_non_null, ast_node, field, owner_object, arguments, this_idx, response_list, owner_type, was_scoped, runtime_state) # rubocop:disable Metrics/ParameterLists
800
837
  runtime_state ||= get_current_runtime_state
838
+ runtime_state.current_field = field
839
+ runtime_state.current_arguments = arguments
801
840
  runtime_state.current_result_name = this_idx
802
841
  runtime_state.current_result = response_list
803
842
  call_method_on_directives(:resolve_each, owner_object, ast_node.directives) do
@@ -849,7 +888,7 @@ module GraphQL
849
888
  end
850
889
  end
851
890
 
852
- # 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
853
892
  def directives_include?(node, graphql_object, parent_type, selection_result, extra_path_part)
854
893
  node.directives.each do |dir_node|
855
894
  dir_defn = @schema_directives.fetch(dir_node.name)
@@ -898,11 +937,19 @@ module GraphQL
898
937
  end
899
938
  end
900
939
 
901
- # @param obj [Object] Some user-returned value that may want to be batched
902
- # @param field [GraphQL::Schema::Field]
903
- # @param eager [Boolean] Set to `true` for mutation root fields only
904
- # @param trace [Boolean] If `false`, don't wrap this with field tracing
905
- # @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
906
953
  def after_lazy(lazy_obj, field:, owner_object:, arguments:, ast_node:, result:, result_name:, eager: false, runtime_state:, trace: true, &block)
907
954
  if lazy?(lazy_obj)
908
955
  was_authorized_by_scope_items = runtime_state.was_authorized_by_scope_items
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
  require "fiber"
3
4
  require "graphql/execution/interpreter/argument_value"
4
5
  require "graphql/execution/interpreter/arguments"
@@ -13,14 +14,22 @@ module GraphQL
13
14
  class Interpreter
14
15
  class << self
15
16
  # Used internally to signal that the query shouldn't be executed
16
- # @api private
17
+ # :nodoc:
17
18
  NO_OPERATION = GraphQL::EmptyObjects::EMPTY_HASH
18
19
 
19
- # @param schema [GraphQL::Schema]
20
- # @param queries [Array<GraphQL::Query, Hash>]
21
- # @param context [Hash]
22
- # @param max_complexity [Integer, nil]
23
- # @return [Array<GraphQL::Query::Result>] One result per query
20
+ # **Parameters**
21
+ #
22
+ # - `schema` (`GraphQL::Schema`)
23
+ # - `queries` (`Array<GraphQL::Query, Hash>`)
24
+ # - `context` (`Hash`)
25
+ # - `max_complexity` (`Integer, nil`)
26
+ #
27
+ # **Returns**
28
+ #
29
+ # - `Array<GraphQL::Query::Result>` — One result per query
30
+ #
31
+ # :call-seq:
32
+ # run_all(GraphQL::Schema schema, query_options, Hash context:, Integer | nil max_complexity:) -> Array[GraphQL::Query::Result]
24
33
  def run_all(schema, query_options, context: {}, max_complexity: schema.max_complexity)
25
34
  previous_multiplex = Fiber[:__graphql_current_multiplex]
26
35
  queries = query_options.map do |opts|
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
  require 'thread'
3
4
  begin
4
5
  require 'concurrent'
@@ -9,13 +10,12 @@ end
9
10
  module GraphQL
10
11
  module Execution
11
12
  class Lazy
12
- # {GraphQL::Schema} uses this to match returned values to lazy resolution methods.
13
+ # [GraphQL::Schema](rdoc-ref:GraphQL::Schema) uses this to match returned values to lazy resolution methods.
13
14
  # Methods may be registered for classes, they apply to its subclasses also.
14
15
  # The result of this lookup is cached for future resolutions.
15
16
  # Instances of this class are thread-safe.
16
- # @api private
17
- # @see {Schema#lazy?} looks up values from this map
18
- class LazyMethodMap
17
+ # See the schema's `lazy?` configuration to understand which values use this map.
18
+ class LazyMethodMap # :nodoc:
19
19
  def initialize(use_concurrent: defined?(Concurrent::Map))
20
20
  @storage = use_concurrent ? Concurrent::Map.new : ConcurrentishMap.new
21
21
  end
@@ -24,14 +24,27 @@ module GraphQL
24
24
  @storage = other.storage.dup
25
25
  end
26
26
 
27
- # @param lazy_class [Class] A class which represents a lazy value (subclasses may also be used)
28
- # @param lazy_value_method [Symbol] The method to call on this class to get its value
27
+ # **Parameters**
28
+ #
29
+ # - `lazy_class` (`Class`) — A class which represents a lazy value (subclasses may also be used)
30
+ # - `lazy_value_method` (`Symbol`) — The method to call on this class to get its value
31
+ #
32
+ # :call-seq:
33
+ # set(Class lazy_class, Symbol lazy_value_method)
29
34
  def set(lazy_class, lazy_value_method)
30
35
  @storage[lazy_class] = lazy_value_method
31
36
  end
32
37
 
33
- # @param value [Object] an object which may have a `lazy_value_method` registered for its class or superclasses
34
- # @return [Symbol, nil] The `lazy_value_method` for this object, or nil
38
+ # **Parameters**
39
+ #
40
+ # - `value` (`Object`) — an object which may have a `lazy_value_method` registered for its class or superclasses
41
+ #
42
+ # **Returns**
43
+ #
44
+ # - `Symbol, nil` — The `lazy_value_method` for this object, or nil
45
+ #
46
+ # :call-seq:
47
+ # get(Object value) -> Symbol | nil
35
48
  def get(value)
36
49
  @storage.compute_if_absent(value.class) { find_superclass_method(value.class) }
37
50
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
  require "graphql/execution/lazy/lazy_method_map"
3
4
 
4
5
  module GraphQL
@@ -10,20 +11,30 @@ module GraphQL
10
11
  # This is an itty-bitty promise-like object, with key differences:
11
12
  # - It has only two states, not-resolved and resolved
12
13
  # - It has no error-catching functionality
13
- # @api private
14
- class Lazy
14
+ class Lazy # :nodoc:
15
15
  attr_reader :field
16
16
 
17
- # Create a {Lazy} which will get its inner value by calling the block
18
- # @param field [GraphQL::Schema::Field]
19
- # @param get_value_func [Proc] a block to get the inner value (later)
17
+ # Create a [Lazy](rdoc-ref:Lazy) which will get its inner value by calling the block
18
+ #
19
+ # **Parameters**
20
+ #
21
+ # - `field` (`GraphQL::Schema::Field`)
22
+ # - `get_value_func` (`Proc`) — a block to get the inner value (later)
23
+ #
24
+ # :call-seq:
25
+ # initialize(GraphQL::Schema::Field field:, Proc &get_value_func)
20
26
  def initialize(field: nil, &get_value_func)
21
27
  @get_value_func = get_value_func
22
28
  @resolved = false
23
29
  @field = field
24
30
  end
25
31
 
26
- # @return [Object] The wrapped value, calling the lazy block if necessary
32
+ # **Returns**
33
+ #
34
+ # - `Object` — The wrapped value, calling the lazy block if necessary
35
+ #
36
+ # :call-seq:
37
+ # value() -> Object
27
38
  def value
28
39
  if !@resolved
29
40
  @resolved = true
@@ -45,15 +56,28 @@ module GraphQL
45
56
  end
46
57
  end
47
58
 
48
- # @return [Lazy] A {Lazy} whose value depends on another {Lazy}, plus any transformations in `block`
59
+ # **Returns**
60
+ #
61
+ # - `Lazy` — A [Lazy](rdoc-ref:Lazy) whose value depends on another [Lazy](rdoc-ref:Lazy), plus any transformations in `block`
62
+ #
63
+ # :call-seq:
64
+ # then() -> Lazy
49
65
  def then
50
66
  self.class.new {
51
67
  yield(value)
52
68
  }
53
69
  end
54
70
 
55
- # @param lazies [Array<Object>] Maybe-lazy objects
56
- # @return [Lazy] A lazy which will sync all of `lazies`
71
+ # **Parameters**
72
+ #
73
+ # - `lazies` (`Array<Object>`) — Maybe-lazy objects
74
+ #
75
+ # **Returns**
76
+ #
77
+ # - `Lazy` — A lazy which will sync all of `lazies`
78
+ #
79
+ # :call-seq:
80
+ # all(Array[Object] lazies) -> Lazy
57
81
  def self.all(lazies)
58
82
  self.new {
59
83
  lazies.map { |l| l.is_a?(Lazy) ? l.value : l }
@@ -61,7 +85,7 @@ module GraphQL
61
85
  end
62
86
 
63
87
  # This can be used for fields which _had no_ lazy results
64
- # @api private
88
+ # :nodoc:
65
89
  NullResult = Lazy.new(){}
66
90
  NullResult.value
67
91
  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 LoadArgumentStep