graphql 1.12.12 → 2.2.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.

Potentially problematic release.


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

Files changed (392) 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 +14 -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 +6 -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 +19 -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/ast/analyzer.rb +7 -0
  48. data/lib/graphql/analysis/ast/field_usage.rb +55 -1
  49. data/lib/graphql/analysis/ast/max_query_complexity.rb +0 -1
  50. data/lib/graphql/analysis/ast/query_complexity.rb +88 -140
  51. data/lib/graphql/analysis/ast/query_depth.rb +7 -3
  52. data/lib/graphql/analysis/ast/visitor.rb +50 -42
  53. data/lib/graphql/analysis/ast.rb +26 -23
  54. data/lib/graphql/analysis.rb +0 -7
  55. data/lib/graphql/backtrace/table.rb +4 -22
  56. data/lib/graphql/backtrace/trace.rb +93 -0
  57. data/lib/graphql/backtrace/tracer.rb +8 -6
  58. data/lib/graphql/backtrace.rb +3 -8
  59. data/lib/graphql/coercion_error.rb +1 -9
  60. data/lib/graphql/dataloader/async_dataloader.rb +85 -0
  61. data/lib/graphql/dataloader/null_dataloader.rb +3 -1
  62. data/lib/graphql/dataloader/request.rb +5 -0
  63. data/lib/graphql/dataloader/source.rb +120 -31
  64. data/lib/graphql/dataloader.rb +168 -142
  65. data/lib/graphql/date_encoding_error.rb +16 -0
  66. data/lib/graphql/dig.rb +1 -1
  67. data/lib/graphql/duration_encoding_error.rb +16 -0
  68. data/lib/graphql/execution/errors.rb +12 -81
  69. data/lib/graphql/execution/interpreter/arguments.rb +2 -2
  70. data/lib/graphql/execution/interpreter/arguments_cache.rb +36 -34
  71. data/lib/graphql/execution/interpreter/resolve.rb +32 -2
  72. data/lib/graphql/execution/interpreter/runtime/graphql_result.rb +170 -0
  73. data/lib/graphql/execution/interpreter/runtime.rb +414 -341
  74. data/lib/graphql/execution/interpreter.rb +122 -80
  75. data/lib/graphql/execution/lazy.rb +11 -21
  76. data/lib/graphql/execution/lookahead.rb +125 -54
  77. data/lib/graphql/execution/multiplex.rb +4 -172
  78. data/lib/graphql/execution.rb +11 -4
  79. data/lib/graphql/integer_encoding_error.rb +18 -2
  80. data/lib/graphql/introspection/directive_location_enum.rb +2 -2
  81. data/lib/graphql/introspection/directive_type.rb +5 -3
  82. data/lib/graphql/introspection/dynamic_fields.rb +3 -8
  83. data/lib/graphql/introspection/entry_points.rb +11 -18
  84. data/lib/graphql/introspection/enum_value_type.rb +2 -2
  85. data/lib/graphql/introspection/field_type.rb +3 -3
  86. data/lib/graphql/introspection/input_value_type.rb +10 -4
  87. data/lib/graphql/introspection/schema_type.rb +12 -5
  88. data/lib/graphql/introspection/type_type.rb +25 -12
  89. data/lib/graphql/introspection.rb +6 -2
  90. data/lib/graphql/language/block_string.rb +37 -25
  91. data/lib/graphql/language/definition_slice.rb +1 -1
  92. data/lib/graphql/language/document_from_schema_definition.rb +78 -65
  93. data/lib/graphql/language/lexer.rb +345 -1467
  94. data/lib/graphql/language/nodes.rb +145 -91
  95. data/lib/graphql/language/parser.rb +701 -1921
  96. data/lib/graphql/language/printer.rb +351 -155
  97. data/lib/graphql/language/sanitized_printer.rb +25 -27
  98. data/lib/graphql/language/static_visitor.rb +167 -0
  99. data/lib/graphql/language/token.rb +0 -4
  100. data/lib/graphql/language/visitor.rb +188 -141
  101. data/lib/graphql/language.rb +1 -0
  102. data/lib/graphql/load_application_object_failed_error.rb +5 -1
  103. data/lib/graphql/name_validator.rb +0 -4
  104. data/lib/graphql/pagination/active_record_relation_connection.rb +37 -8
  105. data/lib/graphql/pagination/array_connection.rb +8 -6
  106. data/lib/graphql/pagination/connection.rb +61 -7
  107. data/lib/graphql/pagination/connections.rb +22 -23
  108. data/lib/graphql/pagination/mongoid_relation_connection.rb +1 -2
  109. data/lib/graphql/pagination/relation_connection.rb +60 -28
  110. data/lib/graphql/query/context/scoped_context.rb +101 -0
  111. data/lib/graphql/query/context.rb +109 -189
  112. data/lib/graphql/query/input_validation_result.rb +10 -1
  113. data/lib/graphql/query/null_context.rb +14 -29
  114. data/lib/graphql/query/validation_pipeline.rb +15 -39
  115. data/lib/graphql/query/variable_validation_error.rb +2 -2
  116. data/lib/graphql/query/variables.rb +35 -17
  117. data/lib/graphql/query.rb +78 -65
  118. data/lib/graphql/railtie.rb +8 -109
  119. data/lib/graphql/rake_task/validate.rb +1 -1
  120. data/lib/graphql/rake_task.rb +30 -11
  121. data/lib/graphql/relay/range_add.rb +9 -16
  122. data/lib/graphql/relay.rb +0 -15
  123. data/lib/graphql/rubocop/graphql/base_cop.rb +36 -0
  124. data/lib/graphql/rubocop/graphql/default_null_true.rb +43 -0
  125. data/lib/graphql/rubocop/graphql/default_required_true.rb +43 -0
  126. data/lib/graphql/rubocop.rb +4 -0
  127. data/lib/graphql/schema/addition.rb +78 -45
  128. data/lib/graphql/schema/always_visible.rb +10 -0
  129. data/lib/graphql/schema/argument.rb +134 -80
  130. data/lib/graphql/schema/base_64_encoder.rb +3 -5
  131. data/lib/graphql/schema/build_from_definition.rb +60 -38
  132. data/lib/graphql/schema/directive/feature.rb +1 -1
  133. data/lib/graphql/schema/directive/flagged.rb +2 -2
  134. data/lib/graphql/schema/directive/include.rb +1 -1
  135. data/lib/graphql/schema/directive/one_of.rb +24 -0
  136. data/lib/graphql/schema/directive/skip.rb +1 -1
  137. data/lib/graphql/schema/directive/specified_by.rb +14 -0
  138. data/lib/graphql/schema/directive/transform.rb +2 -2
  139. data/lib/graphql/schema/directive.rb +33 -21
  140. data/lib/graphql/schema/enum.rb +93 -46
  141. data/lib/graphql/schema/enum_value.rb +4 -21
  142. data/lib/graphql/schema/field/connection_extension.rb +6 -16
  143. data/lib/graphql/schema/field/scope_extension.rb +8 -1
  144. data/lib/graphql/schema/field.rb +432 -337
  145. data/lib/graphql/schema/field_extension.rb +86 -2
  146. data/lib/graphql/schema/find_inherited_value.rb +3 -7
  147. data/lib/graphql/schema/finder.rb +5 -5
  148. data/lib/graphql/schema/has_single_input_argument.rb +156 -0
  149. data/lib/graphql/schema/input_object.rb +88 -90
  150. data/lib/graphql/schema/interface.rb +19 -59
  151. data/lib/graphql/schema/introspection_system.rb +6 -9
  152. data/lib/graphql/schema/late_bound_type.rb +8 -2
  153. data/lib/graphql/schema/list.rb +18 -7
  154. data/lib/graphql/schema/loader.rb +3 -3
  155. data/lib/graphql/schema/member/base_dsl_methods.rb +18 -19
  156. data/lib/graphql/schema/member/build_type.rb +16 -13
  157. data/lib/graphql/schema/member/has_arguments.rb +288 -84
  158. data/lib/graphql/schema/member/has_ast_node.rb +12 -0
  159. data/lib/graphql/schema/member/has_deprecation_reason.rb +3 -4
  160. data/lib/graphql/schema/member/has_directives.rb +81 -61
  161. data/lib/graphql/schema/member/has_fields.rb +149 -31
  162. data/lib/graphql/schema/member/has_interfaces.rb +143 -0
  163. data/lib/graphql/schema/member/has_validators.rb +32 -6
  164. data/lib/graphql/schema/member/relay_shortcuts.rb +47 -2
  165. data/lib/graphql/schema/member/scoped.rb +19 -0
  166. data/lib/graphql/schema/member/type_system_helpers.rb +17 -0
  167. data/lib/graphql/schema/member/validates_input.rb +6 -6
  168. data/lib/graphql/schema/member.rb +1 -6
  169. data/lib/graphql/schema/mutation.rb +0 -9
  170. data/lib/graphql/schema/non_null.rb +7 -7
  171. data/lib/graphql/schema/object.rb +30 -119
  172. data/lib/graphql/schema/printer.rb +23 -25
  173. data/lib/graphql/schema/relay_classic_mutation.rb +13 -90
  174. data/lib/graphql/schema/resolver/has_payload_type.rb +46 -11
  175. data/lib/graphql/schema/resolver.rb +101 -102
  176. data/lib/graphql/schema/scalar.rb +20 -21
  177. data/lib/graphql/schema/subscription.rb +45 -17
  178. data/lib/graphql/schema/timeout.rb +25 -29
  179. data/lib/graphql/schema/type_expression.rb +1 -1
  180. data/lib/graphql/schema/type_membership.rb +21 -4
  181. data/lib/graphql/schema/union.rb +15 -15
  182. data/lib/graphql/schema/unique_within_type.rb +1 -1
  183. data/lib/graphql/schema/validator/allow_blank_validator.rb +29 -0
  184. data/lib/graphql/schema/validator/allow_null_validator.rb +26 -0
  185. data/lib/graphql/schema/validator/exclusion_validator.rb +3 -1
  186. data/lib/graphql/schema/validator/format_validator.rb +4 -5
  187. data/lib/graphql/schema/validator/inclusion_validator.rb +3 -1
  188. data/lib/graphql/schema/validator/length_validator.rb +5 -3
  189. data/lib/graphql/schema/validator/numericality_validator.rb +13 -2
  190. data/lib/graphql/schema/validator/required_validator.rb +29 -15
  191. data/lib/graphql/schema/validator.rb +35 -27
  192. data/lib/graphql/schema/warden.rb +259 -132
  193. data/lib/graphql/schema/wrapper.rb +0 -5
  194. data/lib/graphql/schema.rb +658 -989
  195. data/lib/graphql/static_validation/all_rules.rb +3 -1
  196. data/lib/graphql/static_validation/base_visitor.rb +14 -28
  197. data/lib/graphql/static_validation/definition_dependencies.rb +7 -2
  198. data/lib/graphql/static_validation/error.rb +3 -1
  199. data/lib/graphql/static_validation/literal_validator.rb +21 -4
  200. data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +1 -1
  201. data/lib/graphql/static_validation/rules/arguments_are_defined.rb +1 -1
  202. data/lib/graphql/static_validation/rules/directives_are_defined.rb +11 -5
  203. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +13 -13
  204. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +12 -4
  205. data/lib/graphql/static_validation/rules/fields_will_merge.rb +54 -28
  206. data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +25 -4
  207. data/lib/graphql/static_validation/rules/fragments_are_finite.rb +2 -2
  208. data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid.rb +66 -0
  209. data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid_error.rb +29 -0
  210. data/lib/graphql/static_validation/rules/query_root_exists.rb +17 -0
  211. data/lib/graphql/static_validation/rules/query_root_exists_error.rb +26 -0
  212. data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +5 -3
  213. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +4 -4
  214. data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +13 -7
  215. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +1 -1
  216. data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +13 -7
  217. data/lib/graphql/static_validation/validation_context.rb +16 -6
  218. data/lib/graphql/static_validation/validator.rb +11 -27
  219. data/lib/graphql/static_validation.rb +0 -3
  220. data/lib/graphql/string_encoding_error.rb +13 -3
  221. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +46 -9
  222. data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +38 -1
  223. data/lib/graphql/subscriptions/event.rb +75 -37
  224. data/lib/graphql/subscriptions/serialize.rb +25 -3
  225. data/lib/graphql/subscriptions.rb +59 -47
  226. data/lib/graphql/testing/helpers.rb +129 -0
  227. data/lib/graphql/testing.rb +2 -0
  228. data/lib/graphql/tracing/active_support_notifications_trace.rb +16 -0
  229. data/lib/graphql/tracing/active_support_notifications_tracing.rb +6 -20
  230. data/lib/graphql/tracing/appoptics_trace.rb +251 -0
  231. data/lib/graphql/tracing/appoptics_tracing.rb +2 -2
  232. data/lib/graphql/tracing/appsignal_trace.rb +77 -0
  233. data/lib/graphql/tracing/appsignal_tracing.rb +15 -0
  234. data/lib/graphql/tracing/data_dog_trace.rb +183 -0
  235. data/lib/graphql/tracing/data_dog_tracing.rb +25 -15
  236. data/lib/graphql/{execution/instrumentation.rb → tracing/legacy_hooks_trace.rb} +10 -28
  237. data/lib/graphql/tracing/legacy_trace.rb +69 -0
  238. data/lib/graphql/tracing/new_relic_trace.rb +75 -0
  239. data/lib/graphql/tracing/notifications_trace.rb +45 -0
  240. data/lib/graphql/tracing/notifications_tracing.rb +59 -0
  241. data/lib/graphql/tracing/platform_trace.rb +118 -0
  242. data/lib/graphql/tracing/platform_tracing.rb +46 -49
  243. data/lib/graphql/tracing/{prometheus_tracing → prometheus_trace}/graphql_collector.rb +4 -2
  244. data/lib/graphql/tracing/prometheus_trace.rb +89 -0
  245. data/lib/graphql/tracing/prometheus_tracing.rb +3 -3
  246. data/lib/graphql/tracing/scout_trace.rb +72 -0
  247. data/lib/graphql/tracing/sentry_trace.rb +112 -0
  248. data/lib/graphql/tracing/statsd_trace.rb +56 -0
  249. data/lib/graphql/tracing/trace.rb +76 -0
  250. data/lib/graphql/tracing.rb +20 -41
  251. data/lib/graphql/type_kinds.rb +6 -3
  252. data/lib/graphql/types/big_int.rb +5 -1
  253. data/lib/graphql/types/int.rb +1 -1
  254. data/lib/graphql/types/iso_8601_date.rb +17 -6
  255. data/lib/graphql/types/iso_8601_date_time.rb +12 -1
  256. data/lib/graphql/types/iso_8601_duration.rb +77 -0
  257. data/lib/graphql/types/relay/base_connection.rb +16 -6
  258. data/lib/graphql/types/relay/connection_behaviors.rb +82 -32
  259. data/lib/graphql/types/relay/edge_behaviors.rb +36 -7
  260. data/lib/graphql/types/relay/has_node_field.rb +2 -2
  261. data/lib/graphql/types/relay/has_nodes_field.rb +2 -2
  262. data/lib/graphql/types/relay/node_behaviors.rb +12 -2
  263. data/lib/graphql/types/relay/page_info_behaviors.rb +7 -2
  264. data/lib/graphql/types/relay.rb +0 -3
  265. data/lib/graphql/types/string.rb +2 -2
  266. data/lib/graphql/types.rb +1 -0
  267. data/lib/graphql/unauthorized_error.rb +1 -1
  268. data/lib/graphql/version.rb +1 -1
  269. data/lib/graphql.rb +33 -95
  270. data/readme.md +13 -6
  271. metadata +102 -185
  272. data/lib/graphql/analysis/analyze_query.rb +0 -98
  273. data/lib/graphql/analysis/field_usage.rb +0 -45
  274. data/lib/graphql/analysis/max_query_complexity.rb +0 -26
  275. data/lib/graphql/analysis/max_query_depth.rb +0 -26
  276. data/lib/graphql/analysis/query_complexity.rb +0 -88
  277. data/lib/graphql/analysis/query_depth.rb +0 -43
  278. data/lib/graphql/analysis/reducer_state.rb +0 -48
  279. data/lib/graphql/argument.rb +0 -131
  280. data/lib/graphql/authorization.rb +0 -82
  281. data/lib/graphql/backtrace/legacy_tracer.rb +0 -56
  282. data/lib/graphql/backwards_compatibility.rb +0 -61
  283. data/lib/graphql/base_type.rb +0 -230
  284. data/lib/graphql/boolean_type.rb +0 -2
  285. data/lib/graphql/compatibility/execution_specification/counter_schema.rb +0 -53
  286. data/lib/graphql/compatibility/execution_specification/specification_schema.rb +0 -200
  287. data/lib/graphql/compatibility/execution_specification.rb +0 -436
  288. data/lib/graphql/compatibility/lazy_execution_specification/lazy_schema.rb +0 -111
  289. data/lib/graphql/compatibility/lazy_execution_specification.rb +0 -215
  290. data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +0 -87
  291. data/lib/graphql/compatibility/query_parser_specification/query_assertions.rb +0 -79
  292. data/lib/graphql/compatibility/query_parser_specification.rb +0 -266
  293. data/lib/graphql/compatibility/schema_parser_specification.rb +0 -682
  294. data/lib/graphql/compatibility.rb +0 -5
  295. data/lib/graphql/define/assign_argument.rb +0 -12
  296. data/lib/graphql/define/assign_connection.rb +0 -13
  297. data/lib/graphql/define/assign_enum_value.rb +0 -18
  298. data/lib/graphql/define/assign_global_id_field.rb +0 -11
  299. data/lib/graphql/define/assign_mutation_function.rb +0 -34
  300. data/lib/graphql/define/assign_object_field.rb +0 -42
  301. data/lib/graphql/define/defined_object_proxy.rb +0 -53
  302. data/lib/graphql/define/instance_definable.rb +0 -240
  303. data/lib/graphql/define/no_definition_error.rb +0 -7
  304. data/lib/graphql/define/non_null_with_bang.rb +0 -16
  305. data/lib/graphql/define/type_definer.rb +0 -31
  306. data/lib/graphql/define.rb +0 -31
  307. data/lib/graphql/deprecated_dsl.rb +0 -47
  308. data/lib/graphql/deprecation.rb +0 -13
  309. data/lib/graphql/directive/deprecated_directive.rb +0 -2
  310. data/lib/graphql/directive/include_directive.rb +0 -2
  311. data/lib/graphql/directive/skip_directive.rb +0 -2
  312. data/lib/graphql/directive.rb +0 -111
  313. data/lib/graphql/enum_type.rb +0 -129
  314. data/lib/graphql/execution/execute.rb +0 -333
  315. data/lib/graphql/execution/flatten.rb +0 -40
  316. data/lib/graphql/execution/lazy/resolve.rb +0 -91
  317. data/lib/graphql/execution/typecast.rb +0 -50
  318. data/lib/graphql/field/resolve.rb +0 -59
  319. data/lib/graphql/field.rb +0 -226
  320. data/lib/graphql/filter.rb +0 -53
  321. data/lib/graphql/float_type.rb +0 -2
  322. data/lib/graphql/function.rb +0 -128
  323. data/lib/graphql/id_type.rb +0 -2
  324. data/lib/graphql/input_object_type.rb +0 -138
  325. data/lib/graphql/int_type.rb +0 -2
  326. data/lib/graphql/interface_type.rb +0 -72
  327. data/lib/graphql/internal_representation/document.rb +0 -27
  328. data/lib/graphql/internal_representation/node.rb +0 -206
  329. data/lib/graphql/internal_representation/print.rb +0 -51
  330. data/lib/graphql/internal_representation/rewrite.rb +0 -184
  331. data/lib/graphql/internal_representation/scope.rb +0 -88
  332. data/lib/graphql/internal_representation/visit.rb +0 -36
  333. data/lib/graphql/internal_representation.rb +0 -7
  334. data/lib/graphql/language/lexer.rl +0 -262
  335. data/lib/graphql/language/parser.y +0 -543
  336. data/lib/graphql/list_type.rb +0 -80
  337. data/lib/graphql/non_null_type.rb +0 -71
  338. data/lib/graphql/object_type.rb +0 -130
  339. data/lib/graphql/query/arguments.rb +0 -189
  340. data/lib/graphql/query/arguments_cache.rb +0 -24
  341. data/lib/graphql/query/executor.rb +0 -52
  342. data/lib/graphql/query/literal_input.rb +0 -136
  343. data/lib/graphql/query/serial_execution/field_resolution.rb +0 -92
  344. data/lib/graphql/query/serial_execution/operation_resolution.rb +0 -19
  345. data/lib/graphql/query/serial_execution/selection_resolution.rb +0 -23
  346. data/lib/graphql/query/serial_execution/value_resolution.rb +0 -87
  347. data/lib/graphql/query/serial_execution.rb +0 -40
  348. data/lib/graphql/relay/array_connection.rb +0 -83
  349. data/lib/graphql/relay/base_connection.rb +0 -189
  350. data/lib/graphql/relay/connection_instrumentation.rb +0 -54
  351. data/lib/graphql/relay/connection_resolve.rb +0 -43
  352. data/lib/graphql/relay/connection_type.rb +0 -41
  353. data/lib/graphql/relay/edge.rb +0 -27
  354. data/lib/graphql/relay/edge_type.rb +0 -19
  355. data/lib/graphql/relay/edges_instrumentation.rb +0 -40
  356. data/lib/graphql/relay/global_id_resolve.rb +0 -18
  357. data/lib/graphql/relay/mongo_relation_connection.rb +0 -50
  358. data/lib/graphql/relay/mutation/instrumentation.rb +0 -23
  359. data/lib/graphql/relay/mutation/resolve.rb +0 -56
  360. data/lib/graphql/relay/mutation/result.rb +0 -38
  361. data/lib/graphql/relay/mutation.rb +0 -106
  362. data/lib/graphql/relay/node.rb +0 -39
  363. data/lib/graphql/relay/page_info.rb +0 -7
  364. data/lib/graphql/relay/relation_connection.rb +0 -188
  365. data/lib/graphql/relay/type_extensions.rb +0 -32
  366. data/lib/graphql/scalar_type.rb +0 -91
  367. data/lib/graphql/schema/base_64_bp.rb +0 -26
  368. data/lib/graphql/schema/catchall_middleware.rb +0 -35
  369. data/lib/graphql/schema/default_parse_error.rb +0 -10
  370. data/lib/graphql/schema/default_type_error.rb +0 -17
  371. data/lib/graphql/schema/member/accepts_definition.rb +0 -152
  372. data/lib/graphql/schema/member/cached_graphql_definition.rb +0 -31
  373. data/lib/graphql/schema/member/instrumentation.rb +0 -131
  374. data/lib/graphql/schema/middleware_chain.rb +0 -82
  375. data/lib/graphql/schema/possible_types.rb +0 -44
  376. data/lib/graphql/schema/rescue_middleware.rb +0 -60
  377. data/lib/graphql/schema/timeout_middleware.rb +0 -88
  378. data/lib/graphql/schema/traversal.rb +0 -228
  379. data/lib/graphql/schema/validation.rb +0 -313
  380. data/lib/graphql/static_validation/default_visitor.rb +0 -15
  381. data/lib/graphql/static_validation/no_validate_visitor.rb +0 -10
  382. data/lib/graphql/static_validation/type_stack.rb +0 -216
  383. data/lib/graphql/string_type.rb +0 -2
  384. data/lib/graphql/subscriptions/instrumentation.rb +0 -79
  385. data/lib/graphql/subscriptions/subscription_root.rb +0 -76
  386. data/lib/graphql/tracing/skylight_tracing.rb +0 -70
  387. data/lib/graphql/types/relay/default_relay.rb +0 -27
  388. data/lib/graphql/types/relay/node_field.rb +0 -25
  389. data/lib/graphql/types/relay/nodes_field.rb +0 -27
  390. data/lib/graphql/union_type.rb +0 -115
  391. data/lib/graphql/upgrader/member.rb +0 -937
  392. data/lib/graphql/upgrader/schema.rb +0 -38
