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
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+ # typed: true
3
+ module GraphQL
4
+ # This error is raised when `Types::Float` is given a non-finite input value.
5
+ class FloatDecodingError < GraphQL::RuntimeTypeError
6
+ # The value which couldn't be decoded
7
+ attr_reader :float_value
8
+
9
+ def initialize(value)
10
+ @float_value = value
11
+ super("Float is not finite: #{value.inspect}.")
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+ # typed: true
3
+ module GraphQL
4
+ # This error is raised when `Types::Float` is asked to return a non-finite value.
5
+ class FloatEncodingError < GraphQL::RuntimeTypeError
6
+ # The value which couldn't be encoded
7
+ attr_reader :float_value
8
+
9
+ # **Returns**
10
+ #
11
+ # - `GraphQL::Schema::Field` — The field that returned a non-finite float
12
+ attr_reader :field
13
+
14
+ # **Returns**
15
+ #
16
+ # - `Array<String, Integer>` — Where the field appeared in the GraphQL response
17
+ attr_reader :path
18
+
19
+ def initialize(value, context:)
20
+ @float_value = value
21
+ @field = context[:current_field]
22
+ @path = context[:current_path]
23
+ message = "Float is not finite: #{value.inspect}".dup
24
+ if @path
25
+ message << " @ #{@path.join(".")}"
26
+ end
27
+ if @field
28
+ message << " (#{@field.path})"
29
+ end
30
+ super("#{message}.")
31
+ end
32
+ end
33
+ end
@@ -1,10 +1,11 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
  module GraphQL
3
4
  # This error is raised when `Types::Int` is given an input value outside of 32-bit integer range.
4
5
  #
5
6
  # For really big integer values, consider `GraphQL::Types::BigInt`
6
7
  #
7
- # @see GraphQL::Types::Int which raises this error
8
+ # See [GraphQL::Types::Int](rdoc-ref:GraphQL::Types::Int) which raises this error
8
9
  class IntegerDecodingError < GraphQL::RuntimeTypeError
9
10
  # The value which couldn't be decoded
10
11
  attr_reader :integer_value
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
  module GraphQL
3
4
  # This error is raised when `Types::Int` is asked to return a value outside of 32-bit integer range.
4
5
  #
@@ -7,15 +8,19 @@ module GraphQL
7
8
  # - `ID` for database primary keys or other identifiers
8
9
  # - `GraphQL::Types::BigInt` for really big integer values
9
10
  #
10
- # @see GraphQL::Types::Int which raises this error
11
+ # See [GraphQL::Types::Int](rdoc-ref:GraphQL::Types::Int) which raises this error
11
12
  class IntegerEncodingError < GraphQL::RuntimeTypeError
12
13
  # The value which couldn't be encoded
13
14
  attr_reader :integer_value
14
15
 
15
- # @return [GraphQL::Schema::Field] The field that returned a too-big integer
16
+ # **Returns**
17
+ #
18
+ # - `GraphQL::Schema::Field` — The field that returned a too-big integer
16
19
  attr_reader :field
17
20
 
18
- # @return [Array<String, Integer>] Where the field appeared in the GraphQL response
21
+ # **Returns**
22
+ #
23
+ # - `Array<String, Integer>` — Where the field appeared in the GraphQL response
19
24
  attr_reader :path
20
25
 
21
26
  def initialize(value, context:)
@@ -1,12 +1,14 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
  module GraphQL
3
4
  module Introspection
4
5
  class BaseObject < GraphQL::Schema::Object
5
6
  introspection(true)
6
7
 
8
+ #: (*untyped args, **untyped kwargs) ?{ (GraphQL::Schema::Field) [self: GraphQL::Schema::Field] -> void } -> untyped
7
9
  def self.field(*args, **kwargs, &block)
8
10
  kwargs[:introspection] = true
9
- super(*args, **kwargs, &block)
11
+ super
10
12
  end
11
13
  end
12
14
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
  module GraphQL
3
4
  module Introspection
4
5
  class DirectiveLocationEnum < GraphQL::Schema::Enum
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
  module GraphQL
3
4
  module Introspection
4
5
  class DirectiveType < Introspection::BaseObject
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
  module GraphQL
3
4
  module Introspection
4
5
  class DynamicFields < Introspection::BaseObject
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
  module GraphQL
3
4
  module Introspection
4
5
  class EntryPoints < Introspection::BaseObject
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
  module GraphQL
3
4
  module Introspection
4
5
  class EnumValueType < Introspection::BaseObject
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
  module GraphQL
3
4
  module Introspection
