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
 
3
4
  module GraphQL
4
5
  class Schema
@@ -13,37 +14,53 @@ module GraphQL
13
14
  # Note that this will stop a query _in between_ field resolutions, but
14
15
  # it doesn't interrupt long-running `resolve` functions. Be sure to use
15
16
  # timeout options for external connections. For more info, see
16
- # www.mikeperham.com/2015/05/08/timeout-rubys-most-dangerous-api/
17
+ # https://www.mikeperham.com/2015/05/08/timeout-rubys-most-dangerous-api/
17
18
  #
18
- # @example Stop resolving fields after 2 seconds
19
- # class MySchema < GraphQL::Schema
20
- # use GraphQL::Schema::Timeout, max_seconds: 2
21
- # end
19
+ # **Examples**
22
20
  #
23
- # @example Notifying Bugsnag and logging a timeout
24
- # class MyTimeout < GraphQL::Schema::Timeout
25
- # def handle_timeout(error, query)
26
- # Rails.logger.warn("GraphQL Timeout: #{error.message}: #{query.query_string}")
27
- # Bugsnag.notify(error, {query_string: query.query_string})
28
- # end
29
- # end
21
+ # **Example: Stop resolving fields after 2 seconds**
22
+ #
23
+ # ```ruby
24
+ # class MySchema < GraphQL::Schema
25
+ # use GraphQL::Schema::Timeout, max_seconds: 2
26
+ # end
27
+ # ```
30
28
  #
31
- # class MySchema < GraphQL::Schema
32
- # use MyTimeout, max_seconds: 2
29
+ # **Example: Notifying Bugsnag and logging a timeout**
30
+ #
31
+ # ```ruby
32
+ # class MyTimeout < GraphQL::Schema::Timeout
33
+ # def handle_timeout(error, query)
34
+ # Rails.logger.warn("GraphQL Timeout: #{error.message}: #{query.query_string}")
35
+ # Bugsnag.notify(error, {query_string: query.query_string})
33
36
  # end
37
+ # end
34
38
  #
39
+ # class MySchema < GraphQL::Schema
40
+ # use MyTimeout, max_seconds: 2
41
+ # end
42
+ # ```
35
43
  class Timeout
36
44
  def self.use(schema, max_seconds: nil)
37
45
  timeout = self.new(max_seconds: max_seconds)
38
- schema.trace_with(self::Trace, timeout: timeout)
46
+ schema.trace_with(const_get(:Trace), timeout: timeout)
39
47
  end
40
48
 
41
49
  def initialize(max_seconds:)
42
50
  @max_seconds = max_seconds
43
51
  end
44
52
 
53
+ #--
54
+
55
+ # @requires_ancestor: Kernel
56
+
45
57
  module Trace
46
- # @param max_seconds [Numeric] how many seconds the query should be allowed to resolve new fields
58
+ # **Parameters**
59
+ #
60
+ # - `max_seconds` (`Numeric`) — how many seconds the query should be allowed to resolve new fields
61
+ #
62
+ # :call-seq:
63
+ # initialize(timeout:, **rest)
47
64
  def initialize(timeout:, **rest)
48
65
  @timeout = timeout
49
66
  super
@@ -97,34 +114,57 @@ module GraphQL
97
114
  # Called at the start of each query.
98
115
  # The default implementation returns the `max_seconds:` value from installing this plugin.
99
116
  #
100
- # @param query [GraphQL::Query] The query that's about to run
101
- # @return [Numeric, false] The number of seconds after which to interrupt query execution and call {#handle_error}, or `false` to bypass the timeout.
117
+ # **Parameters**
118
+ #
119
+ # - `query` (`GraphQL::Query`) — The query that's about to run
120
+ #
121
+ # **Returns**
122
+ #
123
+ # - `Numeric, false` — The number of seconds after which to interrupt query execution and call `handle_error`, or `false` to bypass the timeout.
124
+ #
125
+ # :call-seq:
126
+ # max_seconds(GraphQL::Query query) -> Numeric | false
102
127
  def max_seconds(query)
