graphql 1.10.2 → 2.0.21

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.

Potentially problematic release.


This version of graphql might be problematic. Click here for more details.

Files changed (402) 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 +45 -8
  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 +49 -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 +24 -33
  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/ast/field_usage.rb +30 -1
  49. data/lib/graphql/analysis/ast/max_query_complexity.rb +0 -1
  50. data/lib/graphql/analysis/ast/query_complexity.rb +125 -117
  51. data/lib/graphql/analysis/ast/query_depth.rb +0 -1
  52. data/lib/graphql/analysis/ast/visitor.rb +52 -36
  53. data/lib/graphql/analysis/ast.rb +7 -8
  54. data/lib/graphql/analysis.rb +0 -7
  55. data/lib/graphql/backtrace/inspect_result.rb +0 -1
  56. data/lib/graphql/backtrace/table.rb +31 -18
  57. data/lib/graphql/backtrace/trace.rb +96 -0
  58. data/lib/graphql/backtrace/traced_error.rb +0 -1
  59. data/lib/graphql/backtrace/tracer.rb +39 -9
  60. data/lib/graphql/backtrace.rb +26 -18
  61. data/lib/graphql/dataloader/null_dataloader.rb +24 -0
  62. data/lib/graphql/dataloader/request.rb +19 -0
  63. data/lib/graphql/dataloader/request_all.rb +19 -0
  64. data/lib/graphql/dataloader/source.rb +164 -0
  65. data/lib/graphql/dataloader.rb +311 -0
  66. data/lib/graphql/date_encoding_error.rb +16 -0
  67. data/lib/graphql/deprecation.rb +9 -0
  68. data/lib/graphql/dig.rb +1 -1
  69. data/lib/graphql/execution/errors.rb +77 -44
  70. data/lib/graphql/execution/interpreter/argument_value.rb +28 -0
  71. data/lib/graphql/execution/interpreter/arguments.rb +88 -0
  72. data/lib/graphql/execution/interpreter/arguments_cache.rb +104 -0
  73. data/lib/graphql/execution/interpreter/handles_raw_value.rb +18 -0
  74. data/lib/graphql/execution/interpreter/resolve.rb +62 -24
  75. data/lib/graphql/execution/interpreter/runtime.rb +826 -464
  76. data/lib/graphql/execution/interpreter.rb +206 -68
  77. data/lib/graphql/execution/lazy.rb +11 -21
  78. data/lib/graphql/execution/lookahead.rb +55 -136
  79. data/lib/graphql/execution/multiplex.rb +6 -162
  80. data/lib/graphql/execution.rb +11 -4
  81. data/lib/graphql/filter.rb +7 -2
  82. data/lib/graphql/integer_decoding_error.rb +17 -0
  83. data/lib/graphql/integer_encoding_error.rb +18 -2
  84. data/lib/graphql/introspection/directive_location_enum.rb +2 -2
  85. data/lib/graphql/introspection/directive_type.rb +11 -5
  86. data/lib/graphql/introspection/dynamic_fields.rb +3 -8
  87. data/lib/graphql/introspection/entry_points.rb +4 -17
  88. data/lib/graphql/introspection/enum_value_type.rb +2 -2
  89. data/lib/graphql/introspection/field_type.rb +9 -5
  90. data/lib/graphql/introspection/input_value_type.rb +15 -3
  91. data/lib/graphql/introspection/introspection_query.rb +6 -92
  92. data/lib/graphql/introspection/schema_type.rb +11 -6
  93. data/lib/graphql/introspection/type_type.rb +31 -14
  94. data/lib/graphql/introspection.rb +100 -0
  95. data/lib/graphql/invalid_null_error.rb +18 -0
  96. data/lib/graphql/language/block_string.rb +20 -5
  97. data/lib/graphql/language/cache.rb +37 -0
  98. data/lib/graphql/language/document_from_schema_definition.rb +96 -44
  99. data/lib/graphql/language/lexer.rb +216 -1462
  100. data/lib/graphql/language/nodes.rb +126 -129
  101. data/lib/graphql/language/parser.rb +997 -933
  102. data/lib/graphql/language/parser.y +148 -118
  103. data/lib/graphql/language/printer.rb +48 -23
  104. data/lib/graphql/language/sanitized_printer.rb +222 -0
  105. data/lib/graphql/language/token.rb +0 -4
  106. data/lib/graphql/language/visitor.rb +192 -84
  107. data/lib/graphql/language.rb +2 -0
  108. data/lib/graphql/name_validator.rb +2 -7
  109. data/lib/graphql/pagination/active_record_relation_connection.rb +45 -3
  110. data/lib/graphql/pagination/array_connection.rb +6 -4
  111. data/lib/graphql/pagination/connection.rb +105 -23
  112. data/lib/graphql/pagination/connections.rb +62 -35
  113. data/lib/graphql/pagination/relation_connection.rb +88 -36
  114. data/lib/graphql/parse_error.rb +0 -1
  115. data/lib/graphql/query/context.rb +203 -198
  116. data/lib/graphql/query/fingerprint.rb +26 -0
  117. data/lib/graphql/query/input_validation_result.rb +33 -7
  118. data/lib/graphql/query/null_context.rb +22 -9
  119. data/lib/graphql/query/validation_pipeline.rb +16 -38
  120. data/lib/graphql/query/variable_validation_error.rb +3 -3
  121. data/lib/graphql/query/variables.rb +36 -12
  122. data/lib/graphql/query.rb +92 -44
  123. data/lib/graphql/railtie.rb +6 -102
  124. data/lib/graphql/rake_task/validate.rb +1 -1
  125. data/lib/graphql/rake_task.rb +41 -10
  126. data/lib/graphql/relay/range_add.rb +17 -10
  127. data/lib/graphql/relay.rb +0 -15
  128. data/lib/graphql/rubocop/graphql/base_cop.rb +36 -0
  129. data/lib/graphql/rubocop/graphql/default_null_true.rb +43 -0
  130. data/lib/graphql/rubocop/graphql/default_required_true.rb +43 -0
  131. data/lib/graphql/rubocop.rb +4 -0
  132. data/lib/graphql/schema/addition.rb +245 -0
  133. data/lib/graphql/schema/argument.rb +250 -46
  134. data/lib/graphql/schema/base_64_encoder.rb +2 -0
  135. data/lib/graphql/schema/build_from_definition/resolve_map.rb +3 -1
  136. data/lib/graphql/schema/build_from_definition.rb +243 -89
  137. data/lib/graphql/schema/directive/deprecated.rb +1 -1
  138. data/lib/graphql/schema/directive/feature.rb +1 -1
  139. data/lib/graphql/schema/directive/flagged.rb +57 -0
  140. data/lib/graphql/schema/directive/include.rb +1 -1
  141. data/lib/graphql/schema/directive/one_of.rb +12 -0
  142. data/lib/graphql/schema/directive/skip.rb +1 -1
  143. data/lib/graphql/schema/directive/transform.rb +14 -2
  144. data/lib/graphql/schema/directive.rb +108 -20
  145. data/lib/graphql/schema/enum.rb +105 -44
  146. data/lib/graphql/schema/enum_value.rb +15 -25
  147. data/lib/graphql/schema/field/connection_extension.rb +50 -30
  148. data/lib/graphql/schema/field/scope_extension.rb +1 -1
  149. data/lib/graphql/schema/field.rb +476 -331
  150. data/lib/graphql/schema/field_extension.rb +86 -2
  151. data/lib/graphql/schema/find_inherited_value.rb +6 -8
  152. data/lib/graphql/schema/finder.rb +5 -5
  153. data/lib/graphql/schema/input_object.rb +133 -121
  154. data/lib/graphql/schema/interface.rb +17 -45
  155. data/lib/graphql/schema/introspection_system.rb +3 -8
  156. data/lib/graphql/schema/late_bound_type.rb +8 -2
  157. data/lib/graphql/schema/list.rb +25 -8
  158. data/lib/graphql/schema/loader.rb +139 -103
  159. data/lib/graphql/schema/member/base_dsl_methods.rb +29 -35
  160. data/lib/graphql/schema/member/build_type.rb +19 -14
  161. data/lib/graphql/schema/member/has_arguments.rb +310 -26
  162. data/lib/graphql/schema/member/has_ast_node.rb +16 -1
  163. data/lib/graphql/schema/member/has_deprecation_reason.rb +24 -0
  164. data/lib/graphql/schema/member/has_directives.rb +118 -0
  165. data/lib/graphql/schema/member/has_fields.rb +164 -42
  166. data/lib/graphql/schema/member/has_interfaces.rb +129 -0
  167. data/lib/graphql/schema/member/has_unresolved_type_error.rb +15 -0
  168. data/lib/graphql/schema/member/has_validators.rb +57 -0
  169. data/lib/graphql/schema/member/relay_shortcuts.rb +47 -2
  170. data/lib/graphql/schema/member/type_system_helpers.rb +20 -3
  171. data/lib/graphql/schema/member/validates_input.rb +3 -3
  172. data/lib/graphql/schema/member.rb +6 -6
  173. data/lib/graphql/schema/mutation.rb +4 -9
  174. data/lib/graphql/schema/non_null.rb +12 -7
  175. data/lib/graphql/schema/object.rb +35 -69
  176. data/lib/graphql/schema/printer.rb +16 -34
  177. data/lib/graphql/schema/relay_classic_mutation.rb +90 -43
  178. data/lib/graphql/schema/resolver/has_payload_type.rb +51 -11
  179. data/lib/graphql/schema/resolver.rb +144 -79
  180. data/lib/graphql/schema/scalar.rb +27 -18
  181. data/lib/graphql/schema/subscription.rb +55 -26
  182. data/lib/graphql/schema/timeout.rb +45 -35
  183. data/lib/graphql/schema/type_expression.rb +1 -1
  184. data/lib/graphql/schema/type_membership.rb +21 -4
  185. data/lib/graphql/schema/union.rb +48 -13
  186. data/lib/graphql/schema/unique_within_type.rb +1 -2
  187. data/lib/graphql/schema/validator/allow_blank_validator.rb +29 -0
  188. data/lib/graphql/schema/validator/allow_null_validator.rb +26 -0
  189. data/lib/graphql/schema/validator/exclusion_validator.rb +33 -0
  190. data/lib/graphql/schema/validator/format_validator.rb +48 -0
  191. data/lib/graphql/schema/validator/inclusion_validator.rb +35 -0
  192. data/lib/graphql/schema/validator/length_validator.rb +59 -0
  193. data/lib/graphql/schema/validator/numericality_validator.rb +82 -0
  194. data/lib/graphql/schema/validator/required_validator.rb +82 -0
  195. data/lib/graphql/schema/validator.rb +171 -0
  196. data/lib/graphql/schema/warden.rb +185 -32
  197. data/lib/graphql/schema/wrapper.rb +0 -5
  198. data/lib/graphql/schema.rb +471 -1116
  199. data/lib/graphql/static_validation/all_rules.rb +3 -0
  200. data/lib/graphql/static_validation/base_visitor.rb +13 -27
  201. data/lib/graphql/static_validation/definition_dependencies.rb +7 -2
  202. data/lib/graphql/static_validation/error.rb +3 -1
  203. data/lib/graphql/static_validation/literal_validator.rb +69 -26
  204. data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +44 -87
  205. data/lib/graphql/static_validation/rules/argument_literals_are_compatible_error.rb +22 -6
  206. data/lib/graphql/static_validation/rules/arguments_are_defined.rb +28 -22
  207. data/lib/graphql/static_validation/rules/arguments_are_defined_error.rb +4 -2
  208. data/lib/graphql/static_validation/rules/directives_are_defined.rb +12 -6
  209. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +13 -13
  210. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +12 -4
  211. data/lib/graphql/static_validation/rules/fields_will_merge.rb +92 -49
  212. data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +25 -4
  213. data/lib/graphql/static_validation/rules/fragments_are_finite.rb +2 -2
  214. data/lib/graphql/static_validation/rules/input_object_names_are_unique.rb +30 -0
  215. data/lib/graphql/static_validation/rules/input_object_names_are_unique_error.rb +30 -0
  216. data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid.rb +66 -0
  217. data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid_error.rb +29 -0
  218. data/lib/graphql/static_validation/rules/query_root_exists.rb +17 -0
  219. data/lib/graphql/static_validation/rules/query_root_exists_error.rb +26 -0
  220. data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +4 -2
  221. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +6 -7
  222. data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +13 -7
  223. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +9 -10
  224. data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +14 -8
  225. data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +4 -2
  226. data/lib/graphql/static_validation/validation_context.rb +13 -3
  227. data/lib/graphql/static_validation/validation_timeout_error.rb +25 -0
  228. data/lib/graphql/static_validation/validator.rb +32 -20
  229. data/lib/graphql/static_validation.rb +1 -2
  230. data/lib/graphql/string_encoding_error.rb +13 -3
  231. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +126 -19
  232. data/lib/graphql/subscriptions/broadcast_analyzer.rb +81 -0
  233. data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +58 -0
  234. data/lib/graphql/subscriptions/event.rb +81 -35
  235. data/lib/graphql/subscriptions/instrumentation.rb +0 -52
  236. data/lib/graphql/subscriptions/serialize.rb +53 -6
  237. data/lib/graphql/subscriptions.rb +113 -58
  238. data/lib/graphql/tracing/active_support_notifications_trace.rb +16 -0
  239. data/lib/graphql/tracing/active_support_notifications_tracing.rb +8 -21
  240. data/lib/graphql/tracing/appoptics_trace.rb +231 -0
  241. data/lib/graphql/tracing/appoptics_tracing.rb +173 -0
  242. data/lib/graphql/tracing/appsignal_trace.rb +77 -0
  243. data/lib/graphql/tracing/appsignal_tracing.rb +15 -0
  244. data/lib/graphql/tracing/data_dog_trace.rb +148 -0
  245. data/lib/graphql/tracing/data_dog_tracing.rb +26 -2
  246. data/lib/graphql/tracing/legacy_trace.rb +65 -0
  247. data/lib/graphql/tracing/new_relic_trace.rb +75 -0
  248. data/lib/graphql/tracing/new_relic_tracing.rb +1 -12
  249. data/lib/graphql/tracing/notifications_trace.rb +42 -0
  250. data/lib/graphql/tracing/notifications_tracing.rb +59 -0
  251. data/lib/graphql/tracing/platform_trace.rb +109 -0
  252. data/lib/graphql/tracing/platform_tracing.rb +64 -43
  253. data/lib/graphql/tracing/prometheus_trace.rb +89 -0
  254. data/lib/graphql/tracing/prometheus_tracing/graphql_collector.rb +5 -2
  255. data/lib/graphql/tracing/prometheus_tracing.rb +3 -3
  256. data/lib/graphql/tracing/scout_trace.rb +72 -0
  257. data/lib/graphql/tracing/scout_tracing.rb +11 -0
  258. data/lib/graphql/tracing/statsd_trace.rb +56 -0
  259. data/lib/graphql/tracing/statsd_tracing.rb +42 -0
  260. data/lib/graphql/tracing/trace.rb +75 -0
  261. data/lib/graphql/tracing.rb +23 -71
  262. data/lib/graphql/type_kinds.rb +6 -3
  263. data/lib/graphql/types/big_int.rb +5 -1
  264. data/lib/graphql/types/int.rb +10 -3
  265. data/lib/graphql/types/iso_8601_date.rb +20 -9
  266. data/lib/graphql/types/iso_8601_date_time.rb +36 -10
  267. data/lib/graphql/types/relay/base_connection.rb +18 -92
  268. data/lib/graphql/types/relay/base_edge.rb +2 -34
  269. data/lib/graphql/types/relay/connection_behaviors.rb +176 -0
  270. data/lib/graphql/types/relay/edge_behaviors.rb +75 -0
  271. data/lib/graphql/types/relay/has_node_field.rb +41 -0
  272. data/lib/graphql/types/relay/has_nodes_field.rb +41 -0
  273. data/lib/graphql/types/relay/node.rb +2 -4
  274. data/lib/graphql/types/relay/node_behaviors.rb +25 -0
  275. data/lib/graphql/types/relay/page_info.rb +2 -14
  276. data/lib/graphql/types/relay/page_info_behaviors.rb +30 -0
  277. data/lib/graphql/types/relay.rb +10 -5
  278. data/lib/graphql/types/string.rb +8 -2
  279. data/lib/graphql/unauthorized_error.rb +2 -2
  280. data/lib/graphql/version.rb +1 -1
  281. data/lib/graphql.rb +54 -65
  282. data/readme.md +3 -6
  283. metadata +116 -236
  284. data/lib/graphql/analysis/analyze_query.rb +0 -91
  285. data/lib/graphql/analysis/field_usage.rb +0 -45
  286. data/lib/graphql/analysis/max_query_complexity.rb +0 -26
  287. data/lib/graphql/analysis/max_query_depth.rb +0 -26
  288. data/lib/graphql/analysis/query_complexity.rb +0 -88
  289. data/lib/graphql/analysis/query_depth.rb +0 -43
  290. data/lib/graphql/analysis/reducer_state.rb +0 -48
  291. data/lib/graphql/argument.rb +0 -131
  292. data/lib/graphql/authorization.rb +0 -82
  293. data/lib/graphql/backwards_compatibility.rb +0 -60
  294. data/lib/graphql/base_type.rb +0 -230
  295. data/lib/graphql/boolean_type.rb +0 -2
  296. data/lib/graphql/compatibility/execution_specification/counter_schema.rb +0 -53
  297. data/lib/graphql/compatibility/execution_specification/specification_schema.rb +0 -200
  298. data/lib/graphql/compatibility/execution_specification.rb +0 -435
  299. data/lib/graphql/compatibility/lazy_execution_specification/lazy_schema.rb +0 -111
  300. data/lib/graphql/compatibility/lazy_execution_specification.rb +0 -213
  301. data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +0 -87
  302. data/lib/graphql/compatibility/query_parser_specification/query_assertions.rb +0 -79
  303. data/lib/graphql/compatibility/query_parser_specification.rb +0 -264
  304. data/lib/graphql/compatibility/schema_parser_specification.rb +0 -680
  305. data/lib/graphql/compatibility.rb +0 -5
  306. data/lib/graphql/define/assign_argument.rb +0 -12
  307. data/lib/graphql/define/assign_connection.rb +0 -13
  308. data/lib/graphql/define/assign_enum_value.rb +0 -18
  309. data/lib/graphql/define/assign_global_id_field.rb +0 -11
  310. data/lib/graphql/define/assign_mutation_function.rb +0 -34
  311. data/lib/graphql/define/assign_object_field.rb +0 -42
  312. data/lib/graphql/define/defined_object_proxy.rb +0 -53
  313. data/lib/graphql/define/instance_definable.rb +0 -210
  314. data/lib/graphql/define/no_definition_error.rb +0 -7
  315. data/lib/graphql/define/non_null_with_bang.rb +0 -16
  316. data/lib/graphql/define/type_definer.rb +0 -31
  317. data/lib/graphql/define.rb +0 -31
  318. data/lib/graphql/deprecated_dsl.rb +0 -42
  319. data/lib/graphql/directive/deprecated_directive.rb +0 -2
  320. data/lib/graphql/directive/include_directive.rb +0 -2
  321. data/lib/graphql/directive/skip_directive.rb +0 -2
  322. data/lib/graphql/directive.rb +0 -107
  323. data/lib/graphql/enum_type.rb +0 -127
  324. data/lib/graphql/execution/execute.rb +0 -326
  325. data/lib/graphql/execution/flatten.rb +0 -40
  326. data/lib/graphql/execution/instrumentation.rb +0 -92
  327. data/lib/graphql/execution/interpreter/hash_response.rb +0 -46
  328. data/lib/graphql/execution/lazy/resolve.rb +0 -91
  329. data/lib/graphql/execution/typecast.rb +0 -50
  330. data/lib/graphql/field/resolve.rb +0 -59
  331. data/lib/graphql/field.rb +0 -222
  332. data/lib/graphql/float_type.rb +0 -2
  333. data/lib/graphql/function.rb +0 -124
  334. data/lib/graphql/id_type.rb +0 -2
  335. data/lib/graphql/input_object_type.rb +0 -132
  336. data/lib/graphql/int_type.rb +0 -2
  337. data/lib/graphql/interface_type.rb +0 -65
  338. data/lib/graphql/internal_representation/document.rb +0 -27
  339. data/lib/graphql/internal_representation/node.rb +0 -206
  340. data/lib/graphql/internal_representation/print.rb +0 -51
  341. data/lib/graphql/internal_representation/rewrite.rb +0 -184
  342. data/lib/graphql/internal_representation/scope.rb +0 -88
  343. data/lib/graphql/internal_representation/visit.rb +0 -36
  344. data/lib/graphql/internal_representation.rb +0 -7
  345. data/lib/graphql/language/lexer.rl +0 -258
  346. data/lib/graphql/list_type.rb +0 -80
  347. data/lib/graphql/literal_validation_error.rb +0 -6
  348. data/lib/graphql/non_null_type.rb +0 -71
  349. data/lib/graphql/object_type.rb +0 -121
  350. data/lib/graphql/query/arguments.rb +0 -188
  351. data/lib/graphql/query/arguments_cache.rb +0 -25
  352. data/lib/graphql/query/executor.rb +0 -53
  353. data/lib/graphql/query/literal_input.rb +0 -136
  354. data/lib/graphql/query/serial_execution/field_resolution.rb +0 -92
  355. data/lib/graphql/query/serial_execution/operation_resolution.rb +0 -19
  356. data/lib/graphql/query/serial_execution/selection_resolution.rb +0 -23
  357. data/lib/graphql/query/serial_execution/value_resolution.rb +0 -87
  358. data/lib/graphql/query/serial_execution.rb +0 -39
  359. data/lib/graphql/relay/array_connection.rb +0 -85
  360. data/lib/graphql/relay/base_connection.rb +0 -176
  361. data/lib/graphql/relay/connection_instrumentation.rb +0 -54
  362. data/lib/graphql/relay/connection_resolve.rb +0 -43
  363. data/lib/graphql/relay/connection_type.rb +0 -41
  364. data/lib/graphql/relay/edge.rb +0 -27
  365. data/lib/graphql/relay/edge_type.rb +0 -19
  366. data/lib/graphql/relay/edges_instrumentation.rb +0 -40
  367. data/lib/graphql/relay/global_id_resolve.rb +0 -18
  368. data/lib/graphql/relay/mongo_relation_connection.rb +0 -50
  369. data/lib/graphql/relay/mutation/instrumentation.rb +0 -23
  370. data/lib/graphql/relay/mutation/resolve.rb +0 -56
  371. data/lib/graphql/relay/mutation/result.rb +0 -38
  372. data/lib/graphql/relay/mutation.rb +0 -105
  373. data/lib/graphql/relay/node.rb +0 -36
  374. data/lib/graphql/relay/page_info.rb +0 -7
  375. data/lib/graphql/relay/relation_connection.rb +0 -190
  376. data/lib/graphql/relay/type_extensions.rb +0 -30
  377. data/lib/graphql/scalar_type.rb +0 -76
  378. data/lib/graphql/schema/catchall_middleware.rb +0 -35
  379. data/lib/graphql/schema/default_parse_error.rb +0 -10
  380. data/lib/graphql/schema/default_type_error.rb +0 -15
  381. data/lib/graphql/schema/member/accepts_definition.rb +0 -152
  382. data/lib/graphql/schema/member/cached_graphql_definition.rb +0 -31
  383. data/lib/graphql/schema/member/instrumentation.rb +0 -132
  384. data/lib/graphql/schema/middleware_chain.rb +0 -82
  385. data/lib/graphql/schema/possible_types.rb +0 -39
  386. data/lib/graphql/schema/rescue_middleware.rb +0 -60
  387. data/lib/graphql/schema/timeout_middleware.rb +0 -86
  388. data/lib/graphql/schema/traversal.rb +0 -228
  389. data/lib/graphql/schema/validation.rb +0 -303
  390. data/lib/graphql/static_validation/default_visitor.rb +0 -15
  391. data/lib/graphql/static_validation/no_validate_visitor.rb +0 -10
  392. data/lib/graphql/string_type.rb +0 -2
  393. data/lib/graphql/subscriptions/subscription_root.rb +0 -65
  394. data/lib/graphql/tracing/skylight_tracing.rb +0 -70
  395. data/lib/graphql/types/relay/base_field.rb +0 -22
  396. data/lib/graphql/types/relay/base_interface.rb +0 -29
  397. data/lib/graphql/types/relay/base_object.rb +0 -26
  398. data/lib/graphql/types/relay/node_field.rb +0 -43
  399. data/lib/graphql/types/relay/nodes_field.rb +0 -45
  400. data/lib/graphql/union_type.rb +0 -113
  401. data/lib/graphql/upgrader/member.rb +0 -936
  402. data/lib/graphql/upgrader/schema.rb +0 -37