4
5
  class FieldType < Introspection::BaseObject
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
  module GraphQL
3
4
  module Introspection
4
5
  class InputValueType < Introspection::BaseObject
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
 
3
4
  # This query is used by graphql-client so don't add the includeDeprecated
4
5
  # argument for inputFields since the server may not support it. Two stage
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
 
3
4
  module GraphQL
4
5
  module Introspection
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
  module GraphQL
3
4
  module Introspection
4
5
  class TypeKindEnum < GraphQL::Schema::Enum
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
  module GraphQL
3
4
  module Introspection
4
5
  class TypeType < Introspection::BaseObject
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
  module GraphQL
3
4
  module Introspection
4
5
  def self.query(include_deprecated_args: false, include_schema_description: false, include_is_repeatable: false, include_specified_by_url: false, include_is_one_of: false)
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
  module GraphQL
3
4
  class InvalidNameError < GraphQL::Error
4
5
  attr_reader :name, :valid_regex
@@ -1,27 +1,39 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
  module GraphQL
3
4
  # Raised automatically when a field's resolve function returns `nil`
4
5
  # for a non-null field.
5
6
  class InvalidNullError < GraphQL::RuntimeError
6
- # @return [GraphQL::BaseType] The owner of {#field}
7
+ # **Returns**
8
+ #
9
+ # - `GraphQL::BaseType` — The owner of [field](rdoc-ref:#field)
7
10
  attr_reader :parent_type
8
11
 
9
- # @return [GraphQL::Field] The field which failed to return a value
12
+ # **Returns**
13
+ #
14
+ # - `GraphQL::Field` — The field which failed to return a value
10
15
  attr_reader :field
11
16
 
12
- # @return [GraphQL::Language::Nodes::Field] the field where the error occurred
17
+ # **Returns**
18
+ #
19
+ # - `GraphQL::Language::Nodes::Field` — the field where the error occurred
20
+ #
21
+ # :call-seq:
22
+ # ast_node() -> GraphQL::Language::Nodes::Field
13
23
  def ast_node
14
24
  @ast_nodes.first
15
25
  end
16
26
 
17
27
  attr_reader :ast_nodes
18
28
 
19
- # @return [Boolean] indicates an array result caused the error
29
+ # **Returns**
30
+ #
31
+ # - `Boolean` — indicates an array result caused the error
20
32
  attr_reader :is_from_array
21
33
 
22
34
  attr_accessor :path
23
35
 
24
- def initialize(parent_type, field, ast_node_or_nodes, is_from_array: false, path: nil)
36
+ def initialize(parent_type, field, ast_node_or_nodes, is_from_array: false, path: nil, element_type: nil)
25
37
  @parent_type = parent_type
26
38
  @field = field
27
39
  @ast_nodes = Array(ast_node_or_nodes)
@@ -32,7 +44,8 @@ module GraphQL
32
44
  # whether it was caused by a null instead of the list or a
33
45
  # null element.
34
46
  if @is_from_array
35
- super("Cannot return null for non-nullable element of type '#{@field.type.of_type.of_type.to_type_signature}' for #{@parent_type.graphql_name}.#{@field.graphql_name}")
47
+ element_type ||= @field.type.of_type.of_type
48
+ super("Cannot return null for non-nullable element of type '#{element_type.to_type_signature}' for #{@parent_type.graphql_name}.#{@field.graphql_name}")
36
49
  else
37
50
  super("Cannot return null for non-nullable field #{@parent_type.graphql_name}.#{@field.graphql_name}")
38
51
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
  module GraphQL
3
4
  module Language
4
5
  module BlockString
@@ -13,7 +14,7 @@ module GraphQL
13
14
  end
14
15
 
15
16
  lines = has_newline ? str.split("\n") : [str]
16
- common_indent = nil
17
+ common_indent = nil #: Integer?
17
18
 
18
19
  # find the common whitespace
19
20
  lines.each_with_index do |line, idx|
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
 
3
4
  require 'graphql/version'
4
5
  require 'digest/sha2'
@@ -8,7 +9,7 @@ require 'tempfile'
8
9
 
9
10
  module GraphQL
10
11
  module Language
11
- # This cache is used by {GraphQL::Language::Parser.parse_file} when it's enabled.
12
+ # This cache is used by [GraphQL::Language::Parser.parse_file](rdoc-ref:GraphQL::Language::Parser.parse_file) when it's enabled.
12
13
  #
13
14
  # With Rails, parser caching may enabled by setting `config.graphql.parser_cache = true` in your Rails application.
14
15
  #
