graphql 2.6.9 → 2.6.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (382) hide show
  1. checksums.yaml +4 -4
  2. data/.rdoc_options +4 -0
  3. data/lib/generators/graphql/core.rb +1 -0
  4. data/lib/generators/graphql/detailed_trace_generator.rb +1 -0
  5. data/lib/generators/graphql/enum_generator.rb +1 -0
  6. data/lib/generators/graphql/field_extractor.rb +1 -0
  7. data/lib/generators/graphql/input_generator.rb +1 -0
  8. data/lib/generators/graphql/install/mutation_root_generator.rb +1 -0
  9. data/lib/generators/graphql/install_generator.rb +1 -0
  10. data/lib/generators/graphql/interface_generator.rb +1 -0
  11. data/lib/generators/graphql/loader_generator.rb +8 -2
  12. data/lib/generators/graphql/mutation_create_generator.rb +8 -2
  13. data/lib/generators/graphql/mutation_delete_generator.rb +8 -2
  14. data/lib/generators/graphql/mutation_generator.rb +8 -2
  15. data/lib/generators/graphql/mutation_update_generator.rb +8 -2
  16. data/lib/generators/graphql/object_generator.rb +1 -0
  17. data/lib/generators/graphql/orm_mutations_base.rb +8 -2
  18. data/lib/generators/graphql/relay.rb +1 -0
  19. data/lib/generators/graphql/relay_generator.rb +1 -0
  20. data/lib/generators/graphql/scalar_generator.rb +1 -0
  21. data/lib/generators/graphql/type_generator.rb +38 -8
  22. data/lib/generators/graphql/union_generator.rb +1 -0
  23. data/lib/graphql/analysis/analyzer.rb +35 -9
  24. data/lib/graphql/analysis/field_usage.rb +1 -0
  25. data/lib/graphql/analysis/max_query_complexity.rb +3 -2
  26. data/lib/graphql/analysis/max_query_depth.rb +1 -0
  27. data/lib/graphql/analysis/query_complexity.rb +57 -20
  28. data/lib/graphql/analysis/query_depth.rb +17 -12
  29. data/lib/graphql/analysis/visitor.rb +79 -16
  30. data/lib/graphql/analysis.rb +23 -6
  31. data/lib/graphql/analysis_error.rb +1 -0
  32. data/lib/graphql/autoload.rb +30 -7
  33. data/lib/graphql/backtrace/table.rb +21 -5
  34. data/lib/graphql/backtrace/traced_error.rb +8 -3
  35. data/lib/graphql/backtrace.rb +14 -9
  36. data/lib/graphql/coercion_error.rb +1 -0
  37. data/lib/graphql/current.rb +44 -19
  38. data/lib/graphql/dashboard/application_controller.rb +1 -0
  39. data/lib/graphql/dashboard/detailed_traces.rb +1 -0
  40. data/lib/graphql/dashboard/installable.rb +1 -0
  41. data/lib/graphql/dashboard/landings_controller.rb +1 -0
  42. data/lib/graphql/dashboard/limiters.rb +1 -0
  43. data/lib/graphql/dashboard/operation_store.rb +1 -0
  44. data/lib/graphql/dashboard/statics_controller.rb +1 -0
  45. data/lib/graphql/dashboard/subscriptions.rb +1 -0
  46. data/lib/graphql/dashboard.rb +36 -22
  47. data/lib/graphql/dataloader/active_record_association_source.rb +1 -0
  48. data/lib/graphql/dataloader/active_record_source.rb +1 -0
  49. data/lib/graphql/dataloader/async_dataloader.rb +45 -16
  50. data/lib/graphql/dataloader/null_dataloader.rb +4 -3
  51. data/lib/graphql/dataloader/request.rb +8 -2
  52. data/lib/graphql/dataloader/request_all.rb +8 -2
  53. data/lib/graphql/dataloader/source.rb +127 -35
  54. data/lib/graphql/dataloader.rb +98 -44
  55. data/lib/graphql/date_encoding_error.rb +2 -1
  56. data/lib/graphql/dig.rb +12 -3
  57. data/lib/graphql/duration_encoding_error.rb +2 -1
  58. data/lib/graphql/execution/directive_checks.rb +8 -3
  59. data/lib/graphql/execution/errors.rb +20 -6
  60. data/lib/graphql/execution/field_resolve_step.rb +288 -168
  61. data/lib/graphql/execution/finalize.rb +12 -6
  62. data/lib/graphql/execution/input_values.rb +5 -2
  63. data/lib/graphql/execution/interpreter/argument_value.rb +17 -5
  64. data/lib/graphql/execution/interpreter/arguments.rb +24 -9
  65. data/lib/graphql/execution/interpreter/arguments_cache.rb +2 -1
  66. data/lib/graphql/execution/interpreter/execution_errors.rb +1 -0
  67. data/lib/graphql/execution/interpreter/handles_raw_value.rb +1 -0
  68. data/lib/graphql/execution/interpreter/resolve.rb +18 -8
  69. data/lib/graphql/execution/interpreter/runtime/graphql_result.rb +4 -1
  70. data/lib/graphql/execution/interpreter/runtime.rb +72 -25
  71. data/lib/graphql/execution/interpreter.rb +18 -7
  72. data/lib/graphql/execution/lazy/lazy_method_map.rb +21 -8
  73. data/lib/graphql/execution/lazy.rb +34 -10
  74. data/lib/graphql/execution/load_argument_step.rb +1 -0
  75. data/lib/graphql/execution/lookahead.rb +137 -54
  76. data/lib/graphql/execution/multiplex.rb +4 -4
  77. data/lib/graphql/execution/next.rb +7 -0
  78. data/lib/graphql/execution/prepare_object_step.rb +38 -13
  79. data/lib/graphql/execution/resolve_type_step.rb +2 -1
  80. data/lib/graphql/execution/runner.rb +32 -15
  81. data/lib/graphql/execution/selections_step.rb +3 -2
  82. data/lib/graphql/execution.rb +2 -2
  83. data/lib/graphql/execution_error.rb +19 -10
  84. data/lib/graphql/float_decoding_error.rb +14 -0
  85. data/lib/graphql/float_encoding_error.rb +33 -0
  86. data/lib/graphql/integer_decoding_error.rb +2 -1
  87. data/lib/graphql/integer_encoding_error.rb +8 -3
  88. data/lib/graphql/introspection/base_object.rb +3 -1
  89. data/lib/graphql/introspection/directive_location_enum.rb +1 -0
  90. data/lib/graphql/introspection/directive_type.rb +1 -0
  91. data/lib/graphql/introspection/dynamic_fields.rb +1 -0
  92. data/lib/graphql/introspection/entry_points.rb +1 -0
  93. data/lib/graphql/introspection/enum_value_type.rb +1 -0
  94. data/lib/graphql/introspection/field_type.rb +1 -0
  95. data/lib/graphql/introspection/input_value_type.rb +1 -0
  96. data/lib/graphql/introspection/introspection_query.rb +1 -0
  97. data/lib/graphql/introspection/schema_type.rb +1 -0
  98. data/lib/graphql/introspection/type_kind_enum.rb +1 -0
  99. data/lib/graphql/introspection/type_type.rb +1 -0
  100. data/lib/graphql/introspection.rb +1 -0
  101. data/lib/graphql/invalid_name_error.rb +1 -0
  102. data/lib/graphql/invalid_null_error.rb +19 -6
  103. data/lib/graphql/language/block_string.rb +2 -1
  104. data/lib/graphql/language/cache.rb +10 -4
  105. data/lib/graphql/language/comment.rb +1 -0
  106. data/lib/graphql/language/definition_slice.rb +1 -0
  107. data/lib/graphql/language/document_from_schema_definition.rb +9 -10
  108. data/lib/graphql/language/generation.rb +23 -9
  109. data/lib/graphql/language/lexer.rb +16 -8
  110. data/lib/graphql/language/nodes.rb +2094 -419
  111. data/lib/graphql/language/parser.rb +29 -18
  112. data/lib/graphql/language/printer.rb +31 -16
  113. data/lib/graphql/language/sanitized_printer.rb +16 -5
  114. data/lib/graphql/language/static_visitor.rb +19 -4
  115. data/lib/graphql/language/visitor.rb +51 -29
  116. data/lib/graphql/language.rb +15 -9
  117. data/lib/graphql/load_application_object_failed_error.rb +14 -5
  118. data/lib/graphql/name_validator.rb +1 -0
  119. data/lib/graphql/pagination/active_record_relation_connection.rb +1 -0
  120. data/lib/graphql/pagination/array_connection.rb +24 -6
  121. data/lib/graphql/pagination/connection.rb +178 -48
  122. data/lib/graphql/pagination/connections.rb +21 -14
  123. data/lib/graphql/pagination/mongoid_relation_connection.rb +1 -0
  124. data/lib/graphql/pagination/relation_connection.rb +164 -27
  125. data/lib/graphql/pagination/sequel_dataset_connection.rb +1 -0
  126. data/lib/graphql/pagination.rb +1 -0
  127. data/lib/graphql/parse_error.rb +1 -0
  128. data/lib/graphql/query/context/scoped_context.rb +2 -1
  129. data/lib/graphql/query/context.rb +106 -35
  130. data/lib/graphql/query/fingerprint.rb +15 -7
  131. data/lib/graphql/query/input_validation_result.rb +1 -0
  132. data/lib/graphql/query/null_context.rb +1 -0
  133. data/lib/graphql/query/partial.rb +28 -16
  134. data/lib/graphql/query/result.rb +15 -5
  135. data/lib/graphql/query/validation_pipeline.rb +16 -6
  136. data/lib/graphql/query/variable_validation_error.rb +17 -1
  137. data/lib/graphql/query/variables.rb +9 -2
  138. data/lib/graphql/query.rb +195 -50
  139. data/lib/graphql/railtie.rb +7 -3
  140. data/lib/graphql/rake_task/validate.rb +72 -17
  141. data/lib/graphql/rake_task.rb +55 -23
  142. data/lib/graphql/relay/range_add.rb +32 -21
  143. data/lib/graphql/relay.rb +1 -0
  144. data/lib/graphql/rubocop/graphql/base_cop.rb +1 -0
  145. data/lib/graphql/rubocop/graphql/default_null_true.rb +9 -6
  146. data/lib/graphql/rubocop/graphql/default_required_true.rb +9 -6
  147. data/lib/graphql/rubocop/graphql/field_type_in_block.rb +12 -8
  148. data/lib/graphql/rubocop/graphql/root_types_in_block.rb +9 -5
  149. data/lib/graphql/rubocop.rb +1 -0
  150. data/lib/graphql/runtime_error.rb +1 -0
  151. data/lib/graphql/runtime_type_error.rb +1 -0
  152. data/lib/graphql/schema/addition.rb +69 -50
  153. data/lib/graphql/schema/always_visible.rb +1 -0
  154. data/lib/graphql/schema/argument.rb +279 -45
  155. data/lib/graphql/schema/base_64_encoder.rb +2 -2
  156. data/lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb +1 -0
  157. data/lib/graphql/schema/build_from_definition/resolve_map.rb +2 -2
  158. data/lib/graphql/schema/build_from_definition.rb +507 -178
  159. data/lib/graphql/schema/built_in_types.rb +1 -0
  160. data/lib/graphql/schema/directive/deprecated.rb +1 -0
  161. data/lib/graphql/schema/directive/feature.rb +39 -22
  162. data/lib/graphql/schema/directive/flagged.rb +6 -1
  163. data/lib/graphql/schema/directive/include.rb +1 -0
  164. data/lib/graphql/schema/directive/one_of.rb +1 -0
  165. data/lib/graphql/schema/directive/skip.rb +1 -0
  166. data/lib/graphql/schema/directive/specified_by.rb +1 -0
  167. data/lib/graphql/schema/directive/transform.rb +17 -8
  168. data/lib/graphql/schema/directive.rb +33 -7
  169. data/lib/graphql/schema/enum.rb +99 -38
  170. data/lib/graphql/schema/enum_value.rb +21 -13
  171. data/lib/graphql/schema/field/connection_extension.rb +10 -2
  172. data/lib/graphql/schema/field/scope_extension.rb +1 -0
  173. data/lib/graphql/schema/field.rb +622 -110
  174. data/lib/graphql/schema/field_extension.rb +89 -34
  175. data/lib/graphql/schema/find_inherited_value.rb +5 -3
  176. data/lib/graphql/schema/finder.rb +22 -8
  177. data/lib/graphql/schema/has_single_input_argument.rb +39 -6
  178. data/lib/graphql/schema/input_object.rb +40 -13
  179. data/lib/graphql/schema/interface.rb +33 -17
  180. data/lib/graphql/schema/introspection_system.rb +7 -3
  181. data/lib/graphql/schema/late_bound_type.rb +2 -2
  182. data/lib/graphql/schema/list.rb +15 -4
  183. data/lib/graphql/schema/loader.rb +23 -12
  184. data/lib/graphql/schema/member/base_dsl_methods.rb +58 -12
  185. data/lib/graphql/schema/member/build_type.rb +21 -7
  186. data/lib/graphql/schema/member/graphql_type_names.rb +10 -6
  187. data/lib/graphql/schema/member/has_arguments.rb +112 -49
  188. data/lib/graphql/schema/member/has_ast_node.rb +1 -0
  189. data/lib/graphql/schema/member/has_authorization.rb +5 -0
  190. data/lib/graphql/schema/member/has_dataloader.rb +91 -34
  191. data/lib/graphql/schema/member/has_deprecation_reason.rb +15 -2
  192. data/lib/graphql/schema/member/has_directives.rb +45 -11
  193. data/lib/graphql/schema/member/has_fields.rb +151 -70
  194. data/lib/graphql/schema/member/has_interfaces.rb +8 -2
  195. data/lib/graphql/schema/member/has_path.rb +14 -5
  196. data/lib/graphql/schema/member/has_unresolved_type_error.rb +1 -0
  197. data/lib/graphql/schema/member/has_validators.rb +19 -4
  198. data/lib/graphql/schema/member/relay_shortcuts.rb +10 -2
  199. data/lib/graphql/schema/member/scoped.rb +14 -3
  200. data/lib/graphql/schema/member/type_system_helpers.rb +36 -6
  201. data/lib/graphql/schema/member/validates_input.rb +1 -0
  202. data/lib/graphql/schema/member.rb +9 -2
  203. data/lib/graphql/schema/mutation.rb +50 -46
  204. data/lib/graphql/schema/non_null.rb +21 -5
  205. data/lib/graphql/schema/object.rb +44 -15
  206. data/lib/graphql/schema/printer.rb +52 -31
  207. data/lib/graphql/schema/ractor_shareable.rb +6 -2
  208. data/lib/graphql/schema/relay_classic_mutation.rb +3 -3
  209. data/lib/graphql/schema/resolver/has_payload_type.rb +29 -7
  210. data/lib/graphql/schema/resolver.rb +156 -45
  211. data/lib/graphql/schema/scalar.rb +1 -0
  212. data/lib/graphql/schema/subscription.rb +67 -28
  213. data/lib/graphql/schema/timeout.rb +65 -25
  214. data/lib/graphql/schema/type_expression.rb +14 -5
  215. data/lib/graphql/schema/type_membership.rb +29 -10
  216. data/lib/graphql/schema/union.rb +4 -2
  217. data/lib/graphql/schema/unique_within_type.rb +24 -5
  218. data/lib/graphql/schema/validator/all_validator.rb +17 -9
  219. data/lib/graphql/schema/validator/allow_blank_validator.rb +8 -2
  220. data/lib/graphql/schema/validator/allow_null_validator.rb +8 -2
  221. data/lib/graphql/schema/validator/exclusion_validator.rb +14 -5
  222. data/lib/graphql/schema/validator/format_validator.rb +21 -10
  223. data/lib/graphql/schema/validator/inclusion_validator.rb +15 -6
  224. data/lib/graphql/schema/validator/length_validator.rb +23 -12
  225. data/lib/graphql/schema/validator/numericality_validator.rb +29 -16
  226. data/lib/graphql/schema/validator/required_validator.rb +45 -31
  227. data/lib/graphql/schema/validator.rb +89 -25
  228. data/lib/graphql/schema/visibility/migration.rb +14 -7
  229. data/lib/graphql/schema/visibility/profile.rb +73 -19
  230. data/lib/graphql/schema/visibility/visit.rb +12 -10
  231. data/lib/graphql/schema/visibility.rb +24 -20
  232. data/lib/graphql/schema/warden.rb +117 -31
  233. data/lib/graphql/schema/wrapper.rb +4 -1
  234. data/lib/graphql/schema.rb +1052 -304
  235. data/lib/graphql/static_validation/all_rules.rb +2 -1
  236. data/lib/graphql/static_validation/base_visitor.rb +59 -9
  237. data/lib/graphql/static_validation/definition_dependencies.rb +27 -7
  238. data/lib/graphql/static_validation/error.rb +3 -0
  239. data/lib/graphql/static_validation/interpreter_visitor.rb +1 -0
  240. data/lib/graphql/static_validation/literal_validator.rb +1 -0
  241. data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +4 -0
  242. data/lib/graphql/static_validation/rules/argument_literals_are_compatible_error.rb +1 -0
  243. data/lib/graphql/static_validation/rules/argument_names_are_unique.rb +3 -0
  244. data/lib/graphql/static_validation/rules/argument_names_are_unique_error.rb +1 -0
  245. data/lib/graphql/static_validation/rules/arguments_are_defined.rb +3 -0
  246. data/lib/graphql/static_validation/rules/arguments_are_defined_error.rb +1 -0
  247. data/lib/graphql/static_validation/rules/directives_are_defined.rb +3 -0
  248. data/lib/graphql/static_validation/rules/directives_are_defined_error.rb +1 -0
  249. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +3 -0
  250. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations_error.rb +1 -0
  251. data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +3 -0
  252. data/lib/graphql/static_validation/rules/fields_are_defined_on_type_error.rb +1 -0
  253. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +9 -1
  254. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections_error.rb +1 -0
  255. data/lib/graphql/static_validation/rules/fields_will_merge.rb +355 -157
  256. data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +14 -2
  257. data/lib/graphql/static_validation/rules/fragment_names_are_unique.rb +3 -0
  258. data/lib/graphql/static_validation/rules/fragment_names_are_unique_error.rb +1 -0
  259. data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +3 -0
  260. data/lib/graphql/static_validation/rules/fragment_spreads_are_possible_error.rb +1 -0
  261. data/lib/graphql/static_validation/rules/fragment_types_exist.rb +3 -0
  262. data/lib/graphql/static_validation/rules/fragment_types_exist_error.rb +1 -0
  263. data/lib/graphql/static_validation/rules/fragments_are_finite.rb +3 -0
  264. data/lib/graphql/static_validation/rules/fragments_are_finite_error.rb +1 -0
  265. data/lib/graphql/static_validation/rules/fragments_are_named.rb +3 -0
  266. data/lib/graphql/static_validation/rules/fragments_are_named_error.rb +1 -0
  267. data/lib/graphql/static_validation/rules/fragments_are_on_composite_types.rb +3 -0
  268. data/lib/graphql/static_validation/rules/fragments_are_on_composite_types_error.rb +1 -0
  269. data/lib/graphql/static_validation/rules/fragments_are_used.rb +3 -0
  270. data/lib/graphql/static_validation/rules/fragments_are_used_error.rb +1 -0
  271. data/lib/graphql/static_validation/rules/input_object_names_are_unique.rb +3 -0
  272. data/lib/graphql/static_validation/rules/input_object_names_are_unique_error.rb +1 -0
  273. data/lib/graphql/static_validation/rules/mutation_root_exists.rb +3 -0
  274. data/lib/graphql/static_validation/rules/mutation_root_exists_error.rb +1 -0
  275. data/lib/graphql/static_validation/rules/no_definitions_are_present.rb +3 -0
  276. data/lib/graphql/static_validation/rules/no_definitions_are_present_error.rb +1 -0
  277. data/lib/graphql/static_validation/rules/not_single_subscription_error.rb +1 -0
  278. data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid.rb +4 -0
  279. data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid_error.rb +1 -0
  280. data/lib/graphql/static_validation/rules/operation_names_are_valid.rb +3 -0
  281. data/lib/graphql/static_validation/rules/operation_names_are_valid_error.rb +1 -0
  282. data/lib/graphql/static_validation/rules/query_root_exists.rb +3 -0
  283. data/lib/graphql/static_validation/rules/query_root_exists_error.rb +1 -0
  284. data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +4 -1
  285. data/lib/graphql/static_validation/rules/required_arguments_are_present_error.rb +1 -0
  286. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +4 -0
  287. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present_error.rb +1 -0
  288. data/lib/graphql/static_validation/rules/subscription_root_exists_and_single_subscription_selection.rb +43 -5
  289. data/lib/graphql/static_validation/rules/subscription_root_exists_error.rb +1 -0
  290. data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +3 -0
  291. data/lib/graphql/static_validation/rules/unique_directives_per_location_error.rb +1 -0
  292. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +3 -0
  293. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed_error.rb +1 -0
  294. data/lib/graphql/static_validation/rules/variable_names_are_unique.rb +3 -0
  295. data/lib/graphql/static_validation/rules/variable_names_are_unique_error.rb +1 -0
  296. data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +207 -51
  297. data/lib/graphql/static_validation/rules/variable_usages_are_allowed_error.rb +1 -0
  298. data/lib/graphql/static_validation/rules/variables_are_input_types.rb +3 -0
  299. data/lib/graphql/static_validation/rules/variables_are_input_types_error.rb +1 -0
  300. data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +6 -3
  301. data/lib/graphql/static_validation/rules/variables_are_used_and_defined_error.rb +1 -0
  302. data/lib/graphql/static_validation/validation_context.rb +3 -2
  303. data/lib/graphql/static_validation/validation_timeout_error.rb +1 -0
  304. data/lib/graphql/static_validation/validator.rb +41 -16
  305. data/lib/graphql/static_validation.rb +1 -0
  306. data/lib/graphql/string_encoding_error.rb +1 -0
  307. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +85 -65
  308. data/lib/graphql/subscriptions/broadcast_analyzer.rb +10 -4
  309. data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +1 -0
  310. data/lib/graphql/subscriptions/event.rb +25 -6
  311. data/lib/graphql/subscriptions/serialize.rb +89 -23
  312. data/lib/graphql/subscriptions.rb +172 -46
  313. data/lib/graphql/testing/helpers.rb +17 -4
  314. data/lib/graphql/testing/mock_action_cable.rb +55 -33
  315. data/lib/graphql/testing.rb +1 -0
  316. data/lib/graphql/tracing/active_support_notifications_trace.rb +17 -9
  317. data/lib/graphql/tracing/active_support_notifications_tracing.rb +2 -1
  318. data/lib/graphql/tracing/appoptics_trace.rb +2 -1
  319. data/lib/graphql/tracing/appoptics_tracing.rb +2 -1
  320. data/lib/graphql/tracing/appsignal_trace.rb +16 -7
  321. data/lib/graphql/tracing/appsignal_tracing.rb +7 -3
  322. data/lib/graphql/tracing/call_legacy_tracers.rb +1 -0
  323. data/lib/graphql/tracing/data_dog_trace.rb +17 -6
  324. data/lib/graphql/tracing/data_dog_tracing.rb +10 -3
  325. data/lib/graphql/tracing/detailed_trace/active_record_backend.rb +1 -0
  326. data/lib/graphql/tracing/detailed_trace/memory_backend.rb +1 -0
  327. data/lib/graphql/tracing/detailed_trace/redis_backend.rb +1 -0
  328. data/lib/graphql/tracing/detailed_trace.rb +105 -42
  329. data/lib/graphql/tracing/legacy_hooks_trace.rb +5 -0
  330. data/lib/graphql/tracing/legacy_trace.rb +1 -0
  331. data/lib/graphql/tracing/monitor_trace.rb +17 -11
  332. data/lib/graphql/tracing/new_relic_trace.rb +17 -8
  333. data/lib/graphql/tracing/new_relic_tracing.rb +7 -3
  334. data/lib/graphql/tracing/notifications_trace.rb +11 -8
  335. data/lib/graphql/tracing/notifications_tracing.rb +23 -7
  336. data/lib/graphql/tracing/null_trace.rb +1 -0
  337. data/lib/graphql/tracing/perfetto_trace/trace_pb.rb +1 -0
  338. data/lib/graphql/tracing/perfetto_trace.rb +41 -19
  339. data/lib/graphql/tracing/platform_trace.rb +3 -1
  340. data/lib/graphql/tracing/platform_tracing.rb +16 -7
  341. data/lib/graphql/tracing/prometheus_trace/graphql_collector.rb +1 -0
  342. data/lib/graphql/tracing/prometheus_trace.rb +22 -13
  343. data/lib/graphql/tracing/prometheus_tracing.rb +1 -0
  344. data/lib/graphql/tracing/scout_trace.rb +10 -4
  345. data/lib/graphql/tracing/scout_tracing.rb +7 -3
  346. data/lib/graphql/tracing/sentry_trace.rb +25 -6
  347. data/lib/graphql/tracing/statsd_trace.rb +12 -6
  348. data/lib/graphql/tracing/statsd_tracing.rb +7 -1
  349. data/lib/graphql/tracing/trace.rb +231 -58
  350. data/lib/graphql/tracing.rb +25 -9
  351. data/lib/graphql/type_kinds.rb +2 -1
  352. data/lib/graphql/types/big_int.rb +1 -0
  353. data/lib/graphql/types/boolean.rb +1 -0
  354. data/lib/graphql/types/float.rb +19 -4
  355. data/lib/graphql/types/id.rb +1 -0
  356. data/lib/graphql/types/int.rb +2 -1
  357. data/lib/graphql/types/iso_8601_date.rb +21 -4
  358. data/lib/graphql/types/iso_8601_date_time.rb +33 -6
  359. data/lib/graphql/types/iso_8601_duration.rb +42 -9
  360. data/lib/graphql/types/json.rb +1 -0
  361. data/lib/graphql/types/relay/base_connection.rb +38 -32
  362. data/lib/graphql/types/relay/base_edge.rb +15 -9
  363. data/lib/graphql/types/relay/connection_behaviors.rb +19 -3
  364. data/lib/graphql/types/relay/edge_behaviors.rb +17 -4
  365. data/lib/graphql/types/relay/has_node_field.rb +6 -1
  366. data/lib/graphql/types/relay/has_nodes_field.rb +6 -1
  367. data/lib/graphql/types/relay/node.rb +1 -0
  368. data/lib/graphql/types/relay/node_behaviors.rb +5 -1
  369. data/lib/graphql/types/relay/page_info.rb +1 -0
  370. data/lib/graphql/types/relay/page_info_behaviors.rb +1 -0
  371. data/lib/graphql/types/relay.rb +4 -3
  372. data/lib/graphql/types/string.rb +1 -0
  373. data/lib/graphql/types.rb +1 -0
  374. data/lib/graphql/unauthorized_enum_value_error.rb +4 -1
  375. data/lib/graphql/unauthorized_error.rb +11 -4
  376. data/lib/graphql/unauthorized_field_error.rb +4 -1
  377. data/lib/graphql/unresolved_type_error.rb +16 -5
  378. data/lib/graphql/version.rb +2 -1
  379. data/lib/graphql.rb +39 -9
  380. data/readme.md +1 -1
  381. metadata +91 -5
  382. data/.yardopts +0 -5
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
 
