graphql 1.9.18 → 1.13.24

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 (353) hide show
  1. checksums.yaml +4 -4
  2. data/lib/generators/graphql/core.rb +21 -10
  3. data/lib/generators/graphql/enum_generator.rb +4 -10
  4. data/lib/generators/graphql/field_extractor.rb +31 -0
  5. data/lib/generators/graphql/input_generator.rb +50 -0
  6. data/lib/generators/graphql/install/mutation_root_generator.rb +34 -0
  7. data/lib/generators/graphql/{templates → install/templates}/base_mutation.erb +2 -0
  8. data/lib/generators/graphql/{templates → install/templates}/mutation_type.erb +2 -0
  9. data/lib/generators/graphql/install_generator.rb +44 -7
  10. data/lib/generators/graphql/interface_generator.rb +7 -7
  11. data/lib/generators/graphql/loader_generator.rb +1 -0
  12. data/lib/generators/graphql/mutation_create_generator.rb +22 -0
  13. data/lib/generators/graphql/mutation_delete_generator.rb +22 -0
  14. data/lib/generators/graphql/mutation_generator.rb +6 -30
  15. data/lib/generators/graphql/mutation_update_generator.rb +22 -0
  16. data/lib/generators/graphql/object_generator.rb +28 -12
  17. data/lib/generators/graphql/orm_mutations_base.rb +40 -0
  18. data/lib/generators/graphql/relay.rb +63 -0
  19. data/lib/generators/graphql/relay_generator.rb +21 -0
  20. data/lib/generators/graphql/scalar_generator.rb +4 -2
  21. data/lib/generators/graphql/templates/base_argument.erb +2 -0
  22. data/lib/generators/graphql/templates/base_connection.erb +8 -0
  23. data/lib/generators/graphql/templates/base_edge.erb +8 -0
  24. data/lib/generators/graphql/templates/base_enum.erb +2 -0
  25. data/lib/generators/graphql/templates/base_field.erb +2 -0
  26. data/lib/generators/graphql/templates/base_input_object.erb +2 -0
  27. data/lib/generators/graphql/templates/base_interface.erb +2 -0
  28. data/lib/generators/graphql/templates/base_object.erb +2 -0
  29. data/lib/generators/graphql/templates/base_scalar.erb +2 -0
  30. data/lib/generators/graphql/templates/base_union.erb +2 -0
  31. data/lib/generators/graphql/templates/enum.erb +7 -1
  32. data/lib/generators/graphql/templates/graphql_controller.erb +16 -12
  33. data/lib/generators/graphql/templates/input.erb +9 -0
  34. data/lib/generators/graphql/templates/interface.erb +6 -2
  35. data/lib/generators/graphql/templates/loader.erb +2 -0
  36. data/lib/generators/graphql/templates/mutation.erb +3 -1
  37. data/lib/generators/graphql/templates/mutation_create.erb +20 -0
  38. data/lib/generators/graphql/templates/mutation_delete.erb +20 -0
  39. data/lib/generators/graphql/templates/mutation_update.erb +21 -0
  40. data/lib/generators/graphql/templates/node_type.erb +9 -0
  41. data/lib/generators/graphql/templates/object.erb +7 -3
  42. data/lib/generators/graphql/templates/query_type.erb +3 -3
  43. data/lib/generators/graphql/templates/scalar.erb +5 -1
  44. data/lib/generators/graphql/templates/schema.erb +22 -27
  45. data/lib/generators/graphql/templates/union.erb +6 -2
  46. data/lib/generators/graphql/type_generator.rb +47 -10
  47. data/lib/generators/graphql/union_generator.rb +5 -5
  48. data/lib/graphql/analysis/analyze_query.rb +7 -0
  49. data/lib/graphql/analysis/ast/field_usage.rb +29 -2
  50. data/lib/graphql/analysis/ast/query_complexity.rb +174 -67
  51. data/lib/graphql/analysis/ast/visitor.rb +16 -7
  52. data/lib/graphql/analysis/ast.rb +21 -11
  53. data/lib/graphql/argument.rb +8 -36
  54. data/lib/graphql/backtrace/inspect_result.rb +0 -1
  55. data/lib/graphql/backtrace/legacy_tracer.rb +56 -0
  56. data/lib/graphql/backtrace/table.rb +44 -5
  57. data/lib/graphql/backtrace/traced_error.rb +0 -1
  58. data/lib/graphql/backtrace/tracer.rb +40 -9
  59. data/lib/graphql/backtrace.rb +28 -19
  60. data/lib/graphql/backwards_compatibility.rb +2 -1
  61. data/lib/graphql/base_type.rb +10 -4
  62. data/lib/graphql/boolean_type.rb +1 -1
  63. data/lib/graphql/compatibility/execution_specification/specification_schema.rb +2 -2
  64. data/lib/graphql/compatibility/execution_specification.rb +1 -0
  65. data/lib/graphql/compatibility/lazy_execution_specification.rb +2 -0
  66. data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +5 -9
  67. data/lib/graphql/compatibility/query_parser_specification.rb +2 -0
  68. data/lib/graphql/compatibility/schema_parser_specification.rb +2 -0
  69. data/lib/graphql/dataloader/null_dataloader.rb +22 -0
  70. data/lib/graphql/dataloader/request.rb +19 -0
  71. data/lib/graphql/dataloader/request_all.rb +19 -0
  72. data/lib/graphql/dataloader/source.rb +155 -0
  73. data/lib/graphql/dataloader.rb +308 -0
  74. data/lib/graphql/date_encoding_error.rb +16 -0
  75. data/lib/graphql/define/assign_enum_value.rb +1 -1
  76. data/lib/graphql/define/assign_global_id_field.rb +2 -2
  77. data/lib/graphql/define/assign_object_field.rb +1 -1
  78. data/lib/graphql/define/defined_object_proxy.rb +5 -8
  79. data/lib/graphql/define/instance_definable.rb +60 -110
  80. data/lib/graphql/define/type_definer.rb +5 -5
  81. data/lib/graphql/deprecated_dsl.rb +18 -5
  82. data/lib/graphql/deprecation.rb +9 -0
  83. data/lib/graphql/directive/deprecated_directive.rb +1 -12
  84. data/lib/graphql/directive/include_directive.rb +1 -1
  85. data/lib/graphql/directive/skip_directive.rb +1 -1
  86. data/lib/graphql/directive.rb +9 -6
  87. data/lib/graphql/enum_type.rb +14 -74
  88. data/lib/graphql/execution/directive_checks.rb +2 -2
  89. data/lib/graphql/execution/errors.rb +110 -8
  90. data/lib/graphql/execution/execute.rb +8 -1
  91. data/lib/graphql/execution/instrumentation.rb +1 -1
  92. data/lib/graphql/execution/interpreter/argument_value.rb +28 -0
  93. data/lib/graphql/execution/interpreter/arguments.rb +88 -0
  94. data/lib/graphql/execution/interpreter/arguments_cache.rb +105 -0
  95. data/lib/graphql/execution/interpreter/handles_raw_value.rb +18 -0
  96. data/lib/graphql/execution/interpreter/resolve.rb +37 -25
  97. data/lib/graphql/execution/interpreter/runtime.rb +721 -386
  98. data/lib/graphql/execution/interpreter.rb +42 -19
  99. data/lib/graphql/execution/lazy/lazy_method_map.rb +4 -0
  100. data/lib/graphql/execution/lazy.rb +5 -1
  101. data/lib/graphql/execution/lookahead.rb +39 -114
  102. data/lib/graphql/execution/multiplex.rb +50 -25
  103. data/lib/graphql/field.rb +15 -119
  104. data/lib/graphql/filter.rb +1 -1
  105. data/lib/graphql/float_type.rb +1 -1
  106. data/lib/graphql/function.rb +5 -30
  107. data/lib/graphql/id_type.rb +1 -1
  108. data/lib/graphql/input_object_type.rb +9 -25
  109. data/lib/graphql/int_type.rb +1 -1
  110. data/lib/graphql/integer_decoding_error.rb +17 -0
  111. data/lib/graphql/integer_encoding_error.rb +18 -2
  112. data/lib/graphql/interface_type.rb +10 -24
  113. data/lib/graphql/internal_representation/document.rb +2 -2
  114. data/lib/graphql/internal_representation/rewrite.rb +1 -1
  115. data/lib/graphql/internal_representation/scope.rb +2 -2
  116. data/lib/graphql/internal_representation/visit.rb +2 -2
  117. data/lib/graphql/introspection/base_object.rb +2 -5
  118. data/lib/graphql/introspection/directive_location_enum.rb +2 -2
  119. data/lib/graphql/introspection/directive_type.rb +12 -6
  120. data/lib/graphql/introspection/entry_points.rb +9 -9
  121. data/lib/graphql/introspection/enum_value_type.rb +2 -2
  122. data/lib/graphql/introspection/field_type.rb +9 -5
  123. data/lib/graphql/introspection/input_value_type.rb +41 -11
  124. data/lib/graphql/introspection/introspection_query.rb +6 -92
  125. data/lib/graphql/introspection/schema_type.rb +12 -12
  126. data/lib/graphql/introspection/type_type.rb +27 -17
  127. data/lib/graphql/introspection.rb +99 -0
  128. data/lib/graphql/invalid_null_error.rb +18 -0
  129. data/lib/graphql/language/block_string.rb +20 -5
  130. data/lib/graphql/language/cache.rb +37 -0
  131. data/lib/graphql/language/definition_slice.rb +21 -10
  132. data/lib/graphql/language/document_from_schema_definition.rb +116 -63
  133. data/lib/graphql/language/lexer.rb +53 -27
  134. data/lib/graphql/language/lexer.rl +5 -3
  135. data/lib/graphql/language/nodes.rb +67 -93
  136. data/lib/graphql/language/parser.rb +929 -896
  137. data/lib/graphql/language/parser.y +125 -102
  138. data/lib/graphql/language/printer.rb +11 -2
  139. data/lib/graphql/language/sanitized_printer.rb +222 -0
  140. data/lib/graphql/language/token.rb +0 -4
  141. data/lib/graphql/language/visitor.rb +2 -2
  142. data/lib/graphql/language.rb +3 -1
  143. data/lib/graphql/name_validator.rb +2 -7
  144. data/lib/graphql/non_null_type.rb +0 -10
  145. data/lib/graphql/object_type.rb +47 -58
  146. data/lib/graphql/pagination/active_record_relation_connection.rb +85 -0
  147. data/lib/graphql/pagination/array_connection.rb +77 -0
  148. data/lib/graphql/pagination/connection.rb +226 -0
  149. data/lib/graphql/pagination/connections.rb +160 -0
  150. data/lib/graphql/pagination/mongoid_relation_connection.rb +25 -0
  151. data/lib/graphql/pagination/relation_connection.rb +226 -0
  152. data/lib/graphql/pagination/sequel_dataset_connection.rb +28 -0
  153. data/lib/graphql/pagination.rb +6 -0
  154. data/lib/graphql/parse_error.rb +0 -1
  155. data/lib/graphql/query/arguments.rb +6 -4
  156. data/lib/graphql/query/arguments_cache.rb +1 -2
  157. data/lib/graphql/query/context.rb +52 -7
  158. data/lib/graphql/query/executor.rb +0 -1
  159. data/lib/graphql/query/fingerprint.rb +26 -0
  160. data/lib/graphql/query/input_validation_result.rb +32 -6
  161. data/lib/graphql/query/literal_input.rb +31 -11
  162. data/lib/graphql/query/null_context.rb +24 -8
  163. data/lib/graphql/query/serial_execution/field_resolution.rb +1 -1
  164. data/lib/graphql/query/serial_execution.rb +1 -0
  165. data/lib/graphql/query/validation_pipeline.rb +6 -4
  166. data/lib/graphql/query/variable_validation_error.rb +3 -3
  167. data/lib/graphql/query/variables.rb +50 -10
  168. data/lib/graphql/query.rb +77 -18
  169. data/lib/graphql/railtie.rb +9 -1
  170. data/lib/graphql/rake_task/validate.rb +3 -0
  171. data/lib/graphql/rake_task.rb +12 -9
  172. data/lib/graphql/relay/array_connection.rb +10 -12
  173. data/lib/graphql/relay/base_connection.rb +30 -13
  174. data/lib/graphql/relay/connection_instrumentation.rb +4 -4
  175. data/lib/graphql/relay/connection_type.rb +18 -4
  176. data/lib/graphql/relay/edge_type.rb +1 -0
  177. data/lib/graphql/relay/edges_instrumentation.rb +1 -2
  178. data/lib/graphql/relay/global_id_resolve.rb +1 -2
  179. data/lib/graphql/relay/mutation.rb +3 -87
  180. data/lib/graphql/relay/node.rb +3 -0
  181. data/lib/graphql/relay/page_info.rb +1 -1
  182. data/lib/graphql/relay/range_add.rb +27 -9
  183. data/lib/graphql/relay/relation_connection.rb +8 -10
  184. data/lib/graphql/relay/type_extensions.rb +2 -0
  185. data/lib/graphql/rubocop/graphql/base_cop.rb +36 -0
  186. data/lib/graphql/rubocop/graphql/default_null_true.rb +43 -0
  187. data/lib/graphql/rubocop/graphql/default_required_true.rb +43 -0
  188. data/lib/graphql/rubocop.rb +4 -0
  189. data/lib/graphql/scalar_type.rb +18 -60
  190. data/lib/graphql/schema/addition.rb +247 -0
  191. data/lib/graphql/schema/argument.rb +274 -18
  192. data/lib/graphql/schema/base_64_encoder.rb +2 -0
  193. data/lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb +1 -1
  194. data/lib/graphql/schema/build_from_definition/resolve_map.rb +13 -5
  195. data/lib/graphql/schema/build_from_definition.rb +320 -219
  196. data/lib/graphql/schema/built_in_types.rb +5 -5
  197. data/lib/graphql/schema/default_type_error.rb +2 -0
  198. data/lib/graphql/schema/directive/deprecated.rb +18 -0
  199. data/lib/graphql/schema/directive/feature.rb +1 -1
  200. data/lib/graphql/schema/directive/flagged.rb +57 -0
  201. data/lib/graphql/schema/directive/include.rb +2 -2
  202. data/lib/graphql/schema/directive/skip.rb +2 -2
  203. data/lib/graphql/schema/directive/transform.rb +14 -2
  204. data/lib/graphql/schema/directive.rb +130 -6
  205. data/lib/graphql/schema/enum.rb +121 -12
  206. data/lib/graphql/schema/enum_value.rb +24 -7
  207. data/lib/graphql/schema/field/connection_extension.rb +46 -20
  208. data/lib/graphql/schema/field/scope_extension.rb +1 -1
  209. data/lib/graphql/schema/field.rb +465 -181
  210. data/lib/graphql/schema/field_extension.rb +89 -2
  211. data/lib/graphql/schema/find_inherited_value.rb +17 -1
  212. data/lib/graphql/schema/finder.rb +16 -14
  213. data/lib/graphql/schema/input_object.rb +172 -37
  214. data/lib/graphql/schema/interface.rb +39 -25
  215. data/lib/graphql/schema/introspection_system.rb +106 -38
  216. data/lib/graphql/schema/late_bound_type.rb +3 -2
  217. data/lib/graphql/schema/list.rb +65 -1
  218. data/lib/graphql/schema/loader.rb +145 -102
  219. data/lib/graphql/schema/member/accepts_definition.rb +15 -3
  220. data/lib/graphql/schema/member/base_dsl_methods.rb +34 -28
  221. data/lib/graphql/schema/member/build_type.rb +19 -8
  222. data/lib/graphql/schema/member/cached_graphql_definition.rb +34 -2
  223. data/lib/graphql/schema/member/has_arguments.rb +206 -13
  224. data/lib/graphql/schema/member/has_ast_node.rb +20 -0
  225. data/lib/graphql/schema/member/has_deprecation_reason.rb +25 -0
  226. data/lib/graphql/schema/member/has_directives.rb +98 -0
  227. data/lib/graphql/schema/member/has_fields.rb +97 -32
  228. data/lib/graphql/schema/member/has_interfaces.rb +100 -0
  229. data/lib/graphql/schema/member/has_unresolved_type_error.rb +15 -0
  230. data/lib/graphql/schema/member/has_validators.rb +31 -0
  231. data/lib/graphql/schema/member/instrumentation.rb +0 -1
  232. data/lib/graphql/schema/member/type_system_helpers.rb +3 -3
  233. data/lib/graphql/schema/member/validates_input.rb +33 -0
  234. data/lib/graphql/schema/member.rb +11 -0
  235. data/lib/graphql/schema/middleware_chain.rb +1 -1
  236. data/lib/graphql/schema/mutation.rb +4 -0
  237. data/lib/graphql/schema/non_null.rb +37 -1
  238. data/lib/graphql/schema/object.rb +51 -38
  239. data/lib/graphql/schema/possible_types.rb +9 -4
  240. data/lib/graphql/schema/printer.rb +16 -35
  241. data/lib/graphql/schema/relay_classic_mutation.rb +40 -4
  242. data/lib/graphql/schema/resolver/has_payload_type.rb +34 -4
  243. data/lib/graphql/schema/resolver.rb +133 -79
  244. data/lib/graphql/schema/scalar.rb +43 -3
  245. data/lib/graphql/schema/subscription.rb +57 -21
  246. data/lib/graphql/schema/timeout.rb +29 -15
  247. data/lib/graphql/schema/timeout_middleware.rb +3 -1
  248. data/lib/graphql/schema/traversal.rb +2 -2
  249. data/lib/graphql/schema/type_expression.rb +21 -13
  250. data/lib/graphql/schema/type_membership.rb +19 -5
  251. data/lib/graphql/schema/union.rb +44 -3
  252. data/lib/graphql/schema/unique_within_type.rb +1 -2
  253. data/lib/graphql/schema/validation.rb +14 -4
  254. data/lib/graphql/schema/validator/allow_blank_validator.rb +29 -0
  255. data/lib/graphql/schema/validator/allow_null_validator.rb +26 -0
  256. data/lib/graphql/schema/validator/exclusion_validator.rb +33 -0
  257. data/lib/graphql/schema/validator/format_validator.rb +48 -0
  258. data/lib/graphql/schema/validator/inclusion_validator.rb +35 -0
  259. data/lib/graphql/schema/validator/length_validator.rb +59 -0
  260. data/lib/graphql/schema/validator/numericality_validator.rb +82 -0
  261. data/lib/graphql/schema/validator/required_validator.rb +82 -0
  262. data/lib/graphql/schema/validator.rb +171 -0
  263. data/lib/graphql/schema/warden.rb +193 -34
  264. data/lib/graphql/schema.rb +882 -247
  265. data/lib/graphql/static_validation/all_rules.rb +2 -0
  266. data/lib/graphql/static_validation/base_visitor.rb +17 -10
  267. data/lib/graphql/static_validation/definition_dependencies.rb +0 -1
  268. data/lib/graphql/static_validation/error.rb +3 -1
  269. data/lib/graphql/static_validation/literal_validator.rb +51 -26
  270. data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +45 -83
  271. data/lib/graphql/static_validation/rules/argument_literals_are_compatible_error.rb +22 -6
  272. data/lib/graphql/static_validation/rules/arguments_are_defined.rb +35 -26
  273. data/lib/graphql/static_validation/rules/arguments_are_defined_error.rb +4 -2
  274. data/lib/graphql/static_validation/rules/directives_are_defined.rb +1 -1
  275. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +2 -2
  276. data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +4 -4
  277. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +5 -5
  278. data/lib/graphql/static_validation/rules/fields_will_merge.rb +94 -51
  279. data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +25 -4
  280. data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +3 -3
  281. data/lib/graphql/static_validation/rules/fragments_are_finite.rb +2 -2
  282. data/lib/graphql/static_validation/rules/input_object_names_are_unique.rb +30 -0
  283. data/lib/graphql/static_validation/rules/input_object_names_are_unique_error.rb +30 -0
  284. data/lib/graphql/static_validation/rules/query_root_exists.rb +17 -0
  285. data/lib/graphql/static_validation/rules/query_root_exists_error.rb +26 -0
  286. data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +4 -2
  287. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +9 -10
  288. data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +1 -1
  289. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +12 -13
  290. data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +19 -14
  291. data/lib/graphql/static_validation/rules/variables_are_input_types.rb +1 -1
  292. data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +5 -3
  293. data/lib/graphql/static_validation/type_stack.rb +2 -2
  294. data/lib/graphql/static_validation/validation_context.rb +13 -3
  295. data/lib/graphql/static_validation/validation_timeout_error.rb +25 -0
  296. data/lib/graphql/static_validation/validator.rb +43 -9
  297. data/lib/graphql/static_validation.rb +1 -0
  298. data/lib/graphql/string_encoding_error.rb +13 -3
  299. data/lib/graphql/string_type.rb +1 -1
  300. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +123 -22
  301. data/lib/graphql/subscriptions/broadcast_analyzer.rb +81 -0
  302. data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +21 -0
  303. data/lib/graphql/subscriptions/event.rb +84 -30
  304. data/lib/graphql/subscriptions/instrumentation.rb +10 -6
  305. data/lib/graphql/subscriptions/serialize.rb +53 -6
  306. data/lib/graphql/subscriptions/subscription_root.rb +15 -5
  307. data/lib/graphql/subscriptions.rb +117 -49
  308. data/lib/graphql/tracing/active_support_notifications_tracing.rb +8 -17
  309. data/lib/graphql/tracing/appoptics_tracing.rb +173 -0
  310. data/lib/graphql/tracing/appsignal_tracing.rb +23 -0
  311. data/lib/graphql/tracing/data_dog_tracing.rb +32 -15
  312. data/lib/graphql/tracing/new_relic_tracing.rb +9 -12
  313. data/lib/graphql/tracing/notifications_tracing.rb +59 -0
  314. data/lib/graphql/tracing/platform_tracing.rb +66 -10
  315. data/lib/graphql/tracing/prometheus_tracing/graphql_collector.rb +4 -1
  316. data/lib/graphql/tracing/prometheus_tracing.rb +8 -0
  317. data/lib/graphql/tracing/scout_tracing.rb +19 -0
  318. data/lib/graphql/tracing/skylight_tracing.rb +9 -1
  319. data/lib/graphql/tracing/statsd_tracing.rb +42 -0
  320. data/lib/graphql/tracing.rb +15 -35
  321. data/lib/graphql/types/big_int.rb +5 -1
  322. data/lib/graphql/types/int.rb +10 -3
  323. data/lib/graphql/types/iso_8601_date.rb +16 -8
  324. data/lib/graphql/types/iso_8601_date_time.rb +32 -10
  325. data/lib/graphql/types/relay/base_connection.rb +6 -88
  326. data/lib/graphql/types/relay/base_edge.rb +2 -34
  327. data/lib/graphql/types/relay/connection_behaviors.rb +174 -0
  328. data/lib/graphql/types/relay/default_relay.rb +31 -0
  329. data/lib/graphql/types/relay/edge_behaviors.rb +64 -0
  330. data/lib/graphql/types/relay/has_node_field.rb +41 -0
  331. data/lib/graphql/types/relay/has_nodes_field.rb +41 -0
  332. data/lib/graphql/types/relay/node.rb +2 -4
  333. data/lib/graphql/types/relay/node_behaviors.rb +15 -0
  334. data/lib/graphql/types/relay/node_field.rb +3 -22
  335. data/lib/graphql/types/relay/nodes_field.rb +16 -18
  336. data/lib/graphql/types/relay/page_info.rb +2 -14
  337. data/lib/graphql/types/relay/page_info_behaviors.rb +25 -0
  338. data/lib/graphql/types/relay.rb +11 -3
  339. data/lib/graphql/types/string.rb +8 -2
  340. data/lib/graphql/unauthorized_error.rb +2 -2
  341. data/lib/graphql/union_type.rb +5 -25
  342. data/lib/graphql/unresolved_type_error.rb +2 -2
  343. data/lib/graphql/upgrader/member.rb +1 -0
  344. data/lib/graphql/upgrader/schema.rb +1 -0
  345. data/lib/graphql/version.rb +1 -1
  346. data/lib/graphql.rb +87 -31
  347. data/readme.md +3 -6
  348. metadata +126 -124
  349. data/lib/graphql/execution/interpreter/hash_response.rb +0 -46
  350. data/lib/graphql/literal_validation_error.rb +0 -6
  351. data/lib/graphql/types/relay/base_field.rb +0 -22
  352. data/lib/graphql/types/relay/base_interface.rb +0 -29
  353. data/lib/graphql/types/relay/base_object.rb +0 -26