@@ -11,10 +11,11 @@ module GraphQL
11
11
  def self.extended(cls)
12
12
  cls.extend(ArgumentClassAccessor)
13
13
  cls.include(ArgumentObjectLoader)
14
+ cls.extend(ClassConfigured)
14
15
  end
15
16
 
16
17
  # @see {GraphQL::Schema::Argument#initialize} for parameters
17
- # @return [GraphQL::Schema::Argument] An instance of {arguments_class}, created from `*args`
18
+ # @return [GraphQL::Schema::Argument] An instance of {argument_class}, created from `*args`
18
19
  def argument(*args, **kwargs, &block)
19
20
  kwargs[:owner] = self
20
21
  loads = kwargs[:loads]
@@ -37,24 +38,200 @@ module GraphQL
37
38
  end
38
39
  arg_defn = self.argument_class.new(*args, **kwargs, &block)
39
40
  add_argument(arg_defn)
41
+
42
+ if self.is_a?(Class) && !method_defined?(:"load_#{arg_defn.keyword}")
43
+ method_owner = if self < GraphQL::Schema::InputObject || self < GraphQL::Schema::Directive
44
+ "self."
45
+ elsif self < GraphQL::Schema::Resolver
46
+ ""
47
+ else
48
+ raise "Unexpected argument owner: #{self}"
49
+ end
50
+ if loads && arg_defn.type.list?
51
+ class_eval <<-RUBY, __FILE__, __LINE__ + 1
52
+ def #{method_owner}load_#{arg_defn.keyword}(values, context = nil)
53
+ argument = get_argument("#{arg_defn.graphql_name}")
54
+ (context || self.context).schema.after_lazy(values) do |values2|
55
+ GraphQL::Execution::Lazy.all(values2.map { |value| load_application_object(argument, value, context || self.context) })
56
+ end
57
+ end
58
+ RUBY
59
+ elsif loads
60
+ class_eval <<-RUBY, __FILE__, __LINE__ + 1
61
+ def #{method_owner}load_#{arg_defn.keyword}(value, context = nil)
62
+ argument = get_argument("#{arg_defn.graphql_name}")
63
+ load_application_object(argument, value, context || self.context)
64
+ end
65
+ RUBY
66
+ else
67
+ class_eval <<-RUBY, __FILE__, __LINE__ + 1
68
+ def #{method_owner}load_#{arg_defn.keyword}(value, _context = nil)
69
+ value
70
+ end
71
+ RUBY
72
+ end
73
+ end
74
+ arg_defn
40
75
  end
