graphql 2.0.31 → 2.6.1

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 (316) hide show
  1. checksums.yaml +4 -4
  2. data/lib/generators/graphql/detailed_trace_generator.rb +77 -0
  3. data/lib/generators/graphql/install/mutation_root_generator.rb +2 -2
  4. data/lib/generators/graphql/install/templates/base_mutation.erb +2 -0
  5. data/lib/generators/graphql/install/templates/mutation_type.erb +2 -0
  6. data/lib/generators/graphql/install_generator.rb +49 -0
  7. data/lib/generators/graphql/orm_mutations_base.rb +1 -1
  8. data/lib/generators/graphql/templates/base_argument.erb +2 -0
  9. data/lib/generators/graphql/templates/base_connection.erb +2 -0
  10. data/lib/generators/graphql/templates/base_edge.erb +2 -0
  11. data/lib/generators/graphql/templates/base_enum.erb +2 -0
  12. data/lib/generators/graphql/templates/base_field.erb +2 -0
  13. data/lib/generators/graphql/templates/base_input_object.erb +2 -0
  14. data/lib/generators/graphql/templates/base_interface.erb +2 -0
  15. data/lib/generators/graphql/templates/base_object.erb +2 -0
  16. data/lib/generators/graphql/templates/base_resolver.erb +8 -0
  17. data/lib/generators/graphql/templates/base_scalar.erb +2 -0
  18. data/lib/generators/graphql/templates/base_union.erb +2 -0
  19. data/lib/generators/graphql/templates/create_graphql_detailed_traces.erb +10 -0
  20. data/lib/generators/graphql/templates/graphql_controller.erb +2 -0
  21. data/lib/generators/graphql/templates/loader.erb +2 -0
  22. data/lib/generators/graphql/templates/mutation.erb +2 -0
  23. data/lib/generators/graphql/templates/node_type.erb +2 -0
  24. data/lib/generators/graphql/templates/query_type.erb +2 -0
  25. data/lib/generators/graphql/templates/schema.erb +5 -0
  26. data/lib/generators/graphql/type_generator.rb +1 -1
  27. data/lib/graphql/analysis/analyzer.rb +90 -0
  28. data/lib/graphql/analysis/field_usage.rb +82 -0
  29. data/lib/graphql/analysis/max_query_complexity.rb +20 -0
  30. data/lib/graphql/analysis/max_query_depth.rb +20 -0
  31. data/lib/graphql/analysis/query_complexity.rb +263 -0
  32. data/lib/graphql/analysis/query_depth.rb +58 -0
  33. data/lib/graphql/analysis/visitor.rb +280 -0
  34. data/lib/graphql/analysis.rb +102 -1
  35. data/lib/graphql/autoload.rb +38 -0
  36. data/lib/graphql/backtrace/table.rb +118 -55
  37. data/lib/graphql/backtrace.rb +1 -19
  38. data/lib/graphql/coercion_error.rb +1 -9
  39. data/lib/graphql/current.rb +57 -0
  40. data/lib/graphql/dashboard/application_controller.rb +41 -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/landings_controller.rb +9 -0
  44. data/lib/graphql/dashboard/limiters.rb +93 -0
  45. data/lib/graphql/dashboard/operation_store.rb +199 -0
  46. data/lib/graphql/dashboard/statics/bootstrap-5.3.3.min.css +6 -0
  47. data/lib/graphql/dashboard/statics/bootstrap-5.3.3.min.js +7 -0
  48. data/lib/graphql/dashboard/statics/charts.min.css +1 -0
  49. data/lib/graphql/dashboard/statics/dashboard.css +30 -0
  50. data/lib/graphql/dashboard/statics/dashboard.js +143 -0
  51. data/lib/graphql/dashboard/statics/header-icon.png +0 -0
  52. data/lib/graphql/dashboard/statics/icon.png +0 -0
  53. data/lib/graphql/dashboard/statics_controller.rb +31 -0
  54. data/lib/graphql/dashboard/subscriptions.rb +97 -0
  55. data/lib/graphql/dashboard/views/graphql/dashboard/detailed_traces/traces/index.html.erb +45 -0
  56. data/lib/graphql/dashboard/views/graphql/dashboard/landings/show.html.erb +18 -0
  57. data/lib/graphql/dashboard/views/graphql/dashboard/limiters/limiters/show.html.erb +62 -0
  58. data/lib/graphql/dashboard/views/graphql/dashboard/not_installed.html.erb +18 -0
  59. data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/clients/_form.html.erb +24 -0
  60. data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/clients/edit.html.erb +21 -0
  61. data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/clients/index.html.erb +69 -0
  62. data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/clients/new.html.erb +7 -0
  63. data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/index_entries/index.html.erb +39 -0
  64. data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/index_entries/show.html.erb +32 -0
  65. data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/operations/index.html.erb +81 -0
  66. data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/operations/show.html.erb +71 -0
  67. data/lib/graphql/dashboard/views/graphql/dashboard/subscriptions/subscriptions/show.html.erb +41 -0
  68. data/lib/graphql/dashboard/views/graphql/dashboard/subscriptions/topics/index.html.erb +55 -0
  69. data/lib/graphql/dashboard/views/graphql/dashboard/subscriptions/topics/show.html.erb +40 -0
  70. data/lib/graphql/dashboard/views/layouts/graphql/dashboard/application.html.erb +108 -0
  71. data/lib/graphql/dashboard.rb +96 -0
  72. data/lib/graphql/dataloader/active_record_association_source.rb +84 -0
  73. data/lib/graphql/dataloader/active_record_source.rb +47 -0
  74. data/lib/graphql/dataloader/async_dataloader.rb +112 -0
  75. data/lib/graphql/dataloader/null_dataloader.rb +55 -10
  76. data/lib/graphql/dataloader/request.rb +5 -0
  77. data/lib/graphql/dataloader/source.rb +35 -12
  78. data/lib/graphql/dataloader.rb +224 -149
  79. data/lib/graphql/date_encoding_error.rb +1 -1
  80. data/lib/graphql/dig.rb +2 -1
  81. data/lib/graphql/duration_encoding_error.rb +16 -0
  82. data/lib/graphql/execution/field_resolve_step.rb +631 -0
  83. data/lib/graphql/execution/finalize.rb +217 -0
  84. data/lib/graphql/execution/input_values.rb +261 -0
  85. data/lib/graphql/execution/interpreter/argument_value.rb +5 -1
  86. data/lib/graphql/execution/interpreter/arguments_cache.rb +5 -10
  87. data/lib/graphql/execution/interpreter/handles_raw_value.rb +6 -0
  88. data/lib/graphql/execution/interpreter/resolve.rb +23 -25
  89. data/lib/graphql/execution/interpreter/runtime/graphql_result.rb +228 -0
  90. data/lib/graphql/execution/interpreter/runtime.rb +365 -435
  91. data/lib/graphql/execution/interpreter.rb +87 -163
  92. data/lib/graphql/execution/lazy.rb +1 -1
  93. data/lib/graphql/execution/load_argument_step.rb +64 -0
  94. data/lib/graphql/execution/lookahead.rb +105 -31
  95. data/lib/graphql/execution/multiplex.rb +7 -6
  96. data/lib/graphql/execution/next.rb +90 -0
  97. data/lib/graphql/execution/prepare_object_step.rb +128 -0
  98. data/lib/graphql/execution/runner.rb +410 -0
  99. data/lib/graphql/execution/selections_step.rb +91 -0
  100. data/lib/graphql/execution.rb +8 -4
  101. data/lib/graphql/execution_error.rb +17 -10
  102. data/lib/graphql/introspection/directive_location_enum.rb +1 -1
  103. data/lib/graphql/introspection/directive_type.rb +7 -3
  104. data/lib/graphql/introspection/dynamic_fields.rb +5 -1
  105. data/lib/graphql/introspection/entry_points.rb +20 -6
  106. data/lib/graphql/introspection/enum_value_type.rb +5 -5
  107. data/lib/graphql/introspection/field_type.rb +13 -5
  108. data/lib/graphql/introspection/input_value_type.rb +21 -13
  109. data/lib/graphql/introspection/schema_type.rb +8 -11
  110. data/lib/graphql/introspection/type_type.rb +64 -28
  111. data/lib/graphql/invalid_name_error.rb +1 -1
  112. data/lib/graphql/invalid_null_error.rb +26 -17
  113. data/lib/graphql/language/block_string.rb +34 -18
  114. data/lib/graphql/language/cache.rb +13 -0
  115. data/lib/graphql/language/comment.rb +18 -0
  116. data/lib/graphql/language/definition_slice.rb +1 -1
  117. data/lib/graphql/language/document_from_schema_definition.rb +90 -61
  118. data/lib/graphql/language/lexer.rb +323 -193
  119. data/lib/graphql/language/nodes.rb +139 -77
  120. data/lib/graphql/language/parser.rb +807 -1985
  121. data/lib/graphql/language/printer.rb +324 -151
  122. data/lib/graphql/language/sanitized_printer.rb +21 -23
  123. data/lib/graphql/language/static_visitor.rb +171 -0
  124. data/lib/graphql/language/visitor.rb +62 -119
  125. data/lib/graphql/language.rb +71 -1
  126. data/lib/graphql/load_application_object_failed_error.rb +5 -1
  127. data/lib/graphql/pagination/array_connection.rb +6 -6
  128. data/lib/graphql/pagination/connection.rb +30 -1
  129. data/lib/graphql/pagination/connections.rb +32 -0
  130. data/lib/graphql/pagination/mongoid_relation_connection.rb +1 -2
  131. data/lib/graphql/query/context/scoped_context.rb +101 -0
  132. data/lib/graphql/query/context.rb +88 -144
  133. data/lib/graphql/query/null_context.rb +15 -18
  134. data/lib/graphql/query/partial.rb +194 -0
  135. data/lib/graphql/query/validation_pipeline.rb +4 -4
  136. data/lib/graphql/query/variable_validation_error.rb +1 -1
  137. data/lib/graphql/query/variables.rb +3 -3
  138. data/lib/graphql/query.rb +135 -81
  139. data/lib/graphql/railtie.rb +16 -6
  140. data/lib/graphql/rake_task.rb +3 -12
  141. data/lib/graphql/rubocop/graphql/base_cop.rb +1 -1
  142. data/lib/graphql/rubocop/graphql/field_type_in_block.rb +144 -0
  143. data/lib/graphql/rubocop/graphql/root_types_in_block.rb +38 -0
  144. data/lib/graphql/rubocop.rb +2 -0
  145. data/lib/graphql/runtime_error.rb +6 -0
  146. data/lib/graphql/schema/addition.rb +26 -13
  147. data/lib/graphql/schema/always_visible.rb +7 -2
  148. data/lib/graphql/schema/argument.rb +78 -14
  149. data/lib/graphql/schema/base_64_encoder.rb +3 -5
  150. data/lib/graphql/schema/build_from_definition.rb +140 -66
  151. data/lib/graphql/schema/directive/flagged.rb +4 -2
  152. data/lib/graphql/schema/directive/one_of.rb +12 -0
  153. data/lib/graphql/schema/directive/specified_by.rb +14 -0
  154. data/lib/graphql/schema/directive.rb +78 -12
  155. data/lib/graphql/schema/enum.rb +110 -27
  156. data/lib/graphql/schema/enum_value.rb +11 -3
  157. data/lib/graphql/schema/field/connection_extension.rb +4 -51
  158. data/lib/graphql/schema/field/scope_extension.rb +19 -7
  159. data/lib/graphql/schema/field.rb +245 -119
  160. data/lib/graphql/schema/field_extension.rb +12 -9
  161. data/lib/graphql/schema/has_single_input_argument.rb +160 -0
  162. data/lib/graphql/schema/input_object.rb +123 -65
  163. data/lib/graphql/schema/interface.rb +60 -16
  164. data/lib/graphql/schema/introspection_system.rb +8 -17
  165. data/lib/graphql/schema/late_bound_type.rb +4 -0
  166. data/lib/graphql/schema/list.rb +8 -4
  167. data/lib/graphql/schema/loader.rb +3 -4
  168. data/lib/graphql/schema/member/base_dsl_methods.rb +18 -12
  169. data/lib/graphql/schema/member/has_arguments.rb +132 -100
  170. data/lib/graphql/schema/member/has_authorization.rb +35 -0
  171. data/lib/graphql/schema/member/has_dataloader.rb +99 -0
  172. data/lib/graphql/schema/member/has_deprecation_reason.rb +15 -0
  173. data/lib/graphql/schema/member/has_directives.rb +5 -5
  174. data/lib/graphql/schema/member/has_fields.rb +121 -17
  175. data/lib/graphql/schema/member/has_interfaces.rb +27 -13
  176. data/lib/graphql/schema/member/has_unresolved_type_error.rb +5 -1
  177. data/lib/graphql/schema/member/has_validators.rb +1 -1
  178. data/lib/graphql/schema/member/relay_shortcuts.rb +1 -1
  179. data/lib/graphql/schema/member/scoped.rb +19 -0
  180. data/lib/graphql/schema/member/type_system_helpers.rb +18 -5
  181. data/lib/graphql/schema/member/validates_input.rb +3 -3
  182. data/lib/graphql/schema/member.rb +6 -0
  183. data/lib/graphql/schema/mutation.rb +7 -0
  184. data/lib/graphql/schema/non_null.rb +1 -1
  185. data/lib/graphql/schema/object.rb +34 -8
  186. data/lib/graphql/schema/printer.rb +9 -7
  187. data/lib/graphql/schema/ractor_shareable.rb +79 -0
  188. data/lib/graphql/schema/relay_classic_mutation.rb +6 -129
  189. data/lib/graphql/schema/resolver.rb +128 -32
  190. data/lib/graphql/schema/scalar.rb +4 -9
  191. data/lib/graphql/schema/subscription.rb +63 -12
  192. data/lib/graphql/schema/timeout.rb +19 -2
  193. data/lib/graphql/schema/type_expression.rb +2 -2
  194. data/lib/graphql/schema/union.rb +2 -2
  195. data/lib/graphql/schema/unique_within_type.rb +1 -1
  196. data/lib/graphql/schema/validator/all_validator.rb +62 -0
  197. data/lib/graphql/schema/validator/required_validator.rb +92 -11
  198. data/lib/graphql/schema/validator.rb +3 -1
  199. data/lib/graphql/schema/visibility/migration.rb +188 -0
  200. data/lib/graphql/schema/visibility/profile.rb +464 -0
  201. data/lib/graphql/schema/visibility/visit.rb +190 -0
  202. data/lib/graphql/schema/visibility.rb +311 -0
  203. data/lib/graphql/schema/warden.rb +275 -103
  204. data/lib/graphql/schema/wrapper.rb +7 -1
  205. data/lib/graphql/schema.rb +954 -212
  206. data/lib/graphql/static_validation/all_rules.rb +3 -3
  207. data/lib/graphql/static_validation/base_visitor.rb +96 -71
  208. data/lib/graphql/static_validation/literal_validator.rb +6 -7
  209. data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +2 -2
  210. data/lib/graphql/static_validation/rules/argument_names_are_unique.rb +18 -6
  211. data/lib/graphql/static_validation/rules/arguments_are_defined.rb +6 -2
  212. data/lib/graphql/static_validation/rules/directives_are_defined.rb +6 -3
  213. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +2 -0
  214. data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +14 -3
  215. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +59 -15
  216. data/lib/graphql/static_validation/rules/fields_will_merge.rb +391 -262
  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 +6 -6
  219. data/lib/graphql/static_validation/rules/fragment_types_exist.rb +15 -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/query_root_exists.rb +1 -1
  225. data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +28 -8
  226. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +5 -5
  227. data/lib/graphql/static_validation/rules/subscription_root_exists_and_single_subscription_selection.rb +26 -0
  228. data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +7 -3
  229. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +18 -27
  230. data/lib/graphql/static_validation/rules/variable_names_are_unique.rb +1 -1
  231. data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +2 -2
  232. data/lib/graphql/static_validation/rules/variables_are_input_types.rb +14 -2
  233. data/lib/graphql/static_validation/validation_context.rb +22 -6
  234. data/lib/graphql/static_validation/validator.rb +9 -1
  235. data/lib/graphql/static_validation.rb +0 -1
  236. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +8 -5
  237. data/lib/graphql/subscriptions/broadcast_analyzer.rb +11 -5
  238. data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +45 -19
  239. data/lib/graphql/subscriptions/event.rb +22 -4
  240. data/lib/graphql/subscriptions/serialize.rb +3 -1
  241. data/lib/graphql/subscriptions.rb +56 -17
  242. data/lib/graphql/testing/helpers.rb +161 -0
  243. data/lib/graphql/testing/mock_action_cable.rb +111 -0
  244. data/lib/graphql/testing.rb +3 -0
  245. data/lib/graphql/tracing/active_support_notifications_trace.rb +14 -3
  246. data/lib/graphql/tracing/active_support_notifications_tracing.rb +1 -1
  247. data/lib/graphql/tracing/appoptics_trace.rb +11 -3
  248. data/lib/graphql/tracing/appoptics_tracing.rb +9 -2
  249. data/lib/graphql/tracing/appsignal_trace.rb +32 -55
  250. data/lib/graphql/tracing/appsignal_tracing.rb +2 -0
  251. data/lib/graphql/tracing/call_legacy_tracers.rb +66 -0
  252. data/lib/graphql/tracing/data_dog_trace.rb +46 -158
  253. data/lib/graphql/tracing/data_dog_tracing.rb +2 -0
  254. data/lib/graphql/tracing/detailed_trace/active_record_backend.rb +74 -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 +156 -0
  258. data/lib/graphql/tracing/legacy_hooks_trace.rb +75 -0
  259. data/lib/graphql/tracing/legacy_trace.rb +4 -61
  260. data/lib/graphql/tracing/monitor_trace.rb +283 -0
  261. data/lib/graphql/tracing/new_relic_trace.rb +47 -54
  262. data/lib/graphql/tracing/new_relic_tracing.rb +2 -0
  263. data/lib/graphql/tracing/notifications_trace.rb +184 -34
  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 +864 -0
  269. data/lib/graphql/tracing/platform_trace.rb +5 -0
  270. data/lib/graphql/tracing/platform_tracing.rb +3 -1
  271. data/lib/graphql/tracing/{prometheus_tracing → prometheus_trace}/graphql_collector.rb +5 -1
  272. data/lib/graphql/tracing/prometheus_trace.rb +72 -68
  273. data/lib/graphql/tracing/prometheus_tracing.rb +2 -0
  274. data/lib/graphql/tracing/scout_trace.rb +32 -55
  275. data/lib/graphql/tracing/scout_tracing.rb +2 -0
  276. data/lib/graphql/tracing/sentry_trace.rb +82 -0
  277. data/lib/graphql/tracing/statsd_trace.rb +33 -41
  278. data/lib/graphql/tracing/statsd_tracing.rb +2 -0
  279. data/lib/graphql/tracing/trace.rb +118 -1
  280. data/lib/graphql/tracing.rb +31 -28
  281. data/lib/graphql/type_kinds.rb +2 -1
  282. data/lib/graphql/types/iso_8601_duration.rb +77 -0
  283. data/lib/graphql/types/relay/connection_behaviors.rb +45 -3
  284. data/lib/graphql/types/relay/edge_behaviors.rb +19 -1
  285. data/lib/graphql/types/relay/has_node_field.rb +13 -8
  286. data/lib/graphql/types/relay/has_nodes_field.rb +13 -8
  287. data/lib/graphql/types/relay/node_behaviors.rb +13 -2
  288. data/lib/graphql/types/relay/page_info_behaviors.rb +4 -0
  289. data/lib/graphql/types.rb +18 -10
  290. data/lib/graphql/unauthorized_enum_value_error.rb +13 -0
  291. data/lib/graphql/unauthorized_error.rb +9 -1
  292. data/lib/graphql/version.rb +1 -1
  293. data/lib/graphql.rb +69 -54
  294. data/readme.md +12 -2
  295. metadata +236 -40
  296. data/lib/graphql/analysis/ast/analyzer.rb +0 -84
  297. data/lib/graphql/analysis/ast/field_usage.rb +0 -57
  298. data/lib/graphql/analysis/ast/max_query_complexity.rb +0 -22
  299. data/lib/graphql/analysis/ast/max_query_depth.rb +0 -22
  300. data/lib/graphql/analysis/ast/query_complexity.rb +0 -230
  301. data/lib/graphql/analysis/ast/query_depth.rb +0 -55
  302. data/lib/graphql/analysis/ast/visitor.rb +0 -276
  303. data/lib/graphql/analysis/ast.rb +0 -81
  304. data/lib/graphql/backtrace/inspect_result.rb +0 -50
  305. data/lib/graphql/backtrace/trace.rb +0 -96
  306. data/lib/graphql/backtrace/tracer.rb +0 -80
  307. data/lib/graphql/deprecation.rb +0 -9
  308. data/lib/graphql/filter.rb +0 -59
  309. data/lib/graphql/language/parser.y +0 -560
  310. data/lib/graphql/language/token.rb +0 -34
  311. data/lib/graphql/schema/base_64_bp.rb +0 -26
  312. data/lib/graphql/schema/invalid_type_error.rb +0 -7
  313. data/lib/graphql/schema/null_mask.rb +0 -11
  314. data/lib/graphql/static_validation/rules/subscription_root_exists.rb +0 -17
  315. data/lib/graphql/static_validation/type_stack.rb +0 -216
  316. data/lib/graphql/subscriptions/instrumentation.rb +0 -28