103
128
  @max_seconds
104
129
  end
105
130
 
106
131
  # Invoked when a query times out.
107
- # @param error [GraphQL::Schema::Timeout::TimeoutError]
108
- # @param query [GraphQL::Error]
132
+ #
133
+ # **Parameters**
134
+ #
135
+ # - `error` (`GraphQL::Schema::Timeout::TimeoutError`)
136
+ # - `query` (`GraphQL::Error`)
137
+ #
138
+ # :call-seq:
139
+ # handle_timeout(GraphQL::Schema::Timeout::TimeoutError error, GraphQL::Error query)
109
140
  def handle_timeout(error, query)
110
141
  # override to do something interesting
111
142
  end
112
143
 
113
- # Call this method (eg, from {#handle_timeout}) to disable timeout tracking
144
+ # Call this method (eg, from [handle timeout](rdoc-ref:#handle_timeout)) to disable timeout tracking
114
145
  # for the given query.
115
- # @param query [GraphQL::Query]
116
- # @return [void]
146
+ #
147
+ # **Parameters**
148
+ #
149
+ # - `query` (`GraphQL::Query`)
150
+ #
151
+ # **Returns**
152
+ #
153
+ # - `void`
154
+ #
155
+ # :call-seq:
156
+ # disable_timeout(GraphQL::Query query) -> void
117
157
  def disable_timeout(query)
118
158
  query.context.namespace(self)[:state] = false
119
159
  nil
120
160
  end
121
161
 
122
162
  # This error is raised when a query exceeds `max_seconds`.
123
- # Since it's a child of {GraphQL::ExecutionError},
163
+ # Since it's a child of [GraphQL::ExecutionError](rdoc-ref:GraphQL::ExecutionError),
124
164
  # its message will be added to the response's `errors` key.
125
165
  #
126
166
  # To raise an error that will stop query resolution, use a custom block
127
- # to take this error and raise a new one which _doesn't_ descend from {GraphQL::ExecutionError},
167
+ # to take this error and raise a new one which _doesn't_ descend from [GraphQL::ExecutionError](rdoc-ref:GraphQL::ExecutionError),
128
168
  # such as `RuntimeError`.
129
169
  class TimeoutError < GraphQL::ExecutionError
130
170
  def initialize(field)
@@ -1,13 +1,22 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
  module GraphQL
3
4
  class Schema
4
- # @api private
5
- module TypeExpression
5
+ module TypeExpression # :nodoc:
6
6
  # Fetch a type from a type map by its AST specification.
7
7
  # Return `nil` if not found.
8
- # @param type_owner [#type] A thing for looking up types by name
9
- # @param ast_node [GraphQL::Language::Nodes::AbstractNode]
10
- # @return [Class, GraphQL::Schema::NonNull, GraphQL::Schema:List]
8
+ #
9
+ # **Parameters**
10
+ #
11
+ # - `type_owner` (`#type`) — A thing for looking up types by name
12
+ # - `ast_node` (`GraphQL::Language::Nodes::AbstractNode`)
13
+ #
14
+ # **Returns**
15
+ #
16
+ # - `Class, GraphQL::Schema::NonNull, GraphQL::Schema:List`
17
+ #
18
+ # :call-seq:
19
+ # build_type(#type type_owner, GraphQL::Language::Nodes::AbstractNode ast_node) -> Class | GraphQL::Schema::NonNull | GraphQL::Schema:List
11
20
  def self.build_type(type_owner, ast_node)
12
21
  case ast_node
13
22
  when GraphQL::Language::Nodes::TypeName
@@ -1,32 +1,49 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
 
3
4
  module GraphQL
4
5
  class Schema
5
6
  # This class joins an object type to an abstract type (interface or union) of which
6
7
  # it is a member.
7
8
  class TypeMembership
8
- # @return [Class<GraphQL::Schema::Object>]
9
+ # **Returns**
10
+ #
11
+ # - `Class<GraphQL::Schema::Object>`
9
12
  attr_accessor :object_type
