graphql 1.9.17 → 2.0.21

Sign up to get free protection for your applications and to get access to all the features.
Files changed (416) 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 +25 -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/ast/field_usage.rb +31 -2
  49. data/lib/graphql/analysis/ast/max_query_complexity.rb +0 -1
  50. data/lib/graphql/analysis/ast/query_complexity.rb +175 -68
  51. data/lib/graphql/analysis/ast/query_depth.rb +0 -1
  52. data/lib/graphql/analysis/ast/visitor.rb +54 -38
  53. data/lib/graphql/analysis/ast.rb +16 -16
  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 +37 -16
  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/directive_checks.rb +2 -2
  70. data/lib/graphql/execution/errors.rb +77 -45
  71. data/lib/graphql/execution/interpreter/argument_value.rb +28 -0
  72. data/lib/graphql/execution/interpreter/arguments.rb +88 -0
  73. data/lib/graphql/execution/interpreter/arguments_cache.rb +104 -0
  74. data/lib/graphql/execution/interpreter/handles_raw_value.rb +18 -0
  75. data/lib/graphql/execution/interpreter/resolve.rb +62 -24
  76. data/lib/graphql/execution/interpreter/runtime.rb +830 -417
  77. data/lib/graphql/execution/interpreter.rb +206 -74
  78. data/lib/graphql/execution/lazy/lazy_method_map.rb +4 -0
  79. data/lib/graphql/execution/lazy.rb +11 -21
  80. data/lib/graphql/execution/lookahead.rb +65 -136
  81. data/lib/graphql/execution/multiplex.rb +6 -152
  82. data/lib/graphql/execution.rb +11 -4
  83. data/lib/graphql/filter.rb +8 -3
  84. data/lib/graphql/integer_decoding_error.rb +17 -0
  85. data/lib/graphql/integer_encoding_error.rb +18 -2
  86. data/lib/graphql/introspection/base_object.rb +2 -5
  87. data/lib/graphql/introspection/directive_location_enum.rb +2 -2
  88. data/lib/graphql/introspection/directive_type.rb +12 -6
  89. data/lib/graphql/introspection/dynamic_fields.rb +3 -8
  90. data/lib/graphql/introspection/entry_points.rb +5 -18
  91. data/lib/graphql/introspection/enum_value_type.rb +2 -2
  92. data/lib/graphql/introspection/field_type.rb +9 -5
  93. data/lib/graphql/introspection/input_value_type.rb +41 -11
  94. data/lib/graphql/introspection/introspection_query.rb +6 -92
  95. data/lib/graphql/introspection/schema_type.rb +12 -12
  96. data/lib/graphql/introspection/type_type.rb +34 -17
  97. data/lib/graphql/introspection.rb +100 -0
  98. data/lib/graphql/invalid_null_error.rb +18 -0
  99. data/lib/graphql/language/block_string.rb +20 -5
  100. data/lib/graphql/language/cache.rb +37 -0
  101. data/lib/graphql/language/definition_slice.rb +21 -10
  102. data/lib/graphql/language/document_from_schema_definition.rb +136 -78
  103. data/lib/graphql/language/lexer.rb +216 -1462
  104. data/lib/graphql/language/nodes.rb +129 -132
  105. data/lib/graphql/language/parser.rb +994 -932
  106. data/lib/graphql/language/parser.y +152 -120
  107. data/lib/graphql/language/printer.rb +48 -23
  108. data/lib/graphql/language/sanitized_printer.rb +222 -0
  109. data/lib/graphql/language/token.rb +0 -4
  110. data/lib/graphql/language/visitor.rb +192 -84
  111. data/lib/graphql/language.rb +3 -1
  112. data/lib/graphql/name_validator.rb +2 -7
  113. data/lib/graphql/pagination/active_record_relation_connection.rb +77 -0
  114. data/lib/graphql/pagination/array_connection.rb +79 -0
  115. data/lib/graphql/pagination/connection.rb +253 -0
  116. data/lib/graphql/pagination/connections.rb +135 -0
  117. data/lib/graphql/pagination/mongoid_relation_connection.rb +25 -0
  118. data/lib/graphql/pagination/relation_connection.rb +228 -0
  119. data/lib/graphql/pagination/sequel_dataset_connection.rb +28 -0
  120. data/lib/graphql/pagination.rb +6 -0
  121. data/lib/graphql/parse_error.rb +0 -1
  122. data/lib/graphql/query/context.rb +205 -203
  123. data/lib/graphql/query/fingerprint.rb +26 -0
  124. data/lib/graphql/query/input_validation_result.rb +33 -7
  125. data/lib/graphql/query/null_context.rb +22 -9
  126. data/lib/graphql/query/validation_pipeline.rb +16 -38
  127. data/lib/graphql/query/variable_validation_error.rb +3 -3
  128. data/lib/graphql/query/variables.rb +39 -12
  129. data/lib/graphql/query.rb +95 -43
  130. data/lib/graphql/railtie.rb +6 -102
  131. data/lib/graphql/rake_task/validate.rb +4 -1
  132. data/lib/graphql/rake_task.rb +41 -10
  133. data/lib/graphql/relay/range_add.rb +17 -10
  134. data/lib/graphql/relay.rb +0 -15
  135. data/lib/graphql/rubocop/graphql/base_cop.rb +36 -0
  136. data/lib/graphql/rubocop/graphql/default_null_true.rb +43 -0
  137. data/lib/graphql/rubocop/graphql/default_required_true.rb +43 -0
  138. data/lib/graphql/rubocop.rb +4 -0
  139. data/lib/graphql/schema/addition.rb +245 -0
  140. data/lib/graphql/schema/argument.rb +285 -36
  141. data/lib/graphql/schema/base_64_encoder.rb +2 -0
  142. data/lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb +1 -1
  143. data/lib/graphql/schema/build_from_definition/resolve_map.rb +13 -5
  144. data/lib/graphql/schema/build_from_definition.rb +348 -205
  145. data/lib/graphql/schema/built_in_types.rb +5 -5
  146. data/lib/graphql/schema/directive/deprecated.rb +18 -0
  147. data/lib/graphql/schema/directive/feature.rb +1 -1
  148. data/lib/graphql/schema/directive/flagged.rb +57 -0
  149. data/lib/graphql/schema/directive/include.rb +2 -2
  150. data/lib/graphql/schema/directive/one_of.rb +12 -0
  151. data/lib/graphql/schema/directive/skip.rb +2 -2
  152. data/lib/graphql/schema/directive/transform.rb +14 -2
  153. data/lib/graphql/schema/directive.rb +134 -15
  154. data/lib/graphql/schema/enum.rb +137 -39
  155. data/lib/graphql/schema/enum_value.rb +17 -23
  156. data/lib/graphql/schema/field/connection_extension.rb +50 -20
  157. data/lib/graphql/schema/field/scope_extension.rb +1 -1
  158. data/lib/graphql/schema/field.rb +504 -331
  159. data/lib/graphql/schema/field_extension.rb +86 -2
  160. data/lib/graphql/schema/find_inherited_value.rb +12 -1
  161. data/lib/graphql/schema/finder.rb +16 -14
  162. data/lib/graphql/schema/input_object.rb +182 -60
  163. data/lib/graphql/schema/interface.rb +24 -49
  164. data/lib/graphql/schema/introspection_system.rb +103 -37
  165. data/lib/graphql/schema/late_bound_type.rb +9 -2
  166. data/lib/graphql/schema/list.rb +61 -3
  167. data/lib/graphql/schema/loader.rb +144 -96
  168. data/lib/graphql/schema/member/base_dsl_methods.rb +41 -37
  169. data/lib/graphql/schema/member/build_type.rb +24 -15
  170. data/lib/graphql/schema/member/has_arguments.rb +310 -26
  171. data/lib/graphql/schema/member/has_ast_node.rb +32 -0
  172. data/lib/graphql/schema/member/has_deprecation_reason.rb +24 -0
  173. data/lib/graphql/schema/member/has_directives.rb +118 -0
  174. data/lib/graphql/schema/member/has_fields.rb +166 -44
  175. data/lib/graphql/schema/member/has_interfaces.rb +129 -0
  176. data/lib/graphql/schema/member/has_unresolved_type_error.rb +15 -0
  177. data/lib/graphql/schema/member/has_validators.rb +57 -0
  178. data/lib/graphql/schema/member/relay_shortcuts.rb +47 -2
  179. data/lib/graphql/schema/member/type_system_helpers.rb +20 -3
  180. data/lib/graphql/schema/member/validates_input.rb +33 -0
  181. data/lib/graphql/schema/member.rb +11 -6
  182. data/lib/graphql/schema/mutation.rb +4 -9
  183. data/lib/graphql/schema/non_null.rb +34 -4
  184. data/lib/graphql/schema/object.rb +36 -60
  185. data/lib/graphql/schema/printer.rb +16 -35
  186. data/lib/graphql/schema/relay_classic_mutation.rb +91 -44
  187. data/lib/graphql/schema/resolver/has_payload_type.rb +51 -11
  188. data/lib/graphql/schema/resolver.rb +147 -94
  189. data/lib/graphql/schema/scalar.rb +40 -15
  190. data/lib/graphql/schema/subscription.rb +60 -31
  191. data/lib/graphql/schema/timeout.rb +45 -35
  192. data/lib/graphql/schema/type_expression.rb +21 -13
  193. data/lib/graphql/schema/type_membership.rb +23 -6
  194. data/lib/graphql/schema/union.rb +49 -15
  195. data/lib/graphql/schema/unique_within_type.rb +1 -2
  196. data/lib/graphql/schema/validator/allow_blank_validator.rb +29 -0
  197. data/lib/graphql/schema/validator/allow_null_validator.rb +26 -0
  198. data/lib/graphql/schema/validator/exclusion_validator.rb +33 -0
  199. data/lib/graphql/schema/validator/format_validator.rb +48 -0
  200. data/lib/graphql/schema/validator/inclusion_validator.rb +35 -0
  201. data/lib/graphql/schema/validator/length_validator.rb +59 -0
  202. data/lib/graphql/schema/validator/numericality_validator.rb +82 -0
  203. data/lib/graphql/schema/validator/required_validator.rb +82 -0
  204. data/lib/graphql/schema/validator.rb +171 -0
  205. data/lib/graphql/schema/warden.rb +213 -35
  206. data/lib/graphql/schema/wrapper.rb +0 -5
  207. data/lib/graphql/schema.rb +857 -884
  208. data/lib/graphql/static_validation/all_rules.rb +3 -0
  209. data/lib/graphql/static_validation/base_visitor.rb +21 -31
  210. data/lib/graphql/static_validation/definition_dependencies.rb +7 -2
  211. data/lib/graphql/static_validation/error.rb +3 -1
  212. data/lib/graphql/static_validation/literal_validator.rb +69 -26
  213. data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +45 -83
  214. data/lib/graphql/static_validation/rules/argument_literals_are_compatible_error.rb +22 -6
  215. data/lib/graphql/static_validation/rules/arguments_are_defined.rb +35 -26
  216. data/lib/graphql/static_validation/rules/arguments_are_defined_error.rb +4 -2
  217. data/lib/graphql/static_validation/rules/directives_are_defined.rb +12 -6
  218. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +14 -14
  219. data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +4 -4
  220. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +15 -7
  221. data/lib/graphql/static_validation/rules/fields_will_merge.rb +96 -53
  222. data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +25 -4
  223. data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +3 -3
  224. data/lib/graphql/static_validation/rules/fragments_are_finite.rb +2 -2
  225. data/lib/graphql/static_validation/rules/input_object_names_are_unique.rb +30 -0
  226. data/lib/graphql/static_validation/rules/input_object_names_are_unique_error.rb +30 -0
  227. data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid.rb +66 -0
  228. data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid_error.rb +29 -0
  229. data/lib/graphql/static_validation/rules/query_root_exists.rb +17 -0
  230. data/lib/graphql/static_validation/rules/query_root_exists_error.rb +26 -0
  231. data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +4 -2
  232. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +9 -10
  233. data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +13 -7
  234. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +12 -13
  235. data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +19 -14
  236. data/lib/graphql/static_validation/rules/variables_are_input_types.rb +1 -1
  237. data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +5 -3
  238. data/lib/graphql/static_validation/type_stack.rb +2 -2
  239. data/lib/graphql/static_validation/validation_context.rb +13 -3
  240. data/lib/graphql/static_validation/validation_timeout_error.rb +25 -0
  241. data/lib/graphql/static_validation/validator.rb +32 -20
  242. data/lib/graphql/static_validation.rb +1 -2
  243. data/lib/graphql/string_encoding_error.rb +13 -3
  244. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +129 -22
  245. data/lib/graphql/subscriptions/broadcast_analyzer.rb +81 -0
  246. data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +58 -0
  247. data/lib/graphql/subscriptions/event.rb +84 -35
  248. data/lib/graphql/subscriptions/instrumentation.rb +0 -47
  249. data/lib/graphql/subscriptions/serialize.rb +53 -6
  250. data/lib/graphql/subscriptions.rb +137 -57
  251. data/lib/graphql/tracing/active_support_notifications_trace.rb +16 -0
  252. data/lib/graphql/tracing/active_support_notifications_tracing.rb +8 -17
  253. data/lib/graphql/tracing/appoptics_trace.rb +231 -0
  254. data/lib/graphql/tracing/appoptics_tracing.rb +173 -0
  255. data/lib/graphql/tracing/appsignal_trace.rb +77 -0
  256. data/lib/graphql/tracing/appsignal_tracing.rb +23 -0
  257. data/lib/graphql/tracing/data_dog_trace.rb +148 -0
  258. data/lib/graphql/tracing/data_dog_tracing.rb +34 -2
  259. data/lib/graphql/tracing/legacy_trace.rb +65 -0
  260. data/lib/graphql/tracing/new_relic_trace.rb +75 -0
  261. data/lib/graphql/tracing/new_relic_tracing.rb +9 -12
  262. data/lib/graphql/tracing/notifications_trace.rb +42 -0
  263. data/lib/graphql/tracing/notifications_tracing.rb +59 -0
  264. data/lib/graphql/tracing/platform_trace.rb +109 -0
  265. data/lib/graphql/tracing/platform_tracing.rb +76 -35
  266. data/lib/graphql/tracing/prometheus_trace.rb +89 -0
  267. data/lib/graphql/tracing/prometheus_tracing/graphql_collector.rb +5 -2
  268. data/lib/graphql/tracing/prometheus_tracing.rb +11 -3
  269. data/lib/graphql/tracing/scout_trace.rb +72 -0
  270. data/lib/graphql/tracing/scout_tracing.rb +19 -0
  271. data/lib/graphql/tracing/statsd_trace.rb +56 -0
  272. data/lib/graphql/tracing/statsd_tracing.rb +42 -0
  273. data/lib/graphql/tracing/trace.rb +75 -0
  274. data/lib/graphql/tracing.rb +23 -67
  275. data/lib/graphql/type_kinds.rb +6 -3
  276. data/lib/graphql/types/big_int.rb +5 -1
  277. data/lib/graphql/types/int.rb +10 -3
  278. data/lib/graphql/types/iso_8601_date.rb +20 -9
  279. data/lib/graphql/types/iso_8601_date_time.rb +36 -10
  280. data/lib/graphql/types/relay/base_connection.rb +18 -90
  281. data/lib/graphql/types/relay/base_edge.rb +2 -34
  282. data/lib/graphql/types/relay/connection_behaviors.rb +176 -0
  283. data/lib/graphql/types/relay/edge_behaviors.rb +75 -0
  284. data/lib/graphql/types/relay/has_node_field.rb +41 -0
  285. data/lib/graphql/types/relay/has_nodes_field.rb +41 -0
  286. data/lib/graphql/types/relay/node.rb +2 -4
  287. data/lib/graphql/types/relay/node_behaviors.rb +25 -0
  288. data/lib/graphql/types/relay/page_info.rb +2 -14
  289. data/lib/graphql/types/relay/page_info_behaviors.rb +30 -0
  290. data/lib/graphql/types/relay.rb +10 -5
  291. data/lib/graphql/types/string.rb +8 -2
  292. data/lib/graphql/unauthorized_error.rb +2 -2
  293. data/lib/graphql/unresolved_type_error.rb +2 -2
  294. data/lib/graphql/version.rb +1 -1
  295. data/lib/graphql.rb +63 -65
  296. data/readme.md +3 -6
  297. metadata +127 -236
  298. data/lib/graphql/analysis/analyze_query.rb +0 -91
  299. data/lib/graphql/analysis/field_usage.rb +0 -45
  300. data/lib/graphql/analysis/max_query_complexity.rb +0 -26
  301. data/lib/graphql/analysis/max_query_depth.rb +0 -26
  302. data/lib/graphql/analysis/query_complexity.rb +0 -88
  303. data/lib/graphql/analysis/query_depth.rb +0 -43
  304. data/lib/graphql/analysis/reducer_state.rb +0 -48
  305. data/lib/graphql/argument.rb +0 -159
  306. data/lib/graphql/authorization.rb +0 -82
  307. data/lib/graphql/backwards_compatibility.rb +0 -60
  308. data/lib/graphql/base_type.rb +0 -226
  309. data/lib/graphql/boolean_type.rb +0 -2
  310. data/lib/graphql/compatibility/execution_specification/counter_schema.rb +0 -53
  311. data/lib/graphql/compatibility/execution_specification/specification_schema.rb +0 -200
  312. data/lib/graphql/compatibility/execution_specification.rb +0 -435
  313. data/lib/graphql/compatibility/lazy_execution_specification/lazy_schema.rb +0 -111
  314. data/lib/graphql/compatibility/lazy_execution_specification.rb +0 -213
  315. data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +0 -91
  316. data/lib/graphql/compatibility/query_parser_specification/query_assertions.rb +0 -79
  317. data/lib/graphql/compatibility/query_parser_specification.rb +0 -264
  318. data/lib/graphql/compatibility/schema_parser_specification.rb +0 -680
  319. data/lib/graphql/compatibility.rb +0 -5
  320. data/lib/graphql/define/assign_argument.rb +0 -12
  321. data/lib/graphql/define/assign_connection.rb +0 -13
  322. data/lib/graphql/define/assign_enum_value.rb +0 -18
  323. data/lib/graphql/define/assign_global_id_field.rb +0 -11
  324. data/lib/graphql/define/assign_mutation_function.rb +0 -34
  325. data/lib/graphql/define/assign_object_field.rb +0 -42
  326. data/lib/graphql/define/defined_object_proxy.rb +0 -50
  327. data/lib/graphql/define/instance_definable.rb +0 -300
  328. data/lib/graphql/define/no_definition_error.rb +0 -7
  329. data/lib/graphql/define/non_null_with_bang.rb +0 -16
  330. data/lib/graphql/define/type_definer.rb +0 -31
  331. data/lib/graphql/define.rb +0 -31
  332. data/lib/graphql/deprecated_dsl.rb +0 -42
  333. data/lib/graphql/directive/deprecated_directive.rb +0 -13
  334. data/lib/graphql/directive/include_directive.rb +0 -2
  335. data/lib/graphql/directive/skip_directive.rb +0 -2
  336. data/lib/graphql/directive.rb +0 -104
  337. data/lib/graphql/enum_type.rb +0 -193
  338. data/lib/graphql/execution/execute.rb +0 -326
  339. data/lib/graphql/execution/flatten.rb +0 -40
  340. data/lib/graphql/execution/instrumentation.rb +0 -92
  341. data/lib/graphql/execution/interpreter/hash_response.rb +0 -46
  342. data/lib/graphql/execution/lazy/resolve.rb +0 -91
  343. data/lib/graphql/execution/typecast.rb +0 -50
  344. data/lib/graphql/field/resolve.rb +0 -59
  345. data/lib/graphql/field.rb +0 -330
  346. data/lib/graphql/float_type.rb +0 -2
  347. data/lib/graphql/function.rb +0 -153
  348. data/lib/graphql/id_type.rb +0 -2
  349. data/lib/graphql/input_object_type.rb +0 -154
  350. data/lib/graphql/int_type.rb +0 -2
  351. data/lib/graphql/interface_type.rb +0 -86
  352. data/lib/graphql/internal_representation/document.rb +0 -27
  353. data/lib/graphql/internal_representation/node.rb +0 -206
  354. data/lib/graphql/internal_representation/print.rb +0 -51
  355. data/lib/graphql/internal_representation/rewrite.rb +0 -184
  356. data/lib/graphql/internal_representation/scope.rb +0 -88
  357. data/lib/graphql/internal_representation/visit.rb +0 -36
  358. data/lib/graphql/internal_representation.rb +0 -7
  359. data/lib/graphql/language/lexer.rl +0 -258
  360. data/lib/graphql/list_type.rb +0 -80
  361. data/lib/graphql/literal_validation_error.rb +0 -6
  362. data/lib/graphql/non_null_type.rb +0 -81
  363. data/lib/graphql/object_type.rb +0 -141
  364. data/lib/graphql/query/arguments.rb +0 -187
  365. data/lib/graphql/query/arguments_cache.rb +0 -25
  366. data/lib/graphql/query/executor.rb +0 -53
  367. data/lib/graphql/query/literal_input.rb +0 -116
  368. data/lib/graphql/query/serial_execution/field_resolution.rb +0 -92
  369. data/lib/graphql/query/serial_execution/operation_resolution.rb +0 -19
  370. data/lib/graphql/query/serial_execution/selection_resolution.rb +0 -23
  371. data/lib/graphql/query/serial_execution/value_resolution.rb +0 -87
  372. data/lib/graphql/query/serial_execution.rb +0 -39
  373. data/lib/graphql/relay/array_connection.rb +0 -85
  374. data/lib/graphql/relay/base_connection.rb +0 -172
  375. data/lib/graphql/relay/connection_instrumentation.rb +0 -54
  376. data/lib/graphql/relay/connection_resolve.rb +0 -43
  377. data/lib/graphql/relay/connection_type.rb +0 -40
  378. data/lib/graphql/relay/edge.rb +0 -27
  379. data/lib/graphql/relay/edge_type.rb +0 -18
  380. data/lib/graphql/relay/edges_instrumentation.rb +0 -40
  381. data/lib/graphql/relay/global_id_resolve.rb +0 -18
  382. data/lib/graphql/relay/mongo_relation_connection.rb +0 -50
  383. data/lib/graphql/relay/mutation/instrumentation.rb +0 -23
  384. data/lib/graphql/relay/mutation/resolve.rb +0 -56
  385. data/lib/graphql/relay/mutation/result.rb +0 -38
  386. data/lib/graphql/relay/mutation.rb +0 -190
  387. data/lib/graphql/relay/node.rb +0 -36
  388. data/lib/graphql/relay/page_info.rb +0 -7
  389. data/lib/graphql/relay/relation_connection.rb +0 -190
  390. data/lib/graphql/relay/type_extensions.rb +0 -30
  391. data/lib/graphql/scalar_type.rb +0 -133
  392. data/lib/graphql/schema/catchall_middleware.rb +0 -35
  393. data/lib/graphql/schema/default_parse_error.rb +0 -10
  394. data/lib/graphql/schema/default_type_error.rb +0 -15
  395. data/lib/graphql/schema/member/accepts_definition.rb +0 -152
  396. data/lib/graphql/schema/member/cached_graphql_definition.rb +0 -26
  397. data/lib/graphql/schema/member/instrumentation.rb +0 -132
  398. data/lib/graphql/schema/middleware_chain.rb +0 -82
  399. data/lib/graphql/schema/possible_types.rb +0 -39
  400. data/lib/graphql/schema/rescue_middleware.rb +0 -60
  401. data/lib/graphql/schema/timeout_middleware.rb +0 -86
  402. data/lib/graphql/schema/traversal.rb +0 -228
  403. data/lib/graphql/schema/validation.rb +0 -303
  404. data/lib/graphql/static_validation/default_visitor.rb +0 -15
  405. data/lib/graphql/static_validation/no_validate_visitor.rb +0 -10
  406. data/lib/graphql/string_type.rb +0 -2
  407. data/lib/graphql/subscriptions/subscription_root.rb +0 -66
  408. data/lib/graphql/tracing/skylight_tracing.rb +0 -62
  409. data/lib/graphql/types/relay/base_field.rb +0 -22
  410. data/lib/graphql/types/relay/base_interface.rb +0 -29
  411. data/lib/graphql/types/relay/base_object.rb +0 -26
  412. data/lib/graphql/types/relay/node_field.rb +0 -43
  413. data/lib/graphql/types/relay/nodes_field.rb +0 -45
  414. data/lib/graphql/union_type.rb +0 -128
  415. data/lib/graphql/upgrader/member.rb +0 -936
  416. data/lib/graphql/upgrader/schema.rb +0 -37
