graphql 2.6.11 → 2.6.13

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 (382) hide show
  1. checksums.yaml +4 -4
  2. data/.rdoc_options +4 -0
  3. data/lib/generators/graphql/core.rb +1 -0
  4. data/lib/generators/graphql/detailed_trace_generator.rb +1 -0
  5. data/lib/generators/graphql/enum_generator.rb +1 -0
  6. data/lib/generators/graphql/field_extractor.rb +1 -0
  7. data/lib/generators/graphql/input_generator.rb +1 -0
  8. data/lib/generators/graphql/install/mutation_root_generator.rb +1 -0
  9. data/lib/generators/graphql/install_generator.rb +1 -0
  10. data/lib/generators/graphql/interface_generator.rb +1 -0
  11. data/lib/generators/graphql/loader_generator.rb +8 -2
  12. data/lib/generators/graphql/mutation_create_generator.rb +8 -2
  13. data/lib/generators/graphql/mutation_delete_generator.rb +8 -2
  14. data/lib/generators/graphql/mutation_generator.rb +8 -2
  15. data/lib/generators/graphql/mutation_update_generator.rb +8 -2
  16. data/lib/generators/graphql/object_generator.rb +1 -0
  17. data/lib/generators/graphql/orm_mutations_base.rb +8 -2
  18. data/lib/generators/graphql/relay.rb +1 -0
  19. data/lib/generators/graphql/relay_generator.rb +1 -0
  20. data/lib/generators/graphql/scalar_generator.rb +1 -0
  21. data/lib/generators/graphql/type_generator.rb +38 -8
  22. data/lib/generators/graphql/union_generator.rb +1 -0
  23. data/lib/graphql/analysis/analyzer.rb +35 -9
  24. data/lib/graphql/analysis/field_usage.rb +1 -0
  25. data/lib/graphql/analysis/max_query_complexity.rb +2 -1
  26. data/lib/graphql/analysis/max_query_depth.rb +1 -0
  27. data/lib/graphql/analysis/query_complexity.rb +57 -20
  28. data/lib/graphql/analysis/query_depth.rb +17 -12
  29. data/lib/graphql/analysis/visitor.rb +79 -16
  30. data/lib/graphql/analysis.rb +23 -6
  31. data/lib/graphql/analysis_error.rb +1 -0
  32. data/lib/graphql/autoload.rb +30 -7
  33. data/lib/graphql/backtrace/table.rb +21 -5
  34. data/lib/graphql/backtrace/traced_error.rb +8 -3
  35. data/lib/graphql/backtrace.rb +14 -9
  36. data/lib/graphql/coercion_error.rb +1 -0
  37. data/lib/graphql/current.rb +44 -19
  38. data/lib/graphql/dashboard/application_controller.rb +1 -0
  39. data/lib/graphql/dashboard/detailed_traces.rb +1 -0
  40. data/lib/graphql/dashboard/installable.rb +1 -0
  41. data/lib/graphql/dashboard/landings_controller.rb +1 -0
  42. data/lib/graphql/dashboard/limiters.rb +1 -0
  43. data/lib/graphql/dashboard/operation_store.rb +1 -0
  44. data/lib/graphql/dashboard/statics_controller.rb +1 -0
  45. data/lib/graphql/dashboard/subscriptions.rb +1 -0
  46. data/lib/graphql/dashboard.rb +36 -22
  47. data/lib/graphql/dataloader/active_record_association_source.rb +1 -0
  48. data/lib/graphql/dataloader/active_record_source.rb +1 -0
  49. data/lib/graphql/dataloader/async_dataloader.rb +10 -7
  50. data/lib/graphql/dataloader/null_dataloader.rb +4 -3
  51. data/lib/graphql/dataloader/request.rb +8 -2
  52. data/lib/graphql/dataloader/request_all.rb +8 -2
  53. data/lib/graphql/dataloader/source.rb +127 -35
  54. data/lib/graphql/dataloader.rb +93 -42
  55. data/lib/graphql/date_encoding_error.rb +2 -1
  56. data/lib/graphql/dig.rb +12 -3
  57. data/lib/graphql/duration_encoding_error.rb +2 -1
  58. data/lib/graphql/execution/directive_checks.rb +8 -3
  59. data/lib/graphql/execution/errors.rb +20 -6
  60. data/lib/graphql/execution/field_resolve_step.rb +40 -13
  61. data/lib/graphql/execution/finalize.rb +12 -6
  62. data/lib/graphql/execution/input_values.rb +2 -1
  63. data/lib/graphql/execution/interpreter/argument_value.rb +17 -5
  64. data/lib/graphql/execution/interpreter/arguments.rb +24 -9
  65. data/lib/graphql/execution/interpreter/arguments_cache.rb +2 -1
  66. data/lib/graphql/execution/interpreter/execution_errors.rb +1 -0
  67. data/lib/graphql/execution/interpreter/handles_raw_value.rb +1 -0
  68. data/lib/graphql/execution/interpreter/resolve.rb +18 -8
  69. data/lib/graphql/execution/interpreter/runtime/graphql_result.rb +4 -1
  70. data/lib/graphql/execution/interpreter/runtime.rb +72 -25
  71. data/lib/graphql/execution/interpreter.rb +15 -6
  72. data/lib/graphql/execution/lazy/lazy_method_map.rb +21 -8
  73. data/lib/graphql/execution/lazy.rb +34 -10
  74. data/lib/graphql/execution/load_argument_step.rb +1 -0
  75. data/lib/graphql/execution/lookahead.rb +137 -54
  76. data/lib/graphql/execution/multiplex.rb +4 -4
  77. data/lib/graphql/execution/next.rb +7 -0
  78. data/lib/graphql/execution/prepare_object_step.rb +1 -0
  79. data/lib/graphql/execution/resolve_type_step.rb +2 -1
  80. data/lib/graphql/execution/runner.rb +9 -3
  81. data/lib/graphql/execution/selections_step.rb +3 -2
  82. data/lib/graphql/execution.rb +2 -2
  83. data/lib/graphql/execution_error.rb +19 -10
  84. data/lib/graphql/float_decoding_error.rb +1 -0
  85. data/lib/graphql/float_encoding_error.rb +7 -2
  86. data/lib/graphql/integer_decoding_error.rb +2 -1
  87. data/lib/graphql/integer_encoding_error.rb +8 -3
  88. data/lib/graphql/introspection/base_object.rb +3 -1
  89. data/lib/graphql/introspection/directive_location_enum.rb +1 -0
  90. data/lib/graphql/introspection/directive_type.rb +1 -0
  91. data/lib/graphql/introspection/dynamic_fields.rb +1 -0
  92. data/lib/graphql/introspection/entry_points.rb +1 -0
  93. data/lib/graphql/introspection/enum_value_type.rb +1 -0
  94. data/lib/graphql/introspection/field_type.rb +1 -0
  95. data/lib/graphql/introspection/input_value_type.rb +1 -0
  96. data/lib/graphql/introspection/introspection_query.rb +1 -0
  97. data/lib/graphql/introspection/schema_type.rb +1 -0
  98. data/lib/graphql/introspection/type_kind_enum.rb +1 -0
  99. data/lib/graphql/introspection/type_type.rb +1 -0
  100. data/lib/graphql/introspection.rb +1 -0
  101. data/lib/graphql/invalid_name_error.rb +1 -0
  102. data/lib/graphql/invalid_null_error.rb +19 -6
  103. data/lib/graphql/language/block_string.rb +2 -1
  104. data/lib/graphql/language/cache.rb +10 -4
  105. data/lib/graphql/language/comment.rb +1 -0
  106. data/lib/graphql/language/definition_slice.rb +1 -0
  107. data/lib/graphql/language/document_from_schema_definition.rb +9 -10
  108. data/lib/graphql/language/generation.rb +23 -9
  109. data/lib/graphql/language/lexer.rb +5 -0
  110. data/lib/graphql/language/nodes.rb +2094 -419
  111. data/lib/graphql/language/parser.rb +24 -17
  112. data/lib/graphql/language/printer.rb +31 -16
  113. data/lib/graphql/language/sanitized_printer.rb +16 -5
  114. data/lib/graphql/language/static_visitor.rb +19 -4
  115. data/lib/graphql/language/visitor.rb +51 -29
  116. data/lib/graphql/language.rb +13 -7
  117. data/lib/graphql/load_application_object_failed_error.rb +14 -5
  118. data/lib/graphql/name_validator.rb +1 -0
  119. data/lib/graphql/pagination/active_record_relation_connection.rb +1 -0
  120. data/lib/graphql/pagination/array_connection.rb +20 -6
  121. data/lib/graphql/pagination/connection.rb +178 -48
  122. data/lib/graphql/pagination/connections.rb +21 -14
  123. data/lib/graphql/pagination/mongoid_relation_connection.rb +1 -0
  124. data/lib/graphql/pagination/relation_connection.rb +123 -22
  125. data/lib/graphql/pagination/sequel_dataset_connection.rb +1 -0
  126. data/lib/graphql/pagination.rb +1 -0
  127. data/lib/graphql/parse_error.rb +1 -0
  128. data/lib/graphql/query/context/scoped_context.rb +2 -1
  129. data/lib/graphql/query/context.rb +106 -35
  130. data/lib/graphql/query/fingerprint.rb +15 -7
  131. data/lib/graphql/query/input_validation_result.rb +1 -0
  132. data/lib/graphql/query/null_context.rb +1 -0
  133. data/lib/graphql/query/partial.rb +28 -15
  134. data/lib/graphql/query/result.rb +15 -5
  135. data/lib/graphql/query/validation_pipeline.rb +16 -6
  136. data/lib/graphql/query/variable_validation_error.rb +1 -0
  137. data/lib/graphql/query/variables.rb +9 -2
  138. data/lib/graphql/query.rb +193 -49
  139. data/lib/graphql/railtie.rb +7 -3
  140. data/lib/graphql/rake_task/validate.rb +72 -17
  141. data/lib/graphql/rake_task.rb +55 -23
  142. data/lib/graphql/relay/range_add.rb +32 -21
  143. data/lib/graphql/relay.rb +1 -0
  144. data/lib/graphql/rubocop/graphql/base_cop.rb +1 -0
  145. data/lib/graphql/rubocop/graphql/default_null_true.rb +9 -6
  146. data/lib/graphql/rubocop/graphql/default_required_true.rb +9 -6
  147. data/lib/graphql/rubocop/graphql/field_type_in_block.rb +12 -8
  148. data/lib/graphql/rubocop/graphql/root_types_in_block.rb +9 -5
  149. data/lib/graphql/rubocop.rb +1 -0
  150. data/lib/graphql/runtime_error.rb +1 -0
  151. data/lib/graphql/runtime_type_error.rb +1 -0
  152. data/lib/graphql/schema/addition.rb +18 -6
  153. data/lib/graphql/schema/always_visible.rb +1 -0
  154. data/lib/graphql/schema/argument.rb +265 -42
  155. data/lib/graphql/schema/base_64_encoder.rb +2 -2
  156. data/lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb +1 -0
  157. data/lib/graphql/schema/build_from_definition/resolve_map.rb +2 -2
  158. data/lib/graphql/schema/build_from_definition.rb +94 -27
  159. data/lib/graphql/schema/built_in_types.rb +1 -0
  160. data/lib/graphql/schema/directive/deprecated.rb +1 -0
  161. data/lib/graphql/schema/directive/feature.rb +39 -22
  162. data/lib/graphql/schema/directive/flagged.rb +6 -1
  163. data/lib/graphql/schema/directive/include.rb +1 -0
  164. data/lib/graphql/schema/directive/one_of.rb +1 -0
  165. data/lib/graphql/schema/directive/skip.rb +1 -0
  166. data/lib/graphql/schema/directive/specified_by.rb +1 -0
  167. data/lib/graphql/schema/directive/transform.rb +17 -8
  168. data/lib/graphql/schema/directive.rb +12 -7
  169. data/lib/graphql/schema/enum.rb +99 -38
  170. data/lib/graphql/schema/enum_value.rb +21 -13
  171. data/lib/graphql/schema/field/connection_extension.rb +10 -2
  172. data/lib/graphql/schema/field/scope_extension.rb +1 -0
  173. data/lib/graphql/schema/field.rb +621 -109
  174. data/lib/graphql/schema/field_extension.rb +89 -34
  175. data/lib/graphql/schema/find_inherited_value.rb +5 -3
  176. data/lib/graphql/schema/finder.rb +22 -8
  177. data/lib/graphql/schema/has_single_input_argument.rb +39 -6
  178. data/lib/graphql/schema/input_object.rb +40 -13
  179. data/lib/graphql/schema/interface.rb +33 -17
  180. data/lib/graphql/schema/introspection_system.rb +7 -3
  181. data/lib/graphql/schema/late_bound_type.rb +2 -2
  182. data/lib/graphql/schema/list.rb +15 -4
  183. data/lib/graphql/schema/loader.rb +23 -12
  184. data/lib/graphql/schema/member/base_dsl_methods.rb +58 -12
  185. data/lib/graphql/schema/member/build_type.rb +16 -5
  186. data/lib/graphql/schema/member/graphql_type_names.rb +10 -6
  187. data/lib/graphql/schema/member/has_arguments.rb +115 -48
  188. data/lib/graphql/schema/member/has_ast_node.rb +1 -0
  189. data/lib/graphql/schema/member/has_authorization.rb +5 -0
  190. data/lib/graphql/schema/member/has_dataloader.rb +91 -34
  191. data/lib/graphql/schema/member/has_deprecation_reason.rb +15 -2
  192. data/lib/graphql/schema/member/has_directives.rb +38 -10
  193. data/lib/graphql/schema/member/has_fields.rb +151 -70
  194. data/lib/graphql/schema/member/has_interfaces.rb +10 -2
  195. data/lib/graphql/schema/member/has_path.rb +14 -5
  196. data/lib/graphql/schema/member/has_unresolved_type_error.rb +1 -0
  197. data/lib/graphql/schema/member/has_validators.rb +19 -4
  198. data/lib/graphql/schema/member/relay_shortcuts.rb +10 -2
  199. data/lib/graphql/schema/member/scoped.rb +14 -3
  200. data/lib/graphql/schema/member/type_system_helpers.rb +36 -6
  201. data/lib/graphql/schema/member/validates_input.rb +1 -0
  202. data/lib/graphql/schema/member.rb +9 -2
  203. data/lib/graphql/schema/mutation.rb +50 -46
  204. data/lib/graphql/schema/non_null.rb +21 -5
  205. data/lib/graphql/schema/object.rb +33 -12
  206. data/lib/graphql/schema/printer.rb +52 -31
  207. data/lib/graphql/schema/ractor_shareable.rb +6 -2
  208. data/lib/graphql/schema/relay_classic_mutation.rb +3 -3
  209. data/lib/graphql/schema/resolver/has_payload_type.rb +29 -7
  210. data/lib/graphql/schema/resolver.rb +156 -45
  211. data/lib/graphql/schema/scalar.rb +1 -0
  212. data/lib/graphql/schema/subscription.rb +67 -28
  213. data/lib/graphql/schema/timeout.rb +65 -25
  214. data/lib/graphql/schema/type_expression.rb +14 -5
  215. data/lib/graphql/schema/type_membership.rb +29 -10
  216. data/lib/graphql/schema/union.rb +4 -2
  217. data/lib/graphql/schema/unique_within_type.rb +24 -5
  218. data/lib/graphql/schema/validator/all_validator.rb +17 -9
  219. data/lib/graphql/schema/validator/allow_blank_validator.rb +8 -2
  220. data/lib/graphql/schema/validator/allow_null_validator.rb +8 -2
  221. data/lib/graphql/schema/validator/exclusion_validator.rb +14 -5
  222. data/lib/graphql/schema/validator/format_validator.rb +21 -10
  223. data/lib/graphql/schema/validator/inclusion_validator.rb +15 -6
  224. data/lib/graphql/schema/validator/length_validator.rb +23 -12
  225. data/lib/graphql/schema/validator/numericality_validator.rb +29 -16
  226. data/lib/graphql/schema/validator/required_validator.rb +45 -31
  227. data/lib/graphql/schema/validator.rb +89 -25
  228. data/lib/graphql/schema/visibility/migration.rb +14 -7
  229. data/lib/graphql/schema/visibility/profile.rb +65 -20
  230. data/lib/graphql/schema/visibility/visit.rb +12 -10
  231. data/lib/graphql/schema/visibility.rb +24 -20
  232. data/lib/graphql/schema/warden.rb +117 -31
  233. data/lib/graphql/schema/wrapper.rb +4 -1
  234. data/lib/graphql/schema.rb +1046 -300
  235. data/lib/graphql/static_validation/all_rules.rb +2 -1
  236. data/lib/graphql/static_validation/base_visitor.rb +59 -9
  237. data/lib/graphql/static_validation/definition_dependencies.rb +27 -7
  238. data/lib/graphql/static_validation/error.rb +3 -0
  239. data/lib/graphql/static_validation/interpreter_visitor.rb +1 -0
  240. data/lib/graphql/static_validation/literal_validator.rb +1 -0
  241. data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +4 -0
  242. data/lib/graphql/static_validation/rules/argument_literals_are_compatible_error.rb +1 -0
  243. data/lib/graphql/static_validation/rules/argument_names_are_unique.rb +3 -0
  244. data/lib/graphql/static_validation/rules/argument_names_are_unique_error.rb +1 -0
  245. data/lib/graphql/static_validation/rules/arguments_are_defined.rb +3 -0
  246. data/lib/graphql/static_validation/rules/arguments_are_defined_error.rb +1 -0
  247. data/lib/graphql/static_validation/rules/directives_are_defined.rb +3 -0
  248. data/lib/graphql/static_validation/rules/directives_are_defined_error.rb +1 -0
  249. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +3 -0
  250. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations_error.rb +1 -0
  251. data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +3 -0
  252. data/lib/graphql/static_validation/rules/fields_are_defined_on_type_error.rb +1 -0
  253. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +9 -1
  254. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections_error.rb +1 -0
  255. data/lib/graphql/static_validation/rules/fields_will_merge.rb +295 -134
  256. data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +14 -2
  257. data/lib/graphql/static_validation/rules/fragment_names_are_unique.rb +3 -0
  258. data/lib/graphql/static_validation/rules/fragment_names_are_unique_error.rb +1 -0
  259. data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +3 -0
  260. data/lib/graphql/static_validation/rules/fragment_spreads_are_possible_error.rb +1 -0
  261. data/lib/graphql/static_validation/rules/fragment_types_exist.rb +3 -0
  262. data/lib/graphql/static_validation/rules/fragment_types_exist_error.rb +1 -0
  263. data/lib/graphql/static_validation/rules/fragments_are_finite.rb +3 -0
  264. data/lib/graphql/static_validation/rules/fragments_are_finite_error.rb +1 -0
  265. data/lib/graphql/static_validation/rules/fragments_are_named.rb +3 -0
  266. data/lib/graphql/static_validation/rules/fragments_are_named_error.rb +1 -0
  267. data/lib/graphql/static_validation/rules/fragments_are_on_composite_types.rb +3 -0
  268. data/lib/graphql/static_validation/rules/fragments_are_on_composite_types_error.rb +1 -0
  269. data/lib/graphql/static_validation/rules/fragments_are_used.rb +3 -0
  270. data/lib/graphql/static_validation/rules/fragments_are_used_error.rb +1 -0
  271. data/lib/graphql/static_validation/rules/input_object_names_are_unique.rb +3 -0
  272. data/lib/graphql/static_validation/rules/input_object_names_are_unique_error.rb +1 -0
  273. data/lib/graphql/static_validation/rules/mutation_root_exists.rb +3 -0
  274. data/lib/graphql/static_validation/rules/mutation_root_exists_error.rb +1 -0
  275. data/lib/graphql/static_validation/rules/no_definitions_are_present.rb +3 -0
  276. data/lib/graphql/static_validation/rules/no_definitions_are_present_error.rb +1 -0
  277. data/lib/graphql/static_validation/rules/not_single_subscription_error.rb +1 -0
  278. data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid.rb +4 -0
  279. data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid_error.rb +1 -0
  280. data/lib/graphql/static_validation/rules/operation_names_are_valid.rb +3 -0
  281. data/lib/graphql/static_validation/rules/operation_names_are_valid_error.rb +1 -0
  282. data/lib/graphql/static_validation/rules/query_root_exists.rb +3 -0
  283. data/lib/graphql/static_validation/rules/query_root_exists_error.rb +1 -0
  284. data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +4 -1
  285. data/lib/graphql/static_validation/rules/required_arguments_are_present_error.rb +1 -0
  286. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +4 -0
  287. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present_error.rb +1 -0
  288. data/lib/graphql/static_validation/rules/subscription_root_exists_and_single_subscription_selection.rb +43 -5
  289. data/lib/graphql/static_validation/rules/subscription_root_exists_error.rb +1 -0
  290. data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +3 -0
  291. data/lib/graphql/static_validation/rules/unique_directives_per_location_error.rb +1 -0
  292. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +3 -0
  293. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed_error.rb +1 -0
  294. data/lib/graphql/static_validation/rules/variable_names_are_unique.rb +3 -0
  295. data/lib/graphql/static_validation/rules/variable_names_are_unique_error.rb +1 -0
  296. data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +207 -51
  297. data/lib/graphql/static_validation/rules/variable_usages_are_allowed_error.rb +1 -0
  298. data/lib/graphql/static_validation/rules/variables_are_input_types.rb +3 -0
  299. data/lib/graphql/static_validation/rules/variables_are_input_types_error.rb +1 -0
  300. data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +6 -3
  301. data/lib/graphql/static_validation/rules/variables_are_used_and_defined_error.rb +1 -0
  302. data/lib/graphql/static_validation/validation_context.rb +3 -2
  303. data/lib/graphql/static_validation/validation_timeout_error.rb +1 -0
  304. data/lib/graphql/static_validation/validator.rb +41 -16
  305. data/lib/graphql/static_validation.rb +1 -0
  306. data/lib/graphql/string_encoding_error.rb +1 -0
  307. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +85 -65
  308. data/lib/graphql/subscriptions/broadcast_analyzer.rb +10 -4
  309. data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +1 -0
  310. data/lib/graphql/subscriptions/event.rb +25 -6
  311. data/lib/graphql/subscriptions/serialize.rb +58 -19
  312. data/lib/graphql/subscriptions.rb +172 -46
  313. data/lib/graphql/testing/helpers.rb +17 -4
  314. data/lib/graphql/testing/mock_action_cable.rb +55 -33
  315. data/lib/graphql/testing.rb +1 -0
  316. data/lib/graphql/tracing/active_support_notifications_trace.rb +17 -9
  317. data/lib/graphql/tracing/active_support_notifications_tracing.rb +2 -1
  318. data/lib/graphql/tracing/appoptics_trace.rb +2 -1
  319. data/lib/graphql/tracing/appoptics_tracing.rb +2 -1
  320. data/lib/graphql/tracing/appsignal_trace.rb +16 -7
  321. data/lib/graphql/tracing/appsignal_tracing.rb +7 -3
  322. data/lib/graphql/tracing/call_legacy_tracers.rb +1 -0
  323. data/lib/graphql/tracing/data_dog_trace.rb +17 -6
  324. data/lib/graphql/tracing/data_dog_tracing.rb +10 -3
  325. data/lib/graphql/tracing/detailed_trace/active_record_backend.rb +1 -0
  326. data/lib/graphql/tracing/detailed_trace/memory_backend.rb +1 -0
  327. data/lib/graphql/tracing/detailed_trace/redis_backend.rb +1 -0
  328. data/lib/graphql/tracing/detailed_trace.rb +105 -42
  329. data/lib/graphql/tracing/legacy_hooks_trace.rb +5 -0
  330. data/lib/graphql/tracing/legacy_trace.rb +1 -0
  331. data/lib/graphql/tracing/monitor_trace.rb +17 -11
  332. data/lib/graphql/tracing/new_relic_trace.rb +17 -8
  333. data/lib/graphql/tracing/new_relic_tracing.rb +7 -3
  334. data/lib/graphql/tracing/notifications_trace.rb +11 -8
  335. data/lib/graphql/tracing/notifications_tracing.rb +23 -7
  336. data/lib/graphql/tracing/null_trace.rb +1 -0
  337. data/lib/graphql/tracing/perfetto_trace/trace_pb.rb +1 -0
  338. data/lib/graphql/tracing/perfetto_trace.rb +41 -19
  339. data/lib/graphql/tracing/platform_trace.rb +3 -1
  340. data/lib/graphql/tracing/platform_tracing.rb +16 -7
  341. data/lib/graphql/tracing/prometheus_trace/graphql_collector.rb +1 -0
  342. data/lib/graphql/tracing/prometheus_trace.rb +22 -13
  343. data/lib/graphql/tracing/prometheus_tracing.rb +1 -0
  344. data/lib/graphql/tracing/scout_trace.rb +10 -4
  345. data/lib/graphql/tracing/scout_tracing.rb +7 -3
  346. data/lib/graphql/tracing/sentry_trace.rb +12 -5
  347. data/lib/graphql/tracing/statsd_trace.rb +12 -6
  348. data/lib/graphql/tracing/statsd_tracing.rb +7 -1
  349. data/lib/graphql/tracing/trace.rb +231 -58
  350. data/lib/graphql/tracing.rb +25 -9
  351. data/lib/graphql/type_kinds.rb +2 -1
  352. data/lib/graphql/types/big_int.rb +1 -0
  353. data/lib/graphql/types/boolean.rb +1 -0
  354. data/lib/graphql/types/float.rb +1 -0
  355. data/lib/graphql/types/id.rb +1 -0
  356. data/lib/graphql/types/int.rb +2 -1
  357. data/lib/graphql/types/iso_8601_date.rb +21 -4
  358. data/lib/graphql/types/iso_8601_date_time.rb +33 -6
  359. data/lib/graphql/types/iso_8601_duration.rb +42 -9
  360. data/lib/graphql/types/json.rb +1 -0
  361. data/lib/graphql/types/relay/base_connection.rb +38 -32
  362. data/lib/graphql/types/relay/base_edge.rb +15 -9
  363. data/lib/graphql/types/relay/connection_behaviors.rb +19 -3
  364. data/lib/graphql/types/relay/edge_behaviors.rb +17 -4
  365. data/lib/graphql/types/relay/has_node_field.rb +6 -1
  366. data/lib/graphql/types/relay/has_nodes_field.rb +6 -1
  367. data/lib/graphql/types/relay/node.rb +1 -0
  368. data/lib/graphql/types/relay/node_behaviors.rb +5 -1
  369. data/lib/graphql/types/relay/page_info.rb +1 -0
  370. data/lib/graphql/types/relay/page_info_behaviors.rb +1 -0
  371. data/lib/graphql/types/relay.rb +4 -3
  372. data/lib/graphql/types/string.rb +1 -0
  373. data/lib/graphql/types.rb +1 -0
  374. data/lib/graphql/unauthorized_enum_value_error.rb +4 -1
  375. data/lib/graphql/unauthorized_error.rb +11 -4
  376. data/lib/graphql/unauthorized_field_error.rb +4 -1
  377. data/lib/graphql/unresolved_type_error.rb +16 -5
  378. data/lib/graphql/version.rb +2 -1
  379. data/lib/graphql.rb +37 -9
  380. data/readme.md +1 -1
  381. metadata +89 -5
  382. data/.yardopts +0 -5