@@ -23,11 +24,16 @@ module GraphQL
23
24
  # You will need to clear the cache directory for each new deployment of your application.
24
25
  # Also note that the parser cache will grow as your schema is loaded, so the cache directory must be writable.
25
26
  #
26
- # @see GraphQL::Railtie for simple Rails integration
27
+ # See [GraphQL::Railtie](rdoc-ref:GraphQL::Railtie) for simple Rails integration
27
28
  class Cache
28
- # @param path [Pathname] The directory where cache entries are stored.
29
- # @param secret [String, nil] A stable secret for verifying cache entries. When omitted,
29
+ # **Parameters**
30
+ #
31
+ # - `path` (`Pathname`) — The directory where cache entries are stored.
32
+ # - `secret` (`String, nil`) — A stable secret for verifying cache entries. When omitted,
30
33
  # a process-local secret is generated. Pass `nil` to disable cache signing.
34
+ #
35
+ # :call-seq:
36
+ # initialize(Pathname path, String | nil secret:)
31
37
  def initialize(path, secret: SecureRandom.random_bytes(32))
32
38
  @path = path
33
39
  @secret = secret
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
  module GraphQL
3
4
  module Language
4
5
  module Comment
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
  module GraphQL
3
4
  module Language
4
5
  module DefinitionSlice
@@ -1,18 +1,17 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
  module GraphQL
3
4
  module Language
4
- # @api private
5
5
  #
6
- # {GraphQL::Language::DocumentFromSchemaDefinition} is used to convert a {GraphQL::Schema} object
7
- # To a {GraphQL::Language::Document} AST node.
6
+ # **Parameters**
8
7
  #
9
- # @param context [Hash]
10
- # @param only [<#call(member, ctx)>]
11
- # @param except [<#call(member, ctx)>]
12
- # @param include_introspection_types [Boolean] Whether or not to include introspection types in the AST
13
- # @param include_built_in_scalars [Boolean] Whether or not to include built in scalars in the AST
14
- # @param include_built_in_directives [Boolean] Whether or not to include built in directives in the AST
15
- class DocumentFromSchemaDefinition
8
+ # - `context` (`Hash`)
9
+ # - `only` (`<#call(member, ctx)>`)
10
+ # - `except` (`<#call(member, ctx)>`)
11
+ # - `include_introspection_types` (`Boolean`) — Whether or not to include introspection types in the AST
12
+ # - `include_built_in_scalars` (`Boolean`) — Whether or not to include built in scalars in the AST
13
+ # - `include_built_in_directives` (`Boolean`) — Whether or not to include built in directives in the AST
14
+ class DocumentFromSchemaDefinition # :nodoc:
16
15
  def initialize(
17
16
  schema, context: nil, include_introspection_types: false,
18
17
  include_built_in_directives: false, include_built_in_scalars: false, always_include_schema: false
@@ -1,21 +1,35 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
  module GraphQL
3
4
  module Language
4
- # Exposes {.generate}, which turns AST nodes back into query strings.
5
+ # Exposes [.generate](rdoc-ref:.generate), which turns AST nodes back into query strings.
5
6
  module Generation
6
7
  extend self
7
8
 
8
9
  # Turn an AST node back into a string.
9
10
  #
10
- # @example Turning a document into a query
11
- # document = GraphQL.parse(query_string)
12
- # GraphQL::Language::Generation.generate(document)
13
- # # => "{ ... }"
11
+ # **Examples**
14
12
  #
15
- # @param node [GraphQL::Language::Nodes::AbstractNode] an AST node to recursively stringify
16
- # @param indent [String] Whitespace to add to each printed node
17
- # @param printer [GraphQL::Language::Printer] An optional custom printer for printing AST nodes. Defaults to GraphQL::Language::Printer
18
- # @return [String] Valid GraphQL for `node`
13
+ # **Example: Turning a document into a query**
14
+ #
15
+ # ```ruby
16
+ # document = GraphQL.parse(query_string)
17
+ # GraphQL::Language::Generation.generate(document)
18
+ # # => "{ ... }"
19
+ # ```
20
+ #
21
+ # **Parameters**
22
+ #
23
+ # - `node` (`GraphQL::Language::Nodes::AbstractNode`) — an AST node to recursively stringify
24
+ # - `indent` (`String`) — Whitespace to add to each printed node
25
+ # - `printer` (`GraphQL::Language::Printer`) — An optional custom printer for printing AST nodes. Defaults to GraphQL::Language::Printer
26
+ #
27
+ # **Returns**
28
+ #
29
+ # - `String` — Valid GraphQL for `node`
30
+ #
31
+ # :call-seq:
32
+ # generate(GraphQL::Language::Nodes::AbstractNode node, String indent:, GraphQL::Language::Printer printer:) -> String
19
33
  def generate(node, indent: "", printer: GraphQL::Language::Printer.new)
20
34
  printer.print(node, indent: indent)
21
35
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
  module GraphQL
3
4
  module Language
4
5
 
@@ -9,6 +10,9 @@ module GraphQL
9
10
  end
10
11
  @string = graphql_str
11
12
  @filename = filename
13
+ if !@string.valid_encoding?
14
+ raise_parse_error("Parse error on bad Unicode escape sequence", nil, nil)
15
+ end
12
16
  @scanner = StringScanner.new(graphql_str)
13
17
  @pos = nil
14
18
  @max_tokens = max_tokens || Float::INFINITY
@@ -32,6 +36,10 @@ module GraphQL
32
36
  @scanner.skip(IGNORE_REGEXP)
33
37
  if @scanner.skip(COMMENT_REGEXP)
34
38
  @tokens_count += 1
39
+ if @tokens_count > @max_tokens
40
+ @pos = @scanner.pos
41
+ raise_parse_error("This query is too large to execute.")
42
+ end
35
43
  next
36
44
  end
37
45
  break
@@ -110,10 +118,6 @@ module GraphQL
110
118
  @scanner.pos += 1
111
119
  :UNKNOWN_CHAR
112
120
  end
113
- rescue ArgumentError => err
114
- if err.message == "invalid byte sequence in UTF-8"
115
- raise_parse_error("Parse error on bad Unicode escape sequence", nil, nil)
116
- end
117
121
  end
118
122
 
119
123
  def token_value
@@ -147,7 +151,7 @@ module GraphQL
147
151
  "\\r" => "\r",
148
152
  "\\t" => "\t",
149
153
  }