3
4
  module GraphQL
4
5
  class Schema
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
  require 'graphql/schema/member/base_dsl_methods'
3
4
  require 'graphql/schema/member/graphql_type_names'
4
5
  require 'graphql/schema/member/has_ast_node'
@@ -20,8 +21,14 @@ module GraphQL
20
21
  # The base class for things that make up the schema,
21
22
  # eg objects, enums, scalars.
22
23
  #
23
- # @api private
24
- class Member
24
+ class Member # :nodoc:
25
+ # A module that defines a GraphQL interface type (it includes `GraphQL::Schema::Interface`).
26
+ #: type interface_definition = GraphQL::Schema::Interface::DefinitionMethods & Module
27
+
28
+ # A class or module that defines a GraphQL type:
29
+ # an object, union, enum, scalar or input object class, or an interface module.
30
+ #: type type_definition = singleton(GraphQL::Schema::Member) | interface_definition
31
+
25
32
  include GraphQLTypeNames
26
33
  extend BaseDSLMethods
27
34
  extend BaseDSLMethods::ConfigurationExtension
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
 
3
4
  module GraphQL
4
5
  class Schema
@@ -8,62 +9,65 @@ module GraphQL
8
9
  # If you want to customize how this class generates types, in your base class,
9
10
  # override the various `generate_*` methods.