@@ -18,13 +18,11 @@ module GraphQL
18
18
  # @param new_name [String]
19
19
  # @return [String]
20
20
  def graphql_name(new_name = nil)
21
- case
22
- when new_name
21
+ if new_name
22
+ GraphQL::NameValidator.validate!(new_name)
23
23
  @graphql_name = new_name
24
- when overridden = overridden_graphql_name
25
- overridden
26
24
  else
27
- default_graphql_name
25
+ @graphql_name ||= default_graphql_name
28
26
  end
29
27
  end
30
28
 
@@ -45,8 +43,27 @@ module GraphQL
45
43
  def description(new_description = nil)
46
44
  if new_description
47
45
  @description = new_description
46
+ elsif defined?(@description)
47
+ @description
48
48
  else
49
- @description || find_inherited_value(:description)
49
+ @description = nil
50
+ end
51
+ end
52
+
53
+ # This pushes some configurations _down_ the inheritance tree,
54
+ # in order to prevent repetitive lookups at runtime.
55
+ module ConfigurationExtension
56
+ def inherited(child_class)
57
+ child_class.introspection(introspection)
58
+ child_class.description(description)
59
+ child_class.default_graphql_name = nil
60
+
61
+ if defined?(@graphql_name) && @graphql_name && (self.name.nil? || graphql_name != default_graphql_name)
62
+ child_class.graphql_name(graphql_name)
63
+ else
64
+ child_class.graphql_name = nil
65
+ end
66
+ super
50
67
  end
