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,235 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe GraphQL::Analysis::QueryComplexity do
4
- let(:complexities) { [] }
5
- let(:query_complexity) { GraphQL::Analysis::QueryComplexity.new { |this_query, complexity| complexities << this_query << complexity } }
6
- let(:reduce_result) { GraphQL::Analysis.analyze_query(query, [query_complexity]) }
7
- let(:variables) { {} }
8
- let(:query) { GraphQL::Query.new(DummySchema, query_string, variables: variables) }
9
-
10
- describe "simple queries" do
11
- let(:query_string) {%|
12
- query cheeses($isSkipped: Boolean = false){
13
- # complexity of 3
14
- cheese1: cheese(id: 1) {
15
- id
16
- flavor
17
- }
18
-
19
- # complexity of 4
20
- cheese2: cheese(id: 2) @skip(if: $isSkipped) {
21
- similarCheese(source: SHEEP) {
22
- ... on Cheese {
23
- similarCheese(source: SHEEP) {
24
- id
25
- }
26
- }
27
- }
28
- }
29
- }
30
- |}
31
-
32
- it "sums the complexity" do
33
- reduce_result
34
- assert_equal complexities, [query, 7]
35
- end
36
-
37
- describe "when skipped by directives" do
38
- let(:variables) { { "isSkipped" => true } }
39
- it "doesn't include skipped fields" do
40
- reduce_result
41
- assert_equal complexities, [query, 3]
42
- end
43
- end
44
- end
45
-
46
- describe "query with fragments" do
47
- let(:query_string) {%|
48
- {
49
- # complexity of 3
50
- cheese1: cheese(id: 1) {
51
- id
52
- flavor
53
- }
54
-
55
- # complexity of 7
56
- cheese2: cheese(id: 2) {
57
- ... cheeseFields1
58
- ... cheeseFields2
59
- }
60
- }
61
-
62
- fragment cheeseFields1 on Cheese {
63
- similarCow: similarCheese(source: COW) {
64
- id
65
- ... cheeseFields2
66
- }
67
- }
68
-
69
- fragment cheeseFields2 on Cheese {
70
- similarSheep: similarCheese(source: SHEEP) {
71
- id
72
- }
73
- }
74
- |}
75
-
76
- it "counts all fragment usages, not the definitions" do
77
- reduce_result
78
- assert_equal complexities, [query, 10]
79
- end
80
-
81
- describe "mutually exclusive types" do
82
- let(:query_string) {%|
83
- {
84
- favoriteEdible {
85
- # 1 for everybody
86
- fatContent
87
-
88
- # 1 for everybody
89
- ... on Edible {
90
- origin
91
- }
92
-
93
- # 1 for honey
94
- ... on Sweetener {
95
- sweetness
96
- }
97
-
98
- # 2 for milk
99
- ... milkFields
100
- # 1 for cheese
101
- ... cheeseFields
102
- # 1 for honey
103
- ... honeyFields
104
- # 1 for milk + cheese
105
- ... dairyProductFields
106
- }
107
- }
108
-
109
- fragment milkFields on Milk {
110
- id
111
- source
112
- }
113
-
114
- fragment cheeseFields on Cheese {
115
- source
116
- }
117
-
118
- fragment honeyFields on Honey {
119
- flowerType
120
- }
121
-
122
- fragment dairyProductFields on DairyProduct {
123
- ... on Cheese {
124
- flavor
125
- }
126
-
127
- ... on Milk {
128
- flavors
129
- }
130
- }
131
- |}
132
-
133
- it "gets the max among options" do
134
- reduce_result
135
- assert_equal 5, complexities.last
136
- end
137
- end
138
-
139
-
140
- describe "when there are no selections on any object types" do
141
- let(:query_string) {%|
142
- {
143
- favoriteEdible {
144
- # 1 for everybody
145
- fatContent
146
-
147
- # 1 for everybody
148
- ... on Edible { origin }
149
-
150
- # 1 for honey
151
- ... on Sweetener { sweetness }
152
- }
153
- }
154
- |}
155
-
156
- it "gets the max among interface types" do
157
- reduce_result
158
- assert_equal 3, complexities.last
159
- end
160
- end
161
-
162
- describe "redundant fields" do
163
- let(:query_string) {%|
164
- {
165
- favoriteEdible {
166
- fatContent
167
- # this is executed separately and counts separately:
168
- aliasedFatContent: fatContent
169
-
170
- ... on Edible {
171
- fatContent
172
- }
173
-
174
- ... edibleFields
175
- }
176
- }
177
-
178
- fragment edibleFields on Edible {
179
- fatContent
180
- }
181
- |}
182
-
183
- it "only counts them once" do
184
- reduce_result
185
- assert_equal 3, complexities.last
186
- end
187
- end
188
- end
189
-
190
-
191
- describe "custom complexities" do
192
- let(:query) { GraphQL::Query.new(complexity_schema, query_string) }
193
- let(:complexity_schema) {
194
- complexity_type = GraphQL::ObjectType.define do
195
- name "Complexity"
196
- field :value, types.Int, complexity: 0.1 do
197
- resolve -> (obj, args, ctx) { obj }
198
- end
199
- field :complexity, -> { complexity_type } do
200
- argument :value, types.Int
201
- complexity -> (ctx, args, child_complexity) { args[:value] + child_complexity }
202
- resolve -> (obj, args, ctx) { args[:value] }
203
- end
204
- end
205
-
206
- query_type = GraphQL::ObjectType.define do
207
- name "Query"
208
- field :complexity, -> { complexity_type } do
209
- argument :value, types.Int
210
- complexity -> (ctx, args, child_complexity) { args[:value] + child_complexity }
211
- resolve -> (obj, args, ctx) { args[:value] }
212
- end
213
- end
214
-
215
- GraphQL::Schema.new(query: query_type)
216
- }
217
- let(:query_string) {%|
218
- {
219
- a: complexity(value: 3) { value }
220
- b: complexity(value: 6) {
221
- value
222
- complexity(value: 1) {
223
- value
224
- }
225
- }
226
- }
227
- |}
228
-
229
- it "sums the complexity" do
230
- reduce_result
231
- # 10 from `complexity`, `0.3` from `value`
232
- assert_equal complexities, [query, 10.3]
233
- end
234
- end
235
- end
@@ -1,80 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe GraphQL::Analysis::QueryDepth do
4
- let(:depths) { [] }
5
- let(:query_depth) { GraphQL::Analysis::QueryDepth.new { |query, max_depth| depths << query << max_depth } }
6
- let(:reduce_result) { GraphQL::Analysis.analyze_query(query, [query_depth]) }
7
- let(:query) { GraphQL::Query.new(DummySchema, query_string, variables: variables) }
8
- let(:variables) { {} }
9
-
10
- describe "simple queries" do
11
- let(:query_string) {%|
12
- query cheeses($isIncluded: Boolean = true){
13
- # depth of 2
14
- cheese1: cheese(id: 1) {
15
- id
16
- flavor
17
- }
18
-
19
- # depth of 4
20
- cheese2: cheese(id: 2) @include(if: $isIncluded) {
21
- similarCheese(source: SHEEP) {
22
- ... on Cheese {
23
- similarCheese(source: SHEEP) {
24
- id
25
- }
26
- }
27
- }
28
- }
29
- }
30
- |}
31
-
32
- it "finds the max depth" do
33
- reduce_result
34
- assert_equal depths, [query, 4]
35
- end
36
-
37
- describe "with directives" do
38
- let(:variables) { { "isIncluded" => false } }
39
- it "doesn't count skipped fields" do
40
- reduce_result
41
- assert_equal depths.last, 2
42
- end
43
- end
44
- end
45
-
46
- describe "query with fragments" do
47
- let(:query_string) {%|
48
- {
49
- # depth of 2
50
- cheese1: cheese(id: 1) {
51
- id
52
- flavor
53
- }
54
-
55
- # depth of 4
56
- cheese2: cheese(id: 2) {
57
- ... cheeseFields1
58
- }
59
- }
60
-
61
- fragment cheeseFields1 on Cheese {
62
- similarCheese(source: COW) {
63
- id
64
- ... cheeseFields2
65
- }
66
- }
67
-
68
- fragment cheeseFields2 on Cheese {
69
- similarCheese(source: SHEEP) {
70
- id
71
- }
72
- }
73
- |}
74
-
75
- it "finds the max depth" do
76
- reduce_result
77
- assert_equal depths, [query, 4]
78
- end
79
- end
80
- end
@@ -1,20 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe GraphQL::Argument do
4
- it "is validated at schema build-time" do
5
- query_type = GraphQL::ObjectType.define do
6
- name "Query"
7
- field :invalid, types.Boolean do
8
- argument :invalid, types.Float, default_value: ["123"]
9
- end
10
- end
11
-
12
- err = assert_raises {
13
- schema = GraphQL::Schema.new(query: query_type)
14
- schema.types
15
- }
16
-
17
- expected_error = %|Query is invalid: field "invalid" argument "invalid" default value ["123"] is not valid for type Float|
18
- assert_equal expected_error, err.message
19
- end
20
- end
@@ -1,24 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe GraphQL::BaseType do
4
- it "becomes non-null with !" do
5
- type = GraphQL::EnumType.new
6
- non_null_type = !type
7
- assert_equal(GraphQL::TypeKinds::NON_NULL, non_null_type.kind)
8
- assert_equal(type, non_null_type.of_type)
9
- assert_equal(GraphQL::TypeKinds::NON_NULL, (!GraphQL::STRING_TYPE).kind)
10
- end
11
-
12
- it "can be compared" do
13
- assert_equal(!GraphQL::INT_TYPE, !GraphQL::INT_TYPE)
14
- refute_equal(!GraphQL::FLOAT_TYPE, GraphQL::FLOAT_TYPE)
15
- assert_equal(
16
- GraphQL::ListType.new(of_type: MilkType),
17
- GraphQL::ListType.new(of_type: MilkType)
18
- )
19
- refute_equal(
20
- GraphQL::ListType.new(of_type: MilkType),
21
- GraphQL::ListType.new(of_type: !MilkType)
22
- )
23
- end
24
- end
@@ -1,20 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe GraphQL::BOOLEAN_TYPE do
4
- describe "coerce_input" do
5
- def coerce_input(input)
6
- GraphQL::BOOLEAN_TYPE.coerce_input(input)
7
- end
8
-
9
- it "accepts true and false" do
10
- assert_equal true, coerce_input(true)
11
- assert_equal false, coerce_input(false)
12
- end
13
-
14
- it "rejects other types" do
15
- assert_equal nil, coerce_input("true")
16
- assert_equal nil, coerce_input(5.5)
17
- assert_equal nil, coerce_input(nil)
18
- end
19
- end
20
- end
@@ -1,55 +0,0 @@
1
- require "date"
2
- require "spec_helper"
3
-
4
- module Garden
5
- module DefinePlantBetween
6
- def self.call(plant, plant_range)
7
- plant.start_planting_on = plant_range.begin
8
- plant.end_planting_on = plant_range.end
9
- end
10
- end
11
-
12
- class Vegetable
13
- attr_accessor :name, :start_planting_on, :end_planting_on
14
- include GraphQL::Define::InstanceDefinable
15
- accepts_definitions :name, plant_between: DefinePlantBetween
16
-
17
- # definition added later:
18
- attr_accessor :height
19
- end
20
- end
21
-
22
- describe GraphQL::Define::InstanceDefinable do
23
- describe "extending definitions" do
24
- before do
25
- Garden::Vegetable.accepts_definitions(:height)
26
- end
27
-
28
- after do
29
- Garden::Vegetable.own_dictionary.delete(:height)
30
- end
31
-
32
- it "accepts after-the-fact definitions" do
33
- corn = Garden::Vegetable.define do
34
- name "Corn"
35
- height 8
36
- end
37
-
38
- assert_equal "Corn", corn.name
39
- assert_equal 8, corn.height
40
- end
41
- end
42
-
43
- describe "applying custom definitions" do
44
- it "uses custom callables" do
45
- tomato = Garden::Vegetable.define do
46
- name "Tomato"
47
- plant_between Date.new(2000, 4, 20)..Date.new(2000, 6, 1)
48
- end
49
-
50
- assert_equal "Tomato", tomato.name
51
- assert_equal Date.new(2000, 4, 20), tomato.start_planting_on
52
- assert_equal Date.new(2000, 6, 1), tomato.end_planting_on
53
- end
54
- end
55
- end
@@ -1,77 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe GraphQL::Directive do
4
- let(:result) { DummySchema.execute(query_string, variables: {"t" => true, "f" => false}) }
5
- describe "on fields" do
6
- let(:query_string) { %|query directives($t: Boolean!, $f: Boolean!) {
7
- cheese(id: 1) {
8
- # plain fields:
9
- skipFlavor: flavor @skip(if: true)
10
- dontSkipFlavor: flavor @skip(if: false)
11
- dontSkipDontIncludeFlavor: flavor @skip(if: false), @include(if: false)
12
- skipAndInclude: flavor @skip(if: true), @include(if: true)
13
- includeFlavor: flavor @include(if: $t)
14
- dontIncludeFlavor: flavor @include(if: $f)
15
- # fields in fragments
16
- ... includeIdField
17
- ... dontIncludeIdField
18
- ... skipIdField
19
- ... dontSkipIdField
20
- }
21
- }
22
- fragment includeIdField on Cheese { includeId: id @include(if: true) }
23
- fragment dontIncludeIdField on Cheese { dontIncludeId: id @include(if: false) }
24
- fragment skipIdField on Cheese { skipId: id @skip(if: true) }
25
- fragment dontSkipIdField on Cheese { dontSkipId: id @skip(if: false) }
26
- |
27
- }
28
-
29
- it "intercepts fields" do
30
- expected = { "data" =>{
31
- "cheese" => {
32
- "dontSkipFlavor" => "Brie",
33
- "includeFlavor" => "Brie",
34
- "includeId" => 1,
35
- "dontSkipId" => 1,
36
- },
37
- }}
38
- assert_equal(expected, result)
39
- end
40
- end
41
- describe "on fragments spreads and inline fragments" do
42
- let(:query_string) { %|query directives {
43
- cheese(id: 1) {
44
- ... skipFlavorField @skip(if: true)
45
- ... dontSkipFlavorField @skip(if: false)
46
- ... includeFlavorField @include(if: true)
47
- ... dontIncludeFlavorField @include(if: false)
48
-
49
-
50
- ... on Cheese @skip(if: true) { skipInlineId: id }
51
- ... on Cheese @skip(if: false) { dontSkipInlineId: id }
52
- ... on Cheese @include(if: true) { includeInlineId: id }
53
- ... on Cheese @include(if: false) { dontIncludeInlineId: id }
54
- ... @skip(if: true) { skipNoType: id }
55
- ... @skip(if: false) { dontSkipNoType: id }
56
- }
57
- }
58
- fragment includeFlavorField on Cheese { includeFlavor: flavor }
59
- fragment dontIncludeFlavorField on Cheese { dontIncludeFlavor: flavor }
60
- fragment skipFlavorField on Cheese { skipFlavor: flavor }
61
- fragment dontSkipFlavorField on Cheese { dontSkipFlavor: flavor }
62
- |}
63
-
64
- it "intercepts fragment spreads" do
65
- expected = { "data" => {
66
- "cheese" => {
67
- "dontSkipFlavor" => "Brie",
68
- "includeFlavor" => "Brie",
69
- "dontSkipInlineId" => 1,
70
- "includeInlineId" => 1,
71
- "dontSkipNoType" => 1,
72
- },
73
- }}
74
- assert_equal(expected, result)
75
- end
76
- end
77
- end
@@ -1,31 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe GraphQL::EnumType do
4
- let(:enum) { DairyAnimalEnum }
5
-
6
- it "coerces names to underlying values" do
7
- assert_equal("YAK", enum.coerce_input("YAK"))
8
- assert_equal(1, enum.coerce_input("COW"))
9
- end
10
-
11
- it "coerces invalid names to nil" do
12
- assert_equal(nil, enum.coerce_input("YAKKITY"))
13
- end
14
-
15
- it "coerces result values to value's value" do
16
- assert_equal("YAK", enum.coerce_result("YAK"))
17
- assert_equal("COW", enum.coerce_result(1))
18
- end
19
-
20
- it "has value description" do
21
- assert_equal("Animal with horns", enum.values["GOAT"].description)
22
- end
23
-
24
- describe "validate_input with bad input" do
25
- let(:result) { DairyAnimalEnum.validate_input("bad enum") }
26
-
27
- it "returns an invalid result" do
28
- assert(!result.valid?)
29
- end
30
- end
31
- end
@@ -1,61 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe GraphQL::ExecutionError do
4
- let(:result) { DummySchema.execute(query_string) }
5
- describe "when returned from a field" do
6
- let(:query_string) {%|
7
- {
8
- cheese(id: 1) {
9
- id
10
- error1: similarCheese(source: [YAK]) {
11
- ... similarCheeseFields
12
- }
13
- error2: similarCheese(source: [YAK]) {
14
- ... similarCheeseFields
15
- }
16
- nonError: similarCheese(source: [SHEEP]) {
17
- ... similarCheeseFields
18
- }
19
- flavor
20
- }
21
- executionError
22
- }
23
-
24
- fragment similarCheeseFields on Cheese {
25
- id, flavor
26
- }
27
- |}
28
- it "the error is inserted into the errors key and the rest of the query is fulfilled" do
29
- expected_result = {
30
- "data"=>{
31
- "cheese"=>{
32
- "id" => 1,
33
- "error1"=> nil,
34
- "error2"=> nil,
35
- "nonError"=> {
36
- "id" => 3,
37
- "flavor" => "Manchego",
38
- },
39
- "flavor" => "Brie",
40
- },
41
- "executionError" => nil,
42
- },
43
- "errors"=>[
44
- {
45
- "message"=>"No cheeses are made from Yak milk!",
46
- "locations"=>[{"line"=>5, "column"=>9}]
47
- },
48
- {
49
- "message"=>"No cheeses are made from Yak milk!",
50
- "locations"=>[{"line"=>8, "column"=>9}]
51
- },
52
- {
53
- "message"=>"There was an execution error",
54
- "locations"=>[{"line"=>16, "column"=>7}]
55
- },
56
- ]
57
- }
58
- assert_equal(expected_result, result)
59
- end
60
- end
61
- end
@@ -1,92 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe GraphQL::Field do
4
- it "accepts a proc as type" do
5
- field = GraphQL::Field.define do
6
- type(-> { DairyProductUnion })
7
- end
8
-
9
- assert_equal(DairyProductUnion, field.type)
10
- end
11
-
12
- it "accepts a string as a type" do
13
- field = GraphQL::Field.define do
14
- type("DairyProductUnion")
15
- end
16
-
17
- assert_equal(DairyProductUnion, field.type)
18
- end
19
-
20
-
21
- describe ".property " do
22
- let(:field) do
23
- GraphQL::Field.define do
24
- name "field_name"
25
- # satisfies 'can define by config' below
26
- property :internal_prop
27
- end
28
- end
29
-
30
- it "can define by config" do
31
- assert_equal(field.property, :internal_prop)
32
- end
33
-
34
- it "has nil property if not defined" do
35
- no_prop_field = GraphQL::Field.define { }
36
- assert_equal(no_prop_field.property, nil)
37
- end
38
-
39
- describe "default resolver" do
40
- def acts_like_default_resolver(field, old_prop, new_prop)
41
- object = OpenStruct.new(old_prop => "old value", new_prop => "new value", field.name.to_sym => "unset value")
42
-
43
-
44
- old_result = field.resolve(object, nil, nil)
45
- field.property = new_prop
46
- new_result = field.resolve(object, nil, nil)
47
- field.property = nil
48
- unset_result = field.resolve(object, nil, nil)
49
-
50
- assert_equal(old_result, "old value")
51
- assert_equal(new_result, "new value")
52
- assert_equal(unset_result, "unset value")
53
- end
54
-
55
- it "responds to changes in property" do
56
- acts_like_default_resolver(field, :internal_prop, :new_prop)
57
- end
58
-
59
- it "is reassigned if resolve is set to nil" do
60
- field.resolve = nil
61
- acts_like_default_resolver(field, :internal_prop, :new_prop)
62
- end
63
- end
64
- end
65
-
66
- describe "#name" do
67
- it "can't be reassigned" do
68
- field = GraphQL::Field.define do
69
- name("something")
70
- end
71
- assert_equal "something", field.name
72
- assert_raises { field.name = "somethingelse" }
73
- assert_equal "something", field.name
74
- end
75
-
76
- it "must be a string" do
77
- dummy_query = GraphQL::ObjectType.define do
78
- name "QueryType"
79
- end
80
-
81
- invalid_field = GraphQL::Field.new
82
- invalid_field.type = dummy_query
83
- invalid_field.name = :symbol_name
84
-
85
- dummy_query.fields["symbol_name"] = invalid_field
86
- dummy_schema = GraphQL::Schema.new(query: dummy_query)
87
-
88
- err = assert_raises(GraphQL::Schema::InvalidTypeError) { dummy_schema.types }
89
- assert_equal "QueryType is invalid: field :symbol_name name must return String, not Symbol (:symbol_name)", err.message
90
- end
91
- end
92
- end