@@ -12,21 +12,29 @@ module GraphQL
12
12
  "possible at runtime. List and NonNull types compose other types."
13
13
 
14
14
  field :kind, GraphQL::Schema::LateBoundType.new("__TypeKind"), null: false
15
- field :name, String, null: true
16
- field :description, String, null: true
17
- field :fields, [GraphQL::Schema::LateBoundType.new("__Field")], null: true do
15
+ field :name, String, method: :graphql_name
16
+ field :description, String
17
+ field :fields, [GraphQL::Schema::LateBoundType.new("__Field")], scope: false do
18
18
  argument :include_deprecated, Boolean, required: false, default_value: false
19
19
  end
20
- field :interfaces, [GraphQL::Schema::LateBoundType.new("__Type")], null: true
21
- field :possible_types, [GraphQL::Schema::LateBoundType.new("__Type")], null: true
22
- field :enum_values, [GraphQL::Schema::LateBoundType.new("__EnumValue")], null: true do
20
+ field :interfaces, [GraphQL::Schema::LateBoundType.new("__Type")], scope: false
21
+ field :possible_types, [GraphQL::Schema::LateBoundType.new("__Type")], scope: false
22
+ field :enum_values, [GraphQL::Schema::LateBoundType.new("__EnumValue")], scope: false do
23
23
  argument :include_deprecated, Boolean, required: false, default_value: false