10
13
 
11
- # @return [Class<GraphQL::Schema::Union>, Module<GraphQL::Schema::Interface>]
14
+ # **Returns**
15
+ #
16
+ # - `Class<GraphQL::Schema::Union>, Module<GraphQL::Schema::Interface>`
12
17
  attr_reader :abstract_type
13
18
 
14
- # @return [Hash]
19
+ # **Returns**
20
+ #
21
+ # - `Hash`
15
22
  attr_reader :options
16
23
 
17
- # Called when an object is hooked up to an abstract type, such as {Schema::Union.possible_types}
18
- # or {Schema::Object.implements} (for interfaces).
24
+ # Called when an object is hooked up to an abstract type, such as [Schema::Union.possible_types](rdoc-ref:Schema::Union.possible_types)
25
+ # or `Schema::Object.implements` (for interfaces).
26
+ #
27
+ # **Parameters**
19
28
  #
20
- # @param abstract_type [Class<GraphQL::Schema::Union>, Module<GraphQL::Schema::Interface>]
21
- # @param object_type [Class<GraphQL::Schema::Object>]
22
- # @param options [Hash] Any options passed to `.possible_types` or `.implements`
29
+ # - `abstract_type` (`Class<GraphQL::Schema::Union>, Module<GraphQL::Schema::Interface>`)
30
+ # - `object_type` (`Class<GraphQL::Schema::Object>`)
31
+ # - `options` (`Hash`) — Any options passed to `.possible_types` or `.implements`
32
+ #
33
+ # :call-seq:
34
+ # initialize(Class[GraphQL::Schema::Union] | Module[GraphQL::Schema::Interface] abstract_type, Class[GraphQL::Schema::Object] object_type, Hash **options)
23
35
  def initialize(abstract_type, object_type, **options)
24
36
  @abstract_type = abstract_type
25
37
  @object_type = object_type
26
38
  @options = options
27
39
  end
28
40
 
29
- # @return [Boolean] if false, {#object_type} will be treated as _not_ a member of {#abstract_type}
41
+ # **Returns**
42
+ #
43
+ # - `Boolean` — if false, [object type](rdoc-ref:#object_type) will be treated as _not_ a member of [abstract type](rdoc-ref:#abstract_type)
44
+ #
45
+ # :call-seq:
46
+ # visible?(ctx) -> bool
30
47
  def visible?(ctx)
31
48
  warden = Warden.from_context(ctx)
32
49
  (@object_type.respond_to?(:visible?) ? warden.visible_type?(@object_type, ctx) : true) &&
@@ -45,7 +62,9 @@ module GraphQL
45
62
  "#<#{self.class} #{@object_type.inspect} => #{@abstract_type.inspect}>"
46
63
  end
47
64
 
48
- alias :type_class :itself
65
+ def type_class
66
+ self
67
+ end
49
68
  end
50
69
  end
51
70
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
  module GraphQL
3
4
  class Schema
4
5
  class Union < GraphQL::Schema::Member
@@ -51,8 +52,7 @@ module GraphQL
51
52
  # Update a type membership whose `.object_type` is a string or late-bound type
52
53
  # so that the type membership's `.object_type` is the given `object_type`.
53
54
  # (This is used for updating the union after the schema as lazily loaded the union member.)
54
- # @api private
55
- def assign_type_membership_object_type(object_type)
55
+ def assign_type_membership_object_type(object_type) # :nodoc:
56
56
  assert_valid_union_member(object_type)
