graphql 1.12.12 → 2.4.8

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.

Potentially problematic release.


This version of graphql might be problematic. Click here for more details.

Files changed (428) hide show
  1. checksums.yaml +4 -4
  2. data/lib/generators/graphql/core.rb +3 -8
  3. data/lib/generators/graphql/enum_generator.rb +4 -10
  4. data/lib/generators/graphql/field_extractor.rb +31 -0
  5. data/lib/generators/graphql/input_generator.rb +50 -0
  6. data/lib/generators/graphql/install/mutation_root_generator.rb +34 -0
  7. data/lib/generators/graphql/{templates → install/templates}/base_mutation.erb +2 -0
  8. data/lib/generators/graphql/{templates → install/templates}/mutation_type.erb +2 -0
  9. data/lib/generators/graphql/install_generator.rb +60 -4
  10. data/lib/generators/graphql/interface_generator.rb +7 -7
  11. data/lib/generators/graphql/mutation_create_generator.rb +22 -0
  12. data/lib/generators/graphql/mutation_delete_generator.rb +22 -0
  13. data/lib/generators/graphql/mutation_generator.rb +5 -30
  14. data/lib/generators/graphql/mutation_update_generator.rb +22 -0
  15. data/lib/generators/graphql/object_generator.rb +10 -38
  16. data/lib/generators/graphql/orm_mutations_base.rb +40 -0
  17. data/lib/generators/graphql/relay.rb +23 -12
  18. data/lib/generators/graphql/scalar_generator.rb +4 -2
  19. data/lib/generators/graphql/templates/base_argument.erb +2 -0
  20. data/lib/generators/graphql/templates/base_connection.erb +2 -0
  21. data/lib/generators/graphql/templates/base_edge.erb +2 -0
  22. data/lib/generators/graphql/templates/base_enum.erb +2 -0
  23. data/lib/generators/graphql/templates/base_field.erb +2 -0
  24. data/lib/generators/graphql/templates/base_input_object.erb +2 -0
  25. data/lib/generators/graphql/templates/base_interface.erb +2 -0
  26. data/lib/generators/graphql/templates/base_object.erb +2 -0
  27. data/lib/generators/graphql/templates/base_resolver.erb +8 -0
  28. data/lib/generators/graphql/templates/base_scalar.erb +2 -0
  29. data/lib/generators/graphql/templates/base_union.erb +2 -0
  30. data/lib/generators/graphql/templates/enum.erb +5 -1
  31. data/lib/generators/graphql/templates/graphql_controller.erb +2 -0
  32. data/lib/generators/graphql/templates/input.erb +9 -0
  33. data/lib/generators/graphql/templates/interface.erb +4 -2
  34. data/lib/generators/graphql/templates/loader.erb +2 -0
  35. data/lib/generators/graphql/templates/mutation.erb +3 -1
  36. data/lib/generators/graphql/templates/mutation_create.erb +20 -0
  37. data/lib/generators/graphql/templates/mutation_delete.erb +20 -0
  38. data/lib/generators/graphql/templates/mutation_update.erb +21 -0
  39. data/lib/generators/graphql/templates/node_type.erb +2 -0
  40. data/lib/generators/graphql/templates/object.erb +4 -2
  41. data/lib/generators/graphql/templates/query_type.erb +2 -0
  42. data/lib/generators/graphql/templates/scalar.erb +3 -1
  43. data/lib/generators/graphql/templates/schema.erb +22 -2
  44. data/lib/generators/graphql/templates/union.erb +4 -2
  45. data/lib/generators/graphql/type_generator.rb +46 -10
  46. data/lib/generators/graphql/union_generator.rb +5 -5
  47. data/lib/graphql/analysis/analyzer.rb +89 -0
  48. data/lib/graphql/analysis/field_usage.rb +65 -28
  49. data/lib/graphql/analysis/max_query_complexity.rb +11 -17
  50. data/lib/graphql/analysis/max_query_depth.rb +13 -19
  51. data/lib/graphql/analysis/query_complexity.rb +156 -61
  52. data/lib/graphql/analysis/query_depth.rb +38 -23
  53. data/lib/graphql/analysis/visitor.rb +283 -0
  54. data/lib/graphql/analysis.rb +90 -6
  55. data/lib/graphql/autoload.rb +38 -0
  56. data/lib/graphql/backtrace/inspect_result.rb +0 -12
  57. data/lib/graphql/backtrace/table.rb +4 -22
  58. data/lib/graphql/backtrace/trace.rb +93 -0
  59. data/lib/graphql/backtrace/tracer.rb +8 -6
  60. data/lib/graphql/backtrace.rb +3 -8
  61. data/lib/graphql/coercion_error.rb +1 -9
  62. data/lib/graphql/current.rb +52 -0
  63. data/lib/graphql/dataloader/async_dataloader.rb +89 -0
  64. data/lib/graphql/dataloader/null_dataloader.rb +4 -2
  65. data/lib/graphql/dataloader/request.rb +5 -0
  66. data/lib/graphql/dataloader/source.rb +125 -33
  67. data/lib/graphql/dataloader.rb +193 -143
  68. data/lib/graphql/date_encoding_error.rb +16 -0
  69. data/lib/graphql/dig.rb +1 -1
  70. data/lib/graphql/duration_encoding_error.rb +16 -0
  71. data/lib/graphql/execution/errors.rb +12 -81
  72. data/lib/graphql/execution/interpreter/argument_value.rb +5 -1
  73. data/lib/graphql/execution/interpreter/arguments.rb +2 -2
  74. data/lib/graphql/execution/interpreter/arguments_cache.rb +33 -36
  75. data/lib/graphql/execution/interpreter/resolve.rb +38 -4
  76. data/lib/graphql/execution/interpreter/runtime/graphql_result.rb +175 -0
  77. data/lib/graphql/execution/interpreter/runtime.rb +447 -403
  78. data/lib/graphql/execution/interpreter.rb +126 -80
  79. data/lib/graphql/execution/lazy.rb +11 -21
  80. data/lib/graphql/execution/lookahead.rb +133 -55
  81. data/lib/graphql/execution/multiplex.rb +4 -172
  82. data/lib/graphql/execution.rb +11 -4
  83. data/lib/graphql/integer_encoding_error.rb +18 -2
  84. data/lib/graphql/introspection/directive_location_enum.rb +2 -2
  85. data/lib/graphql/introspection/directive_type.rb +6 -4
  86. data/lib/graphql/introspection/dynamic_fields.rb +3 -8
  87. data/lib/graphql/introspection/entry_points.rb +11 -18
  88. data/lib/graphql/introspection/enum_value_type.rb +2 -2
  89. data/lib/graphql/introspection/field_type.rb +4 -4
  90. data/lib/graphql/introspection/input_value_type.rb +10 -4
  91. data/lib/graphql/introspection/schema_type.rb +17 -15
  92. data/lib/graphql/introspection/type_type.rb +29 -16
  93. data/lib/graphql/introspection.rb +6 -2
  94. data/lib/graphql/invalid_null_error.rb +1 -1
  95. data/lib/graphql/language/block_string.rb +37 -25
  96. data/lib/graphql/language/cache.rb +13 -0
  97. data/lib/graphql/language/comment.rb +18 -0
  98. data/lib/graphql/language/definition_slice.rb +1 -1
  99. data/lib/graphql/language/document_from_schema_definition.rb +122 -81
  100. data/lib/graphql/language/lexer.rb +364 -1467
  101. data/lib/graphql/language/nodes.rb +197 -106
  102. data/lib/graphql/language/parser.rb +799 -1920
  103. data/lib/graphql/language/printer.rb +372 -160
  104. data/lib/graphql/language/sanitized_printer.rb +25 -27
  105. data/lib/graphql/language/static_visitor.rb +167 -0
  106. data/lib/graphql/language/visitor.rb +188 -141
  107. data/lib/graphql/language.rb +62 -1
  108. data/lib/graphql/load_application_object_failed_error.rb +5 -1
  109. data/lib/graphql/name_validator.rb +0 -4
  110. data/lib/graphql/pagination/active_record_relation_connection.rb +37 -8
  111. data/lib/graphql/pagination/array_connection.rb +8 -6
  112. data/lib/graphql/pagination/connection.rb +61 -7
  113. data/lib/graphql/pagination/connections.rb +22 -23
  114. data/lib/graphql/pagination/mongoid_relation_connection.rb +1 -2
  115. data/lib/graphql/pagination/relation_connection.rb +60 -28
  116. data/lib/graphql/query/context/scoped_context.rb +101 -0
  117. data/lib/graphql/query/context.rb +146 -222
  118. data/lib/graphql/query/input_validation_result.rb +10 -1
  119. data/lib/graphql/query/null_context.rb +15 -32
  120. data/lib/graphql/query/validation_pipeline.rb +15 -39
  121. data/lib/graphql/query/variable_validation_error.rb +3 -3
  122. data/lib/graphql/query/variables.rb +35 -17
  123. data/lib/graphql/query.rb +149 -82
  124. data/lib/graphql/railtie.rb +15 -109
  125. data/lib/graphql/rake_task/validate.rb +1 -1
  126. data/lib/graphql/rake_task.rb +30 -11
  127. data/lib/graphql/relay/range_add.rb +9 -16
  128. data/lib/graphql/relay.rb +0 -15
  129. data/lib/graphql/rubocop/graphql/base_cop.rb +36 -0
  130. data/lib/graphql/rubocop/graphql/default_null_true.rb +43 -0
  131. data/lib/graphql/rubocop/graphql/default_required_true.rb +43 -0
  132. data/lib/graphql/rubocop/graphql/field_type_in_block.rb +144 -0
  133. data/lib/graphql/rubocop/graphql/root_types_in_block.rb +38 -0
  134. data/lib/graphql/rubocop.rb +6 -0
  135. data/lib/graphql/schema/addition.rb +98 -54
  136. data/lib/graphql/schema/always_visible.rb +14 -0
  137. data/lib/graphql/schema/argument.rb +179 -82
  138. data/lib/graphql/schema/base_64_encoder.rb +3 -5
  139. data/lib/graphql/schema/build_from_definition.rb +77 -39
  140. data/lib/graphql/schema/directive/feature.rb +1 -1
  141. data/lib/graphql/schema/directive/flagged.rb +4 -4
  142. data/lib/graphql/schema/directive/include.rb +1 -1
  143. data/lib/graphql/schema/directive/one_of.rb +24 -0
  144. data/lib/graphql/schema/directive/skip.rb +1 -1
  145. data/lib/graphql/schema/directive/specified_by.rb +14 -0
  146. data/lib/graphql/schema/directive/transform.rb +2 -2
  147. data/lib/graphql/schema/directive.rb +36 -22
  148. data/lib/graphql/schema/enum.rb +158 -63
  149. data/lib/graphql/schema/enum_value.rb +12 -21
  150. data/lib/graphql/schema/field/connection_extension.rb +7 -17
  151. data/lib/graphql/schema/field/scope_extension.rb +8 -1
  152. data/lib/graphql/schema/field.rb +521 -359
  153. data/lib/graphql/schema/field_extension.rb +86 -2
  154. data/lib/graphql/schema/find_inherited_value.rb +3 -7
  155. data/lib/graphql/schema/finder.rb +5 -5
  156. data/lib/graphql/schema/has_single_input_argument.rb +160 -0
  157. data/lib/graphql/schema/input_object.rb +148 -99
  158. data/lib/graphql/schema/interface.rb +41 -64
  159. data/lib/graphql/schema/introspection_system.rb +12 -26
  160. data/lib/graphql/schema/late_bound_type.rb +12 -2
  161. data/lib/graphql/schema/list.rb +18 -7
  162. data/lib/graphql/schema/loader.rb +6 -5
  163. data/lib/graphql/schema/member/base_dsl_methods.rb +32 -18
  164. data/lib/graphql/schema/member/build_type.rb +16 -13
  165. data/lib/graphql/schema/member/has_arguments.rb +270 -86
  166. data/lib/graphql/schema/member/has_ast_node.rb +12 -0
  167. data/lib/graphql/schema/member/has_deprecation_reason.rb +3 -4
  168. data/lib/graphql/schema/member/has_directives.rb +81 -61
  169. data/lib/graphql/schema/member/has_fields.rb +169 -31
  170. data/lib/graphql/schema/member/has_interfaces.rb +143 -0
  171. data/lib/graphql/schema/member/has_unresolved_type_error.rb +5 -1
  172. data/lib/graphql/schema/member/has_validators.rb +32 -6
  173. data/lib/graphql/schema/member/relay_shortcuts.rb +47 -2
  174. data/lib/graphql/schema/member/scoped.rb +19 -0
  175. data/lib/graphql/schema/member/type_system_helpers.rb +16 -0
  176. data/lib/graphql/schema/member/validates_input.rb +6 -6
  177. data/lib/graphql/schema/member.rb +1 -6
  178. data/lib/graphql/schema/mutation.rb +7 -9
  179. data/lib/graphql/schema/non_null.rb +7 -7
  180. data/lib/graphql/schema/object.rb +38 -119
  181. data/lib/graphql/schema/printer.rb +24 -25
  182. data/lib/graphql/schema/relay_classic_mutation.rb +13 -91
  183. data/lib/graphql/schema/resolver/has_payload_type.rb +46 -11
  184. data/lib/graphql/schema/resolver.rb +118 -115
  185. data/lib/graphql/schema/scalar.rb +20 -21
  186. data/lib/graphql/schema/subscription.rb +95 -21
  187. data/lib/graphql/schema/timeout.rb +25 -29
  188. data/lib/graphql/schema/type_expression.rb +2 -2
  189. data/lib/graphql/schema/type_membership.rb +21 -4
  190. data/lib/graphql/schema/union.rb +16 -16
  191. data/lib/graphql/schema/unique_within_type.rb +1 -1
  192. data/lib/graphql/schema/validator/all_validator.rb +62 -0
  193. data/lib/graphql/schema/validator/allow_blank_validator.rb +29 -0
  194. data/lib/graphql/schema/validator/allow_null_validator.rb +26 -0
  195. data/lib/graphql/schema/validator/exclusion_validator.rb +3 -1
  196. data/lib/graphql/schema/validator/format_validator.rb +4 -5
  197. data/lib/graphql/schema/validator/inclusion_validator.rb +3 -1
  198. data/lib/graphql/schema/validator/length_validator.rb +5 -3
  199. data/lib/graphql/schema/validator/numericality_validator.rb +13 -2
  200. data/lib/graphql/schema/validator/required_validator.rb +56 -18
  201. data/lib/graphql/schema/validator.rb +38 -28
  202. data/lib/graphql/schema/visibility/migration.rb +188 -0
  203. data/lib/graphql/schema/visibility/profile.rb +359 -0
  204. data/lib/graphql/schema/visibility/visit.rb +190 -0
  205. data/lib/graphql/schema/visibility.rb +294 -0
  206. data/lib/graphql/schema/warden.rb +423 -134
  207. data/lib/graphql/schema/wrapper.rb +0 -5
  208. data/lib/graphql/schema.rb +1015 -1057
  209. data/lib/graphql/static_validation/all_rules.rb +3 -1
  210. data/lib/graphql/static_validation/base_visitor.rb +15 -28
  211. data/lib/graphql/static_validation/definition_dependencies.rb +7 -2
  212. data/lib/graphql/static_validation/error.rb +3 -1
  213. data/lib/graphql/static_validation/literal_validator.rb +24 -7
  214. data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +1 -1
  215. data/lib/graphql/static_validation/rules/argument_names_are_unique.rb +1 -1
  216. data/lib/graphql/static_validation/rules/arguments_are_defined.rb +4 -3
  217. data/lib/graphql/static_validation/rules/directives_are_defined.rb +13 -7
  218. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +15 -13
  219. data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +12 -2
  220. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +13 -5
  221. data/lib/graphql/static_validation/rules/fields_will_merge.rb +62 -35
  222. data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +25 -4
  223. data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +3 -3
  224. data/lib/graphql/static_validation/rules/fragment_types_exist.rb +12 -2
  225. data/lib/graphql/static_validation/rules/fragments_are_finite.rb +2 -2
  226. data/lib/graphql/static_validation/rules/fragments_are_on_composite_types.rb +1 -1
  227. data/lib/graphql/static_validation/rules/mutation_root_exists.rb +1 -1
  228. data/lib/graphql/static_validation/rules/no_definitions_are_present.rb +1 -1
  229. data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid.rb +66 -0
  230. data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid_error.rb +29 -0
  231. data/lib/graphql/static_validation/rules/query_root_exists.rb +17 -0
  232. data/lib/graphql/static_validation/rules/query_root_exists_error.rb +26 -0
  233. data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +7 -5
  234. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +5 -5
  235. data/lib/graphql/static_validation/rules/subscription_root_exists.rb +1 -1
  236. data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +14 -8
  237. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +18 -27
  238. data/lib/graphql/static_validation/rules/variable_names_are_unique.rb +1 -1
  239. data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +14 -8
  240. data/lib/graphql/static_validation/rules/variables_are_input_types.rb +11 -2
  241. data/lib/graphql/static_validation/validation_context.rb +32 -6
  242. data/lib/graphql/static_validation/validator.rb +11 -27
  243. data/lib/graphql/static_validation.rb +0 -3
  244. data/lib/graphql/string_encoding_error.rb +13 -3
  245. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +49 -11
  246. data/lib/graphql/subscriptions/broadcast_analyzer.rb +11 -5
  247. data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +40 -1
  248. data/lib/graphql/subscriptions/event.rb +87 -38
  249. data/lib/graphql/subscriptions/serialize.rb +27 -3
  250. data/lib/graphql/subscriptions.rb +63 -49
  251. data/lib/graphql/testing/helpers.rb +155 -0
  252. data/lib/graphql/testing.rb +2 -0
  253. data/lib/graphql/tracing/active_support_notifications_trace.rb +16 -0
  254. data/lib/graphql/tracing/active_support_notifications_tracing.rb +6 -20
  255. data/lib/graphql/tracing/appoptics_trace.rb +253 -0
  256. data/lib/graphql/tracing/appoptics_tracing.rb +4 -2
  257. data/lib/graphql/tracing/appsignal_trace.rb +79 -0
  258. data/lib/graphql/tracing/appsignal_tracing.rb +17 -0
  259. data/lib/graphql/tracing/call_legacy_tracers.rb +66 -0
  260. data/lib/graphql/tracing/data_dog_trace.rb +185 -0
  261. data/lib/graphql/tracing/data_dog_tracing.rb +27 -15
  262. data/lib/graphql/{execution/instrumentation.rb → tracing/legacy_hooks_trace.rb} +11 -28
  263. data/lib/graphql/tracing/legacy_trace.rb +12 -0
  264. data/lib/graphql/tracing/new_relic_trace.rb +77 -0
  265. data/lib/graphql/tracing/new_relic_tracing.rb +2 -0
  266. data/lib/graphql/tracing/notifications_trace.rb +45 -0
  267. data/lib/graphql/tracing/notifications_tracing.rb +61 -0
  268. data/lib/graphql/tracing/null_trace.rb +9 -0
  269. data/lib/graphql/tracing/platform_trace.rb +118 -0
  270. data/lib/graphql/tracing/platform_tracing.rb +46 -49
  271. data/lib/graphql/tracing/{prometheus_tracing → prometheus_trace}/graphql_collector.rb +6 -2
  272. data/lib/graphql/tracing/prometheus_trace.rb +94 -0
  273. data/lib/graphql/tracing/prometheus_tracing.rb +5 -3
  274. data/lib/graphql/tracing/scout_trace.rb +74 -0
  275. data/lib/graphql/tracing/scout_tracing.rb +2 -0
  276. data/lib/graphql/tracing/sentry_trace.rb +114 -0
  277. data/lib/graphql/tracing/statsd_trace.rb +58 -0
  278. data/lib/graphql/tracing/statsd_tracing.rb +2 -0
  279. data/lib/graphql/tracing/trace.rb +79 -0
  280. data/lib/graphql/tracing.rb +29 -52
  281. data/lib/graphql/type_kinds.rb +7 -4
  282. data/lib/graphql/types/big_int.rb +5 -1
  283. data/lib/graphql/types/int.rb +1 -1
  284. data/lib/graphql/types/iso_8601_date.rb +17 -6
  285. data/lib/graphql/types/iso_8601_date_time.rb +12 -1
  286. data/lib/graphql/types/iso_8601_duration.rb +77 -0
  287. data/lib/graphql/types/relay/base_connection.rb +16 -6
  288. data/lib/graphql/types/relay/connection_behaviors.rb +92 -32
  289. data/lib/graphql/types/relay/edge_behaviors.rb +46 -7
  290. data/lib/graphql/types/relay/has_node_field.rb +2 -2
  291. data/lib/graphql/types/relay/has_nodes_field.rb +2 -2
  292. data/lib/graphql/types/relay/node_behaviors.rb +12 -2
  293. data/lib/graphql/types/relay/page_info_behaviors.rb +11 -2
  294. data/lib/graphql/types/relay.rb +0 -3
  295. data/lib/graphql/types/string.rb +2 -2
  296. data/lib/graphql/types.rb +18 -10
  297. data/lib/graphql/unauthorized_enum_value_error.rb +13 -0
  298. data/lib/graphql/unauthorized_error.rb +1 -1
  299. data/lib/graphql/version.rb +1 -1
  300. data/lib/graphql.rb +82 -137
  301. data/readme.md +13 -6
  302. metadata +127 -186
  303. data/lib/graphql/analysis/analyze_query.rb +0 -98
  304. data/lib/graphql/analysis/ast/analyzer.rb +0 -84
  305. data/lib/graphql/analysis/ast/field_usage.rb +0 -28
  306. data/lib/graphql/analysis/ast/max_query_complexity.rb +0 -23
  307. data/lib/graphql/analysis/ast/max_query_depth.rb +0 -22
  308. data/lib/graphql/analysis/ast/query_complexity.rb +0 -234
  309. data/lib/graphql/analysis/ast/query_depth.rb +0 -56
  310. data/lib/graphql/analysis/ast/visitor.rb +0 -268
  311. data/lib/graphql/analysis/ast.rb +0 -91
  312. data/lib/graphql/analysis/reducer_state.rb +0 -48
  313. data/lib/graphql/argument.rb +0 -131
  314. data/lib/graphql/authorization.rb +0 -82
  315. data/lib/graphql/backtrace/legacy_tracer.rb +0 -56
  316. data/lib/graphql/backwards_compatibility.rb +0 -61
  317. data/lib/graphql/base_type.rb +0 -230
  318. data/lib/graphql/boolean_type.rb +0 -2
  319. data/lib/graphql/compatibility/execution_specification/counter_schema.rb +0 -53
  320. data/lib/graphql/compatibility/execution_specification/specification_schema.rb +0 -200
  321. data/lib/graphql/compatibility/execution_specification.rb +0 -436
  322. data/lib/graphql/compatibility/lazy_execution_specification/lazy_schema.rb +0 -111
  323. data/lib/graphql/compatibility/lazy_execution_specification.rb +0 -215
  324. data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +0 -87
  325. data/lib/graphql/compatibility/query_parser_specification/query_assertions.rb +0 -79
  326. data/lib/graphql/compatibility/query_parser_specification.rb +0 -266
  327. data/lib/graphql/compatibility/schema_parser_specification.rb +0 -682
  328. data/lib/graphql/compatibility.rb +0 -5
  329. data/lib/graphql/define/assign_argument.rb +0 -12
  330. data/lib/graphql/define/assign_connection.rb +0 -13
  331. data/lib/graphql/define/assign_enum_value.rb +0 -18
  332. data/lib/graphql/define/assign_global_id_field.rb +0 -11
  333. data/lib/graphql/define/assign_mutation_function.rb +0 -34
  334. data/lib/graphql/define/assign_object_field.rb +0 -42
  335. data/lib/graphql/define/defined_object_proxy.rb +0 -53
  336. data/lib/graphql/define/instance_definable.rb +0 -240
  337. data/lib/graphql/define/no_definition_error.rb +0 -7
  338. data/lib/graphql/define/non_null_with_bang.rb +0 -16
  339. data/lib/graphql/define/type_definer.rb +0 -31
  340. data/lib/graphql/define.rb +0 -31
  341. data/lib/graphql/deprecated_dsl.rb +0 -47
  342. data/lib/graphql/deprecation.rb +0 -13
  343. data/lib/graphql/directive/deprecated_directive.rb +0 -2
  344. data/lib/graphql/directive/include_directive.rb +0 -2
  345. data/lib/graphql/directive/skip_directive.rb +0 -2
  346. data/lib/graphql/directive.rb +0 -111
  347. data/lib/graphql/enum_type.rb +0 -129
  348. data/lib/graphql/execution/execute.rb +0 -333
  349. data/lib/graphql/execution/flatten.rb +0 -40
  350. data/lib/graphql/execution/lazy/resolve.rb +0 -91
  351. data/lib/graphql/execution/typecast.rb +0 -50
  352. data/lib/graphql/field/resolve.rb +0 -59
  353. data/lib/graphql/field.rb +0 -226
  354. data/lib/graphql/filter.rb +0 -53
  355. data/lib/graphql/float_type.rb +0 -2
  356. data/lib/graphql/function.rb +0 -128
  357. data/lib/graphql/id_type.rb +0 -2
  358. data/lib/graphql/input_object_type.rb +0 -138
  359. data/lib/graphql/int_type.rb +0 -2
  360. data/lib/graphql/interface_type.rb +0 -72
  361. data/lib/graphql/internal_representation/document.rb +0 -27
  362. data/lib/graphql/internal_representation/node.rb +0 -206
  363. data/lib/graphql/internal_representation/print.rb +0 -51
  364. data/lib/graphql/internal_representation/rewrite.rb +0 -184
  365. data/lib/graphql/internal_representation/scope.rb +0 -88
  366. data/lib/graphql/internal_representation/visit.rb +0 -36
  367. data/lib/graphql/internal_representation.rb +0 -7
  368. data/lib/graphql/language/lexer.rl +0 -262
  369. data/lib/graphql/language/parser.y +0 -543
  370. data/lib/graphql/language/token.rb +0 -38
  371. data/lib/graphql/list_type.rb +0 -80
  372. data/lib/graphql/non_null_type.rb +0 -71
  373. data/lib/graphql/object_type.rb +0 -130
  374. data/lib/graphql/query/arguments.rb +0 -189
  375. data/lib/graphql/query/arguments_cache.rb +0 -24
  376. data/lib/graphql/query/executor.rb +0 -52
  377. data/lib/graphql/query/literal_input.rb +0 -136
  378. data/lib/graphql/query/serial_execution/field_resolution.rb +0 -92
  379. data/lib/graphql/query/serial_execution/operation_resolution.rb +0 -19
  380. data/lib/graphql/query/serial_execution/selection_resolution.rb +0 -23
  381. data/lib/graphql/query/serial_execution/value_resolution.rb +0 -87
  382. data/lib/graphql/query/serial_execution.rb +0 -40
  383. data/lib/graphql/relay/array_connection.rb +0 -83
  384. data/lib/graphql/relay/base_connection.rb +0 -189
  385. data/lib/graphql/relay/connection_instrumentation.rb +0 -54
  386. data/lib/graphql/relay/connection_resolve.rb +0 -43
  387. data/lib/graphql/relay/connection_type.rb +0 -41
  388. data/lib/graphql/relay/edge.rb +0 -27
  389. data/lib/graphql/relay/edge_type.rb +0 -19
  390. data/lib/graphql/relay/edges_instrumentation.rb +0 -40
  391. data/lib/graphql/relay/global_id_resolve.rb +0 -18
  392. data/lib/graphql/relay/mongo_relation_connection.rb +0 -50
  393. data/lib/graphql/relay/mutation/instrumentation.rb +0 -23
  394. data/lib/graphql/relay/mutation/resolve.rb +0 -56
  395. data/lib/graphql/relay/mutation/result.rb +0 -38
  396. data/lib/graphql/relay/mutation.rb +0 -106
  397. data/lib/graphql/relay/node.rb +0 -39
  398. data/lib/graphql/relay/page_info.rb +0 -7
  399. data/lib/graphql/relay/relation_connection.rb +0 -188
  400. data/lib/graphql/relay/type_extensions.rb +0 -32
  401. data/lib/graphql/scalar_type.rb +0 -91
  402. data/lib/graphql/schema/base_64_bp.rb +0 -26
  403. data/lib/graphql/schema/catchall_middleware.rb +0 -35
  404. data/lib/graphql/schema/default_parse_error.rb +0 -10
  405. data/lib/graphql/schema/default_type_error.rb +0 -17
  406. data/lib/graphql/schema/invalid_type_error.rb +0 -7
  407. data/lib/graphql/schema/member/accepts_definition.rb +0 -152
  408. data/lib/graphql/schema/member/cached_graphql_definition.rb +0 -31
  409. data/lib/graphql/schema/member/instrumentation.rb +0 -131
  410. data/lib/graphql/schema/middleware_chain.rb +0 -82
  411. data/lib/graphql/schema/possible_types.rb +0 -44
  412. data/lib/graphql/schema/rescue_middleware.rb +0 -60
  413. data/lib/graphql/schema/timeout_middleware.rb +0 -88
  414. data/lib/graphql/schema/traversal.rb +0 -228
  415. data/lib/graphql/schema/validation.rb +0 -313
  416. data/lib/graphql/static_validation/default_visitor.rb +0 -15
  417. data/lib/graphql/static_validation/no_validate_visitor.rb +0 -10
  418. data/lib/graphql/static_validation/type_stack.rb +0 -216
  419. data/lib/graphql/string_type.rb +0 -2
  420. data/lib/graphql/subscriptions/instrumentation.rb +0 -79
  421. data/lib/graphql/subscriptions/subscription_root.rb +0 -76
  422. data/lib/graphql/tracing/skylight_tracing.rb +0 -70
  423. data/lib/graphql/types/relay/default_relay.rb +0 -27
  424. data/lib/graphql/types/relay/node_field.rb +0 -25
  425. data/lib/graphql/types/relay/nodes_field.rb +0 -27
  426. data/lib/graphql/union_type.rb +0 -115
  427. data/lib/graphql/upgrader/member.rb +0 -937
  428. data/lib/graphql/upgrader/schema.rb +0 -38
