graphql 1.13.24 → 2.5.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (427) hide show
  1. checksums.yaml +4 -4
  2. data/lib/generators/graphql/install/mutation_root_generator.rb +2 -2
  3. data/lib/generators/graphql/install/templates/base_mutation.erb +2 -0
  4. data/lib/generators/graphql/install/templates/mutation_type.erb +2 -0
  5. data/lib/generators/graphql/install_generator.rb +50 -1
  6. data/lib/generators/graphql/mutation_delete_generator.rb +1 -1
  7. data/lib/generators/graphql/mutation_update_generator.rb +1 -1
  8. data/lib/generators/graphql/orm_mutations_base.rb +1 -1
  9. data/lib/generators/graphql/relay.rb +21 -18
  10. data/lib/generators/graphql/templates/base_argument.erb +2 -0
  11. data/lib/generators/graphql/templates/base_connection.erb +2 -0
  12. data/lib/generators/graphql/templates/base_edge.erb +2 -0
  13. data/lib/generators/graphql/templates/base_enum.erb +2 -0
  14. data/lib/generators/graphql/templates/base_field.erb +2 -0
  15. data/lib/generators/graphql/templates/base_input_object.erb +2 -0
  16. data/lib/generators/graphql/templates/base_interface.erb +2 -0
  17. data/lib/generators/graphql/templates/base_object.erb +2 -0
  18. data/lib/generators/graphql/templates/base_resolver.erb +8 -0
  19. data/lib/generators/graphql/templates/base_scalar.erb +2 -0
  20. data/lib/generators/graphql/templates/base_union.erb +2 -0
  21. data/lib/generators/graphql/templates/graphql_controller.erb +2 -0
  22. data/lib/generators/graphql/templates/loader.erb +2 -0
  23. data/lib/generators/graphql/templates/mutation.erb +2 -0
  24. data/lib/generators/graphql/templates/node_type.erb +2 -0
  25. data/lib/generators/graphql/templates/query_type.erb +2 -0
  26. data/lib/generators/graphql/templates/schema.erb +8 -0
  27. data/lib/generators/graphql/type_generator.rb +1 -1
  28. data/lib/graphql/analysis/analyzer.rb +90 -0
  29. data/lib/graphql/analysis/field_usage.rb +65 -28
  30. data/lib/graphql/analysis/max_query_complexity.rb +11 -17
  31. data/lib/graphql/analysis/max_query_depth.rb +13 -19
  32. data/lib/graphql/analysis/query_complexity.rb +236 -61
  33. data/lib/graphql/analysis/query_depth.rb +38 -23
  34. data/lib/graphql/analysis/visitor.rb +280 -0
  35. data/lib/graphql/analysis.rb +93 -6
  36. data/lib/graphql/autoload.rb +38 -0
  37. data/lib/graphql/backtrace/table.rb +118 -73
  38. data/lib/graphql/backtrace.rb +2 -25
  39. data/lib/graphql/coercion_error.rb +1 -9
  40. data/lib/graphql/current.rb +57 -0
  41. data/lib/graphql/dashboard/detailed_traces.rb +47 -0
  42. data/lib/graphql/dashboard/installable.rb +22 -0
  43. data/lib/graphql/dashboard/limiters.rb +93 -0
  44. data/lib/graphql/dashboard/operation_store.rb +199 -0
  45. data/lib/graphql/dashboard/statics/bootstrap-5.3.3.min.css +6 -0
  46. data/lib/graphql/dashboard/statics/bootstrap-5.3.3.min.js +7 -0
  47. data/lib/graphql/dashboard/statics/charts.min.css +1 -0
  48. data/lib/graphql/dashboard/statics/dashboard.css +30 -0
  49. data/lib/graphql/dashboard/statics/dashboard.js +143 -0
  50. data/lib/graphql/dashboard/statics/header-icon.png +0 -0
  51. data/lib/graphql/dashboard/statics/icon.png +0 -0
  52. data/lib/graphql/dashboard/subscriptions.rb +96 -0
  53. data/lib/graphql/dashboard/views/graphql/dashboard/detailed_traces/traces/index.html.erb +45 -0
  54. data/lib/graphql/dashboard/views/graphql/dashboard/landings/show.html.erb +18 -0
  55. data/lib/graphql/dashboard/views/graphql/dashboard/limiters/limiters/show.html.erb +62 -0
  56. data/lib/graphql/dashboard/views/graphql/dashboard/not_installed.html.erb +18 -0
  57. data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/clients/_form.html.erb +23 -0
  58. data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/clients/edit.html.erb +21 -0
  59. data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/clients/index.html.erb +69 -0
  60. data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/clients/new.html.erb +7 -0
  61. data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/index_entries/index.html.erb +39 -0
  62. data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/index_entries/show.html.erb +32 -0
  63. data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/operations/index.html.erb +81 -0
  64. data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/operations/show.html.erb +71 -0
  65. data/lib/graphql/dashboard/views/graphql/dashboard/subscriptions/subscriptions/show.html.erb +41 -0
  66. data/lib/graphql/dashboard/views/graphql/dashboard/subscriptions/topics/index.html.erb +55 -0
  67. data/lib/graphql/dashboard/views/graphql/dashboard/subscriptions/topics/show.html.erb +40 -0
  68. data/lib/graphql/dashboard/views/layouts/graphql/dashboard/application.html.erb +108 -0
  69. data/lib/graphql/dashboard.rb +158 -0
  70. data/lib/graphql/dataloader/active_record_association_source.rb +84 -0
  71. data/lib/graphql/dataloader/active_record_source.rb +47 -0
  72. data/lib/graphql/dataloader/async_dataloader.rb +101 -0
  73. data/lib/graphql/dataloader/null_dataloader.rb +11 -2
  74. data/lib/graphql/dataloader/request.rb +5 -0
  75. data/lib/graphql/dataloader/source.rb +103 -47
  76. data/lib/graphql/dataloader.rb +174 -148
  77. data/lib/graphql/dig.rb +3 -2
  78. data/lib/graphql/duration_encoding_error.rb +16 -0
  79. data/lib/graphql/execution/errors.rb +12 -82
  80. data/lib/graphql/execution/interpreter/argument_value.rb +5 -1
  81. data/lib/graphql/execution/interpreter/arguments.rb +1 -1
  82. data/lib/graphql/execution/interpreter/arguments_cache.rb +30 -35
  83. data/lib/graphql/execution/interpreter/resolve.rb +32 -2
  84. data/lib/graphql/execution/interpreter/runtime/graphql_result.rb +215 -0
  85. data/lib/graphql/execution/interpreter/runtime.rb +525 -502
  86. data/lib/graphql/execution/interpreter.rb +127 -81
  87. data/lib/graphql/execution/lazy.rb +7 -21
  88. data/lib/graphql/execution/lookahead.rb +133 -55
  89. data/lib/graphql/execution/multiplex.rb +6 -176
  90. data/lib/graphql/execution.rb +11 -4
  91. data/lib/graphql/introspection/directive_location_enum.rb +1 -1
  92. data/lib/graphql/introspection/directive_type.rb +1 -1
  93. data/lib/graphql/introspection/dynamic_fields.rb +3 -8
  94. data/lib/graphql/introspection/entry_points.rb +10 -17
  95. data/lib/graphql/introspection/field_type.rb +1 -1
  96. data/lib/graphql/introspection/schema_type.rb +8 -11
  97. data/lib/graphql/introspection/type_type.rb +13 -6
  98. data/lib/graphql/introspection.rb +4 -3
  99. data/lib/graphql/invalid_name_error.rb +1 -1
  100. data/lib/graphql/invalid_null_error.rb +20 -17
  101. data/lib/graphql/language/block_string.rb +34 -18
  102. data/lib/graphql/language/cache.rb +13 -0
  103. data/lib/graphql/language/comment.rb +18 -0
  104. data/lib/graphql/language/definition_slice.rb +1 -1
  105. data/lib/graphql/language/document_from_schema_definition.rb +114 -80
  106. data/lib/graphql/language/lexer.rb +375 -1489
  107. data/lib/graphql/language/nodes.rb +189 -104
  108. data/lib/graphql/language/parser.rb +807 -1941
  109. data/lib/graphql/language/printer.rb +366 -163
  110. data/lib/graphql/language/sanitized_printer.rb +21 -23
  111. data/lib/graphql/language/static_visitor.rb +171 -0
  112. data/lib/graphql/language/visitor.rb +189 -138
  113. data/lib/graphql/language.rb +62 -1
  114. data/lib/graphql/load_application_object_failed_error.rb +5 -1
  115. data/lib/graphql/pagination/active_record_relation_connection.rb +0 -8
  116. data/lib/graphql/pagination/array_connection.rb +8 -6
  117. data/lib/graphql/pagination/connection.rb +61 -7
  118. data/lib/graphql/pagination/connections.rb +3 -28
  119. data/lib/graphql/pagination/mongoid_relation_connection.rb +1 -2
  120. data/lib/graphql/pagination/relation_connection.rb +2 -0
  121. data/lib/graphql/query/context/scoped_context.rb +101 -0
  122. data/lib/graphql/query/context.rb +131 -225
  123. data/lib/graphql/query/input_validation_result.rb +1 -1
  124. data/lib/graphql/query/null_context.rb +11 -33
  125. data/lib/graphql/query/partial.rb +179 -0
  126. data/lib/graphql/query/validation_pipeline.rb +14 -37
  127. data/lib/graphql/query/variable_validation_error.rb +1 -1
  128. data/lib/graphql/query/variables.rb +6 -19
  129. data/lib/graphql/query.rb +162 -98
  130. data/lib/graphql/railtie.rb +15 -109
  131. data/lib/graphql/rake_task/validate.rb +1 -1
  132. data/lib/graphql/rake_task.rb +30 -11
  133. data/lib/graphql/relay/range_add.rb +9 -20
  134. data/lib/graphql/relay.rb +0 -15
  135. data/lib/graphql/rubocop/graphql/base_cop.rb +1 -1
  136. data/lib/graphql/rubocop/graphql/field_type_in_block.rb +144 -0
  137. data/lib/graphql/rubocop/graphql/root_types_in_block.rb +38 -0
  138. data/lib/graphql/rubocop.rb +2 -0
  139. data/lib/graphql/schema/addition.rb +70 -33
  140. data/lib/graphql/schema/always_visible.rb +15 -0
  141. data/lib/graphql/schema/argument.rb +104 -59
  142. data/lib/graphql/schema/base_64_encoder.rb +3 -5
  143. data/lib/graphql/schema/build_from_definition.rb +154 -74
  144. data/lib/graphql/schema/directive/flagged.rb +4 -2
  145. data/lib/graphql/schema/directive/one_of.rb +24 -0
  146. data/lib/graphql/schema/directive/specified_by.rb +14 -0
  147. data/lib/graphql/schema/directive/transform.rb +1 -1
  148. data/lib/graphql/schema/directive.rb +47 -24
  149. data/lib/graphql/schema/enum.rb +137 -65
  150. data/lib/graphql/schema/enum_value.rb +11 -26
  151. data/lib/graphql/schema/field/connection_extension.rb +6 -16
  152. data/lib/graphql/schema/field/scope_extension.rb +8 -1
  153. data/lib/graphql/schema/field.rb +399 -404
  154. data/lib/graphql/schema/field_extension.rb +2 -5
  155. data/lib/graphql/schema/find_inherited_value.rb +2 -7
  156. data/lib/graphql/schema/has_single_input_argument.rb +160 -0
  157. data/lib/graphql/schema/input_object.rb +144 -99
  158. data/lib/graphql/schema/interface.rb +34 -51
  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 +3 -9
  162. data/lib/graphql/schema/loader.rb +4 -6
  163. data/lib/graphql/schema/member/base_dsl_methods.rb +32 -18
  164. data/lib/graphql/schema/member/build_type.rb +15 -9
  165. data/lib/graphql/schema/member/has_arguments.rb +192 -96
  166. data/lib/graphql/schema/member/has_ast_node.rb +12 -0
  167. data/lib/graphql/schema/member/has_dataloader.rb +62 -0
  168. data/lib/graphql/schema/member/has_deprecation_reason.rb +18 -4
  169. data/lib/graphql/schema/member/has_directives.rb +81 -61
  170. data/lib/graphql/schema/member/has_fields.rb +119 -39
  171. data/lib/graphql/schema/member/has_interfaces.rb +66 -23
  172. data/lib/graphql/schema/member/has_unresolved_type_error.rb +5 -1
  173. data/lib/graphql/schema/member/has_validators.rb +32 -6
  174. data/lib/graphql/schema/member/relay_shortcuts.rb +47 -2
  175. data/lib/graphql/schema/member/scoped.rb +19 -0
  176. data/lib/graphql/schema/member/type_system_helpers.rb +32 -2
  177. data/lib/graphql/schema/member/validates_input.rb +4 -4
  178. data/lib/graphql/schema/member.rb +1 -6
  179. data/lib/graphql/schema/mutation.rb +7 -9
  180. data/lib/graphql/schema/non_null.rb +1 -7
  181. data/lib/graphql/schema/object.rb +42 -49
  182. data/lib/graphql/schema/printer.rb +12 -8
  183. data/lib/graphql/schema/ractor_shareable.rb +79 -0
  184. data/lib/graphql/schema/relay_classic_mutation.rb +12 -124
  185. data/lib/graphql/schema/resolver/has_payload_type.rb +20 -10
  186. data/lib/graphql/schema/resolver.rb +96 -81
  187. data/lib/graphql/schema/scalar.rb +10 -30
  188. data/lib/graphql/schema/subscription.rb +60 -14
  189. data/lib/graphql/schema/timeout.rb +44 -31
  190. data/lib/graphql/schema/type_expression.rb +2 -2
  191. data/lib/graphql/schema/type_membership.rb +3 -0
  192. data/lib/graphql/schema/union.rb +12 -19
  193. data/lib/graphql/schema/unique_within_type.rb +1 -1
  194. data/lib/graphql/schema/validator/all_validator.rb +62 -0
  195. data/lib/graphql/schema/validator/required_validator.rb +60 -10
  196. data/lib/graphql/schema/validator.rb +5 -3
  197. data/lib/graphql/schema/visibility/migration.rb +188 -0
  198. data/lib/graphql/schema/visibility/profile.rb +445 -0
  199. data/lib/graphql/schema/visibility/visit.rb +190 -0
  200. data/lib/graphql/schema/visibility.rb +311 -0
  201. data/lib/graphql/schema/warden.rb +318 -94
  202. data/lib/graphql/schema/wrapper.rb +0 -5
  203. data/lib/graphql/schema.rb +1148 -1085
  204. data/lib/graphql/static_validation/all_rules.rb +4 -3
  205. data/lib/graphql/static_validation/base_visitor.rb +11 -27
  206. data/lib/graphql/static_validation/definition_dependencies.rb +7 -1
  207. data/lib/graphql/static_validation/error.rb +2 -2
  208. data/lib/graphql/static_validation/literal_validator.rb +24 -7
  209. data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +1 -1
  210. data/lib/graphql/static_validation/rules/argument_names_are_unique.rb +1 -1
  211. data/lib/graphql/static_validation/rules/arguments_are_defined.rb +3 -2
  212. data/lib/graphql/static_validation/rules/directives_are_defined.rb +13 -7
  213. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +14 -12
  214. data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +12 -2
  215. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +48 -6
  216. data/lib/graphql/static_validation/rules/fields_will_merge.rb +90 -27
  217. data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +10 -2
  218. data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +3 -3
  219. data/lib/graphql/static_validation/rules/fragment_types_exist.rb +12 -2
  220. data/lib/graphql/static_validation/rules/fragments_are_on_composite_types.rb +1 -1
  221. data/lib/graphql/static_validation/rules/mutation_root_exists.rb +1 -1
  222. data/lib/graphql/static_validation/rules/no_definitions_are_present.rb +1 -1
  223. data/lib/graphql/static_validation/rules/not_single_subscription_error.rb +25 -0
  224. data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid.rb +66 -0
  225. data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid_error.rb +29 -0
  226. data/lib/graphql/static_validation/rules/query_root_exists.rb +1 -1
  227. data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +5 -5
  228. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +5 -5
  229. data/lib/graphql/static_validation/rules/subscription_root_exists_and_single_subscription_selection.rb +26 -0
  230. data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +19 -9
  231. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +18 -27
  232. data/lib/graphql/static_validation/rules/variable_names_are_unique.rb +1 -1
  233. data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +2 -2
  234. data/lib/graphql/static_validation/rules/variables_are_input_types.rb +11 -2
  235. data/lib/graphql/static_validation/validation_context.rb +21 -5
  236. data/lib/graphql/static_validation/validator.rb +12 -26
  237. data/lib/graphql/static_validation.rb +0 -3
  238. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +14 -6
  239. data/lib/graphql/subscriptions/broadcast_analyzer.rb +11 -5
  240. data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +40 -1
  241. data/lib/graphql/subscriptions/event.rb +24 -12
  242. data/lib/graphql/subscriptions/serialize.rb +3 -1
  243. data/lib/graphql/subscriptions.rb +48 -32
  244. data/lib/graphql/testing/helpers.rb +158 -0
  245. data/lib/graphql/testing.rb +2 -0
  246. data/lib/graphql/tracing/active_support_notifications_trace.rb +27 -0
  247. data/lib/graphql/tracing/active_support_notifications_tracing.rb +1 -1
  248. data/lib/graphql/tracing/appoptics_trace.rb +259 -0
  249. data/lib/graphql/tracing/appoptics_tracing.rb +9 -2
  250. data/lib/graphql/tracing/appsignal_trace.rb +54 -0
  251. data/lib/graphql/tracing/appsignal_tracing.rb +2 -0
  252. data/lib/graphql/tracing/call_legacy_tracers.rb +66 -0
  253. data/lib/graphql/tracing/data_dog_trace.rb +71 -0
  254. data/lib/graphql/tracing/data_dog_tracing.rb +3 -0
  255. data/lib/graphql/tracing/detailed_trace/memory_backend.rb +60 -0
  256. data/lib/graphql/tracing/detailed_trace/redis_backend.rb +72 -0
  257. data/lib/graphql/tracing/detailed_trace.rb +93 -0
  258. data/lib/graphql/{execution/instrumentation.rb → tracing/legacy_hooks_trace.rb} +11 -28
  259. data/lib/graphql/tracing/legacy_trace.rb +12 -0
  260. data/lib/graphql/tracing/monitor_trace.rb +283 -0
  261. data/lib/graphql/tracing/new_relic_trace.rb +68 -0
  262. data/lib/graphql/tracing/new_relic_tracing.rb +2 -0
  263. data/lib/graphql/tracing/notifications_trace.rb +195 -0
  264. data/lib/graphql/tracing/notifications_tracing.rb +2 -0
  265. data/lib/graphql/tracing/null_trace.rb +9 -0
  266. data/lib/graphql/tracing/perfetto_trace/trace.proto +141 -0
  267. data/lib/graphql/tracing/perfetto_trace/trace_pb.rb +33 -0
  268. data/lib/graphql/tracing/perfetto_trace.rb +734 -0
  269. data/lib/graphql/tracing/platform_trace.rb +123 -0
  270. data/lib/graphql/tracing/platform_tracing.rb +28 -41
  271. data/lib/graphql/tracing/{prometheus_tracing → prometheus_trace}/graphql_collector.rb +6 -2
  272. data/lib/graphql/tracing/prometheus_trace.rb +93 -0
  273. data/lib/graphql/tracing/prometheus_tracing.rb +5 -3
  274. data/lib/graphql/tracing/scout_trace.rb +49 -0
  275. data/lib/graphql/tracing/scout_tracing.rb +2 -0
  276. data/lib/graphql/tracing/sentry_trace.rb +80 -0
  277. data/lib/graphql/tracing/statsd_trace.rb +48 -0
  278. data/lib/graphql/tracing/statsd_tracing.rb +2 -0
  279. data/lib/graphql/tracing/trace.rb +186 -0
  280. data/lib/graphql/tracing.rb +32 -52
  281. data/lib/graphql/type_kinds.rb +8 -4
  282. data/lib/graphql/types/iso_8601_date.rb +4 -1
  283. data/lib/graphql/types/iso_8601_date_time.rb +4 -0
  284. data/lib/graphql/types/iso_8601_duration.rb +77 -0
  285. data/lib/graphql/types/relay/base_connection.rb +16 -6
  286. data/lib/graphql/types/relay/connection_behaviors.rb +65 -23
  287. data/lib/graphql/types/relay/edge_behaviors.rb +33 -5
  288. data/lib/graphql/types/relay/node_behaviors.rb +12 -2
  289. data/lib/graphql/types/relay/page_info_behaviors.rb +11 -2
  290. data/lib/graphql/types/relay.rb +0 -3
  291. data/lib/graphql/types/string.rb +1 -1
  292. data/lib/graphql/types.rb +18 -10
  293. data/lib/graphql/unauthorized_enum_value_error.rb +13 -0
  294. data/lib/graphql/version.rb +1 -1
  295. data/lib/graphql.rb +76 -123
  296. data/readme.md +13 -3
  297. metadata +225 -142
  298. data/lib/graphql/analysis/analyze_query.rb +0 -98
  299. data/lib/graphql/analysis/ast/analyzer.rb +0 -84
  300. data/lib/graphql/analysis/ast/field_usage.rb +0 -55
  301. data/lib/graphql/analysis/ast/max_query_complexity.rb +0 -23
  302. data/lib/graphql/analysis/ast/max_query_depth.rb +0 -22
  303. data/lib/graphql/analysis/ast/query_complexity.rb +0 -230
  304. data/lib/graphql/analysis/ast/query_depth.rb +0 -56
  305. data/lib/graphql/analysis/ast/visitor.rb +0 -269
  306. data/lib/graphql/analysis/ast.rb +0 -91
  307. data/lib/graphql/analysis/reducer_state.rb +0 -48
  308. data/lib/graphql/argument.rb +0 -131
  309. data/lib/graphql/authorization.rb +0 -82
  310. data/lib/graphql/backtrace/inspect_result.rb +0 -50
  311. data/lib/graphql/backtrace/legacy_tracer.rb +0 -56
  312. data/lib/graphql/backtrace/tracer.rb +0 -81
  313. data/lib/graphql/backwards_compatibility.rb +0 -61
  314. data/lib/graphql/base_type.rb +0 -232
  315. data/lib/graphql/boolean_type.rb +0 -2
  316. data/lib/graphql/compatibility/execution_specification/counter_schema.rb +0 -53
  317. data/lib/graphql/compatibility/execution_specification/specification_schema.rb +0 -200
  318. data/lib/graphql/compatibility/execution_specification.rb +0 -436
  319. data/lib/graphql/compatibility/lazy_execution_specification/lazy_schema.rb +0 -111
  320. data/lib/graphql/compatibility/lazy_execution_specification.rb +0 -215
  321. data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +0 -87
  322. data/lib/graphql/compatibility/query_parser_specification/query_assertions.rb +0 -79
  323. data/lib/graphql/compatibility/query_parser_specification.rb +0 -266
  324. data/lib/graphql/compatibility/schema_parser_specification.rb +0 -682
  325. data/lib/graphql/compatibility.rb +0 -5
  326. data/lib/graphql/define/assign_argument.rb +0 -12
  327. data/lib/graphql/define/assign_connection.rb +0 -13
  328. data/lib/graphql/define/assign_enum_value.rb +0 -18
  329. data/lib/graphql/define/assign_global_id_field.rb +0 -11
  330. data/lib/graphql/define/assign_mutation_function.rb +0 -34
  331. data/lib/graphql/define/assign_object_field.rb +0 -42
  332. data/lib/graphql/define/defined_object_proxy.rb +0 -53
  333. data/lib/graphql/define/instance_definable.rb +0 -255
  334. data/lib/graphql/define/no_definition_error.rb +0 -7
  335. data/lib/graphql/define/non_null_with_bang.rb +0 -16
  336. data/lib/graphql/define/type_definer.rb +0 -31
  337. data/lib/graphql/define.rb +0 -31
  338. data/lib/graphql/deprecated_dsl.rb +0 -55
  339. data/lib/graphql/deprecation.rb +0 -9
  340. data/lib/graphql/directive/deprecated_directive.rb +0 -2
  341. data/lib/graphql/directive/include_directive.rb +0 -2
  342. data/lib/graphql/directive/skip_directive.rb +0 -2
  343. data/lib/graphql/directive.rb +0 -107
  344. data/lib/graphql/enum_type.rb +0 -133
  345. data/lib/graphql/execution/execute.rb +0 -333
  346. data/lib/graphql/execution/flatten.rb +0 -40
  347. data/lib/graphql/execution/lazy/resolve.rb +0 -91
  348. data/lib/graphql/execution/typecast.rb +0 -50
  349. data/lib/graphql/field/resolve.rb +0 -59
  350. data/lib/graphql/field.rb +0 -226
  351. data/lib/graphql/filter.rb +0 -53
  352. data/lib/graphql/float_type.rb +0 -2
  353. data/lib/graphql/function.rb +0 -128
  354. data/lib/graphql/id_type.rb +0 -2
  355. data/lib/graphql/input_object_type.rb +0 -138
  356. data/lib/graphql/int_type.rb +0 -2
  357. data/lib/graphql/interface_type.rb +0 -72
  358. data/lib/graphql/internal_representation/document.rb +0 -27
  359. data/lib/graphql/internal_representation/node.rb +0 -206
  360. data/lib/graphql/internal_representation/print.rb +0 -51
  361. data/lib/graphql/internal_representation/rewrite.rb +0 -184
  362. data/lib/graphql/internal_representation/scope.rb +0 -88
  363. data/lib/graphql/internal_representation/visit.rb +0 -36
  364. data/lib/graphql/internal_representation.rb +0 -7
  365. data/lib/graphql/language/lexer.rl +0 -260
  366. data/lib/graphql/language/parser.y +0 -550
  367. data/lib/graphql/language/token.rb +0 -34
  368. data/lib/graphql/list_type.rb +0 -80
  369. data/lib/graphql/non_null_type.rb +0 -71
  370. data/lib/graphql/object_type.rb +0 -130
  371. data/lib/graphql/query/arguments.rb +0 -189
  372. data/lib/graphql/query/arguments_cache.rb +0 -24
  373. data/lib/graphql/query/executor.rb +0 -52
  374. data/lib/graphql/query/literal_input.rb +0 -136
  375. data/lib/graphql/query/serial_execution/field_resolution.rb +0 -92
  376. data/lib/graphql/query/serial_execution/operation_resolution.rb +0 -19
  377. data/lib/graphql/query/serial_execution/selection_resolution.rb +0 -23
  378. data/lib/graphql/query/serial_execution/value_resolution.rb +0 -87
  379. data/lib/graphql/query/serial_execution.rb +0 -40
  380. data/lib/graphql/relay/array_connection.rb +0 -83
  381. data/lib/graphql/relay/base_connection.rb +0 -189
  382. data/lib/graphql/relay/connection_instrumentation.rb +0 -54
  383. data/lib/graphql/relay/connection_resolve.rb +0 -43
  384. data/lib/graphql/relay/connection_type.rb +0 -54
  385. data/lib/graphql/relay/edge.rb +0 -27
  386. data/lib/graphql/relay/edge_type.rb +0 -19
  387. data/lib/graphql/relay/edges_instrumentation.rb +0 -39
  388. data/lib/graphql/relay/global_id_resolve.rb +0 -17
  389. data/lib/graphql/relay/mongo_relation_connection.rb +0 -50
  390. data/lib/graphql/relay/mutation/instrumentation.rb +0 -23
  391. data/lib/graphql/relay/mutation/resolve.rb +0 -56
  392. data/lib/graphql/relay/mutation/result.rb +0 -38
  393. data/lib/graphql/relay/mutation.rb +0 -106
  394. data/lib/graphql/relay/node.rb +0 -39
  395. data/lib/graphql/relay/page_info.rb +0 -7
  396. data/lib/graphql/relay/relation_connection.rb +0 -188
  397. data/lib/graphql/relay/type_extensions.rb +0 -32
  398. data/lib/graphql/scalar_type.rb +0 -91
  399. data/lib/graphql/schema/base_64_bp.rb +0 -26
  400. data/lib/graphql/schema/catchall_middleware.rb +0 -35
  401. data/lib/graphql/schema/default_parse_error.rb +0 -10
  402. data/lib/graphql/schema/default_type_error.rb +0 -17
  403. data/lib/graphql/schema/invalid_type_error.rb +0 -7
  404. data/lib/graphql/schema/member/accepts_definition.rb +0 -164
  405. data/lib/graphql/schema/member/cached_graphql_definition.rb +0 -58
  406. data/lib/graphql/schema/member/instrumentation.rb +0 -131
  407. data/lib/graphql/schema/middleware_chain.rb +0 -82
  408. data/lib/graphql/schema/null_mask.rb +0 -11
  409. data/lib/graphql/schema/possible_types.rb +0 -44
  410. data/lib/graphql/schema/rescue_middleware.rb +0 -60
  411. data/lib/graphql/schema/timeout_middleware.rb +0 -88
  412. data/lib/graphql/schema/traversal.rb +0 -228
  413. data/lib/graphql/schema/validation.rb +0 -313
  414. data/lib/graphql/static_validation/default_visitor.rb +0 -15
  415. data/lib/graphql/static_validation/no_validate_visitor.rb +0 -10
  416. data/lib/graphql/static_validation/rules/subscription_root_exists.rb +0 -17
  417. data/lib/graphql/static_validation/type_stack.rb +0 -216
  418. data/lib/graphql/string_type.rb +0 -2
  419. data/lib/graphql/subscriptions/instrumentation.rb +0 -79
  420. data/lib/graphql/subscriptions/subscription_root.rb +0 -76
  421. data/lib/graphql/tracing/skylight_tracing.rb +0 -70
  422. data/lib/graphql/types/relay/default_relay.rb +0 -31
  423. data/lib/graphql/types/relay/node_field.rb +0 -24
  424. data/lib/graphql/types/relay/nodes_field.rb +0 -43
  425. data/lib/graphql/union_type.rb +0 -115
  426. data/lib/graphql/upgrader/member.rb +0 -937
  427. data/lib/graphql/upgrader/schema.rb +0 -38