@@ -16,30 +16,33 @@ module GraphQL
16
16
  # @return [Integer] The first line of the definition (not the description)
17
17
  attr_reader :definition_line
18
18
 
19
- def initialize(options = {})
20
- @definition_line = options.delete(:definition_line)
21
- super(options)
19
+ def initialize(definition_line: nil, **_rest)
20
+ @definition_line = definition_line
21
+ super(**_rest)
22
22
  end
23
- end
24
23
 
25
- attr_reader :line, :col, :filename
24
+ def marshal_dump
25
+ super << @definition_line
26
+ end
26
27
 
27
- # Initialize a node by extracting its position,
28
- # then calling the class's `initialize_node` method.
29
- # @param options [Hash] Initial attributes for this node
30
- def initialize(options = {})
31
- if options.key?(:position_source)
32
- position_source = options.delete(:position_source)
33
- @line = position_source[1]
34
- @col = position_source[2]
35
- else
36
- @line = options.delete(:line)
37
- @col = options.delete(:col)
28
+ def marshal_load(values)
29
+ @definition_line = values.pop
30
+ super
38
31
  end
32
+ end
33
+
34
+ attr_reader :filename
39
35
 
40
- @filename = options.delete(:filename)
36
+ def line
37
+ @line ||= @source&.line_at(@pos)
38
+ end
41
39
 