41
76
 
42
77
  # Register this argument with the class.
43
78
  # @param arg_defn [GraphQL::Schema::Argument]
44
79
  # @return [GraphQL::Schema::Argument]
45
80
  def add_argument(arg_defn)
46
- own_arguments[arg_defn.name] = arg_defn
81
+ @own_arguments ||= {}
82
+ prev_defn = @own_arguments[arg_defn.name]
83
+ case prev_defn
84
+ when nil
85
+ @own_arguments[arg_defn.name] = arg_defn
86
+ when Array
87
+ prev_defn << arg_defn
88
+ when GraphQL::Schema::Argument
89
+ @own_arguments[arg_defn.name] = [prev_defn, arg_defn]
90
+ else
91
+ raise "Invariant: unexpected `@own_arguments[#{arg_defn.name.inspect}]`: #{prev_defn.inspect}"
92
+ end
47
93
  arg_defn
48
94
  end
49
95
 
96
+ def remove_argument(arg_defn)
97
+ prev_defn = @own_arguments[arg_defn.name]
98
+ case prev_defn
99
+ when nil
100
+ # done
101
+ when Array
102
+ prev_defn.delete(arg_defn)
103
+ when GraphQL::Schema::Argument
104
+ @own_arguments.delete(arg_defn.name)
105
+ else
106
+ raise "Invariant: unexpected `@own_arguments[#{arg_defn.name.inspect}]`: #{prev_defn.inspect}"
107
+ end
108
+ nil
109
+ end
110
+
50
111
  # @return [Hash<String => GraphQL::Schema::Argument] Arguments defined on this thing, keyed by name. Includes inherited definitions