10
11
  #
11
- # @see {GraphQL::Schema::RelayClassicMutation} for an extension of this class with some conventions built-in.
12
+ # See [GraphQL::Schema::RelayClassicMutation](rdoc-ref:GraphQL::Schema::RelayClassicMutation) for an extension of this class with some conventions built-in.
12
13
  #
13
- # @example Creating a comment
14
- # # Define the mutation:
15
- # class Mutations::CreateComment < GraphQL::Schema::Mutation
16
- # argument :body, String, required: true
17
- # argument :post_id, ID, required: true
14
+ # **Examples**
18
15
  #
19
- # field :comment, Types::Comment, null: true
20
- # field :errors, [String], null: false
16
+ # **Example: Creating a comment**
21
17
  #
22
- # def resolve(body:, post_id:)
23
- # post = Post.find(post_id)
24
- # comment = post.comments.build(body: body, author: context[:current_user])
25
- # if comment.save
26
- # # Successful creation, return the created object with no errors
27
- # {
28
- # comment: comment,
29
- # errors: [],
30
- # }
31
- # else
32
- # # Failed save, return the errors to the client
33
- # {
34
- # comment: nil,
35
- # errors: comment.errors.full_messages
36
- # }
37
- # end
38
- # end
39
- # end
18
+ # ```ruby
19
+ # # Define the mutation:
20
+ # class Mutations::CreateComment < GraphQL::Schema::Mutation
21
+ # argument :body, String, required: true
22
+ # argument :post_id, ID, required: true
40
23
  #