@@ -6,26 +6,42 @@ module GraphQL
6
6
  module BuildFromDefinition
7
7
  class << self
8
8
  # @see {Schema.from_definition}
9
- def from_definition(definition_string, parser: GraphQL.default_parser, **kwargs)
10
- from_document(parser.parse(definition_string), **kwargs)
9
+ def from_definition(schema_superclass, definition_string, parser: GraphQL.default_parser, **kwargs)
10
+ if defined?(parser::SchemaParser)
11
+ parser = parser::SchemaParser
12
+ end
13
+ from_document(schema_superclass, parser.parse(definition_string), **kwargs)
11
14
  end
12
15
 
13
- def from_definition_path(definition_path, parser: GraphQL.default_parser, **kwargs)
14
- from_document(parser.parse_file(definition_path), **kwargs)
16
+ def from_definition_path(schema_superclass, definition_path, parser: GraphQL.default_parser, **kwargs)
17
+ if defined?(parser::SchemaParser)
18
+ parser = parser::SchemaParser
19
+ end
20
+ from_document(schema_superclass, parser.parse_file(definition_path), **kwargs)
15
21
  end
16
22
 
17
- def from_document(document, default_resolve:, using: {}, relay: false)
18
- Builder.build(document, default_resolve: default_resolve || {}, relay: relay, using: using)
23
+ def from_document(schema_superclass, document, default_resolve:, using: {}, base_types: {}, relay: false)
24
+ Builder.build(schema_superclass, document, default_resolve: default_resolve || {}, relay: relay, using: using, base_types: base_types)
19
25
  end