51
68
  end
52
69
 
@@ -54,13 +71,15 @@ module GraphQL
54
71
  def introspection(new_introspection = nil)
55
72
  if !new_introspection.nil?
56
73
  @introspection = new_introspection
74
+ elsif defined?(@introspection)
75
+ @introspection
57
76
  else
58
- @introspection || find_inherited_value(:introspection, false)
77
+ false
59
78
  end
60
79
  end
61
80
 
62
81
  def introspection?
63
- introspection
82
+ !!@introspection
64
83
  end
65
84
 
66
85
  # The mutation this type was derived from, if it was derived from a mutation
@@ -68,55 +87,40 @@ module GraphQL
68
87
  def mutation(mutation_class = nil)
69
88
  if mutation_class
70
89
  @mutation = mutation_class
90
+ elsif defined?(@mutation)
91
+ @mutation
92
+ else
93
+ nil
71
94
  end
72
- @mutation
73
- end
74
-
75
- # @return [GraphQL::BaseType] Convert this type to a legacy-style object.
76
- def to_graphql
77
- raise GraphQL::RequiredImplementationMissingError
78
95
  end
79
96
 
80
97
  alias :unwrap :itself
81
98
 
82
- def overridden_graphql_name
83
- @graphql_name || find_inherited_value(:overridden_graphql_name)
84
- end
85
-
86
99
  # Creates the default name for a schema member.