41
- # # Hook it up to your mutation:
42
- # class Types::Mutation < GraphQL::Schema::Object
43
- # field :create_comment, mutation: Mutations::CreateComment
44
- # end
24
+ # field :comment, Types::Comment, null: true
25
+ # field :errors, [String], null: false
45
26
  #
46
- # # Call it from GraphQL:
47
- # result = MySchema.execute <<-GRAPHQL
48
- # mutation {
49
- # createComment(postId: "1", body: "Nice Post!") {
50
- # errors
51
- # comment {
52
- # body
53
- # author {
54
- # login
55
- # }
56
- # }
57
- # }
58
- # }
59
- # GRAPHQL
27
+ # def resolve(body:, post_id:)
28
+ # post = Post.find(post_id)
29
+ # comment = post.comments.build(body: body, author: context[:current_user])
30
+ # if comment.save
31
+ # # Successful creation, return the created object with no errors
32
+ # {
33
+ # comment: comment,
34
+ # errors: [],
35
+ # }
36
+ # else
37
+ # # Failed save, return the errors to the client
38
+ # {
39
+ # comment: nil,
40
+ # errors: comment.errors.full_messages
41
+ # }
42
+ # end
43
+ # end
44
+ # end
60
45
  #
46
+ # # Hook it up to your mutation:
47
+ # class Types::Mutation < GraphQL::Schema::Object
48
+ # field :create_comment, mutation: Mutations::CreateComment
49
+ # end
50
+ #
51
+ # # Call it from GraphQL:
52
+ # result = MySchema.execute <<-GRAPHQL
53
+ # mutation {
54
+ # createComment(postId: "1", body: "Nice Post!") {
55
+ # errors
56
+ # comment {
57
+ # body
58
+ # author {
59
+ # login
60
+ # }
61
+ # }
62
+ # }
63
+ # }
64
+ # GRAPHQL
65
+ # ```
61
66
  class Mutation < GraphQL::Schema::Resolver