20
26
  end
21
27
 
22
28
  # @api private
23
29
  module Builder
30
+ include GraphQL::EmptyObjects
24
31
  extend self
25
32
 
26
- def build(document, default_resolve:, using: {}, relay:)
33
+ def build(schema_superclass, document, default_resolve:, using: {}, base_types: {}, relay:)
27
34
  raise InvalidDocumentError.new('Must provide a document ast.') if !document || !document.is_a?(GraphQL::Language::Nodes::Document)
28
35
 
36
+ base_types = {
37
+ object: GraphQL::Schema::Object,
38
+ interface: GraphQL::Schema::Interface,
39
+ union: GraphQL::Schema::Union,
40
+ scalar: GraphQL::Schema::Scalar,
41
+ enum: GraphQL::Schema::Enum,
42
+ input_object: GraphQL::Schema::InputObject,
43
+ }.merge!(base_types)
44
+
29
45
  if default_resolve.is_a?(Hash)
30
46
  default_resolve = ResolveMap.new(default_resolve)
31
47
  end
@@ -36,7 +52,7 @@ module GraphQL
36
52
  end
37
53
  schema_definition = schema_defns.first
38
54
  types = {}
39
- directives = {}
55
+ directives = schema_superclass.directives.dup
40
56
  type_resolver = build_resolve_type(types, directives, ->(type_name) { types[type_name] ||= Schema::LateBoundType.new(type_name)})