@@ -1,84 +1,10 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module GraphQL
3
4
  class Query
4
5
  # Expose some query-specific info to field resolve functions.
5
6
  # It delegates `[]` to the hash that's passed to `GraphQL::Query#initialize`.
6
7
  class Context
7
- module SharedMethods
8
- # @return [Object] The target for field resolution
9
- attr_accessor :object
10
-
11
- # @return [Hash, Array, String, Integer, Float, Boolean, nil] The resolved value for this field
12
- attr_reader :value
13
-
14
- # @return [Boolean] were any fields of this selection skipped?
15
- attr_reader :skipped
16
- alias :skipped? :skipped
17
-
18
- # @api private
19
- attr_writer :skipped
20
-
21
- # Return this value to tell the runtime
22
- # to exclude this field from the response altogether
23
- def skip
24
- GraphQL::Execution::Execute::SKIP
25
- end
26
-
27
- # @return [Boolean] True if this selection has been nullified by a null child
28
- def invalid_null?
29
- @invalid_null
30
- end
31
-
32
- # Remove this child from the result value
33
- # (used for null propagation and skip)
34
- # @api private
35
- def delete_child(child_ctx)
36
- @value.delete(child_ctx.key)
37
- end
38
-
39
- # Create a child context to use for `key`
40
- # @param key [String, Integer] The key in the response (name or index)
41
- # @param irep_node [InternalRepresentation::Node] The node being evaluated
42
- # @api private
43
- def spawn_child(key:, irep_node:, object:)
44
- FieldResolutionContext.new(
45
- @context,
46
- key,
47
- irep_node,
48
- self,
49
- object
50
- )
51
- end
52
-
53
- # Add error at query-level.
54
- # @param error [GraphQL::ExecutionError] an execution error
55
- # @return [void]
56
- def add_error(error)
57
- if !error.is_a?(ExecutionError)
58
- raise TypeError, "expected error to be a ExecutionError, but was #{error.class}"
59
- end
60
- errors << error
61
- nil
62
- end
63
-
64
- # @example Print the GraphQL backtrace during field resolution
65
- # puts ctx.backtrace
66
- #
67
- # @return [GraphQL::Backtrace] The backtrace for this point in query execution
68
- def backtrace
69
- GraphQL::Backtrace.new(self)
70
- end
71
-
72
- def execution_errors
73
- @execution_errors ||= ExecutionErrors.new(self)
74
- end
75
-
76
- def lookahead
77
- ast_nodes = irep_node.ast_nodes
78
- field = irep_node.definition.metadata[:type_class] || raise("Lookahead is only compatible with class-based schemas")
79
- Execution::Lookahead.new(query: query, ast_nodes: ast_nodes, field: field)
80
- end
81
- end
82
8
 