62
67
  extend GraphQL::Schema::Member::HasFields
63
68
  extend GraphQL::Schema::Resolver::HasPayloadType
64
69
 
65
- # @api private
66
- def call_resolve(_args_hash)
70
+ def call_resolve(_args_hash) # :nodoc:
67
71
  # Clear any cached values from `loads` or authorization:
68
72
  dataloader.clear_cache
69
73
  super
@@ -1,24 +1,40 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
 
3
4
  module GraphQL
4
5
  class Schema
5
6
  # Represents a non null type in the schema.
6
- # Wraps a {Schema::Member} when it is required.
7
- # @see {Schema::Member::TypeSystemHelpers#to_non_null_type}
7
+ # Wraps a [Schema::Member](rdoc-ref:Schema::Member) when it is required.
8
+ # See [Schema::Member::TypeSystemHelpers#to_non_null_type](rdoc-ref:Schema::Member::TypeSystemHelpers#to_non_null_type)
8
9
  class NonNull < GraphQL::Schema::Wrapper
9
10
  include Schema::Member::ValidatesInput
10
11
 
11
- # @return [GraphQL::TypeKinds::NON_NULL]
12
+ # **Returns**
13
+ #
14
+ # - `GraphQL::TypeKinds::NON_NULL`
15
+ #
16
+ # :call-seq:
17
+ # kind() -> GraphQL::TypeKinds::NON_NULL
12
18
  def kind