51
- def arguments
52
- inherited_arguments = ((self.is_a?(Class) && superclass.respond_to?(:arguments)) ? superclass.arguments : nil)
53
- # Local definitions override inherited ones
54
- if inherited_arguments
55
- inherited_arguments.merge(own_arguments)
112
+ def arguments(context = GraphQL::Query::NullContext)
113
+ if own_arguments.any?
114
+ own_arguments_that_apply = {}
115
+ own_arguments.each do |name, args_entry|
116
+ if (visible_defn = Warden.visible_entry?(:visible_argument?, args_entry, context))
117
+ own_arguments_that_apply[visible_defn.graphql_name] = visible_defn
118
+ end
119
+ end
120
+ end
121
+ # might be nil if there are actually no arguments
122
+ own_arguments_that_apply || own_arguments
123
+ end
124
+
125
+ module ClassConfigured
126
+ def inherited(child_class)
127
+ super
128
+ child_class.extend(InheritedArguments)
129
+ end
130
+
131
+ module InheritedArguments
132
+ def arguments(context = GraphQL::Query::NullContext)
133
+ own_arguments = super
134
+ inherited_arguments = superclass.arguments(context)
135
+
136
+ if own_arguments.any?
137
+ if inherited_arguments.any?
138
+ # Local definitions override inherited ones
139
+ inherited_arguments.merge(own_arguments)
140
+ else
141
+ own_arguments
142
+ end
143
+ else
144
+ inherited_arguments
145
+ end
146
+ end
147
+
148
+ def all_argument_definitions
149
+ all_defns = {}
150
+ ancestors.reverse_each do |ancestor|
151
+ if ancestor.respond_to?(:own_arguments)
152
+ all_defns.merge!(ancestor.own_arguments)
153
+ end
154
+ end
155
+ all_defns = all_defns.values
156
+ all_defns.flatten!
157
+ all_defns
158
+ end
159
+
160
+
161
+ def get_argument(argument_name, context = GraphQL::Query::NullContext)
162
+ warden = Warden.from_context(context)
163
+ for ancestor in ancestors
164
+ if ancestor.respond_to?(:own_arguments) &&
165
+ (a = ancestor.own_arguments[argument_name]) &&
166
+ (a = Warden.visible_entry?(:visible_argument?, a, context, warden))
167
+ return a
168
+ end
169
+ end
170
+ nil
171
+ end
172
+ end
173
+ end
174
+
175
+ module FieldConfigured
176
+ def arguments(context = GraphQL::Query::NullContext)
177
+ own_arguments = super
178
+ if defined?(@resolver_class) && @resolver_class
179
+ inherited_arguments = @resolver_class.field_arguments(context)
180
+ if own_arguments.any?
181
+ if inherited_arguments.any?
182
+ inherited_arguments.merge(own_arguments)
183
+ else
184
+ own_arguments
185
+ end
186
+ else
187
+ inherited_arguments
188
+ end
189
+ else
190
+ own_arguments
191
+ end
192
+ end
193
+
194
+ def all_argument_definitions
195
+ if defined?(@resolver_class) && @resolver_class
196
+ all_defns = {}
197
+ @resolver_class.all_field_argument_definitions.each do |arg_defn|
198
+ key = arg_defn.graphql_name
199
+ case (current_value = all_defns[key])
200
+ when nil
201
+ all_defns[key] = arg_defn
202
+ when Array
203
+ current_value << arg_defn
204
+ when GraphQL::Schema::Argument
205
+ all_defns[key] = [current_value, arg_defn]
206
+ else
207
+ raise "Invariant: Unexpected argument definition, #{current_value.class}: #{current_value.inspect}"
208
+ end
209
+ end
210
+ all_defns.merge!(own_arguments)
211
+ all_defns = all_defns.values
212
+ all_defns.flatten!
213
+ all_defns
214
+ else
215
+ super
216
+ end
217
+ end
218
+ end
219
+
220
+ def all_argument_definitions
221
+ all_defns = own_arguments.values
222
+ all_defns.flatten!
223
+ all_defns
224
+ end
225
+
226
+ # @return [GraphQL::Schema::Argument, nil] Argument defined on this thing, fetched by name.
227
+ def get_argument(argument_name, context = GraphQL::Query::NullContext)
228
+ warden = Warden.from_context(context)
229
+ if (arg_config = own_arguments[argument_name]) && (visible_arg = Warden.visible_entry?(:visible_argument?, arg_config, context, warden))
230
+ visible_arg
231
+ elsif defined?(@resolver_class) && @resolver_class
232
+ @resolver_class.get_field_argument(argument_name, context)
56
233
  else