24
24
  end
25
- field :input_fields, [GraphQL::Schema::LateBoundType.new("__InputValue")], null: true
26
- field :of_type, GraphQL::Schema::LateBoundType.new("__Type"), null: true
25
+ field :input_fields, [GraphQL::Schema::LateBoundType.new("__InputValue")], scope: false do
26
+ argument :include_deprecated, Boolean, required: false, default_value: false
27
+ end
28
+ field :of_type, GraphQL::Schema::LateBoundType.new("__Type")
29
+
30
+ field :specified_by_url, String
27
31
 
28
- def name
29
- object.graphql_name
32
+ def specified_by_url
33
+ if object.kind.scalar?
34
+ object.specified_by_url
35
+ else
36
+ nil
37
+ end
30
38
  end
31
39
 
32
40
  def kind
@@ -37,7 +45,7 @@ module GraphQL
37
45
  if !@object.kind.enum?
38
46
  nil
39
47
  else
40
- enum_values = @context.warden.enum_values(@object.graphql_definition)
48
+ enum_values = @context.warden.enum_values(@object)
41
49
 
42
50
  if !include_deprecated
43
51
  enum_values = enum_values.select {|f| !f.deprecation_reason }
@@ -48,16 +56,18 @@ module GraphQL
48
56
  end