13
19
  GraphQL::TypeKinds::NON_NULL
14
20
  end
15
21
 
16
- # @return [true]
22
+ # **Returns**
23
+ #
24
+ # - `true`
25
+ #
26
+ # :call-seq:
27
+ # non_null?() -> true
17
28
  def non_null?
18
29
  true
19
30
  end
20
31
 
21
- # @return [Boolean] True if this type wraps a list type
32
+ # **Returns**
33
+ #
34
+ # - `Boolean` — True if this type wraps a list type
35
+ #
36
+ # :call-seq:
37
+ # list?() -> bool
22
38
  def list?
23
39
  @of_type.list?
24
40
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
 
3
4
  require "graphql/query/null_context"
4
5
 
@@ -18,13 +19,22 @@ module GraphQL
18
19
  end
19
20
  end
20
21
 
21
- # @return [Object] the application object this type is wrapping
22
+ # **Returns**
23
+ #
24
+ # - `Object` — the application object this type is wrapping
22
25
  attr_reader :object
23
26
 
24
- # @return [GraphQL::Query::Context] the context instance for this query
27
+ # **Returns**
28
+ #
29
+ # - `GraphQL::Query::Context` — the context instance for this query
25
30
  attr_reader :context
26
31
 
27
- # @return [GraphQL::Dataloader]
32
+ # **Returns**
33
+ #
34
+ # - `GraphQL::Dataloader`
35
+ #
36
+ # :call-seq:
37
+ # dataloader() -> GraphQL::Dataloader
28
38
  def dataloader
29
39
  context.dataloader
30
40
  end
@@ -36,8 +46,8 @@ module GraphQL
36
46
  end
37
47
 
38
48
  class << self
39
- # This is protected so that we can be sure callers use the public method, {.authorized_new}
40
- # @see authorized_new to make instances
49
+ # This is protected so that we can be sure callers use the public method, [.authorized_new](rdoc-ref:.authorized_new)
50
+ # See [authorized_new](rdoc-ref:authorized_new) to make instances
41
51
  protected :new
42
52
 
43
53
  def wrap_scoped(object, context)
@@ -54,26 +64,40 @@ module GraphQL
54
64
  #
55
65
  # Probably only the framework should call this method.
56
66
  #
57
- # This might return a {GraphQL::Execution::Lazy} if the user-provided `.authorized?`
67
+ # This might return a [GraphQL::Execution::Lazy](rdoc-ref:GraphQL::Execution::Lazy) if the user-provided `.authorized?`
58
68
  # hook returns some lazy value (like a Promise).
59
69
  #
60
- # The reason that the auth check is in this wrapper method instead of {.new} is because
70
+ # The reason that the auth check is in this wrapper method instead of [.new](rdoc-ref:.new) is because
61
71
  # of how it might return a Promise. It would be weird if `.new` returned a promise;
62
- # It would be a headache to try to maintain Promise-y state inside a {Schema::Object}
72
+ # It would be a headache to try to maintain Promise-y state inside a [Schema::Object](rdoc-ref:Schema::Object)
63
73
  # instance. So, hopefully this wrapper method will do the job.
64
74
  #
