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,42 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe GraphQL::Language::Generation do
4
- let(:document) { GraphQL::Language::Parser.parse(query_string) }
5
- let(:query_string) {%|
6
- query getStuff($someVar: Int = 1, $anotherVar: [String!]) @skip(if: false) {
7
- myField: someField(someArg: $someVar, ok: 1.4) @skip(if: $anotherVar) @thing(or: "Whatever")
8
- anotherField(someArg: [1, 2, 3]) {
9
- nestedField
10
- ... moreNestedFields @skip(if: true)
11
- }
12
- ... on OtherType @include(unless: false) {
13
- field(arg: [{key: "value", anotherKey: 0.9, anotherAnotherKey: WHATEVER}])
14
- anotherField
15
- }
16
- ... {
17
- id
18
- }
19
- }
20
- fragment moreNestedFields on NestedType @or(something: "ok") {
21
- anotherNestedField
22
- }
23
- |}
24
-
25
- describe ".generate" do
26
- it "generates query string" do
27
- assert_equal query_string.gsub(/^ /, "").strip, document.to_query_string
28
- end
29
-
30
- describe "inputs" do
31
- let(:query_string) {%|
32
- query {
33
- field(int: 3, float: 4.7e-24, bool: false, string: "☀︎🏆\\n escaped \\" unicode ¶ /", enum: ENUM_NAME, array: [7, 8, 9], object: {a: [1, 2, 3], b: {c: "4"}}, unicode_bom: "\xef\xbb\xbfquery")
34
- }
35
- |}
36
-
37
- it "generate" do
38
- assert_equal query_string.gsub(/^ /, "").strip, document.to_query_string
39
- end
40
- end
41
- end
42
- end
@@ -1,442 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe GraphQL::Language::Parser do
4
- let(:document) { GraphQL::Language::Parser.parse(query_string) }
5
- let(:query_string) {%|
6
- query getStuff($someVar: Int = 1, $anotherVar: [String!] ) @skip(if: false) {
7
- myField: someField(someArg: $someVar, ok: 1.4) @skip(if: $anotherVar) @thing(or: "Whatever")
8
-
9
- anotherField(someArg: [1,2,3]) {
10
- nestedField
11
- ... moreNestedFields @skip(if: true)
12
- }
13
-
14
- ... on OtherType @include(unless: false){
15
- field(arg: [{key: "value", anotherKey: 0.9, anotherAnotherKey: WHATEVER}])
16
- anotherField
17
- }
18
-
19
- ... {
20
- id
21
- }
22
- }
23
-
24
- fragment moreNestedFields on NestedType @or(something: "ok") {
25
- anotherNestedField
26
- }
27
- |}
28
-
29
- describe ".parse" do
30
- it "parses queries" do
31
- assert document
32
- end
33
-
34
- describe "visited nodes" do
35
- let(:query) { document.definitions.first }
36
- let(:fragment_def) { document.definitions.last }
37
-
38
- it "creates a valid document" do
39
- assert document.is_a?(GraphQL::Language::Nodes::Document)
40
- assert_equal 2, document.definitions.length
41
- end
42
-
43
- it "creates a valid operation" do
44
- assert query.is_a?(GraphQL::Language::Nodes::OperationDefinition)
45
- assert_equal "getStuff", query.name
46
- assert_equal "query", query.operation_type
47
- assert_equal 2, query.variables.length
48
- assert_equal 4, query.selections.length
49
- assert_equal 1, query.directives.length
50
- assert_equal [2, 5], [query.line, query.col]
51
- end
52
-
53
- it "creates a valid fragment definition" do
54
- assert fragment_def.is_a?(GraphQL::Language::Nodes::FragmentDefinition)
55
- assert_equal "moreNestedFields", fragment_def.name
56
- assert_equal 1, fragment_def.selections.length
57
- assert_equal "NestedType", fragment_def.type
58
- assert_equal 1, fragment_def.directives.length
59
- assert_equal [20, 5], fragment_def.position
60
- end
61
-
62
- describe "variable definitions" do
63
- let(:optional_var) { query.variables.first }
64
- it "gets name and type" do
65
- assert_equal "someVar", optional_var.name
66
- assert_equal "Int", optional_var.type.name
67
- end
68
-
69
- it "gets default value" do
70
- assert_equal 1, optional_var.default_value
71
- end
72
-
73
- it "gets position info" do
74
- assert_equal [2, 20], optional_var.position
75
- end
76
- end
77
-
78
- describe "fields" do
79
- let(:leaf_field) { query.selections.first }
80
- let(:parent_field) { query.selections[1] }
81
-
82
- it "gets name, alias, arguments and directives" do
83
- assert_equal "someField", leaf_field.name
84
- assert_equal "myField", leaf_field.alias
85
- assert_equal 2, leaf_field.directives.length
86
- assert_equal 2, leaf_field.arguments.length
87
- end
88
-
89
- it "gets nested fields" do
90
- assert_equal 2, parent_field.selections.length
91
- end
92
-
93
- it "gets location info" do
94
- assert_equal [3 ,7], leaf_field.position
95
- end
96
-
97
- describe "when the arguments list is empty" do
98
- let(:query_string) { "{ field() }"}
99
- let(:field) { query.selections.first }
100
- it "has zero arguments" do
101
- assert_equal 0, field.arguments.length
102
- end
103
- end
104
-
105
- describe "when selections are empty" do
106
- let(:query_string) { "{ field { } }"}
107
- let(:field) { query.selections.first }
108
- it "has zero selections" do
109
- assert_equal 0, field.selections.length
110
- end
111
- end
112
- end
113
-
114
- describe "arguments" do
115
- let(:literal_argument) { query.selections.first.arguments.last }
116
- let(:variable_argument) { query.selections.first.arguments.first }
117
-
118
- it "gets name and literal value" do
119
- assert_equal "ok", literal_argument.name
120
- assert_equal 1.4, literal_argument.value
121
- end
122
-
123
- it "gets name and variable value" do
124
- assert_equal "someArg", variable_argument.name
125
- assert_equal "someVar", variable_argument.value.name
126
- end
127
-
128
-
129
- it "gets position info" do
130
- assert_equal [3, 26], variable_argument.position
131
- end
132
- end
133
-
134
- describe "fragment spreads" do
135
- let(:fragment_spread) { query.selections[1].selections.last }
136
- it "gets the name and directives" do
137
- assert_equal "moreNestedFields", fragment_spread.name
138
- assert_equal 1, fragment_spread.directives.length
139
- end
140
-
141
- it "gets position info" do
142
- assert_equal [7, 9], fragment_spread.position
143
- end
144
- end
145
-
146
- describe "directives" do
147
- let(:variable_directive) { query.selections.first.directives.first }
148
-
149
- it "gets the name and arguments" do
150
- assert_equal "skip", variable_directive.name
151
- assert_equal "if", variable_directive.arguments.first.name
152
- assert_equal 1, variable_directive.arguments.length
153
- end
154
-
155
- it "gets position info" do
156
- assert_equal [3, 54], variable_directive.position
157
- end
158
- end
159
-
160
- describe "inline fragments" do
161
- let(:inline_fragment) { query.selections[2] }
162
- let(:typeless_inline_fragment) { query.selections[3] }
163
-
164
- it "gets the type and directives" do
165
- assert_equal "OtherType", inline_fragment.type
166
- assert_equal 2, inline_fragment.selections.length
167
- assert_equal 1, inline_fragment.directives.length
168
- end
169
-
170
- it "gets inline fragments without type conditions" do
171
- assert_equal nil, typeless_inline_fragment.type
172
- assert_equal 1, typeless_inline_fragment.selections.length
173
- assert_equal 0, typeless_inline_fragment.directives.length
174
- end
175
-
176
- it "gets position info" do
177
- assert_equal [10, 7], inline_fragment.position
178
- end
179
- end
180
-
181
- describe "inputs" do
182
- let(:query_string) {%|
183
- {
184
- field(
185
- int: 3,
186
- float: 4.7e-24,
187
- bool: false,
188
- string: "☀︎🏆\\n escaped \\" unicode \\u00b6 /",
189
- enum: ENUM_NAME,
190
- array: [7, 8, 9]
191
- object: {a: [1,2,3], b: {c: "4"}}
192
- unicode_bom: "\xef\xbb\xbfquery"
193
- )
194
- }
195
- |}
196
-
197
- let(:inputs) { document.definitions.first.selections.first.arguments }
198
-
199
- it "parses ints" do
200
- assert_equal 3, inputs[0].value
201
- end
202
-
203
- it "parses floats" do
204
- assert_equal 0.47e-23, inputs[1].value
205
- end
206
-
207
- it "parses booleans" do
208
- assert_equal false, inputs[2].value
209
- end
210
-
211
- it "parses UTF-8 strings" do
212
- assert_equal %|☀︎🏆\n escaped " unicode ¶ /|, inputs[3].value
213
- end
214
-
215
- it "parses enums" do
216
- assert_instance_of GraphQL::Language::Nodes::Enum, inputs[4].value
217
- assert_equal "ENUM_NAME", inputs[4].value.name
218
- end
219
-
220
- it "parses arrays" do
221
- assert_equal [7,8,9], inputs[5].value
222
- end
223
-
224
- it "parses objects" do
225
- obj = inputs[6].value
226
- assert_equal "a", obj.arguments[0].name
227
- assert_equal [1,2,3], obj.arguments[0].value
228
- assert_equal "b", obj.arguments[1].name
229
- assert_equal "c", obj.arguments[1].value.arguments[0].name
230
- assert_equal "4", obj.arguments[1].value.arguments[0].value
231
- end
232
-
233
- it "parses unicode bom" do
234
- obj = inputs[7].value
235
- assert_equal %|\xef\xbb\xbfquery|, inputs[7].value
236
- end
237
- end
238
- end
239
-
240
- describe "unnamed queries" do
241
- let(:query_string) {%|
242
- { name, age, height }
243
- |}
244
- let(:operation) { document.definitions.first }
245
-
246
- it "parses unnamed queries" do
247
- assert_equal 1, document.definitions.length
248
- assert_equal "query", operation.operation_type
249
- assert_equal nil, operation.name
250
- assert_equal 3, operation.selections.length
251
- end
252
- end
253
-
254
- describe "introspection query" do
255
- let(:query_string) { GraphQL::Introspection::INTROSPECTION_QUERY }
256
-
257
- it "parses a big ol' query" do
258
- assert(document)
259
- end
260
- end
261
- end
262
-
263
- describe "errors" do
264
- let(:query_string) {%| query doSomething { bogus { } |}
265
- it "raises a parse error" do
266
- err = assert_raises(GraphQL::ParseError) { document }
267
- end
268
-
269
- it "correctly identifies parse error location and content" do
270
- e = assert_raises(GraphQL::ParseError) do
271
- GraphQL.parse("
272
- query getCoupons {
273
- allCoupons: {data{id}}
274
- }
275
- ")
276
- end
277
- assert_includes(e.message, '"{"')
278
- assert_includes(e.message, "RCURLY")
279
- assert_equal(3, e.line)
280
- assert_equal(25, e.col)
281
- end
282
-
283
- it "handles unexpected ends" do
284
- err = assert_raises { GraphQL.parse("{ ") }
285
- assert_equal "Unexpected end of document", err.message
286
- end
287
-
288
- it "rejects unsupported characters" do
289
- e = assert_raises(GraphQL::ParseError) do
290
- GraphQL.parse("{ field; }")
291
- end
292
-
293
- assert_includes(e.message, "Parse error on \";\"")
294
- end
295
-
296
- it "rejects control characters" do
297
- e = assert_raises(GraphQL::ParseError) do
298
- GraphQL.parse("{ \afield }")
299
- end
300
-
301
- assert_includes(e.message, "Parse error on \"\\a\"")
302
- end
303
-
304
- it "rejects partial BOM" do
305
- e = assert_raises(GraphQL::ParseError) do
306
- GraphQL.parse("{ \xeffield }")
307
- end
308
-
309
- assert_includes(e.message, "Parse error on \"\\xEF\"")
310
- end
311
-
312
- it "rejects vertical tabs" do
313
- e = assert_raises(GraphQL::ParseError) do
314
- GraphQL.parse("{ \vfield }")
315
- end
316
-
317
- assert_includes(e.message, "Parse error on \"\\v\"")
318
- end
319
-
320
- it "rejects form feed" do
321
- e = assert_raises(GraphQL::ParseError) do
322
- GraphQL.parse("{ \ffield }")
323
- end
324
-
325
- assert_includes(e.message, "Parse error on \"\\f\"")
326
- end
327
-
328
- it "rejects no break space" do
329
- e = assert_raises(GraphQL::ParseError) do
330
- GraphQL.parse("{ \xa0field }")
331
- end
332
-
333
- assert_includes(e.message, "Parse error on \"\\xA0\"")
334
- end
335
-
336
- it "rejects unterminated strings" do
337
- e = assert_raises(GraphQL::ParseError) do
338
- GraphQL.parse("\"")
339
- end
340
-
341
- assert_includes(e.message, "Parse error on \"\\\"\"")
342
-
343
- e = assert_raises(GraphQL::ParseError) do
344
- GraphQL.parse("\"\n\"")
345
- end
346
-
347
- assert_includes(e.message, "Parse error on \"\\n\"")
348
- end
349
-
350
- it "rejects bad escape sequence in strings" do
351
- e = assert_raises(GraphQL::ParseError) do
352
- GraphQL.parse("{ field(arg:\"\\x\") }")
353
- end
354
-
355
- assert_includes(e.message, "Parse error on bad Unicode escape sequence")
356
- end
357
-
358
- it "rejects incomplete escape sequence in strings" do
359
- e = assert_raises(GraphQL::ParseError) do
360
- GraphQL.parse("{ field(arg:\"\\u1\") }")
361
- end
362
-
363
- assert_includes(e.message, "bad Unicode escape sequence")
364
- end
365
-
366
- it "rejects unicode escape with bad chars" do
367
- e = assert_raises(GraphQL::ParseError) do
368
- GraphQL.parse("{ field(arg:\"\\u0XX1\") }")
369
- end
370
-
371
- assert_includes(e.message, "bad Unicode escape sequence")
372
-
373
- e = assert_raises(GraphQL::ParseError) do
374
- GraphQL.parse("{ field(arg:\"\\uXXXX\") }")
375
- end
376
-
377
- assert_includes(e.message, "bad Unicode escape sequence")
378
-
379
-
380
- e = assert_raises(GraphQL::ParseError) do
381
- GraphQL.parse("{ field(arg:\"\\uFXXX\") }")
382
- end
383
-
384
- assert_includes(e.message, "bad Unicode escape sequence")
385
-
386
-
387
- e = assert_raises(GraphQL::ParseError) do
388
- GraphQL.parse("{ field(arg:\"\\uXXXF\") }")
389
- end
390
-
391
- assert_includes(e.message, "bad Unicode escape sequence")
392
- end
393
-
394
- it "rejects fragments named 'on'" do
395
- e = assert_raises(GraphQL::ParseError) do
396
- GraphQL.parse("fragment on on on { on }")
397
- end
398
-
399
- assert_includes(e.message, "Parse error on \"on\"")
400
- end
401
-
402
- it "rejects fragment spread of 'on'" do
403
- e = assert_raises(GraphQL::ParseError) do
404
- GraphQL.parse("{ ...on }")
405
- end
406
-
407
- assert_includes(e.message, "Parse error on \"}\"")
408
- end
409
-
410
- it "rejects null value" do
411
- e = assert_raises(GraphQL::ParseError) do
412
- GraphQL.parse("{ fieldWithNullableStringInput(input: null) }")
413
- end
414
-
415
- assert_includes(e.message, "Parse error on \"null\"")
416
- end
417
- end
418
-
419
-
420
- describe "whitespace" do
421
- describe "whitespace-only queries" do
422
- let(:query_string) { " " }
423
- it "doesn't blow up" do
424
- assert_equal [], document.definitions
425
- end
426
- end
427
-
428
- describe "empty string queries" do
429
- let(:query_string) { "" }
430
- it "doesn't blow up" do
431
- assert_equal [], document.definitions
432
- end
433
- end
434
-
435
- describe "using tabs as whitespace" do
436
- let(:query_string) { "\t{\t\tid, \tname}"}
437
- it "parses the query" do
438
- assert_equal 1, document.definitions.length
439
- end
440
- end
441
- end
442
- end
@@ -1,49 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe GraphQL::Language::Visitor do
4
- let(:document) { GraphQL.parse("
5
- query cheese {
6
- cheese(id: 1) {
7
- flavor,
8
- source,
9
- producers(first: 3) {
10
- name
11
- }
12
- ... cheeseFields
13
- }
14
- }
15
-
16
- fragment cheeseFields on Cheese { flavor }
17
- ")}
18
- let(:counts) { {fields_entered: 0, arguments_entered: 0, arguments_left: 0, argument_names: []} }
19
-
20
- let(:visitor) do
21
- v = GraphQL::Language::Visitor.new(document)
22
- v[GraphQL::Language::Nodes::Field] << -> (node, parent) { counts[:fields_entered] += 1 }
23
- # two ways to set up enter hooks:
24
- v[GraphQL::Language::Nodes::Argument] << -> (node, parent) { counts[:argument_names] << node.name }
25
- v[GraphQL::Language::Nodes::Argument].enter << -> (node, parent) { counts[:arguments_entered] += 1}
26
- v[GraphQL::Language::Nodes::Argument].leave << -> (node, parent) { counts[:arguments_left] += 1 }
27
-
28
- v[GraphQL::Language::Nodes::Document].leave << -> (node, parent) { counts[:finished] = true }
29
- v
30
- end
31
-
32
- it "calls hooks during a depth-first tree traversal" do
33
- assert_equal(2, visitor[GraphQL::Language::Nodes::Argument].enter.length)
34
- visitor.visit
35
- assert_equal(6, counts[:fields_entered])
36
- assert_equal(2, counts[:arguments_entered])
37
- assert_equal(2, counts[:arguments_left])
38
- assert_equal(["id", "first"], counts[:argument_names])
39
- assert(counts[:finished])
40
- end
41
-
42
- describe "Visitor::SKIP" do
43
- it "skips the rest of the node" do
44
- visitor[GraphQL::Language::Nodes::Document] << -> (node, parent) { GraphQL::Language::Visitor::SKIP }
45
- visitor.visit
46
- assert_equal(0, counts[:fields_entered])
47
- end
48
- end
49
- end
@@ -1,32 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe GraphQL::ListType do
4
- let(:float_list) { GraphQL::ListType.new(of_type: GraphQL::FLOAT_TYPE) }
5
-
6
- it "coerces elements in the list" do
7
- assert_equal([1.0, 2.0, 3.0].inspect, float_list.coerce_input([1, 2, 3]).inspect)
8
- end
9
-
10
- describe "validate_input with bad input" do
11
- let(:bad_num) { "bad_num" }
12
- let(:result) { float_list.validate_input([bad_num, 2.0, 3.0]) }
13
-
14
- it "returns an invalid result" do
15
- assert(!result.valid?)
16
- end
17
-
18
- it "has one problem" do
19
- assert_equal(result.problems.length, 1)
20
- end
21
-
22
- it "has path [0]" do
23
- assert_equal(result.problems[0]["path"], [0])
24
- end
25
-
26
- it "has the correct explanation" do
27
- expected = GraphQL::FLOAT_TYPE.validate_input(bad_num).problems[0]["explanation"]
28
- actual = result.problems[0]["explanation"]
29
- assert_equal(actual, expected)
30
- end
31
- end
32
- end
@@ -1,31 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe GraphQL::NonNullType do
4
- describe "when a non-null field returns null" do
5
- it "nulls out the parent selection" do
6
- query_string = %|{ cow { name cantBeNullButIs } }|
7
- result = DummySchema.execute(query_string)
8
- assert_equal({"cow" => nil }, result["data"])
9
- assert_equal([{"message"=>"Cannot return null for non-nullable field cantBeNullButIs"}], result["errors"])
10
- end
11
-
12
- it "propagates the null up to the next nullable field" do
13
- query_string = %|
14
- {
15
- nn1: deepNonNull {
16
- nni1: nonNullInt(returning: 1)
17
- nn2: deepNonNull {
18
- nni2: nonNullInt(returning: 2)
19
- nn3: deepNonNull {
20
- nni3: nonNullInt
21
- }
22
- }
23
- }
24
- }
25
- |
26
- result = DummySchema.execute(query_string)
27
- assert_equal(nil, result["data"])
28
- assert_equal([{"message"=>"Cannot return null for non-nullable field nonNullInt"}], result["errors"])
29
- end
30
- end
31
- end
@@ -1,42 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe GraphQL::ObjectType do
4
- let(:type) { CheeseType }
5
-
6
- it "has a name" do
7
- assert_equal("Cheese", type.name)
8
- type.name = "Fromage"
9
- assert_equal("Fromage", type.name)
10
- type.name = "Cheese"
11
- end
12
-
13
- it "has a description" do
14
- assert_equal(22, type.description.length)
15
- end
16
-
17
- it "may have interfaces" do
18
- assert_equal([EdibleInterface, AnimalProductInterface], type.interfaces)
19
- end
20
-
21
- describe '#get_field ' do
22
- it "exposes fields" do
23
- field = type.get_field("id")
24
- assert_equal(GraphQL::TypeKinds::NON_NULL, field.type.kind)
25
- assert_equal(GraphQL::TypeKinds::SCALAR, field.type.of_type.kind)
26
- end
27
-
28
- it "exposes defined field property" do
29
- field_without_prop = CheeseType.get_field("flavor")
30
- field_with_prop = CheeseType.get_field("fatContent")
31
- assert_equal(field_without_prop.property, nil)
32
- assert_equal(field_with_prop.property, :fat_content)
33
- end
34
-
35
- it "looks up from interfaces" do
36
- field_from_self = CheeseType.get_field("fatContent")
37
- field_from_iface = MilkType.get_field("fatContent")
38
- assert_equal(field_from_self.property, :fat_content)
39
- assert_equal(field_from_iface.property, nil)
40
- end
41
- end
42
- end
@@ -1,25 +0,0 @@
1
- require "spec_helper"
2
-
3
- describe GraphQL::Query::Arguments do
4
- let(:arguments) { GraphQL::Query::Arguments.new({ a: 1, b: 2, c: GraphQL::Query::Arguments.new({ d: 3, e: 4}) }) }
5
-
6
- it "returns keys as strings" do
7
- assert_equal(["a", "b", "c"], arguments.keys)
8
- end
9
-
10
- it "delegates values to values hash" do
11
- assert_equal([1, 2, {"d" => 3, "e" => 4}], arguments.values)
12
- end
13
-
14
- it "delegates each to values hash" do
15
- pairs = []
16
- arguments.each do |key, value|
17
- pairs << [key, value]
18
- end
19
- assert_equal([["a", 1], ["b", 2], ["c", {"d" => 3, "e" => 4}]], pairs)
20
- end
21
-
22
- it "returns original Ruby hash values with to_h" do
23
- assert_equal({ a: 1, b: 2, c: { d: 3, e: 4 } }, arguments.to_h)
24
- end
25
- end