41
57
  # Make a different type resolver because we need to coerce directive arguments
42
58
  # _while_ building the schema.
@@ -46,7 +62,7 @@ module GraphQL
46
62
  types[type_name] ||= begin
47
63
  defn = document.definitions.find { |d| d.respond_to?(:name) && d.name == type_name }
48
64
  if defn
49
- build_definition_from_node(defn, directive_type_resolver, default_resolve)
65
+ build_definition_from_node(defn, directive_type_resolver, default_resolve, base_types)
50
66
  elsif (built_in_defn = GraphQL::Schema::BUILT_IN_TYPES[type_name])
51
67
  built_in_defn
52
68
  else
@@ -55,26 +71,35 @@ module GraphQL
55
71
  end
56
72
  })
57
73
 
74
+ directives.merge!(GraphQL::Schema.default_directives)
58
75
  document.definitions.each do |definition|
59
76
  if definition.is_a?(GraphQL::Language::Nodes::DirectiveDefinition)
60
77
  directives[definition.name] = build_directive(definition, directive_type_resolver)
61
78
  end
62
79
  end
63
80
 
64
- directives = GraphQL::Schema.default_directives.merge(directives)
65
-
66
81
  # In case any directives referenced built-in types for their arguments:
67
82
  replace_late_bound_types_with_built_in(types)