87
100
  # The default name is the Ruby constant name,
88
101
  # without any namespaces and with any `-Type` suffix removed
89
102
  def default_graphql_name
90
103
  @default_graphql_name ||= begin
91
104
  raise GraphQL::RequiredImplementationMissingError, 'Anonymous class should declare a `graphql_name`' if name.nil?
92
-
93
- name.split("::").last.sub(/Type\Z/, "")
105
+ -name.split("::").last.sub(/Type\Z/, "")
94
106
  end
95
107
  end
96
108
 
97
109
  def visible?(context)
98
- if @mutation
99
- @mutation.visible?(context)
100
- else
101
- true
102
- end
110
+ true
103
111
  end
104
112
 
105
- def accessible?(context)
106
- if @mutation
107
- @mutation.accessible?(context)
108
- else
109
- true
110
- end
113
+ def authorized?(object, context)
114
+ true
111
115
  end
112
116
 
113
- def authorized?(object, context)
114
- if @mutation
115
- @mutation.authorized?(object, context)
116
- else
117
- true
118
- end
117
+ def default_relay
118
+ false
119
119
  end
120
+
121
+ protected
122
+
123
+ attr_writer :default_graphql_name, :graphql_name
120
124
  end
121
125
  end
122
126
  end
@@ -35,18 +35,16 @@ module GraphQL
35
35
  else