57
57
  type_memberships.each { |tm|
58
58
  possible_type = tm.object_type
@@ -72,11 +72,13 @@ module GraphQL
72
72
  def assert_valid_union_member(type_defn)
73
73
  case type_defn
74
74
  when Class
75
+ type_defn = type_defn #: as GraphQL::Schema::Member::type_definition
75
76
  if !type_defn.kind.object?
76
77
  raise ArgumentError, "Union possible_types can only be object types (not #{type_defn.kind.name}, #{type_defn.inspect})"
77
78
  end
78
79
  when Module
79
80
  # it's an interface type, defined as a module
81
+ type_defn = type_defn #: as GraphQL::Schema::Member::type_definition
80
82
  raise ArgumentError, "Union possible_types can only be object types (not interface types), remove #{type_defn.graphql_name} (#{type_defn.inspect})"
81
83
  when String, GraphQL::Schema::LateBoundType
82
84
  # Ok - assume it will get checked later
@@ -1,8 +1,11 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
  require "base64"
3
4
 
4
5
  module GraphQL
5
6
  class Schema
7
+ #--
8
+ # @requires_ancestor: Kernel
6
9
  module UniqueWithinType
7
10
  class << self
8
11
  attr_accessor :default_id_separator
@@ -11,9 +14,17 @@ module GraphQL
11
14
 
12
15
  module_function
13
16
 
14
- # @param type_name [String]
15
- # @param object_value [Any]
16
- # @return [String] a unique, opaque ID generated as a function of the two inputs
17
+ # **Parameters**
18
+ #
19
+ # - `type_name` (`String`)
20
+ # - `object_value` (`Any`)
21
+ #
22
+ # **Returns**
23
+ #
24
+ # - `String` — a unique, opaque ID generated as a function of the two inputs
25
+ #
26
+ # :call-seq:
27
+ # encode(String type_name, Any object_value, separator:) -> String
17
28
  def encode(type_name, object_value, separator: self.default_id_separator)
18
29
  object_value_str = object_value.to_s
19
30
 
@@ -24,8 +35,16 @@ module GraphQL
24
35
  Base64.strict_encode64([type_name, object_value_str].join(separator))
25
36
  end
26
37
 
27
- # @param node_id [String] A unique ID generated by {.encode}
28
- # @return [Array<(String, String)>] The type name & value passed to {.encode}
38
+ # **Parameters**
39
+ #
40
+ # - `node_id` (`String`) — A unique ID generated by [.encode](rdoc-ref:.encode)
41
+ #
42
+ # **Returns**
43
+ #
44
+ # - `Array<(String, String)>` — The type name & value passed to [.encode](rdoc-ref:.encode)
45
+ #
46
+ # :call-seq:
47
+ # decode(String node_id, separator:) -> Array[(String, String)]
29
48
  def decode(node_id, separator: self.default_id_separator)
30
49
  GraphQL::Schema::Base64Encoder.decode(node_id).split(separator, 2)
31
50
  end
@@ -1,25 +1,33 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
 
3
4
  module GraphQL
4
5
  class Schema
5
6
  class Validator
6
7
  # Use this to validate each member of an array value.
7
8
  #
8
- # @example validate format of all strings in an array
9
+ # **Examples**
9
10
  #
10
- # argument :handles, [String],
11
- # validates: { all: { format: { with: /\A[a-z0-9_]+\Z/ } } }
11
+ # **Example: validate format of all strings in an array**
12
12
  #
13
- # @example multiple validators can be combined
13
+ # ```ruby
14
+ # argument :handles, [String],
15
+ # validates: { all: { format: { with: /\A[a-z0-9_]+\Z/ } } }
16
+ # ```
14
17
  #
15
- # argument :handles, [String],
16
- # validates: { all: { format: { with: /\A[a-z0-9_]+\Z/ }, length: { maximum: 32 } } }
18
+ # **Example: multiple validators can be combined**
17
19
  #
18
- # @example any type can be used
20
+ # ```ruby
21
+ # argument :handles, [String],
22
+ # validates: { all: { format: { with: /\A[a-z0-9_]+\Z/ }, length: { maximum: 32 } } }
23
+ # ```
19
24
  #
20
- # argument :choices, [Integer],
21
- # validates: { all: { inclusion: { in: 1..12 } } }
25
+ # **Example: any type can be used**
22
26
  #
27
+ # ```ruby
28
+ # argument :choices, [Integer],
29
+ # validates: { all: { inclusion: { in: 1..12 } } }
30
+ # ```
23
31
  class AllValidator < Validator
24
32
  def initialize(validated:, allow_blank: false, allow_null: false, **validators)
25
33
  super(validated: validated, allow_blank: allow_blank, allow_null: allow_null)
@@ -1,12 +1,18 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
 
3
4
  module GraphQL
4
5
  class Schema
5
6
  class Validator
6
7
  # Use this to specifically reject values that respond to `.blank?` and respond truthy for that method.
7
8
  #
8
- # @example Require a non-empty string for an argument
9
- # argument :name, String, required: true, validate: { allow_blank: false }
9
+ # **Examples**
10
+ #
11
+ # **Example: Require a non-empty string for an argument**
12
+ #
13
+ # ```ruby
14
+ # argument :name, String, required: true, validate: { allow_blank: false }
15
+ # ```
10
16
  class AllowBlankValidator < Validator
11
17
  def initialize(allow_blank_positional = nil, allow_blank: nil, message: "%{validated} can't be blank", **default_options)
12
18
  @message = message
@@ -1,12 +1,18 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
 
3
4
  module GraphQL
4
5
  class Schema
5
6
  class Validator
6
7
  # Use this to specifically reject or permit `nil` values (given as `null` from GraphQL).
7
8
  #
8
- # @example require a non-null value for an argument if it is provided
9
- # argument :name, String, required: false, validates: { allow_null: false }
9
+ # **Examples**
10
+ #
11
+ # **Example: require a non-null value for an argument if it is provided**
12
+ #
13
+ # ```ruby
14
+ # argument :name, String, required: false, validates: { allow_null: false }
15
+ # ```
10
16
  class AllowNullValidator < Validator
11
17
  MESSAGE = "%{validated} can't be null"
12
18
  def initialize(allow_null_positional = nil, allow_null: nil, message: MESSAGE, **default_options)
@@ -1,18 +1,27 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
 
3
4
  module GraphQL
4
5
  class Schema
5
6
  class Validator
6
7
  # Use this to specifically reject values from an argument.
7
8
  #
8
- # @example disallow certain values
9
+ # **Examples**
9
10
  #
10
- # argument :favorite_non_prime, Integer, required: true,
11
- # validates: { exclusion: { in: [2, 3, 5, 7, ... ]} }
11
+ # **Example: disallow certain values**
12
12
  #
13
+ # ```ruby
14
+ # argument :favorite_non_prime, Integer, required: true,
15
+ # validates: { exclusion: { in: [2, 3, 5, 7, ... ]} }
16
+ # ```
13
17
  class ExclusionValidator < Validator
14
- # @param message [String]
15
- # @param in [Array] The values to reject
18
+ # **Parameters**
19
+ #
20
+ # - `message` (`String`)
21
+ # - `in` (`Array`) — The values to reject
22
+ #
23
+ # :call-seq:
24
+ # initialize(String message:, Array in:, **default_options)
16
25
  def initialize(message: "%{validated} is reserved", in:, **default_options)
17
26
  # `in` is a reserved word, so work around that
18
27
  @in_list = binding.local_variable_get(:in)
@@ -1,26 +1,37 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
 
3
4
  module GraphQL
4
5
  class Schema
5
6
  class Validator
6
7
  # Use this to assert that string values match (or don't match) the given RegExp.
7
8
  #
8
- # @example requiring input to match a pattern
9
+ # **Examples**
9
10
  #
10
- # argument :handle, String, required: true,
11
- # validates: { format: { with: /\A[a-z0-9_]+\Z/ } }
11
+ # **Example: requiring input to match a pattern**
12
12
  #
13
- # @example reject inputs that match a pattern
13
+ # ```ruby
14
+ # argument :handle, String, required: true,
15
+ # validates: { format: { with: /\A[a-z0-9_]+\Z/ } }
16
+ # ```
14
17
  #
15
- # argument :word_that_doesnt_begin_with_a_vowel, String, required: true,
16
- # validates: { format: { without: /\A[aeiou]/ } }
18
+ # **Example: reject inputs that match a pattern**
17
19
  #
18
- # # It's pretty hard to come up with a legitimate use case for `without:`
20
+ # ```ruby
21
+ # argument :word_that_doesnt_begin_with_a_vowel, String, required: true,
22
+ # validates: { format: { without: /\A[aeiou]/ } }
19
23
  #
24
+ # # It's pretty hard to come up with a legitimate use case for `without:`
25
+ # ```
20
26
  class FormatValidator < Validator
21
- # @param with [RegExp, nil]
22
- # @param without [Regexp, nil]
23
- # @param message [String]
27
+ # **Parameters**
28
+ #
29
+ # - `with` (`RegExp, nil`)
30
+ # - `without` (`Regexp, nil`)
31
+ # - `message` (`String`)
32
+ #
33
+ # :call-seq:
34
+ # initialize(RegExp | nil with:, Regexp | nil without:, String message:, **default_options)
24
35
  def initialize(
25
36
  with: nil,
26
37
  without: nil,
@@ -1,20 +1,29 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
 
3
4
  module GraphQL
4
5
  class Schema
5
6
  class Validator
6
7
  # You can use this to allow certain values for an argument.
7
8
  #
8
- # Usually, a {GraphQL::Schema::Enum} is better for this, because it's self-documenting.
9
+ # Usually, a [GraphQL::Schema::Enum](rdoc-ref:GraphQL::Schema::Enum) is better for this, because it's self-documenting.
9
10
  #
10
- # @example only allow certain values for an argument
11
+ # **Examples**
11
12
  #
12
- # argument :favorite_prime, Integer, required: true,
13
- # validates: { inclusion: { in: [2, 3, 5, 7, 11, ... ] } }
13
+ # **Example: only allow certain values for an argument**
14
14
  #
15
+ # ```ruby
16
+ # argument :favorite_prime, Integer, required: true,
17
+ # validates: { inclusion: { in: [2, 3, 5, 7, 11, ... ] } }
18
+ # ```
15
19
  class InclusionValidator < Validator
16
- # @param message [String]
17
- # @param in [Array] The values to allow
20
+ # **Parameters**
21
+ #
22
+ # - `message` (`String`)
23
+ # - `in` (`Array`) — The values to allow
24
+ #
25
+ # :call-seq:
26
+ # initialize(Array in:, String message:, **default_options)
18
27
  def initialize(in:, message: "%{validated} is not included in the list", **default_options)
19
28
  # `in` is a reserved word, so work around that
20
29
  @in_list = binding.local_variable_get(:in)
@@ -1,27 +1,38 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
 
3
4
  module GraphQL
4
5
  class Schema
5
6
  class Validator
6
7
  # Use this to enforce a `.length` restriction on incoming values. It works for both Strings and Lists.
7
8
  #
8
- # @example Allow no more than 10 IDs
9
+ # **Examples**
9
10
  #
10
- # argument :ids, [ID], required: true, validates: { length: { maximum: 10 } }
11
+ # **Example: Allow no more than 10 IDs**
11
12
  #
12
- # @example Require three selections
13
+ # ```ruby
14
+ # argument :ids, [ID], required: true, validates: { length: { maximum: 10 } }
15
+ # ```
13
16
  #
14
- # argument :ice_cream_preferences, [ICE_CREAM_FLAVOR], required: true, validates: { length: { is: 3 } }
17
+ # **Example: Require three selections**
15
18
  #
19
+ # ```ruby
20
+ # argument :ice_cream_preferences, [ICE_CREAM_FLAVOR], required: true, validates: { length: { is: 3 } }
21
+ # ```
16
22
  class LengthValidator < Validator
17
- # @param maximum [Integer]
18
- # @param too_long [String] Used when `maximum` is exceeded or value is greater than `within`
19
- # @param minimum [Integer]
20
- # @param too_short [String] Used with value is less than `minimum` or less than `within`
21
- # @param is [Integer] Exact length requirement
22
- # @param wrong_length [String] Used when value doesn't match `is`
23
- # @param within [Range] An allowed range (becomes `minimum:` and `maximum:` under the hood)
24
- # @param message [String]
23
+ # **Parameters**
24
+ #
25
+ # - `maximum` (`Integer`)
26
+ # - `too_long` (`String`) — Used when `maximum` is exceeded or value is greater than `within`
27
+ # - `minimum` (`Integer`)
28
+ # - `too_short` (`String`) — Used with value is less than `minimum` or less than `within`
29
+ # - `is` (`Integer`) — Exact length requirement
30
+ # - `wrong_length` (`String`) — Used when value doesn't match `is`
31
+ # - `within` (`Range`) — An allowed range (becomes `minimum:` and `maximum:` under the hood)
32
+ # - `message` (`String`)
33
+ #
34
+ # :call-seq:
35
+ # initialize(Integer maximum:, String too_long:)
25
36
  def initialize(
26
37
  maximum: nil, too_long: "%{validated} is too long (maximum is %{count})",
27
38
  minimum: nil, too_short: "%{validated} is too short (minimum is %{count})",
@@ -1,32 +1,45 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
  module GraphQL
3
4
  class Schema
4
5
  class Validator
5
6
  # Use this to assert numerical comparisons hold true for inputs.
6
7
  #
7
- # @example Require a number between 0 and 1
8
+ # **Examples**
8
9
  #
9
- # argument :batting_average, Float, required: true, validates: { numericality: { within: 0..1 } }
10
+ # **Example: Require a number between 0 and 1**
10
11
  #
11
- # @example Require the number 42
12
+ # ```ruby
13
+ # argument :batting_average, Float, required: true, validates: { numericality: { within: 0..1 } }
14
+ # ```
12
15
  #
13
- # argument :the_answer, Integer, required: true, validates: { numericality: { equal_to: 42 } }
16
+ # **Example: Require the number 42**
14
17
  #
15
- # @example Require a real number
18
+ # ```ruby
19
+ # argument :the_answer, Integer, required: true, validates: { numericality: { equal_to: 42 } }
20
+ # ```
16
21
  #
17
- # argument :items_count, Integer, required: true, validates: { numericality: { greater_than_or_equal_to: 0 } }
22
+ # **Example: Require a real number**
18
23
  #
24
+ # ```ruby
25
+ # argument :items_count, Integer, required: true, validates: { numericality: { greater_than_or_equal_to: 0 } }
26
+ # ```
19
27
  class NumericalityValidator < Validator
20
- # @param greater_than [Integer]
21
- # @param greater_than_or_equal_to [Integer]
22
- # @param less_than [Integer]
23
- # @param less_than_or_equal_to [Integer]
24
- # @param equal_to [Integer]
25
- # @param other_than [Integer]
26
- # @param odd [Boolean]
27
- # @param even [Boolean]
28
- # @param within [Range]
29
- # @param message [String] used for all validation failures
28
+ # **Parameters**
29
+ #
30
+ # - `greater_than` (`Integer`)
31
+ # - `greater_than_or_equal_to` (`Integer`)
32
+ # - `less_than` (`Integer`)
33
+ # - `less_than_or_equal_to` (`Integer`)
34
+ # - `equal_to` (`Integer`)
35
+ # - `other_than` (`Integer`)
36
+ # - `odd` (`Boolean`)
37
+ # - `even` (`Boolean`)
38
+ # - `within` (`Range`)
39
+ # - `message` (`String`) — used for all validation failures
40
+ #
41
+ # :call-seq:
42
+ # initialize(Integer greater_than:, Integer greater_than_or_equal_to:, Integer less_than:, Integer less_than_or_equal_to:, Integer equal_to:, Integer other_than:, bool odd:, bool even:, Range within:, String message:, null_message:, **default_options)
30
43
  def initialize(
31
44
  greater_than: nil, greater_than_or_equal_to: nil,
32
45
  less_than: nil, less_than_or_equal_to: nil,