graphql 2.0.32 → 2.5.22

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 (308) 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 +95 -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/interpreter/argument_value.rb +5 -1
  83. data/lib/graphql/execution/interpreter/arguments_cache.rb +5 -10
  84. data/lib/graphql/execution/interpreter/resolve.rb +23 -25
  85. data/lib/graphql/execution/interpreter/runtime/graphql_result.rb +228 -0
  86. data/lib/graphql/execution/interpreter/runtime.rb +363 -434
  87. data/lib/graphql/execution/interpreter.rb +91 -164
  88. data/lib/graphql/execution/lookahead.rb +105 -31
  89. data/lib/graphql/execution/multiplex.rb +7 -6
  90. data/lib/graphql/execution/next/field_resolve_step.rb +711 -0
  91. data/lib/graphql/execution/next/load_argument_step.rb +60 -0
  92. data/lib/graphql/execution/next/prepare_object_step.rb +129 -0
  93. data/lib/graphql/execution/next/runner.rb +389 -0
  94. data/lib/graphql/execution/next/selections_step.rb +37 -0
  95. data/lib/graphql/execution/next.rb +70 -0
  96. data/lib/graphql/execution.rb +1 -0
  97. data/lib/graphql/execution_error.rb +13 -10
  98. data/lib/graphql/introspection/directive_location_enum.rb +1 -1
  99. data/lib/graphql/introspection/directive_type.rb +7 -3
  100. data/lib/graphql/introspection/dynamic_fields.rb +5 -1
  101. data/lib/graphql/introspection/entry_points.rb +20 -6
  102. data/lib/graphql/introspection/enum_value_type.rb +5 -5
  103. data/lib/graphql/introspection/field_type.rb +13 -5
  104. data/lib/graphql/introspection/input_value_type.rb +21 -13
  105. data/lib/graphql/introspection/schema_type.rb +8 -11
  106. data/lib/graphql/introspection/type_type.rb +64 -28
  107. data/lib/graphql/invalid_name_error.rb +1 -1
  108. data/lib/graphql/invalid_null_error.rb +26 -17
  109. data/lib/graphql/language/block_string.rb +34 -18
  110. data/lib/graphql/language/cache.rb +13 -0
  111. data/lib/graphql/language/comment.rb +18 -0
  112. data/lib/graphql/language/definition_slice.rb +1 -1
  113. data/lib/graphql/language/document_from_schema_definition.rb +90 -61
  114. data/lib/graphql/language/lexer.rb +319 -193
  115. data/lib/graphql/language/nodes.rb +136 -77
  116. data/lib/graphql/language/parser.rb +807 -1985
  117. data/lib/graphql/language/printer.rb +324 -151
  118. data/lib/graphql/language/sanitized_printer.rb +21 -23
  119. data/lib/graphql/language/static_visitor.rb +171 -0
  120. data/lib/graphql/language/visitor.rb +23 -83
  121. data/lib/graphql/language.rb +71 -1
  122. data/lib/graphql/load_application_object_failed_error.rb +5 -1
  123. data/lib/graphql/pagination/array_connection.rb +6 -6
  124. data/lib/graphql/pagination/connection.rb +30 -1
  125. data/lib/graphql/pagination/connections.rb +32 -0
  126. data/lib/graphql/pagination/mongoid_relation_connection.rb +1 -2
  127. data/lib/graphql/query/context/scoped_context.rb +101 -0
  128. data/lib/graphql/query/context.rb +82 -144
  129. data/lib/graphql/query/null_context.rb +15 -18
  130. data/lib/graphql/query/partial.rb +179 -0
  131. data/lib/graphql/query/validation_pipeline.rb +4 -4
  132. data/lib/graphql/query/variable_validation_error.rb +1 -1
  133. data/lib/graphql/query/variables.rb +3 -3
  134. data/lib/graphql/query.rb +126 -81
  135. data/lib/graphql/railtie.rb +16 -6
  136. data/lib/graphql/rake_task.rb +3 -12
  137. data/lib/graphql/rubocop/graphql/base_cop.rb +1 -1
  138. data/lib/graphql/rubocop/graphql/field_type_in_block.rb +144 -0
  139. data/lib/graphql/rubocop/graphql/root_types_in_block.rb +38 -0
  140. data/lib/graphql/rubocop.rb +2 -0
  141. data/lib/graphql/schema/addition.rb +26 -13
  142. data/lib/graphql/schema/always_visible.rb +7 -2
  143. data/lib/graphql/schema/argument.rb +75 -9
  144. data/lib/graphql/schema/base_64_encoder.rb +3 -5
  145. data/lib/graphql/schema/build_from_definition.rb +123 -60
  146. data/lib/graphql/schema/directive/flagged.rb +4 -2
  147. data/lib/graphql/schema/directive/one_of.rb +12 -0
  148. data/lib/graphql/schema/directive/specified_by.rb +14 -0
  149. data/lib/graphql/schema/directive.rb +54 -2
  150. data/lib/graphql/schema/enum.rb +110 -27
  151. data/lib/graphql/schema/enum_value.rb +10 -2
  152. data/lib/graphql/schema/field/connection_extension.rb +15 -49
  153. data/lib/graphql/schema/field/scope_extension.rb +23 -7
  154. data/lib/graphql/schema/field.rb +245 -118
  155. data/lib/graphql/schema/field_extension.rb +34 -1
  156. data/lib/graphql/schema/has_single_input_argument.rb +160 -0
  157. data/lib/graphql/schema/input_object.rb +116 -60
  158. data/lib/graphql/schema/interface.rb +34 -16
  159. data/lib/graphql/schema/introspection_system.rb +8 -17
  160. data/lib/graphql/schema/late_bound_type.rb +4 -0
  161. data/lib/graphql/schema/list.rb +3 -3
  162. data/lib/graphql/schema/loader.rb +3 -4
  163. data/lib/graphql/schema/member/base_dsl_methods.rb +18 -2
  164. data/lib/graphql/schema/member/has_arguments.rb +132 -100
  165. data/lib/graphql/schema/member/has_authorization.rb +35 -0
  166. data/lib/graphql/schema/member/has_dataloader.rb +99 -0
  167. data/lib/graphql/schema/member/has_deprecation_reason.rb +15 -0
  168. data/lib/graphql/schema/member/has_directives.rb +4 -4
  169. data/lib/graphql/schema/member/has_fields.rb +115 -15
  170. data/lib/graphql/schema/member/has_interfaces.rb +26 -12
  171. data/lib/graphql/schema/member/has_unresolved_type_error.rb +5 -1
  172. data/lib/graphql/schema/member/has_validators.rb +1 -1
  173. data/lib/graphql/schema/member/relay_shortcuts.rb +1 -1
  174. data/lib/graphql/schema/member/scoped.rb +19 -0
  175. data/lib/graphql/schema/member/type_system_helpers.rb +17 -4
  176. data/lib/graphql/schema/member/validates_input.rb +3 -3
  177. data/lib/graphql/schema/member.rb +6 -0
  178. data/lib/graphql/schema/mutation.rb +7 -0
  179. data/lib/graphql/schema/object.rb +34 -8
  180. data/lib/graphql/schema/printer.rb +9 -7
  181. data/lib/graphql/schema/ractor_shareable.rb +79 -0
  182. data/lib/graphql/schema/relay_classic_mutation.rb +6 -129
  183. data/lib/graphql/schema/resolver.rb +90 -32
  184. data/lib/graphql/schema/scalar.rb +4 -9
  185. data/lib/graphql/schema/subscription.rb +63 -10
  186. data/lib/graphql/schema/timeout.rb +19 -2
  187. data/lib/graphql/schema/type_expression.rb +2 -2
  188. data/lib/graphql/schema/union.rb +2 -2
  189. data/lib/graphql/schema/unique_within_type.rb +1 -1
  190. data/lib/graphql/schema/validator/all_validator.rb +62 -0
  191. data/lib/graphql/schema/validator/required_validator.rb +92 -11
  192. data/lib/graphql/schema/validator.rb +3 -1
  193. data/lib/graphql/schema/visibility/migration.rb +188 -0
  194. data/lib/graphql/schema/visibility/profile.rb +445 -0
  195. data/lib/graphql/schema/visibility/visit.rb +190 -0
  196. data/lib/graphql/schema/visibility.rb +311 -0
  197. data/lib/graphql/schema/warden.rb +275 -103
  198. data/lib/graphql/schema.rb +950 -210
  199. data/lib/graphql/static_validation/all_rules.rb +3 -3
  200. data/lib/graphql/static_validation/base_visitor.rb +7 -6
  201. data/lib/graphql/static_validation/literal_validator.rb +6 -7
  202. data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +1 -1
  203. data/lib/graphql/static_validation/rules/argument_names_are_unique.rb +1 -1
  204. data/lib/graphql/static_validation/rules/arguments_are_defined.rb +3 -2
  205. data/lib/graphql/static_validation/rules/directives_are_defined.rb +3 -3
  206. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +2 -0
  207. data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +12 -2
  208. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +47 -13
  209. data/lib/graphql/static_validation/rules/fields_will_merge.rb +88 -25
  210. data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +10 -2
  211. data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +3 -3
  212. data/lib/graphql/static_validation/rules/fragment_types_exist.rb +12 -2
  213. data/lib/graphql/static_validation/rules/fragments_are_on_composite_types.rb +1 -1
  214. data/lib/graphql/static_validation/rules/mutation_root_exists.rb +1 -1
  215. data/lib/graphql/static_validation/rules/no_definitions_are_present.rb +1 -1
  216. data/lib/graphql/static_validation/rules/not_single_subscription_error.rb +25 -0
  217. data/lib/graphql/static_validation/rules/query_root_exists.rb +1 -1
  218. data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +5 -5
  219. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +5 -5
  220. data/lib/graphql/static_validation/rules/subscription_root_exists_and_single_subscription_selection.rb +26 -0
  221. data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +7 -3
  222. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +18 -27
  223. data/lib/graphql/static_validation/rules/variable_names_are_unique.rb +1 -1
  224. data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +2 -2
  225. data/lib/graphql/static_validation/rules/variables_are_input_types.rb +11 -2
  226. data/lib/graphql/static_validation/validation_context.rb +21 -5
  227. data/lib/graphql/static_validation/validator.rb +9 -1
  228. data/lib/graphql/static_validation.rb +0 -1
  229. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +8 -5
  230. data/lib/graphql/subscriptions/broadcast_analyzer.rb +11 -5
  231. data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +12 -10
  232. data/lib/graphql/subscriptions/event.rb +21 -4
  233. data/lib/graphql/subscriptions/serialize.rb +3 -1
  234. data/lib/graphql/subscriptions.rb +21 -17
  235. data/lib/graphql/testing/helpers.rb +161 -0
  236. data/lib/graphql/testing/mock_action_cable.rb +111 -0
  237. data/lib/graphql/testing.rb +3 -0
  238. data/lib/graphql/tracing/active_support_notifications_trace.rb +14 -3
  239. data/lib/graphql/tracing/active_support_notifications_tracing.rb +1 -1
  240. data/lib/graphql/tracing/appoptics_trace.rb +7 -3
  241. data/lib/graphql/tracing/appoptics_tracing.rb +9 -2
  242. data/lib/graphql/tracing/appsignal_trace.rb +32 -59
  243. data/lib/graphql/tracing/appsignal_tracing.rb +2 -0
  244. data/lib/graphql/tracing/call_legacy_tracers.rb +66 -0
  245. data/lib/graphql/tracing/data_dog_trace.rb +46 -162
  246. data/lib/graphql/tracing/data_dog_tracing.rb +2 -0
  247. data/lib/graphql/tracing/detailed_trace/active_record_backend.rb +74 -0
  248. data/lib/graphql/tracing/detailed_trace/memory_backend.rb +60 -0
  249. data/lib/graphql/tracing/detailed_trace/redis_backend.rb +72 -0
  250. data/lib/graphql/tracing/detailed_trace.rb +156 -0
  251. data/lib/graphql/tracing/legacy_hooks_trace.rb +75 -0
  252. data/lib/graphql/tracing/legacy_trace.rb +4 -61
  253. data/lib/graphql/tracing/monitor_trace.rb +283 -0
  254. data/lib/graphql/tracing/new_relic_trace.rb +47 -54
  255. data/lib/graphql/tracing/new_relic_tracing.rb +2 -0
  256. data/lib/graphql/tracing/notifications_trace.rb +183 -37
  257. data/lib/graphql/tracing/notifications_tracing.rb +2 -0
  258. data/lib/graphql/tracing/null_trace.rb +9 -0
  259. data/lib/graphql/tracing/perfetto_trace/trace.proto +141 -0
  260. data/lib/graphql/tracing/perfetto_trace/trace_pb.rb +33 -0
  261. data/lib/graphql/tracing/perfetto_trace.rb +864 -0
  262. data/lib/graphql/tracing/platform_tracing.rb +3 -1
  263. data/lib/graphql/tracing/{prometheus_tracing → prometheus_trace}/graphql_collector.rb +5 -1
  264. data/lib/graphql/tracing/prometheus_trace.rb +73 -73
  265. data/lib/graphql/tracing/prometheus_tracing.rb +2 -0
  266. data/lib/graphql/tracing/scout_trace.rb +32 -58
  267. data/lib/graphql/tracing/scout_tracing.rb +2 -0
  268. data/lib/graphql/tracing/sentry_trace.rb +82 -0
  269. data/lib/graphql/tracing/statsd_trace.rb +33 -45
  270. data/lib/graphql/tracing/statsd_tracing.rb +2 -0
  271. data/lib/graphql/tracing/trace.rb +112 -1
  272. data/lib/graphql/tracing.rb +31 -28
  273. data/lib/graphql/type_kinds.rb +2 -1
  274. data/lib/graphql/types/iso_8601_duration.rb +77 -0
  275. data/lib/graphql/types/relay/connection_behaviors.rb +44 -2
  276. data/lib/graphql/types/relay/edge_behaviors.rb +18 -0
  277. data/lib/graphql/types/relay/has_node_field.rb +13 -8
  278. data/lib/graphql/types/relay/has_nodes_field.rb +13 -8
  279. data/lib/graphql/types/relay/node_behaviors.rb +13 -2
  280. data/lib/graphql/types/relay/page_info_behaviors.rb +4 -0
  281. data/lib/graphql/types.rb +18 -10
  282. data/lib/graphql/unauthorized_enum_value_error.rb +13 -0
  283. data/lib/graphql/unauthorized_error.rb +5 -1
  284. data/lib/graphql/version.rb +1 -1
  285. data/lib/graphql.rb +71 -54
  286. data/readme.md +12 -2
  287. metadata +233 -37
  288. data/lib/graphql/analysis/ast/analyzer.rb +0 -84
  289. data/lib/graphql/analysis/ast/field_usage.rb +0 -57
  290. data/lib/graphql/analysis/ast/max_query_complexity.rb +0 -22
  291. data/lib/graphql/analysis/ast/max_query_depth.rb +0 -22
  292. data/lib/graphql/analysis/ast/query_complexity.rb +0 -230
  293. data/lib/graphql/analysis/ast/query_depth.rb +0 -55
  294. data/lib/graphql/analysis/ast/visitor.rb +0 -276
  295. data/lib/graphql/analysis/ast.rb +0 -81
  296. data/lib/graphql/backtrace/inspect_result.rb +0 -50
  297. data/lib/graphql/backtrace/trace.rb +0 -96
  298. data/lib/graphql/backtrace/tracer.rb +0 -80
  299. data/lib/graphql/deprecation.rb +0 -9
  300. data/lib/graphql/filter.rb +0 -59
  301. data/lib/graphql/language/parser.y +0 -560
  302. data/lib/graphql/language/token.rb +0 -34
  303. data/lib/graphql/schema/base_64_bp.rb +0 -26
  304. data/lib/graphql/schema/invalid_type_error.rb +0 -7
  305. data/lib/graphql/schema/null_mask.rb +0 -11
  306. data/lib/graphql/static_validation/rules/subscription_root_exists.rb +0 -17
  307. data/lib/graphql/static_validation/type_stack.rb +0 -216
  308. 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