36
36
  maybe_type = constantize(type_expr)
37
37
  case maybe_type
38
- when GraphQL::BaseType
39
- maybe_type
40
38
  when Module
41
39
  # This is a way to check that it's the right kind of module:
42
- if maybe_type.respond_to?(:graphql_definition)
40
+ if maybe_type.respond_to?(:kind)
43
41
  maybe_type
44
42
  else
45
43
  raise ArgumentError, "Unexpected class/module found for GraphQL type: #{type_expr} (must be type definition class/module)"
46
44
  end
47
45
  end
48
46
  end
49
- when GraphQL::BaseType, GraphQL::Schema::LateBoundType
47
+ when GraphQL::Schema::LateBoundType
50
48
  type_expr
51
49
  when Array
52
50
  case type_expr.length
@@ -56,28 +54,32 @@ module GraphQL
56
54
  parse_type(type_expr.first, null: false)
57
55
  when 2
58
56
  inner_type, nullable_option = type_expr
59
- if nullable_option.keys != [:null] || nullable_option.values != [true]
57
+ if nullable_option.keys != [:null] || (nullable_option[:null] != true && nullable_option[:null] != false)
60
58
  raise ArgumentError, LIST_TYPE_ERROR
61
59
  end
62
60
  list_type = true
63
- parse_type(inner_type, null: true)
61
+ parse_type(inner_type, null: nullable_option[:null])
64
62
  else