57
- own_arguments
234
+ nil
58
235
  end
59
236
  end
60
237
 
@@ -63,12 +240,99 @@ module GraphQL
63
240
  self.class.argument_class(new_arg_class)
64
241
  end
65
242
 
243
+ # @api private
244
+ # If given a block, it will eventually yield the loaded args to the block.
245
+ #
246
+ # If no block is given, it will immediately dataload (but might return a Lazy).
247
+ #
248
+ # @param values [Hash<String, Object>]
249
+ # @param context [GraphQL::Query::Context]
250
+ # @yield [Interpreter::Arguments, Execution::Lazy<Interpeter::Arguments>]
251
+ # @return [Interpreter::Arguments, Execution::Lazy<Interpeter::Arguments>]
252
+ def coerce_arguments(parent_object, values, context, &block)
253
+ # Cache this hash to avoid re-merging it
254
+ arg_defns = context.warden.arguments(self)
255
+ total_args_count = arg_defns.size
256
+
257
+ finished_args = nil
258
+ prepare_finished_args = -> {
259
+ if total_args_count == 0
260
+ finished_args = GraphQL::Execution::Interpreter::Arguments::EMPTY
261
+ if block_given?
262
+ block.call(finished_args)
263
+ end
264
+ else
265
+ argument_values = {}
266
+ resolved_args_count = 0
267
+ raised_error = false
268
+ arg_defns.each do |arg_defn|
269
+ context.dataloader.append_job do
270
+ begin
271
+ arg_defn.coerce_into_values(parent_object, values, context, argument_values)
272
+ rescue GraphQL::ExecutionError, GraphQL::UnauthorizedError => err
273
+ raised_error = true
274
+ finished_args = err
275
+ if block_given?
276
+ block.call(finished_args)
277
+ end
278
+ end
279
+
280
+ resolved_args_count += 1
281
+ if resolved_args_count == total_args_count && !raised_error
282
+ finished_args = context.schema.after_any_lazies(argument_values.values) {
283
+ GraphQL::Execution::Interpreter::Arguments.new(
284
+ argument_values: argument_values,
285
+ )
286
+ }
287
+ if block_given?
288
+ block.call(finished_args)
289
+ end
290
+ end
291
+ end
292
+ end
293
+ end
294
+ }
295
+
296
+ if block_given?
297
+ prepare_finished_args.call
298
+ nil
299
+ else
300
+ # This API returns eagerly, gotta run it now
301
+ context.dataloader.run_isolated(&prepare_finished_args)
302
+ finished_args
303
+ end
304
+ end
305
+
306
+ # Usually, this is validated statically by RequiredArgumentsArePresent,
307
+ # but not for directives.
308
+ # TODO apply static validations on schema definitions?
309
+ def validate_directive_argument(arg_defn, value)
310
+ # this is only implemented on directives.
311
+ nil
312
+ end
313
+
314
+ module HasDirectiveArguments
315
+ def validate_directive_argument(arg_defn, value)
316
+ if value.nil? && arg_defn.type.non_null?
317
+ raise ArgumentError, "#{arg_defn.path} is required, but no value was given"
318
+ end
319
+ end
320
+ end
321
+
322
+ def arguments_statically_coercible?
323
+ return @arguments_statically_coercible if defined?(@arguments_statically_coercible)
324
+
325
+ @arguments_statically_coercible = all_argument_definitions.all?(&:statically_coercible?)
326
+ end
327
+
66
328
  module ArgumentClassAccessor