@@ -1,9 +1,10 @@
1
1
  # frozen_string_literal: true
2
+ # typed: true
2
3
  module GraphQL
3
4
  module Language
4
5
  module Nodes
5
6
  NONE = GraphQL::EmptyObjects::EMPTY_ARRAY
6
- # {AbstractNode} is the base class for all nodes in a GraphQL AST.
7
+ # [AbstractNode](rdoc-ref:GraphQL::Language::Nodes::AbstractNode) is the base class for all nodes in a GraphQL AST.
7
8
  #
8
9
  # It provides some APIs for working with ASTs:
9
10
  # - `children` returns all AST nodes attached to this one. Used for tree traversal.
@@ -12,8 +13,12 @@ module GraphQL
12
13
  class AbstractNode
13
14
 
14
15
  module DefinitionNode
15
- # This AST node's {#line} returns the first line, which may be the description.
16
- # @return [Integer] The first line of the definition (not the description)
16
+ # This AST node's [line](rdoc-ref:GraphQL::Language::Nodes::AbstractNode#line) returns the first line, which may be the description.
17
+ #
18
+ # **Returns**
19
+ #
20
+ # - `Integer` — The first line of the definition (not the description)
21
+ #: Integer?
17
22
  attr_reader :definition_line
18
23
 
19
24
  def initialize(definition_line: nil, **_rest)
@@ -31,22 +36,32 @@ module GraphQL
31
36
  end
32
37
  end
33
38
 
39
+ #: String?
34
40
  attr_reader :filename
35
41
 
42
+ #: -> Integer?
36
43
  def line
37
44
  @line ||= @source&.line_at(@pos)
38
45
  end
39
46
 
47
+ #: -> Integer?
40
48
  def col
41
49
  @col ||= @source&.column_at(@pos)
42
50
  end
43
51
 
52
+ #: -> Integer?
44
53
  def definition_line
45
54
  @definition_line ||= (@source && @definition_pos) ? @source.line_at(@definition_pos) : nil
46
55
  end
47
56
 
48
57
  # Value equality
49
- # @return [Boolean] True if `self` is equivalent to `other`
58
+ #
59
+ # **Returns**
60
+ #
61
+ # - `Boolean` — True if `self` is equivalent to `other`
62
+ #
63
+ # :call-seq:
64
+ # ==(other) -> bool
50
65
  def ==(other)
51
66
  return true if equal?(other)
52
67
  other.kind_of?(self.class) &&
@@ -56,12 +71,24 @@ module GraphQL
56
71
 
57
72
  NO_CHILDREN = GraphQL::EmptyObjects::EMPTY_ARRAY
58
73
 
59
- # @return [Array<GraphQL::Language::Nodes::AbstractNode>] all nodes in the tree below this one
74
+ # **Returns**
75
+ #
76
+ # - `Array<GraphQL::Language::Nodes::AbstractNode>` — all nodes in the tree below this one
77
+ #
78
+ # :call-seq:
79
+ # children() -> Array[GraphQL::Language::Nodes::AbstractNode]
80
+ #: -> Array[AbstractNode]
60
81
  def children
61
82
  NO_CHILDREN
62
83
  end
63
84
 
64
- # @return [Array<Integer, Float, String, Boolean, Array>] Scalar values attached to this node
85
+ # **Returns**
86
+ #
87
+ # - `Array<Integer, Float, String, Boolean, Array>` — Scalar values attached to this node
88
+ #
89
+ # :call-seq:
90
+ # scalars() -> Array[Integer | Float | String | bool | Array]
91
+ #: -> Array[untyped]
65
92
  def scalars
66
93
  NO_CHILDREN
67
94
  end
@@ -77,10 +104,24 @@ module GraphQL
77
104
  self.class.children_method_name
78
105
  end
79
106
 
107
+ # Built-in node classes override this with a literal Symbol.
108
+ #
109
+ # **Returns**
110
+ #
111
+ # - `Symbol` — the method that GraphQL::Language::Visitor calls for this node
112
+ #
113
+ # :call-seq:
114
+ # visit_method() -> Symbol
115
+ def visit_method
116
+ self.class.visit_method
117
+ end
118
+
119
+ #: -> [Integer?, Integer?]
80
120
  def position
81
121
  [line, col]
82
122
  end
83
123
 
124
+ #: (?printer: untyped) -> String
84
125
  def to_query_string(printer: GraphQL::Language::Printer.new)
85
126
  if printer.is_a?(GraphQL::Language::Printer)
86
127
  if frozen?
@@ -94,8 +135,17 @@ module GraphQL
94
135
  end
95
136
 
96
137
  # This creates a copy of `self`, with `new_options` applied.
97
- # @param new_options [Hash]
98
- # @return [AbstractNode] a shallow copy of `self`
138
+ #
139
+ # **Parameters**
140
+ #
141
+ # - `new_options` (`Hash`)
142
+ #
143
+ # **Returns**
144
+ #
145
+ # - `AbstractNode` — a shallow copy of `self`
146
+ #
147
+ # :call-seq:
148
+ # merge(Hash new_options) -> AbstractNode
99
149
  def merge(new_options)
100
150
  dup.merge!(new_options)
101
151
  end
@@ -110,7 +160,7 @@ module GraphQL
110
160
  # Copy that list, and replace `previous_child` with `new_child`
111
161
  # in the list.
112
162
  new_children = prev_children.dup
113
- prev_idx = new_children.index(previous_child)
163
+ prev_idx = new_children.index(previous_child) #: as Integer
114
164
  new_children[prev_idx] = new_child