@@ -198,8 +205,8 @@ module GraphQL
198
205
  module_eval <<-RUBY, __FILE__, __LINE__
199
206
  # Singular method: create a node with these options
200
207
  # and return a new `self` which includes that node in this list.
201
- def merge_#{method_name.to_s.sub(/s$/, "")}(node_opts)
202
- 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)])
203
210
  end
204
211
  RUBY
205
212
  end
@@ -228,13 +235,14 @@ module GraphQL
228
235
  end
229
236
 
230
237
  if defined?(@scalar_methods)
231
- if !method_defined?(:initialize_node)
232
- generate_initialize_node
238
+ if !@initialize_was_generated
239
+ @initialize_was_generated = true
240
+ generate_initialize
233
241
  else
234
242
  # This method was defined manually
235
243
  end
236
244
  else
237
- 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"
238
246
  end
239
247
  end
240
248
 
@@ -263,38 +271,81 @@ module GraphQL
263
271
  end
264
272
  end
265
273
 
266
- 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
+
267
287
  scalar_method_names = @scalar_methods
268
288
  # TODO: These probably should be scalar methods, but `types` returns an array
269
- [:types, :description].each do |extra_method|
289
+ [:types, :description, :comment].each do |extra_method|
270
290
  if method_defined?(extra_method)