67
329
  def argument_class(new_arg_class = nil)
68
330
  if new_arg_class
69
331
  @argument_class = new_arg_class
332
+ elsif defined?(@argument_class) && @argument_class
333
+ @argument_class
70
334
  else
71
- @argument_class || (superclass.respond_to?(:argument_class) ? superclass.argument_class : GraphQL::Schema::Argument)
335
+ superclass.respond_to?(:argument_class) ? superclass.argument_class : GraphQL::Schema::Argument
72
336
  end
73
337
  end
74
338
  end
@@ -85,9 +349,20 @@ module GraphQL
85
349
  context.schema.object_from_id(id, context)
86
350
  end
87
351
 
88
- def load_application_object(argument, lookup_as_type, id)
352
+ def load_application_object(argument, id, context)
89
353
  # See if any object can be found for this ID
90
- loaded_application_object = object_from_id(lookup_as_type, id, context)
354
+ if id.nil?
355
+ return nil
356
+ end
357
+ object_from_id(argument.loads, id, context)
358
+ end
359
+
360
+ def load_and_authorize_application_object(argument, id, context)
361
+ loaded_application_object = load_application_object(argument, id, context)
362
+ authorize_application_object(argument, id, context, loaded_application_object)
363
+ end
364
+
365
+ def authorize_application_object(argument, id, context, loaded_application_object)
91
366
  context.schema.after_lazy(loaded_application_object) do |application_object|