42
- initialize_node(**options)
40
+ def col
41
+ @col ||= @source&.column_at(@pos)
42
+ end
43
+
44
+ def definition_line
45
+ @definition_line ||= (@source && @definition_pos) ? @source.line_at(@definition_pos) : nil
43
46
  end
44
47
 
45
48
  # Value equality
@@ -80,7 +83,11 @@ module GraphQL
80
83
 
81
84
  def to_query_string(printer: GraphQL::Language::Printer.new)
82
85
  if printer.is_a?(GraphQL::Language::Printer)
83
- @query_string ||= printer.print(self)
86
+ if frozen?
87
+ @query_string || printer.print(self)
88
+ else
89
+ @query_string ||= printer.print(self)
90
+ end
84
91
  else
85
92
  printer.print(self)
86
93
  end
@@ -138,6 +145,8 @@ module GraphQL
138
145
  end
139
146
 
140
147
  class << self
148
+ # rubocop:disable Development/NoEvalCop This eval takes static inputs at load-time
149
+
141
150
  # Add a default `#visit_method` and `#children_method_name` using the class name
142
151
  def inherited(child_class)
143
152
  super
@@ -196,8 +205,8 @@ module GraphQL
196
205
  module_eval <<-RUBY, __FILE__, __LINE__
197
206
  # Singular method: create a node with these options
