graphql 0.16.0 → 2.0.15

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 (490) hide show
  1. checksums.yaml +5 -5
  2. data/.yardopts +5 -0
  3. data/lib/generators/graphql/core.rb +69 -0
  4. data/lib/generators/graphql/enum_generator.rb +27 -0
  5. data/lib/generators/graphql/field_extractor.rb +31 -0
  6. data/lib/generators/graphql/input_generator.rb +50 -0
  7. data/lib/generators/graphql/install/mutation_root_generator.rb +34 -0
  8. data/lib/generators/graphql/install/templates/base_mutation.erb +10 -0
  9. data/lib/generators/graphql/install/templates/mutation_type.erb +12 -0
  10. data/lib/generators/graphql/install_generator.rb +197 -0
  11. data/lib/generators/graphql/interface_generator.rb +27 -0
  12. data/lib/generators/graphql/loader_generator.rb +21 -0
  13. data/lib/generators/graphql/mutation_create_generator.rb +22 -0
  14. data/lib/generators/graphql/mutation_delete_generator.rb +22 -0
  15. data/lib/generators/graphql/mutation_generator.rb +30 -0
  16. data/lib/generators/graphql/mutation_update_generator.rb +22 -0
  17. data/lib/generators/graphql/object_generator.rb +50 -0
  18. data/lib/generators/graphql/orm_mutations_base.rb +40 -0
  19. data/lib/generators/graphql/relay.rb +49 -0
  20. data/lib/generators/graphql/relay_generator.rb +21 -0
  21. data/lib/generators/graphql/scalar_generator.rb +22 -0
  22. data/lib/generators/graphql/templates/base_argument.erb +6 -0
  23. data/lib/generators/graphql/templates/base_connection.erb +8 -0
  24. data/lib/generators/graphql/templates/base_edge.erb +8 -0
  25. data/lib/generators/graphql/templates/base_enum.erb +6 -0
  26. data/lib/generators/graphql/templates/base_field.erb +7 -0
  27. data/lib/generators/graphql/templates/base_input_object.erb +7 -0
  28. data/lib/generators/graphql/templates/base_interface.erb +9 -0
  29. data/lib/generators/graphql/templates/base_object.erb +7 -0
  30. data/lib/generators/graphql/templates/base_scalar.erb +6 -0
  31. data/lib/generators/graphql/templates/base_union.erb +6 -0
  32. data/lib/generators/graphql/templates/enum.erb +11 -0
  33. data/lib/generators/graphql/templates/graphql_controller.erb +52 -0
  34. data/lib/generators/graphql/templates/input.erb +9 -0
  35. data/lib/generators/graphql/templates/interface.erb +10 -0
  36. data/lib/generators/graphql/templates/loader.erb +19 -0
  37. data/lib/generators/graphql/templates/mutation.erb +16 -0
  38. data/lib/generators/graphql/templates/mutation_create.erb +20 -0
  39. data/lib/generators/graphql/templates/mutation_delete.erb +20 -0
  40. data/lib/generators/graphql/templates/mutation_update.erb +21 -0
  41. data/lib/generators/graphql/templates/node_type.erb +9 -0
  42. data/lib/generators/graphql/templates/object.erb +10 -0
  43. data/lib/generators/graphql/templates/query_type.erb +15 -0
  44. data/lib/generators/graphql/templates/scalar.erb +17 -0
  45. data/lib/generators/graphql/templates/schema.erb +30 -0
  46. data/lib/generators/graphql/templates/union.erb +9 -0
  47. data/lib/generators/graphql/type_generator.rb +135 -0
  48. data/lib/generators/graphql/union_generator.rb +33 -0
  49. data/lib/graphql/analysis/ast/analyzer.rb +84 -0
  50. data/lib/graphql/analysis/ast/field_usage.rb +57 -0
  51. data/lib/graphql/analysis/ast/max_query_complexity.rb +22 -0
  52. data/lib/graphql/analysis/ast/max_query_depth.rb +22 -0
  53. data/lib/graphql/analysis/ast/query_complexity.rb +230 -0
  54. data/lib/graphql/analysis/ast/query_depth.rb +55 -0
  55. data/lib/graphql/analysis/ast/visitor.rb +269 -0
  56. data/lib/graphql/analysis/ast.rb +81 -0
  57. data/lib/graphql/analysis.rb +2 -5
  58. data/lib/graphql/analysis_error.rb +1 -0
  59. data/lib/graphql/backtrace/inspect_result.rb +50 -0
  60. data/lib/graphql/backtrace/table.rb +141 -0
  61. data/lib/graphql/backtrace/traced_error.rb +54 -0
  62. data/lib/graphql/backtrace/tracer.rb +80 -0
  63. data/lib/graphql/backtrace.rb +58 -0
  64. data/lib/graphql/coercion_error.rb +13 -0
  65. data/lib/graphql/dataloader/null_dataloader.rb +24 -0
  66. data/lib/graphql/dataloader/request.rb +19 -0
  67. data/lib/graphql/dataloader/request_all.rb +19 -0
  68. data/lib/graphql/dataloader/source.rb +164 -0
  69. data/lib/graphql/dataloader.rb +311 -0
  70. data/lib/graphql/date_encoding_error.rb +16 -0
  71. data/lib/graphql/deprecation.rb +9 -0
  72. data/lib/graphql/dig.rb +19 -0
  73. data/lib/graphql/execution/directive_checks.rb +37 -0
  74. data/lib/graphql/execution/errors.rb +93 -0
  75. data/lib/graphql/execution/interpreter/argument_value.rb +28 -0
  76. data/lib/graphql/execution/interpreter/arguments.rb +88 -0
  77. data/lib/graphql/execution/interpreter/arguments_cache.rb +105 -0
  78. data/lib/graphql/execution/interpreter/execution_errors.rb +29 -0
  79. data/lib/graphql/execution/interpreter/handles_raw_value.rb +18 -0
  80. data/lib/graphql/execution/interpreter/resolve.rb +77 -0
  81. data/lib/graphql/execution/interpreter/runtime.rb +994 -0
  82. data/lib/graphql/execution/interpreter.rb +226 -0
  83. data/lib/graphql/execution/lazy/lazy_method_map.rb +98 -0
  84. data/lib/graphql/execution/lazy.rb +75 -0
  85. data/lib/graphql/execution/lookahead.rb +311 -0
  86. data/lib/graphql/execution/multiplex.rb +45 -0
  87. data/lib/graphql/execution.rb +18 -0
  88. data/lib/graphql/execution_error.rb +34 -1
  89. data/lib/graphql/filter.rb +53 -0
  90. data/lib/graphql/integer_decoding_error.rb +17 -0
  91. data/lib/graphql/integer_encoding_error.rb +36 -0
  92. data/lib/graphql/introspection/base_object.rb +13 -0
  93. data/lib/graphql/introspection/directive_location_enum.rb +12 -5
  94. data/lib/graphql/introspection/directive_type.rb +30 -10
  95. data/lib/graphql/introspection/dynamic_fields.rb +12 -0
  96. data/lib/graphql/introspection/entry_points.rb +22 -0
  97. data/lib/graphql/introspection/enum_value_type.rb +21 -8
  98. data/lib/graphql/introspection/field_type.rb +26 -10
  99. data/lib/graphql/introspection/input_value_type.rb +64 -14
  100. data/lib/graphql/introspection/introspection_query.rb +7 -76
  101. data/lib/graphql/introspection/schema_type.rb +42 -17
  102. data/lib/graphql/introspection/type_kind_enum.rb +11 -5
  103. data/lib/graphql/introspection/type_type.rb +104 -16
  104. data/lib/graphql/introspection.rb +104 -13
  105. data/lib/graphql/invalid_name_error.rb +11 -0
  106. data/lib/graphql/invalid_null_error.rb +36 -8
  107. data/lib/graphql/language/block_string.rb +99 -0
  108. data/lib/graphql/language/cache.rb +37 -0
  109. data/lib/graphql/language/definition_slice.rb +41 -0
  110. data/lib/graphql/language/document_from_schema_definition.rb +335 -0
  111. data/lib/graphql/language/generation.rb +16 -86
  112. data/lib/graphql/language/lexer.rb +1436 -705
  113. data/lib/graphql/language/lexer.rl +172 -64
  114. data/lib/graphql/language/nodes.rb +617 -105
  115. data/lib/graphql/language/parser.rb +1524 -430
  116. data/lib/graphql/language/parser.y +348 -73
  117. data/lib/graphql/language/printer.rb +386 -0
  118. data/lib/graphql/language/sanitized_printer.rb +222 -0
  119. data/lib/graphql/language/token.rb +16 -3
  120. data/lib/graphql/language/visitor.rb +169 -25
  121. data/lib/graphql/language.rb +30 -0
  122. data/lib/graphql/load_application_object_failed_error.rb +22 -0
  123. data/lib/graphql/name_validator.rb +11 -0
  124. data/lib/graphql/pagination/active_record_relation_connection.rb +85 -0
  125. data/lib/graphql/pagination/array_connection.rb +79 -0
  126. data/lib/graphql/pagination/connection.rb +253 -0
  127. data/lib/graphql/pagination/connections.rb +135 -0
  128. data/lib/graphql/pagination/mongoid_relation_connection.rb +25 -0
  129. data/lib/graphql/pagination/relation_connection.rb +228 -0
  130. data/lib/graphql/pagination/sequel_dataset_connection.rb +28 -0
  131. data/lib/graphql/pagination.rb +6 -0
  132. data/lib/graphql/parse_error.rb +24 -0
  133. data/lib/graphql/query/context.rb +266 -12
  134. data/lib/graphql/query/fingerprint.rb +26 -0
  135. data/lib/graphql/query/input_validation_result.rb +34 -7
  136. data/lib/graphql/query/null_context.rb +52 -0
  137. data/lib/graphql/query/result.rb +63 -0
  138. data/lib/graphql/query/validation_pipeline.rb +114 -0
  139. data/lib/graphql/query/variable_validation_error.rb +27 -3
  140. data/lib/graphql/query/variables.rb +75 -24
  141. data/lib/graphql/query.rb +359 -92
  142. data/lib/graphql/railtie.rb +13 -0
  143. data/lib/graphql/rake_task/validate.rb +63 -0
  144. data/lib/graphql/rake_task.rb +146 -0
  145. data/lib/graphql/relay/range_add.rb +52 -0
  146. data/lib/graphql/relay.rb +3 -0
  147. data/lib/graphql/rubocop/graphql/base_cop.rb +36 -0
  148. data/lib/graphql/rubocop/graphql/default_null_true.rb +43 -0
  149. data/lib/graphql/rubocop/graphql/default_required_true.rb +43 -0
  150. data/lib/graphql/rubocop.rb +4 -0
  151. data/lib/graphql/runtime_type_error.rb +5 -0
  152. data/lib/graphql/schema/addition.rb +245 -0
  153. data/lib/graphql/schema/argument.rb +395 -0
  154. data/lib/graphql/schema/base_64_bp.rb +26 -0
  155. data/lib/graphql/schema/base_64_encoder.rb +21 -0
  156. data/lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb +47 -0
  157. data/lib/graphql/schema/build_from_definition/resolve_map.rb +78 -0
  158. data/lib/graphql/schema/build_from_definition.rb +492 -0
  159. data/lib/graphql/schema/built_in_types.rb +12 -0
  160. data/lib/graphql/schema/directive/deprecated.rb +18 -0
  161. data/lib/graphql/schema/directive/feature.rb +66 -0
  162. data/lib/graphql/schema/directive/flagged.rb +57 -0
  163. data/lib/graphql/schema/directive/include.rb +25 -0
  164. data/lib/graphql/schema/directive/one_of.rb +12 -0
  165. data/lib/graphql/schema/directive/skip.rb +25 -0
  166. data/lib/graphql/schema/directive/transform.rb +60 -0
  167. data/lib/graphql/schema/directive.rb +212 -0
  168. data/lib/graphql/schema/enum.rb +176 -0
  169. data/lib/graphql/schema/enum_value.rb +77 -0
  170. data/lib/graphql/schema/field/connection_extension.rb +80 -0
  171. data/lib/graphql/schema/field/scope_extension.rb +22 -0
  172. data/lib/graphql/schema/field.rb +862 -0
  173. data/lib/graphql/schema/field_extension.rb +156 -0
  174. data/lib/graphql/schema/find_inherited_value.rb +36 -0
  175. data/lib/graphql/schema/finder.rb +155 -0
  176. data/lib/graphql/schema/input_object.rb +258 -0
  177. data/lib/graphql/schema/interface.rb +113 -0
  178. data/lib/graphql/schema/introspection_system.rb +164 -0
  179. data/lib/graphql/schema/invalid_type_error.rb +1 -0
  180. data/lib/graphql/schema/late_bound_type.rb +37 -0
  181. data/lib/graphql/schema/list.rb +86 -0
  182. data/lib/graphql/schema/loader.rb +228 -0
  183. data/lib/graphql/schema/member/base_dsl_methods.rb +124 -0
  184. data/lib/graphql/schema/member/build_type.rb +178 -0
  185. data/lib/graphql/schema/member/graphql_type_names.rb +21 -0
  186. data/lib/graphql/schema/member/has_arguments.rb +376 -0
  187. data/lib/graphql/schema/member/has_ast_node.rb +20 -0
  188. data/lib/graphql/schema/member/has_deprecation_reason.rb +25 -0
  189. data/lib/graphql/schema/member/has_directives.rb +113 -0
  190. data/lib/graphql/schema/member/has_fields.rb +163 -0
  191. data/lib/graphql/schema/member/has_interfaces.rb +88 -0
  192. data/lib/graphql/schema/member/has_path.rb +25 -0
  193. data/lib/graphql/schema/member/has_unresolved_type_error.rb +15 -0
  194. data/lib/graphql/schema/member/has_validators.rb +31 -0
  195. data/lib/graphql/schema/member/relay_shortcuts.rb +73 -0
  196. data/lib/graphql/schema/member/scoped.rb +21 -0
  197. data/lib/graphql/schema/member/type_system_helpers.rb +38 -0
  198. data/lib/graphql/schema/member/validates_input.rb +33 -0
  199. data/lib/graphql/schema/member.rb +39 -0
  200. data/lib/graphql/schema/mutation.rb +85 -0
  201. data/lib/graphql/schema/non_null.rb +67 -0
  202. data/lib/graphql/schema/null_mask.rb +11 -0
  203. data/lib/graphql/schema/object.rb +117 -0
  204. data/lib/graphql/schema/printer.rb +72 -128
  205. data/lib/graphql/schema/relay_classic_mutation.rb +179 -0
  206. data/lib/graphql/schema/resolver/has_payload_type.rb +106 -0
  207. data/lib/graphql/schema/resolver.rb +402 -0
  208. data/lib/graphql/schema/scalar.rb +68 -0
  209. data/lib/graphql/schema/subscription.rb +148 -0
  210. data/lib/graphql/schema/timeout.rb +123 -0
  211. data/lib/graphql/schema/type_expression.rb +29 -5
  212. data/lib/graphql/schema/type_membership.rb +51 -0
  213. data/lib/graphql/schema/union.rb +81 -0
  214. data/lib/graphql/schema/unique_within_type.rb +34 -0
  215. data/lib/graphql/schema/validator/allow_blank_validator.rb +29 -0
  216. data/lib/graphql/schema/validator/allow_null_validator.rb +26 -0
  217. data/lib/graphql/schema/validator/exclusion_validator.rb +33 -0
  218. data/lib/graphql/schema/validator/format_validator.rb +48 -0
  219. data/lib/graphql/schema/validator/inclusion_validator.rb +35 -0
  220. data/lib/graphql/schema/validator/length_validator.rb +59 -0
  221. data/lib/graphql/schema/validator/numericality_validator.rb +82 -0
  222. data/lib/graphql/schema/validator/required_validator.rb +82 -0
  223. data/lib/graphql/schema/validator.rb +171 -0
  224. data/lib/graphql/schema/warden.rb +413 -0
  225. data/lib/graphql/schema/wrapper.rb +24 -0
  226. data/lib/graphql/schema.rb +1179 -104
  227. data/lib/graphql/static_validation/all_rules.rb +14 -0
  228. data/lib/graphql/static_validation/base_visitor.rb +200 -0
  229. data/lib/graphql/static_validation/definition_dependencies.rb +198 -0
  230. data/lib/graphql/static_validation/error.rb +46 -0
  231. data/lib/graphql/static_validation/interpreter_visitor.rb +14 -0
  232. data/lib/graphql/static_validation/literal_validator.rb +113 -22
  233. data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +59 -11
  234. data/lib/graphql/static_validation/rules/argument_literals_are_compatible_error.rb +48 -0
  235. data/lib/graphql/static_validation/rules/argument_names_are_unique.rb +31 -0
  236. data/lib/graphql/static_validation/rules/argument_names_are_unique_error.rb +30 -0
  237. data/lib/graphql/static_validation/rules/arguments_are_defined.rb +62 -8
  238. data/lib/graphql/static_validation/rules/arguments_are_defined_error.rb +37 -0
  239. data/lib/graphql/static_validation/rules/directives_are_defined.rb +20 -13
  240. data/lib/graphql/static_validation/rules/directives_are_defined_error.rb +29 -0
  241. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +32 -26
  242. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations_error.rb +31 -0
  243. data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +21 -23
  244. data/lib/graphql/static_validation/rules/fields_are_defined_on_type_error.rb +32 -0
  245. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +55 -18
  246. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections_error.rb +31 -0
  247. data/lib/graphql/static_validation/rules/fields_will_merge.rb +390 -70
  248. data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +53 -0
  249. data/lib/graphql/static_validation/rules/fragment_names_are_unique.rb +30 -0
  250. data/lib/graphql/static_validation/rules/fragment_names_are_unique_error.rb +29 -0
  251. data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +54 -37
  252. data/lib/graphql/static_validation/rules/fragment_spreads_are_possible_error.rb +35 -0
  253. data/lib/graphql/static_validation/rules/fragment_types_exist.rb +26 -16
  254. data/lib/graphql/static_validation/rules/fragment_types_exist_error.rb +29 -0
  255. data/lib/graphql/static_validation/rules/fragments_are_finite.rb +13 -19
  256. data/lib/graphql/static_validation/rules/fragments_are_finite_error.rb +29 -0
  257. data/lib/graphql/static_validation/rules/fragments_are_named.rb +16 -0
  258. data/lib/graphql/static_validation/rules/fragments_are_named_error.rb +26 -0
  259. data/lib/graphql/static_validation/rules/fragments_are_on_composite_types.rb +25 -20
  260. data/lib/graphql/static_validation/rules/fragments_are_on_composite_types_error.rb +30 -0
  261. data/lib/graphql/static_validation/rules/fragments_are_used.rb +22 -33
  262. data/lib/graphql/static_validation/rules/fragments_are_used_error.rb +29 -0
  263. data/lib/graphql/static_validation/rules/input_object_names_are_unique.rb +30 -0
  264. data/lib/graphql/static_validation/rules/input_object_names_are_unique_error.rb +30 -0
  265. data/lib/graphql/static_validation/rules/mutation_root_exists.rb +17 -0
  266. data/lib/graphql/static_validation/rules/mutation_root_exists_error.rb +26 -0
  267. data/lib/graphql/static_validation/rules/no_definitions_are_present.rb +41 -0
  268. data/lib/graphql/static_validation/rules/no_definitions_are_present_error.rb +25 -0
  269. data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid.rb +66 -0
  270. data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid_error.rb +29 -0
  271. data/lib/graphql/static_validation/rules/operation_names_are_valid.rb +36 -0
  272. data/lib/graphql/static_validation/rules/operation_names_are_valid_error.rb +28 -0
  273. data/lib/graphql/static_validation/rules/query_root_exists.rb +17 -0
  274. data/lib/graphql/static_validation/rules/query_root_exists_error.rb +26 -0
  275. data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +22 -21
  276. data/lib/graphql/static_validation/rules/required_arguments_are_present_error.rb +35 -0
  277. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +59 -0
  278. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present_error.rb +35 -0
  279. data/lib/graphql/static_validation/rules/subscription_root_exists.rb +17 -0
  280. data/lib/graphql/static_validation/rules/subscription_root_exists_error.rb +26 -0
  281. data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +56 -0
  282. data/lib/graphql/static_validation/rules/unique_directives_per_location_error.rb +29 -0
  283. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +36 -18
  284. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed_error.rb +39 -0
  285. data/lib/graphql/static_validation/rules/variable_names_are_unique.rb +24 -0
  286. data/lib/graphql/static_validation/rules/variable_names_are_unique_error.rb +29 -0
  287. data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +103 -39
  288. data/lib/graphql/static_validation/rules/variable_usages_are_allowed_error.rb +38 -0
  289. data/lib/graphql/static_validation/rules/variables_are_input_types.rb +22 -14
  290. data/lib/graphql/static_validation/rules/variables_are_input_types_error.rb +32 -0
  291. data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +92 -70
  292. data/lib/graphql/static_validation/rules/variables_are_used_and_defined_error.rb +37 -0
  293. data/lib/graphql/static_validation/type_stack.rb +85 -24
  294. data/lib/graphql/static_validation/validation_context.rb +25 -46
  295. data/lib/graphql/static_validation/validation_timeout_error.rb +25 -0
  296. data/lib/graphql/static_validation/validator.rb +46 -15
  297. data/lib/graphql/static_validation.rb +6 -3
  298. data/lib/graphql/string_encoding_error.rb +20 -0
  299. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +247 -0
  300. data/lib/graphql/subscriptions/broadcast_analyzer.rb +81 -0
  301. data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +58 -0
  302. data/lib/graphql/subscriptions/event.rb +144 -0
  303. data/lib/graphql/subscriptions/instrumentation.rb +28 -0
  304. data/lib/graphql/subscriptions/serialize.rb +158 -0
  305. data/lib/graphql/subscriptions.rb +306 -0
  306. data/lib/graphql/tracing/active_support_notifications_tracing.rb +21 -0
  307. data/lib/graphql/tracing/appoptics_tracing.rb +173 -0
  308. data/lib/graphql/tracing/appsignal_tracing.rb +51 -0
  309. data/lib/graphql/tracing/data_dog_tracing.rb +100 -0
  310. data/lib/graphql/tracing/instrumentation_tracing.rb +83 -0
  311. data/lib/graphql/tracing/new_relic_tracing.rb +51 -0
  312. data/lib/graphql/tracing/notifications_tracing.rb +59 -0
  313. data/lib/graphql/tracing/platform_tracing.rb +122 -0
  314. data/lib/graphql/tracing/prometheus_tracing/graphql_collector.rb +32 -0
  315. data/lib/graphql/tracing/prometheus_tracing.rb +67 -0
  316. data/lib/graphql/tracing/scout_tracing.rb +54 -0
  317. data/lib/graphql/tracing/statsd_tracing.rb +42 -0
  318. data/lib/graphql/tracing.rb +94 -0
  319. data/lib/graphql/type_kinds.rb +50 -22
  320. data/lib/graphql/types/big_int.rb +23 -0
  321. data/lib/graphql/types/boolean.rb +18 -0
  322. data/lib/graphql/types/float.rb +19 -0
  323. data/lib/graphql/types/id.rb +24 -0
  324. data/lib/graphql/types/int.rb +36 -0
  325. data/lib/graphql/types/iso_8601_date.rb +45 -0
  326. data/lib/graphql/types/iso_8601_date_time.rb +76 -0
  327. data/lib/graphql/types/json.rb +25 -0
  328. data/lib/graphql/types/relay/base_connection.rb +49 -0
  329. data/lib/graphql/types/relay/base_edge.rb +29 -0
  330. data/lib/graphql/types/relay/connection_behaviors.rb +154 -0
  331. data/lib/graphql/types/relay/default_relay.rb +21 -0
  332. data/lib/graphql/types/relay/edge_behaviors.rb +64 -0
  333. data/lib/graphql/types/relay/has_node_field.rb +41 -0
  334. data/lib/graphql/types/relay/has_nodes_field.rb +41 -0
  335. data/lib/graphql/types/relay/node.rb +15 -0
  336. data/lib/graphql/types/relay/node_behaviors.rb +19 -0
  337. data/lib/graphql/types/relay/page_info.rb +11 -0
  338. data/lib/graphql/types/relay/page_info_behaviors.rb +25 -0
  339. data/lib/graphql/types/relay.rb +39 -0
  340. data/lib/graphql/types/string.rb +29 -0
  341. data/lib/graphql/types.rb +11 -0
  342. data/lib/graphql/unauthorized_error.rb +29 -0
  343. data/lib/graphql/unauthorized_field_error.rb +23 -0
  344. data/lib/graphql/unresolved_type_error.rb +35 -0
  345. data/lib/graphql/version.rb +2 -1
  346. data/lib/graphql.rb +86 -41
  347. data/readme.md +15 -101
  348. metadata +394 -279
  349. data/lib/graphql/analysis/analyze_query.rb +0 -73
  350. data/lib/graphql/analysis/max_query_complexity.rb +0 -25
  351. data/lib/graphql/analysis/max_query_depth.rb +0 -25
  352. data/lib/graphql/analysis/query_complexity.rb +0 -122
  353. data/lib/graphql/analysis/query_depth.rb +0 -54
  354. data/lib/graphql/argument.rb +0 -25
  355. data/lib/graphql/base_type.rb +0 -115
  356. data/lib/graphql/boolean_type.rb +0 -9
  357. data/lib/graphql/define/assign_argument.rb +0 -20
  358. data/lib/graphql/define/assign_enum_value.rb +0 -16
  359. data/lib/graphql/define/assign_object_field.rb +0 -21
  360. data/lib/graphql/define/assignment_dictionary.rb +0 -26
  361. data/lib/graphql/define/defined_object_proxy.rb +0 -32
  362. data/lib/graphql/define/instance_definable.rb +0 -79
  363. data/lib/graphql/define/non_null_with_bang.rb +0 -15
  364. data/lib/graphql/define/type_definer.rb +0 -30
  365. data/lib/graphql/define.rb +0 -8
  366. data/lib/graphql/directive/include_directive.rb +0 -10
  367. data/lib/graphql/directive/skip_directive.rb +0 -11
  368. data/lib/graphql/directive.rb +0 -49
  369. data/lib/graphql/enum_type.rb +0 -95
  370. data/lib/graphql/field.rb +0 -131
  371. data/lib/graphql/float_type.rb +0 -5
  372. data/lib/graphql/id_type.rb +0 -12
  373. data/lib/graphql/input_object_type.rb +0 -71
  374. data/lib/graphql/int_type.rb +0 -5
  375. data/lib/graphql/interface_type.rb +0 -38
  376. data/lib/graphql/internal_representation/node.rb +0 -81
  377. data/lib/graphql/internal_representation/rewrite.rb +0 -177
  378. data/lib/graphql/internal_representation.rb +0 -2
  379. data/lib/graphql/introspection/arguments_field.rb +0 -5
  380. data/lib/graphql/introspection/enum_values_field.rb +0 -13
  381. data/lib/graphql/introspection/fields_field.rb +0 -13
  382. data/lib/graphql/introspection/input_fields_field.rb +0 -12
  383. data/lib/graphql/introspection/interfaces_field.rb +0 -5
  384. data/lib/graphql/introspection/of_type_field.rb +0 -6
  385. data/lib/graphql/introspection/possible_types_field.rb +0 -11
  386. data/lib/graphql/introspection/schema_field.rb +0 -15
  387. data/lib/graphql/introspection/type_by_name_field.rb +0 -16
  388. data/lib/graphql/introspection/typename_field.rb +0 -15
  389. data/lib/graphql/list_type.rb +0 -46
  390. data/lib/graphql/non_null_type.rb +0 -43
  391. data/lib/graphql/object_type.rb +0 -93
  392. data/lib/graphql/query/arguments.rb +0 -76
  393. data/lib/graphql/query/directive_resolution.rb +0 -16
  394. data/lib/graphql/query/executor.rb +0 -45
  395. data/lib/graphql/query/literal_input.rb +0 -90
  396. data/lib/graphql/query/serial_execution/execution_context.rb +0 -31
  397. data/lib/graphql/query/serial_execution/field_resolution.rb +0 -82
  398. data/lib/graphql/query/serial_execution/operation_resolution.rb +0 -27
  399. data/lib/graphql/query/serial_execution/selection_resolution.rb +0 -42
  400. data/lib/graphql/query/serial_execution/value_resolution.rb +0 -107
  401. data/lib/graphql/query/serial_execution.rb +0 -41
  402. data/lib/graphql/query/type_resolver.rb +0 -25
  403. data/lib/graphql/scalar_type.rb +0 -53
  404. data/lib/graphql/schema/catchall_middleware.rb +0 -34
  405. data/lib/graphql/schema/middleware_chain.rb +0 -28
  406. data/lib/graphql/schema/possible_types.rb +0 -34
  407. data/lib/graphql/schema/reduce_types.rb +0 -68
  408. data/lib/graphql/schema/rescue_middleware.rb +0 -53
  409. data/lib/graphql/schema/timeout_middleware.rb +0 -67
  410. data/lib/graphql/schema/type_map.rb +0 -30
  411. data/lib/graphql/schema/validation.rb +0 -164
  412. data/lib/graphql/static_validation/arguments_validator.rb +0 -48
  413. data/lib/graphql/static_validation/message.rb +0 -36
  414. data/lib/graphql/string_type.rb +0 -5
  415. data/lib/graphql/union_type.rb +0 -38
  416. data/spec/graphql/analysis/analyze_query_spec.rb +0 -50
  417. data/spec/graphql/analysis/max_query_complexity_spec.rb +0 -62
  418. data/spec/graphql/analysis/max_query_depth_spec.rb +0 -100
  419. data/spec/graphql/analysis/query_complexity_spec.rb +0 -235
  420. data/spec/graphql/analysis/query_depth_spec.rb +0 -80
  421. data/spec/graphql/argument_spec.rb +0 -20
  422. data/spec/graphql/base_type_spec.rb +0 -24
  423. data/spec/graphql/boolean_type_spec.rb +0 -20
  424. data/spec/graphql/define/instance_definable_spec.rb +0 -55
  425. data/spec/graphql/directive_spec.rb +0 -77
  426. data/spec/graphql/enum_type_spec.rb +0 -31
  427. data/spec/graphql/execution_error_spec.rb +0 -61
  428. data/spec/graphql/field_spec.rb +0 -92
  429. data/spec/graphql/float_type_spec.rb +0 -15
  430. data/spec/graphql/id_type_spec.rb +0 -32
  431. data/spec/graphql/input_object_type_spec.rb +0 -162
  432. data/spec/graphql/int_type_spec.rb +0 -15
  433. data/spec/graphql/interface_type_spec.rb +0 -56
  434. data/spec/graphql/internal_representation/rewrite_spec.rb +0 -120
  435. data/spec/graphql/introspection/directive_type_spec.rb +0 -50
  436. data/spec/graphql/introspection/input_value_type_spec.rb +0 -42
  437. data/spec/graphql/introspection/introspection_query_spec.rb +0 -10
  438. data/spec/graphql/introspection/schema_type_spec.rb +0 -45
  439. data/spec/graphql/introspection/type_type_spec.rb +0 -122
  440. data/spec/graphql/language/generation_spec.rb +0 -42
  441. data/spec/graphql/language/parser_spec.rb +0 -442
  442. data/spec/graphql/language/visitor_spec.rb +0 -49
  443. data/spec/graphql/list_type_spec.rb +0 -32
  444. data/spec/graphql/non_null_type_spec.rb +0 -31
  445. data/spec/graphql/object_type_spec.rb +0 -42
  446. data/spec/graphql/query/arguments_spec.rb +0 -25
  447. data/spec/graphql/query/context_spec.rb +0 -83
  448. data/spec/graphql/query/executor_spec.rb +0 -273
  449. data/spec/graphql/query/serial_execution/execution_context_spec.rb +0 -53
  450. data/spec/graphql/query/serial_execution/value_resolution_spec.rb +0 -66
  451. data/spec/graphql/query/type_resolver_spec.rb +0 -8
  452. data/spec/graphql/query/variables_spec.rb +0 -28
  453. data/spec/graphql/query_spec.rb +0 -363
  454. data/spec/graphql/scalar_type_spec.rb +0 -61
  455. data/spec/graphql/schema/catchall_middleware_spec.rb +0 -32
  456. data/spec/graphql/schema/middleware_chain_spec.rb +0 -42
  457. data/spec/graphql/schema/printer_spec.rb +0 -190
  458. data/spec/graphql/schema/reduce_types_spec.rb +0 -102
  459. data/spec/graphql/schema/rescue_middleware_spec.rb +0 -33
  460. data/spec/graphql/schema/timeout_middleware_spec.rb +0 -180
  461. data/spec/graphql/schema/type_expression_spec.rb +0 -38
  462. data/spec/graphql/schema/validation_spec.rb +0 -219
  463. data/spec/graphql/schema_spec.rb +0 -23
  464. data/spec/graphql/static_validation/rules/argument_literals_are_compatible_spec.rb +0 -63
  465. data/spec/graphql/static_validation/rules/arguments_are_defined_spec.rb +0 -48
  466. data/spec/graphql/static_validation/rules/directives_are_defined_spec.rb +0 -34
  467. data/spec/graphql/static_validation/rules/directives_are_in_valid_locations_spec.rb +0 -39
  468. data/spec/graphql/static_validation/rules/fields_are_defined_on_type_spec.rb +0 -60
  469. data/spec/graphql/static_validation/rules/fields_have_appropriate_selections_spec.rb +0 -31
  470. data/spec/graphql/static_validation/rules/fields_will_merge_spec.rb +0 -48
  471. data/spec/graphql/static_validation/rules/fragment_spreads_are_possible_spec.rb +0 -47
  472. data/spec/graphql/static_validation/rules/fragment_types_exist_spec.rb +0 -39
  473. data/spec/graphql/static_validation/rules/fragments_are_finite_spec.rb +0 -44
  474. data/spec/graphql/static_validation/rules/fragments_are_on_composite_types_spec.rb +0 -49
  475. data/spec/graphql/static_validation/rules/fragments_are_used_spec.rb +0 -25
  476. data/spec/graphql/static_validation/rules/required_arguments_are_present_spec.rb +0 -42
  477. data/spec/graphql/static_validation/rules/variable_default_values_are_correctly_typed_spec.rb +0 -44
  478. data/spec/graphql/static_validation/rules/variable_usages_are_allowed_spec.rb +0 -63
  479. data/spec/graphql/static_validation/rules/variables_are_input_types_spec.rb +0 -37
  480. data/spec/graphql/static_validation/rules/variables_are_used_and_defined_spec.rb +0 -53
  481. data/spec/graphql/static_validation/type_stack_spec.rb +0 -37
  482. data/spec/graphql/static_validation/validator_spec.rb +0 -69
  483. data/spec/graphql/string_type_spec.rb +0 -15
  484. data/spec/graphql/union_type_spec.rb +0 -31
  485. data/spec/spec_helper.rb +0 -18
  486. data/spec/support/dairy_app.rb +0 -309
  487. data/spec/support/dairy_data.rb +0 -23
  488. data/spec/support/minimum_input_object.rb +0 -16
  489. data/spec/support/star_wars_data.rb +0 -71
  490. data/spec/support/star_wars_schema.rb +0 -76