68
83
 
84
+ schema_extensions = nil
69
85
  document.definitions.each do |definition|
70
86
  case definition
71
87
  when GraphQL::Language::Nodes::SchemaDefinition, GraphQL::Language::Nodes::DirectiveDefinition
72
88
  nil # already handled
89
+ when GraphQL::Language::Nodes::SchemaExtension,
90
+ GraphQL::Language::Nodes::ScalarTypeExtension,
91
+ GraphQL::Language::Nodes::ObjectTypeExtension,
92
+ GraphQL::Language::Nodes::InterfaceTypeExtension,
93
+ GraphQL::Language::Nodes::UnionTypeExtension,
94
+ GraphQL::Language::Nodes::EnumTypeExtension,
95
+ GraphQL::Language::Nodes::InputObjectTypeExtension
96
+ schema_extensions ||= []
97
+ schema_extensions << definition
73
98
  else
74
99
  # It's possible that this was already loaded by the directives
75
100
  prev_type = types[definition.name]
76
101
  if prev_type.nil? || prev_type.is_a?(Schema::LateBoundType)
77
- types[definition.name] = build_definition_from_node(definition, type_resolver, default_resolve)
102
+ types[definition.name] = build_definition_from_node(definition, type_resolver, default_resolve, base_types)
78
103
  end
79
104
  end
80
105
  end
@@ -96,6 +121,16 @@ module GraphQL
96
121
  raise InvalidDocumentError.new("Specified subscription type \"#{schema_definition.subscription}\" not found in document.") unless types[schema_definition.subscription]
97
122
  subscription_root_type = types[schema_definition.subscription]
98
123
  end
124
+
125
+ if schema_definition.query.nil? &&
126
+ schema_definition.mutation.nil? &&
127
+ schema_definition.subscription.nil?
128
+ # This schema may have been given with directives only,
129
+ # check for defaults:
130
+ query_root_type = types['Query']
131
+ mutation_root_type = types['Mutation']
132
+ subscription_root_type = types['Subscription']
133
+ end
99
134
  else
100
135
  query_root_type = types['Query']
101
136
  mutation_root_type = types['Mutation']
@@ -104,10 +139,43 @@ module GraphQL
104
139
 
105
140
  raise InvalidDocumentError.new('Must provide schema definition with query type or a type named Query.') unless query_root_type
106
141
 