83
9
  class ExecutionErrors
84
10
  def initialize(ctx)
@@ -102,30 +28,8 @@ module GraphQL
102
28
  alias :push :add
103
29
  end
104
30
 
105
- include SharedMethods
106
31
  extend Forwardable
107
32
 
108
- attr_reader :execution_strategy
109
- # `strategy` is required by GraphQL::Batch
110
- alias_method :strategy, :execution_strategy
111
-
112
- def execution_strategy=(new_strategy)
113
- # GraphQL::Batch re-assigns this value but it was previously not used
114
- # (ExecutionContext#strategy was used instead)
115
- # now it _is_ used, but it breaks GraphQL::Batch tests
116
- @execution_strategy ||= new_strategy
117
- end
118
-
119
- # @return [GraphQL::InternalRepresentation::Node] The internal representation for this query node
120
- def irep_node
121
- @irep_node ||= query.irep_selection
122
- end
123
-
124
- # @return [GraphQL::Language::Nodes::Field] The AST node for the currently-executing field
125
- def ast_node
126
- @irep_node.ast_node
127
- end
128
-
129
33
  # @return [Array<GraphQL::ExecutionError>] errors returned during execution
130
34
  attr_reader :errors
131
35
 
@@ -141,23 +45,27 @@ module GraphQL
141
45
  # Make a new context which delegates key lookup to `values`
