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
@@ -2,19 +2,24 @@ class GraphQL::Language::Parser
2
2
  rule
3
3
  target: document
4
4
 
5
- document: definitions_list { return make_node(:Document, definitions: val[0])}
5
+ document: definitions_list { result = make_node(:Document, definitions: val[0])}
6
6
 
7
7
  definitions_list:
8
- definition { return [val[0]]}
8
+ definition { result = [val[0]]}
9
9
  | definitions_list definition { val[0] << val[1] }
10
10
 
11
11
  definition:
12
+ executable_definition
13
+ | type_system_definition
14
+ | type_system_extension
15
+
16
+ executable_definition:
12
17
  operation_definition
13
18
  | fragment_definition
14
19
 
15
20
  operation_definition:
16
21
  operation_type operation_name_opt variable_definitions_opt directives_list_opt selection_set {
17
- return make_node(
22
+ result = make_node(
18
23
  :OperationDefinition, {
19
24
  operation_type: val[0],
20
25
  name: val[1],
@@ -25,11 +30,21 @@ rule
25
30
  }
26
31
  )
27
32
  }
28
- | selection_set {
29
- return make_node(
33
+ | LCURLY selection_list RCURLY {
34
+ result = make_node(
35
+ :OperationDefinition, {
36
+ operation_type: "query",
37
+ selections: val[1],
38
+ position_source: val[0],
39
+ }
40
+ )
41
+ }
42
+ | LCURLY RCURLY {
43
+ result = make_node(
30
44
  :OperationDefinition, {
31
45
  operation_type: "query",
32
- selections: val[0],
46
+ selections: [],
47
+ position_source: val[0],
33
48
  }
34
49
  )
35
50
  }
@@ -40,20 +55,20 @@ rule
40
55
  | SUBSCRIPTION
41
56
 
42
57
  operation_name_opt:
43
- /* none */ { return nil }
58
+ /* none */ { result = nil }
44
59
  | name
45
60
 
46
61
  variable_definitions_opt:
47
- /* none */ { return [] }
48
- | RPAREN variable_definitions_list LPAREN { return val[1] }
62
+ /* none */ { result = EMPTY_ARRAY }
63
+ | LPAREN variable_definitions_list RPAREN { result = val[1] }
49
64
 
50
65
  variable_definitions_list:
51
- variable_definition { return [val[0]] }
66
+ variable_definition { result = [val[0]] }
52
67
  | variable_definitions_list variable_definition { val[0] << val[1] }
53
68
 
54
69
  variable_definition:
55
- VAR_SIGN name COLON variable_definition_type_name variable_definition_default_value_opt {
56
- return make_node(:VariableDefinition, {
70
+ VAR_SIGN name COLON type default_value_opt {
71
+ result = make_node(:VariableDefinition, {
57
72
  name: val[1],
58
73
  type: val[3],
59
74
  default_value: val[4],
@@ -61,25 +76,27 @@ rule
61
76
  })
62
77
  }
63
78
 
64
- variable_definition_type_name:
65
- name { return make_node(:TypeName, name: val[0])}
66
- | variable_definition_type_name BANG { return make_node(:NonNullType, of_type: val[0]) }
67
- | RBRACKET variable_definition_type_name LBRACKET { return make_node(:ListType, of_type: val[1]) }
79
+ type:
80
+ nullable_type { result = val[0] }
81
+ | nullable_type BANG { result = make_node(:NonNullType, of_type: val[0]) }
68
82
 
69
- variable_definition_default_value_opt:
70
- /* none */ { return nil }
71
- | EQUALS input_value { return val[1] }
83
+ nullable_type:
84
+ name { result = make_node(:TypeName, name: val[0])}
85
+ | LBRACKET type RBRACKET { result = make_node(:ListType, of_type: val[1]) }
86
+
87
+ default_value_opt:
88
+ /* none */ { result = nil }
89
+ | EQUALS literal_value { result = val[1] }
72
90
 
73
91
  selection_set:
74
- RCURLY LCURLY { return [] }
75
- | RCURLY selection_list LCURLY { return val[1] }
92
+ LCURLY selection_list RCURLY { result = val[1] }
76
93
 
77
94
  selection_set_opt:
78
- /* none */ { return [] }
79
- | selection_set { return val[0] }
95
+ /* none */ { result = EMPTY_ARRAY }
96
+ | selection_set { result = val[0] }
80
97
 
81
98
  selection_list:
82
- selection { return [result] }
99
+ selection { result = [result] }
83
100
  | selection_list selection { val[0] << val[1] }
84
101
 
85
102
  selection:
@@ -89,7 +106,7 @@ rule
89
106
 
90
107
  field:
91
108
  name arguments_opt directives_list_opt selection_set_opt {
92
- return make_node(
109
+ result = make_node(
93
110
  :Field, {
94
111
  name: val[0],
95
112
  arguments: val[1],
@@ -100,7 +117,7 @@ rule
100
117
  )
101
118
  }
102
119
  | name COLON name arguments_opt directives_list_opt selection_set_opt {
103
- return make_node(
120
+ result = make_node(
104
121
  :Field, {
105
122
  alias: val[0],
106
123
  name: val[2],
@@ -116,77 +133,120 @@ rule
116
133
  name_without_on
117
134
  | ON
118
135
 
136
+ schema_keyword:
137
+ SCHEMA
138
+ | SCALAR
139
+ | TYPE
140
+ | IMPLEMENTS
141
+ | INTERFACE
142
+ | UNION
143
+ | ENUM
144
+ | INPUT
145
+ | DIRECTIVE
146
+
119
147
  name_without_on:
120
148
  IDENTIFIER
121
149
  | FRAGMENT
150
+ | REPEATABLE
122
151
  | TRUE
123
152
  | FALSE
124
- | QUERY
125
- | MUTATION
126
- | SUBSCRIPTION
153
+ | operation_type
154
+ | schema_keyword
155
+
156
+ enum_name: /* any identifier, but not "true", "false" or "null" */
157
+ IDENTIFIER
158
+ | FRAGMENT
159
+ | REPEATABLE
160
+ | ON
161
+ | operation_type
162
+ | schema_keyword
163
+
164
+ enum_value_definition:
165
+ description_opt enum_name directives_list_opt { result = make_node(:EnumValueDefinition, name: val[1], directives: val[2], description: val[0] || get_description(val[1]), definition_line: val[1].line, position_source: val[0] || val[1]) }
166
+
167
+ enum_value_definitions:
168
+ enum_value_definition { result = [val[0]] }
169
+ | enum_value_definitions enum_value_definition { result = val[0] << val[1] }
127
170
 
128
171
  arguments_opt:
129
- /* none */ { return [] }
130
- | RPAREN LPAREN { return [] }
131
- | RPAREN arguments_list LPAREN { return val[1] }
172
+ /* none */ { result = EMPTY_ARRAY }
173
+ | LPAREN arguments_list RPAREN { result = val[1] }
132
174
 
133
175
  arguments_list:
134
- argument { return [val[0]] }
176
+ argument { result = [val[0]] }
135
177
  | arguments_list argument { val[0] << val[1] }
136
178
 
137
179
  argument:
138
- name COLON input_value { return make_node(:Argument, name: val[0], value: val[2], position_source: val[0])}
180
+ name COLON input_value { result = make_node(:Argument, name: val[0], value: val[2], position_source: val[0])}
181
+
182
+ literal_value:
183
+ FLOAT { result = val[0].to_f }
184
+ | INT { result = val[0].to_i }
185
+ | STRING { result = val[0].to_s }
186
+ | TRUE { result = true }
187
+ | FALSE { result = false }
188
+ | null_value
189
+ | enum_value
190
+ | list_value
191
+ | object_literal_value
139
192
 
140
193
  input_value:
141
- FLOAT { return val[0].to_f }
142
- | INT { return val[0].to_i }
143
- | STRING { return val[0].to_s }
144
- | TRUE { return true }
145
- | FALSE { return false }
194
+ literal_value
146
195
  | variable
147
- | list_value
148
196
  | object_value
149
- | enum_value
150
197
 
151
- variable: VAR_SIGN name { return make_node(:VariableIdentifier, name: val[1], position_source: val[0]) }
198
+ null_value: NULL { result = make_node(:NullValue, name: val[0], position_source: val[0]) }
199
+ variable: VAR_SIGN name { result = make_node(:VariableIdentifier, name: val[1], position_source: val[0]) }
152
200
 
153
201
  list_value:
154
- RBRACKET LBRACKET { return [] }
155
- | RBRACKET list_value_list LBRACKET { return val[1] }
202
+ LBRACKET RBRACKET { result = EMPTY_ARRAY }
203
+ | LBRACKET list_value_list RBRACKET { result = val[1] }
156
204
 
157
205
  list_value_list:
158
- input_value { return [val[0]] }
206
+ input_value { result = [val[0]] }
159
207
  | list_value_list input_value { val[0] << val[1] }
160
208
 
161
209
  object_value:
162
- RCURLY LCURLY { return make_node(:InputObject, arguments: [], position_source: val[0])}
163
- | RCURLY object_value_list LCURLY { return make_node(:InputObject, arguments: val[1], position_source: val[0])}
210
+ LCURLY RCURLY { result = make_node(:InputObject, arguments: [], position_source: val[0])}
211
+ | LCURLY object_value_list RCURLY { result = make_node(:InputObject, arguments: val[1], position_source: val[0])}
164
212
 
165
213
  object_value_list:
166
- object_value_field { return [val[0]] }
214
+ object_value_field { result = [val[0]] }
167
215
  | object_value_list object_value_field { val[0] << val[1] }
168
216
 
169
217
  object_value_field:
170
- name COLON input_value { return make_node(:Argument, name: val[0], value: val[2], position_source: val[0])}
218
+ name COLON input_value { result = make_node(:Argument, name: val[0], value: val[2], position_source: val[0])}
219
+
220
+ /* like the previous, but with literals only: */
221
+ object_literal_value:
222
+ LCURLY RCURLY { result = make_node(:InputObject, arguments: [], position_source: val[0])}
223
+ | LCURLY object_literal_value_list RCURLY { result = make_node(:InputObject, arguments: val[1], position_source: val[0])}
224
+
225
+ object_literal_value_list:
226
+ object_literal_value_field { result = [val[0]] }
227
+ | object_literal_value_list object_literal_value_field { val[0] << val[1] }
171
228
 
172
- enum_value: IDENTIFIER { return make_node(:Enum, name: val[0], position_source: val[0])}
229
+ object_literal_value_field:
230
+ name COLON literal_value { result = make_node(:Argument, name: val[0], value: val[2], position_source: val[0])}
231
+
232
+ enum_value: enum_name { result = make_node(:Enum, name: val[0], position_source: val[0]) }
173
233
 
174
234
  directives_list_opt:
175
- /* none */ { return [] }
235
+ /* none */ { result = EMPTY_ARRAY }
176
236
  | directives_list
177
237
 
178
238
  directives_list:
179
- directive { return [val[0]] }
239
+ directive { result = [val[0]] }
180
240
  | directives_list directive { val[0] << val[1] }
181
241
 
182
- directive: DIR_SIGN name arguments_opt { return make_node(:Directive, name: val[1], arguments: val[2], position_source: val[0]) }
242
+ directive: DIR_SIGN name arguments_opt { result = make_node(:Directive, name: val[1], arguments: val[2], position_source: val[0]) }
183
243
 
184
244
  fragment_spread:
185
- ELLIPSIS name_without_on directives_list_opt { return make_node(:FragmentSpread, name: val[1], directives: val[2], position_source: val[0]) }
245
+ ELLIPSIS name_without_on directives_list_opt { result = make_node(:FragmentSpread, name: val[1], directives: val[2], position_source: val[0]) }
186
246
 
187
247
  inline_fragment:
188
- ELLIPSIS ON name directives_list_opt selection_set {
189
- return make_node(:InlineFragment, {
248
+ ELLIPSIS ON type directives_list_opt selection_set {
249
+ result = make_node(:InlineFragment, {
190
250
  type: val[2],
191
251
  directives: val[3],
192
252
  selections: val[4],
@@ -194,7 +254,7 @@ rule
194
254
  })
195
255
  }
196
256
  | ELLIPSIS directives_list_opt selection_set {
197
- return make_node(:InlineFragment, {
257
+ result = make_node(:InlineFragment, {
198
258
  type: nil,
199
259
  directives: val[1],
200
260
  selections: val[2],
@@ -203,8 +263,8 @@ rule
203
263
  }
204
264
 
205
265
  fragment_definition:
206
- FRAGMENT name ON name_without_on directives_list_opt selection_set {
207
- return make_node(:FragmentDefinition, {
266
+ FRAGMENT fragment_name_opt ON type directives_list_opt selection_set {
267
+ result = make_node(:FragmentDefinition, {
208
268
  name: val[1],
209
269
  type: val[3],
210
270
  directives: val[4],
@@ -213,6 +273,172 @@ rule
213
273
  }
214
274
  )
215
275
  }
276
+
277
+ fragment_name_opt:
278
+ /* none */ { result = nil }
279
+ | name_without_on
280
+
281
+ type_system_definition:
282
+ schema_definition
283
+ | type_definition
284
+ | directive_definition
285
+
286
+ schema_definition:
287
+ SCHEMA directives_list_opt LCURLY operation_type_definition_list RCURLY { result = make_node(:SchemaDefinition, position_source: val[0], definition_line: val[0].line, directives: val[1], **val[3]) }
288
+
289
+ operation_type_definition_list:
290
+ operation_type_definition
291
+ | operation_type_definition_list operation_type_definition { result = val[0].merge(val[1]) }
292
+
293
+ operation_type_definition:
294
+ operation_type COLON name { result = { val[0].to_s.to_sym => val[2] } }
295
+
296
+ type_definition:
297
+ scalar_type_definition
298
+ | object_type_definition
299
+ | interface_type_definition
300
+ | union_type_definition
301
+ | enum_type_definition
302
+ | input_object_type_definition
303
+
304
+ type_system_extension:
305
+ schema_extension
306
+ | type_extension
307
+
308
+ schema_extension:
309
+ EXTEND SCHEMA directives_list_opt LCURLY operation_type_definition_list RCURLY { result = make_node(:SchemaExtension, position_source: val[0], directives: val[2], **val[4]) }
310
+ | EXTEND SCHEMA directives_list { result = make_node(:SchemaExtension, position_source: val[0], directives: val[2]) }
311
+
312
+ type_extension:
313
+ scalar_type_extension
314
+ | object_type_extension
315
+ | interface_type_extension
316
+ | union_type_extension
317
+ | enum_type_extension
318
+ | input_object_type_extension
319
+
320
+ scalar_type_extension: EXTEND SCALAR name directives_list { result = make_node(:ScalarTypeExtension, name: val[2], directives: val[3], position_source: val[0]) }
321
+
322
+ object_type_extension:
323
+ /* TODO - This first one shouldn't be necessary but parser is getting confused */
324
+ EXTEND TYPE name implements field_definition_list_opt { result = make_node(:ObjectTypeExtension, name: val[2], interfaces: val[3], directives: [], fields: val[4], position_source: val[0]) }
325
+ | EXTEND TYPE name implements_opt directives_list_opt field_definition_list_opt { result = make_node(:ObjectTypeExtension, name: val[2], interfaces: val[3], directives: val[4], fields: val[5], position_source: val[0]) }
326
+ | EXTEND TYPE name implements_opt directives_list { result = make_node(:ObjectTypeExtension, name: val[2], interfaces: val[3], directives: val[4], fields: [], position_source: val[0]) }
327
+ | EXTEND TYPE name implements { result = make_node(:ObjectTypeExtension, name: val[2], interfaces: val[3], directives: [], fields: [], position_source: val[0]) }
328
+
329
+ interface_type_extension:
330
+ EXTEND INTERFACE name implements_opt directives_list_opt field_definition_list_opt { result = make_node(:InterfaceTypeExtension, name: val[2], interfaces: val[3], directives: val[4], fields: val[5], position_source: val[0]) }
331
+ | EXTEND INTERFACE name implements_opt directives_list { result = make_node(:InterfaceTypeExtension, name: val[2], interfaces: val[3], directives: val[4], fields: [], position_source: val[0]) }
332
+ | EXTEND INTERFACE name implements { result = make_node(:InterfaceTypeExtension, name: val[2], interfaces: val[3], directives: [], fields: [], position_source: val[0]) }
333
+
334
+ union_type_extension:
335
+ EXTEND UNION name directives_list_opt EQUALS union_members { result = make_node(:UnionTypeExtension, name: val[2], directives: val[3], types: val[5], position_source: val[0]) }
336
+ | EXTEND UNION name directives_list { result = make_node(:UnionTypeExtension, name: val[2], directives: val[3], types: [], position_source: val[0]) }
337
+
338
+ enum_type_extension:
339
+ EXTEND ENUM name directives_list_opt LCURLY enum_value_definitions RCURLY { result = make_node(:EnumTypeExtension, name: val[2], directives: val[3], values: val[5], position_source: val[0]) }
340
+ | EXTEND ENUM name directives_list { result = make_node(:EnumTypeExtension, name: val[2], directives: val[3], values: [], position_source: val[0]) }
341
+
342
+ input_object_type_extension:
343
+ EXTEND INPUT name directives_list_opt LCURLY input_value_definition_list RCURLY { result = make_node(:InputObjectTypeExtension, name: val[2], directives: val[3], fields: val[5], position_source: val[0]) }
344
+ | EXTEND INPUT name directives_list { result = make_node(:InputObjectTypeExtension, name: val[2], directives: val[3], fields: [], position_source: val[0]) }
345
+
346
+ description: STRING
347
+
348
+ description_opt:
349
+ /* none */
350
+ | description
351
+
352
+ scalar_type_definition:
353
+ description_opt SCALAR name directives_list_opt {
354
+ result = make_node(:ScalarTypeDefinition, name: val[2], directives: val[3], description: val[0] || get_description(val[1]), definition_line: val[1].line, position_source: val[0] || val[1])
355
+ }
356
+
357
+ object_type_definition:
358
+ description_opt TYPE name implements_opt directives_list_opt field_definition_list_opt {
359
+ result = make_node(:ObjectTypeDefinition, name: val[2], interfaces: val[3], directives: val[4], fields: val[5], description: val[0] || get_description(val[1]), definition_line: val[1].line, position_source: val[0] || val[1])
360
+ }
361
+
362
+ implements_opt:
363
+ /* none */ { result = EMPTY_ARRAY }
364
+ | implements
365
+
366
+ implements:
367
+ IMPLEMENTS AMP interfaces_list { result = val[2] }
368
+ | IMPLEMENTS interfaces_list { result = val[1] }
369
+ | IMPLEMENTS legacy_interfaces_list { result = val[1] }
370
+
371
+ interfaces_list:
372
+ name { result = [make_node(:TypeName, name: val[0], position_source: val[0])] }
373
+ | interfaces_list AMP name { val[0] << make_node(:TypeName, name: val[2], position_source: val[2]) }
374
+
375
+ legacy_interfaces_list:
376
+ name { result = [make_node(:TypeName, name: val[0], position_source: val[0])] }
377
+ | legacy_interfaces_list name { val[0] << make_node(:TypeName, name: val[1], position_source: val[1]) }
378
+
379
+ input_value_definition:
380
+ description_opt name COLON type default_value_opt directives_list_opt {
381
+ result = make_node(:InputValueDefinition, name: val[1], type: val[3], default_value: val[4], directives: val[5], description: val[0] || get_description(val[1]), definition_line: val[1].line, position_source: val[0] || val[1])
382
+ }
383
+
384
+ input_value_definition_list:
385
+ input_value_definition { result = [val[0]] }
386
+ | input_value_definition_list input_value_definition { val[0] << val[1] }
387
+
388
+ arguments_definitions_opt:
389
+ /* none */ { result = EMPTY_ARRAY }
390
+ | LPAREN input_value_definition_list RPAREN { result = val[1] }
391
+
392
+ field_definition:
393
+ description_opt name arguments_definitions_opt COLON type directives_list_opt {
394
+ result = make_node(:FieldDefinition, name: val[1], arguments: val[2], type: val[4], directives: val[5], description: val[0] || get_description(val[1]), definition_line: val[1].line, position_source: val[0] || val[1])
395
+ }
396
+
397
+ field_definition_list_opt:
398
+ /* none */ { result = EMPTY_ARRAY }
399
+ | LCURLY field_definition_list RCURLY { result = val[1] }
400
+
401
+ field_definition_list:
402
+ /* none - this is not actually valid but graphql-ruby used to print this */ { result = EMPTY_ARRAY }
403
+ | field_definition { result = [val[0]] }
404
+ | field_definition_list field_definition { val[0] << val[1] }
405
+
406
+ interface_type_definition:
407
+ description_opt INTERFACE name implements_opt directives_list_opt field_definition_list_opt {
408
+ result = make_node(:InterfaceTypeDefinition, name: val[2], interfaces: val[3], directives: val[4], fields: val[5], description: val[0] || get_description(val[1]), definition_line: val[1].line, position_source: val[0] || val[1])
409
+ }
410
+
411
+ union_members:
412
+ name { result = [make_node(:TypeName, name: val[0], position_source: val[0])]}
413
+ | union_members PIPE name { val[0] << make_node(:TypeName, name: val[2], position_source: val[2]) }
414
+
415
+ union_type_definition:
416
+ description_opt UNION name directives_list_opt EQUALS union_members {
417
+ result = make_node(:UnionTypeDefinition, name: val[2], directives: val[3], types: val[5], description: val[0] || get_description(val[1]), definition_line: val[1].line, position_source: val[0] || val[1])
418
+ }
419
+
420
+ enum_type_definition:
421
+ description_opt ENUM name directives_list_opt LCURLY enum_value_definitions RCURLY {
422
+ result = make_node(:EnumTypeDefinition, name: val[2], directives: val[3], values: val[5], description: val[0] || get_description(val[1]), definition_line: val[1].line, position_source: val[0] || val[1])
423
+ }
424
+
425
+ input_object_type_definition:
426
+ description_opt INPUT name directives_list_opt LCURLY input_value_definition_list RCURLY {
427
+ result = make_node(:InputObjectTypeDefinition, name: val[2], directives: val[3], fields: val[5], description: val[0] || get_description(val[1]), definition_line: val[1].line, position_source: val[0] || val[1])
428
+ }
429
+
430
+ directive_definition:
431
+ description_opt DIRECTIVE DIR_SIGN name arguments_definitions_opt directive_repeatable_opt ON directive_locations {
432
+ result = make_node(:DirectiveDefinition, name: val[3], arguments: val[4], locations: val[7], repeatable: !!val[5], description: val[0] || get_description(val[1]), definition_line: val[1].line, position_source: val[0] || val[1])
433
+ }
434
+
435
+ directive_repeatable_opt:
436
+ /* nothing */
437
+ | REPEATABLE
438
+
439
+ directive_locations:
440
+ name { result = [make_node(:DirectiveLocation, name: val[0].to_s, position_source: val[0])] }
441
+ | directive_locations PIPE name { val[0] << make_node(:DirectiveLocation, name: val[2].to_s, position_source: val[2]) }
216
442
  end
217
443
 
218
444
  ---- header ----
@@ -220,23 +446,49 @@ end
220
446
 
221
447
  ---- inner ----
222
448
 
223
- def initialize(query_string)
449
+ EMPTY_ARRAY = [].freeze
450
+
451
+ def initialize(query_string, filename:, tracer: Tracing::NullTracer)
452
+ raise GraphQL::ParseError.new("No query string was present", nil, nil, query_string) if query_string.nil?
224
453
  @query_string = query_string
454
+ @filename = filename
455
+ @tracer = tracer
456
+ @reused_next_token = [nil, nil]
225
457
  end
226
458
 
227
459
  def parse_document
228
460
  @document ||= begin
229
- @tokens ||= GraphQL::Language::Lexer.tokenize(@query_string)
230
- if @tokens.none?
231
- make_node(:Document, definitions: [])
232
- else
233
- do_parse
461
+ # Break the string into tokens
462
+ @tracer.trace("lex", {query_string: @query_string}) do
463
+ @tokens ||= GraphQL.scan(@query_string)
464
+ end
465
+ # From the tokens, build an AST
466
+ @tracer.trace("parse", {query_string: @query_string}) do
467
+ if @tokens.empty?
468
+ raise GraphQL::ParseError.new("Unexpected end of document", nil, nil, @query_string)
469
+ else
470
+ do_parse
471
+ end
234
472
  end
235
473
  end
236
474
  end
237
475
 
238
- def self.parse(query_string)
239
- self.new(query_string).parse_document
476
+ class << self
477
+ attr_accessor :cache
478
+
479
+ def parse(query_string, filename: nil, tracer: GraphQL::Tracing::NullTracer)
480
+ new(query_string, filename: filename, tracer: tracer).parse_document
481
+ end
482
+
483
+ def parse_file(filename, tracer: GraphQL::Tracing::NullTracer)
484
+ if cache
485
+ cache.fetch(filename) do
486
+ parse(File.read(filename), filename: filename, tracer: tracer)
487
+ end
488
+ else
489
+ parse(File.read(filename), filename: filename, tracer: tracer)
490
+ end
491
+ end
240
492
  end
241
493
 
242
494
  private
@@ -246,23 +498,44 @@ def next_token
246
498
  if lexer_token.nil?
247
499
  nil
248
500
  else
249
- [lexer_token.name, lexer_token]
501
+ @reused_next_token[0] = lexer_token.name
502
+ @reused_next_token[1] = lexer_token
503
+ @reused_next_token
250
504
  end
251
505
  end
252
506
 
507
+ def get_description(token)
508
+ comments = []
509
+
510
+ loop do
511
+ prev_token = token
512
+ token = token.prev_token
513
+
514
+ break if token.nil?
515
+ break if token.name != :COMMENT
516
+ break if prev_token.line != token.line + 1
517
+
518
+ comments.unshift(token.to_s.sub(/^#\s*/, ""))
519
+ end
520
+
521
+ return nil if comments.empty?
522
+
523
+ comments.join("\n")
524
+ end
525
+
253
526
  def on_error(parser_token_id, lexer_token, vstack)
254
- if lexer_token == "$"
255
- raise GraphQL::ParseError.new("Unexpected end of document", nil, nil, @query_string)
527
+ if lexer_token == "$" || lexer_token == nil
528
+ raise GraphQL::ParseError.new("Unexpected end of document", nil, nil, @query_string, filename: @filename)
256
529
  else
257
530
  parser_token_name = token_to_str(parser_token_id)
258
531
  if parser_token_name.nil?
259
- raise GraphQL::ParseError.new("Parse Error on unknown token: {token_id: #{parser_token_id}, lexer_token: #{lexer_token}} from #{@query_string}", nil, nil, @query_string)
532
+ raise GraphQL::ParseError.new("Parse Error on unknown token: {token_id: #{parser_token_id}, lexer_token: #{lexer_token}} from #{@query_string}", nil, nil, @query_string, filename: @filename)
260
533
  else
261
534
  line, col = lexer_token.line_and_column
262
535
  if lexer_token.name == :BAD_UNICODE_ESCAPE
263
- raise GraphQL::ParseError.new("Parse error on bad Unicode escape sequence: #{lexer_token.to_s.inspect} (#{parser_token_name}) at [#{line}, #{col}]", line, col, @query_string)
536
+ raise GraphQL::ParseError.new("Parse error on bad Unicode escape sequence: #{lexer_token.to_s.inspect} (#{parser_token_name}) at [#{line}, #{col}]", line, col, @query_string, filename: @filename)
264
537
  else
265
- raise GraphQL::ParseError.new("Parse error on #{lexer_token.to_s.inspect} (#{parser_token_name}) at [#{line}, #{col}]", line, col, @query_string)
538
+ raise GraphQL::ParseError.new("Parse error on #{lexer_token.to_s.inspect} (#{parser_token_name}) at [#{line}, #{col}]", line, col, @query_string, filename: @filename)
266
539
  end
267
540
  end
268
541
  end
@@ -275,5 +548,7 @@ def make_node(node_name, assigns)
275
548
  end
276
549
  end
277
550
 
551
+ assigns[:filename] = @filename
552
+
278
553
  GraphQL::Language::Nodes.const_get(node_name).new(assigns)
279
554
  end