92
367
  if application_object.nil?
93
368
  err = GraphQL::LoadApplicationObjectFailedError.new(argument: argument, id: id, object: application_object)
@@ -95,9 +370,15 @@ module GraphQL
95
370
  end
96
371
  # Double-check that the located object is actually of this type
97
372
  # (Don't want to allow arbitrary access to objects this way)
98
- resolved_application_object_type = context.schema.resolve_type(lookup_as_type, application_object, context)
99
- context.schema.after_lazy(resolved_application_object_type) do |application_object_type|
100
- possible_object_types = context.warden.possible_types(lookup_as_type)
373
+ maybe_lazy_resolve_type = context.schema.resolve_type(argument.loads, application_object, context)
374
+ context.schema.after_lazy(maybe_lazy_resolve_type) do |resolve_type_result|
375
+ if resolve_type_result.is_a?(Array) && resolve_type_result.size == 2
376
+ application_object_type, application_object = resolve_type_result
377
+ else
378
+ application_object_type = resolve_type_result
379
+ # application_object is already assigned
380
+ end
381
+ possible_object_types = context.warden.possible_types(argument.loads)
101
382
  if !possible_object_types.include?(application_object_type)
102
383
  err = GraphQL::LoadApplicationObjectFailedError.new(argument: argument, id: id, object: application_object)
103
384
  load_application_object_failed(err)
@@ -105,20 +386,22 @@ module GraphQL
105
386
  # This object was loaded successfully
106
387
  # and resolved to the right type,
107
388
  # now apply the `.authorized?` class method if there is one
108
- if (class_based_type = application_object_type.type_class)
109
- context.schema.after_lazy(class_based_type.authorized?(application_object, context)) do |authed|
110
- if authed
111
- application_object
389
+ context.schema.after_lazy(application_object_type.authorized?(application_object, context)) do |authed|
390
+ if authed
391
+ application_object
392
+ else
393
+ err = GraphQL::UnauthorizedError.new(
394
+ object: application_object,
395
+ type: application_object_type,
396
+ context: context,
397
+ )
398
+ if self.respond_to?(:unauthorized_object)
399
+ err.set_backtrace(caller)
400
+ unauthorized_object(err)
112
401
  else
113
- raise GraphQL::UnauthorizedError.new(
114
- object: application_object,
115
- type: class_based_type,
116
- context: context,
117
- )
402
+ raise err
118
403
  end
119
404
  end
120
- else
121
- application_object
122
405
  end
123
406
  end
124
407
  end
@@ -130,8 +413,9 @@ module GraphQL
130
413
  end
131
414
  end
132
415
 
416
+ NO_ARGUMENTS = GraphQL::EmptyObjects::EMPTY_HASH
133
417
  def own_arguments