49
57
 
50
58
  def interfaces
51
- if @object.kind == GraphQL::TypeKinds::OBJECT
52
- @context.warden.interfaces(@object.graphql_definition)
59
+ if @object.kind.object? || @object.kind.interface?
60
+ @context.warden.interfaces(@object).sort_by(&:graphql_name)
53
61
  else
54
62
  nil
55
63
  end
56
64
  end
57
65
 
58
- def input_fields
66
+ def input_fields(include_deprecated:)
59
67
  if @object.kind.input_object?
60
- @context.warden.arguments(@object.graphql_definition)
68
+ args = @context.warden.arguments(@object)
69
+ args = args.reject(&:deprecation_reason) unless include_deprecated
70
+ args
61
71
  else
62
72
  nil
63
73
  end
@@ -65,7 +75,7 @@ module GraphQL
65
75
 
66
76
  def possible_types
67
77
  if @object.kind.abstract?
68
- @context.warden.possible_types(@object.graphql_definition)
78
+ @context.warden.possible_types(@object).sort_by(&:graphql_name)
69
79
  else
70
80
  nil
71
81
  end
@@ -75,7 +85,7 @@ module GraphQL
75
85
  if !@object.kind.fields?
76
86
  nil
77
87
  else
78
- fields = @context.warden.fields(@object.graphql_definition)
88
+ fields = @context.warden.fields(@object)
79
89
  if !include_deprecated
