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
@@ -1,17 +1,17 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
 
3
4
  require 'set'
4
5
 
5
6
  module GraphQL
6
7
  class Schema
7
- # Restrict access to a {GraphQL::Schema} with a user-defined `visible?` implementations.
8
+ # Restrict access to a [GraphQL::Schema](rdoc-ref:GraphQL::Schema) with a user-defined `visible?` implementations.
8
9
  #
9
10
  # When validating and executing a query, all access to schema members
10
11
  # should go through a warden. If you access the schema directly,
11
12
  # you may show a client something that it shouldn't be allowed to see.
12
13
  #
13
- # @api private
14
- class Warden
14
+ class Warden # :nodoc:
15
15
  def self.from_context(context)
16
16
  context.warden || PassThruWarden
17
17
  rescue NoMethodError
@@ -30,15 +30,23 @@ module GraphQL
30
30
  # no-op
31
31
  end
32
32
 
33
- # @param visibility_method [Symbol] a Warden method to call for this entry
34
- # @param entry [Object, Array<Object>] One or more definitions for a given name in a GraphQL Schema
35
- # @param context [GraphQL::Query::Context]
36
- # @param warden [Warden]
37
- # @return [Object] `entry` or one of `entry`'s items if exactly one of them is visible for this context
38
- # @return [nil] If neither `entry` nor any of `entry`'s items are visible for this context
33
+ # **Parameters**
34
+ #
35
+ # - `visibility_method` (`Symbol`) — a Warden method to call for this entry
36
+ # - `entry` (`Object, Array<Object>`) — One or more definitions for a given name in a GraphQL Schema
37
+ # - `context` (`GraphQL::Query::Context`)
38
+ # - `warden` (`Warden`)
39
+ #
40
+ # **Returns**
41
+ #
42
+ # - `Object` — `entry` or one of `entry`'s items if exactly one of them is visible for this context
43
+ # - `nil` — If neither `entry` nor any of `entry`'s items are visible for this context
44
+ #
45
+ # :call-seq:
46
+ # visible_entry?(Symbol visibility_method, Object | Array[Object] entry, GraphQL::Query::Context context, Warden warden) -> Object | nil
39
47
  def self.visible_entry?(visibility_method, entry, context, warden = Warden.from_context(context))
40
48
  if entry.is_a?(Array)
41
- visible_item = nil
49
+ visible_item = nil #: untyped
42
50
  entry.each do |item|
43
51
  if warden.public_send(visibility_method, item, context)
44
52
  if visible_item.nil?
@@ -107,7 +115,7 @@ module GraphQL
107
115
  def get_field(parent_type, field_name); @schema.get_field(parent_type, field_name); end
108
116
  def reachable_type?(type_name); true; end
109
117
  def loadable?(type, _ctx); true; end
110
- def loadable_possible_types(abstract_type, _ctx); union_type.possible_types; end
118
+ def loadable_possible_types(abstract_type, _ctx); possible_types(abstract_type); end
111
119
  def reachable_types; @schema.types.values; end # rubocop:disable Development/ContextIsPassedCop
112
120
  def possible_types(type_defn); @schema.possible_types(type_defn, Query::NullContext.instance, false); end
113
121
  def interfaces(obj_type); obj_type.interfaces; end
@@ -195,8 +203,13 @@ module GraphQL
195
203
  end
196
204
  end
197
205
 
198
- # @param context [GraphQL::Query::Context]
199
- # @param schema [GraphQL::Schema]
206
+ # **Parameters**
207
+ #
208
+ # - `context` (`GraphQL::Query::Context`)
209
+ # - `schema` (`GraphQL::Schema`)
210
+ #
211
+ # :call-seq:
212
+ # initialize(GraphQL::Query::Context context:, GraphQL::Schema schema:)
200
213
  def initialize(context:, schema:)
201
214
  @schema = schema
202
215
  # Cache these to avoid repeated hits to the inheritance chain when one isn't present
@@ -217,7 +230,12 @@ module GraphQL
217
230
 
218
231
  attr_writer :skip_warning
219
232
 
220
- # @return [Hash<String, GraphQL::BaseType>] Visible types in the schema
233
+ # **Returns**
234
+ #
235
+ # - `Hash<String, GraphQL::BaseType>` — Visible types in the schema
236
+ #
237
+ # :call-seq:
238
+ # types() -> Hash[String, GraphQL::BaseType]
221
239
  def types
222
240
  @types ||= begin
223
241
  vis_types = {}
@@ -230,7 +248,12 @@ module GraphQL
230
248
  end
231
249
  end
232
250
 
233
- # @return [Boolean] True if this type is used for `loads:` but not in the schema otherwise and not _explicitly_ hidden.
251
+ # **Returns**
252
+ #
253
+ # - `Boolean` — True if this type is used for `loads:` but not in the schema otherwise and not _explicitly_ hidden.
254
+ #
255
+ # :call-seq:
256
+ # loadable?(type, _ctx) -> bool
234
257
  def loadable?(type, _ctx)