142
46
  # @param query [GraphQL::Query] the query who owns this context
143
47
  # @param values [Hash] A hash of arbitrary values which will be accessible at query-time
144
- def initialize(query:, schema: query.schema, values:, object:)
48
+ def initialize(query:, schema: query.schema, values:)
145
49
  @query = query
146
50
  @schema = schema
147
51
  @provided_values = values || {}
148
- @object = object
149
52
  # Namespaced storage, where user-provided values are in `nil` namespace:
150
53
  @storage = Hash.new { |h, k| h[k] = {} }
151
54
  @storage[nil] = @provided_values
152
55
  @errors = []
153
56
  @path = []
154
57
  @value = nil
155
- @context = self # for SharedMethods
156
- @scoped_context = {}
58
+ @context = self # for SharedMethods TODO delete sharedmethods
59
+ @scoped_context = ScopedContext.new(self)
60
+ end
61
+
62
+ # @return [Hash] A hash that will be added verbatim to the result hash, as `"extensions" => { ... }`
63
+ def response_extensions
64
+ namespace(:__query_result_extensions__)
157
65
  end
158
66
 
159
67
  def dataloader
160
- @dataloader ||= query.multiplex ? query.multiplex.dataloader : schema.dataloader_class.new
68
+ @dataloader ||= self[:dataloader] || (query.multiplex ? query.multiplex.dataloader : schema.dataloader_class.new)
161
69
  end