134
- @own_arguments ||= {}
418
+ @own_arguments || NO_ARGUMENTS
135
419
  end
136
420
  end
137
421
  end
@@ -3,14 +3,29 @@ module GraphQL
3
3
  class Schema
4
4
  class Member
5
5
  module HasAstNode
6
+ def self.extended(child_cls)
7
+ super
8
+ child_cls.ast_node = nil
9
+ end
10
+
11
+ def inherited(child_cls)
12
+ super
13
+ child_cls.ast_node = nil
14
+ end
15
+
6
16
  # If this schema was parsed from a `.graphql` file (or other SDL),
7
17
  # this is the AST node that defined this part of the schema.
8
18
  def ast_node(new_ast_node = nil)
9
19
  if new_ast_node
10
20
  @ast_node = new_ast_node
21
+ elsif defined?(@ast_node)
22
+ @ast_node
23
+ else
24
+ nil
11
25
  end
12
- @ast_node
13
26
  end
27
+
28
+ attr_writer :ast_node
14
29
  end
15
30
  end
16
31
  end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GraphQL
4
+ class Schema
5
+ class Member
6
+ module HasDeprecationReason
7
+ # @return [String, nil] Explains why this member was deprecated (if present, this will be marked deprecated in introspection)
8
+ attr_reader :deprecation_reason
9
+
10
+ # Set the deprecation reason for this member, or remove it by assigning `nil`
11
+ # @param text [String, nil]
12
+ def deprecation_reason=(text)
13
+ @deprecation_reason = text
14
+ if text.nil?
15
+ remove_directive(GraphQL::Schema::Directive::Deprecated)
16
+ else
17
+ # This removes a previously-attached directive, if there is one:
18
+ directive(GraphQL::Schema::Directive::Deprecated, reason: text)
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,118 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GraphQL
4
+ class Schema
5
+ class Member
6
+ module HasDirectives
7
+ def self.extended(child_cls)
8
+ super
9
+ child_cls.module_eval { self.own_directives = nil }
10
+ end
11
+
12
+ def inherited(child_cls)
13
+ super
14
+ child_cls.own_directives = nil
15
+ end
16
+
17
+ # Create an instance of `dir_class` for `self`, using `options`.
18
+ #
19
+ # It removes a previously-attached instance of `dir_class`, if there is one.
20
+ #
21
+ # @return [void]
22
+ def directive(dir_class, **options)
23
+ @own_directives ||= []
24
+ HasDirectives.add_directive(self, @own_directives, dir_class, options)
25
+ nil
26
+ end
27
+
28
+ # Remove an attached instance of `dir_class`, if there is one
29
+ # @param dir_class [Class<GraphQL::Schema::Directive>]
30
+ # @return [viod]
31
+ def remove_directive(dir_class)
32
+ HasDirectives.remove_directive(@own_directives, dir_class)
33
+ nil
34
+ end
35
+
36
+ def directives
37
+ HasDirectives.get_directives(self, @own_directives, :directives)
38
+ end
39
+
40
+ class << self
41
+ def add_directive(schema_member, directives, directive_class, directive_options)
42
+ remove_directive(directives, directive_class) unless directive_class.repeatable?
43
+ directives << directive_class.new(schema_member, **directive_options)
44
+ end
45
+
46
+ def remove_directive(directives, directive_class)
47
+ directives && directives.reject! { |d| d.is_a?(directive_class) }
48
+ end
49
+
50
+ def get_directives(schema_member, directives, directives_method)
51
+ case schema_member
52
+ when Class
53
+ inherited_directives = if schema_member.superclass.respond_to?(directives_method)
54
+ get_directives(schema_member.superclass, schema_member.superclass.public_send(directives_method), directives_method)
55
+ else
56
+ GraphQL::EmptyObjects::EMPTY_ARRAY
57
+ end
58
+ if inherited_directives.any? && directives
59
+ dirs = []
60
+ merge_directives(dirs, inherited_directives)
61
+ merge_directives(dirs, directives)
62
+ dirs
63
+ elsif directives
64
+ directives
65
+ elsif inherited_directives.any?
66
+ inherited_directives
67
+ else
68
+ GraphQL::EmptyObjects::EMPTY_ARRAY
69
+ end
70
+ when Module
71
+ dirs = nil
72
+ schema_member.ancestors.reverse_each do |ancestor|
73
+ if ancestor.respond_to?(:own_directives) &&
74
+ (anc_dirs = ancestor.own_directives).any?
75
+ dirs ||= []
76
+ merge_directives(dirs, anc_dirs)
77
+ end
78
+ end
79
+ if directives
80
+ dirs ||= []
81
+ merge_directives(dirs, directives)
82
+ end
83
+ dirs || GraphQL::EmptyObjects::EMPTY_ARRAY
84
+ when HasDirectives
85
+ directives || GraphQL::EmptyObjects::EMPTY_ARRAY
86
+ else
87
+ raise "Invariant: how could #{schema_member} not be a Class, Module, or instance of HasDirectives?"
88
+ end
89
+ end
90
+
91
+ private
92
+
93
+ # Modify `target` by adding items from `dirs` such that:
94
+ # - Any name conflict is overriden by the incoming member of `dirs`
95
+ # - Any other member of `dirs` is appended
96
+ # @param target [Array<GraphQL::Schema::Directive>]
97
+ # @param dirs [Array<GraphQL::Schema::Directive>]
98
+ # @return [void]
99
+ def merge_directives(target, dirs)
100
+ dirs.each do |dir|
101
+ if (idx = target.find_index { |d| d.graphql_name == dir.graphql_name })
102
+ target.slice!(idx)
103
+ target.insert(idx, dir)
104
+ else
105
+ target << dir
106
+ end
107
+ end
108
+ nil
109
+ end
110
+ end
111
+
112
+ protected
113
+
114
+ attr_accessor :own_directives
115
+ end
116
+ end
117
+ end
118
+ end