235
258
  visible_type?(type) &&
236
259
  !referenced?(type) &&
@@ -242,15 +265,21 @@ module GraphQL
242
265
  def loadable_possible_types(abstract_type, _ctx)
243
266
  @loadable_possible_types ||= read_through do |t|
244
267
  if t.is_a?(Class) # union
268
+ t = t #: as singleton(GraphQL::Schema::Union)
245
269
  t.possible_types
246
270
  else
247
- @schema.possible_types(abstract_type)
271
+ @schema.possible_types(t)
248
272
  end
249
273
  end
250
274
  @loadable_possible_types[abstract_type]
251
275
  end
252
276
 
253
- # @return [GraphQL::BaseType, nil] The type named `type_name`, if it exists (else `nil`)
277
+ # **Returns**
278
+ #
279
+ # - `GraphQL::BaseType, nil` — The type named `type_name`, if it exists (else `nil`)
280
+ #
281
+ # :call-seq:
282
+ # get_type(type_name) -> GraphQL::BaseType | nil
254
283
  def get_type(type_name)
255
284
  @visible_types ||= read_through do |name|
256
285
  type_defn = @schema.get_type(name, @context, false)
@@ -264,18 +293,33 @@ module GraphQL
264
293
  @visible_types[type_name]
265
294
  end
266
295
 
267
- # @return [Array<GraphQL::BaseType>] Visible and reachable types in the schema
296
+ # **Returns**
297
+ #
298
+ # - `Array<GraphQL::BaseType>` — Visible and reachable types in the schema
299
+ #
300
+ # :call-seq:
301
+ # reachable_types() -> Array[GraphQL::BaseType]
268
302
  def reachable_types
269
303
  @reachable_types ||= reachable_type_set.to_a
270
304
  end
271
305
 
272
- # @return Boolean True if the type is visible and reachable in the schema
306
+ # **Returns**
307
+ #
308
+ # - `Object` — Boolean True if the type is visible and reachable in the schema
309
+ #
310
+ # :call-seq:
311
+ # reachable_type?(type_name) -> Object
273
312
  def reachable_type?(type_name)
274
313
  type = get_type(type_name) # rubocop:disable Development/ContextIsPassedCop -- `self` is query-aware
275
314
  type && reachable_type_set.include?(type)
276
315
  end
277
316
 
278
- # @return [GraphQL::Field, nil] The field named `field_name` on `parent_type`, if it exists
317
+ # **Returns**
318
+ #
319
+ # - `GraphQL::Field, nil` — The field named `field_name` on `parent_type`, if it exists
320
+ #
321
+ # :call-seq:
322
+ # get_field(parent_type, field_name) -> GraphQL::Field | nil
279
323
  def get_field(parent_type, field_name)
280
324
  @visible_parent_fields ||= read_through do |type|
281
325
  read_through do |f_name|
@@ -291,13 +335,23 @@ module GraphQL
291
335
  @visible_parent_fields[parent_type][field_name]
292
336
  end
293
337
 
294
- # @return [GraphQL::Argument, nil] The argument named `argument_name` on `parent_type`, if it exists and is visible
338
+ # **Returns**
339
+ #
340
+ # - `GraphQL::Argument, nil` — The argument named `argument_name` on `parent_type`, if it exists and is visible
341
+ #
342
+ # :call-seq:
343
+ # get_argument(parent_type, argument_name) -> GraphQL::Argument | nil
295
344
  def get_argument(parent_type, argument_name)
296
345
  argument = parent_type.get_argument(argument_name, @context)
297
346
  return argument if argument && visible_argument?(argument, @context)
298
347
  end
299
348
 
300
- # @return [Array<GraphQL::BaseType>] The types which may be member of `type_defn`
349
+ # **Returns**
350
+ #
351
+ # - `Array<GraphQL::BaseType>` — The types which may be member of `type_defn`
352
+ #
353
+ # :call-seq:
354
+ # possible_types(type_defn) -> Array[GraphQL::BaseType]
301
355
  def possible_types(type_defn)