162
70
 
163
71
  # @api private
@@ -167,21 +75,85 @@ module GraphQL
167
75
  attr_writer :value
168
76
 
169
77
  # @api private
170
- attr_accessor :scoped_context
78
+ attr_reader :scoped_context
171
79
 
172
80
  def []=(key, value)
173
81
  @provided_values[key] = value
174
82
  end
175
83
 
176
- def_delegators :@query, :trace, :interpreter?
84
+ def_delegators :@query, :trace
177
85
 
86
+ def types
87
+ @types ||= @query.types
88
+ end
89
+
90
+ attr_writer :types
91
+
92
+ RUNTIME_METADATA_KEYS = Set.new([:current_object, :current_arguments, :current_field, :current_path])
178
93
  # @!method []=(key, value)
179
94
  # Reassign `key` to the hash passed to {Schema#execute} as `context:`
180
95
 
181
96
  # Lookup `key` from the hash passed to {Schema#execute} as `context:`
182
97
  def [](key)
183
- return @scoped_context[key] if @scoped_context.key?(key)
184
- @provided_values[key]
98
+ if @scoped_context.key?(key)
99
+ @scoped_context[key]
100
+ elsif @provided_values.key?(key)
101
+ @provided_values[key]
102
+ elsif RUNTIME_METADATA_KEYS.include?(key)
103
+ if key == :current_path
104
+ current_path
105
+ else
106
+ (current_runtime_state = Fiber[:__graphql_runtime_info]) &&
107
+ (query_runtime_state = current_runtime_state[@query]) &&
108
+ (query_runtime_state.public_send(key))
109
+ end
110
+ else
111
+ # not found
112
+ nil
113
+ end
114
+ end
115
+
116
+ # Return this value to tell the runtime
117
+ # to exclude this field from the response altogether
118
+ def skip
119
+ GraphQL::Execution::SKIP
120
+ end
121
+
122
+ # Add error at query-level.
123
+ # @param error [GraphQL::ExecutionError] an execution error
124
+ # @return [void]
125
+ def add_error(error)
126
+ if !error.is_a?(ExecutionError)
127
+ raise TypeError, "expected error to be a ExecutionError, but was #{error.class}"
128
+ end
129
+ errors << error
130
+ nil
131
+ end
132
+
133
+ # @example Print the GraphQL backtrace during field resolution
134
+ # puts ctx.backtrace
135
+ #
136
+ # @return [GraphQL::Backtrace] The backtrace for this point in query execution
137
+ def backtrace
138
+ GraphQL::Backtrace.new(self)
139
+ end
140
+
141
+ def execution_errors
142
+ @execution_errors ||= ExecutionErrors.new(self)
143
+ end
144
+
145
+ def current_path
146
+ current_runtime_state = Fiber[:__graphql_runtime_info]
147
+ query_runtime_state = current_runtime_state && current_runtime_state[@query]
148
+
149
+ path = query_runtime_state &&
150
+ (result = query_runtime_state.current_result) &&
151
+ (result.path)
152
+ if path && (rn = query_runtime_state.current_result_name)
153
+ path = path.dup
154
+ path.push(rn)
155
+ end
156
+ path
185
157
  end
