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
@@ -1,90 +0,0 @@
1
- module GraphQL
2
- class Query
3
- # Turn query string values into something useful for query execution
4
- class LiteralInput
5
- def self.coerce(type, value, variables)
6
- if value.is_a?(Language::Nodes::VariableIdentifier)
7
- variables[value.name]
8
- elsif value.nil?
9
- nil
10
- else
11
- LiteralKindCoercers::STRATEGIES.fetch(type.kind).coerce(value, type, variables)
12
- end
13
- end
14
-
15
- def self.from_arguments(ast_arguments, argument_defns, variables)
16
- values_hash = {}
17
- argument_defns.each do |arg_name, arg_defn|
18
- ast_arg = ast_arguments.find { |ast_arg| ast_arg.name == arg_name }
19
- arg_value = nil
20
- if ast_arg
21
- arg_value = coerce(arg_defn.type, ast_arg.value, variables)
22
- end
23
- if arg_value.nil?
24
- arg_value = arg_defn.type.coerce_input(arg_defn.default_value)
25
- end
26
- values_hash[arg_name] = arg_value
27
- end
28
- GraphQL::Query::Arguments.new(values_hash)
29
- end
30
-
31
- module LiteralKindCoercers
32
- module NonNullLiteral
33
- def self.coerce(value, type, variables)
34
- LiteralInput.coerce(type.of_type, value, variables)
35
- end
36
- end
37
-
38
- module ListLiteral
39
- def self.coerce(value, type, variables)
40
- if value.is_a?(Array)
41
- value.map{ |element_ast| LiteralInput.coerce(type.of_type, element_ast, variables) }
42
- else
43
- [LiteralInput.coerce(type.of_type, value, variables)]
44
- end
45
- end
46
- end
47
-
48
- module InputObjectLiteral
49
- def self.coerce(value, type, variables)
50
- hash = {}
51
- value.arguments.each do |arg|
52
- field_type = type.input_fields[arg.name].type
53
- hash[arg.name] = LiteralInput.coerce(field_type, arg.value, variables)
54
- end
55
- type.input_fields.each do |arg_name, arg_defn|
56
- if hash[arg_name].nil?
57
- value = LiteralInput.coerce(arg_defn.type, arg_defn.default_value, variables)
58
- if !value.nil?
59
- hash[arg_name] = value
60
- end
61
- end
62
- end
63
- Arguments.new(hash)
64
- end
65
- end
66
-
67
- module EnumLiteral
68
- def self.coerce(value, type, variables)
69
- type.coerce_input(value.name)
70
- end
71
- end
72
-
73
- module ScalarLiteral
74
- def self.coerce(value, type, variables)
75
- type.coerce_input(value)
76
- end
77
- end
78
-
79
- STRATEGIES = {
80
- TypeKinds::NON_NULL => NonNullLiteral,
81
- TypeKinds::LIST => ListLiteral,
82
- TypeKinds::INPUT_OBJECT => InputObjectLiteral,
83
- TypeKinds::ENUM => EnumLiteral,
84
- TypeKinds::SCALAR => ScalarLiteral,
85
- }
86
- end
87
- private_constant :LiteralKindCoercers
88
- end
89
- end
90
- end
@@ -1,31 +0,0 @@
1
- module GraphQL
2
- class Query
3
- class SerialExecution
4
- class ExecutionContext
5
- attr_reader :query, :schema, :strategy
6
-
7
- def initialize(query, strategy)
8
- @query = query
9
- @schema = query.schema
10
- @strategy = strategy
11
- end
12
-
13
- def get_type(type)
14
- @schema.types[type]
15
- end
16
-
17
- def get_fragment(name)
18
- @query.fragments[name]
19
- end
20
-
21
- def get_field(type, name)
22
- @schema.get_field(type, name)
23
- end
24
-
25
- def add_error(err)
26
- @query.context.errors << err
27
- end
28
- end
29
- end
30
- end
31
- end
@@ -1,82 +0,0 @@
1
- module GraphQL
2
- class Query
3
- class SerialExecution
4
- class FieldResolution
5
- attr_reader :irep_node, :parent_type, :target, :execution_context, :field, :arguments
6
-
7
- def initialize(irep_node, parent_type, target, execution_context)
8
- @irep_node = irep_node
9
- @parent_type = parent_type
10
- @target = target
11
- @execution_context = execution_context
12
- @field = execution_context.get_field(parent_type, irep_node.definition.name)
13
- if @field.nil?
14
- raise("No field found on #{parent_type.name} '#{parent_type}' for '#{ast_node.name}'")
15
- end
16
- @arguments = execution_context.query.arguments_for(irep_node)
17
- end
18
-
19
- def result
20
- result_name = irep_node.name
21
- begin
22
- raw_value = get_raw_value
23
- { result_name => get_finished_value(raw_value) }
24
- rescue GraphQL::InvalidNullError => err
25
- if field.type.kind.non_null?
26
- raise(err)
27
- else
28
- err.parent_error? || execution_context.add_error(err)
29
- {result_name => nil}
30
- end
31
- end
32
- end
33
-
34
- private
35
-
36
- # After getting the value from the field's resolve method,
37
- # continue by "finishing" the value, eg. executing sub-fields or coercing values
38
- def get_finished_value(raw_value)
39
- if raw_value.is_a?(GraphQL::ExecutionError)
40
- raw_value.ast_node = irep_node.ast_node
41
- execution_context.add_error(raw_value)
42
- end
43
-
44
- strategy_class = GraphQL::Query::SerialExecution::ValueResolution.get_strategy_for_kind(field.type.kind)
45
- result_strategy = strategy_class.new(raw_value, field.type, target, parent_type, irep_node, execution_context)
46
- result_strategy.result
47
- end
48
-
49
-
50
- # Get the result of:
51
- # - Any middleware on this schema
52
- # - The field's resolve method
53
- # If the middleware chain returns a GraphQL::ExecutionError, its message
54
- # is added to the "errors" key.
55
- def get_raw_value
56
- steps = execution_context.query.schema.middleware + [get_middleware_proc_from_field_resolve]
57
- chain = GraphQL::Schema::MiddlewareChain.new(
58
- steps: steps,
59
- arguments: [parent_type, target, field, arguments, execution_context.query.context]
60
- )
61
- chain.call
62
- rescue GraphQL::ExecutionError => err
63
- err
64
- end
65
-
66
-
67
- # Execute the field's resolve method
68
- # @return [Proc] suitable to be the last step in a middleware chain
69
- def get_middleware_proc_from_field_resolve
70
- -> (_parent_type, parent_object, field_definition, field_args, context, _next) {
71
- context.ast_node = irep_node.ast_node
72
- context.irep_node = irep_node
73
- value = field_definition.resolve(parent_object, field_args, context)
74
- context.ast_node = nil
75
- context.irep_node = nil
76
- value
77
- }
78
- end
79
- end
80
- end
81
- end
82
- end
@@ -1,27 +0,0 @@
1
- module GraphQL
2
- class Query
3
- class SerialExecution
4
- class OperationResolution
5
- attr_reader :target, :execution_context, :irep_node
6
-
7
- def initialize(irep_node, target, execution_context)
8
- @target = target
9
- @irep_node = irep_node
10
- @execution_context = execution_context
11
- end
12
-
13
- def result
14
- execution_context.strategy.selection_resolution.new(
15
- execution_context.query.root_value,
16
- target,
17
- irep_node,
18
- execution_context
19
- ).result
20
- rescue GraphQL::InvalidNullError => err
21
- err.parent_error? || execution_context.add_error(err)
22
- nil
23
- end
24
- end
25
- end
26
- end
27
- end
@@ -1,42 +0,0 @@
1
- module GraphQL
2
- class Query
3
- class SerialExecution
4
- class SelectionResolution
5
- attr_reader :target, :type, :irep_node, :execution_context
6
-
7
- def initialize(target, type, irep_node, execution_context)
8
- @target = target
9
- @type = type
10
- @irep_node = irep_node
11
- @execution_context = execution_context
12
- end
13
-
14
- def result
15
- irep_node.children.each_with_object({}) do |(name, irep_node), memo|
16
- if included_by_directives?(irep_node, execution_context.query) && applies_to_type?(irep_node, type, target)
17
- field_result = execution_context.strategy.field_resolution.new(
18
- irep_node,
19
- type,
20
- target,
21
- execution_context
22
- ).result
23
- memo.merge!(field_result)
24
- end
25
- end
26
- end
27
-
28
- private
29
-
30
- def included_by_directives?(irep_node, query)
31
- GraphQL::Query::DirectiveResolution.include_node?(irep_node, query)
32
- end
33
-
34
- def applies_to_type?(irep_node, type, target)
35
- irep_node.on_types.any? { |child_type|
36
- GraphQL::Query::TypeResolver.new(target, child_type, type, execution_context.query.context).type
37
- }
38
- end
39
- end
40
- end
41
- end
42
- end
@@ -1,107 +0,0 @@
1
- module GraphQL
2
- class Query
3
- class SerialExecution
4
- module ValueResolution
5
- def self.get_strategy_for_kind(kind)
6
- TYPE_KIND_STRATEGIES[kind] || raise("No value resolution strategy for #{kind}!")
7
- end
8
-
9
- class BaseResolution
10
- attr_reader :value, :field_type, :target, :parent_type,
11
- :irep_node, :execution_context
12
- def initialize(value, field_type, target, parent_type, irep_node, execution_context)
13
- @value = value
14
- @field_type = field_type
15
- @target = target
16
- @parent_type = parent_type
17
- @irep_node = irep_node
18
- @execution_context = execution_context
19
- end
20
-
21
- def result
22
- return nil if value.nil? || value.is_a?(GraphQL::ExecutionError)
23
- non_null_result
24
- end
25
-
26
- def non_null_result
27
- raise NotImplementedError, "Should return a value based on initialization params"
28
- end
29
-
30
- def get_strategy_for_kind(*args)
31
- GraphQL::Query::SerialExecution::ValueResolution.get_strategy_for_kind(*args)
32
- end
33
- end
34
-
35
- class ScalarResolution < BaseResolution
36
- # Apply the scalar's defined `coerce_result` method to the value
37
- def non_null_result
38
- field_type.coerce_result(value)
39
- end
40
- end
41
-
42
- class ListResolution < BaseResolution
43
- # For each item in the list,
44
- # Resolve it with the "wrapped" type of this list
45
- def non_null_result
46
- wrapped_type = field_type.of_type
47
- strategy_class = get_strategy_for_kind(wrapped_type.kind)
48
- value.map do |item|
49
- inner_strategy = strategy_class.new(item, wrapped_type, target, parent_type, irep_node, execution_context)
50
- inner_strategy.result
51
- end
52
- end
53
- end
54
-
55
- class HasPossibleTypeResolution < BaseResolution
56
- def non_null_result
57
- resolved_type = field_type.resolve_type(value, execution_context)
58
-
59
- unless resolved_type.is_a?(GraphQL::ObjectType)
60
- raise GraphQL::ObjectType::UnresolvedTypeError.new(irep_node.definition.name, field_type, parent_type)
61
- end
62
-
63
- strategy_class = get_strategy_for_kind(resolved_type.kind)
64
- inner_strategy = strategy_class.new(value, resolved_type, target, parent_type, irep_node, execution_context)
65
- inner_strategy.result
66
- end
67
- end
68
-
69
- class ObjectResolution < BaseResolution
70
- # Resolve the selections on this object
71
- def non_null_result
72
- execution_context.strategy.selection_resolution.new(
73
- value,
74
- field_type,
75
- irep_node,
76
- execution_context
77
- ).result
78
- end
79
- end
80
-
81
- class NonNullResolution < BaseResolution
82
- # Get the "wrapped" type and resolve the value according to that type
83
- def result
84
- if value.nil? || value.is_a?(GraphQL::ExecutionError)
85
- raise GraphQL::InvalidNullError.new(irep_node.definition.name, value)
86
- else
87
- wrapped_type = field_type.of_type
88
- strategy_class = get_strategy_for_kind(wrapped_type.kind)
89
- inner_strategy = strategy_class.new(value, wrapped_type, target, parent_type, irep_node, execution_context)
90
- inner_strategy.result
91
- end
92
- end
93
- end
94
-
95
- TYPE_KIND_STRATEGIES = {
96
- GraphQL::TypeKinds::SCALAR => ScalarResolution,
97
- GraphQL::TypeKinds::LIST => ListResolution,
98
- GraphQL::TypeKinds::OBJECT => ObjectResolution,
99
- GraphQL::TypeKinds::ENUM => ScalarResolution,
100
- GraphQL::TypeKinds::NON_NULL => NonNullResolution,
101
- GraphQL::TypeKinds::INTERFACE => HasPossibleTypeResolution,
102
- GraphQL::TypeKinds::UNION => HasPossibleTypeResolution,
103
- }
104
- end
105
- end
106
- end
107
- end
@@ -1,41 +0,0 @@
1
- module GraphQL
2
- class Query
3
- class SerialExecution
4
- # This is the only required method for an Execution strategy.
5
- # You could create a custom execution strategy and configure your schema to
6
- # use that custom strategy instead.
7
- #
8
- # @param ast_operation [GraphQL::Language::Nodes::OperationDefinition] The operation definition to run
9
- # @param root_type [GraphQL::ObjectType] either the query type or the mutation type
10
- # @param query_obj [GraphQL::Query] the query object for this execution
11
- # @return [Hash] a spec-compliant GraphQL result, as a hash
12
- def execute(ast_operation, root_type, query_object)
13
- irep_root = query_object.internal_representation[ast_operation.name]
14
-
15
- operation_resolution.new(
16
- irep_root,
17
- root_type,
18
- ExecutionContext.new(query_object, self)
19
- ).result
20
- end
21
-
22
- def field_resolution
23
- self.class::FieldResolution
24
- end
25
-
26
- def operation_resolution
27
- self.class::OperationResolution
28
- end
29
-
30
- def selection_resolution
31
- self.class::SelectionResolution
32
- end
33
- end
34
- end
35
- end
36
-
37
- require "graphql/query/serial_execution/execution_context"
38
- require "graphql/query/serial_execution/value_resolution"
39
- require "graphql/query/serial_execution/field_resolution"
40
- require "graphql/query/serial_execution/operation_resolution"
41
- require "graphql/query/serial_execution/selection_resolution"
@@ -1,25 +0,0 @@
1
- module GraphQL
2
- class Query
3
- # Given an object, a type name (from the query) and a type object,
4
- # Return the type that should be used for `object`
5
- # or Return `nil` if it's a mismatch
6
- class TypeResolver
7
- attr_reader :type
8
- def initialize(target, child_type, parent_type, query_ctx)
9
- @type = if child_type.nil?
10
- nil
11
- elsif parent_type.kind.union?
12
- parent_type.resolve_type(target)
13
- elsif child_type.kind.union? && child_type.include?(parent_type)
14
- parent_type
15
- elsif child_type.kind.interface?
16
- child_type.resolve_type(target, query_ctx)
17
- elsif child_type == parent_type
18
- parent_type
19
- else
20
- nil
21
- end
22
- end
23
- end
24
- end
25
- end
@@ -1,53 +0,0 @@
1
- module GraphQL
2
- # The parent type for scalars, eg {GraphQL::STRING_TYPE}, {GraphQL::INT_TYPE}
3
- #
4
- # @example defining a type for Time
5
- # TimeType = GraphQL::ScalarType.define do
6
- # name "Time"
7
- # description "Time since epoch in seconds"
8
- #
9
- # coerce_input ->(value) { Time.at(Float(value)) }
10
- # coerce_result ->(value) { value.to_f }
11
- # end
12
- #
13
- class ScalarType < GraphQL::BaseType
14
- accepts_definitions :coerce, :coerce_input, :coerce_result
15
-
16
- def coerce=(proc)
17
- self.coerce_input = proc
18
- self.coerce_result = proc
19
- end
20
-
21
- def validate_non_null_input(value)
22
- result = Query::InputValidationResult.new
23
- if coerce_non_null_input(value).nil?
24
- result.add_problem("Could not coerce value #{JSON.dump(value)} to #{name}")
25
- end
26
- result
27
- end
28
-
29
- def coerce_non_null_input(value)
30
- @coerce_input_proc.call(value)
31
- end
32
-
33
- def coerce_input=(proc)
34
- if !proc.nil?
35
- @coerce_input_proc = proc
36
- end
37
- end
38
-
39
- def coerce_result(value)
40
- @coerce_result_proc.call(value)
41
- end
42
-
43
- def coerce_result=(proc)
44
- if !proc.nil?
45
- @coerce_result_proc = proc
46
- end
47
- end
48
-
49
- def kind
50
- GraphQL::TypeKinds::SCALAR
51
- end
52
- end
53
- end
@@ -1,34 +0,0 @@
1
- module GraphQL
2
- class Schema
3
- # In early GraphQL versions, errors would be "automatically"
4
- # rescued and replaced with `"Internal error"`. That behavior
5
- # was undesirable but this middleware is offered for people who
6
- # want to preserve it.
7
- #
8
- # It has a couple of differences from the previous behavior:
9
- #
10
- # - Other parts of the query _will_ be run (previously,
11
- # execution would stop when the error was raised and the result
12
- # would have no `"data"` key at all)
13
- # - The entry in {Query::Context#errors} is a {GraphQL::ExecutionError}, _not_
14
- # the originally-raised error.
15
- # - The entry in the `"errors"` key includes the location of the field
16
- # which raised the errors.
17
- #
18
- # @example Use CatchallMiddleware with your schema
19
- # # All errors will be suppressed and replaced with "Internal error" messages
20
- # MySchema.middleware << GraphQL::Schema::CatchallMiddleware
21
- #
22
- module CatchallMiddleware
23
- MESSAGE = "Internal error"
24
-
25
- # Rescue any error and replace it with a {GraphQL::ExecutionError}
26
- # whose message is {MESSAGE}
27
- def self.call(parent_type, parent_object, field_definition, field_args, query_context, next_middleware)
28
- next_middleware.call
29
- rescue StandardError => err
30
- GraphQL::ExecutionError.new(MESSAGE)
31
- end
32
- end
33
- end
34
- end
@@ -1,28 +0,0 @@
1
- module GraphQL
2
- class Schema
3
- # Given {steps} and {arguments}, call steps in order, passing `(*arguments, next_step)`.
4
- #
5
- # Steps should call `next_step.call` to continue the chain, or _not_ call it to stop the chain.
6
- class MiddlewareChain
7
- # @return [Array<#call(*args)>] Steps in this chain, will be called with arguments and `next_middleware`
8
- attr_reader :steps
9
-
10
- # @return [Array] Arguments passed to steps (followed by `next_middleware`)
11
- attr_reader :arguments
12
-
13
- def initialize(steps:, arguments:)
14
- # We're gonna destroy this array, so copy it:
15
- @steps = steps.dup
16
- @arguments = arguments
17
- end
18
-
19
- # Run the next step in the chain, passing in arguments and handle to the next step
20
- def call(next_arguments = @arguments)
21
- @arguments = next_arguments
22
- next_step = steps.shift
23
- next_middleware = self
24
- next_step.call(*arguments, next_middleware)
25
- end
26
- end
27
- end
28
- end
@@ -1,34 +0,0 @@
1
- module GraphQL
2
- class Schema
3
- # Find the members of a union or interface within a given schema.
4
- #
5
- # (Although its members never change, unions are handled this way to simplify execution code.)
6
- #
7
- # Internally, the calculation is cached. It's assumed that schema members _don't_ change after creating the schema!
8
- #
9
- # @example Get an interface's possible types
10
- # possible_types = GraphQL::Schema::PossibleTypes(MySchema)
11
- # possible_types.possible_types(MyInterface)
12
- # # => [MyObjectType, MyOtherObjectType]
13
- class PossibleTypes
14
- def initialize(schema)
15
- @object_types = schema.types.values.select { |type| type.kind.object? }
16
-
17
- @storage = Hash.new do |hash, key|
18
- hash[key] = @object_types.select { |type| type.interfaces.include?(key) }.sort_by(&:name)
19
- end
20
- end
21
-
22
- def possible_types(type_defn)
23
- case type_defn
24
- when GraphQL::UnionType
25
- type_defn.possible_types
26
- when GraphQL::InterfaceType
27
- @storage[type_defn]
28
- else
29
- raise "#{type_defn} doesn't have possible types"
30
- end
31
- end
32
- end
33
- end
34
- end
@@ -1,68 +0,0 @@
1
- module GraphQL
2
- class Schema
3
- module ReduceTypes
4
- # @param types [Array<GraphQL::BaseType>] members of a schema to crawl for all member types
5
- # @return [GraphQL::Schema::TypeMap] `{name => Type}` pairs derived from `types`
6
- def self.reduce(types)
7
- type_map = GraphQL::Schema::TypeMap.new
8
- types.each do |type|
9
- reduce_type(type, type_map, type.name)
10
- end
11
- type_map
12
- end
13
-
14
- private
15
-
16
- # Based on `type`, add members to `type_hash`.
17
- # If `type` has already been visited, just return the `type_hash` as-is
18
- def self.reduce_type(type, type_hash, context_description)
19
- if !type.is_a?(GraphQL::BaseType)
20
- message = "#{context_description} has an invalid type: must be an instance of GraphQL::BaseType, not #{type.class.inspect} (#{type.inspect})"
21
- raise GraphQL::Schema::InvalidTypeError.new(message)
22
- end
23
-
24
- type = type.unwrap
25
-
26
- # Don't re-visit a type
27
- if !type_hash.fetch(type.name, nil).equal?(type)
28
- validate_type(type, context_description)
29
- type_hash[type.name] = type
30
- crawl_type(type, type_hash, context_description)
31
- end
32
- end
33
-
34
- def self.crawl_type(type, type_hash, context_description)
35
- if type.kind.fields?
36
- type.all_fields.each do |field|
37
- reduce_type(field.type, type_hash, "Field #{type.name}.#{field.name}")
38
- field.arguments.each do |name, argument|
39
- reduce_type(argument.type, type_hash, "Argument #{name} on #{type.name}.#{field.name}")
40
- end
41
- end
42
- end
43
- if type.kind.object?
44
- type.interfaces.each do |interface|
45
- reduce_type(interface, type_hash, "Interface on #{type.name}")
46
- end
47
- end
48
- if type.kind.union?
49
- type.possible_types.each do |possible_type|
50
- reduce_type(possible_type, type_hash, "Possible type for #{type.name}")
51
- end
52
- end
53
- if type.kind.input_object?
54
- type.arguments.each do |argument_name, argument|
55
- reduce_type(argument.type, type_hash, "Input field #{type.name}.#{argument_name}")
56
- end
57
- end
58
- end
59
-
60
- def self.validate_type(type, context_description)
61
- error_message = GraphQL::Schema::Validation.validate(type)
62
- if error_message
63
- raise GraphQL::Schema::InvalidTypeError.new("#{context_description} is invalid: #{error_message}")
64
- end
65
- end
66
- end
67
- end
68
- end