302
356
  @visible_possible_types ||= read_through { |type_defn|
303
357
  pt = @schema.possible_types(type_defn, @context, false)
@@ -306,15 +360,31 @@ module GraphQL
306
360
  @visible_possible_types[type_defn]
307
361
  end
308
362
 
309
- # @param type_defn [GraphQL::ObjectType, GraphQL::InterfaceType]
310
- # @return [Array<GraphQL::Field>] Fields on `type_defn`
363
+ # **Parameters**
364
+ #
365
+ # - `type_defn` (`GraphQL::ObjectType, GraphQL::InterfaceType`)
366
+ #
367
+ # **Returns**
368
+ #
369
+ # - `Array<GraphQL::Field>` — Fields on `type_defn`
370
+ #
371
+ # :call-seq:
372
+ # fields(GraphQL::ObjectType | GraphQL::InterfaceType type_defn) -> Array[GraphQL::Field]
311
373
  def fields(type_defn)
312
374
  @visible_fields ||= read_through { |t| @schema.get_fields(t, @context).values }
313
375
  @visible_fields[type_defn]
314
376
  end
315
377
 
316
- # @param argument_owner [GraphQL::Field, GraphQL::InputObjectType]
317
- # @return [Array<GraphQL::Argument>] Visible arguments on `argument_owner`
378
+ # **Parameters**
379
+ #
380
+ # - `argument_owner` (`GraphQL::Field, GraphQL::InputObjectType`)
381
+ #
382
+ # **Returns**
383
+ #
384
+ # - `Array<GraphQL::Argument>` — Visible arguments on `argument_owner`
385
+ #
386
+ # :call-seq:
387
+ # arguments(GraphQL::Field | GraphQL::InputObjectType argument_owner, ctx) -> Array[GraphQL::Argument]
318
388
  def arguments(argument_owner, ctx = nil)
319
389
  @visible_arguments ||= read_through { |o|
320
390
  args = o.arguments(@context)
@@ -329,7 +399,12 @@ module GraphQL
329
399
  @visible_arguments[argument_owner]
330
400
  end
331
401
 
332
- # @return [Array<GraphQL::EnumType::EnumValue>] Visible members of `enum_defn`
402
+ # **Returns**
403
+ #
404
+ # - `Array<GraphQL::EnumType::EnumValue>` — Visible members of `enum_defn`
405
+ #
406
+ # :call-seq:
407
+ # enum_values(enum_defn) -> Array[GraphQL::EnumType::EnumValue]
333
408
  def enum_values(enum_defn)
334
409
  @visible_enum_arrays ||= read_through { |e|
335
410
  values = e.enum_values(@context)
@@ -346,7 +421,12 @@ module GraphQL
346
421
  @visible_enum_values[enum_value]
347
422
  end
348
423
 
349
- # @return [Array<GraphQL::InterfaceType>] Visible interfaces implemented by `obj_type`
424
+ # **Returns**
425
+ #
426
+ # - `Array<GraphQL::InterfaceType>` — Visible interfaces implemented by `obj_type`
427
+ #
428
+ # :call-seq:
429
+ # interfaces(obj_type) -> Array[GraphQL::InterfaceType]
350
430
  def interfaces(obj_type)
351
431
  @visible_interfaces ||= read_through { |t|
352
432
  ints = t.interfaces(@context)
@@ -371,7 +451,12 @@ module GraphQL
371
451
  end
372
452
  end
373
453
 
374
- # @param owner [Class, Module] If provided, confirm that field has the given owner.
454
+ # **Parameters**
455
+ #
456
+ # - `owner` (`Class, Module`) — If provided, confirm that field has the given owner.
457
+ #
458
+ # :call-seq:
459
+ # visible_field?(field_defn, _ctx, Class | Module owner)
375
460
  def visible_field?(field_defn, _ctx = nil, owner = field_defn.owner)
376
461
  # This field is visible in its own right
377
462
  visible?(field_defn) &&
@@ -453,8 +538,8 @@ module GraphQL
453
538
  # (If it _wasn't_ inherited, then don't hide it for this reason.)
454
539
  def field_on_visible_interface?(field_defn, type_defn)
455
540
  if type_defn.kind.object?
456
- any_interface_has_field = false
457
- any_interface_has_visible_field = false
541
+ any_interface_has_field = false #: bool
542
+ any_interface_has_visible_field = false #: bool
458
543
  ints = unfiltered_interfaces(type_defn)
459
544
  ints.each do |interface_type|
460
545
  if (iface_field_defn = interface_type.get_field(field_defn.graphql_name, @context))
@@ -510,6 +595,7 @@ module GraphQL
510
595
  member_type = case member
511
596
  when Module
512
597
  if member.respond_to?(:kind)
598
+ member = member #: as GraphQL::Schema::Member::type_definition
513
599
  member.kind.name.downcase
514
600
  else
515
601
  ""
@@ -1,11 +1,14 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
 
3
4
  module GraphQL
4
5
  class Schema
5
6
  class Wrapper
6
7
  include GraphQL::Schema::Member::TypeSystemHelpers
7
8
 
8
- # @return [Class, Module] The inner type of this wrapping type, the type of which one or more objects may be present.
9
+ # **Returns**
10
+ #
11
+ # - `Class, Module` — The inner type of this wrapping type, the type of which one or more objects may be present.
9
12
  attr_reader :of_type
10
13
 
11
14
  def initialize(of_type)