115
165
  else
116
166
  # Use the new value for the given attribute
@@ -145,9 +195,15 @@ module GraphQL
145
195
  end
146
196
 
147
197
  class << self
148
- # rubocop:disable Development/NoEvalCop This eval takes static inputs at load-time
198
+ # **Returns**
199
+ #
200
+ # - `Symbol` — the method that GraphQL::Language::Visitor calls for this kind of node
201
+ #: Symbol?
202
+ attr_reader :visit_method
149
203
 
150
- # Add a default `#visit_method` and `#children_method_name` using the class name
204
+ attr_accessor :children_method_name
205
+
206
+ # Add a default `.visit_method` and `.children_method_name` using the class name
151
207
  def inherited(child_class)
152
208
  super
153
209
  name_underscored = child_class.name
@@ -155,227 +211,157 @@ module GraphQL
155
211
  .gsub(/([a-z])([A-Z])/,'\1_\2') # insert underscores
156
212
  .downcase # remove caps
157
213
 
158
- child_class.module_eval <<-RUBY, __FILE__, __LINE__
159
- def visit_method
160
- :on_#{name_underscored}
161
- end
162
-
163
- class << self
164
- attr_accessor :children_method_name
165
-
166
- def visit_method
167
- :on_#{name_underscored}
168
- end
169
- end
170
- self.children_method_name = :#{name_underscored}s
171
- RUBY
214
+ child_class.instance_variable_set(:@visit_method, :"on_#{name_underscored}")
215
+ child_class.children_method_name = :"#{name_underscored}s"
172
216
  end
173
217
 
218
+ # **Returns**
219
+ #
220
+ # - `Hash{Symbol => Class, nil}, nil` — child reader methods and the kind of node each one returns, if known
221
+ #
222
+ # :call-seq:
223
+ # children_of_type() -> Hash[Symbol, Class | nil] | nil
174
224
  def children_of_type
175
225
  @children_methods
176
226
  end
227
+ end
228
+ end
177
229
 
178
- private
230
+ # Base class for non-null type names and list type names
231
+ class WrapperType < AbstractNode
232
+ def visit_method
233
+ :on_wrapper_type
234
+ end
179
235
 
180
- # Name accessors which return lists of nodes,
181
- # along with the kind of node they return, if possible.
182
- # - Add a reader for these children
183
- # - Add a persistent update method to add a child
184
- # - Generate a `#children` method
185
- def children_methods(children_of_type)
186
- if defined?(@children_methods)
187
- raise "Can't re-call .children_methods for #{self} (already have: #{@children_methods})"
188
- else
189
- @children_methods = children_of_type
190
- end
236
+ #: TypeName | ListType | NonNullType
237
+ attr_reader :of_type
191
238
 
192
- if children_of_type == false
193
- @children_methods = {}
194
- # skip
195
- else
239
+ def scalars
240
+ @scalars ||= [@of_type].freeze
241
+ end
196
242
 