107
- Class.new(GraphQL::Schema) do
142
+ schema_extensions&.each do |ext|
143
+ next if ext.is_a?(GraphQL::Language::Nodes::SchemaExtension)
144
+
145
+ built_type = types[ext.name]
146
+
147
+ case ext
148
+ when GraphQL::Language::Nodes::ScalarTypeExtension
149
+ build_directives(built_type, ext, type_resolver)
150
+ when GraphQL::Language::Nodes::ObjectTypeExtension
151
+ build_directives(built_type, ext, type_resolver)
152
+ build_fields(built_type, ext.fields, type_resolver, default_resolve: true)
153
+ build_interfaces(built_type, ext.interfaces, type_resolver)
154
+ when GraphQL::Language::Nodes::InterfaceTypeExtension
155
+ build_directives(built_type, ext, type_resolver)
156
+ build_fields(built_type, ext.fields, type_resolver, default_resolve: nil)
157
+ build_interfaces(built_type, ext.interfaces, type_resolver)
158
+ when GraphQL::Language::Nodes::UnionTypeExtension
159
+ build_directives(built_type, ext, type_resolver)
160
+ built_type.possible_types(*ext.types.map { |type_name| type_resolver.call(type_name) })
161
+ when GraphQL::Language::Nodes::EnumTypeExtension
162
+ build_directives(built_type, ext, type_resolver)
163
+ build_values(built_type, ext.values, type_resolver)
164
+ when GraphQL::Language::Nodes::InputObjectTypeExtension
165
+ build_directives(built_type, ext, type_resolver)
166
+ build_arguments(built_type, ext.fields, type_resolver)
167
+ end
168
+ end
169
+
170
+ builder = self
171
+
172
+ found_types = types.values
173
+ object_types = found_types.select { |t| t.respond_to?(:kind) && t.kind.object? }
174
+ schema_class = Class.new(schema_superclass) do
108
175
  begin
109
176
  # Add these first so that there's some chance of resolving late-bound types
110
- orphan_types types.values
177
+ add_type_and_traverse(found_types, root: false)
178
+ orphan_types(object_types)
111
179
  query query_root_type
112
180
  mutation mutation_root_type
113
181
  subscription subscription_root_type
@@ -117,6 +185,16 @@ module GraphQL
117
185
  raise InvalidDocumentError, "Type \"#{type_name}\" not found in document.", err_backtrace
118
186
  end
119
187
 
188
+ object_types.each do |t|
189
+ t.interfaces.each do |int_t|
190
+ if int_t.is_a?(LateBoundType)
191
+ int_t = types[int_t.graphql_name]
192
+ t.implements(int_t)
193
+ end
194
+ int_t.orphan_types(t)
195
+ end
196
+ end
197
+
120
198
  if default_resolve.respond_to?(:resolve_type)
121
199
  def self.resolve_type(*args)
122
200
  self.definition_default_resolve.resolve_type(*args)
@@ -131,6 +209,7 @@ module GraphQL
131
209
 
132
210
  if schema_definition
133
211
  ast_node(schema_definition)
212
+ builder.build_directives(self, schema_definition, type_resolver)
134
213
  end
135
214
 
136
215
  using.each do |plugin, options|
@@ -156,28 +235,37 @@ module GraphQL
156
235
 
157
236
  def self.inherited(child_class)
158
237
  child_class.definition_default_resolve = self.definition_default_resolve
238
+ super
159
239
  end
160
240
  end
241
+
242
+ schema_extensions&.each do |ext|
243
+ if ext.is_a?(GraphQL::Language::Nodes::SchemaExtension)
244
+ build_directives(schema_class, ext, type_resolver)
245
+ end
246
+ end
247
+
248
+ schema_class
161
249
  end
162
250
 
163
251
  NullResolveType = ->(type, obj, ctx) {
164
252
  raise(GraphQL::RequiredImplementationMissingError, "Generated Schema cannot use Interface or Union types for execution. Implement resolve_type on your resolver.")
165
253
  }
166
254
 
167
- def build_definition_from_node(definition, type_resolver, default_resolve)
255
+ def build_definition_from_node(definition, type_resolver, default_resolve, base_types)
168
256
  case definition
169
257
  when GraphQL::Language::Nodes::EnumTypeDefinition
170
- build_enum_type(definition, type_resolver)
258
+ build_enum_type(definition, type_resolver, base_types[:enum])
171
259
  when GraphQL::Language::Nodes::ObjectTypeDefinition
172
- build_object_type(definition, type_resolver)
260
+ build_object_type(definition, type_resolver, base_types[:object])
173
261
  when GraphQL::Language::Nodes::InterfaceTypeDefinition
174
- build_interface_type(definition, type_resolver)
262
+ build_interface_type(definition, type_resolver, base_types[:interface])
175
263
  when GraphQL::Language::Nodes::UnionTypeDefinition
176
- build_union_type(definition, type_resolver)
264
+ build_union_type(definition, type_resolver, base_types[:union])
177
265
  when GraphQL::Language::Nodes::ScalarTypeDefinition
178
- build_scalar_type(definition, type_resolver, default_resolve: default_resolve)
266
+ build_scalar_type(definition, type_resolver, base_types[:scalar], default_resolve: default_resolve)
179
267
  when GraphQL::Language::Nodes::InputObjectTypeDefinition
180
- build_input_object_type(definition, type_resolver)
268
+ build_input_object_type(definition, type_resolver, base_types[:input_object])
181
269
  end
182
270
  end
183
271
 
@@ -197,13 +285,18 @@ module GraphQL
197
285
 
198
286
  def build_directives(definition, ast_node, type_resolver)
199
287
  dirs = prepare_directives(ast_node, type_resolver)
200
- dirs.each do |dir_class, options|
201
- definition.directive(dir_class, **options)
288
+ dirs.each do |(dir_class, options)|
289
+ if definition.respond_to?(:schema_directive)
290
+ # it's a schema
291
+ definition.schema_directive(dir_class, **options)
292
+ else
293
+ definition.directive(dir_class, **options)
294
+ end
202
295
  end
203
296
  end
204
297
 
205
298
  def prepare_directives(ast_node, type_resolver)
206
- dirs = {}
299
+ dirs = []
207
300
  ast_node.directives.each do |dir_node|
208
301
  if dir_node.name == "deprecated"
209
302
  # This is handled using `deprecation_reason`
@@ -211,10 +304,10 @@ module GraphQL
211
304
  else
212
305
  dir_class = type_resolver.call(dir_node.name)
213
306
  if dir_class.nil?
214
- raise ArgumentError, "No definition for @#{dir_node.name} on #{ast_node.name} at #{ast_node.line}:#{ast_node.col}"
307
+ raise ArgumentError, "No definition for @#{dir_node.name} #{ast_node.respond_to?(:name) ? "on #{ast_node.name} " : ""}at #{ast_node.line}:#{ast_node.col}"
215
308
  end
216
309
  options = args_to_kwargs(dir_class, dir_node)
217
- dirs[dir_class] = options
310
+ dirs << [dir_class, options]
218
311
  end
219
312
  end
220
313
  dirs
@@ -238,22 +331,26 @@ module GraphQL
238
331
  end
239
332
  end
240
333
 
241
- def build_enum_type(enum_type_definition, type_resolver)
334
+ def build_enum_type(enum_type_definition, type_resolver, base_type)
242
335
  builder = self
243
- Class.new(GraphQL::Schema::Enum) do
336
+ Class.new(base_type) do
244
337
  graphql_name(enum_type_definition.name)
245
338
  builder.build_directives(self, enum_type_definition, type_resolver)
246
339
  description(enum_type_definition.description)
247
340
  ast_node(enum_type_definition)
248
- enum_type_definition.values.each do |enum_value_definition|
249
- value(enum_value_definition.name,
250
- value: enum_value_definition.name,
251
- deprecation_reason: builder.build_deprecation_reason(enum_value_definition.directives),
252
- description: enum_value_definition.description,
253
- directives: builder.prepare_directives(enum_value_definition, type_resolver),
254
- ast_node: enum_value_definition,
255
- )
256
- end
341
+ builder.build_values(self, enum_type_definition.values, type_resolver)
342
+ end
343
+ end
344
+
345
+ def build_values(type_class, enum_value_definitions, type_resolver)
346
+ enum_value_definitions.each do |enum_value_definition|
347
+ type_class.value(enum_value_definition.name,
348
+ value: enum_value_definition.name,
349
+ deprecation_reason: build_deprecation_reason(enum_value_definition.directives),
350
+ description: enum_value_definition.description,
351
+ directives: prepare_directives(enum_value_definition, type_resolver),
352
+ ast_node: enum_value_definition,
353
+ )
257
354
  end
