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,71 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- # A non-null type modifies another type.
4
- #
5
- # Non-null types can be created with `!` (`InnerType!`)
6
- # or {BaseType#to_non_null_type} (`InnerType.to_non_null_type`)
7
- #
8
- # For return types, it says that the returned value will _always_ be present.
9
- #
10
- # @example A field which _always_ returns an error
11
- # field :items, !ItemType
12
- # # or
13
- # field :items, ItemType.to_non_null_type
14
- #
15
- # (If the application fails to return a value, {InvalidNullError} will be passed to {Schema#type_error}.)
16
- #
17
- # For input types, it says that the incoming value _must_ be provided by the query.
18
- #
19
- # @example A field which _requires_ a string input
20
- # field :newNames do
21
- # # ...
22
- # argument :values, !types.String
23
- # # or
24
- # argument :values, types.String.to_non_null_type
25
- # end
26
- #
27
- # (If a value isn't provided, {Query::VariableValidationError} will be raised).
28
- #
29
- # Given a non-null type, you can always get the underlying type with {#unwrap}.
30
- #
31
- class NonNullType < GraphQL::BaseType
32
- include GraphQL::BaseType::ModifiesAnotherType
33
- extend Forwardable
34
-
35
- attr_reader :of_type
36
- def initialize(of_type:)
37
- super()
38
- @of_type = of_type
39
- end
40
-
41
- def valid_input?(value, ctx)
42
- validate_input(value, ctx).valid?
43
- end
44
-
45
- def validate_input(value, ctx)
46
- if value.nil?
47
- result = GraphQL::Query::InputValidationResult.new
48
- result.add_problem("Expected value to not be null")
49
- result
50
- else
51
- of_type.validate_input(value, ctx)
52
- end
53
- end
54
-
55
- def_delegators :@of_type, :coerce_input, :coerce_result, :list?
56
-
57
- def kind
58
- GraphQL::TypeKinds::NON_NULL
59
- end
60
-
61
- def to_s
62
- "#{of_type.to_s}!"
63
- end
64
- alias_method :inspect, :to_s
65
- alias :to_type_signature :to_s
66
-
67
- def non_null?
68
- true
69
- end
70
- end
71
- end
@@ -1,130 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- # @api deprecated
4
- class ObjectType < GraphQL::BaseType
5
- extend Define::InstanceDefinable::DeprecatedDefine
6
-
7
- accepts_definitions :interfaces, :fields, :mutation, :relay_node_type, field: GraphQL::Define::AssignObjectField
8
- accepts_definitions implements: ->(type, *interfaces, inherit: false) { type.implements(interfaces, inherit: inherit) }
9
-
10
- attr_accessor :fields, :mutation, :relay_node_type
11
- ensure_defined(:fields, :mutation, :interfaces, :relay_node_type)
12
-
13
- # @!attribute fields
14
- # @return [Hash<String => GraphQL::Field>] Map String fieldnames to their {GraphQL::Field} implementations
15
-
16
- # @!attribute mutation
17
- # @return [GraphQL::Relay::Mutation, nil] The mutation this object type was derived from, if it is an auto-generated payload type.
18
-
19
- def initialize
20
- super
21
- @fields = {}
22
- @clean_inherited_fields = nil
23
- @structural_interface_type_memberships = []
24
- @inherited_interface_type_memberships = []
25
- end
26
-
27
- def initialize_copy(other)
28
- super
29
- @structural_interface_type_memberships = other.structural_interface_type_memberships.dup
30
- @inherited_interface_type_memberships = other.inherited_interface_type_memberships.dup
31
- @fields = other.fields.dup
32
- end
33
-
34
- # This method declares interfaces for this type AND inherits any field definitions
35
- # @param new_interfaces [Array<GraphQL::Interface>] interfaces that this type implements
36
- # @deprecated Use `implements` instead of `interfaces`.
37
- def interfaces=(new_interfaces)
38
- @structural_interface_type_memberships = []
39
- @inherited_interface_type_memberships = []
40
- @clean_inherited_fields = nil
41
- implements(new_interfaces, inherit: true)
42
- end
43
-
44
- def interfaces(ctx = GraphQL::Query::NullContext)
45
- ensure_defined
46
- visible_ifaces = []
47
- unfiltered = ctx == GraphQL::Query::NullContext
48
- [@structural_interface_type_memberships, @inherited_interface_type_memberships].each do |tms|
49
- tms.each do |type_membership|
50
- if unfiltered || type_membership.visible?(ctx)
51
- # if this is derived from a class-based object, we have to
52
- # get the `.graphql_definition` of the attached interface.
53
- visible_ifaces << GraphQL::BaseType.resolve_related_type(type_membership.abstract_type)
54
- end
55
- end
56
- end
57
-
58
- visible_ifaces
59
- end
60
-
61
- def kind
62
- GraphQL::TypeKinds::OBJECT
63
- end
64
-
65
- # This fields doesnt have instrumenation applied
66
- # @see [Schema#get_field] Get field with instrumentation
67
- # @return [GraphQL::Field] The field definition for `field_name` (may be inherited from interfaces)
68
- def get_field(field_name)
69
- fields[field_name] || interface_fields[field_name]
70
- end
71
-
72
- # These fields don't have instrumenation applied
73
- # @see [Schema#get_fields] Get fields with instrumentation
74
- # @return [Array<GraphQL::Field>] All fields, including ones inherited from interfaces
75
- def all_fields
76
- interface_fields.merge(self.fields).values
77
- end
78
-
79
- # Declare that this object implements this interface.
80
- # This declaration will be validated when the schema is defined.
81
- # @param interfaces [Array<GraphQL::Interface>] add a new interface that this type implements
82
- # @param inherits [Boolean] If true, copy the interfaces' field definitions to this type
83
- def implements(interfaces, inherit: false, **options)
84
- if !interfaces.is_a?(Array)
85
- raise ArgumentError, "`implements(interfaces)` must be an array, not #{interfaces.class} (#{interfaces})"
86
- end
87
- @clean_inherited_fields = nil
88
-
89
- type_memberships = inherit ? @inherited_interface_type_memberships : @structural_interface_type_memberships
90
- interfaces.each do |iface|
91
- iface = BaseType.resolve_related_type(iface)
92
- if iface.is_a?(GraphQL::InterfaceType)
93
- type_memberships << iface.type_membership_class.new(iface, self, **options)
94
- end
95
- end
96
- end
97
-
98
- def resolve_type_proc
99
- nil
100
- end
101
-
102
- attr_writer :structural_interface_type_memberships
103
-
104
- protected
105
-
106
- attr_reader :structural_interface_type_memberships, :inherited_interface_type_memberships
107
-
108
- private
109
-
110
- def normalize_interfaces(ifaces)
111
- ifaces.map { |i_type| GraphQL::BaseType.resolve_related_type(i_type) }
112
- end
113
-
114
- def interface_fields
115
- if @clean_inherited_fields
116
- @clean_inherited_fields
117
- else
118
- ensure_defined
119
- @clean_inherited_fields = {}
120
- @inherited_interface_type_memberships.each do |type_membership|
121
- iface = GraphQL::BaseType.resolve_related_type(type_membership.abstract_type)
122
- if iface.is_a?(GraphQL::InterfaceType)
123
- @clean_inherited_fields.merge!(iface.fields)
124
- end
125
- end
126
- @clean_inherited_fields
127
- end
128
- end
129
- end
130
- end
@@ -1,189 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- class Query
4
- # Read-only access to values, normalizing all keys to strings
5
- #
6
- # {Arguments} recursively wraps the input in {Arguments} instances.
7
- class Arguments
8
- extend Forwardable
9
- include GraphQL::Dig
10
-
11
- def self.construct_arguments_class(argument_owner)
12
- argument_definitions = argument_owner.arguments
13
- argument_owner.arguments_class = Class.new(self) do
14
- self.argument_owner = argument_owner
15
- self.argument_definitions = argument_definitions
16
-
17
- argument_definitions.each do |_arg_name, arg_definition|
18
- if arg_definition.method_access?
19
- expose_as = arg_definition.expose_as.to_s.freeze
20
- expose_as_underscored = GraphQL::Schema::Member::BuildType.underscore(expose_as).freeze
21
- method_names = [expose_as, expose_as_underscored].uniq
22
- method_names.each do |method_name|
23
- # Don't define a helper method if it would override something.
24
- if method_defined?(method_name)
25
- GraphQL::Deprecation.warn(
26
- "Unable to define a helper for argument with name '#{method_name}' "\
27
- "as this is a reserved name. Add `method_access: false` to stop this warning."
28
- )
29
- else
30
- define_method(method_name) do
31
- # Always use `expose_as` here, since #[] doesn't accept underscored names
32
- self[expose_as]
33
- end
34
- end
35
- end
36
- end
37
- end
38
- end
39
- end
40
-
41
- attr_reader :argument_values
42
-
43
- def initialize(values, context:, defaults_used:)
44
- @argument_values = values.inject({}) do |memo, (inner_key, inner_value)|
45
- arg_name = inner_key.to_s
46
- arg_defn = self.class.argument_definitions[arg_name] || raise("Not found #{arg_name} among #{self.class.argument_definitions.keys}")
47
- arg_default_used = defaults_used.include?(arg_name)
48
- arg_value = wrap_value(inner_value, arg_defn.type, context)
49
- string_key = arg_defn.expose_as
50
- memo[string_key] = ArgumentValue.new(string_key, arg_value, arg_defn, arg_default_used)
51
- memo
52
- end
53
- end
54
-
55
- # @param key [String, Symbol] name or index of value to access
56
- # @return [Object] the argument at that key
57
- def [](key)
58
- key_s = key.is_a?(String) ? key : key.to_s
59
- @argument_values.fetch(key_s, NULL_ARGUMENT_VALUE).value
60
- end
61
-
62
- # @param key [String, Symbol] name of value to access
63
- # @return [Boolean] true if the argument was present in this field
64
- def key?(key)
65
- key_s = key.is_a?(String) ? key : key.to_s
66
- @argument_values.key?(key_s)
67
- end
68
-
69
- # @param key [String, Symbol] name of value to access
70
- # @return [Boolean] true if the argument default was passed as the argument value to the resolver
71
- def default_used?(key)
72
- key_s = key.is_a?(String) ? key : key.to_s
73
- @argument_values.fetch(key_s, NULL_ARGUMENT_VALUE).default_used?
74
- end
75
-
76
- # Get the hash of all values, with stringified keys
77
- # @return [Hash] the stringified hash
78
- def to_h
79
- @to_h ||= begin
80
- h = {}
81
- each_value do |arg_value|
82
- arg_key = arg_value.definition.expose_as
83
- h[arg_key] = unwrap_value(arg_value.value)
84
- end
85
- h
86
- end
87
- end
88
-
89
- def_delegators :to_h, :keys, :values, :each
90
- def_delegators :@argument_values, :any?
91
-
92
- def prepare
93
- self
94
- end
95
-
96
- # Access each key, value and type for the arguments in this set.
97
- # @yield [argument_value] The {ArgumentValue} for each argument
98
- # @yieldparam argument_value [ArgumentValue]
99
- def each_value
100
- @argument_values.each_value do |argument_value|
101
- yield(argument_value)
102
- end
103
- end
104
-
105
- class << self
106
- attr_accessor :argument_definitions, :argument_owner
107
- end
108
-
109
- NoArguments = Class.new(self) do
110
- self.argument_definitions = []
111
- end
112
-
113
- NO_ARGS = NoArguments.new({}, context: nil, defaults_used: Set.new)
114
-
115
- # Convert this instance into valid Ruby keyword arguments
116
- # @return [{Symbol=>Object}]
117
- def to_kwargs
118
- ruby_kwargs = {}
119
-
120
- keys.each do |key|
121
- ruby_kwargs[Schema::Member::BuildType.underscore(key).to_sym] = self[key]
122
- end
123
-
124
- ruby_kwargs
125
- end
126
-
127
- alias :to_hash :to_kwargs
128
-
129
- private
130
-
131
- class ArgumentValue
132
- attr_reader :key, :value, :definition
133
- attr_writer :default_used
134
-
135
- def initialize(key, value, definition, default_used)
136
- @key = key
137
- @value = value
138
- @definition = definition
139
- @default_used = default_used
140
- end
141
-
142
- # @return [Boolean] true if the argument default was passed as the argument value to the resolver
143
- def default_used?
144
- @default_used
145
- end
146
- end
147
-
148
- NULL_ARGUMENT_VALUE = ArgumentValue.new(nil, nil, nil, nil)
149
-
150
- def wrap_value(value, arg_defn_type, context)
151
- if value.nil?
152
- nil
153
- else
154
- case arg_defn_type
155
- when GraphQL::ListType
156
- value.map { |item| wrap_value(item, arg_defn_type.of_type, context) }
157
- when GraphQL::NonNullType
158
- wrap_value(value, arg_defn_type.of_type, context)
159
- when GraphQL::InputObjectType
160
- if value.is_a?(Hash)
161
- result = arg_defn_type.arguments_class.new(value, context: context, defaults_used: Set.new)
162
- result.prepare
163
- else
164
- value
165
- end
166
- else
167
- value
168
- end
169
- end
170
- end
171
-
172
- def unwrap_value(value)
173
- case value
174
- when Array
175
- value.map { |item| unwrap_value(item) }
176
- when Hash
177
- value.inject({}) do |memo, (key, value)|
178
- memo[key] = unwrap_value(value)
179
- memo
180
- end
181
- when GraphQL::Query::Arguments, GraphQL::Schema::InputObject
182
- value.to_h
183
- else
184
- value
185
- end
186
- end
187
- end
188
- end
189
- end
@@ -1,24 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- class Query
4
- module ArgumentsCache
5
- # @return [Hash<InternalRepresentation::Node, GraphQL::Language::NodesDirectiveNode => Hash<GraphQL::Field, GraphQL::Directive => GraphQL::Query::Arguments>>]
6
- def self.build(query)
7
- Hash.new do |h1, irep_or_ast_node|
8
- h1[irep_or_ast_node] = Hash.new do |h2, definition|
9
- ast_node = irep_or_ast_node.is_a?(GraphQL::InternalRepresentation::Node) ? irep_or_ast_node.ast_node : irep_or_ast_node
10
- h2[definition] = if definition.arguments.empty?
11
- GraphQL::Query::Arguments::NO_ARGS
12
- else
13
- GraphQL::Query::LiteralInput.from_arguments(
14
- ast_node.arguments,
15
- definition,
16
- query.variables,
17
- )
18
- end
19
- end
20
- end
21
- end
22
- end
23
- end
24
- end
@@ -1,52 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- class Query
4
- class Executor
5
- class PropagateNull < StandardError; end
6
-
7
- # @return [GraphQL::Query] the query being executed
8
- attr_reader :query
9
-
10
- def initialize(query)
11
- @query = query
12
- end
13
-
14
- # Evaluate {operation_name} on {query}.
15
- # Handle {GraphQL::ExecutionError}s by putting them in the "errors" key.
16
- # @return [Hash] A GraphQL response, with either a "data" key or an "errors" key
17
- def result
18
- execute
19
- rescue GraphQL::ExecutionError => err
20
- query.context.errors << err
21
- {"errors" => [err.to_h]}
22
- end
23
-
24
- private
25
-
26
- def execute
27
- operation = query.selected_operation
28
- return {} if operation.nil?
29
-
30
- op_type = operation.operation_type
31
- root_type = query.root_type_for_operation(op_type)
32
- execution_strategy_class = query.schema.execution_strategy_for_operation(op_type)
33
- execution_strategy = execution_strategy_class.new
34
-
35
- query.context.execution_strategy = execution_strategy
36
- data_result = begin
37
- execution_strategy.execute(operation, root_type, query)
38
- rescue PropagateNull
39
- nil
40
- end
41
- result = { "data" => data_result }
42
- error_result = query.context.errors.map(&:to_h)
43
-
44
- if error_result.any?
45
- result["errors"] = error_result
46
- end
47
-
48
- result
49
- end
50
- end
51
- end
52
- end
@@ -1,136 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- class Query
4
- # Turn query string values into something useful for query execution
5
- class LiteralInput
6
- def self.coerce(type, ast_node, variables)
7
- case ast_node
8
- when nil
9
- nil
10
- when Language::Nodes::NullValue
11
- nil
12
- when Language::Nodes::VariableIdentifier
13
- variables[ast_node.name]
14
- else
15
- case type.kind.name
16
- when "SCALAR"
17
- # TODO smell
18
- # This gets used for plain values during subscriber.trigger
19
- if variables
20
- type.coerce_input(ast_node, variables.context)
21
- else
22
- type.coerce_isolated_input(ast_node)
23
- end
24
- when "ENUM"
25
- # TODO smell
26
- # This gets used for plain values sometimes
27
- v = ast_node.is_a?(GraphQL::Language::Nodes::Enum) ? ast_node.name : ast_node
28
- if variables
29
- type.coerce_input(v, variables.context)
30
- else
31
- type.coerce_isolated_input(v)
32
- end
33
- when "NON_NULL"
34
- LiteralInput.coerce(type.of_type, ast_node, variables)
35
- when "LIST"
36
- if ast_node.is_a?(Array)
37
- ast_node.map { |element_ast| LiteralInput.coerce(type.of_type, element_ast, variables) }
38
- else
39
- [LiteralInput.coerce(type.of_type, ast_node, variables)]
40
- end
41
- when "INPUT_OBJECT"
42
- # TODO smell: handling AST vs handling plain Ruby
43
- next_args = ast_node.is_a?(Hash) ? ast_node : ast_node.arguments
44
- from_arguments(next_args, type, variables)
45
- else
46
- raise "Invariant: unexpected type to coerce to: #{type}"
47
- end
48
- end
49
- end
50
-
51
- def self.from_arguments(ast_arguments, argument_owner, variables)
52
- context = variables ? variables.context : nil
53
- values_hash = {}
54
- defaults_used = Set.new
55
-
56
- indexed_arguments = case ast_arguments
57
- when Hash
58
- ast_arguments
59
- when Array
60
- ast_arguments.each_with_object({}) { |a, memo| memo[a.name] = a }
61
- else
62
- raise ArgumentError, "Unexpected ast_arguments: #{ast_arguments}"
63
- end
64
-
65
- argument_defns = argument_owner.arguments
66
- argument_defns.each do |arg_name, arg_defn|
67
- ast_arg = indexed_arguments[arg_name]
68
- # First, check the argument in the AST.
69
- # If the value is a variable,
70
- # only add a value if the variable is actually present.
71
- # Otherwise, coerce the value in the AST, prepare the value and add it.
72
- #
73
- # TODO: since indexed_arguments can come from a plain Ruby hash,
74
- # have to check for `false` or `nil` as hash values. This is getting smelly :S
75
- if indexed_arguments.key?(arg_name)
76
- arg_value = ast_arg.is_a?(GraphQL::Language::Nodes::Argument) ? ast_arg.value : ast_arg
77
-
78
- value_is_a_variable = arg_value.is_a?(GraphQL::Language::Nodes::VariableIdentifier)
79
-
80
- if (!value_is_a_variable || (value_is_a_variable && variables.key?(arg_value.name)))
81
-
82
- value = coerce(arg_defn.type, arg_value, variables)
83
- # Legacy `prepare` application
84
- if arg_defn.is_a?(GraphQL::Argument)
85
- value = arg_defn.prepare(value, context)
86
- end
87
-
88
- if value.is_a?(GraphQL::ExecutionError)
89
- value.ast_node = ast_arg
90
- raise value
91
- end
92
-
93
- values_hash[arg_name] = value
94
- end
95
- end
96
-
97
- # Then, the definition for a default value.
98
- # If the definition has a default value and
99
- # a value wasn't provided from the AST,
100
- # then add the default value.
101
- if arg_defn.default_value? && !values_hash.key?(arg_name)
102
- value = arg_defn.default_value
103
- defaults_used << arg_name
104
- # `context` isn't present when pre-calculating defaults
105
- if context
106
- if arg_defn.is_a?(GraphQL::Argument)
107
- value = arg_defn.prepare(value, context)
108
- end
109
- if value.is_a?(GraphQL::ExecutionError)
110
- value.ast_node = ast_arg
111
- raise value
112
- end
113
- end
114
- values_hash[arg_name] = value
115
- end
116
- end
117
-
118
- if argument_owner.is_a?(Class) || argument_owner.is_a?(GraphQL::Schema::Field)
119
- # A Schema::InputObject, Schema::GraphQL::Field, Schema::Directive, logic from Query::Arguments#to_kwargs
120
- ruby_kwargs = {}
121
- values_hash.each do |key, value|
122
- ruby_kwargs[Schema::Member::BuildType.underscore(key).to_sym] = value
123
- end
124
- if argument_owner.is_a?(Class) && argument_owner < GraphQL::Schema::InputObject
125
- argument_owner.new(ruby_kwargs: ruby_kwargs, context: context, defaults_used: defaults_used)
126
- else
127
- ruby_kwargs
128
- end
129
- else
130
- result = argument_owner.arguments_class.new(values_hash, context: context, defaults_used: defaults_used)
131
- result.prepare
132
- end
133
- end
134
- end
135
- end
136
- end
@@ -1,92 +0,0 @@
1
- # frozen_string_literal: true
2
- module GraphQL
3
- class Query
4
- class SerialExecution
5
- class FieldResolution
6
- attr_reader :irep_node, :parent_type, :target, :field, :arguments, :query
7
-
8
- def initialize(selection, parent_type, target, query_ctx)
9
- @irep_node = selection
10
- @selection = selection
11
- @parent_type = parent_type
12
- @target = target
13
- @query = query_ctx.query
14
- @field = irep_node.definition
15
- @field_ctx = query_ctx.spawn_child(
16
- key: irep_node.name,
17
- object: target,
18
- irep_node: irep_node,
19
- )
20
- @arguments = @query.arguments_for(irep_node, @field)
21
- end
22
-
23
- def result
24
- result_name = irep_node.name
25
- raw_value = get_raw_value
26
- if raw_value.is_a?(GraphQL::Execution::Execute::Skip)
27
- {}
28
- else
29
- { result_name => get_finished_value(raw_value) }
30
- end
31
- end
32
-
33
- # GraphQL::Batch depends on this
34
- def execution_context
35
- @field_ctx
36
- end
37
-
38
- private
39
-
40
- # After getting the value from the field's resolve method,
41
- # continue by "finishing" the value, eg. executing sub-fields or coercing values
42
- def get_finished_value(raw_value)
43
- case raw_value
44
- when GraphQL::ExecutionError
45
- raw_value.ast_node = @field_ctx.ast_node
46
- raw_value.path = @field_ctx.path
47
- @query.context.errors.push(raw_value)
48
- when Array
49
- list_errors = raw_value.each_with_index.select { |value, _| value.is_a?(GraphQL::ExecutionError) }
50
- if list_errors.any?
51
- list_errors.each do |error, index|
52
- error.ast_node = @field_ctx.ast_node
53
- error.path = @field_ctx.path + [index]
54
- @query.context.errors.push(error)
55
- end
56
- end
57
- end
58
-
59
- begin
60
- GraphQL::Query::SerialExecution::ValueResolution.resolve(
61
- parent_type,
62
- field,
63
- field.type,
64
- raw_value,
65
- @selection,
66
- @field_ctx,
67
- )
68
- rescue GraphQL::Query::Executor::PropagateNull
69
- if field.type.kind.non_null?
70
- raise
71
- else
72
- nil
73
- end
74
- end
75
- end
76
-
77
- # Get the result of:
78
- # - Any middleware on this schema
79
- # - The field's resolve method
80
- # If the middleware chain returns a GraphQL::ExecutionError, its message
81
- # is added to the "errors" key.
82
- def get_raw_value
83
- begin
84
- @field_ctx.schema.middleware.invoke([parent_type, target, field, arguments, @field_ctx])
85
- rescue GraphQL::ExecutionError => err
86
- err
87
- end
88
- end
89
- end
90
- end
91
- end
92
- end