@@ -1,111 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- # Directives are server-defined hooks for modifying execution.
4
- #
5
- # Two directives are included out-of-the-box:
6
- # - `@skip(if: ...)` Skips the tagged field if the value of `if` is true
7
- # - `@include(if: ...)` Includes the tagged field _only_ if `if` is true
8
- #
9
- class Directive
10
- include GraphQL::Define::InstanceDefinable
11
- accepts_definitions :locations, :name, :description, :arguments, :default_directive, argument: GraphQL::Define::AssignArgument
12
-
13
- attr_accessor :locations, :arguments, :name, :description, :arguments_class
14
- attr_accessor :ast_node
15
- # @api private
16
- attr_writer :default_directive
17
- ensure_defined(:locations, :arguments, :graphql_name, :name, :description, :default_directive?)
18
-
19
- # Future-compatible alias
20
- # @see {GraphQL::SchemaMember}
21
- alias :graphql_name :name
22
-
23
- # Future-compatible alias
24
- # @see {GraphQL::SchemaMember}
25
- alias :graphql_definition :itself
26
-
27
- LOCATIONS = [
28
- QUERY = :QUERY,
29
- MUTATION = :MUTATION,
30
- SUBSCRIPTION = :SUBSCRIPTION,
31
- FIELD = :FIELD,
32
- FRAGMENT_DEFINITION = :FRAGMENT_DEFINITION,
33
- FRAGMENT_SPREAD = :FRAGMENT_SPREAD,
34
- INLINE_FRAGMENT = :INLINE_FRAGMENT,
35
- SCHEMA = :SCHEMA,
36
- SCALAR = :SCALAR,
37
- OBJECT = :OBJECT,
38
- FIELD_DEFINITION = :FIELD_DEFINITION,
39
- ARGUMENT_DEFINITION = :ARGUMENT_DEFINITION,
40
- INTERFACE = :INTERFACE,
41
- UNION = :UNION,
42
- ENUM = :ENUM,
43
- ENUM_VALUE = :ENUM_VALUE,
44
- INPUT_OBJECT = :INPUT_OBJECT,
45
- INPUT_FIELD_DEFINITION = :INPUT_FIELD_DEFINITION,
46
- ]
47
-
48
- LOCATION_DESCRIPTIONS = {
49
- QUERY: 'Location adjacent to a query operation.',
50
- MUTATION: 'Location adjacent to a mutation operation.',
51
- SUBSCRIPTION: 'Location adjacent to a subscription operation.',
52
- FIELD: 'Location adjacent to a field.',
53
- FRAGMENT_DEFINITION: 'Location adjacent to a fragment definition.',
54
- FRAGMENT_SPREAD: 'Location adjacent to a fragment spread.',
55
- INLINE_FRAGMENT: 'Location adjacent to an inline fragment.',
56
- SCHEMA: 'Location adjacent to a schema definition.',
57
- SCALAR: 'Location adjacent to a scalar definition.',
58
- OBJECT: 'Location adjacent to an object type definition.',
59
- FIELD_DEFINITION: 'Location adjacent to a field definition.',
60
- ARGUMENT_DEFINITION: 'Location adjacent to an argument definition.',
61
- INTERFACE: 'Location adjacent to an interface definition.',
62
- UNION: 'Location adjacent to a union definition.',
63
- ENUM: 'Location adjacent to an enum definition.',
64
- ENUM_VALUE: 'Location adjacent to an enum value definition.',
65
- INPUT_OBJECT: 'Location adjacent to an input object type definition.',
66
- INPUT_FIELD_DEFINITION: 'Location adjacent to an input object field definition.',
67
- }
68
-
69
- def initialize
70
- @arguments = {}
71
- @default_directive = false
72
- end
73
-
74
- def to_s
75
- "<GraphQL::Directive #{name}>"
76
- end
77
-
78
- def on_field?
79
- locations.include?(FIELD)
80
- end
81
-
82
- def on_fragment?
83
- locations.include?(FRAGMENT_SPREAD) && locations.include?(INLINE_FRAGMENT)
84
- end
85
-
86
- def on_operation?
87
- locations.include?(QUERY) && locations.include?(MUTATION) && locations.include?(SUBSCRIPTION)
88
- end
89
-
90
- # @return [Boolean] Is this directive supplied by default? (eg `@skip`)
91
- def default_directive?
92
- @default_directive
93
- end
94
-
95
- def inspect
96
- "#<GraphQL::Directive #{name}>"
97
- end
98
-
99
- def type_class
100
- metadata[:type_class]
101
- end
102
-
103
- def get_argument(argument_name)
104
- arguments[argument_name]
105
- end
106
- end
107
- end
108
-
109
- require "graphql/directive/include_directive"
110
- require "graphql/directive/skip_directive"
111
- require "graphql/directive/deprecated_directive"
@@ -1,129 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- # @api deprecated
4
- class EnumType < GraphQL::BaseType
5
- extend Define::InstanceDefinable::DeprecatedDefine
6
-
7
- accepts_definitions :values, value: GraphQL::Define::AssignEnumValue
8
- ensure_defined(:values, :validate_non_null_input, :coerce_non_null_input, :coerce_result)
9
- attr_accessor :ast_node
10
-
11
- def initialize
12
- super
13
- @values_by_name = {}
14
- end
15
-
16
- def initialize_copy(other)
17
- super
18
- self.values = other.values.values
19
- end
20
-
21
- # @param new_values [Array<EnumValue>] The set of values contained in this type
22
- def values=(new_values)
23
- @values_by_name = {}
24
- new_values.each { |enum_value| add_value(enum_value) }
25
- end
26
-
27
- # @param enum_value [EnumValue] A value to add to this type's set of values
28
- def add_value(enum_value)
29
- if @values_by_name.key?(enum_value.name)
30
- raise "Enum value names must be unique. Value `#{enum_value.name}` already exists on Enum `#{name}`."
31
- end
32
-
33
- @values_by_name[enum_value.name] = enum_value
34
- end
35
-
36
- # @return [Hash<String => EnumValue>] `{name => value}` pairs contained in this type
37
- def values
38
- @values_by_name
39
- end
40
-
41
- def kind
42
- GraphQL::TypeKinds::ENUM
43
- end
44
-
45
- def coerce_result(value, ctx = nil)
46
- if ctx.nil?
47
- warn_deprecated_coerce("coerce_isolated_result")
48
- ctx = GraphQL::Query::NullContext
49
- end
50
-
51
- warden = ctx.warden
52
- all_values = warden ? warden.enum_values(self) : @values_by_name.each_value
53
- enum_value = all_values.find { |val| val.value == value }
54
- if enum_value
55
- enum_value.name
56
- else
57
- raise(UnresolvedValueError, "Can't resolve enum #{name} for #{value.inspect}")
58
- end
59
- end
60
-
61
- def to_s
62
- name
63
- end
64
-
65
- # A value within an {EnumType}
66
- #
67
- # Created with the `value` helper
68
- class EnumValue
69
- include GraphQL::Define::InstanceDefinable
70
- ATTRIBUTES = [:name, :description, :deprecation_reason, :value]
71
- accepts_definitions(*ATTRIBUTES)
72
- attr_accessor(*ATTRIBUTES)
73
- attr_accessor :ast_node
74
- ensure_defined(*ATTRIBUTES)
75
-
76
- undef name=
77
- def name=(new_name)
78
- # Validate that the name is correct
79
- GraphQL::NameValidator.validate!(new_name)
80
- @name = new_name
81
- end
82
-
83
- def graphql_name
84
- name
85
- end
86
-
87
- def type_class
88
- metadata[:type_class]
89
- end
90
- end
91
-
92
- class UnresolvedValueError < GraphQL::Error
93
- end
94
-
95
- private
96
-
97
- # Get the underlying value for this enum value
98
- #
99
- # @example get episode value from Enum
100
- # episode = EpisodeEnum.coerce("NEWHOPE")
101
- # episode # => 6
102
- #
103
- # @param value_name [String] the string representation of this enum value
104
- # @return [Object] the underlying value for this enum value
105
- def coerce_non_null_input(value_name, ctx)
106
- if @values_by_name.key?(value_name)
107
- @values_by_name.fetch(value_name).value
108
- elsif match_by_value = @values_by_name.find { |k, v| v.value == value_name }
109
- # this is for matching default values, which are "inputs", but they're
110
- # the Ruby value, not the GraphQL string.
111
- match_by_value[1].value
112
- else
113
- nil
114
- end
115
- end
116
-
117
- def validate_non_null_input(value_name, ctx)
118
- result = GraphQL::Query::InputValidationResult.new
119
- allowed_values = ctx.warden.enum_values(self)
120
- matching_value = allowed_values.find { |v| v.name == value_name }
121
-
122
- if matching_value.nil?
123
- result.add_problem("Expected #{GraphQL::Language.serialize(value_name)} to be one of: #{allowed_values.map(&:name).join(', ')}")
124
- end
125
-
126
- result
127
- end
128
- end
129
- end
@@ -1,333 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- module Execution
4
- # A valid execution strategy
5
- # @api private
6
- class Execute
7
-
8
- # @api private
9
- class Skip < GraphQL::Error; end
10
-
11
- # Just a singleton for implementing {Query::Context#skip}
12
- # @api private
13
- SKIP = Skip.new
14
-
15
- # @api private
16
- class PropagateNull
17
- end
18
- # @api private
19
- PROPAGATE_NULL = PropagateNull.new
20
-
21
- def self.use(schema_class)
22
- schema_class.query_execution_strategy(self)
23
- schema_class.mutation_execution_strategy(self)
24
- schema_class.subscription_execution_strategy(self)
25
- end
26
-
27
- def execute(ast_operation, root_type, query)
28
- GraphQL::Deprecation.warn "#{self.class} will be removed in GraphQL-Ruby 2.0, please upgrade to the Interpreter: https://graphql-ruby.org/queries/interpreter.html"
29
- result = resolve_root_selection(query)
30
- lazy_resolve_root_selection(result, **{query: query})
31
- GraphQL::Execution::Flatten.call(query.context)
32
- end
33
-
34
- def self.begin_multiplex(_multiplex)
35
- end
36
-
37
- def self.begin_query(query, _multiplex)
38
- ExecutionFunctions.resolve_root_selection(query)
39
- end
40
-
41
- def self.finish_multiplex(results, multiplex)
42
- ExecutionFunctions.lazy_resolve_root_selection(results, multiplex: multiplex)
43
- end
44
-
45
- def self.finish_query(query, _multiplex)
46
- {
47
- "data" => Execution::Flatten.call(query.context)
48
- }
49
- end
50
-
51
- # @api private
52
- module ExecutionFunctions
53
- module_function
54
-
55
- def resolve_root_selection(query)
56
- query.trace("execute_query", query: query) do
57
- operation = query.selected_operation
58
- op_type = operation.operation_type
59
- root_type = query.root_type_for_operation(op_type)
60
- if query.context[:__root_unauthorized]
61
- # This was set by member/instrumentation.rb so that we wouldn't continue.
62
- else
63
- resolve_selection(
64
- query.root_value,
65
- root_type,
66
- query.context,
67
- mutation: query.mutation?
68
- )
69
- end
70
- end
71
- end
72
-
73
- def lazy_resolve_root_selection(result, query: nil, multiplex: nil)
74
- if query.nil? && multiplex.queries.length == 1
75
- query = multiplex.queries[0]
76
- end
77
-
78
- tracer = (query || multiplex)
79
- tracer.trace("execute_query_lazy", {multiplex: multiplex, query: query}) do
80
- GraphQL::Execution::Lazy.resolve(result)
81
- end
82
- end
83
-
84
- def resolve_selection(object, current_type, current_ctx, mutation: false )
85
- # Assign this _before_ resolving the children
86
- # so that when a child propagates null, the selection result is
87
- # ready for it.
88
- current_ctx.value = {}
89
-
90
- selections_on_type = current_ctx.irep_node.typed_children[current_type]
91
-
92
- selections_on_type.each do |name, child_irep_node|
93
- field_ctx = current_ctx.spawn_child(
94
- key: name,
95
- object: object,
96
- irep_node: child_irep_node,
97
- )
98
-
99
- field_result = resolve_field(
100
- object,
101
- field_ctx
102
- )
103
-
104
- if field_result.is_a?(Skip)
105
- next
106
- end
107
-
108
- if mutation
109
- GraphQL::Execution::Lazy.resolve(field_ctx)
110
- end
111
-
112
-
113
- # If the last subselection caused a null to propagate to _this_ selection,
114
- # then we may as well quit executing fields because they
115
- # won't be in the response
116
- if current_ctx.invalid_null?
117
- break
118
- else
119
- current_ctx.value[name] = field_ctx
120
- end
121
- end
122
-
123
- current_ctx.value
124
- end
125
-
126
- def resolve_field(object, field_ctx)
127
- query = field_ctx.query
128
- irep_node = field_ctx.irep_node
129
- parent_type = irep_node.owner_type
130
- field = field_ctx.field
131
-
132
- raw_value = begin
133
- begin
134
- arguments = query.arguments_for(irep_node, field)
135
- field_ctx.trace("execute_field", { context: field_ctx }) do
136
- field_ctx.schema.middleware.invoke([parent_type, object, field, arguments, field_ctx])
137
- end
138
- rescue GraphQL::UnauthorizedFieldError => err
139
- err.field ||= field
140
- field_ctx.schema.unauthorized_field(err)
141
- rescue GraphQL::UnauthorizedError => err
142
- field_ctx.schema.unauthorized_object(err)
143
- end
144
- rescue GraphQL::ExecutionError => err
145
- err
146
- end
147
-
148
- if field_ctx.schema.lazy?(raw_value)
149
- field_ctx.value = Execution::Lazy.new {
150
- inner_value = field_ctx.trace("execute_field_lazy", {context: field_ctx}) {
151
- begin
152
- begin
153
- field_ctx.field.lazy_resolve(raw_value, arguments, field_ctx)
154
- rescue GraphQL::UnauthorizedError => err
155
- field_ctx.schema.unauthorized_object(err)
156
- end
157
- rescue GraphQL::ExecutionError => err
158
- err
159
- end
160
- }
161
- continue_or_wait(inner_value, field_ctx.type, field_ctx)
162
- }
163
- else
164
- continue_or_wait(raw_value, field_ctx.type, field_ctx)
165
- end
166
- end
167
-
168
- # If the returned object is lazy (unfinished),
169
- # assign the lazy object to `.value=` so we can resolve it later.
170
- # When we resolve it later, reassign it to `.value=` so that
171
- # the finished value replaces the unfinished one.
172
- #
173
- # If the returned object is finished, continue to coerce
174
- # and resolve child fields
175
- def continue_or_wait(raw_value, field_type, field_ctx)
176
- if field_ctx.schema.lazy?(raw_value)
177
- field_ctx.value = Execution::Lazy.new {
178
- inner_value = begin
179
- begin
180
- field_ctx.schema.sync_lazy(raw_value)
181
- rescue GraphQL::UnauthorizedError => err
182
- field_ctx.schema.unauthorized_object(err)
183
- end
184
- rescue GraphQL::ExecutionError => err
185
- err
186
- end
187
-
188
- field_ctx.value = continue_or_wait(inner_value, field_type, field_ctx)
189
- }
190
- else
191
- field_ctx.value = continue_resolve_field(raw_value, field_type, field_ctx)
192
- end
193
- end
194
-
195
- def continue_resolve_field(raw_value, field_type, field_ctx)
196
- if field_ctx.parent.invalid_null?
197
- return nil
198
- end
199
- query = field_ctx.query
200
-
201
- case raw_value
202
- when GraphQL::ExecutionError
203
- raw_value.ast_node ||= field_ctx.ast_node
204
- raw_value.path = field_ctx.path
205
- query.context.errors.push(raw_value)
206
- when Array
207
- if field_type.non_null?
208
- # List type errors are handled above, this is for the case of fields returning an array of errors
209
- list_errors = raw_value.each_with_index.select { |value, _| value.is_a?(GraphQL::ExecutionError) }
210
- if list_errors.any?
211
- list_errors.each do |error, index|
212
- error.ast_node = field_ctx.ast_node
213
- error.path = field_ctx.path + (field_ctx.type.list? ? [index] : [])
214
- query.context.errors.push(error)
215
- end
216
- end
217
- end
218
- end
219
-
220
- resolve_value(
221
- raw_value,
222
- field_type,
223
- field_ctx,
224
- )
225
- end
226
-
227
- def resolve_value(value, field_type, field_ctx)
228
- field_defn = field_ctx.field
229
-
230
- if value.nil?
231
- if field_type.kind.non_null?
232
- parent_type = field_ctx.irep_node.owner_type
233
- type_error = GraphQL::InvalidNullError.new(parent_type, field_defn, value)
234
- field_ctx.schema.type_error(type_error, field_ctx)
235
- PROPAGATE_NULL
236
- else
237
- nil
238
- end
239
- elsif value.is_a?(GraphQL::ExecutionError)
240
- if field_type.kind.non_null?
241
- PROPAGATE_NULL
242
- else
243
- nil
244
- end
245
- elsif value.is_a?(Array) && value.any? && value.all? {|v| v.is_a?(GraphQL::ExecutionError)}
246
- if field_type.kind.non_null?
247
- PROPAGATE_NULL
248
- else
249
- nil
250
- end
251
- elsif value.is_a?(Skip)
252
- field_ctx.value = value
253
- else
254
- case field_type.kind
255
- when GraphQL::TypeKinds::SCALAR, GraphQL::TypeKinds::ENUM
256
- field_type.coerce_result(value, field_ctx)
257
- when GraphQL::TypeKinds::LIST
258
- inner_type = field_type.of_type
259
- i = 0
260
- result = []
261
- field_ctx.value = result
262
-
263
- value.each do |inner_value|
264
- inner_ctx = field_ctx.spawn_child(
265
- key: i,
266
- object: inner_value,
267
- irep_node: field_ctx.irep_node,
268
- )
269
-
270
- inner_result = continue_or_wait(
271
- inner_value,
272
- inner_type,
273
- inner_ctx,
274
- )
275
-
276
- return PROPAGATE_NULL if inner_result == PROPAGATE_NULL
277
-
278
- result << inner_ctx
279
- i += 1
280
- end
281
-
282
- result
283
- when GraphQL::TypeKinds::NON_NULL
284
- inner_type = field_type.of_type
285
- resolve_value(
286
- value,
287
- inner_type,
288
- field_ctx,
289
- )
290
- when GraphQL::TypeKinds::OBJECT
291
- resolve_selection(
292
- value,
293
- field_type,
294
- field_ctx
295
- )
296
- when GraphQL::TypeKinds::UNION, GraphQL::TypeKinds::INTERFACE
297
- query = field_ctx.query
298
- resolved_type_or_lazy = field_type.resolve_type(value, field_ctx)
299
- query.schema.after_lazy(resolved_type_or_lazy) do |resolved_type|
300
- possible_types = query.possible_types(field_type)
301
-
302
- if !possible_types.include?(resolved_type)
303
- parent_type = field_ctx.irep_node.owner_type
304
- type_error = GraphQL::UnresolvedTypeError.new(value, field_defn, parent_type, resolved_type, possible_types)
305
- field_ctx.schema.type_error(type_error, field_ctx)
306
- PROPAGATE_NULL
307
- else
308
- resolve_value(
309
- value,
310
- resolved_type,
311
- field_ctx,
312
- )
313
- end
314
- end
315
- else
316
- raise("Unknown type kind: #{field_type.kind}")
317
- end
318
- end
319
- end
320
- end
321
-
322
- include ExecutionFunctions
323
-
324
- # A `.call`-able suitable to be the last step in a middleware chain
325
- module FieldResolveStep
326
- # Execute the field's resolve method
327
- def self.call(_parent_type, parent_object, field_definition, field_args, context, _next = nil)
328
- field_definition.resolve(parent_object, field_args, context)
329
- end
330
- end
331
- end
332
- end
333
- end
@@ -1,40 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- module Execution
4
- # Starting from a root context,
5
- # create a hash out of the context tree.
6
- # @api private
7
- module Flatten
8
- def self.call(ctx)
9
- flatten(ctx)
10
- end
11
-
12
- class << self
13
- private
14
-
15
- def flatten(obj)
16
- case obj
17
- when Hash
18
- flattened = {}
19
- obj.each do |key, val|
20
- flattened[key] = flatten(val)
21
- end
22
- flattened
23
- when Array
24
- obj.map { |v| flatten(v) }
25
- when Query::Context::SharedMethods
26
- if obj.invalid_null?
27
- nil
28
- elsif obj.skipped? && obj.value.empty?
29
- nil
30
- else
31
- flatten(obj.value)
32
- end
33
- else
34
- obj
35
- end
36
- end
37
- end
38
- end
39
- end
40
- end
@@ -1,91 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- module Execution
4
- class Lazy
5
- # Helpers for dealing with data structures containing {Lazy} instances
6
- # @api private
7
- module Resolve
8
- # Mutate `value`, replacing {Lazy} instances in place with their resolved values
9
- # @return [void]
10
-
11
- # This object can be passed like an array, but it doesn't allocate an
12
- # array until it's used.
13
- #
14
- # There's one crucial difference: you have to _capture_ the result
15
- # of `#<<`. (This _works_ with arrays but isn't required, since it has a side-effect.)
16
- # @api private
17
- module NullAccumulator
18
- def self.<<(item)
19
- [item]
20
- end
21
-
22
- def self.empty?
23
- true
24
- end
25
- end
26
-
27
- def self.resolve(value)
28
- lazies = resolve_in_place(value)
29
- deep_sync(lazies)
30
- end
31
-
32
- def self.resolve_in_place(value)
33
- acc = each_lazy(NullAccumulator, value)
34
-
35
- if acc.empty?
36
- Lazy::NullResult
37
- else
38
- Lazy.new {
39
- acc.each_with_index { |ctx, idx|
40
- acc[idx] = ctx.value.value
41
- }
42
- resolve_in_place(acc)
43
- }
44
- end
45
- end
46
-
47
- # If `value` is a collection,
48
- # add any {Lazy} instances in the collection
49
- # to `acc`
50
- # @return [void]
51
- def self.each_lazy(acc, value)
52
- case value
53
- when Hash
54
- value.each do |key, field_result|
55
- acc = each_lazy(acc, field_result)
56
- end
57
- when Array
58
- value.each do |field_result|
59
- acc = each_lazy(acc, field_result)
60
- end
61
- when Query::Context::SharedMethods
62
- field_value = value.value
63
- case field_value
64
- when Lazy
65
- acc = acc << value
66
- when Enumerable # shortcut for Hash & Array
67
- acc = each_lazy(acc, field_value)
68
- end
69
- end
70
-
71
- acc
72
- end
73
-
74
- # Traverse `val`, triggering resolution for each {Lazy}.
75
- # These {Lazy}s are expected to mutate their owner data structures
76
- # during resolution! (They're created with the `.then` calls in `resolve_in_place`).
77
- # @return [void]
78
- def self.deep_sync(val)
79
- case val
80
- when Lazy
81
- deep_sync(val.value)
82
- when Array
83
- val.each { |v| deep_sync(v.value) }
84
- when Hash
85
- val.each { |k, v| deep_sync(v.value) }
86
- end
87
- end
88
- end
89
- end
90
- end
91
- end