258
355
  end
259
356
 
@@ -267,9 +364,9 @@ module GraphQL
267
364
  reason.value
268
365
  end
269
366
 
270
- def build_scalar_type(scalar_type_definition, type_resolver, default_resolve:)
367
+ def build_scalar_type(scalar_type_definition, type_resolver, base_type, default_resolve:)
271
368
  builder = self
272
- Class.new(GraphQL::Schema::Scalar) do
369
+ Class.new(base_type) do
273
370
  graphql_name(scalar_type_definition.name)
274
371
  description(scalar_type_definition.description)
275
372
  ast_node(scalar_type_definition)
@@ -290,9 +387,9 @@ module GraphQL
290
387
  end
291
388
  end
292
389
 
293
- def build_union_type(union_type_definition, type_resolver)
390
+ def build_union_type(union_type_definition, type_resolver, base_type)
294
391
  builder = self
295
- Class.new(GraphQL::Schema::Union) do
392
+ Class.new(base_type) do
296
393
  graphql_name(union_type_definition.name)
297
394
  description(union_type_definition.description)
298
395
  possible_types(*union_type_definition.types.map { |type_name| type_resolver.call(type_name) })
@@ -301,27 +398,28 @@ module GraphQL
301
398
  end
302
399
  end
303
400
 
304
- def build_object_type(object_type_definition, type_resolver)
401
+ def build_object_type(object_type_definition, type_resolver, base_type)
305
402
  builder = self
306
403
 
307
- Class.new(GraphQL::Schema::Object) do
404
+ Class.new(base_type) do
308
405
  graphql_name(object_type_definition.name)
309
406
  description(object_type_definition.description)
310
407
  ast_node(object_type_definition)
311
408
  builder.build_directives(self, object_type_definition, type_resolver)
312
-
313
- object_type_definition.interfaces.each do |interface_name|
314
- interface_defn = type_resolver.call(interface_name)
315
- implements(interface_defn)
316
- end
317
-
409
+ builder.build_interfaces(self, object_type_definition.interfaces, type_resolver)
318
410
  builder.build_fields(self, object_type_definition.fields, type_resolver, default_resolve: true)
319
411
  end
320
412
  end
321
413
 
322
- def build_input_object_type(input_object_type_definition, type_resolver)
414
+ def build_interfaces(type_class, interface_names, type_resolver)
415
+ interface_names.each do |interface_name|
416
+ type_class.implements(type_resolver.call(interface_name))
417
+ end
418
+ end
419
+
420
+ def build_input_object_type(input_object_type_definition, type_resolver, base_type)
323
421
  builder = self
324
- Class.new(GraphQL::Schema::InputObject) do
422
+ Class.new(base_type) do
325
423
  graphql_name(input_object_type_definition.name)
326
424
  description(input_object_type_definition.description)
327
425
  ast_node(input_object_type_definition)
@@ -345,8 +443,6 @@ module GraphQL
345
443
  end
346
444
  end
347
445
 
348
- NO_DEFAULT_VALUE = {}.freeze
349
-
350
446
  def build_arguments(type_class, arguments, type_resolver)
351
447
  builder = self
352
448
 
@@ -354,7 +450,7 @@ module GraphQL
354
450
  default_value_kwargs = if !argument_defn.default_value.nil?
355
451
  { default_value: builder.build_default_value(argument_defn.default_value) }
356
452
  else
357
- NO_DEFAULT_VALUE
453
+ EMPTY_HASH
358
454
  end
359
455
 
360
456
  type_class.argument(
@@ -365,7 +461,6 @@ module GraphQL
365
461
  deprecation_reason: builder.build_deprecation_reason(argument_defn.directives),
366
462
  ast_node: argument_defn,
367
463
  camelize: false,
368
- method_access: false,
369
464
  directives: prepare_directives(argument_defn, type_resolver),
370
465
  **default_value_kwargs
371
466
  )
@@ -384,17 +479,13 @@ module GraphQL
384
479
  end
385
480
  end
386
481
 
387
- def build_interface_type(interface_type_definition, type_resolver)
482
+ def build_interface_type(interface_type_definition, type_resolver, base_type)
388
483
  builder = self
389
484
  Module.new do
390
- include GraphQL::Schema::Interface
485
+ include base_type
391
486
  graphql_name(interface_type_definition.name)
392
487
  description(interface_type_definition.description)
393
- interface_type_definition.interfaces.each do |interface_name|
394
- "Implements: #{interface_type_definition} -> #{interface_name}"
395
- interface_defn = type_resolver.call(interface_name)
396
- implements(interface_defn)
397
- end
488
+ builder.build_interfaces(self, interface_type_definition.interfaces, type_resolver)
398
489
  ast_node(interface_type_definition)
399
490
  builder.build_directives(self, interface_type_definition, type_resolver)
400
491
 
@@ -406,14 +497,12 @@ module GraphQL
406
497
  builder = self
407
498
 
408
499
  field_definitions.each do |field_definition|
409
- type_name = resolve_type_name(field_definition.type)
410
500
  resolve_method_name = -"resolve_field_#{field_definition.name}"
411
501
  schema_field_defn = owner.field(
412
502
  field_definition.name,
413
503
  description: field_definition.description,
414
504
  type: type_resolver.call(field_definition.type),
415
505
  null: true,
416
- connection: type_name.end_with?("Connection"),
417
506
  connection_extension: nil,
418
507
  deprecation_reason: build_deprecation_reason(field_definition.directives),
419
508
  ast_node: field_definition,
@@ -434,7 +523,7 @@ module GraphQL
434
523
 
435
524
  def define_field_resolve_method(owner, method_name, field_name)
436
525
  owner.define_method(method_name) { |**args|
437
- field_instance = self.class.get_field(field_name)
526
+ field_instance = context.types.field(owner, field_name)
438
527
  context.schema.definition_default_resolve.call(self.class, field_instance, object, args, context)
439
528
  }
440
529
  end
@@ -462,15 +551,6 @@ module GraphQL
462
551
  }
463
552
  resolve_type_proc
464
553
  end
465
-
466
- def resolve_type_name(type)
467
- case type
468
- when GraphQL::Language::Nodes::TypeName
469
- return type.name
470
- else
471
- resolve_type_name(type.of_type)
472
- end
473
- end
474
554
  end
475
555
 
476
556
  private_constant :Builder
@@ -7,7 +7,7 @@ module GraphQL
7
7
  # In this case, the server hides types and fields _entirely_, unless the current context has certain `:flags` present.
8
8
  class Flagged < GraphQL::Schema::Directive
9
9
  def initialize(target, **options)
10
- if target.is_a?(Module) && !target.ancestors.include?(VisibleByFlag)
10
+ if target.is_a?(Module)
11
11
  # This is type class of some kind, `include` will put this module
12
12
  # in between the type class itself and its super class, so `super` will work fine
13
13
  target.include(VisibleByFlag)
@@ -37,6 +37,8 @@ module GraphQL
37
37
 
38
38
  argument :by, [String], "Flags to check for this schema member"
39
39
 
40
+ repeatable(true)
41
+
40
42
  module VisibleByFlag