198
207
  # and return a new `self` which includes that node in this list.
199
- def merge_#{method_name.to_s.sub(/s$/, "")}(node_opts)
200
- merge(#{method_name}: #{method_name} + [#{node_type.name}.new(node_opts)])
208
+ def merge_#{method_name.to_s.sub(/s$/, "")}(**node_opts)
209
+ merge(#{method_name}: #{method_name} + [#{node_type.name}.new(**node_opts)])
201
210
  end
202
211
  RUBY
203
212
  end
@@ -226,13 +235,14 @@ module GraphQL
226
235
  end
227
236
 
228
237
  if defined?(@scalar_methods)
229
- if !method_defined?(:initialize_node)
230
- generate_initialize_node
238
+ if !@initialize_was_generated
239
+ @initialize_was_generated = true
240
+ generate_initialize
231
241
  else
232
242
  # This method was defined manually
233
243
  end
234
244
  else
235
- raise "Can't generate_initialize_node because scalar_methods wasn't called; call it before children_methods"
245
+ raise "Can't generate_initialize because scalar_methods wasn't called; call it before children_methods"
236
246
  end
237
247
  end
238
248
 
@@ -261,41 +271,85 @@ module GraphQL
261
271
  end
262
272
  end
263
273
 
264
- def generate_initialize_node
274
+ DEFAULT_INITIALIZE_OPTIONS = [
275
+ "line: nil",
276
+ "col: nil",
277
+ "pos: nil",
278
+ "filename: nil",
279
+ "source: nil"
280
+ ]
281
+
282
+ IGNORED_MARSHALLING_KEYWORDS = [:comment]
283
+
284
+ def generate_initialize
285
+ return if method_defined?(:marshal_load, false) # checking for `:initialize` doesn't work right
286
+
265
287
  scalar_method_names = @scalar_methods
266
288
  # TODO: These probably should be scalar methods, but `types` returns an array
267
- [:types, :description].each do |extra_method|
289
+ [:types, :description, :comment].each do |extra_method|
268
290
  if method_defined?(extra_method)
269
291
  scalar_method_names += [extra_method]
270
292
  end
271
293
  end
272
294
 
273
- all_method_names = scalar_method_names + @children_methods.keys
295
+ children_method_names = @children_methods.keys
296
+
297
+ all_method_names = scalar_method_names + children_method_names
274
298
  if all_method_names.include?(:alias)
275
299
  # Rather than complicating this special case,
276
300
  # let it be overridden (in field)
277
301
  return
278
302
  else
279
303
  arguments = scalar_method_names.map { |m| "#{m}: nil"} +
280
- @children_methods.keys.map { |m| "#{m}: NO_CHILDREN" }
304
+ children_method_names.map { |m| "#{m}: NO_CHILDREN" } +
305
+ DEFAULT_INITIALIZE_OPTIONS
281
306
 
282
307
  assignments = scalar_method_names.map { |m| "@#{m} = #{m}"} +
283
- @children_methods.keys.map { |m| "@#{m} = #{m}.freeze" }
308
+ children_method_names.map { |m| "@#{m} = #{m}.freeze" }
309
+
310
+ if name.end_with?("Definition") && name != "FragmentDefinition"
311
+ arguments << "definition_pos: nil"
312
+ assignments << "@definition_pos = definition_pos"
313
+ end
284
314
 
285
315
  keywords = scalar_method_names.map { |m| "#{m}: #{m}"} +
286
- @children_methods.keys.map { |m| "#{m}: #{m}" }
316
+ children_method_names.map { |m| "#{m}: #{m}" }
317
+
318
+ ignored_keywords = IGNORED_MARSHALLING_KEYWORDS.map do |keyword|
319
+ "#{keyword.to_s}: nil"
320
+ end
321
+
322
+ marshalling_method_names = all_method_names - IGNORED_MARSHALLING_KEYWORDS
287
323
 
288
324
  module_eval <<-RUBY, __FILE__, __LINE__
289
- def initialize_node #{arguments.join(", ")}
325
+ def initialize(#{arguments.join(", ")})
326
+ @line = line
327
+ @col = col
328
+ @pos = pos
329
+ @filename = filename
330
+ @source = source
290
331
  #{assignments.join("\n")}
291
332
  end
292
333
 
293
- def self.from_a(filename, line, col, #{(scalar_method_names + @children_methods.keys).join(", ")})
334
+ def self.from_a(filename, line, col, #{marshalling_method_names.join(", ")}, #{ignored_keywords.join(", ")})
294
335
  self.new(filename: filename, line: line, col: col, #{keywords.join(", ")})
295
336
  end
337
+
338
+ def marshal_dump
339
+ [
340
+ line, col, # use methods here to force them to be calculated
341
+ @filename,
342
+ #{marshalling_method_names.map { |n| "@#{n}," }.join}
343
+ ]
344
+ end
345
+
346
+ def marshal_load(values)
347
+ @line, @col, @filename #{marshalling_method_names.map { |n| ", @#{n}"}.join} = values
348
+ end
296
349
  RUBY
297
350
  end
298
351
  end
352
+ # rubocop:enable Development/NoEvalCop
299
353
  end
300
354
  end
301
355
 
@@ -323,7 +377,7 @@ module GraphQL
323
377
  # @return [String, Float, Integer, Boolean, Array, InputObject, VariableIdentifier] The value passed for this key
324
378
 
325
379
  def children
326
- @children ||= Array(value).flatten.select { |v| v.is_a?(AbstractNode) }
380
+ @children ||= Array(value).flatten.tap { _1.select! { |v| v.is_a?(AbstractNode) } }
327
381
  end
328
382
  end
329
383
 
@@ -336,13 +390,13 @@ module GraphQL
336
390
  end
337
391
 
338
392
  class DirectiveDefinition < AbstractNode
339
- include DefinitionNode
340
393
  attr_reader :description
341
394
  scalar_methods :name, :repeatable
342
395
  children_methods(
343
396
  arguments: Nodes::Argument,
344
397
  locations: Nodes::DirectiveLocation,
345
398
  )
399
+ self.children_method_name = :definitions
346
400
  end
347
401
 
348
402
  # An enum value. The string is available as {#name}.
@@ -355,6 +409,32 @@ module GraphQL
355
409
 
356
410
  # A single selection in a GraphQL query.
357
411
  class Field < AbstractNode
412
+ def initialize(name: nil, arguments: NONE, directives: NONE, selections: NONE, field_alias: nil, line: nil, col: nil, pos: nil, filename: nil, source: nil)
413
+ @name = name
414
+ @arguments = arguments || NONE
415
+ @directives = directives || NONE
416
+ @selections = selections || NONE
417
+ # oops, alias is a keyword:
418
+ @alias = field_alias
419
+ @line = line
420
+ @col = col
421
+ @pos = pos
422
+ @filename = filename
423
+ @source = source
424
+ end
425
+
426
+ def self.from_a(filename, line, col, field_alias, name, arguments, directives, selections) # rubocop:disable Metrics/ParameterLists
427
+ self.new(filename: filename, line: line, col: col, field_alias: field_alias, name: name, arguments: arguments, directives: directives, selections: selections)
428
+ end
429
+
430
+ def marshal_dump
431
+ [line, col, @filename, @name, @arguments, @directives, @selections, @alias]
432
+ end
433
+
434
+ def marshal_load(values)
435
+ @line, @col, @filename, @name, @arguments, @directives, @selections, @alias = values
436
+ end
437
+
358
438
  scalar_methods :name, :alias
359
439
  children_methods({
360
440
  arguments: GraphQL::Language::Nodes::Argument,
@@ -362,44 +442,36 @@ module GraphQL
362
442
  directives: GraphQL::Language::Nodes::Directive,
363
443
  })
364
444
 
365
- # @!attribute selections
366
- # @return [Array<Nodes::Field>] Selections on this object (or empty array if this is a scalar field)
367
-
368
- def initialize_node(attributes)
369
- @name = attributes[:name]
370
- @arguments = attributes[:arguments] || NONE
371
- @directives = attributes[:directives] || NONE
372
- @selections = attributes[:selections] || NONE
373
- # oops, alias is a keyword:
374
- @alias = attributes[:alias]
375
- end
376
-
377
- def self.from_a(filename, line, col, graphql_alias, name, arguments, directives, selections) # rubocop:disable Metrics/ParameterLists
378
- self.new(filename: filename, line: line, col: col, alias: graphql_alias, name: name, arguments: arguments, directives: directives, selections: selections)
379
- end
380
-
381
445
  # Override this because default is `:fields`
382
446
  self.children_method_name = :selections
383
447
  end
384
448
 
385
449
  # A reusable fragment, defined at document-level.
386
450
  class FragmentDefinition < AbstractNode
387
- # @!attribute name
388
- # @return [String] the identifier for this fragment, which may be applied with `...#{name}`
389
-
390
- # @!attribute type
391
- # @return [String] the type condition for this fragment (name of type which it may apply to)
392
- def initialize_node(name: nil, type: nil, directives: [], selections: [])
451
+ def initialize(name: nil, type: nil, directives: NONE, selections: NONE, filename: nil, pos: nil, source: nil, line: nil, col: nil)
393
452
  @name = name
394
453
  @type = type
395
454
  @directives = directives
396
455
  @selections = selections
456
+ @filename = filename
457
+ @pos = pos
458
+ @source = source
459
+ @line = line
460
+ @col = col
397
461
  end
398
462
 
399
463
  def self.from_a(filename, line, col, name, type, directives, selections)
400
464
  self.new(filename: filename, line: line, col: col, name: name, type: type, directives: directives, selections: selections)
401
465
  end
402
466
 
467
+ def marshal_dump
468
+ [line, col, @filename, @name, @type, @directives, @selections]
469
+ end
470
+
471
+ def marshal_load(values)
472
+ @line, @col, @filename, @name, @type, @directives, @selections = values
473
+ end
474
+
403
475
  scalar_methods :name, :type
404
476
  children_methods({
405
477
  selections: GraphQL::Language::Nodes::Field,
@@ -484,7 +556,7 @@ module GraphQL
484
556
  # An operation-level query variable
485
557
  class VariableDefinition < AbstractNode
486
558
  scalar_methods :name, :type, :default_value
487
- children_methods false
559
+ children_methods(directives: Directive)
488
560
  # @!attribute default_value
489
561
  # @return [String, Integer, Float, Boolean, Array, NullValue] A Ruby value to use if no other value is provided
490
562
 
@@ -535,7 +607,7 @@ module GraphQL
535
607
  # @example Creating a custom string from a document
536
608
  # class VariableScrubber < GraphQL::Language::Printer
537
609
  # def print_argument(arg)
538
- # "#{arg.name}: <HIDDEN>"
610
+ # print_string("#{arg.name}: <HIDDEN>")
539
611
  # end
540
612
  # end
541
613
  #
@@ -562,7 +634,6 @@ module GraphQL
562
634
  end
563
635
 
564
636
  class SchemaDefinition < AbstractNode
565
- include DefinitionNode
566
637
  scalar_methods :query, :mutation, :subscription
567
638
  children_methods({
568
639
  directives: GraphQL::Language::Nodes::Directive,
@@ -579,8 +650,7 @@ module GraphQL
579
650
  end
580
651
 
581
652
  class ScalarTypeDefinition < AbstractNode
582
- include DefinitionNode
583
- attr_reader :description
653
+ attr_reader :description, :comment
584
654
  scalar_methods :name
585
655
  children_methods({
586
656
  directives: GraphQL::Language::Nodes::Directive,
@@ -597,8 +667,7 @@ module GraphQL
597
667
  end
598
668
 
599
669
  class InputValueDefinition < AbstractNode
600
- include DefinitionNode
601
- attr_reader :description
670
+ attr_reader :description, :comment
602
671
  scalar_methods :name, :type, :default_value
603
672
  children_methods({
604
673
  directives: GraphQL::Language::Nodes::Directive,
@@ -607,8 +676,7 @@ module GraphQL
607
676
  end
608
677
 
609
678
  class FieldDefinition < AbstractNode
610
- include DefinitionNode
611
- attr_reader :description
679
+ attr_reader :description, :comment
612
680
  scalar_methods :name, :type
613
681
  children_methods({
614
682
  arguments: GraphQL::Language::Nodes::InputValueDefinition,
@@ -628,8 +696,7 @@ module GraphQL
628
696
  end
629
697
 
630
698
  class ObjectTypeDefinition < AbstractNode
631
- include DefinitionNode
632
- attr_reader :description
699
+ attr_reader :description, :comment
633
700
  scalar_methods :name, :interfaces
634
701
  children_methods({
635
702
  directives: GraphQL::Language::Nodes::Directive,
@@ -648,8 +715,7 @@ module GraphQL
648
715
  end
649
716
 
650
717
  class InterfaceTypeDefinition < AbstractNode
651
- include DefinitionNode
652
- attr_reader :description
718
+ attr_reader :description, :comment
653
719
  scalar_methods :name
654
720
  children_methods({
655
721
  interfaces: GraphQL::Language::Nodes::TypeName,
@@ -670,8 +736,7 @@ module GraphQL
670
736
  end
671
737
 
672
738
  class UnionTypeDefinition < AbstractNode
673
- include DefinitionNode
674
- attr_reader :description, :types
739
+ attr_reader :description, :comment, :types
675
740
  scalar_methods :name
676
741
  children_methods({
677
742
  directives: GraphQL::Language::Nodes::Directive,
@@ -689,8 +754,7 @@ module GraphQL
689
754
  end
690
755
 
691
756
  class EnumValueDefinition < AbstractNode
692
- include DefinitionNode
693
- attr_reader :description
757
+ attr_reader :description, :comment
694
758
  scalar_methods :name
695
759
  children_methods({
696
760
  directives: GraphQL::Language::Nodes::Directive,
@@ -699,8 +763,7 @@ module GraphQL
699
763
  end
700
764
 
701
765
  class EnumTypeDefinition < AbstractNode
702
- include DefinitionNode
703
- attr_reader :description
766
+ attr_reader :description, :comment
704
767
  scalar_methods :name
705
768
  children_methods({
706
769
  directives: GraphQL::Language::Nodes::Directive,
@@ -719,8 +782,7 @@ module GraphQL
719
782
  end
720
783
 
721
784
  class InputObjectTypeDefinition < AbstractNode
722
- include DefinitionNode
723
- attr_reader :description
785
+ attr_reader :description, :comment
724
786
  scalar_methods :name
725
787
  children_methods({
726
788
  directives: GraphQL::Language::Nodes::Directive,