186
158
 
187
159
  def delete(key)
@@ -195,8 +167,12 @@ module GraphQL
195
167
  UNSPECIFIED_FETCH_DEFAULT = Object.new
196
168
 
197
169
  def fetch(key, default = UNSPECIFIED_FETCH_DEFAULT)
198
- if @scoped_context.key?(key)
199
- @scoped_context[key]
170
+ if RUNTIME_METADATA_KEYS.include?(key)
171
+ (runtime = Fiber[:__graphql_runtime_info]) &&
172
+ (query_runtime_state = runtime[@query]) &&
173
+ (query_runtime_state.public_send(key))
174
+ elsif @scoped_context.key?(key)
175
+ scoped_context[key]
200
176
  elsif @provided_values.key?(key)
201
177
  @provided_values[key]
202
178
  elsif default != UNSPECIFIED_FETCH_DEFAULT
@@ -209,12 +185,30 @@ module GraphQL
209
185
  end
210
186
 
211
187
  def dig(key, *other_keys)
212
- @scoped_context.key?(key) ? @scoped_context.dig(key, *other_keys) : @provided_values.dig(key, *other_keys)
188
+ if RUNTIME_METADATA_KEYS.include?(key)
189
+ (current_runtime_state = Fiber[:__graphql_runtime_info]) &&
190
+ (query_runtime_state = current_runtime_state[@query]) &&
191
+ (obj = query_runtime_state.public_send(key)) &&
192
+ if other_keys.empty?
193
+ obj
194
+ else
195
+ obj.dig(*other_keys)
196
+ end
197
+ elsif @scoped_context.key?(key)
198
+ @scoped_context.dig(key, *other_keys)
199
+ else
200
+ @provided_values.dig(key, *other_keys)
201
+ end
213
202
  end
214
203
 
215
204
  def to_h
216
- @provided_values.merge(@scoped_context)
205
+ if (current_scoped_context = @scoped_context.merged_context)
206
+ @provided_values.merge(current_scoped_context)
207
+ else
208
+ @provided_values
209
+ end
217
210
  end
211
+
218
212
  alias :to_hash :to_h
219
213
 
220
214
  def key?(key)
@@ -223,28 +217,38 @@ module GraphQL
223
217
 
224
218
  # @return [GraphQL::Schema::Warden]
225
219
  def warden
226
- @warden ||= @query.warden
220
+ @warden ||= (@query && @query.warden)
227
221
  end
228
222
 
223
+ # @api private
224
+ attr_writer :warden
225
+
229
226
  # Get an isolated hash for `ns`. Doesn't affect user-provided storage.