41
43
  def self.included(schema_class)
42
44
  schema_class.extend(self)
@@ -45,7 +47,7 @@ module GraphQL
45
47
  def visible?(context)
46
48
  if dir = self.directives.find { |d| d.is_a?(Flagged) }
47
49
  relevant_flags = (f = context[:flags]) && dir.arguments[:by] & f # rubocop:disable Development/ContextIsPassedCop -- definition-related
48
- relevant_flags && relevant_flags.any? && super
50
+ relevant_flags && !relevant_flags.empty? && super
49
51
  else
50
52
  super
51
53
  end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ class Schema
4
+ class Directive < GraphQL::Schema::Member
5
+ class OneOf < GraphQL::Schema::Directive
6
+ description "Requires that exactly one field must be supplied and that field must not be `null`."
7
+ locations(GraphQL::Schema::Directive::INPUT_OBJECT)
8
+ default_directive true
9
+
10
+ def initialize(...)
11
+ super
12
+
13
+ owner.extend(IsOneOf)
14
+ end
15
+
16
+ module IsOneOf
17
+ def one_of?
18
+ true
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ class Schema
4
+ class Directive < GraphQL::Schema::Member
5
+ class SpecifiedBy < GraphQL::Schema::Directive
6
+ description "Exposes a URL that specifies the behavior of this scalar."
7
+ locations(GraphQL::Schema::Directive::SCALAR)
8
+ default_directive true
9
+
10
+ argument :url, String, description: "The URL that specifies the behavior of this scalar."
11
+ end
12
+ end
13
+ end
14
+ end
@@ -39,7 +39,7 @@ module GraphQL
39
39
  transform_name = arguments[:by]
40
40
  if TRANSFORMS.include?(transform_name) && return_value.respond_to?(transform_name)
41
41
  return_value = return_value.public_send(transform_name)
42
- response = context.namespace(:interpreter)[:runtime].final_result
42
+ response = context.namespace(:interpreter_runtime)[:runtime].final_result
43
43
  *keys, last = path
44
44
  keys.each do |key|
45
45
  if response && (response = response[key])
@@ -8,7 +8,8 @@ module GraphQL
8
8
  # - {.resolve}: Wraps field resolution (so it should call `yield` to continue)
9
9
  class Directive < GraphQL::Schema::Member
10
10
  extend GraphQL::Schema::Member::HasArguments
11
- extend GraphQL::Schema::Member::AcceptsDefinition
11
+ extend GraphQL::Schema::Member::HasArguments::HasDirectiveArguments
12
+ extend GraphQL::Schema::Member::HasValidators
12
13
 
13
14
  class << self
14
15
  # Directives aren't types, they don't have kinds.
@@ -24,12 +25,12 @@ module GraphQL
24
25
  @default_graphql_name ||= begin
25
26
  camelized_name = super.dup
26
27
  camelized_name[0] = camelized_name[0].downcase
27
- camelized_name
28
+ -camelized_name
28
29
  end
29
30
  end
30
31
 
31
32
  def locations(*new_locations)
32
- if new_locations.any?
33
+ if !new_locations.empty?
33
34
  new_locations.each do |new_loc|
34
35
  if !LOCATIONS.include?(new_loc.to_sym)
35
36
  raise ArgumentError, "#{self} (#{self.graphql_name}) has an invalid directive location: `locations #{new_loc}` "
@@ -55,26 +56,6 @@ module GraphQL
55
56
  default_directive
56
57
  end
57
58
 
58
- prepend Schema::Member::CachedGraphQLDefinition::DeprecatedToGraphQL
59
-
60
- def to_graphql
61
- defn = GraphQL::Directive.new
62
- defn.name = self.graphql_name
63
- defn.description = self.description
64
- defn.locations = self.locations
65
- defn.default_directive = self.default_directive
66
- defn.ast_node = ast_node
67
- defn.metadata[:type_class] = self
68
- all_argument_definitions.each do |arg_defn|
69
- arg_graphql = arg_defn.to_graphql(silence_deprecation_warning: true)
70
- defn.arguments[arg_graphql.name] = arg_graphql # rubocop:disable Development/ContextIsPassedCop -- legacy-related
71
- end
72
- # Make a reference to a classic-style Arguments class
73
- defn.arguments_class = GraphQL::Query::Arguments.construct_arguments_class(defn)
74
-
75
- defn
76
- end
77
-
78
59
  # If false, this part of the query won't be evaluated
79
60
  def include?(_object, arguments, context)
80
61
  static_include?(arguments, context)
@@ -95,6 +76,10 @@ module GraphQL
95
76
  yield
96
77
  end
97
78
 
79
+ def validate!(arguments, context)
80
+ Schema::Validator.validate!(validators, self, context, arguments)
81
+ end
82
+
98
83
  def on_field?
99
84
  locations.include?(FIELD)
100
85
  end
@@ -114,6 +99,15 @@ module GraphQL
114
99
  def repeatable(new_value)
115
100
  @repeatable = new_value
116
101
  end
102
+
103
+ private
104
+
105
+ def inherited(subclass)
106
+ super
107
+ subclass.class_exec do
108
+ @default_graphql_name ||= nil
109
+ end
110
+ end
117
111
  end
118
112
 
119
113
  # @return [GraphQL::Schema::Field, GraphQL::Schema::Argument, Class, Module]
@@ -122,6 +116,9 @@ module GraphQL
122
116
  # @return [GraphQL::Interpreter::Arguments]
123
117
  attr_reader :arguments
124
118
 
119
+ class InvalidArgumentError < GraphQL::Error
120
+ end
121
+
125
122
  def initialize(owner, **arguments)
126
123
  @owner = owner
127
124
  assert_valid_owner
@@ -130,7 +127,31 @@ module GraphQL
130
127
  # - lazy resolution
131
128
  # Probably, those won't be needed here, since these are configuration arguments,
132
129
  # not runtime arguments.
133
- @arguments = self.class.coerce_arguments(nil, arguments, Query::NullContext)
130
+ context = Query::NullContext.instance
131
+ self.class.all_argument_definitions.each do |arg_defn|
132
+ if arguments.key?(arg_defn.keyword)
133
+ value = arguments[arg_defn.keyword]
134
+ # This is a Ruby-land value; convert it to graphql for validation
135
+ graphql_value = begin
136
+ arg_defn.type.unwrap.coerce_isolated_result(value)
137
+ rescue GraphQL::Schema::Enum::UnresolvedValueError
138
+ # Let validation handle this
139
+ value
140
+ end
141
+ else
142
+ value = graphql_value = nil
143
+ end
144
+
145
+ result = arg_defn.type.validate_input(graphql_value, context)
146
+ if !result.valid?
147
+ raise InvalidArgumentError, "@#{graphql_name}.#{arg_defn.graphql_name} on #{owner.path} is invalid (#{value.inspect}): #{result.problems.first["explanation"]}"
148
+ end
149
+ end
150
+ self.class.validate!(arguments, context)
151
+ @arguments = self.class.coerce_arguments(nil, arguments, context)
152
+ if @arguments.is_a?(GraphQL::ExecutionError)
153
+ raise @arguments
154
+ end
134
155
  end
135
156
 
136
157
  def graphql_name
@@ -199,6 +220,8 @@ module GraphQL
199
220
  assert_has_location(SCALAR)
200
221
  elsif @owner < GraphQL::Schema
201
222
  assert_has_location(SCHEMA)
223
+ elsif @owner < GraphQL::Schema::Resolver
224
+ assert_has_location(FIELD_DEFINITION)
202
225
  else
203
226
  raise "Unexpected directive owner class: #{@owner}"
204
227
  end