65
- # @param object [Object] The thing wrapped by this object
66
- # @param context [GraphQL::Query::Context]
67
- # @return [GraphQL::Schema::Object, GraphQL::Execution::Lazy]
68
- # @raise [GraphQL::UnauthorizedError] if the user-provided hook returns `false`
75
+ # **Parameters**
76
+ #
77
+ # - `object` (`Object`) — The thing wrapped by this object
78
+ # - `context` (`GraphQL::Query::Context`)
79
+ #
80
+ # **Returns**
81
+ #
82
+ # - `GraphQL::Schema::Object, GraphQL::Execution::Lazy`
83
+ #
84
+ # **Raises**
85
+ #
86
+ # - `GraphQL::UnauthorizedError` — if the user-provided hook returns `false`
87
+ #
88
+ # :call-seq:
89
+ # authorized_new(Object object, GraphQL::Query::Context context) -> GraphQL::Schema::Object | GraphQL::Execution::Lazy | GraphQL::UnauthorizedError
69
90
  def authorized_new(object, context)
70
91
  context.query.current_trace.begin_authorized(self, object, context)
92
+ raised_auth_err = nil
71
93
  begin
72
94
  maybe_lazy_auth_val = context.query.current_trace.authorized(query: context.query, type: self, object: object) do
73
95
  begin
74
96
  authorized?(object, context)
75
97
  rescue GraphQL::UnauthorizedError => err
76
- context.schema.unauthorized_object(err)
98
+ # Raising is equivalent to returning `false`; `unauthorized_object` is called below
99
+ raised_auth_err = err
100
+ false
77
101
  rescue StandardError => err
78
102
  context.query.handle_or_reraise(err)
79
103
  end
@@ -86,7 +110,12 @@ module GraphQL
86
110
  GraphQL::Execution::Lazy.new do
87
111
  context.query.current_trace.begin_authorized(self, object, context)
88
112
  context.query.current_trace.authorized_lazy(query: context.query, type: self, object: object) do
89
- res = context.schema.sync_lazy(maybe_lazy_auth_val)
113
+ res = begin
114
+ context.schema.sync_lazy(maybe_lazy_auth_val)
115
+ rescue GraphQL::UnauthorizedError => err
116
+ raised_auth_err = err
117
+ false
118
+ end
90
119
  context.query.current_trace.end_authorized(self, object, context, res)
91
120
  res
92
121
  end
@@ -100,7 +129,7 @@ module GraphQL
100
129
  self.new(object, context)
101
130
  else
102
131
  # It failed the authorization check, so go to the schema's authorized object hook
103
- err = GraphQL::UnauthorizedError.new(object: object, type: self, context: context)
132
+ err = raised_auth_err || GraphQL::UnauthorizedError.new(object: object, type: self, context: context)
104
133
  # If a new value was returned, wrap that instead of the original value
105
134
  begin
106
135
  new_obj = context.schema.unauthorized_object(err)
@@ -1,42 +1,58 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
  module GraphQL
3
4
  class Schema
4
- # Used to convert your {GraphQL::Schema} to a GraphQL schema string
5
+ # Used to convert your [GraphQL::Schema](rdoc-ref:GraphQL::Schema) to a GraphQL schema string
5
6
  #
6
- # @example print your schema to standard output (via helper)
7
- # puts GraphQL::Schema::Printer.print_schema(MySchema)
7
+ # **Examples**
8
8
  #
9
- # @example print your schema to standard output
10
- # puts GraphQL::Schema::Printer.new(MySchema).print_schema
9
+ # **Example: print your schema to standard output (via helper)**
11
10
  #
12
- # @example print a single type to standard output
13
- # class Types::Query < GraphQL::Schema::Object
14
- # description "The query root of this schema"
11
+ # ```ruby
12
+ # puts GraphQL::Schema::Printer.print_schema(MySchema)
13
+ # ```
15
14
  #
16
- # field :post, Types::Post, null: true
17
- # end
15
+ # **Example: print your schema to standard output**
18
16
  #
19
- # class Types::Post < GraphQL::Schema::Object
20
- # description "A blog post"
17
+ # ```ruby
18
+ # puts GraphQL::Schema::Printer.new(MySchema).print_schema
19
+ # ```
21
20
  #
22
- # field :id, ID, null: false
23
- # field :title, String, null: false
24
- # field :body, String, null: false
25
- # end
21
+ # **Example: print a single type to standard output**
26
22
  #
27
- # class MySchema < GraphQL::Schema
28
- # query(Types::Query)
29
- # end
23
+ # ```ruby
24
+ # class Types::Query < GraphQL::Schema::Object
25
+ # description "The query root of this schema"
30
26
  #
31
- # printer = GraphQL::Schema::Printer.new(MySchema)
32
- # puts printer.print_type(Types::Post)
27
+ # field :post, Types::Post, null: true
28
+ # end
33
29
  #
30
+ # class Types::Post < GraphQL::Schema::Object
31
+ # description "A blog post"
32
+ #
33
+ # field :id, ID, null: false
34
+ # field :title, String, null: false
35
+ # field :body, String, null: false
36
+ # end
37
+ #
38
+ # class MySchema < GraphQL::Schema
39
+ # query(Types::Query)
40
+ # end
41
+ #
42
+ # printer = GraphQL::Schema::Printer.new(MySchema)
43
+ # puts printer.print_type(Types::Post)
44
+ # ```
34
45
  class Printer < GraphQL::Language::Printer
35
46
  attr_reader :schema, :warden
36
47
 
37
- # @param schema [GraphQL::Schema]
38
- # @param context [Hash]
39
- # @param introspection [Boolean] Should include the introspection types in the string?
48
+ # **Parameters**
49
+ #
50
+ # - `schema` (`GraphQL::Schema`)
51
+ # - `context` (`Hash`)
52
+ # - `introspection` (`Boolean`) — Should include the introspection types in the string?
53
+ #
54
+ # :call-seq:
55
+ # initialize(GraphQL::Schema schema, Hash context:, bool introspection:)
40
56
  def initialize(schema, context: nil, introspection: false)