65
63
  raise ArgumentError, LIST_TYPE_ERROR
66
64
  end
65
+ when GraphQL::Schema::NonNull, GraphQL::Schema::List
66
+ type_expr
67
67
  when Module
68
68
  # This is a way to check that it's the right kind of module:
69
- if type_expr.respond_to?(:graphql_definition)
69
+ if type_expr.respond_to?(:kind)
70
70
  type_expr
71
71
  else
72
- # Eg `String` => GraphQL::STRING_TYPE
72
+ # Eg `String` => GraphQL::Types::String
73
73
  parse_type(type_expr.name, null: true)
74
74
  end
75
+ when Proc
76
+ parse_type(type_expr.call, null: true)
75
77
  when false
76
78
  raise ArgumentError, "Received `false` instead of a type, maybe a `!` should be replaced with `null: true` (for fields) or `required: true` (for arguments)"
77
79
  end
78
80
 
79
81
  if return_type.nil?
80
- raise "Unexpected type input: #{type_expr} (#{type_expr.class})"
82
+ raise "Unexpected type input: #{type_expr.inspect} (#{type_expr.class})"
81
83
  end
82
84
 
83
85
  # Apply list_type first, that way the
@@ -96,7 +98,7 @@ module GraphQL
96
98
 
97
99
  def to_type_name(something)