150
- UTF_8 = /\\u(?:([\dAa-f]{4})|\{([\da-f]{4,})\})(?:\\u([\dAa-f]{4}))?/i
154
+ UTF_8 = /\\u(?:([\da-f]{4})|\{([\da-f]+)\})(?:\\u([\da-f]{4}))?/i
151
155
  VALID_STRING = /\A(?:[^\\]|#{ESCAPES}|#{UTF_8})*\z/o
152
156
  ESCAPED = /(?:#{ESCAPES}|#{UTF_8})/o
153
157
 
@@ -163,7 +167,11 @@ module GraphQL
163
167
  if !str.valid_encoding? || !str.match?(VALID_STRING)
164
168
  raise_parse_error("Bad unicode escape in #{str.inspect}")
165
169
  else
166
- Lexer.replace_escaped_characters_in_place(str)
170
+ begin
171
+ Lexer.replace_escaped_characters_in_place(str)
172
+ rescue RangeError
173
+ raise_parse_error("Bad unicode escape in #{str.inspect}")
174
+ end
167
175
 
168
176
  if !str.valid_encoding?
169
177
  raise_parse_error("Bad unicode escape in #{str.inspect}")
@@ -189,7 +197,7 @@ module GraphQL
189
197
  raise GraphQL::ParseError.new(message, line, col, @string, filename: @filename)
190
198
  end
191
199
 
192
- IGNORE_REGEXP = /[, \c\r\n\t]+/
200
+ IGNORE_REGEXP = /[, \r\n\t\uFEFF]+/
193
201
  COMMENT_REGEXP = /\#[^\n]*/
194
202
  IDENTIFIER_REGEXP = /[_A-Za-z][_0-9A-Za-z]*/
195
203
  INT_REGEXP = /-?(?:[0]|[1-9][0-9]*)/
@@ -289,7 +297,7 @@ module GraphQL
289
297
  QUOTE = '"'
290
298
  UNICODE_DIGIT = /[0-9A-Za-z]/
291
299
  FOUR_DIGIT_UNICODE = /#{UNICODE_DIGIT}{4}/
292
- N_DIGIT_UNICODE = %r{#{Punctuation::LCURLY}#{UNICODE_DIGIT}{4,}#{Punctuation::RCURLY}}x
300
+ N_DIGIT_UNICODE = %r{#{Punctuation::LCURLY}#{UNICODE_DIGIT}+#{Punctuation::RCURLY}}x
293
301
  UNICODE_ESCAPE = %r{\\u(?:#{FOUR_DIGIT_UNICODE}|#{N_DIGIT_UNICODE})}
294
302
  STRING_ESCAPE = %r{[\\][\\/bfnrt]}
295
303
  BLOCK_QUOTE = '"""'