80
90
  fields = fields.select {|f| !f.deprecation_reason }
81
91
  end
@@ -1,6 +1,105 @@
1
1
  # frozen_string_literal: true
2
2
  module GraphQL
3
3
  module Introspection
4
+ def self.query(include_deprecated_args: false, include_schema_description: false, include_is_repeatable: false, include_specified_by_url: false)
5
+ # The introspection query to end all introspection queries, copied from
6
+ # https://github.com/graphql/graphql-js/blob/master/src/utilities/introspectionQuery.js
7
+ <<-QUERY
8
+ query IntrospectionQuery {
9
+ __schema {
10
+ #{include_schema_description ? "description" : ""}
11
+ queryType { name }
12
+ mutationType { name }
13
+ subscriptionType { name }
14
+ types {
15
+ ...FullType
16
+ }
17
+ directives {
18
+ name
19
+ description
20
+ locations
21
+ #{include_is_repeatable ? "isRepeatable" : ""}
22
+ args#{include_deprecated_args ? '(includeDeprecated: true)' : ''} {
23
+ ...InputValue
24
+ }
25
+ }
26
+ }
27
+ }
28
+ fragment FullType on __Type {
29
+ kind
30
+ name
31
+ description
32
+ #{include_specified_by_url ? "specifiedByUrl" : ""}
33
+ fields(includeDeprecated: true) {
34
+ name
35
+ description
36
+ args#{include_deprecated_args ? '(includeDeprecated: true)' : ''} {
37
+ ...InputValue
38
+ }
39
+ type {
40
+ ...TypeRef
41
+ }
42
+ isDeprecated
43
+ deprecationReason
44
+ }
45
+ inputFields#{include_deprecated_args ? '(includeDeprecated: true)' : ''} {
46
+ ...InputValue
47
+ }
48
+ interfaces {
49
+ ...TypeRef
50
+ }
51
+ enumValues(includeDeprecated: true) {
52
+ name
53
+ description
54
+ isDeprecated
55
+ deprecationReason
56
+ }
57
+ possibleTypes {
58
+ ...TypeRef
59
+ }
60
+ }
61
+ fragment InputValue on __InputValue {
62
+ name
63
+ description
64
+ type { ...TypeRef }
65
+ defaultValue
66
+ #{include_deprecated_args ? 'isDeprecated' : ''}
67
+ #{include_deprecated_args ? 'deprecationReason' : ''}
68
+ }
69
+ fragment TypeRef on __Type {
70
+ kind
71
+ name
72
+ ofType {
73
+ kind
74
+ name
75
+ ofType {
76
+ kind
77
+ name
78
+ ofType {
79
+ kind
80
+ name
81
+ ofType {
82
+ kind
83
+ name
84
+ ofType {
85
+ kind
86
+ name
87
+ ofType {
88
+ kind
89
+ name
90
+ ofType {
91
+ kind
92
+ name
93
+ }
94
+ }
95
+ }
96
+ }
97
+ }
98
+ }
99
+ }
100
+ }
101
+ QUERY
102
+ end
4
103
  end
5
104
  end