98
100
  case something
99
- when GraphQL::BaseType, GraphQL::Schema::LateBoundType
101
+ when GraphQL::Schema::LateBoundType
100
102
  something.unwrap.name
101
103
  when Array
102
104
  to_type_name(something.first)
@@ -116,8 +118,9 @@ module GraphQL
116
118
  end
117
119
 
118
120
  def camelize(string)
121
+ return string if string == '_'
119
122
  return string unless string.include?("_")
120
- camelized = string.split('_').map(&:capitalize).join
123
+ camelized = string.split('_').each(&:capitalize!).join
121
124
  camelized[0] = camelized[0].downcase
122
125
  if (match_data = string.match(/\A(_+)/))
123
126
  camelized = "#{match_data[0]}#{camelized}"
@@ -158,10 +161,16 @@ module GraphQL
158
161
  end
159
162
 
160
163
  def underscore(string)
161
- string
162
- .gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2') # URLDecoder -> URL_Decoder
163
- .gsub(/([a-z\d])([A-Z])/,'\1_\2') # someThing -> some_Thing
164
- .downcase
164
+ if string.match?(/\A[a-z_]+\Z/)
165
+ return string
166
+ end
167
+ string2 = string.dup
168
+
169
+ string2.gsub!(/([A-Z]+)([A-Z][a-z])/,'\1_\2') # URLDecoder -> URL_Decoder
170
+ string2.gsub!(/([a-z\d])([A-Z])/,'\1_\2') # someThing -> some_Thing
171
+ string2.downcase!
172
+
173
+ string2
165
174
  end
166
175
  end
167
176
  end
@@ -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.schema.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.metadata[: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
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ class Schema
4
+ class Member
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
+
16
+ # If this schema was parsed from a `.graphql` file (or other SDL),
17
+ # this is the AST node that defined this part of the schema.
18
+ def ast_node(new_ast_node = nil)
19
+ if new_ast_node
20
+ @ast_node = new_ast_node
21
+ elsif defined?(@ast_node)
22
+ @ast_node
23
+ else
24
+ nil
25
+ end
26
+ end
27
+
28
+ attr_writer :ast_node
29
+ end
30
+ end
31
+ end
32
+ end