230
227
  # @param ns [Object] a usage-specific namespace identifier
231
228
  # @return [Hash] namespaced storage
232
229
  def namespace(ns)
233
- @storage[ns]
230
+ if ns == :interpreter
231
+ self
232
+ else
233
+ @storage[ns]
234
+ end
234
235
  end
235
236
 
236
- def inspect
237
- "#<Query::Context ...>"
237
+ # @return [Boolean] true if this namespace was accessed before
238
+ def namespace?(ns)
239
+ @storage.key?(ns)
238
240
  end
239
241
 
240
- # @api private
241
- def received_null_child
242
- @invalid_null = true
243
- @value = nil
242
+ def logger
243
+ @query && @query.logger
244
+ end
245
+
246
+ def inspect
247
+ "#<Query::Context ...>"
244
248
  end
245
249
 
246
250
  def scoped_merge!(hash)
247
- @scoped_context = @scoped_context.merge(hash)
251
+ @scoped_context.merge!(hash)
248
252
  end
249
253
 
250
254
  def scoped_set!(key, value)
@@ -252,117 +256,37 @@ module GraphQL
252
256
  nil
253
257
  end
254
258
 
255
- class FieldResolutionContext
256
- include SharedMethods
257
- include Tracing::Traceable
258
- extend Forwardable
259
-
260
- attr_reader :irep_node, :field, :parent_type, :query, :schema, :parent, :key, :type
261
- alias :selection :irep_node
262
-
263
- def initialize(context, key, irep_node, parent, object)
264
- @context = context
265
- @key = key
266
- @parent = parent
267
- @object = object
268
- @irep_node = irep_node
269
- @field = irep_node.definition
270
- @parent_type = irep_node.owner_type
271
- @type = field.type
272
- # This is needed constantly, so set it ahead of time:
273
- @query = context.query
274
- @schema = context.schema
275
- @tracers = @query.tracers
276
- # This hack flag is required by ConnectionResolve
277
- @wrapped_connection = false
278
- @wrapped_object = false
279
- end
280
-
281
- # @api private
282
- attr_accessor :wrapped_connection, :wrapped_object
259
+ # Use this when you need to do a scoped set _inside_ a lazy-loaded (or batch-loaded)
260
+ # block of code.
261
+ #
262
+ # @example using scoped context inside a promise
263
+ # scoped_ctx = context.scoped
264
+ # SomeBatchLoader.load(...).then do |thing|
265
+ # # use a scoped_ctx which was created _before_ dataloading:
266
+ # scoped_ctx.set!(:thing, thing)
267
+ # end
268
+ # @return [Context::Scoped]
269
+ def scoped
270
+ Scoped.new(@scoped_context, current_path)
271
+ end
283
272
 
284
- def path
285
- @path ||= @parent.path.dup << @key
273
+ class Scoped
274
+ def initialize(scoped_context, path)
275
+ @path = path
276
+ @scoped_context = scoped_context
286
277
  end
287
278
 
288
- def_delegators :@context,
289
- :[], :[]=, :key?, :fetch, :to_h, :namespace, :dig,
290
- :spawn, :warden, :errors,
291
- :execution_strategy, :strategy, :interpreter?
292
-
293
- # @return [GraphQL::Language::Nodes::Field] The AST node for the currently-executing field
294
- def ast_node
295
- @irep_node.ast_node
279
+ def merge!(hash)
280
+ @scoped_context.merge!(hash, at: @path)
296
281
  end
297
282
 
298
- # Add error to current field resolution.
299
- # @param error [GraphQL::ExecutionError] an execution error
300
- # @return [void]
301
- def add_error(error)
302
- super
303
- error.ast_node ||= irep_node.ast_node
304
- error.path ||= path
283
+ def set!(key, value)
284
+ @scoped_context.merge!({ key => value }, at: @path)
305
285
  nil
306
286
  end
307
-
308
- def inspect
309
- "#<GraphQL Context @ #{irep_node.owner_type.name}.#{field.name}>"
310
- end
311
-
312
- # Set a new value for this field in the response.
313
- # It may be updated after resolving a {Lazy}.
314
- # If it is {Execute::PROPAGATE_NULL}, tell the owner to propagate null.
315
- # If it's {Execute::Execution::SKIP}, remove this field result from its parent
316
- # @param new_value [Any] The GraphQL-ready value
317
- # @api private
318
- def value=(new_value)
319
- case new_value
320
- when GraphQL::Execution::Execute::PROPAGATE_NULL, nil
321
- @invalid_null = true
322
- @value = nil
323
- if @type.kind.non_null?
324
- @parent.received_null_child
325
- end
326
- when GraphQL::Execution::Execute::SKIP
327
- @parent.skipped = true
328
- @parent.delete_child(self)
329
- else
330
- @value = new_value
331
- end
332
- end
333
-
334
- protected
335
-
336
- def received_null_child
337
- case @value
338
- when Hash
339
- self.value = GraphQL::Execution::Execute::PROPAGATE_NULL
340
- when Array
341
- if list_of_non_null_items?(@type)
342
- self.value = GraphQL::Execution::Execute::PROPAGATE_NULL
343
- end
344
- when nil
345
- # TODO This is a hack
346
- # It was already nulled out but it's getting reassigned
347
- else
348
- raise "Unexpected value for received_null_child (#{self.value.class}): #{value}"
349
- end
350
- end
351
-
352
- private
353
-
354
- def list_of_non_null_items?(type)
355
- case type
356
- when GraphQL::NonNullType
357
- # Unwrap [T]!
358
- list_of_non_null_items?(type.of_type)
359
- when GraphQL::ListType
360
- type.of_type.is_a?(GraphQL::NonNullType)
361
- else
362
- raise "Unexpected list_of_non_null_items check: #{type}"
363
- end
364
- end
365
287
  end
366
288
  end
367
289
  end
368
290
  end
291
+
292
+ require "graphql/query/context/scoped_context"
@@ -4,6 +4,12 @@ module GraphQL
4
4
  class InputValidationResult
5
5
  attr_accessor :problems
6
6
 
7
+ def self.from_problem(explanation, path = nil, extensions: nil, message: nil)
8
+ result = self.new
9
+ result.add_problem(explanation, path, extensions: extensions, message: message)
10
+ result
11
+ end
12
+
7
13
  def initialize(valid: true, problems: nil)
8
14
  @valid = valid
9
15
  @problems = problems
@@ -27,7 +33,7 @@ module GraphQL
27
33
  end
28
34
 
29
35
  def merge_result!(path, inner_result)
30
- return if inner_result.valid?
36
+ return if inner_result.nil? || inner_result.valid?
31
37
 
32
38
  if inner_result.problems
33
39
  inner_result.problems.each do |p|
@@ -38,6 +44,9 @@ module GraphQL
38
44
  # It could have been explicitly set on inner_result (if it had no problems)
39
45
  @valid = false
40
46
  end
47
+
48
+ VALID = self.new
49
+ VALID.freeze
41
50
  end
42
51
  end
43
52
  end