197
- children_of_type.each do |method_name, node_type|
198
- module_eval <<-RUBY, __FILE__, __LINE__
199
- # A reader for these children
200
- attr_reader :#{method_name}
201
- RUBY
202
-
203
- if node_type
204
- # Only generate a method if we know what kind of node to make
205
- module_eval <<-RUBY, __FILE__, __LINE__
206
- # Singular method: create a node with these options
207
- # and return a new `self` which includes that node in this list.
208
- def merge_#{method_name.to_s.sub(/s$/, "")}(**node_opts)
209
- merge(#{method_name}: #{method_name} + [#{node_type.name}.new(**node_opts)])
210
- end
211
- RUBY
212
- end
213
- end
214
-
215
- if children_of_type.size == 1
216
- module_eval <<-RUBY, __FILE__, __LINE__
217
- alias :children #{children_of_type.keys.first}
218
- RUBY
219
- else
220
- module_eval <<-RUBY, __FILE__, __LINE__
221
- def children
222
- @children ||= begin
223
- if #{children_of_type.keys.map { |k| "@#{k}.any?" }.join(" || ")}
224
- new_children = []
225
- #{children_of_type.keys.map { |k| "new_children.concat(@#{k})" }.join("; ")}
226
- new_children.freeze
227
- new_children
228
- else
229
- NO_CHILDREN
230
- end
231
- end
232
- end
233
- RUBY
234
- end
235
- end
243
+ #: (?of_type: untyped, ?line: Integer?, ?col: Integer?, ?pos: Integer?, ?filename: String?, ?source: untyped) -> void
244
+ def initialize(of_type: nil, line: nil, col: nil, pos: nil, filename: nil, source: nil)
245
+ @line = line
246
+ @col = col
247
+ @pos = pos
248
+ @filename = filename
249
+ @source = source
250
+ @of_type = of_type
251
+ end
236
252
 
237
- if defined?(@scalar_methods)
238
- if !@initialize_was_generated
239
- @initialize_was_generated = true
240
- generate_initialize
241
- else
242
- # This method was defined manually
243
- end
244
- else
245
- raise "Can't generate_initialize because scalar_methods wasn't called; call it before children_methods"
246
- end
247
- end
253
+ def self.from_a(filename, line, col, of_type, comment: nil)
254
+ self.new(filename: filename, line: line, col: col, of_type: of_type)
255
+ end
248
256
 
249
- # These methods return a plain Ruby value, not another node
250
- # - Add reader methods
251
- # - Add a `#scalars` method
252
- def scalar_methods(*method_names)
253
- if defined?(@scalar_methods)
254
- raise "Can't re-call .scalar_methods for #{self} (already have: #{@scalar_methods})"
255
- else
256
- @scalar_methods = method_names
257
- end
257
+ def marshal_dump
258
+ [
259
+ line, col, # use methods here to force them to be calculated
260
+ @filename,
261
+ @of_type,
262
+ ]
263
+ end
258
264
 
259
- if method_names == [false]
260
- @scalar_methods = []
261
- # skip it
262
- else
263
- module_eval <<-RUBY, __FILE__, __LINE__
264
- # add readers for each scalar
265
- attr_reader #{method_names.map { |m| ":#{m}"}.join(", ")}
266
-
267
- def scalars
268
- @scalars ||= [#{method_names.map { |k| "@#{k}" }.join(", ")}].freeze
269
- end
270
- RUBY
271
- end
272
- end
265
+ def marshal_load(values)
266
+ @line, @col, @filename, @of_type = values
267
+ end
273
268
 
274
- DEFAULT_INITIALIZE_OPTIONS = [
275
- "line: nil",
276
- "col: nil",
277
- "pos: nil",
278
- "filename: nil",
279
- "source: nil"
280
- ]
269
+ @children_methods = {}.freeze
270
+ end
281
271
 
282
- IGNORED_MARSHALLING_KEYWORDS = [:comment]
272
+ # Base class for nodes whose only value is a name (no child nodes or other scalars)
273
+ class NameOnlyNode < AbstractNode
274
+ def visit_method
275
+ :on_name_only_node
276
+ end
283
277
 
284
- def generate_initialize
285
- return if method_defined?(:marshal_load, false) # checking for `:initialize` doesn't work right
278
+ #: String
279
+ attr_reader :name
286
280
 
287
- scalar_method_names = @scalar_methods
288
- # TODO: These probably should be scalar methods, but `types` returns an array
289
- [:types, :description, :comment].each do |extra_method|
290
- if method_defined?(extra_method)
291
- scalar_method_names += [extra_method]
292
- end
293
- end
281
+ def scalars
282
+ @scalars ||= [@name].freeze
283
+ end
294
284
 
295
- children_method_names = @children_methods.keys
285
+ #: (?name: untyped, ?line: Integer?, ?col: Integer?, ?pos: Integer?, ?filename: String?, ?source: untyped) -> void
286
+ def initialize(name: nil, line: nil, col: nil, pos: nil, filename: nil, source: nil)
287
+ @line = line
288
+ @col = col
289
+ @pos = pos
290
+ @filename = filename
291
+ @source = source
292
+ @name = name
293
+ end
296
294
 
297
- all_method_names = scalar_method_names + children_method_names
298
- if all_method_names.include?(:alias)
299
- # Rather than complicating this special case,
300
- # let it be overridden (in field)
301
- return
302
- else
303
- arguments = scalar_method_names.map { |m| "#{m}: nil"} +
304
- children_method_names.map { |m| "#{m}: NO_CHILDREN" } +
305
- DEFAULT_INITIALIZE_OPTIONS
306
-
307
- # Intern descriptions so identical strings across SDL documents share one frozen object.
308
- assignments = scalar_method_names.map { |m| m == :description ? "@#{m} = #{m} && -#{m}" : "@#{m} = #{m}" } +
309
- children_method_names.map { |m| "@#{m} = #{m}.freeze" }
310
-
311
- if name.end_with?("Definition") && name != "FragmentDefinition"
312
- arguments << "definition_pos: nil"
313
- assignments << "@definition_pos = definition_pos"
314
- end
315
-
316
- keywords = scalar_method_names.map { |m| "#{m}: #{m}"} +
317
- children_method_names.map { |m| "#{m}: #{m}" }
318
-
319
- ignored_keywords = IGNORED_MARSHALLING_KEYWORDS.map do |keyword|
320
- "#{keyword.to_s}: nil"
321
- end
322
-
323
- marshalling_method_names = all_method_names - IGNORED_MARSHALLING_KEYWORDS
324
-
325
- module_eval <<-RUBY, __FILE__, __LINE__
326
- def initialize(#{arguments.join(", ")})
327
- @line = line
328
- @col = col
329
- @pos = pos
330
- @filename = filename
331
- @source = source
332
- #{assignments.join("\n")}
333
- end
334
-
335
- def self.from_a(filename, line, col, #{marshalling_method_names.join(", ")}, #{ignored_keywords.join(", ")})
336
- self.new(filename: filename, line: line, col: col, #{keywords.join(", ")})
337
- end
338
-
339
- def marshal_dump
340
- [
341
- line, col, # use methods here to force them to be calculated
342
- @filename,
343
- #{marshalling_method_names.map { |n| "@#{n}," }.join}
344
- ]
345
- end
346
-
347
- def marshal_load(values)
348
- @line, @col, @filename #{marshalling_method_names.map { |n| ", @#{n}"}.join} = values
349
- end
350
- RUBY
351
- end
352
- end
353
- # rubocop:enable Development/NoEvalCop
295
+ def self.from_a(filename, line, col, name, comment: nil)
296
+ self.new(filename: filename, line: line, col: col, name: name)
354
297
  end
355
- end
356
298
 
357
- # Base class for non-null type names and list type names
358
- class WrapperType < AbstractNode
359
- scalar_methods :of_type
360
- children_methods(false)
361
- end
299
+ def marshal_dump
300
+ [
301
+ line, col, # use methods here to force them to be calculated
302
+ @filename,
303
+ @name,
304
+ ]
305
+ end
362
306
 
363
- # Base class for nodes whose only value is a name (no child nodes or other scalars)
364
- class NameOnlyNode < AbstractNode
365
- scalar_methods :name
366
- children_methods(false)
307
+ def marshal_load(values)
308
+ @line, @col, @filename, @name = values
309
+ end
310
+
311
+ @children_methods = {}.freeze
367
312
  end
368
313
 
369
314
  # A key-value pair for a field's inputs
370
315
  class Argument < AbstractNode
371
- scalar_methods :name, :value
372
- children_methods(false)
316
+ def visit_method
317
+ :on_argument
318
+ end
319
+
320
+ # **Returns**
321
+ #
322
+ # - `String` — the key for this argument
323
+ #: String
324
+ attr_reader :name
325
+
326
+ # **Returns**
327
+ #
328
+ # - `String, Float, Integer, Boolean, Array, InputObject, VariableIdentifier, Enum, NullValue` — The value passed for this key
329
+ #: untyped
330
+ attr_reader :value
331
+
332
+ def scalars
333
+ @scalars ||= [@name, @value].freeze
334
+ end
335
+
336
+ #: (?name: untyped, ?value: untyped, ?line: Integer?, ?col: Integer?, ?pos: Integer?, ?filename: String?, ?source: untyped) -> void
337
+ def initialize(name: nil, value: nil, line: nil, col: nil, pos: nil, filename: nil, source: nil)
338
+ @line = line
339
+ @col = col
340
+ @pos = pos
341
+ @filename = filename
342
+ @source = source
343
+ @name = name
344
+ @value = value
345
+ end
373
346
 
374
- # @!attribute name
375
- # @return [String] the key for this argument
347
+ def self.from_a(filename, line, col, name, value, comment: nil)
348
+ self.new(filename: filename, line: line, col: col, name: name, value: value)
349
+ end
350
+
351
+ def marshal_dump
352
+ [
353
+ line, col, # use methods here to force them to be calculated
354
+ @filename,
355
+ @name,
356
+ @value,
357
+ ]
358
+ end
359
+
360
+ def marshal_load(values)
361
+ @line, @col, @filename, @name, @value = values
362
+ end
376
363
 
377
- # @!attribute value
378
- # @return [String, Float, Integer, Boolean, Array, InputObject, VariableIdentifier] The value passed for this key
364
+ @children_methods = {}.freeze
379
365
 
380
366
  def children
381
367
  @children ||= Array(value).flatten.tap { _1.select! { |v| v.is_a?(AbstractNode) } }
@@ -383,33 +369,171 @@ module GraphQL
383
369
  end
384
370
 
385
371
  class Directive < AbstractNode
386
- scalar_methods :name
387
- children_methods(arguments: GraphQL::Language::Nodes::Argument)
372
+ def visit_method
373
+ :on_directive
374
+ end
375
+
376
+ #: String
377
+ attr_reader :name
378
+
379
+ def scalars
380
+ @scalars ||= [@name].freeze
381
+ end
382
+
383
+ #: Array[Argument]
384
+ attr_reader :arguments
385
+
386
+ def merge_argument(**node_opts)
387
+ merge(arguments: arguments + [GraphQL::Language::Nodes::Argument.new(**node_opts)])
388
+ end
389
+
390
+ alias :children arguments
391
+
392
+ #: (?name: untyped, ?arguments: Array[Argument], ?line: Integer?, ?col: Integer?, ?pos: Integer?, ?filename: String?, ?source: untyped) -> void
393
+ def initialize(name: nil, arguments: NO_CHILDREN, line: nil, col: nil, pos: nil, filename: nil, source: nil)
394
+ @line = line
395
+ @col = col
396
+ @pos = pos
397
+ @filename = filename
398
+ @source = source
399
+ @name = name
400
+ @arguments = arguments.freeze
401
+ end
402
+
403
+ def self.from_a(filename, line, col, name, arguments, comment: nil)
404
+ self.new(filename: filename, line: line, col: col, name: name, arguments: arguments)
405
+ end
406
+
407
+ def marshal_dump
408
+ [
409
+ line, col, # use methods here to force them to be calculated
410
+ @filename,
411
+ @name,
412
+ @arguments,
413
+ ]
414
+ end
415
+
416
+ def marshal_load(values)
417
+ @line, @col, @filename, @name, @arguments = values
418
+ end
419
+
420
+ @children_methods = {
421
+ arguments: GraphQL::Language::Nodes::Argument,
422
+ }.freeze
388
423
  end
389
424
 
390
425
  class DirectiveLocation < NameOnlyNode
426
+ def visit_method
427
+ :on_directive_location
428
+ end
391
429
  end
392
430
 
393
431
  class DirectiveDefinition < AbstractNode
432
+ def visit_method
433
+ :on_directive_definition
434
+ end
435
+
436
+ #: String?
394
437
  attr_reader :description
395
- scalar_methods :name, :repeatable
396
- children_methods(
397
- arguments: Nodes::Argument,
398
- locations: Nodes::DirectiveLocation,
399
- )
438
+ #: String
439
+ attr_reader :name
440
+ #: bool
441
+ attr_reader :repeatable
442
+
443
+ def scalars
444
+ @scalars ||= [@name, @repeatable].freeze
445
+ end
446
+
447
+ #: Array[InputValueDefinition]
448
+ attr_reader :arguments
449
+ #: Array[DirectiveLocation]
450
+ attr_reader :locations
451
+
452
+ def merge_argument(**node_opts)
453
+ merge(arguments: arguments + [GraphQL::Language::Nodes::Argument.new(**node_opts)])
454
+ end
455
+
456
+ def merge_location(**node_opts)
457
+ merge(locations: locations + [GraphQL::Language::Nodes::DirectiveLocation.new(**node_opts)])
458
+ end
459
+
460
+ def children
461
+ @children ||= begin
462
+ if !@arguments.empty? || !@locations.empty?
463
+ new_children = []
464
+ new_children.concat(@arguments)
465
+ new_children.concat(@locations)
466
+ new_children.freeze
467
+ new_children
468
+ else
469
+ NO_CHILDREN
470
+ end
471
+ end
472
+ end
473
+
474
+ #: (?name: untyped, ?repeatable: untyped, ?description: untyped, ?arguments: Array[InputValueDefinition], ?locations: Array[DirectiveLocation], ?line: Integer?, ?col: Integer?, ?pos: Integer?, ?filename: String?, ?source: untyped, ?definition_pos: Integer?) -> void
475
+ def initialize(name: nil, repeatable: nil, description: nil, arguments: NO_CHILDREN, locations: NO_CHILDREN, line: nil, col: nil, pos: nil, filename: nil, source: nil, definition_pos: nil)
476
+ @line = line
477
+ @col = col
478
+ @pos = pos
479
+ @filename = filename
480
+ @source = source
481
+ @name = name
482
+ @repeatable = repeatable
483
+ @description = description && -description
484
+ @arguments = arguments.freeze
485
+ @locations = locations.freeze
486
+ @definition_pos = definition_pos
487
+ end
488
+
489
+ def self.from_a(filename, line, col, name, repeatable, description, arguments, locations, comment: nil) # rubocop:disable Metrics/ParameterLists
490
+ self.new(filename: filename, line: line, col: col, name: name, repeatable: repeatable, description: description, arguments: arguments, locations: locations)
491
+ end
492
+
493
+ def marshal_dump
494
+ [
495
+ line, col, # use methods here to force them to be calculated
496
+ @filename,
497
+ @name,
498
+ @repeatable,
499
+ @description,
500
+ @arguments,
501
+ @locations,
502
+ ]
503
+ end
504
+
505
+ def marshal_load(values)
506
+ @line, @col, @filename, @name, @repeatable, @description, @arguments, @locations = values
507
+ end
508
+
509
+ @children_methods = {
510
+ arguments: GraphQL::Language::Nodes::Argument,
511
+ locations: GraphQL::Language::Nodes::DirectiveLocation,
512
+ }.freeze
400
513
  self.children_method_name = :definitions
401
514
  end
402
515
 
403
- # An enum value. The string is available as {#name}.
516
+ # An enum value. The string is available as `name`.
404
517
  class Enum < NameOnlyNode
518
+ def visit_method
519
+ :on_enum
520
+ end
405
521
  end
406
522
 
407
523
  # A null value literal.
408
524
  class NullValue < NameOnlyNode
525
+ def visit_method
526
+ :on_null_value
527
+ end
409
528
  end
410
529
 
411
530
  # A single selection in a GraphQL query.
412
531
  class Field < AbstractNode
532
+ def visit_method
533
+ :on_field
534
+ end
535
+
536
+ #: (?name: untyped, ?arguments: Array[Argument]?, ?directives: Array[Directive]?, ?selections: (Array[Field | FragmentSpread | InlineFragment])?, ?field_alias: String?, ?line: Integer?, ?col: Integer?, ?pos: Integer?, ?filename: String?, ?source: untyped) -> void
413
537
  def initialize(name: nil, arguments: NONE, directives: NONE, selections: NONE, field_alias: nil, line: nil, col: nil, pos: nil, filename: nil, source: nil)
414
538
  @name = name
415
539
  @arguments = arguments || NONE
@@ -436,12 +560,54 @@ module GraphQL
436
560
  @line, @col, @filename, @name, @arguments, @directives, @selections, @alias = values
437
561
  end
438
562
 
439
- scalar_methods :name, :alias
440
- children_methods({
563
+ #: String
564
+ attr_reader :name
565
+ #: String?
566
+ attr_reader :alias
567
+
568
+ def scalars
569
+ @scalars ||= [@name, @alias].freeze
570
+ end
571
+
572
+ #: Array[Argument]
573
+ attr_reader :arguments
574
+ #: Array[Field | FragmentSpread | InlineFragment]
575
+ attr_reader :selections
576
+ #: Array[Directive]
577
+ attr_reader :directives
578
+
579
+ def merge_argument(**node_opts)
580
+ merge(arguments: arguments + [GraphQL::Language::Nodes::Argument.new(**node_opts)])
581
+ end
582
+
583
+ def merge_selection(**node_opts)
584
+ merge(selections: selections + [GraphQL::Language::Nodes::Field.new(**node_opts)])
585
+ end
586
+
587
+ def merge_directive(**node_opts)
588
+ merge(directives: directives + [GraphQL::Language::Nodes::Directive.new(**node_opts)])
589
+ end
590
+
591
+ def children
592
+ @children ||= begin
593
+ if !@arguments.empty? || !@selections.empty? || !@directives.empty?
594
+ new_children = []
595
+ new_children.concat(@arguments)
596
+ new_children.concat(@selections)
597
+ new_children.concat(@directives)
598
+ new_children.freeze
599
+ new_children
600
+ else
601
+ NO_CHILDREN
602
+ end
603
+ end
604
+ end
605
+
606
+ @children_methods = {
441
607
  arguments: GraphQL::Language::Nodes::Argument,
442
608
  selections: GraphQL::Language::Nodes::Field,
443
609
  directives: GraphQL::Language::Nodes::Directive,
444
- })
610
+ }.freeze
445
611
 
446
612
  # Override this because default is `:fields`
447
613
  self.children_method_name = :selections
@@ -449,6 +615,11 @@ module GraphQL
449
615
 
450
616
  # A reusable fragment, defined at document-level.
451
617
  class FragmentDefinition < AbstractNode
618
+ def visit_method
619
+ :on_fragment_definition
620
+ end
621
+
622
+ #: (?name: untyped, ?type: untyped, ?directives: Array[Directive], ?selections: Array[Field | FragmentSpread | InlineFragment], ?filename: String?, ?pos: Integer?, ?source: untyped, ?line: Integer?, ?col: Integer?) -> void
452
623
  def initialize(name: nil, type: nil, directives: NONE, selections: NONE, filename: nil, pos: nil, source: nil, line: nil, col: nil)
453
624
  @name = name
454
625
  @type = type
@@ -473,99 +644,362 @@ module GraphQL
473
644
  @line, @col, @filename, @name, @type, @directives, @selections = values
474
645
  end
475
646
 
476
- scalar_methods :name, :type
477
- children_methods({
647
+ #: String
648
+ attr_reader :name
649
+ #: TypeName
650
+ attr_reader :type
651
+
652
+ def scalars
653
+ @scalars ||= [@name, @type].freeze
654
+ end
655
+
656
+ #: Array[Field | FragmentSpread | InlineFragment]
657
+ attr_reader :selections
658
+ #: Array[Directive]
659
+ attr_reader :directives
660
+
661
+ def merge_selection(**node_opts)
662
+ merge(selections: selections + [GraphQL::Language::Nodes::Field.new(**node_opts)])
663
+ end
664
+
665
+ def merge_directive(**node_opts)
666
+ merge(directives: directives + [GraphQL::Language::Nodes::Directive.new(**node_opts)])
667
+ end
668
+
669
+ def children
670
+ @children ||= begin
671
+ if !@selections.empty? || !@directives.empty?
672
+ new_children = []
673
+ new_children.concat(@selections)
674
+ new_children.concat(@directives)
675
+ new_children.freeze
676
+ new_children
677
+ else
678
+ NO_CHILDREN
679
+ end
680
+ end
681
+ end
682
+
683
+ @children_methods = {
478
684
  selections: GraphQL::Language::Nodes::Field,
479
685
  directives: GraphQL::Language::Nodes::Directive,
480
- })
686
+ }.freeze
481
687
 
482
688
  self.children_method_name = :definitions
483
689
  end
484
690
 
485
691
  # Application of a named fragment in a selection
486
692
  class FragmentSpread < AbstractNode
487
- scalar_methods :name
488
- children_methods(directives: GraphQL::Language::Nodes::Directive)
693
+ def visit_method
694
+ :on_fragment_spread
695
+ end
489
696
 
490
- self.children_method_name = :selections
697
+ # **Returns**
698
+ #
699
+ # - `String` — The identifier of the fragment to apply, corresponds with [FragmentDefinition#name](rdoc-ref:FragmentDefinition#name)
700
+ #: String
701
+ attr_reader :name
491
702
 
492
- # @!attribute name
493
- # @return [String] The identifier of the fragment to apply, corresponds with {FragmentDefinition#name}
494
- end
703
+ def scalars
704
+ @scalars ||= [@name].freeze
705
+ end
495
706
 
496
- # An unnamed fragment, defined directly in the query with `... { }`
497
- class InlineFragment < AbstractNode
498
- scalar_methods :type
499
- children_methods({
500
- directives: GraphQL::Language::Nodes::Directive,
501
- selections: GraphQL::Language::Nodes::Field,
502
- })
707
+ #: Array[Directive]
708
+ attr_reader :directives
503
709
 
504
- self.children_method_name = :selections
710
+ def merge_directive(**node_opts)
711
+ merge(directives: directives + [GraphQL::Language::Nodes::Directive.new(**node_opts)])
712
+ end
505
713
 
506
- # @!attribute type
507
- # @return [String, nil] Name of the type this fragment applies to, or `nil` if this fragment applies to any type
508
- end
714
+ alias :children directives
509
715
 
510
- # A collection of key-value inputs which may be a field argument
511
- class InputObject < AbstractNode
512
- scalar_methods(false)
513
- children_methods(arguments: GraphQL::Language::Nodes::Argument)
716
+ #: (?name: untyped, ?directives: Array[Directive], ?line: Integer?, ?col: Integer?, ?pos: Integer?, ?filename: String?, ?source: untyped) -> void
717
+ def initialize(name: nil, directives: NO_CHILDREN, line: nil, col: nil, pos: nil, filename: nil, source: nil)
718
+ @line = line
719
+ @col = col
720
+ @pos = pos
721
+ @filename = filename
722
+ @source = source
723
+ @name = name
724
+ @directives = directives.freeze
725
+ end
514
726
 
515
- # @!attribute arguments
516
- # @return [Array<Nodes::Argument>] A list of key-value pairs inside this input object
727
+ def self.from_a(filename, line, col, name, directives, comment: nil)
728
+ self.new(filename: filename, line: line, col: col, name: name, directives: directives)
729
+ end
517
730
 
518
- # @return [Hash<String, Any>] Recursively turn this input object into a Ruby Hash
519
- def to_h(options={})
520
- arguments.inject({}) do |memo, pair|
521
- v = pair.value
522
- memo[pair.name] = serialize_value_for_hash v
523
- memo
524
- end
731
+ def marshal_dump
732
+ [
733
+ line, col, # use methods here to force them to be calculated
734
+ @filename,
735
+ @name,
736
+ @directives,
737
+ ]
525
738
  end
526
739
 
527
- self.children_method_name = :value
740
+ def marshal_load(values)
741
+ @line, @col, @filename, @name, @directives = values
742
+ end
528
743
 
529
- private
744
+ @children_methods = {
745
+ directives: GraphQL::Language::Nodes::Directive,
746
+ }.freeze
530
747
 
531
- def serialize_value_for_hash(value)
532
- case value
533
- when InputObject
534
- value.to_h
535
- when Array
536
- value.map do |v|
537
- serialize_value_for_hash v
538
- end
539
- when Enum
540
- value.name
541
- when NullValue
542
- nil
543
- else
544
- value
545
- end
546
- end
748
+ self.children_method_name = :selections
547
749
  end
548
750
 
549
- # A list type definition, denoted with `[...]` (used for variable type definitions)
550
- class ListType < WrapperType
551
- end
751
+ # An unnamed fragment, defined directly in the query with `... { }`
752
+ class InlineFragment < AbstractNode
753
+ def visit_method
754
+ :on_inline_fragment
755
+ end
552
756
 
553
- # A non-null type definition, denoted with `...!` (used for variable type definitions)
554
- class NonNullType < WrapperType
555
- end
757
+ # **Returns**
758
+ #
759
+ # - `TypeName, nil` — Name of the type this fragment applies to, or `nil` if this fragment applies to any type
760
+ #: TypeName?
761
+ attr_reader :type
556
762
 
557
- # An operation-level query variable
558
- class VariableDefinition < AbstractNode
559
- scalar_methods :name, :type, :default_value
560
- children_methods(directives: Directive)
561
- # @!attribute default_value
562
- # @return [String, Integer, Float, Boolean, Array, NullValue] A Ruby value to use if no other value is provided
763
+ def scalars
764
+ @scalars ||= [@type].freeze
765
+ end
563
766
 
564
- # @!attribute type
565
- # @return [TypeName, NonNullType, ListType] The expected type of this value
767
+ #: Array[Directive]
768
+ attr_reader :directives
769
+ #: Array[Field | FragmentSpread | InlineFragment]
770
+ attr_reader :selections
566
771
 
567
- # @!attribute name
568
- # @return [String] The identifier for this variable, _without_ `$`
772
+ def merge_directive(**node_opts)
773
+ merge(directives: directives + [GraphQL::Language::Nodes::Directive.new(**node_opts)])
774
+ end
775
+
776
+ def merge_selection(**node_opts)
777
+ merge(selections: selections + [GraphQL::Language::Nodes::Field.new(**node_opts)])
778
+ end
779
+
780
+ def children
781
+ @children ||= begin
782
+ if !@directives.empty? || !@selections.empty?
783
+ new_children = []
784
+ new_children.concat(@directives)
785
+ new_children.concat(@selections)
786
+ new_children.freeze
787
+ new_children
788
+ else
789
+ NO_CHILDREN
790
+ end
791
+ end
792
+ end
793
+
794
+ #: (?type: untyped, ?directives: Array[Directive], ?selections: Array[Field | FragmentSpread | InlineFragment], ?line: Integer?, ?col: Integer?, ?pos: Integer?, ?filename: String?, ?source: untyped) -> void
795
+ def initialize(type: nil, directives: NO_CHILDREN, selections: NO_CHILDREN, line: nil, col: nil, pos: nil, filename: nil, source: nil)
796
+ @line = line
797
+ @col = col
798
+ @pos = pos
799
+ @filename = filename
800
+ @source = source
801
+ @type = type
802
+ @directives = directives.freeze
803
+ @selections = selections.freeze
804
+ end
805
+
806
+ def self.from_a(filename, line, col, type, directives, selections, comment: nil)
807
+ self.new(filename: filename, line: line, col: col, type: type, directives: directives, selections: selections)
808
+ end
809
+
810
+ def marshal_dump
811
+ [
812
+ line, col, # use methods here to force them to be calculated
813
+ @filename,
814
+ @type,
815
+ @directives,
816
+ @selections,
817
+ ]
818
+ end
819
+
820
+ def marshal_load(values)
821
+ @line, @col, @filename, @type, @directives, @selections = values
822
+ end
823
+
824
+ @children_methods = {
825
+ directives: GraphQL::Language::Nodes::Directive,
826
+ selections: GraphQL::Language::Nodes::Field,
827
+ }.freeze
828
+
829
+ self.children_method_name = :selections
830
+ end
831
+
832
+ # A collection of key-value inputs which may be a field argument
833
+ class InputObject < AbstractNode
834
+ def visit_method
835
+ :on_input_object
836
+ end
837
+
838
+ # **Returns**
839
+ #
840
+ # - `Array<Nodes::Argument>` — A list of key-value pairs inside this input object
841
+ #: Array[Argument]
842
+ attr_reader :arguments
843
+
844
+ def merge_argument(**node_opts)
845
+ merge(arguments: arguments + [GraphQL::Language::Nodes::Argument.new(**node_opts)])
846
+ end
847
+
848
+ alias :children arguments
849
+
850
+ #: (?arguments: Array[Argument], ?line: Integer?, ?col: Integer?, ?pos: Integer?, ?filename: String?, ?source: untyped) -> void
851
+ def initialize(arguments: NO_CHILDREN, line: nil, col: nil, pos: nil, filename: nil, source: nil)
852
+ @line = line
853
+ @col = col
854
+ @pos = pos
855
+ @filename = filename
856
+ @source = source
857
+ @arguments = arguments.freeze
858
+ end
859
+
860
+ def self.from_a(filename, line, col, arguments, comment: nil)
861
+ self.new(filename: filename, line: line, col: col, arguments: arguments)
862
+ end
863
+
864
+ def marshal_dump
865
+ [
866
+ line, col, # use methods here to force them to be calculated
867
+ @filename,
868
+ @arguments,
869
+ ]
870
+ end
871
+
872
+ def marshal_load(values)
873
+ @line, @col, @filename, @arguments = values
874
+ end
875
+
876
+ @children_methods = {
877
+ arguments: GraphQL::Language::Nodes::Argument,
878
+ }.freeze
879
+
880
+ # **Returns**
881
+ #
882
+ # - `Hash<String, Any>` — Recursively turn this input object into a Ruby Hash
883
+ #
884
+ # :call-seq:
885
+ # to_h(options=) -> Hash[String, Any]
886
+ def to_h(options={})
887
+ arguments.inject({}) do |memo, pair|
888
+ v = pair.value
889
+ memo[pair.name] = serialize_value_for_hash v
890
+ memo
891
+ end
892
+ end
893
+
894
+ self.children_method_name = :value
895
+
896
+ private
897
+
898
+ def serialize_value_for_hash(value)
899
+ case value
900
+ when InputObject
901
+ value.to_h
902
+ when Array
903
+ value.map do |v|
904
+ serialize_value_for_hash v
905
+ end
906
+ when Enum
907
+ value.name
908
+ when NullValue
909
+ nil
910
+ else
911
+ value
912
+ end
913
+ end
914
+ end
915
+
916
+ # A list type definition, denoted with `[...]` (used for variable type definitions)
917
+ class ListType < WrapperType
918
+ def visit_method
919
+ :on_list_type
920
+ end
921
+ end
922
+
923
+ # A non-null type definition, denoted with `...!` (used for variable type definitions)
924
+ class NonNullType < WrapperType
925
+ def visit_method
926
+ :on_non_null_type
927
+ end
928
+ end
929
+
930
+ # An operation-level query variable
931
+ class VariableDefinition < AbstractNode
932
+ def visit_method
933
+ :on_variable_definition
934
+ end
935
+
936
+ # **Returns**
937
+ #
938
+ # - `String` — The identifier for this variable, _without_ `$`
939
+ #: String
940
+ attr_reader :name
941
+
942
+ # **Returns**
943
+ #
944
+ # - `TypeName, NonNullType, ListType` — The expected type of this value
945
+ #: TypeName | ListType | NonNullType
946
+ attr_reader :type
947
+
948
+ # **Returns**
949
+ #
950
+ # - `String, Integer, Float, Boolean, Array, NullValue` — A Ruby value to use if no other value is provided
951
+ #: untyped
952
+ attr_reader :default_value
953
+
954
+ def scalars
955
+ @scalars ||= [@name, @type, @default_value].freeze
956
+ end
957
+
958
+ #: Array[Directive]
959
+ attr_reader :directives
960
+
961
+ def merge_directive(**node_opts)
962
+ merge(directives: directives + [GraphQL::Language::Nodes::Directive.new(**node_opts)])
963
+ end
964
+
965
+ alias :children directives
966
+
967
+ #: (?name: untyped, ?type: untyped, ?default_value: untyped, ?directives: Array[Directive], ?line: Integer?, ?col: Integer?, ?pos: Integer?, ?filename: String?, ?source: untyped, ?definition_pos: Integer?) -> void
968
+ def initialize(name: nil, type: nil, default_value: nil, directives: NO_CHILDREN, line: nil, col: nil, pos: nil, filename: nil, source: nil, definition_pos: nil)
969
+ @line = line
970
+ @col = col
971
+ @pos = pos
972
+ @filename = filename
973
+ @source = source
974
+ @name = name
975
+ @type = type
976
+ @default_value = default_value
977
+ @directives = directives.freeze
978
+ @definition_pos = definition_pos
979
+ end
980
+
981
+ def self.from_a(filename, line, col, name, type, default_value, directives, comment: nil) # rubocop:disable Metrics/ParameterLists
982
+ self.new(filename: filename, line: line, col: col, name: name, type: type, default_value: default_value, directives: directives)
983
+ end
984
+
985
+ def marshal_dump
986
+ [
987
+ line, col, # use methods here to force them to be calculated
988
+ @filename,
989
+ @name,
990
+ @type,
991
+ @default_value,
992
+ @directives,
993
+ ]
994
+ end
995
+
996
+ def marshal_load(values)
997
+ @line, @col, @filename, @name, @type, @default_value, @directives = values
998
+ end
999
+
1000
+ @children_methods = {
1001
+ directives: GraphQL::Language::Nodes::Directive,
1002
+ }.freeze
569
1003
 
570
1004
  self.children_method_name = :variables
571
1005
  end
@@ -574,51 +1008,181 @@ module GraphQL
574
1008
  # May be anonymous or named.
575
1009
  # May be explicitly typed (eg `mutation { ... }`) or implicitly a query (eg `{ ... }`).
576
1010
  class OperationDefinition < AbstractNode
577
- scalar_methods :operation_type, :name
578
- children_methods({
579
- variables: GraphQL::Language::Nodes::VariableDefinition,
580
- directives: GraphQL::Language::Nodes::Directive,
581
- selections: GraphQL::Language::Nodes::Field,
582
- })
1011
+ def visit_method
1012
+ :on_operation_definition
1013
+ end
1014
+
1015
+ # **Returns**
1016
+ #
1017
+ # - `String` — The root type for this operation: `"query"` (including implicit queries), `"mutation"` or `"subscription"`
1018
+ #: String
1019
+ attr_reader :operation_type
1020
+
1021
+ # **Returns**
1022
+ #
1023
+ # - `String, nil` — The name for this operation, or `nil` if unnamed
1024
+ #: String?
1025
+ attr_reader :name
1026
+
1027
+ def scalars
1028
+ @scalars ||= [@operation_type, @name].freeze
1029
+ end
1030
+
1031
+ # **Returns**
1032
+ #
1033
+ # - `Array<VariableDefinition>` — Variable $definitions for this operation
1034
+ #: Array[VariableDefinition]
1035
+ attr_reader :variables
1036
+ #: Array[Directive]
1037
+ attr_reader :directives
1038
+
1039
+ # **Returns**
1040
+ #
1041
+ # - `Array<Field, FragmentSpread, InlineFragment>` — Root-level fields on this operation
1042
+ #: Array[Field | FragmentSpread | InlineFragment]
1043
+ attr_reader :selections
1044
+
1045
+ def merge_variable(**node_opts)
1046
+ merge(variables: variables + [GraphQL::Language::Nodes::VariableDefinition.new(**node_opts)])
1047
+ end
1048
+
1049
+ def merge_directive(**node_opts)
1050
+ merge(directives: directives + [GraphQL::Language::Nodes::Directive.new(**node_opts)])
1051
+ end
1052
+
1053
+ def merge_selection(**node_opts)
1054
+ merge(selections: selections + [GraphQL::Language::Nodes::Field.new(**node_opts)])
1055
+ end
1056
+
1057
+ def children
1058
+ @children ||= begin
1059
+ if !@variables.empty? || !@directives.empty? || !@selections.empty?
1060
+ new_children = []
1061
+ new_children.concat(@variables)
1062
+ new_children.concat(@directives)
1063
+ new_children.concat(@selections)
1064
+ new_children.freeze
1065
+ new_children
1066
+ else
1067
+ NO_CHILDREN
1068
+ end
1069
+ end
1070
+ end
1071
+
1072
+ #: (?operation_type: untyped, ?name: untyped, ?variables: Array[VariableDefinition], ?directives: Array[Directive], ?selections: Array[Field | FragmentSpread | InlineFragment], ?line: Integer?, ?col: Integer?, ?pos: Integer?, ?filename: String?, ?source: untyped, ?definition_pos: Integer?) -> void
1073
+ def initialize(operation_type: nil, name: nil, variables: NO_CHILDREN, directives: NO_CHILDREN, selections: NO_CHILDREN, line: nil, col: nil, pos: nil, filename: nil, source: nil, definition_pos: nil)
1074
+ @line = line
1075
+ @col = col
1076
+ @pos = pos
1077
+ @filename = filename
1078
+ @source = source
1079
+ @operation_type = operation_type
1080
+ @name = name
1081
+ @variables = variables.freeze
1082
+ @directives = directives.freeze
1083
+ @selections = selections.freeze
1084
+ @definition_pos = definition_pos
1085
+ end
583
1086
 
584
- # @!attribute variables
585
- # @return [Array<VariableDefinition>] Variable $definitions for this operation
1087
+ def self.from_a(filename, line, col, operation_type, name, variables, directives, selections, comment: nil) # rubocop:disable Metrics/ParameterLists
1088
+ self.new(filename: filename, line: line, col: col, operation_type: operation_type, name: name, variables: variables, directives: directives, selections: selections)
1089
+ end
586
1090
 
587
- # @!attribute selections
588
- # @return [Array<Field>] Root-level fields on this operation
1091
+ def marshal_dump
1092
+ [
1093
+ line, col, # use methods here to force them to be calculated
1094
+ @filename,
1095
+ @operation_type,
1096
+ @name,
1097
+ @variables,
1098
+ @directives,
1099
+ @selections,
1100
+ ]
1101
+ end
589
1102
 
590
- # @!attribute operation_type
591
- # @return [String, nil] The root type for this operation, or `nil` for implicit `"query"`
1103
+ def marshal_load(values)
1104
+ @line, @col, @filename, @operation_type, @name, @variables, @directives, @selections = values
1105
+ end
592
1106
 
593
- # @!attribute name
594
- # @return [String, nil] The name for this operation, or `nil` if unnamed
1107
+ @children_methods = {
1108
+ variables: GraphQL::Language::Nodes::VariableDefinition,
1109
+ directives: GraphQL::Language::Nodes::Directive,
1110
+ selections: GraphQL::Language::Nodes::Field,
1111
+ }.freeze
595
1112
 
596
1113
  self.children_method_name = :definitions
597
1114
  end
598
1115
 
599
1116
  # This is the AST root for normal queries
600
1117
  #
601
- # @example Deriving a document by parsing a string
602
- # document = GraphQL.parse(query_string)
1118
+ # **Examples**
603
1119
  #
604
- # @example Creating a string from a document
605
- # document.to_query_string
606
- # # { ... }
1120
+ # **Example: Deriving a document by parsing a string**
607
1121
  #
608
- # @example Creating a custom string from a document
609
- # class VariableScrubber < GraphQL::Language::Printer
610
- # def print_argument(arg)
611
- # print_string("#{arg.name}: <HIDDEN>")
612
- # end
613
- # end
1122
+ # ```ruby
1123
+ # document = GraphQL.parse(query_string)
1124
+ # ```
614
1125
  #
615
- # document.to_query_string(printer: VariableScrubber.new)
1126
+ # **Example: Creating a string from a document**
616
1127
  #
1128
+ # ```ruby
1129
+ # document.to_query_string
1130
+ # # { ... }
1131
+ # ```
1132
+ #
1133
+ # **Example: Creating a custom string from a document**
1134
+ #
1135
+ # ```ruby
1136
+ # class VariableScrubber < GraphQL::Language::Printer
1137
+ # def print_argument(arg)
1138
+ # print_string("#{arg.name}: <HIDDEN>")
1139
+ # end
1140
+ # end
1141
+ #
1142
+ # document.to_query_string(printer: VariableScrubber.new)
1143
+ # ```
617
1144
  class Document < AbstractNode
618
- scalar_methods false
619
- children_methods(definitions: nil)
620
- # @!attribute definitions
621
- # @return [Array<OperationDefinition, FragmentDefinition>] top-level GraphQL units: operations or fragments
1145
+ def visit_method
1146
+ :on_document
1147
+ end
1148
+
1149
+ # **Returns**
1150
+ #
1151
+ # - `Array<OperationDefinition, FragmentDefinition, AbstractNode>` — top-level GraphQL units: operations or fragments
1152
+ #: Array[AbstractNode]
1153
+ attr_reader :definitions
1154
+
1155
+ alias :children definitions
1156
+
1157
+ #: (?definitions: Array[AbstractNode], ?line: Integer?, ?col: Integer?, ?pos: Integer?, ?filename: String?, ?source: untyped) -> void
1158
+ def initialize(definitions: NO_CHILDREN, line: nil, col: nil, pos: nil, filename: nil, source: nil)
1159
+ @line = line
1160
+ @col = col
1161
+ @pos = pos
1162
+ @filename = filename
1163
+ @source = source
1164
+ @definitions = definitions.freeze
1165
+ end
1166
+
1167
+ def self.from_a(filename, line, col, definitions, comment: nil)
1168
+ self.new(filename: filename, line: line, col: col, definitions: definitions)
1169
+ end
1170
+
1171
+ def marshal_dump
1172
+ [
1173
+ line, col, # use methods here to force them to be calculated
1174
+ @filename,
1175
+ @definitions,
1176
+ ]
1177
+ end
1178
+
1179
+ def marshal_load(values)
1180
+ @line, @col, @filename, @definitions = values
1181
+ end
1182
+
1183
+ @children_methods = {
1184
+ definitions: nil,
1185
+ }.freeze
622
1186
 
623
1187
  def slice_definition(name)
624
1188
  GraphQL::Language::DefinitionSlice.slice(self, name)
@@ -627,177 +1191,1288 @@ module GraphQL
627
1191
 
628
1192
  # A type name, used for variable definitions
629
1193
  class TypeName < NameOnlyNode
1194
+ def visit_method
1195
+ :on_type_name
1196
+ end
630
1197
  end
631
1198
 
632
1199
  # Usage of a variable in a query. Name does _not_ include `$`.
633
1200
  class VariableIdentifier < NameOnlyNode
1201
+ def visit_method
1202
+ :on_variable_identifier
1203
+ end
1204
+
634
1205
  self.children_method_name = :value
635
1206
  end
636
1207
 
637
1208
  class SchemaDefinition < AbstractNode
638
- scalar_methods :query, :mutation, :subscription
639
- children_methods({
640
- directives: GraphQL::Language::Nodes::Directive,
641
- })
642
- self.children_method_name = :definitions
643
- end
1209
+ def visit_method
1210
+ :on_schema_definition
1211
+ end
644
1212
 
645
- class SchemaExtension < AbstractNode
646
- scalar_methods :query, :mutation, :subscription
647
- children_methods({
648
- directives: GraphQL::Language::Nodes::Directive,
649
- })
650
- self.children_method_name = :definitions
651
- end
1213
+ #: String?
1214
+ attr_reader :query
1215
+ #: String?
1216
+ attr_reader :mutation
1217
+ #: String?
1218
+ attr_reader :subscription
652
1219
 
653
- class ScalarTypeDefinition < AbstractNode
654
- attr_reader :description, :comment
655
- scalar_methods :name
656
- children_methods({
657
- directives: GraphQL::Language::Nodes::Directive,
658
- })
659
- self.children_method_name = :definitions
660
- end
1220
+ def scalars
1221
+ @scalars ||= [@query, @mutation, @subscription].freeze
1222
+ end
661
1223
 
662
- class ScalarTypeExtension < AbstractNode
663
- scalar_methods :name
664
- children_methods({
665
- directives: GraphQL::Language::Nodes::Directive,
666
- })
667
- self.children_method_name = :definitions
668
- end
1224
+ #: Array[Directive]
1225
+ attr_reader :directives
669
1226
 
670
- class InputValueDefinition < AbstractNode
671
- attr_reader :description, :comment
672
- scalar_methods :name, :type, :default_value
673
- children_methods({
674
- directives: GraphQL::Language::Nodes::Directive,
675
- })
676
- self.children_method_name = :fields
677
- end
1227
+ def merge_directive(**node_opts)
1228
+ merge(directives: directives + [GraphQL::Language::Nodes::Directive.new(**node_opts)])
1229
+ end
678
1230
 
679
- class FieldDefinition < AbstractNode
680
- attr_reader :description, :comment
681
- scalar_methods :name, :type
682
- children_methods({
683
- arguments: GraphQL::Language::Nodes::InputValueDefinition,
684
- directives: GraphQL::Language::Nodes::Directive,
685
- })
686
- self.children_method_name = :fields
1231
+ alias :children directives
687
1232
 
688
- # this is so that `children_method_name` of `InputValueDefinition` works properly
689
- # with `#replace_child`
690
- alias :fields :arguments
691
- def merge(new_options)
692
- if (f = new_options.delete(:fields))
693
- new_options[:arguments] = f
694
- end
695
- super
1233
+ #: (?query: untyped, ?mutation: untyped, ?subscription: untyped, ?directives: Array[Directive], ?line: Integer?, ?col: Integer?, ?pos: Integer?, ?filename: String?, ?source: untyped, ?definition_pos: Integer?) -> void
1234
+ def initialize(query: nil, mutation: nil, subscription: nil, directives: NO_CHILDREN, line: nil, col: nil, pos: nil, filename: nil, source: nil, definition_pos: nil)
1235
+ @line = line
1236
+ @col = col
1237
+ @pos = pos
1238
+ @filename = filename
1239
+ @source = source
1240
+ @query = query
1241
+ @mutation = mutation
1242
+ @subscription = subscription
1243
+ @directives = directives.freeze
1244
+ @definition_pos = definition_pos
696
1245
  end
697
- end
698
1246
 
699
- class ObjectTypeDefinition < AbstractNode
700
- attr_reader :description, :comment
701
- scalar_methods :name, :interfaces
702
- children_methods({
703
- directives: GraphQL::Language::Nodes::Directive,
704
- fields: GraphQL::Language::Nodes::FieldDefinition,
705
- })
706
- self.children_method_name = :definitions
707
- end
1247
+ def self.from_a(filename, line, col, query, mutation, subscription, directives, comment: nil) # rubocop:disable Metrics/ParameterLists
1248
+ self.new(filename: filename, line: line, col: col, query: query, mutation: mutation, subscription: subscription, directives: directives)
1249
+ end
708
1250
 
709
- class ObjectTypeExtension < AbstractNode
710
- scalar_methods :name, :interfaces
711
- children_methods({
712
- directives: GraphQL::Language::Nodes::Directive,
713
- fields: GraphQL::Language::Nodes::FieldDefinition,
714
- })
715
- self.children_method_name = :definitions
716
- end
1251
+ def marshal_dump
1252
+ [
1253
+ line, col, # use methods here to force them to be calculated
1254
+ @filename,
1255
+ @query,
1256
+ @mutation,
1257
+ @subscription,
1258
+ @directives,
1259
+ ]
1260
+ end
717
1261
 
718
- class InterfaceTypeDefinition < AbstractNode
719
- attr_reader :description, :comment
720
- scalar_methods :name
721
- children_methods({
722
- interfaces: GraphQL::Language::Nodes::TypeName,
1262
+ def marshal_load(values)
1263
+ @line, @col, @filename, @query, @mutation, @subscription, @directives = values
1264
+ end
1265
+
1266
+ @children_methods = {
723
1267
  directives: GraphQL::Language::Nodes::Directive,
724
- fields: GraphQL::Language::Nodes::FieldDefinition,
725
- })
1268
+ }.freeze
726
1269
  self.children_method_name = :definitions
727
1270
  end
728
1271
 
729
- class InterfaceTypeExtension < AbstractNode
730
- scalar_methods :name
731
- children_methods({
1272
+ class SchemaExtension < AbstractNode
1273
+ def visit_method
1274
+ :on_schema_extension
1275
+ end
1276
+
1277
+ #: String?
1278
+ attr_reader :query
1279
+ #: String?
1280
+ attr_reader :mutation
1281
+ #: String?
1282
+ attr_reader :subscription
1283
+
1284
+ def scalars
1285
+ @scalars ||= [@query, @mutation, @subscription].freeze
1286
+ end
1287
+
1288
+ #: Array[Directive]
1289
+ attr_reader :directives
1290
+
1291
+ def merge_directive(**node_opts)
1292
+ merge(directives: directives + [GraphQL::Language::Nodes::Directive.new(**node_opts)])
1293
+ end
1294
+
1295
+ alias :children directives
1296
+
1297
+ #: (?query: untyped, ?mutation: untyped, ?subscription: untyped, ?directives: Array[Directive], ?line: Integer?, ?col: Integer?, ?pos: Integer?, ?filename: String?, ?source: untyped) -> void
1298
+ def initialize(query: nil, mutation: nil, subscription: nil, directives: NO_CHILDREN, line: nil, col: nil, pos: nil, filename: nil, source: nil)
1299
+ @line = line
1300
+ @col = col
1301
+ @pos = pos
1302
+ @filename = filename
1303
+ @source = source
1304
+ @query = query
1305
+ @mutation = mutation
1306
+ @subscription = subscription
1307
+ @directives = directives.freeze
1308
+ end
1309
+
1310
+ def self.from_a(filename, line, col, query, mutation, subscription, directives, comment: nil) # rubocop:disable Metrics/ParameterLists
1311
+ self.new(filename: filename, line: line, col: col, query: query, mutation: mutation, subscription: subscription, directives: directives)
1312
+ end
1313
+
1314
+ def marshal_dump
1315
+ [
1316
+ line, col, # use methods here to force them to be calculated
1317
+ @filename,
1318
+ @query,
1319
+ @mutation,
1320
+ @subscription,
1321
+ @directives,
1322
+ ]
1323
+ end
1324
+
1325
+ def marshal_load(values)
1326
+ @line, @col, @filename, @query, @mutation, @subscription, @directives = values
1327
+ end
1328
+
1329
+ @children_methods = {
1330
+ directives: GraphQL::Language::Nodes::Directive,
1331
+ }.freeze
1332
+ self.children_method_name = :definitions
1333
+ end
1334
+
1335
+ class ScalarTypeDefinition < AbstractNode
1336
+ def visit_method
1337
+ :on_scalar_type_definition
1338
+ end
1339
+
1340
+ #: String?
1341
+ attr_reader :description
1342
+ #: String?
1343
+ attr_reader :comment
1344
+ #: String
1345
+ attr_reader :name
1346
+
1347
+ def scalars
1348
+ @scalars ||= [@name].freeze
1349
+ end
1350
+
1351
+ #: Array[Directive]
1352
+ attr_reader :directives
1353
+
1354
+ def merge_directive(**node_opts)
1355
+ merge(directives: directives + [GraphQL::Language::Nodes::Directive.new(**node_opts)])
1356
+ end
1357
+
1358
+ alias :children directives
1359
+
1360
+ #: (?name: untyped, ?description: untyped, ?comment: untyped, ?directives: Array[Directive], ?line: Integer?, ?col: Integer?, ?pos: Integer?, ?filename: String?, ?source: untyped, ?definition_pos: Integer?) -> void
1361
+ def initialize(name: nil, description: nil, comment: nil, directives: NO_CHILDREN, line: nil, col: nil, pos: nil, filename: nil, source: nil, definition_pos: nil)
1362
+ @line = line
1363
+ @col = col
1364
+ @pos = pos
1365
+ @filename = filename
1366
+ @source = source
1367
+ @name = name
1368
+ @description = description && -description
1369
+ @comment = comment
1370
+ @directives = directives.freeze
1371
+ @definition_pos = definition_pos
1372
+ end
1373
+
1374
+ def self.from_a(filename, line, col, name, description, directives, comment: nil)
1375
+ self.new(filename: filename, line: line, col: col, name: name, description: description, comment: comment, directives: directives)
1376
+ end
1377
+
1378
+ def marshal_dump
1379
+ [
1380
+ line, col, # use methods here to force them to be calculated
1381
+ @filename,
1382
+ @name,
1383
+ @description,
1384
+ @directives,
1385
+ ]
1386
+ end
1387
+
1388
+ def marshal_load(values)
1389
+ @line, @col, @filename, @name, @description, @directives = values
1390
+ end
1391
+
1392
+ @children_methods = {
1393
+ directives: GraphQL::Language::Nodes::Directive,
1394
+ }.freeze
1395
+ self.children_method_name = :definitions
1396
+ end
1397
+
1398
+ class ScalarTypeExtension < AbstractNode
1399
+ def visit_method
1400
+ :on_scalar_type_extension
1401
+ end
1402
+
1403
+ #: String
1404
+ attr_reader :name
1405
+
1406
+ def scalars
1407
+ @scalars ||= [@name].freeze
1408
+ end
1409
+
1410
+ #: Array[Directive]
1411
+ attr_reader :directives
1412
+
1413
+ def merge_directive(**node_opts)
1414
+ merge(directives: directives + [GraphQL::Language::Nodes::Directive.new(**node_opts)])
1415
+ end
1416
+
1417
+ alias :children directives
1418
+
1419
+ #: (?name: untyped, ?directives: Array[Directive], ?line: Integer?, ?col: Integer?, ?pos: Integer?, ?filename: String?, ?source: untyped) -> void
1420
+ def initialize(name: nil, directives: NO_CHILDREN, line: nil, col: nil, pos: nil, filename: nil, source: nil)
1421
+ @line = line
1422
+ @col = col
1423
+ @pos = pos
1424
+ @filename = filename
1425
+ @source = source
1426
+ @name = name
1427
+ @directives = directives.freeze
1428
+ end
1429
+
1430
+ def self.from_a(filename, line, col, name, directives, comment: nil)
1431
+ self.new(filename: filename, line: line, col: col, name: name, directives: directives)
1432
+ end
1433
+
1434
+ def marshal_dump
1435
+ [
1436
+ line, col, # use methods here to force them to be calculated
1437
+ @filename,
1438
+ @name,
1439
+ @directives,
1440
+ ]
1441
+ end
1442
+
1443
+ def marshal_load(values)
1444
+ @line, @col, @filename, @name, @directives = values
1445
+ end
1446
+
1447
+ @children_methods = {
1448
+ directives: GraphQL::Language::Nodes::Directive,
1449
+ }.freeze
1450
+ self.children_method_name = :definitions
1451
+ end
1452
+
1453
+ class InputValueDefinition < AbstractNode
1454
+ def visit_method
1455
+ :on_input_value_definition
1456
+ end
1457
+
1458
+ #: String?
1459
+ attr_reader :description
1460
+ #: String?
1461
+ attr_reader :comment
1462
+ #: String
1463
+ attr_reader :name
1464
+ #: TypeName | ListType | NonNullType
1465
+ attr_reader :type
1466
+ #: untyped
1467
+ attr_reader :default_value
1468
+
1469
+ def scalars
1470
+ @scalars ||= [@name, @type, @default_value].freeze
1471
+ end
1472
+
1473
+ #: Array[Directive]
1474
+ attr_reader :directives
1475
+
1476
+ def merge_directive(**node_opts)
1477
+ merge(directives: directives + [GraphQL::Language::Nodes::Directive.new(**node_opts)])
1478
+ end
1479
+
1480
+ alias :children directives
1481
+
1482
+ #: (?name: untyped, ?type: untyped, ?default_value: untyped, ?description: untyped, ?comment: untyped, ?directives: Array[Directive], ?line: Integer?, ?col: Integer?, ?pos: Integer?, ?filename: String?, ?source: untyped, ?definition_pos: Integer?) -> void
1483
+ def initialize(name: nil, type: nil, default_value: nil, description: nil, comment: nil, directives: NO_CHILDREN, line: nil, col: nil, pos: nil, filename: nil, source: nil, definition_pos: nil)
1484
+ @line = line
1485
+ @col = col
1486
+ @pos = pos
1487
+ @filename = filename
1488
+ @source = source
1489
+ @name = name
1490
+ @type = type
1491
+ @default_value = default_value
1492
+ @description = description && -description
1493
+ @comment = comment
1494
+ @directives = directives.freeze
1495
+ @definition_pos = definition_pos
1496
+ end
1497
+
1498
+ def self.from_a(filename, line, col, name, type, default_value, description, directives, comment: nil) # rubocop:disable Metrics/ParameterLists
1499
+ self.new(filename: filename, line: line, col: col, name: name, type: type, default_value: default_value, description: description, comment: comment, directives: directives)
1500
+ end
1501
+
1502
+ def marshal_dump
1503
+ [
1504
+ line, col, # use methods here to force them to be calculated
1505
+ @filename,
1506
+ @name,
1507
+ @type,
1508
+ @default_value,
1509
+ @description,
1510
+ @directives,
1511
+ ]
1512
+ end
1513
+
1514
+ def marshal_load(values)
1515
+ @line, @col, @filename, @name, @type, @default_value, @description, @directives = values
1516
+ end
1517
+
1518
+ @children_methods = {
1519
+ directives: GraphQL::Language::Nodes::Directive,
1520
+ }.freeze
1521
+ self.children_method_name = :fields
1522
+ end
1523
+
1524
+ class FieldDefinition < AbstractNode
1525
+ def visit_method
1526
+ :on_field_definition
1527
+ end
1528
+
1529
+ #: String?
1530
+ attr_reader :description
1531
+ #: String?
1532
+ attr_reader :comment
1533
+ #: String
1534
+ attr_reader :name
1535
+ #: TypeName | ListType | NonNullType
1536
+ attr_reader :type
1537
+
1538
+ def scalars
1539
+ @scalars ||= [@name, @type].freeze
1540
+ end
1541
+
1542
+ #: Array[InputValueDefinition]
1543
+ attr_reader :arguments
1544
+ #: Array[Directive]
1545
+ attr_reader :directives
1546
+
1547
+ def merge_argument(**node_opts)
1548
+ merge(arguments: arguments + [GraphQL::Language::Nodes::InputValueDefinition.new(**node_opts)])
1549
+ end
1550
+
1551
+ def merge_directive(**node_opts)
1552
+ merge(directives: directives + [GraphQL::Language::Nodes::Directive.new(**node_opts)])
1553
+ end
1554
+
1555
+ def children
1556
+ @children ||= begin
1557
+ if !@arguments.empty? || !@directives.empty?
1558
+ new_children = []
1559
+ new_children.concat(@arguments)
1560
+ new_children.concat(@directives)
1561
+ new_children.freeze
1562
+ new_children
1563
+ else
1564
+ NO_CHILDREN
1565
+ end
1566
+ end
1567
+ end
1568
+
1569
+ #: (?name: untyped, ?type: untyped, ?description: untyped, ?comment: untyped, ?arguments: Array[InputValueDefinition], ?directives: Array[Directive], ?line: Integer?, ?col: Integer?, ?pos: Integer?, ?filename: String?, ?source: untyped, ?definition_pos: Integer?) -> void
1570
+ def initialize(name: nil, type: nil, description: nil, comment: nil, arguments: NO_CHILDREN, directives: NO_CHILDREN, line: nil, col: nil, pos: nil, filename: nil, source: nil, definition_pos: nil)
1571
+ @line = line
1572
+ @col = col
1573
+ @pos = pos
1574
+ @filename = filename
1575
+ @source = source
1576
+ @name = name
1577
+ @type = type
1578
+ @description = description && -description
1579
+ @comment = comment
1580
+ @arguments = arguments.freeze
1581
+ @directives = directives.freeze
1582
+ @definition_pos = definition_pos
1583
+ end
1584
+
1585
+ def self.from_a(filename, line, col, name, type, description, arguments, directives, comment: nil) # rubocop:disable Metrics/ParameterLists
1586
+ self.new(filename: filename, line: line, col: col, name: name, type: type, description: description, comment: comment, arguments: arguments, directives: directives)
1587
+ end
1588
+
1589
+ def marshal_dump
1590
+ [
1591
+ line, col, # use methods here to force them to be calculated
1592
+ @filename,
1593
+ @name,
1594
+ @type,
1595
+ @description,
1596
+ @arguments,
1597
+ @directives,
1598
+ ]
1599
+ end
1600
+
1601
+ def marshal_load(values)
1602
+ @line, @col, @filename, @name, @type, @description, @arguments, @directives = values
1603
+ end
1604
+
1605
+ @children_methods = {
1606
+ arguments: GraphQL::Language::Nodes::InputValueDefinition,
1607
+ directives: GraphQL::Language::Nodes::Directive,
1608
+ }.freeze
1609
+ self.children_method_name = :fields
1610
+
1611
+ # this is so that `children_method_name` of `InputValueDefinition` works properly
1612
+ # with `#replace_child`
1613
+ alias :fields :arguments
1614
+ def merge(new_options)
1615
+ if (f = new_options.delete(:fields))
1616
+ new_options[:arguments] = f
1617
+ end
1618
+ super
1619
+ end
1620
+ end
1621
+
1622
+ class ObjectTypeDefinition < AbstractNode
1623
+ def visit_method
1624
+ :on_object_type_definition
1625
+ end
1626
+
1627
+ #: String?
1628
+ attr_reader :description
1629
+ #: String?
1630
+ attr_reader :comment
1631
+ #: String
1632
+ attr_reader :name
1633
+ #: Array[TypeName]
1634
+ attr_reader :interfaces
1635
+
1636
+ def scalars
1637
+ @scalars ||= [@name, @interfaces].freeze
1638
+ end
1639
+
1640
+ #: Array[Directive]
1641
+ attr_reader :directives
1642
+ #: Array[FieldDefinition]
1643
+ attr_reader :fields
1644
+
1645
+ def merge_directive(**node_opts)
1646
+ merge(directives: directives + [GraphQL::Language::Nodes::Directive.new(**node_opts)])
1647
+ end
1648
+
1649
+ def merge_field(**node_opts)
1650
+ merge(fields: fields + [GraphQL::Language::Nodes::FieldDefinition.new(**node_opts)])
1651
+ end
1652
+
1653
+ def children
1654
+ @children ||= begin
1655
+ if !@directives.empty? || !@fields.empty?
1656
+ new_children = []
1657
+ new_children.concat(@directives)
1658
+ new_children.concat(@fields)
1659
+ new_children.freeze
1660
+ new_children
1661
+ else
1662
+ NO_CHILDREN
1663
+ end
1664
+ end
1665
+ end
1666
+
1667
+ #: (?name: untyped, ?interfaces: untyped, ?description: untyped, ?comment: untyped, ?directives: Array[Directive], ?fields: Array[FieldDefinition], ?line: Integer?, ?col: Integer?, ?pos: Integer?, ?filename: String?, ?source: untyped, ?definition_pos: Integer?) -> void
1668
+ def initialize(name: nil, interfaces: nil, description: nil, comment: nil, directives: NO_CHILDREN, fields: NO_CHILDREN, line: nil, col: nil, pos: nil, filename: nil, source: nil, definition_pos: nil)
1669
+ @line = line
1670
+ @col = col
1671
+ @pos = pos
1672
+ @filename = filename
1673
+ @source = source
1674
+ @name = name
1675
+ @interfaces = interfaces
1676
+ @description = description && -description
1677
+ @comment = comment
1678
+ @directives = directives.freeze
1679
+ @fields = fields.freeze
1680
+ @definition_pos = definition_pos
1681
+ end
1682
+
1683
+ def self.from_a(filename, line, col, name, interfaces, description, directives, fields, comment: nil) # rubocop:disable Metrics/ParameterLists
1684
+ self.new(filename: filename, line: line, col: col, name: name, interfaces: interfaces, description: description, comment: comment, directives: directives, fields: fields)
1685
+ end
1686
+
1687
+ def marshal_dump
1688
+ [
1689
+ line, col, # use methods here to force them to be calculated
1690
+ @filename,
1691
+ @name,
1692
+ @interfaces,
1693
+ @description,
1694
+ @directives,
1695
+ @fields,
1696
+ ]
1697
+ end
1698
+
1699
+ def marshal_load(values)
1700
+ @line, @col, @filename, @name, @interfaces, @description, @directives, @fields = values
1701
+ end
1702
+
1703
+ @children_methods = {
1704
+ directives: GraphQL::Language::Nodes::Directive,
1705
+ fields: GraphQL::Language::Nodes::FieldDefinition,
1706
+ }.freeze
1707
+ self.children_method_name = :definitions
1708
+ end
1709
+
1710
+ class ObjectTypeExtension < AbstractNode
1711
+ def visit_method
1712
+ :on_object_type_extension
1713
+ end
1714
+
1715
+ #: String
1716
+ attr_reader :name
1717
+ #: Array[TypeName]
1718
+ attr_reader :interfaces
1719
+
1720
+ def scalars
1721
+ @scalars ||= [@name, @interfaces].freeze
1722
+ end
1723
+
1724
+ #: Array[Directive]
1725
+ attr_reader :directives
1726
+ #: Array[FieldDefinition]
1727
+ attr_reader :fields
1728
+
1729
+ def merge_directive(**node_opts)
1730
+ merge(directives: directives + [GraphQL::Language::Nodes::Directive.new(**node_opts)])
1731
+ end
1732
+
1733
+ def merge_field(**node_opts)
1734
+ merge(fields: fields + [GraphQL::Language::Nodes::FieldDefinition.new(**node_opts)])
1735
+ end
1736
+
1737
+ def children
1738
+ @children ||= begin
1739
+ if !@directives.empty? || !@fields.empty?
1740
+ new_children = []
1741
+ new_children.concat(@directives)
1742
+ new_children.concat(@fields)
1743
+ new_children.freeze
1744
+ new_children
1745
+ else
1746
+ NO_CHILDREN
1747
+ end
1748
+ end
1749
+ end
1750
+
1751
+ #: (?name: untyped, ?interfaces: untyped, ?directives: Array[Directive], ?fields: Array[FieldDefinition], ?line: Integer?, ?col: Integer?, ?pos: Integer?, ?filename: String?, ?source: untyped) -> void
1752
+ def initialize(name: nil, interfaces: nil, directives: NO_CHILDREN, fields: NO_CHILDREN, line: nil, col: nil, pos: nil, filename: nil, source: nil)
1753
+ @line = line
1754
+ @col = col
1755
+ @pos = pos
1756
+ @filename = filename
1757
+ @source = source
1758
+ @name = name
1759
+ @interfaces = interfaces
1760
+ @directives = directives.freeze
1761
+ @fields = fields.freeze
1762
+ end
1763
+
1764
+ def self.from_a(filename, line, col, name, interfaces, directives, fields, comment: nil) # rubocop:disable Metrics/ParameterLists
1765
+ self.new(filename: filename, line: line, col: col, name: name, interfaces: interfaces, directives: directives, fields: fields)
1766
+ end
1767
+
1768
+ def marshal_dump
1769
+ [
1770
+ line, col, # use methods here to force them to be calculated
1771
+ @filename,
1772
+ @name,
1773
+ @interfaces,
1774
+ @directives,
1775
+ @fields,
1776
+ ]
1777
+ end
1778
+
1779
+ def marshal_load(values)
1780
+ @line, @col, @filename, @name, @interfaces, @directives, @fields = values
1781
+ end
1782
+
1783
+ @children_methods = {
1784
+ directives: GraphQL::Language::Nodes::Directive,
1785
+ fields: GraphQL::Language::Nodes::FieldDefinition,
1786
+ }.freeze
1787
+ self.children_method_name = :definitions
1788
+ end
1789
+
1790
+ class InterfaceTypeDefinition < AbstractNode
1791
+ def visit_method
1792
+ :on_interface_type_definition
1793
+ end
1794
+
1795
+ #: String?
1796
+ attr_reader :description
1797
+ #: String?
1798
+ attr_reader :comment
1799
+ #: String
1800
+ attr_reader :name
1801
+
1802
+ def scalars
1803
+ @scalars ||= [@name].freeze
1804
+ end
1805
+
1806
+ #: Array[TypeName]
1807
+ attr_reader :interfaces
1808
+ #: Array[Directive]
1809
+ attr_reader :directives
1810
+ #: Array[FieldDefinition]
1811
+ attr_reader :fields
1812
+
1813
+ def merge_interface(**node_opts)
1814
+ merge(interfaces: interfaces + [GraphQL::Language::Nodes::TypeName.new(**node_opts)])
1815
+ end
1816
+
1817
+ def merge_directive(**node_opts)
1818
+ merge(directives: directives + [GraphQL::Language::Nodes::Directive.new(**node_opts)])
1819
+ end
1820
+
1821
+ def merge_field(**node_opts)
1822
+ merge(fields: fields + [GraphQL::Language::Nodes::FieldDefinition.new(**node_opts)])
1823
+ end
1824
+
1825
+ def children
1826
+ @children ||= begin
1827
+ if !@interfaces.empty? || !@directives.empty? || !@fields.empty?
1828
+ new_children = []
1829
+ new_children.concat(@interfaces)
1830
+ new_children.concat(@directives)
1831
+ new_children.concat(@fields)
1832
+ new_children.freeze
1833
+ new_children
1834
+ else
1835
+ NO_CHILDREN
1836
+ end
1837
+ end
1838
+ end
1839
+
1840
+ #: (?name: untyped, ?description: untyped, ?comment: untyped, ?interfaces: Array[TypeName], ?directives: Array[Directive], ?fields: Array[FieldDefinition], ?line: Integer?, ?col: Integer?, ?pos: Integer?, ?filename: String?, ?source: untyped, ?definition_pos: Integer?) -> void
1841
+ def initialize(name: nil, description: nil, comment: nil, interfaces: NO_CHILDREN, directives: NO_CHILDREN, fields: NO_CHILDREN, line: nil, col: nil, pos: nil, filename: nil, source: nil, definition_pos: nil)
1842
+ @line = line
1843
+ @col = col
1844
+ @pos = pos
1845
+ @filename = filename
1846
+ @source = source
1847
+ @name = name
1848
+ @description = description && -description
1849
+ @comment = comment
1850
+ @interfaces = interfaces.freeze
1851
+ @directives = directives.freeze
1852
+ @fields = fields.freeze
1853
+ @definition_pos = definition_pos
1854
+ end
1855
+
1856
+ def self.from_a(filename, line, col, name, description, interfaces, directives, fields, comment: nil) # rubocop:disable Metrics/ParameterLists
1857
+ self.new(filename: filename, line: line, col: col, name: name, description: description, comment: comment, interfaces: interfaces, directives: directives, fields: fields)
1858
+ end
1859
+
1860
+ def marshal_dump
1861
+ [
1862
+ line, col, # use methods here to force them to be calculated
1863
+ @filename,
1864
+ @name,
1865
+ @description,
1866
+ @interfaces,
1867
+ @directives,
1868
+ @fields,
1869
+ ]
1870
+ end
1871
+
1872
+ def marshal_load(values)
1873
+ @line, @col, @filename, @name, @description, @interfaces, @directives, @fields = values
1874
+ end
1875
+
1876
+ @children_methods = {
1877
+ interfaces: GraphQL::Language::Nodes::TypeName,
1878
+ directives: GraphQL::Language::Nodes::Directive,
1879
+ fields: GraphQL::Language::Nodes::FieldDefinition,
1880
+ }.freeze
1881
+ self.children_method_name = :definitions
1882
+ end
1883
+
1884
+ class InterfaceTypeExtension < AbstractNode
1885
+ def visit_method
1886
+ :on_interface_type_extension
1887
+ end
1888
+
1889
+ #: String
1890
+ attr_reader :name
1891
+
1892
+ def scalars
1893
+ @scalars ||= [@name].freeze
1894
+ end
1895
+
1896
+ #: Array[TypeName]
1897
+ attr_reader :interfaces
1898
+ #: Array[Directive]
1899
+ attr_reader :directives
1900
+ #: Array[FieldDefinition]
1901
+ attr_reader :fields
1902
+
1903
+ def merge_interface(**node_opts)
1904
+ merge(interfaces: interfaces + [GraphQL::Language::Nodes::TypeName.new(**node_opts)])
1905
+ end
1906
+
1907
+ def merge_directive(**node_opts)
1908
+ merge(directives: directives + [GraphQL::Language::Nodes::Directive.new(**node_opts)])
1909
+ end
1910
+
1911
+ def merge_field(**node_opts)
1912
+ merge(fields: fields + [GraphQL::Language::Nodes::FieldDefinition.new(**node_opts)])
1913
+ end
1914
+
1915
+ def children
1916
+ @children ||= begin
1917
+ if !@interfaces.empty? || !@directives.empty? || !@fields.empty?
1918
+ new_children = []
1919
+ new_children.concat(@interfaces)
1920
+ new_children.concat(@directives)
1921
+ new_children.concat(@fields)
1922
+ new_children.freeze
1923
+ new_children
1924
+ else
1925
+ NO_CHILDREN
1926
+ end
1927
+ end
1928
+ end
1929
+
1930
+ #: (?name: untyped, ?interfaces: Array[TypeName], ?directives: Array[Directive], ?fields: Array[FieldDefinition], ?line: Integer?, ?col: Integer?, ?pos: Integer?, ?filename: String?, ?source: untyped) -> void
1931
+ def initialize(name: nil, interfaces: NO_CHILDREN, directives: NO_CHILDREN, fields: NO_CHILDREN, line: nil, col: nil, pos: nil, filename: nil, source: nil)
1932
+ @line = line
1933
+ @col = col
1934
+ @pos = pos
1935
+ @filename = filename
1936
+ @source = source
1937
+ @name = name
1938
+ @interfaces = interfaces.freeze
1939
+ @directives = directives.freeze
1940
+ @fields = fields.freeze
1941
+ end
1942
+
1943
+ def self.from_a(filename, line, col, name, interfaces, directives, fields, comment: nil) # rubocop:disable Metrics/ParameterLists
1944
+ self.new(filename: filename, line: line, col: col, name: name, interfaces: interfaces, directives: directives, fields: fields)
1945
+ end
1946
+
1947
+ def marshal_dump
1948
+ [
1949
+ line, col, # use methods here to force them to be calculated
1950
+ @filename,
1951
+ @name,
1952
+ @interfaces,
1953
+ @directives,
1954
+ @fields,
1955
+ ]
1956
+ end
1957
+
1958
+ def marshal_load(values)
1959
+ @line, @col, @filename, @name, @interfaces, @directives, @fields = values
1960
+ end
1961
+
1962
+ @children_methods = {
732
1963
  interfaces: GraphQL::Language::Nodes::TypeName,
733
1964
  directives: GraphQL::Language::Nodes::Directive,
734
1965
  fields: GraphQL::Language::Nodes::FieldDefinition,
735
- })
1966
+ }.freeze
736
1967
  self.children_method_name = :definitions
737
1968
  end
738
1969
 
739
1970
  class UnionTypeDefinition < AbstractNode
740
- attr_reader :description, :comment, :types
741
- scalar_methods :name
742
- children_methods({
1971
+ def visit_method
1972
+ :on_union_type_definition
1973
+ end
1974
+
1975
+ #: String?
1976
+ attr_reader :description
1977
+ #: String?
1978
+ attr_reader :comment
1979
+ #: Array[TypeName]
1980
+ attr_reader :types
1981
+ #: String
1982
+ attr_reader :name
1983
+
1984
+ def scalars
1985
+ @scalars ||= [@name].freeze
1986
+ end
1987
+
1988
+ #: Array[Directive]
1989
+ attr_reader :directives
1990
+
1991
+ def merge_directive(**node_opts)
1992
+ merge(directives: directives + [GraphQL::Language::Nodes::Directive.new(**node_opts)])
1993
+ end
1994
+
1995
+ alias :children directives
1996
+
1997
+ #: (?name: untyped, ?types: untyped, ?description: untyped, ?comment: untyped, ?directives: Array[Directive], ?line: Integer?, ?col: Integer?, ?pos: Integer?, ?filename: String?, ?source: untyped, ?definition_pos: Integer?) -> void
1998
+ def initialize(name: nil, types: nil, description: nil, comment: nil, directives: NO_CHILDREN, line: nil, col: nil, pos: nil, filename: nil, source: nil, definition_pos: nil)
1999
+ @line = line
2000
+ @col = col
2001
+ @pos = pos
2002
+ @filename = filename
2003
+ @source = source
2004
+ @name = name
2005
+ @types = types
2006
+ @description = description && -description
2007
+ @comment = comment
2008
+ @directives = directives.freeze
2009
+ @definition_pos = definition_pos
2010
+ end
2011
+
2012
+ def self.from_a(filename, line, col, name, types, description, directives, comment: nil) # rubocop:disable Metrics/ParameterLists
2013
+ self.new(filename: filename, line: line, col: col, name: name, types: types, description: description, comment: comment, directives: directives)
2014
+ end
2015
+
2016
+ def marshal_dump
2017
+ [
2018
+ line, col, # use methods here to force them to be calculated
2019
+ @filename,
2020
+ @name,
2021
+ @types,
2022
+ @description,
2023
+ @directives,
2024
+ ]
2025
+ end
2026
+
2027
+ def marshal_load(values)
2028
+ @line, @col, @filename, @name, @types, @description, @directives = values
2029
+ end
2030
+
2031
+ @children_methods = {
743
2032
  directives: GraphQL::Language::Nodes::Directive,
744
- })
2033
+ }.freeze
745
2034
  self.children_method_name = :definitions
746
2035
  end
747
2036
 
748
2037
  class UnionTypeExtension < AbstractNode
2038
+ def visit_method
2039
+ :on_union_type_extension
2040
+ end
2041
+
2042
+ #: Array[TypeName]
749
2043
  attr_reader :types
750
- scalar_methods :name
751
- children_methods({
2044
+ #: String
2045
+ attr_reader :name
2046
+
2047
+ def scalars
2048
+ @scalars ||= [@name].freeze
2049
+ end
2050
+
2051
+ #: Array[Directive]
2052
+ attr_reader :directives
2053
+
2054
+ def merge_directive(**node_opts)
2055
+ merge(directives: directives + [GraphQL::Language::Nodes::Directive.new(**node_opts)])
2056
+ end
2057
+
2058
+ alias :children directives
2059
+
2060
+ #: (?name: untyped, ?types: untyped, ?directives: Array[Directive], ?line: Integer?, ?col: Integer?, ?pos: Integer?, ?filename: String?, ?source: untyped) -> void
2061
+ def initialize(name: nil, types: nil, directives: NO_CHILDREN, line: nil, col: nil, pos: nil, filename: nil, source: nil)
2062
+ @line = line
2063
+ @col = col
2064
+ @pos = pos
2065
+ @filename = filename
2066
+ @source = source
2067
+ @name = name
2068
+ @types = types
2069
+ @directives = directives.freeze
2070
+ end
2071
+
2072
+ def self.from_a(filename, line, col, name, types, directives, comment: nil)
2073
+ self.new(filename: filename, line: line, col: col, name: name, types: types, directives: directives)
2074
+ end
2075
+
2076
+ def marshal_dump
2077
+ [
2078
+ line, col, # use methods here to force them to be calculated
2079
+ @filename,
2080
+ @name,
2081
+ @types,
2082
+ @directives,
2083
+ ]
2084
+ end
2085
+
2086
+ def marshal_load(values)
2087
+ @line, @col, @filename, @name, @types, @directives = values
2088
+ end
2089
+
2090
+ @children_methods = {
752
2091
  directives: GraphQL::Language::Nodes::Directive,
753
- })
2092
+ }.freeze
754
2093
  self.children_method_name = :definitions
755
2094
  end
756
2095
 
757
2096
  class EnumValueDefinition < AbstractNode
758
- attr_reader :description, :comment
759
- scalar_methods :name
760
- children_methods({
2097
+ def visit_method
2098
+ :on_enum_value_definition
2099
+ end
2100
+
2101
+ #: String?
2102
+ attr_reader :description
2103
+ #: String?
2104
+ attr_reader :comment
2105
+ #: String
2106
+ attr_reader :name
2107
+
2108
+ def scalars
2109
+ @scalars ||= [@name].freeze
2110
+ end
2111
+
2112
+ #: Array[Directive]
2113
+ attr_reader :directives
2114
+
2115
+ def merge_directive(**node_opts)
2116
+ merge(directives: directives + [GraphQL::Language::Nodes::Directive.new(**node_opts)])
2117
+ end
2118
+
2119
+ alias :children directives
2120
+
2121
+ #: (?name: untyped, ?description: untyped, ?comment: untyped, ?directives: Array[Directive], ?line: Integer?, ?col: Integer?, ?pos: Integer?, ?filename: String?, ?source: untyped, ?definition_pos: Integer?) -> void
2122
+ def initialize(name: nil, description: nil, comment: nil, directives: NO_CHILDREN, line: nil, col: nil, pos: nil, filename: nil, source: nil, definition_pos: nil)
2123
+ @line = line
2124
+ @col = col
2125
+ @pos = pos
2126
+ @filename = filename
2127
+ @source = source
2128
+ @name = name
2129
+ @description = description && -description
2130
+ @comment = comment
2131
+ @directives = directives.freeze
2132
+ @definition_pos = definition_pos
2133
+ end
2134
+
2135
+ def self.from_a(filename, line, col, name, description, directives, comment: nil)
2136
+ self.new(filename: filename, line: line, col: col, name: name, description: description, comment: comment, directives: directives)
2137
+ end
2138
+
2139
+ def marshal_dump
2140
+ [
2141
+ line, col, # use methods here to force them to be calculated
2142
+ @filename,
2143
+ @name,
2144
+ @description,
2145
+ @directives,
2146
+ ]
2147
+ end
2148
+
2149
+ def marshal_load(values)
2150
+ @line, @col, @filename, @name, @description, @directives = values
2151
+ end
2152
+
2153
+ @children_methods = {
761
2154
  directives: GraphQL::Language::Nodes::Directive,
762
- })
2155
+ }.freeze
763
2156
  self.children_method_name = :values
764
2157
  end
765
2158
 
766
2159
  class EnumTypeDefinition < AbstractNode
767
- attr_reader :description, :comment
768
- scalar_methods :name
769
- children_methods({
2160
+ def visit_method
2161
+ :on_enum_type_definition
2162
+ end
2163
+
2164
+ #: String?
2165
+ attr_reader :description
2166
+ #: String?
2167
+ attr_reader :comment
2168
+ #: String
2169
+ attr_reader :name
2170
+
2171
+ def scalars
2172
+ @scalars ||= [@name].freeze
2173
+ end
2174
+
2175
+ #: Array[Directive]
2176
+ attr_reader :directives
2177
+ #: Array[EnumValueDefinition]
2178
+ attr_reader :values
2179
+
2180
+ def merge_directive(**node_opts)
2181
+ merge(directives: directives + [GraphQL::Language::Nodes::Directive.new(**node_opts)])
2182
+ end
2183
+
2184
+ def merge_value(**node_opts)
2185
+ merge(values: values + [GraphQL::Language::Nodes::EnumValueDefinition.new(**node_opts)])
2186
+ end
2187
+
2188
+ def children
2189
+ @children ||= begin
2190
+ if !@directives.empty? || !@values.empty?
2191
+ new_children = []
2192
+ new_children.concat(@directives)
2193
+ new_children.concat(@values)
2194
+ new_children.freeze
2195
+ new_children
2196
+ else
2197
+ NO_CHILDREN
2198
+ end
2199
+ end
2200
+ end
2201
+
2202
+ #: (?name: untyped, ?description: untyped, ?comment: untyped, ?directives: Array[Directive], ?values: Array[EnumValueDefinition], ?line: Integer?, ?col: Integer?, ?pos: Integer?, ?filename: String?, ?source: untyped, ?definition_pos: Integer?) -> void
2203
+ def initialize(name: nil, description: nil, comment: nil, directives: NO_CHILDREN, values: NO_CHILDREN, line: nil, col: nil, pos: nil, filename: nil, source: nil, definition_pos: nil)
2204
+ @line = line
2205
+ @col = col
2206
+ @pos = pos
2207
+ @filename = filename
2208
+ @source = source
2209
+ @name = name
2210
+ @description = description && -description
2211
+ @comment = comment
2212
+ @directives = directives.freeze
2213
+ @values = values.freeze
2214
+ @definition_pos = definition_pos
2215
+ end
2216
+
2217
+ def self.from_a(filename, line, col, name, description, directives, values, comment: nil) # rubocop:disable Metrics/ParameterLists
2218
+ self.new(filename: filename, line: line, col: col, name: name, description: description, comment: comment, directives: directives, values: values)
2219
+ end
2220
+
2221
+ def marshal_dump
2222
+ [
2223
+ line, col, # use methods here to force them to be calculated
2224
+ @filename,
2225
+ @name,
2226
+ @description,
2227
+ @directives,
2228
+ @values,
2229
+ ]
2230
+ end
2231
+
2232
+ def marshal_load(values)
2233
+ @line, @col, @filename, @name, @description, @directives, @values = values
2234
+ end
2235
+
2236
+ @children_methods = {
770
2237
  directives: GraphQL::Language::Nodes::Directive,
771
2238
  values: GraphQL::Language::Nodes::EnumValueDefinition,
772
- })
2239
+ }.freeze
773
2240
  self.children_method_name = :definitions
774
2241
  end
775
2242
 
776
2243
  class EnumTypeExtension < AbstractNode
777
- scalar_methods :name
778
- children_methods({
2244
+ def visit_method
2245
+ :on_enum_type_extension
2246
+ end
2247
+
2248
+ #: String
2249
+ attr_reader :name
2250
+
2251
+ def scalars
2252
+ @scalars ||= [@name].freeze
2253
+ end
2254
+
2255
+ #: Array[Directive]
2256
+ attr_reader :directives
2257
+ #: Array[EnumValueDefinition]
2258
+ attr_reader :values
2259
+
2260
+ def merge_directive(**node_opts)
2261
+ merge(directives: directives + [GraphQL::Language::Nodes::Directive.new(**node_opts)])
2262
+ end
2263
+
2264
+ def merge_value(**node_opts)
2265
+ merge(values: values + [GraphQL::Language::Nodes::EnumValueDefinition.new(**node_opts)])
2266
+ end
2267
+
2268
+ def children
2269
+ @children ||= begin
2270
+ if !@directives.empty? || !@values.empty?
2271
+ new_children = []
2272
+ new_children.concat(@directives)
2273
+ new_children.concat(@values)
2274
+ new_children.freeze
2275
+ new_children
2276
+ else
2277
+ NO_CHILDREN
2278
+ end
2279
+ end
2280
+ end
2281
+
2282
+ #: (?name: untyped, ?directives: Array[Directive], ?values: Array[EnumValueDefinition], ?line: Integer?, ?col: Integer?, ?pos: Integer?, ?filename: String?, ?source: untyped) -> void
2283
+ def initialize(name: nil, directives: NO_CHILDREN, values: NO_CHILDREN, line: nil, col: nil, pos: nil, filename: nil, source: nil)
2284
+ @line = line
2285
+ @col = col
2286
+ @pos = pos
2287
+ @filename = filename
2288
+ @source = source
2289
+ @name = name
2290
+ @directives = directives.freeze
2291
+ @values = values.freeze
2292
+ end
2293
+
2294
+ def self.from_a(filename, line, col, name, directives, values, comment: nil)
2295
+ self.new(filename: filename, line: line, col: col, name: name, directives: directives, values: values)
2296
+ end
2297
+
2298
+ def marshal_dump
2299
+ [
2300
+ line, col, # use methods here to force them to be calculated
2301
+ @filename,
2302
+ @name,
2303
+ @directives,
2304
+ @values,
2305
+ ]
2306
+ end
2307
+
2308
+ def marshal_load(values)
2309
+ @line, @col, @filename, @name, @directives, @values = values
2310
+ end
2311
+
2312
+ @children_methods = {
779
2313
  directives: GraphQL::Language::Nodes::Directive,
780
2314
  values: GraphQL::Language::Nodes::EnumValueDefinition,
781
- })
2315
+ }.freeze
782
2316
  self.children_method_name = :definitions
783
2317
  end
784
2318
 
785
2319
  class InputObjectTypeDefinition < AbstractNode
786
- attr_reader :description, :comment
787
- scalar_methods :name
788
- children_methods({
2320
+ def visit_method
2321
+ :on_input_object_type_definition
2322
+ end
2323
+
2324
+ #: String?
2325
+ attr_reader :description
2326
+ #: String?
2327
+ attr_reader :comment
2328
+ #: String
2329
+ attr_reader :name
2330
+
2331
+ def scalars
2332
+ @scalars ||= [@name].freeze
2333
+ end
2334
+
2335
+ #: Array[Directive]
2336
+ attr_reader :directives
2337
+ #: Array[InputValueDefinition]
2338
+ attr_reader :fields
2339
+
2340
+ def merge_directive(**node_opts)
2341
+ merge(directives: directives + [GraphQL::Language::Nodes::Directive.new(**node_opts)])
2342
+ end
2343
+
2344
+ def merge_field(**node_opts)
2345
+ merge(fields: fields + [GraphQL::Language::Nodes::InputValueDefinition.new(**node_opts)])
2346
+ end
2347
+
2348
+ def children
2349
+ @children ||= begin
2350
+ if !@directives.empty? || !@fields.empty?
2351
+ new_children = []
2352
+ new_children.concat(@directives)
2353
+ new_children.concat(@fields)
2354
+ new_children.freeze
2355
+ new_children
2356
+ else
2357
+ NO_CHILDREN
2358
+ end
2359
+ end
2360
+ end
2361
+
2362
+ #: (?name: untyped, ?description: untyped, ?comment: untyped, ?directives: Array[Directive], ?fields: Array[InputValueDefinition], ?line: Integer?, ?col: Integer?, ?pos: Integer?, ?filename: String?, ?source: untyped, ?definition_pos: Integer?) -> void
2363
+ def initialize(name: nil, description: nil, comment: nil, directives: NO_CHILDREN, fields: NO_CHILDREN, line: nil, col: nil, pos: nil, filename: nil, source: nil, definition_pos: nil)
2364
+ @line = line
2365
+ @col = col
2366
+ @pos = pos
2367
+ @filename = filename
2368
+ @source = source
2369
+ @name = name
2370
+ @description = description && -description
2371
+ @comment = comment
2372
+ @directives = directives.freeze
2373
+ @fields = fields.freeze
2374
+ @definition_pos = definition_pos
2375
+ end
2376
+
2377
+ def self.from_a(filename, line, col, name, description, directives, fields, comment: nil) # rubocop:disable Metrics/ParameterLists
2378
+ self.new(filename: filename, line: line, col: col, name: name, description: description, comment: comment, directives: directives, fields: fields)
2379
+ end
2380
+
2381
+ def marshal_dump
2382
+ [
2383
+ line, col, # use methods here to force them to be calculated
2384
+ @filename,
2385
+ @name,
2386
+ @description,
2387
+ @directives,
2388
+ @fields,
2389
+ ]
2390
+ end
2391
+
2392
+ def marshal_load(values)
2393
+ @line, @col, @filename, @name, @description, @directives, @fields = values
2394
+ end
2395
+
2396
+ @children_methods = {
789
2397
  directives: GraphQL::Language::Nodes::Directive,
790
2398
  fields: GraphQL::Language::Nodes::InputValueDefinition,
791
- })
2399
+ }.freeze
792
2400
  self.children_method_name = :definitions
793
2401
  end
794
2402
 
795
2403
  class InputObjectTypeExtension < AbstractNode
796
- scalar_methods :name
797
- children_methods({
2404
+ def visit_method
2405
+ :on_input_object_type_extension
2406
+ end
2407
+
2408
+ #: String
2409
+ attr_reader :name
2410
+
2411
+ def scalars
2412
+ @scalars ||= [@name].freeze
2413
+ end
2414
+
2415
+ #: Array[Directive]
2416
+ attr_reader :directives
2417
+ #: Array[InputValueDefinition]
2418
+ attr_reader :fields
2419
+
2420
+ def merge_directive(**node_opts)
2421
+ merge(directives: directives + [GraphQL::Language::Nodes::Directive.new(**node_opts)])
2422
+ end
2423
+
2424
+ def merge_field(**node_opts)
2425
+ merge(fields: fields + [GraphQL::Language::Nodes::InputValueDefinition.new(**node_opts)])
2426
+ end
2427
+
2428
+ def children
2429
+ @children ||= begin
2430
+ if !@directives.empty? || !@fields.empty?
2431
+ new_children = []
2432
+ new_children.concat(@directives)
2433
+ new_children.concat(@fields)
2434
+ new_children.freeze
2435
+ new_children
2436
+ else
2437
+ NO_CHILDREN
2438
+ end
2439
+ end
2440
+ end
2441
+
2442
+ #: (?name: untyped, ?directives: Array[Directive], ?fields: Array[InputValueDefinition], ?line: Integer?, ?col: Integer?, ?pos: Integer?, ?filename: String?, ?source: untyped) -> void
2443
+ def initialize(name: nil, directives: NO_CHILDREN, fields: NO_CHILDREN, line: nil, col: nil, pos: nil, filename: nil, source: nil)
2444
+ @line = line
2445
+ @col = col
2446
+ @pos = pos
2447
+ @filename = filename
2448
+ @source = source
2449
+ @name = name
2450
+ @directives = directives.freeze
2451
+ @fields = fields.freeze
2452
+ end
2453
+
2454
+ def self.from_a(filename, line, col, name, directives, fields, comment: nil)
2455
+ self.new(filename: filename, line: line, col: col, name: name, directives: directives, fields: fields)
2456
+ end
2457
+
2458
+ def marshal_dump
2459
+ [
2460
+ line, col, # use methods here to force them to be calculated
2461
+ @filename,
2462
+ @name,
2463
+ @directives,
2464
+ @fields,
2465
+ ]
2466
+ end
2467
+
2468
+ def marshal_load(values)
2469
+ @line, @col, @filename, @name, @directives, @fields = values
2470
+ end
2471
+
2472
+ @children_methods = {
798
2473
  directives: GraphQL::Language::Nodes::Directive,
799
2474
  fields: GraphQL::Language::Nodes::InputValueDefinition,
800
- })
2475
+ }.freeze
801
2476
  self.children_method_name = :definitions
802
2477
  end
803
2478
  end