@@ -0,0 +1,124 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "graphql/schema/find_inherited_value"
4
+
5
+ module GraphQL
6
+ class Schema
7
+ class Member
8
+ # DSL methods shared by lots of things in the GraphQL Schema.
9
+ # @api private
10
+ # @see Classes that extend this, eg {GraphQL::Schema::Object}
11
+ module BaseDSLMethods
12
+ include GraphQL::Schema::FindInheritedValue
13
+
14
+ # Call this with a new name to override the default name for this schema member; OR
15
+ # call it without an argument to get the name of this schema member
16
+ #
17
+ # The default name is implemented in default_graphql_name
18
+ # @param new_name [String]
19
+ # @return [String]
20
+ def graphql_name(new_name = nil)
21
+ if new_name
22
+ GraphQL::NameValidator.validate!(new_name)
23
+ @graphql_name = new_name
24
+ else
25
+ overridden_graphql_name || default_graphql_name
26
+ end
27
+ end
28
+
29
+ def overridden_graphql_name
30
+ defined?(@graphql_name) ? @graphql_name : nil
31
+ end
32
+
33
+ # Just a convenience method to point out that people should use graphql_name instead
34
+ def name(new_name = nil)
35
+ return super() if new_name.nil?
36
+
37
+ fail(
38
+ "The new name override method is `graphql_name`, not `name`. Usage: "\
39
+ "graphql_name \"#{new_name}\""
40
+ )
41
+ end
42
+
43
+ # Call this method to provide a new description; OR
44
+ # call it without an argument to get the description
45
+ # @param new_description [String]
46
+ # @return [String]
47
+ def description(new_description = nil)
48
+ if new_description
49
+ @description = new_description
50
+ elsif defined?(@description)
51
+ @description
52
+ else
53
+ nil
54
+ end
55
+ end
56
+
57
+ # This pushes some configurations _down_ the inheritance tree,
58
+ # in order to prevent repetitive lookups at runtime.
59
+ module ConfigurationExtension
60
+ def inherited(child_class)
61
+ child_class.introspection(introspection)
62
+ child_class.description(description)
63
+ if overridden_graphql_name
64
+ child_class.graphql_name(overridden_graphql_name)
65
+ end
66
+ super
67
+ end
68
+ end
69
+
70
+ # @return [Boolean] If true, this object is part of the introspection system
71
+ def introspection(new_introspection = nil)
72
+ if !new_introspection.nil?
73
+ @introspection = new_introspection
74
+ elsif defined?(@introspection)
75
+ @introspection
76
+ else
77
+ false
78
+ end
79
+ end
80
+
81
+ def introspection?
82
+ introspection
83
+ end
84
+
85
+ # The mutation this type was derived from, if it was derived from a mutation
86
+ # @return [Class]
87
+ def mutation(mutation_class = nil)
88
+ if mutation_class
89
+ @mutation = mutation_class
90
+ elsif defined?(@mutation)
91
+ @mutation
92
+ else
93
+ nil
94
+ end
95
+ end
96
+
97
+ alias :unwrap :itself
98
+
99
+ # Creates the default name for a schema member.
100
+ # The default name is the Ruby constant name,
101
+ # without any namespaces and with any `-Type` suffix removed
102
+ def default_graphql_name
103
+ @default_graphql_name ||= begin
104
+ raise GraphQL::RequiredImplementationMissingError, 'Anonymous class should declare a `graphql_name`' if name.nil?
105
+
106
+ name.split("::").last.sub(/Type\Z/, "")
107
+ end
108
+ end
109
+
110
+ def visible?(context)
111
+ true
112
+ end
113
+
114
+ def accessible?(context)
115
+ true
116
+ end
117
+
118
+ def authorized?(object, context)
119
+ true
120
+ end
121
+ end
122
+ end
123
+ end
124
+ end
@@ -0,0 +1,178 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ class Schema
4
+ class Member
5
+ # @api private
6
+ module BuildType
7
+ LIST_TYPE_ERROR = "Use an array of [T] or [T, null: true] for list types; other arrays are not supported"
8
+
9
+ module_function
10
+ # @param type_expr [String, Class, GraphQL::BaseType]
11
+ # @return [GraphQL::BaseType]
12
+ def parse_type(type_expr, null:)
13
+ list_type = false
14
+
15
+ return_type = case type_expr
16
+ when String
17
+ case type_expr
18
+ when "String"
19
+ GraphQL::Types::String
20
+ when "Int", "Integer"
21
+ GraphQL::Types::Int
22
+ when "Float"
23
+ GraphQL::Types::Float
24
+ when "Boolean"
25
+ GraphQL::Types::Boolean
26
+ when "ID"
27
+ GraphQL::Types::ID
28
+ when /\A\[.*\]\Z/
29
+ list_type = true
30
+ # List members are required by default
31
+ parse_type(type_expr[1..-2], null: false)
32
+ when /.*!\Z/
33
+ null = false
34
+ parse_type(type_expr[0..-2], null: true)
35
+ else
36
+ maybe_type = constantize(type_expr)
37
+ case maybe_type
38
+ when Module
39
+ # This is a way to check that it's the right kind of module:
40
+ if maybe_type.respond_to?(:kind)
41
+ maybe_type
42
+ else
43
+ raise ArgumentError, "Unexpected class/module found for GraphQL type: #{type_expr} (must be type definition class/module)"
44
+ end
45
+ end
46
+ end
47
+ when GraphQL::Schema::LateBoundType
48
+ type_expr
49
+ when Array
50
+ case type_expr.length
51
+ when 1
52
+ list_type = true
53
+ # List members are required by default
54
+ parse_type(type_expr.first, null: false)
55
+ when 2
56
+ inner_type, nullable_option = type_expr
57
+ if nullable_option.keys != [:null] || (nullable_option[:null] != true && nullable_option[:null] != false)
58
+ raise ArgumentError, LIST_TYPE_ERROR
59
+ end
60
+ list_type = true
61
+ parse_type(inner_type, null: nullable_option[:null])
62
+ else
63
+ raise ArgumentError, LIST_TYPE_ERROR
64
+ end
65
+ when GraphQL::Schema::NonNull, GraphQL::Schema::List
66
+ type_expr
67
+ when Module
68
+ # This is a way to check that it's the right kind of module:
69
+ if type_expr.respond_to?(:kind)
70
+ type_expr
71
+ else
72
+ # Eg `String` => GraphQL::Types::String
73
+ parse_type(type_expr.name, null: true)
74
+ end
75
+ when Proc
76
+ parse_type(type_expr.call, null: true)
77
+ when false
78
+ raise ArgumentError, "Received `false` instead of a type, maybe a `!` should be replaced with `null: true` (for fields) or `required: true` (for arguments)"
79
+ end
80
+
81
+ if return_type.nil?
82
+ raise "Unexpected type input: #{type_expr.inspect} (#{type_expr.class})"
83
+ end
84
+
85
+ # Apply list_type first, that way the
86
+ # .to_non_null_type applies to the list type, not the inner type
87
+ if list_type
88
+ return_type = return_type.to_list_type
89
+ end
90
+
91
+ if !null
92
+ return_type = return_type.to_non_null_type
93
+ end
94
+
95
+
96
+ return_type
97
+ end
98
+
99
+ def to_type_name(something)
100
+ case something
101
+ when GraphQL::Schema::LateBoundType
102
+ something.unwrap.name
103
+ when Array
104
+ to_type_name(something.first)
105
+ when Module
106
+ if something.respond_to?(:graphql_name)
107
+ something.graphql_name
108
+ else
109
+ to_type_name(something.name)
110
+ end
111
+ when String
112
+ something.gsub(/\]\[\!/, "").split("::").last
113
+ when GraphQL::Schema::NonNull, GraphQL::Schema::List
114
+ to_type_name(something.unwrap)
115
+ else
116
+ raise "Unhandled to_type_name input: #{something} (#{something.class})"
117
+ end
118
+ end
119
+
120
+ def camelize(string)
121
+ return string if string == '_'
122
+ return string unless string.include?("_")
123
+ camelized = string.split('_').each(&:capitalize!).join
124
+ camelized[0] = camelized[0].downcase
125
+ if (match_data = string.match(/\A(_+)/))
126
+ camelized = "#{match_data[0]}#{camelized}"
127
+ end
128
+ camelized
129
+ end
130
+
131
+ # Resolves constant from string (based on Rails `ActiveSupport::Inflector.constantize`)
132
+ def constantize(string)
133
+ names = string.split('::')
134
+
135
+ # Trigger a built-in NameError exception including the ill-formed constant in the message.
136
+ Object.const_get(string) if names.empty?
137
+
138
+ # Remove the first blank element in case of '::ClassName' notation.
139
+ names.shift if names.size > 1 && names.first.empty?
140
+
141
+ names.inject(Object) do |constant, name|
142
+ if constant == Object
143
+ constant.const_get(name)
144
+ else
145
+ candidate = constant.const_get(name)
146
+ next candidate if constant.const_defined?(name, false)
147
+ next candidate unless Object.const_defined?(name)
148
+
149
+ # Go down the ancestors to check if it is owned directly. The check
150
+ # stops when we reach Object or the end of ancestors tree.
151
+ constant = constant.ancestors.inject do |const, ancestor|
152
+ break const if ancestor == Object
153
+ break ancestor if ancestor.const_defined?(name, false)
154
+ const
155
+ end
156
+
157
+ # Owner is in Object, so raise.
158
+ constant.const_get(name, false)
159
+ end
160
+ end
161
+ end
162
+
163
+ def underscore(string)
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
174
+ end
175
+ end
176
+ end
177
+ end
178
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GraphQL
4
+ class Schema
5
+ class Member
6
+ # These constants are interpreted as GraphQL types when defining fields or arguments
7
+ #
8
+ # @example
9
+ # field :is_draft, Boolean, null: false
10
+ # field :id, ID, null: false
11
+ # field :score, Int, null: false
12
+ #
13
+ # @api private
14
+ module GraphQLTypeNames
15
+ Boolean = "Boolean"
16
+ ID = "ID"
17
+ Int = "Int"
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,376 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ class Schema
4
+ class Member
5
+ module HasArguments
6
+ def self.included(cls)
7
+ cls.extend(ArgumentClassAccessor)
8
+ cls.include(ArgumentObjectLoader)
9
+ end
10
+
11
+ def self.extended(cls)
12
+ cls.extend(ArgumentClassAccessor)
13
+ cls.include(ArgumentObjectLoader)
14
+ end
15
+
16
+ # @see {GraphQL::Schema::Argument#initialize} for parameters
17
+ # @return [GraphQL::Schema::Argument] An instance of {argument_class}, created from `*args`
18
+ def argument(*args, **kwargs, &block)
19
+ kwargs[:owner] = self
20
+ loads = kwargs[:loads]
21
+ if loads
22
+ name = args[0]
23
+ name_as_string = name.to_s
24
+
25
+ inferred_arg_name = case name_as_string
26
+ when /_id$/
27
+ name_as_string.sub(/_id$/, "").to_sym
28
+ when /_ids$/
29
+ name_as_string.sub(/_ids$/, "")
30
+ .sub(/([^s])$/, "\\1s")
31
+ .to_sym
32
+ else
33
+ name
34
+ end
35
+
36
+ kwargs[:as] ||= inferred_arg_name
37
+ end
38
+ arg_defn = self.argument_class.new(*args, **kwargs, &block)
39
+ add_argument(arg_defn)
40
+
41
+ if self.is_a?(Class) && !method_defined?(:"load_#{arg_defn.keyword}")
42
+ method_owner = if self < GraphQL::Schema::InputObject || self < GraphQL::Schema::Directive
43
+ "self."
44
+ elsif self < GraphQL::Schema::Resolver
45
+ ""
46
+ else
47
+ raise "Unexpected argument owner: #{self}"
48
+ end
49
+ if loads && arg_defn.type.list?
50
+ class_eval <<-RUBY, __FILE__, __LINE__ + 1
51
+ def #{method_owner}load_#{arg_defn.keyword}(values, context = nil)
52
+ argument = get_argument("#{arg_defn.graphql_name}")
53
+ (context || self.context).schema.after_lazy(values) do |values2|
54
+ GraphQL::Execution::Lazy.all(values2.map { |value| load_application_object(argument, value, context || self.context) })
55
+ end
56
+ end
57
+ RUBY
58
+ elsif loads
59
+ class_eval <<-RUBY, __FILE__, __LINE__ + 1
60
+ def #{method_owner}load_#{arg_defn.keyword}(value, context = nil)
61
+ argument = get_argument("#{arg_defn.graphql_name}")
62
+ load_application_object(argument, value, context || self.context)
63
+ end
64
+ RUBY
65
+ else
66
+ class_eval <<-RUBY, __FILE__, __LINE__ + 1
67
+ def #{method_owner}load_#{arg_defn.keyword}(value, _context = nil)
68
+ value
69
+ end
70
+ RUBY
71
+ end
72
+ end
73
+ arg_defn
74
+ end
75
+
76
+ # Register this argument with the class.
77
+ # @param arg_defn [GraphQL::Schema::Argument]
78
+ # @return [GraphQL::Schema::Argument]
79
+ def add_argument(arg_defn)
80
+ @own_arguments ||= {}
81
+ prev_defn = @own_arguments[arg_defn.name]
82
+ case prev_defn
83
+ when nil
84
+ @own_arguments[arg_defn.name] = arg_defn
85
+ when Array
86
+ prev_defn << arg_defn
87
+ when GraphQL::Schema::Argument
88
+ @own_arguments[arg_defn.name] = [prev_defn, arg_defn]
89
+ else
90
+ raise "Invariant: unexpected `@own_arguments[#{arg_defn.name.inspect}]`: #{prev_defn.inspect}"
91
+ end
92
+ arg_defn
93
+ end
94
+
95
+ def remove_argument(arg_defn)
96
+ prev_defn = @own_arguments[arg_defn.name]
97
+ case prev_defn
98
+ when nil
99
+ # done
100
+ when Array
101
+ prev_defn.delete(arg_defn)
102
+ when GraphQL::Schema::Argument
103
+ @own_arguments.delete(arg_defn.name)
104
+ else
105
+ raise "Invariant: unexpected `@own_arguments[#{arg_defn.name.inspect}]`: #{prev_defn.inspect}"
106
+ end
107
+ nil
108
+ end
109
+
110
+ # @return [Hash<String => GraphQL::Schema::Argument] Arguments defined on this thing, keyed by name. Includes inherited definitions
111
+ def arguments(context = GraphQL::Query::NullContext)
112
+ inherited_arguments = if self.is_a?(Class) && superclass.respond_to?(:arguments)
113
+ superclass.arguments(context)
114
+ elsif defined?(@resolver_class) && @resolver_class
115
+ @resolver_class.field_arguments(context)
116
+ else
117
+ nil
118
+ end
119
+ # Local definitions override inherited ones
120
+ if own_arguments.any?
121
+ own_arguments_that_apply = {}
122
+ own_arguments.each do |name, args_entry|
123
+ if (visible_defn = Warden.visible_entry?(:visible_argument?, args_entry, context))
124
+ own_arguments_that_apply[visible_defn.graphql_name] = visible_defn
125
+ end
126
+ end
127
+ end
128
+
129
+ if inherited_arguments
130
+ if own_arguments_that_apply
131
+ inherited_arguments.merge(own_arguments_that_apply)
132
+ else
133
+ inherited_arguments
134
+ end
135
+ else
136
+ # might be nil if there are actually no arguments
137
+ own_arguments_that_apply || own_arguments
138
+ end
139
+ end
140
+
141
+ def all_argument_definitions
142
+ if self.is_a?(Class)
143
+ all_defns = {}
144
+ ancestors.reverse_each do |ancestor|
145
+ if ancestor.respond_to?(:own_arguments)
146
+ all_defns.merge!(ancestor.own_arguments)
147
+ end
148
+ end
149
+ elsif defined?(@resolver_class) && @resolver_class
150
+ all_defns = {}
151
+ @resolver_class.all_field_argument_definitions.each do |arg_defn|
152
+ key = arg_defn.graphql_name
153
+ case (current_value = all_defns[key])
154
+ when nil
155
+ all_defns[key] = arg_defn
156
+ when Array
157
+ current_value << arg_defn
158
+ when GraphQL::Schema::Argument
159
+ all_defns[key] = [current_value, arg_defn]
160
+ else
161
+ raise "Invariant: Unexpected argument definition, #{current_value.class}: #{current_value.inspect}"
162
+ end
163
+ end
164
+ all_defns.merge!(own_arguments)
165
+ else
166
+ all_defns = own_arguments
167
+ end
168
+ all_defns = all_defns.values
169
+ all_defns.flatten!
170
+ all_defns
171
+ end
172
+
173
+ # @return [GraphQL::Schema::Argument, nil] Argument defined on this thing, fetched by name.
174
+ def get_argument(argument_name, context = GraphQL::Query::NullContext)
175
+ warden = Warden.from_context(context)
176
+ if !self.is_a?(Class)
177
+ if (arg_config = own_arguments[argument_name]) && (visible_arg = Warden.visible_entry?(:visible_argument?, arg_config, context, warden))
178
+ visible_arg
179
+ elsif defined?(@resolver_class) && @resolver_class
180
+ @resolver_class.get_field_argument(argument_name, context)
181
+ else
182
+ nil
183
+ end
184
+ else
185
+ for ancestor in ancestors
186
+ if ancestor.respond_to?(:own_arguments) &&
187
+ (a = ancestor.own_arguments[argument_name]) &&
188
+ (a = Warden.visible_entry?(:visible_argument?, a, context, warden))
189
+ return a
190
+ end
191
+ end
192
+ nil
193
+ end
194
+ end
195
+
196
+ # @param new_arg_class [Class] A class to use for building argument definitions
197
+ def argument_class(new_arg_class = nil)
198
+ self.class.argument_class(new_arg_class)
199
+ end
200
+
201
+ # @api private
202
+ # If given a block, it will eventually yield the loaded args to the block.
203
+ #
204
+ # If no block is given, it will immediately dataload (but might return a Lazy).
205
+ #
206
+ # @param values [Hash<String, Object>]
207
+ # @param context [GraphQL::Query::Context]
208
+ # @yield [Interpreter::Arguments, Execution::Lazy<Interpeter::Arguments>]
209
+ # @return [Interpreter::Arguments, Execution::Lazy<Interpeter::Arguments>]
210
+ def coerce_arguments(parent_object, values, context, &block)
211
+ # Cache this hash to avoid re-merging it
212
+ arg_defns = self.arguments(context)
213
+ total_args_count = arg_defns.size
214
+
215
+ finished_args = nil
216
+ prepare_finished_args = -> {
217
+ if total_args_count == 0
218
+ finished_args = GraphQL::Execution::Interpreter::Arguments::EMPTY
219
+ if block_given?
220
+ block.call(finished_args)
221
+ end
222
+ else
223
+ argument_values = {}
224
+ resolved_args_count = 0
225
+ raised_error = false
226
+ arg_defns.each do |arg_name, arg_defn|
227
+ context.dataloader.append_job do
228
+ begin
229
+ arg_defn.coerce_into_values(parent_object, values, context, argument_values)
230
+ rescue GraphQL::ExecutionError, GraphQL::UnauthorizedError => err
231
+ raised_error = true
232
+ finished_args = err
233
+ if block_given?
234
+ block.call(finished_args)
235
+ end
236
+ end
237
+
238
+ resolved_args_count += 1
239
+ if resolved_args_count == total_args_count && !raised_error
240
+ finished_args = context.schema.after_any_lazies(argument_values.values) {
241
+ GraphQL::Execution::Interpreter::Arguments.new(
242
+ argument_values: argument_values,
243
+ )
244
+ }
245
+ if block_given?
246
+ block.call(finished_args)
247
+ end
248
+ end
249
+ end
250
+ end
251
+ end
252
+ }
253
+
254
+ if block_given?
255
+ prepare_finished_args.call
256
+ nil
257
+ else
258
+ # This API returns eagerly, gotta run it now
259
+ context.dataloader.run_isolated(&prepare_finished_args)
260
+ finished_args
261
+ end
262
+ end
263
+
264
+ # Usually, this is validated statically by RequiredArgumentsArePresent,
265
+ # but not for directives.
266
+ # TODO apply static validations on schema definitions?
267
+ def validate_directive_argument(arg_defn, value)
268
+ if arg_defn.owner.is_a?(Class) && arg_defn.owner < GraphQL::Schema::Directive
269
+ if value.nil? && arg_defn.type.non_null?
270
+ raise ArgumentError, "#{arg_defn.path} is required, but no value was given"
271
+ end
272
+ end
273
+ end
274
+
275
+ def arguments_statically_coercible?
276
+ return @arguments_statically_coercible if defined?(@arguments_statically_coercible)
277
+
278
+ @arguments_statically_coercible = all_argument_definitions.all?(&:statically_coercible?)
279
+ end
280
+
281
+ module ArgumentClassAccessor
282
+ def argument_class(new_arg_class = nil)
283
+ if new_arg_class
284
+ @argument_class = new_arg_class
285
+ elsif defined?(@argument_class) && @argument_class
286
+ @argument_class
287
+ else
288
+ superclass.respond_to?(:argument_class) ? superclass.argument_class : GraphQL::Schema::Argument
289
+ end
290
+ end
291
+ end
292
+
293
+ module ArgumentObjectLoader
294
+ # Look up the corresponding object for a provided ID.
295
+ # By default, it uses Relay-style {Schema.object_from_id},
296
+ # override this to find objects another way.
297
+ #
298
+ # @param type [Class, Module] A GraphQL type definition
299
+ # @param id [String] A client-provided to look up
300
+ # @param context [GraphQL::Query::Context] the current context
301
+ def object_from_id(type, id, context)
302
+ context.schema.object_from_id(id, context)
303
+ end
304
+
305
+ def load_application_object(argument, id, context)
306
+ # See if any object can be found for this ID
307
+ if id.nil?
308
+ return nil
309
+ end
310
+ object_from_id(argument.loads, id, context)
311
+ end
312
+
313
+ def load_and_authorize_application_object(argument, id, context)
314
+ loaded_application_object = load_application_object(argument, id, context)
315
+ authorize_application_object(argument, id, context, loaded_application_object)
316
+ end
317
+
318
+ def authorize_application_object(argument, id, context, loaded_application_object)
319
+ context.schema.after_lazy(loaded_application_object) do |application_object|
320
+ if application_object.nil?
321
+ err = GraphQL::LoadApplicationObjectFailedError.new(argument: argument, id: id, object: application_object)
322
+ load_application_object_failed(err)
323
+ end
324
+ # Double-check that the located object is actually of this type
325
+ # (Don't want to allow arbitrary access to objects this way)
326
+ maybe_lazy_resolve_type = context.schema.resolve_type(argument.loads, application_object, context)
327
+ context.schema.after_lazy(maybe_lazy_resolve_type) do |resolve_type_result|
328
+ if resolve_type_result.is_a?(Array) && resolve_type_result.size == 2
329
+ application_object_type, application_object = resolve_type_result
330
+ else
331
+ application_object_type = resolve_type_result
332
+ # application_object is already assigned
333
+ end
334
+ possible_object_types = context.warden.possible_types(argument.loads)
335
+ if !possible_object_types.include?(application_object_type)
336
+ err = GraphQL::LoadApplicationObjectFailedError.new(argument: argument, id: id, object: application_object)
337
+ load_application_object_failed(err)
338
+ else
339
+ # This object was loaded successfully
340
+ # and resolved to the right type,
341
+ # now apply the `.authorized?` class method if there is one
342
+ context.schema.after_lazy(application_object_type.authorized?(application_object, context)) do |authed|
343
+ if authed
344
+ application_object
345
+ else
346
+ err = GraphQL::UnauthorizedError.new(
347
+ object: application_object,
348
+ type: application_object_type,
349
+ context: context,
350
+ )
351
+ if self.respond_to?(:unauthorized_object)
352
+ err.set_backtrace(caller)
353
+ unauthorized_object(err)
354
+ else
355
+ raise err
356
+ end
357
+ end
358
+ end
359
+ end
360
+ end
361
+ end
362
+ end
363
+
364
+ def load_application_object_failed(err)
365
+ raise err
366
+ end
367
+ end
368
+
369
+ NO_ARGUMENTS = {}.freeze
370
+ def own_arguments
371
+ @own_arguments || NO_ARGUMENTS
372
+ end
373
+ end
374
+ end
375
+ end
376
+ end