271
291
  scalar_method_names += [extra_method]
272
292
  end
273
293
  end
274
294
 
275
- 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
276
298
  if all_method_names.include?(:alias)
277
299
  # Rather than complicating this special case,
278
300
  # let it be overridden (in field)
279
301
  return
280
302
  else
281
303
  arguments = scalar_method_names.map { |m| "#{m}: nil"} +
282
- @children_methods.keys.map { |m| "#{m}: NO_CHILDREN" }
304
+ children_method_names.map { |m| "#{m}: NO_CHILDREN" } +
305
+ DEFAULT_INITIALIZE_OPTIONS
283
306
 
284
307
  assignments = scalar_method_names.map { |m| "@#{m} = #{m}"} +
285
- @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
286
314
 
287
315
  keywords = scalar_method_names.map { |m| "#{m}: #{m}"} +
288
- @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
289
323
 
290
324
  module_eval <<-RUBY, __FILE__, __LINE__
291
- 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
292
331
  #{assignments.join("\n")}
293
332
  end
294
333
 
295
- 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(", ")})
296
335
  self.new(filename: filename, line: line, col: col, #{keywords.join(", ")})
297
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
298
349
  RUBY
299
350
  end
300
351
  end
@@ -326,7 +377,7 @@ module GraphQL
326
377
  # @return [String, Float, Integer, Boolean, Array, InputObject, VariableIdentifier] The value passed for this key
327
378
 
328
379
  def children
329
- @children ||= Array(value).flatten.select { |v| v.is_a?(AbstractNode) }
380
+ @children ||= Array(value).flatten.tap { _1.select! { |v| v.is_a?(AbstractNode) } }
330
381
  end
331
382
  end
332
383
 
@@ -339,13 +390,13 @@ module GraphQL
339
390
  end
340
391
 
341
392
  class DirectiveDefinition < AbstractNode
342
- include DefinitionNode
343
393
  attr_reader :description
344
394
  scalar_methods :name, :repeatable
345
395
  children_methods(
346
396
  arguments: Nodes::Argument,
347
397
  locations: Nodes::DirectiveLocation,
348
398
  )
399
+ self.children_method_name = :definitions
349
400
  end
350
401
 
351
402
  # An enum value. The string is available as {#name}.
@@ -358,6 +409,32 @@ module GraphQL
358
409
 
359
410
  # A single selection in a GraphQL query.
360
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
+
361
438
  scalar_methods :name, :alias
362
439
  children_methods({
363
440
  arguments: GraphQL::Language::Nodes::Argument,
@@ -365,44 +442,36 @@ module GraphQL
365
442
  directives: GraphQL::Language::Nodes::Directive,
366
443
  })
367
444
 
368
- # @!attribute selections
369
- # @return [Array<Nodes::Field>] Selections on this object (or empty array if this is a scalar field)
370
-
371
- def initialize_node(attributes)
372
- @name = attributes[:name]
373
- @arguments = attributes[:arguments] || NONE
374
- @directives = attributes[:directives] || NONE
375
- @selections = attributes[:selections] || NONE
376
- # oops, alias is a keyword:
377
- @alias = attributes[:alias]
378
- end
379
-
380
- def self.from_a(filename, line, col, graphql_alias, name, arguments, directives, selections) # rubocop:disable Metrics/ParameterLists
381
- self.new(filename: filename, line: line, col: col, alias: graphql_alias, name: name, arguments: arguments, directives: directives, selections: selections)
382
- end
383
-
384
445
  # Override this because default is `:fields`
385
446
  self.children_method_name = :selections
386
447
  end
387
448
 
388
449
  # A reusable fragment, defined at document-level.
389
450
  class FragmentDefinition < AbstractNode
390
- # @!attribute name
391
- # @return [String] the identifier for this fragment, which may be applied with `...#{name}`
392
-
393
- # @!attribute type
394
- # @return [String] the type condition for this fragment (name of type which it may apply to)
395
- 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)
396
452
  @name = name