6
105
 
@@ -28,5 +28,23 @@ module GraphQL
28
28
  def parent_error?
29
29
  false
30
30
  end
31
+
32
+ class << self
33
+ attr_accessor :parent_class
34
+
35
+ def subclass_for(parent_class)
36
+ subclass = Class.new(self)
37
+ subclass.parent_class = parent_class
38
+ subclass
39
+ end
40
+
41
+ def inspect
42
+ if (name.nil? || parent_class.name.nil?) && parent_class.respond_to?(:mutation) && (mutation = parent_class.mutation)
43
+ "#{mutation.inspect}::#{parent_class.graphql_name}::InvalidNullError"
44
+ else
45
+ super
46
+ end
47
+ end
48
+ end
31
49
  end
32
50
  end
@@ -5,7 +5,14 @@ module GraphQL
5
5
  # Remove leading and trailing whitespace from a block string.
6
6
  # See "Block Strings" in https://github.com/facebook/graphql/blob/master/spec/Section%202%20--%20Language.md
7
7
  def self.trim_whitespace(str)
8
- lines = str.split("\n")
8
+ # Early return for the most common cases:
9
+ if str == ""
10
+ return "".dup
11
+ elsif !(has_newline = str.include?("\n")) && !(str.start_with?(" "))
12
+ return str
13
+ end
14
+
15
+ lines = has_newline ? str.split("\n") : [str]
9
16
  common_indent = nil
10
17
 
11
18
  # find the common whitespace
@@ -14,19 +21,27 @@ module GraphQL
14
21
  next
15
22
  end
16
23
  line_length = line.size
17
- line_indent = line[/\A */].size
24
+ line_indent = if line.match?(/\A [^ ]/)
25
+ 2
26
+ elsif line.match?(/\A [^ ]/)
27
+ 4
28
+ elsif line.match?(/\A[^ ]/)
29
+ 0
30
+ else
31
+ line[/\A */].size
32
+ end
18
33
  if line_indent < line_length && (common_indent.nil? || line_indent < common_indent)
19
34
  common_indent = line_indent
20
35
  end
21
36
  end
22
37
 
23
38
  # Remove the common whitespace
24
- if common_indent
39
+ if common_indent && common_indent > 0
25
40
  lines.each_with_index do |line, idx|
26
41
  if idx == 0
27
42
  next
28
43
  else
29
- line[0, common_indent] = ""
44
+ line.slice!(0, common_indent)
30
45
  end
31
46
  end
32
47
  end
@@ -40,7 +55,7 @@ module GraphQL
40
55
  end
41
56
 
42
57
  # Rebuild the string
43
- lines.join("\n")
58
+ lines.size > 1 ? lines.join("\n") : (lines.first || "".dup)
44
59
  end
45
60
 
46
61
  def self.print(str, indent: '')
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'graphql/version'
4
+ require 'digest/sha2'
5
+
6
+ module GraphQL
7
+ module Language
8
+ class Cache
9
+ def initialize(path)
10
+ @path = path
11
+ end
12
+
13
+ DIGEST = Digest::SHA256.new << GraphQL::VERSION
14
+ def fetch(filename)
15
+ hash = DIGEST.dup << filename
16
+ begin
17
+ hash << File.mtime(filename).to_i.to_s
18
+ rescue SystemCallError
19
+ return yield
20
+ end
21
+ cache_path = @path.join(hash.to_s)
22
+
23
+ if cache_path.exist?
24
+ Marshal.load(cache_path.read)
25
+ else
26
+ payload = yield
27
+ tmp_path = "#{cache_path}.#{rand}"
28
+
29
+ @path.mkpath
30
+ File.binwrite(tmp_path, Marshal.dump(payload))
31
+ File.rename(tmp_path, cache_path.to_s)
32
+ payload
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -7,23 +7,34 @@ module GraphQL
7
7
  def slice(document, name)
8
8
  definitions = {}
9
9
  document.definitions.each { |d| definitions[d.name] = d }
10
- names = find_definition_dependencies(definitions, name)
10
+ names = Set.new
11
+ DependencyVisitor.find_definition_dependencies(definitions, name, names)
11
12
  definitions = document.definitions.select { |d| names.include?(d.name) }
12
13
  Nodes::Document.new(definitions: definitions)
13
14
  end
14
15
 
15
16
  private
16
17
 
17
- def find_definition_dependencies(definitions, name)
18
- names = Set.new([name])
19
- visitor = Visitor.new(definitions[name])
20
- visitor[Nodes::FragmentSpread] << ->(node, parent) {
21
- if fragment = definitions[node.name]
22
- names.merge(find_definition_dependencies(definitions, fragment.name))
18
+ class DependencyVisitor < GraphQL::Language::Visitor
19
+ def initialize(doc, definitions, names)
20
+ @names = names
21
+ @definitions = definitions
22
+ super(doc)
23
+ end
24
+
25
+ def on_fragment_spread(node, parent)
26
+ if fragment = @definitions[node.name]
27
+ self.class.find_definition_dependencies(@definitions, fragment.name, @names)
23
28
  end
24
- }
25
- visitor.visit
26
- names
29
+ super
30
+ end
31
+
32
+ def self.find_definition_dependencies(definitions, name, names)
33
+ names.add(name)
34
+ visitor = self.new(definitions[name], definitions, names)
35
+ visitor.visit
36
+ nil
37
+ end
27
38
  end
28
39
  end
29
40
  end
@@ -34,6 +34,7 @@ module GraphQL
34
34
  schema: @schema,
35
35
  context: schema_context,
36
36
  )
37
+ schema_context.warden = @warden
37
38
  end
38
39
 
39
40
  def document
@@ -44,88 +45,80 @@ module GraphQL
44
45
 
45
46
  def build_schema_node
46
47
  GraphQL::Language::Nodes::SchemaDefinition.new(
47
- query: warden.root_type_for_operation("query"),
48
- mutation: warden.root_type_for_operation("mutation"),
49
- subscription: warden.root_type_for_operation("subscription"),
48
+ query: (q = warden.root_type_for_operation("query")) && q.graphql_name,
49
+ mutation: (m = warden.root_type_for_operation("mutation")) && m.graphql_name,
50
+ subscription: (s = warden.root_type_for_operation("subscription")) && s.graphql_name,
50
51
  # This only supports directives from parsing,
51
52
  # use a custom printer to add to this list.
52
- directives: @schema.ast_node ? @schema.ast_node.directives : [],
53
+ #
54
+ # `@schema.directives` is covered by `build_definition_nodes`
55
+ directives: ast_directives(@schema),
53
56
  )