@@ -1,49 +1,32 @@
1
1
  # frozen_string_literal: true
2
+ require "graphql/query/context"
2
3
  module GraphQL
3
4
  class Query
4
5
  # This object can be `ctx` in places where there is no query
5
- class NullContext
6
- class NullWarden < GraphQL::Schema::Warden
7
- def visible?(t); true; end
8
- def visible_field?(t); true; end
9
- def visible_type?(t); true; end
10
- end
6
+ class NullContext < Context
7
+ include Singleton
11
8
 
12
9
  class NullQuery
13
- def with_error_handling
14
- yield
10
+ def after_lazy(value)
11
+ yield(value)
15
12
  end
16
13
  end
17
14
 
15
+ class NullSchema < GraphQL::Schema
16
+ end
17
+
18
+ extend Forwardable
19
+
18
20
  attr_reader :schema, :query, :warden, :dataloader
21
+ def_delegators GraphQL::EmptyObjects::EMPTY_HASH, :[], :fetch, :dig, :key?, :to_h
19
22
 
20
23
  def initialize
21
24
  @query = NullQuery.new
22
25
  @dataloader = GraphQL::Dataloader::NullDataloader.new
23
- @schema = GraphQL::Schema.new
24
- @warden = NullWarden.new(
25
- GraphQL::Filter.new,
26
- context: self,
27
- schema: @schema,
28
- )
29
- end
30
-
31
- def [](key); end
32
-
33
- def interpreter?
34
- false
35
- end
36
-
37
- class << self
38
- extend Forwardable
39
-
40
- def [](key); end
41
-
42
- def instance
43
- @instance = self.new
44
- end
45
-
46
- def_delegators :instance, :query, :schema, :warden, :interpreter?, :dataloader
26
+ @schema = NullSchema
27
+ @warden = Schema::Warden::NullWarden.new(context: self, schema: @schema)
28
+ @types = @warden.visibility_profile
29
+ freeze
47
30
  end
48
31
  end
49
32
  end
@@ -14,12 +14,10 @@ module GraphQL
14
14
  #
15
15
  # @api private
16
16
  class ValidationPipeline
17
- attr_reader :max_depth, :max_complexity
17
+ attr_reader :max_depth, :max_complexity, :validate_timeout_remaining
18
18
 
19
- def initialize(query:, validate:, parse_error:, operation_name_error:, max_depth:, max_complexity:)
19
+ def initialize(query:, parse_error:, operation_name_error:, max_depth:, max_complexity:)
20
20
  @validation_errors = []
21
- @internal_representation = nil
22
- @validate = validate
23
21
  @parse_error = parse_error
24
22
  @operation_name_error = operation_name_error
25
23
  @query = query
@@ -42,17 +40,15 @@ module GraphQL
42
40
  @validation_errors
43
41
  end
44
42
 
45
- # @return [Hash<String, nil => GraphQL::InternalRepresentation::Node] Operation name -> Irep node pairs
46
- def internal_representation
47
- ensure_has_validated
48
- @internal_representation
49
- end
50
-
51
43
  def analyzers
52
44
  ensure_has_validated
53
45
  @query_analyzers
54
46
  end
55
47
 
48
+ def has_validated?
49
+ @has_validated == true
50
+ end
51
+
56
52
  private
57
53
 
58
54
  # If the pipeline wasn't run yet, run it.
@@ -63,7 +59,7 @@ module GraphQL
63
59
 
64
60
  if @parse_error
65
61
  # This is kind of crazy: we push the parse error into `ctx`
66
- # in {DefaultParseError} so that users can _opt out_ by redefining that hook.
62
+ # in `def self.parse_error` by default so that users can _opt out_ by redefining that hook.
67
63
  # That means we can't _re-add_ the error here (otherwise we'd either
68
64
  # add it twice _or_ override the user's choice to not add it).
69
65
  # So we just have to know that it was invalid and go from there.
@@ -72,10 +68,10 @@ module GraphQL
72
68
  elsif @operation_name_error
73
69
  @validation_errors << @operation_name_error
74
70
  else
75
- validation_result = @schema.static_validator.validate(@query, validate: @validate, timeout: @schema.validate_timeout)
71
+ validator = @query.static_validator || @schema.static_validator
72
+ validation_result = validator.validate(@query, validate: @query.validate, timeout: @schema.validate_timeout, max_errors: @schema.validate_max_errors)
76
73
  @validation_errors.concat(validation_result[:errors])
77
- @internal_representation = validation_result[:irep]
78
-
74
+ @validate_timeout_remaining = validation_result[:remaining_timeout]
79
75
  if @validation_errors.empty?
80
76
  @validation_errors.concat(@query.variables.errors)
81
77
  end
@@ -100,35 +96,15 @@ module GraphQL
100
96
  def build_analyzers(schema, max_depth, max_complexity)
101
97
  qa = schema.query_analyzers.dup
102
98
 
103
- # Filter out the built in authorization analyzer.
104
- # It is deprecated and does not have an AST analyzer alternative.
105
- qa = qa.select do |analyzer|
106
- if analyzer == GraphQL::Authorization::Analyzer && schema.using_ast_analysis?
107
- raise "The Authorization analyzer is not supported with AST Analyzers"
108
- else
109
- true
110
- end
111
- end
112
-
113
99
  if max_depth || max_complexity
114
100
  # Depending on the analysis engine, we must use different analyzers
115
101
  # remove this once everything has switched over to AST analyzers
116
- if schema.using_ast_analysis?
117
- if max_depth
118
- qa << GraphQL::Analysis::AST::MaxQueryDepth
119
- end
120
- if max_complexity
121
- qa << GraphQL::Analysis::AST::MaxQueryComplexity
122
- end
123
- else
124
- if max_depth
125
- qa << GraphQL::Analysis::MaxQueryDepth.new(max_depth)
126
- end
127
- if max_complexity
128
- qa << GraphQL::Analysis::MaxQueryComplexity.new(max_complexity)
129
- end
102
+ if max_depth
103
+ qa << GraphQL::Analysis::MaxQueryDepth
104
+ end
105
+ if max_complexity
106
+ qa << GraphQL::Analysis::MaxQueryComplexity
130
107
  end
131
-
132
108
  qa
133
109
  else
134
110
  qa
@@ -4,13 +4,13 @@ module GraphQL
4
4
  class VariableValidationError < GraphQL::ExecutionError
5
5
  attr_accessor :value, :validation_result
6
6
 
7
- def initialize(variable_ast, type, value, validation_result)
7
+ def initialize(variable_ast, type, value, validation_result, msg: nil)
8
8
  @value = value
9
9
  @validation_result = validation_result
10
10
 
11
- msg = "Variable $#{variable_ast.name} of type #{type.to_type_signature} was provided invalid value"
11
+ msg ||= "Variable $#{variable_ast.name} of type #{type.to_type_signature} was provided invalid value"
12
12
 
13
- if problem_fields.any?
13
+ if !problem_fields.empty?
14
14
  msg += " for #{problem_fields.join(", ")}"
15
15
  end
16
16