397
453
  @type = type
398
454
  @directives = directives
399
455
  @selections = selections
456
+ @filename = filename
457
+ @pos = pos
458
+ @source = source
459
+ @line = line
460
+ @col = col
400
461
  end
401
462
 
402
463
  def self.from_a(filename, line, col, name, type, directives, selections)
403
464
  self.new(filename: filename, line: line, col: col, name: name, type: type, directives: directives, selections: selections)
404
465
  end
405
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
+
406
475
  scalar_methods :name, :type
407
476
  children_methods({
408
477
  selections: GraphQL::Language::Nodes::Field,
@@ -487,7 +556,7 @@ module GraphQL
487
556
  # An operation-level query variable
488
557
  class VariableDefinition < AbstractNode
489
558
  scalar_methods :name, :type, :default_value
490
- children_methods false
559
+ children_methods(directives: Directive)
491
560
  # @!attribute default_value
492
561
  # @return [String, Integer, Float, Boolean, Array, NullValue] A Ruby value to use if no other value is provided
493
562
 
@@ -538,7 +607,7 @@ module GraphQL
538
607
  # @example Creating a custom string from a document
539
608
  # class VariableScrubber < GraphQL::Language::Printer
540
609
  # def print_argument(arg)
541
- # "#{arg.name}: <HIDDEN>"
610
+ # print_string("#{arg.name}: <HIDDEN>")
542
611
  # end
543
612
  # end
544
613
  #
@@ -565,7 +634,6 @@ module GraphQL
565
634
  end
566
635
 
567
636
  class SchemaDefinition < AbstractNode
568
- include DefinitionNode
569
637
  scalar_methods :query, :mutation, :subscription
570
638
  children_methods({
571
639
  directives: GraphQL::Language::Nodes::Directive,
@@ -582,8 +650,7 @@ module GraphQL
582
650
  end
583
651
 
584
652
  class ScalarTypeDefinition < AbstractNode
585
- include DefinitionNode
586
- attr_reader :description
653
+ attr_reader :description, :comment
587
654
  scalar_methods :name
588
655
  children_methods({
589
656
  directives: GraphQL::Language::Nodes::Directive,
@@ -600,8 +667,7 @@ module GraphQL
600
667
  end
601
668
 
602
669
  class InputValueDefinition < AbstractNode
603
- include DefinitionNode
604
- attr_reader :description
670
+ attr_reader :description, :comment
605
671
  scalar_methods :name, :type, :default_value
606
672
  children_methods({
607
673
  directives: GraphQL::Language::Nodes::Directive,
@@ -610,8 +676,7 @@ module GraphQL
610
676
  end
611
677
 
612
678
  class FieldDefinition < AbstractNode
613
- include DefinitionNode
614
- attr_reader :description
679
+ attr_reader :description, :comment
615
680
  scalar_methods :name, :type
616
681
  children_methods({
617
682
  arguments: GraphQL::Language::Nodes::InputValueDefinition,
@@ -631,8 +696,7 @@ module GraphQL
631
696
  end
632
697
 
633
698
  class ObjectTypeDefinition < AbstractNode
634
- include DefinitionNode
635
- attr_reader :description
699
+ attr_reader :description, :comment
636
700
  scalar_methods :name, :interfaces
637
701
  children_methods({
638
702
  directives: GraphQL::Language::Nodes::Directive,
@@ -651,8 +715,7 @@ module GraphQL
651
715
  end
652
716
 
653
717
  class InterfaceTypeDefinition < AbstractNode
654
- include DefinitionNode
655
- attr_reader :description
718
+ attr_reader :description, :comment
656
719
  scalar_methods :name
657
720
  children_methods({
658
721
  interfaces: GraphQL::Language::Nodes::TypeName,
@@ -673,8 +736,7 @@ module GraphQL
673
736
  end
674
737
 
675
738
  class UnionTypeDefinition < AbstractNode
676
- include DefinitionNode
677
- attr_reader :description, :types
739
+ attr_reader :description, :comment, :types
678
740
  scalar_methods :name
679
741
  children_methods({
680
742
  directives: GraphQL::Language::Nodes::Directive,
@@ -692,8 +754,7 @@ module GraphQL
692
754
  end
693
755
 
694
756
  class EnumValueDefinition < AbstractNode
695
- include DefinitionNode
696
- attr_reader :description
757
+ attr_reader :description, :comment
697
758
  scalar_methods :name
698
759
  children_methods({
699
760
  directives: GraphQL::Language::Nodes::Directive,
@@ -702,8 +763,7 @@ module GraphQL
702
763
  end
703
764
 
704
765
  class EnumTypeDefinition < AbstractNode
705
- include DefinitionNode
706
- attr_reader :description
766
+ attr_reader :description, :comment
707
767
  scalar_methods :name
708
768
  children_methods({
709
769
  directives: GraphQL::Language::Nodes::Directive,
@@ -722,8 +782,7 @@ module GraphQL
722
782
  end
723
783
 
724
784
  class InputObjectTypeDefinition < AbstractNode
725
- include DefinitionNode
726
- attr_reader :description
785
+ attr_reader :description, :comment
727
786
  scalar_methods :name
728
787
  children_methods({
729
788
  directives: GraphQL::Language::Nodes::Directive,