54
57
  end
55
58
 
56
59
  def build_object_type_node(object_type)
57
60
  GraphQL::Language::Nodes::ObjectTypeDefinition.new(
58
- name: object_type.name,
59
- interfaces: warden.interfaces(object_type).sort_by(&:name).map { |iface| build_type_name_node(iface) },
61
+ name: object_type.graphql_name,
62
+ interfaces: warden.interfaces(object_type).sort_by(&:graphql_name).map { |iface| build_type_name_node(iface) },
60
63
  fields: build_field_nodes(warden.fields(object_type)),
61
64
  description: object_type.description,
65
+ directives: directives(object_type),
62
66
  )
63
67
  end
64
68
 
65
69
  def build_field_node(field)
66
- field_node = GraphQL::Language::Nodes::FieldDefinition.new(
67
- name: field.name,
70
+ GraphQL::Language::Nodes::FieldDefinition.new(
71
+ name: field.graphql_name,
68
72
  arguments: build_argument_nodes(warden.arguments(field)),
69
73
  type: build_type_name_node(field.type),
70
74
  description: field.description,
75
+ directives: directives(field),
71
76
  )
72
-
73
- if field.deprecation_reason
74
- field_node = field_node.merge_directive(
75
- name: GraphQL::Directive::DeprecatedDirective.name,
76
- arguments: [GraphQL::Language::Nodes::Argument.new(name: "reason", value: field.deprecation_reason)]
77
- )
78
- end
79
-
80
- field_node
81
77
  end
82
78
 
83
79
  def build_union_type_node(union_type)
84
80
  GraphQL::Language::Nodes::UnionTypeDefinition.new(
85
- name: union_type.name,
81
+ name: union_type.graphql_name,
86
82
  description: union_type.description,
87
- types: warden.possible_types(union_type).sort_by(&:name).map { |type| build_type_name_node(type) }
83
+ types: warden.possible_types(union_type).sort_by(&:graphql_name).map { |type| build_type_name_node(type) },
84
+ directives: directives(union_type),
88
85
  )
89
86
  end
90
87
 
91
88
  def build_interface_type_node(interface_type)
92
89
  GraphQL::Language::Nodes::InterfaceTypeDefinition.new(
93
- name: interface_type.name,
90
+ name: interface_type.graphql_name,
91
+ interfaces: warden.interfaces(interface_type).sort_by(&:graphql_name).map { |type| build_type_name_node(type) },
94
92
  description: interface_type.description,
95
- fields: build_field_nodes(warden.fields(interface_type))
93
+ fields: build_field_nodes(warden.fields(interface_type)),
94
+ directives: directives(interface_type),
96
95
  )
97
96
  end
98
97
 
99
98
  def build_enum_type_node(enum_type)
100
99
  GraphQL::Language::Nodes::EnumTypeDefinition.new(
101
- name: enum_type.name,
102
- values: warden.enum_values(enum_type).sort_by(&:name).map do |enum_value|
100
+ name: enum_type.graphql_name,
101
+ values: warden.enum_values(enum_type).sort_by(&:graphql_name).map do |enum_value|
103
102
  build_enum_value_node(enum_value)
104
103
  end,
105
104
  description: enum_type.description,
105
+ directives: directives(enum_type),
106
106
  )
107
107
  end
108
108
 
109
109
  def build_enum_value_node(enum_value)
110
- enum_value_node = GraphQL::Language::Nodes::EnumValueDefinition.new(
111
- name: enum_value.name,
110
+ GraphQL::Language::Nodes::EnumValueDefinition.new(
111
+ name: enum_value.graphql_name,
112
112
  description: enum_value.description,
113
+ directives: directives(enum_value),
113
114
  )
114
-
115
- if enum_value.deprecation_reason
116
- enum_value_node = enum_value_node.merge_directive(
117
- name: GraphQL::Directive::DeprecatedDirective.name,
118
- arguments: [GraphQL::Language::Nodes::Argument.new(name: "reason", value: enum_value.deprecation_reason)]
119
- )
120
- end
121
-
122
- enum_value_node
123
115
  end
124
116
 
125
117
  def build_scalar_type_node(scalar_type)
126
118
  GraphQL::Language::Nodes::ScalarTypeDefinition.new(
127
- name: scalar_type.name,
119
+ name: scalar_type.graphql_name,
128
120
  description: scalar_type.description,
121
+ directives: directives(scalar_type),
129
122
  )
130
123
  end
131
124
 
@@ -137,10 +130,11 @@ module GraphQL
137
130
  end
138
131
 
139
132
  argument_node = GraphQL::Language::Nodes::InputValueDefinition.new(
140
- name: argument.name,
133
+ name: argument.graphql_name,
141
134
  description: argument.description,
142
135
  type: build_type_name_node(argument.type),
143
136
  default_value: default_value,
137
+ directives: directives(argument),
144
138
  )
145
139
 
146
140
  argument_node
@@ -148,15 +142,17 @@ module GraphQL
148
142
 
149
143
  def build_input_object_node(input_object)
150
144
  GraphQL::Language::Nodes::InputObjectTypeDefinition.new(
151
- name: input_object.name,
145
+ name: input_object.graphql_name,
152
146
  fields: build_argument_nodes(warden.arguments(input_object)),
153
147
  description: input_object.description,
148
+ directives: directives(input_object),
154
149
  )
155
150
  end
156
151
 
157
152
  def build_directive_node(directive)
158
153
  GraphQL::Language::Nodes::DirectiveDefinition.new(
159
- name: directive.name,
154
+ name: directive.graphql_name,
155
+ repeatable: directive.repeatable?,
160
156
  arguments: build_argument_nodes(warden.arguments(directive)),
161
157
  locations: build_directive_location_nodes(directive.locations),
162
158
  description: directive.description,
@@ -164,7 +160,7 @@ module GraphQL
164
160
  end
165
161
 
166
162
  def build_directive_location_nodes(locations)
167
- locations.map { |location| build_directive_location_node(location) }
163
+ locations.sort.map { |location| build_directive_location_node(location) }
168
164
  end
169
165
 
170
166
  def build_directive_location_node(location)
@@ -174,17 +170,17 @@ module GraphQL
174
170
  end
175
171
 
176
172
  def build_type_name_node(type)
177
- case type
178
- when GraphQL::ListType
173
+ case type.kind.name
174
+ when "LIST"
179
175
  GraphQL::Language::Nodes::ListType.new(
180
176
  of_type: build_type_name_node(type.of_type)
181
177
  )
182
- when GraphQL::NonNullType
178
+ when "NON_NULL"
183
179
  GraphQL::Language::Nodes::NonNullType.new(
184
180
  of_type: build_type_name_node(type.of_type)
185
181
  )
186
182
  else
187
- GraphQL::Language::Nodes::TypeName.new(name: type.name)
183
+ GraphQL::Language::Nodes::TypeName.new(name: type.graphql_name)
188
184
  end
189
185
  end
190
186
 
@@ -193,24 +189,28 @@ module GraphQL
193
189
  return GraphQL::Language::Nodes::NullValue.new(name: "null")
194
190
  end
195
191
 
196
- case type
197
- when GraphQL::ScalarType
192
+ case type.kind.name
193
+ when "SCALAR"
198
194
  type.coerce_isolated_result(default_value)
199
- when EnumType
195
+ when "ENUM"
200
196
  GraphQL::Language::Nodes::Enum.new(name: type.coerce_isolated_result(default_value))
201
- when InputObjectType
197
+ when "INPUT_OBJECT"
202
198
  GraphQL::Language::Nodes::InputObject.new(
203
199
  arguments: default_value.to_h.map do |arg_name, arg_value|
204
- arg_type = type.input_fields.fetch(arg_name.to_s).type
200
+ args = @warden.arguments(type)
201
+ arg = args.find { |a| a.keyword.to_s == arg_name.to_s }
202
+ if arg.nil?
203
+ raise ArgumentError, "No argument definition on #{type.graphql_name} for argument: #{arg_name.inspect} (expected one of: #{args.map(&:keyword)})"
204
+ end
205
205
  GraphQL::Language::Nodes::Argument.new(
206
- name: arg_name,
207
- value: build_default_value(arg_value, arg_type)
206
+ name: arg.graphql_name.to_s,
207
+ value: build_default_value(arg_value, arg.type)
208
208
  )
209
209
  end
210
210
  )
211
- when NonNullType
211
+ when "NON_NULL"
212
212
  build_default_value(default_value, type.of_type)
213
- when ListType
213
+ when "LIST"
214
214
  default_value.to_a.map { |v| build_default_value(v, type.of_type) }
215
215
  else
216
216
  raise GraphQL::RequiredImplementationMissingError, "Unexpected default value type #{type.inspect}"
@@ -218,18 +218,18 @@ module GraphQL
218
218
  end
219
219
 
220
220
  def build_type_definition_node(type)
221
- case type
222
- when GraphQL::ObjectType
221
+ case type.kind.name
222
+ when "OBJECT"
223
223
  build_object_type_node(type)
224
- when GraphQL::UnionType
224
+ when "UNION"
225
225
  build_union_type_node(type)
226
- when GraphQL::InterfaceType
226
+ when "INTERFACE"
227
227
  build_interface_type_node(type)
228
- when GraphQL::ScalarType
228
+ when "SCALAR"
229
229
  build_scalar_type_node(type)
230
- when GraphQL::EnumType
230
+ when "ENUM"
231
231
  build_enum_type_node(type)
232
- when GraphQL::InputObjectType
232
+ when "INPUT_OBJECT"
233
233
  build_input_object_node(type)
234
234
  else
235
235
  raise TypeError
@@ -266,7 +266,7 @@ module GraphQL
266
266
  end
267
267
 
268
268
  if !include_built_in_scalars
269
- types = types.reject { |type| type.default_scalar? }
269
+ types = types.reject { |type| type.kind.scalar? && type.default_scalar? }
270
270
  end
271
271
 
272
272
  types
@@ -287,9 +287,62 @@ module GraphQL
287
287
  end
288
288
 
289
289
  def schema_respects_root_name_conventions?(schema)
290
- (schema.query.nil? || schema.query.name == 'Query') &&
291
- (schema.mutation.nil? || schema.mutation.name == 'Mutation') &&
292
- (schema.subscription.nil? || schema.subscription.name == 'Subscription')
290
+ (schema.query.nil? || schema.query.graphql_name == 'Query') &&
291
+ (schema.mutation.nil? || schema.mutation.graphql_name == 'Mutation') &&
292
+ (schema.subscription.nil? || schema.subscription.graphql_name == 'Subscription')
293
+ end
294
+
295
+ def directives(member)
296
+ definition_directives(member)
297
+ end
298
+
299
+ def definition_directives(member)
300
+ dirs = if !member.respond_to?(:directives) || member.directives.empty?
301
+ []
302
+ else
303
+ member.directives.map do |dir|
304
+ args = []
305
+ dir.arguments.argument_values.each_value do |arg_value| # rubocop:disable Development/ContextIsPassedCop -- directive instance method
306
+ arg_defn = arg_value.definition
307
+ if arg_defn.default_value? && arg_value.value == arg_defn.default_value
308
+ next
309
+ else
310
+ value_node = build_default_value(arg_value.value, arg_value.definition.type)
311
+ args << GraphQL::Language::Nodes::Argument.new(
312
+ name: arg_value.definition.name,
313
+ value: value_node,
314
+ )
315
+ end
316
+ end
317
+ GraphQL::Language::Nodes::Directive.new(
318
+ name: dir.class.graphql_name,
319
+ arguments: args
320
+ )
321
+ end
322
+ end
323
+
324
+ # This is just for printing legacy `.define { ... }` schemas, where `deprecation_reason` isn't added to `.directives`.
325
+ if !member.respond_to?(:directives) && member.respond_to?(:deprecation_reason) && (reason = member.deprecation_reason)
326
+ arguments = []
327
+
328
+ if reason != GraphQL::Schema::Directive::DEFAULT_DEPRECATION_REASON
329
+ arguments << GraphQL::Language::Nodes::Argument.new(
330
+ name: "reason",
331
+ value: reason
332
+ )
333
+ end
334
+
335
+ dirs << GraphQL::Language::Nodes::Directive.new(
336
+ name: GraphQL::Directive::DeprecatedDirective.graphql_name,
337
+ arguments: arguments
338
+ )
339
+ end
340
+
341
+ dirs
342
+ end
343
+
344
+ def ast_directives(member)
345
+ member.ast_node ? member.ast_node.directives : []
293
346
  end
294
347
 
295
348
  attr_reader :schema, :warden, :always_include_schema,