41
57
  @document_from_schema = GraphQL::Language::DocumentFromSchemaDefinition.new(
42
58
  schema,
@@ -53,9 +69,8 @@ module GraphQL
53
69
  query_root = Class.new(GraphQL::Schema::Object) do
54
70
  graphql_name "Root"
55
71
  field :throwaway_field, String
56
- def self.visible?(ctx)
57
- false
58
- end
72
+ # Not `def self.visible?`: Sorbet would treat it as a definition of `Printer.visible?`
73
+ define_singleton_method(:visible?) { |ctx| false }
59
74
  end
60
75
  schema = Class.new(GraphQL::Schema) {
61
76
  query(query_root)
@@ -75,10 +90,16 @@ module GraphQL
75
90
  end
76
91
 
77
92
  # Return a GraphQL schema string for the defined types in the schema
78
- # @param schema [GraphQL::Schema]
79
- # @param context [Hash]
80
- # @param only [<#call(member, ctx)>]
81
- # @param except [<#call(member, ctx)>]
93
+ #
94
+ # **Parameters**
95
+ #
96
+ # - `schema` (`GraphQL::Schema`)
97
+ # - `context` (`Hash`)
98
+ # - `only` (`<#call(member, ctx)>`)
99
+ # - `except` (`<#call(member, ctx)>`)
100
+ #
101
+ # :call-seq:
102
+ # print_schema(GraphQL::Schema schema, **args)
82
103
  def self.print_schema(schema, **args)
83
104
  printer = new(schema, **args)
84
105
  printer.print_schema
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
  module GraphQL
3
4
  class Schema
4
5
  module RactorShareable
@@ -7,6 +8,8 @@ module GraphQL
7
8
  schema_class.freeze_schema
8
9
  end
9
10
 
11
+ #--
12
+ # @requires_ancestor: singleton(GraphQL::Schema)
10
13
  module SchemaExtension
11
14
 
12
15
  def freeze_error_handlers(handlers)
@@ -25,7 +28,7 @@ module GraphQL
25
28
  default_logger
26
29
  freeze_error_handlers(error_handlers)
27
30
  # TODO: this freezes errors of parent classes which could cause trouble
28
- parent_class = superclass
31
+ parent_class = superclass #: untyped
29
32
  while parent_class.respond_to?(:error_handlers)
30
33
  freeze_error_handlers(parent_class.error_handlers)
31
34
  parent_class = parent_class.superclass
@@ -58,7 +61,8 @@ module GraphQL
58
61
  extend(FrozenMethods)
59
62
 
60
63
  Ractor.make_shareable(self)
61
- superclass.respond_to?(:freeze_schema) && superclass.freeze_schema
64
+ parent_class = superclass #: untyped
65
+ parent_class.respond_to?(:freeze_schema) && parent_class.freeze_schema
62
66
  end
63
67
 
64
68
  module FrozenMethods
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
 
3
4
  module GraphQL
4
5
  class Schema
@@ -17,8 +18,7 @@ module GraphQL
17
18
  # - using a single `input:` argument makes it easy to post whole JSON objects to the mutation
18
19
  # using one GraphQL variable (`$input`) instead of making a separate variable for each argument.
19
20
  #
20
- # @see {GraphQL::Schema::Mutation} for an example, it's basically the same.
21
- #
21
+ # See [GraphQL::Schema::Mutation](rdoc-ref:GraphQL::Schema::Mutation) for an example, it's basically the same.
22
22
  class RelayClassicMutation < GraphQL::Schema::Mutation
23
23
  include GraphQL::Schema::HasSingleInputArgument
24
24
 
@@ -29,7 +29,7 @@ module GraphQL
29
29
  # Relay classic default:
30
30
  null(true)
31
31
 
32
- # Override {GraphQL::Schema::Resolver#resolve_with_support} to
32
+ # Override [resolve_with_support](rdoc-ref:#resolve_with_support) to
33
33
  # delete `client_mutation_id` from the kwargs.
34
34
  def resolve_with_support(**inputs)
35
35
  input = inputs[:input].to_kwargs
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
 
3
4
  module GraphQL
4
5
  class Schema
@@ -7,12 +8,24 @@ module GraphQL
7
8
  # generate payload types.
8
9
  #
9
10
  # Or, an already-defined one can be attached with `payload_type(...)`.
11
+ #--
12
+ # @requires_ancestor: singleton(GraphQL::Schema::Resolver)
13
+ # @requires_ancestor: GraphQL::Schema::Member::HasFields
10
14
  module HasPayloadType
11
15
  # Call this method to get the derived return type of the mutation,
12
16
  # or use it as a configuration method to assign a return type
13
17
  # instead of generating one.
14
- # @param new_payload_type [Class, nil] If a type definition class is provided, it will be used as the return type of the mutation field
15
- # @return [Class] The object type which this mutation returns.
18
+ #
19
+ # **Parameters**
20
+ #
21
+ # - `new_payload_type` (`Class, nil`) — If a type definition class is provided, it will be used as the return type of the mutation field
22
+ #
23
+ # **Returns**
24
+ #
25
+ # - `Class` — The object type which this mutation returns.
26
+ #
27
+ # :call-seq:
28
+ # payload_type(Class | nil new_payload_type) -> Class
16
29
  def payload_type(new_payload_type = nil)
17
30
  if new_payload_type
18
31
  @payload_type = new_payload_type
@@ -44,8 +57,17 @@ module GraphQL
44
57
  end
45
58
 
46
59
  # An object class to use for deriving return types
47
- # @param new_class [Class, nil] Defaults to {GraphQL::Schema::Object}
48
- # @return [Class]
60
+ #
61
+ # **Parameters**
62
+ #
63
+ # - `new_class` (`Class, nil`) — Defaults to [GraphQL::Schema::Object](rdoc-ref:GraphQL::Schema::Object)
64
+ #
65
+ # **Returns**
66
+ #
67
+ # - `Class`
68
+ #
69
+ # :call-seq:
70
+ # object_class(Class | nil new_class) -> Class
49
71
  def object_class(new_class = nil)
50
72
  if new_class
51
73
  if defined?(@payload_type)
@@ -83,13 +105,13 @@ module GraphQL
83
105
 
84
106
  private
85
107
 
86
- # Build a subclass of {.object_class} based on `self`.
87
- # This value will be cached as `{.payload_type}`.
108
+ # Build a subclass of [.object_class](rdoc-ref:.object_class) based on `self`.
109
+ # This value will be cached as [.payload_type](rdoc-ref:.payload_type).
88
110
  # Override this hook to customize return type generation.
89
111
  def generate_payload_type
90
112
  resolver_name = graphql_name
91
113
  resolver_fields = all_field_definitions
92
- pt = Class.new(object_class)
114
+ pt = Class.new(object_class) #: as singleton(GraphQL::Schema::Object)
93
115
  pt.graphql_name("#{resolver_name}Payload")
94
116
  pt.description("Autogenerated return type of #{resolver_name}.")
95
117
  resolver_fields.each do |f|