graphql 0.16.0 → 2.0.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of graphql might be problematic. Click here for more details.

Files changed (490) hide show
  1. checksums.yaml +5 -5
  2. data/.yardopts +5 -0
  3. data/lib/generators/graphql/core.rb +69 -0
  4. data/lib/generators/graphql/enum_generator.rb +27 -0
  5. data/lib/generators/graphql/field_extractor.rb +31 -0
  6. data/lib/generators/graphql/input_generator.rb +50 -0
  7. data/lib/generators/graphql/install/mutation_root_generator.rb +34 -0
  8. data/lib/generators/graphql/install/templates/base_mutation.erb +10 -0
  9. data/lib/generators/graphql/install/templates/mutation_type.erb +12 -0
  10. data/lib/generators/graphql/install_generator.rb +197 -0
  11. data/lib/generators/graphql/interface_generator.rb +27 -0
  12. data/lib/generators/graphql/loader_generator.rb +21 -0
  13. data/lib/generators/graphql/mutation_create_generator.rb +22 -0
  14. data/lib/generators/graphql/mutation_delete_generator.rb +22 -0
  15. data/lib/generators/graphql/mutation_generator.rb +30 -0
  16. data/lib/generators/graphql/mutation_update_generator.rb +22 -0
  17. data/lib/generators/graphql/object_generator.rb +50 -0
  18. data/lib/generators/graphql/orm_mutations_base.rb +40 -0
  19. data/lib/generators/graphql/relay.rb +49 -0
  20. data/lib/generators/graphql/relay_generator.rb +21 -0
  21. data/lib/generators/graphql/scalar_generator.rb +22 -0
  22. data/lib/generators/graphql/templates/base_argument.erb +6 -0
  23. data/lib/generators/graphql/templates/base_connection.erb +8 -0
  24. data/lib/generators/graphql/templates/base_edge.erb +8 -0
  25. data/lib/generators/graphql/templates/base_enum.erb +6 -0
  26. data/lib/generators/graphql/templates/base_field.erb +7 -0
  27. data/lib/generators/graphql/templates/base_input_object.erb +7 -0
  28. data/lib/generators/graphql/templates/base_interface.erb +9 -0
  29. data/lib/generators/graphql/templates/base_object.erb +7 -0
  30. data/lib/generators/graphql/templates/base_scalar.erb +6 -0
  31. data/lib/generators/graphql/templates/base_union.erb +6 -0
  32. data/lib/generators/graphql/templates/enum.erb +11 -0
  33. data/lib/generators/graphql/templates/graphql_controller.erb +52 -0
  34. data/lib/generators/graphql/templates/input.erb +9 -0
  35. data/lib/generators/graphql/templates/interface.erb +10 -0
  36. data/lib/generators/graphql/templates/loader.erb +19 -0
  37. data/lib/generators/graphql/templates/mutation.erb +16 -0
  38. data/lib/generators/graphql/templates/mutation_create.erb +20 -0
  39. data/lib/generators/graphql/templates/mutation_delete.erb +20 -0
  40. data/lib/generators/graphql/templates/mutation_update.erb +21 -0
  41. data/lib/generators/graphql/templates/node_type.erb +9 -0
  42. data/lib/generators/graphql/templates/object.erb +10 -0
  43. data/lib/generators/graphql/templates/query_type.erb +15 -0
  44. data/lib/generators/graphql/templates/scalar.erb +17 -0
  45. data/lib/generators/graphql/templates/schema.erb +30 -0
  46. data/lib/generators/graphql/templates/union.erb +9 -0
  47. data/lib/generators/graphql/type_generator.rb +135 -0
  48. data/lib/generators/graphql/union_generator.rb +33 -0
  49. data/lib/graphql/analysis/ast/analyzer.rb +84 -0
  50. data/lib/graphql/analysis/ast/field_usage.rb +57 -0
  51. data/lib/graphql/analysis/ast/max_query_complexity.rb +22 -0
  52. data/lib/graphql/analysis/ast/max_query_depth.rb +22 -0
  53. data/lib/graphql/analysis/ast/query_complexity.rb +230 -0
  54. data/lib/graphql/analysis/ast/query_depth.rb +55 -0
  55. data/lib/graphql/analysis/ast/visitor.rb +269 -0
  56. data/lib/graphql/analysis/ast.rb +81 -0
  57. data/lib/graphql/analysis.rb +2 -5
  58. data/lib/graphql/analysis_error.rb +1 -0
  59. data/lib/graphql/backtrace/inspect_result.rb +50 -0
  60. data/lib/graphql/backtrace/table.rb +141 -0
  61. data/lib/graphql/backtrace/traced_error.rb +54 -0
  62. data/lib/graphql/backtrace/tracer.rb +80 -0
  63. data/lib/graphql/backtrace.rb +58 -0
  64. data/lib/graphql/coercion_error.rb +13 -0
  65. data/lib/graphql/dataloader/null_dataloader.rb +24 -0
  66. data/lib/graphql/dataloader/request.rb +19 -0
  67. data/lib/graphql/dataloader/request_all.rb +19 -0
  68. data/lib/graphql/dataloader/source.rb +164 -0
  69. data/lib/graphql/dataloader.rb +311 -0
  70. data/lib/graphql/date_encoding_error.rb +16 -0
  71. data/lib/graphql/deprecation.rb +9 -0
  72. data/lib/graphql/dig.rb +19 -0
  73. data/lib/graphql/execution/directive_checks.rb +37 -0
  74. data/lib/graphql/execution/errors.rb +93 -0
  75. data/lib/graphql/execution/interpreter/argument_value.rb +28 -0
  76. data/lib/graphql/execution/interpreter/arguments.rb +88 -0
  77. data/lib/graphql/execution/interpreter/arguments_cache.rb +105 -0
  78. data/lib/graphql/execution/interpreter/execution_errors.rb +29 -0
  79. data/lib/graphql/execution/interpreter/handles_raw_value.rb +18 -0
  80. data/lib/graphql/execution/interpreter/resolve.rb +77 -0
  81. data/lib/graphql/execution/interpreter/runtime.rb +994 -0
  82. data/lib/graphql/execution/interpreter.rb +226 -0
  83. data/lib/graphql/execution/lazy/lazy_method_map.rb +98 -0
  84. data/lib/graphql/execution/lazy.rb +75 -0
  85. data/lib/graphql/execution/lookahead.rb +311 -0
  86. data/lib/graphql/execution/multiplex.rb +45 -0
  87. data/lib/graphql/execution.rb +18 -0
  88. data/lib/graphql/execution_error.rb +34 -1
  89. data/lib/graphql/filter.rb +53 -0
  90. data/lib/graphql/integer_decoding_error.rb +17 -0
  91. data/lib/graphql/integer_encoding_error.rb +36 -0
  92. data/lib/graphql/introspection/base_object.rb +13 -0
  93. data/lib/graphql/introspection/directive_location_enum.rb +12 -5
  94. data/lib/graphql/introspection/directive_type.rb +30 -10
  95. data/lib/graphql/introspection/dynamic_fields.rb +12 -0
  96. data/lib/graphql/introspection/entry_points.rb +22 -0
  97. data/lib/graphql/introspection/enum_value_type.rb +21 -8
  98. data/lib/graphql/introspection/field_type.rb +26 -10
  99. data/lib/graphql/introspection/input_value_type.rb +64 -14
  100. data/lib/graphql/introspection/introspection_query.rb +7 -76
  101. data/lib/graphql/introspection/schema_type.rb +42 -17
  102. data/lib/graphql/introspection/type_kind_enum.rb +11 -5
  103. data/lib/graphql/introspection/type_type.rb +104 -16
  104. data/lib/graphql/introspection.rb +104 -13
  105. data/lib/graphql/invalid_name_error.rb +11 -0
  106. data/lib/graphql/invalid_null_error.rb +36 -8
  107. data/lib/graphql/language/block_string.rb +99 -0
  108. data/lib/graphql/language/cache.rb +37 -0
  109. data/lib/graphql/language/definition_slice.rb +41 -0
  110. data/lib/graphql/language/document_from_schema_definition.rb +335 -0
  111. data/lib/graphql/language/generation.rb +16 -86
  112. data/lib/graphql/language/lexer.rb +1436 -705
  113. data/lib/graphql/language/lexer.rl +172 -64
  114. data/lib/graphql/language/nodes.rb +617 -105
  115. data/lib/graphql/language/parser.rb +1524 -430
  116. data/lib/graphql/language/parser.y +348 -73
  117. data/lib/graphql/language/printer.rb +386 -0
  118. data/lib/graphql/language/sanitized_printer.rb +222 -0
  119. data/lib/graphql/language/token.rb +16 -3
  120. data/lib/graphql/language/visitor.rb +169 -25
  121. data/lib/graphql/language.rb +30 -0
  122. data/lib/graphql/load_application_object_failed_error.rb +22 -0
  123. data/lib/graphql/name_validator.rb +11 -0
  124. data/lib/graphql/pagination/active_record_relation_connection.rb +85 -0
  125. data/lib/graphql/pagination/array_connection.rb +79 -0
  126. data/lib/graphql/pagination/connection.rb +253 -0
  127. data/lib/graphql/pagination/connections.rb +135 -0
  128. data/lib/graphql/pagination/mongoid_relation_connection.rb +25 -0
  129. data/lib/graphql/pagination/relation_connection.rb +228 -0
  130. data/lib/graphql/pagination/sequel_dataset_connection.rb +28 -0
  131. data/lib/graphql/pagination.rb +6 -0
  132. data/lib/graphql/parse_error.rb +24 -0
  133. data/lib/graphql/query/context.rb +266 -12
  134. data/lib/graphql/query/fingerprint.rb +26 -0
  135. data/lib/graphql/query/input_validation_result.rb +34 -7
  136. data/lib/graphql/query/null_context.rb +52 -0
  137. data/lib/graphql/query/result.rb +63 -0
  138. data/lib/graphql/query/validation_pipeline.rb +114 -0
  139. data/lib/graphql/query/variable_validation_error.rb +27 -3
  140. data/lib/graphql/query/variables.rb +75 -24
  141. data/lib/graphql/query.rb +359 -92
  142. data/lib/graphql/railtie.rb +13 -0
  143. data/lib/graphql/rake_task/validate.rb +63 -0
  144. data/lib/graphql/rake_task.rb +146 -0
  145. data/lib/graphql/relay/range_add.rb +52 -0
  146. data/lib/graphql/relay.rb +3 -0
  147. data/lib/graphql/rubocop/graphql/base_cop.rb +36 -0
  148. data/lib/graphql/rubocop/graphql/default_null_true.rb +43 -0
  149. data/lib/graphql/rubocop/graphql/default_required_true.rb +43 -0
  150. data/lib/graphql/rubocop.rb +4 -0
  151. data/lib/graphql/runtime_type_error.rb +5 -0
  152. data/lib/graphql/schema/addition.rb +245 -0
  153. data/lib/graphql/schema/argument.rb +395 -0
  154. data/lib/graphql/schema/base_64_bp.rb +26 -0
  155. data/lib/graphql/schema/base_64_encoder.rb +21 -0
  156. data/lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb +47 -0
  157. data/lib/graphql/schema/build_from_definition/resolve_map.rb +78 -0
  158. data/lib/graphql/schema/build_from_definition.rb +492 -0
  159. data/lib/graphql/schema/built_in_types.rb +12 -0
  160. data/lib/graphql/schema/directive/deprecated.rb +18 -0
  161. data/lib/graphql/schema/directive/feature.rb +66 -0
  162. data/lib/graphql/schema/directive/flagged.rb +57 -0
  163. data/lib/graphql/schema/directive/include.rb +25 -0
  164. data/lib/graphql/schema/directive/one_of.rb +12 -0
  165. data/lib/graphql/schema/directive/skip.rb +25 -0
  166. data/lib/graphql/schema/directive/transform.rb +60 -0
  167. data/lib/graphql/schema/directive.rb +212 -0
  168. data/lib/graphql/schema/enum.rb +176 -0
  169. data/lib/graphql/schema/enum_value.rb +77 -0
  170. data/lib/graphql/schema/field/connection_extension.rb +80 -0
  171. data/lib/graphql/schema/field/scope_extension.rb +22 -0
  172. data/lib/graphql/schema/field.rb +862 -0
  173. data/lib/graphql/schema/field_extension.rb +156 -0
  174. data/lib/graphql/schema/find_inherited_value.rb +36 -0
  175. data/lib/graphql/schema/finder.rb +155 -0
  176. data/lib/graphql/schema/input_object.rb +258 -0
  177. data/lib/graphql/schema/interface.rb +113 -0
  178. data/lib/graphql/schema/introspection_system.rb +164 -0
  179. data/lib/graphql/schema/invalid_type_error.rb +1 -0
  180. data/lib/graphql/schema/late_bound_type.rb +37 -0
  181. data/lib/graphql/schema/list.rb +86 -0
  182. data/lib/graphql/schema/loader.rb +228 -0
  183. data/lib/graphql/schema/member/base_dsl_methods.rb +124 -0
  184. data/lib/graphql/schema/member/build_type.rb +178 -0
  185. data/lib/graphql/schema/member/graphql_type_names.rb +21 -0
  186. data/lib/graphql/schema/member/has_arguments.rb +376 -0
  187. data/lib/graphql/schema/member/has_ast_node.rb +20 -0
  188. data/lib/graphql/schema/member/has_deprecation_reason.rb +25 -0
  189. data/lib/graphql/schema/member/has_directives.rb +113 -0
  190. data/lib/graphql/schema/member/has_fields.rb +163 -0
  191. data/lib/graphql/schema/member/has_interfaces.rb +88 -0
  192. data/lib/graphql/schema/member/has_path.rb +25 -0
  193. data/lib/graphql/schema/member/has_unresolved_type_error.rb +15 -0
  194. data/lib/graphql/schema/member/has_validators.rb +31 -0
  195. data/lib/graphql/schema/member/relay_shortcuts.rb +73 -0
  196. data/lib/graphql/schema/member/scoped.rb +21 -0
  197. data/lib/graphql/schema/member/type_system_helpers.rb +38 -0
  198. data/lib/graphql/schema/member/validates_input.rb +33 -0
  199. data/lib/graphql/schema/member.rb +39 -0
  200. data/lib/graphql/schema/mutation.rb +85 -0
  201. data/lib/graphql/schema/non_null.rb +67 -0
  202. data/lib/graphql/schema/null_mask.rb +11 -0
  203. data/lib/graphql/schema/object.rb +117 -0
  204. data/lib/graphql/schema/printer.rb +72 -128
  205. data/lib/graphql/schema/relay_classic_mutation.rb +179 -0
  206. data/lib/graphql/schema/resolver/has_payload_type.rb +106 -0
  207. data/lib/graphql/schema/resolver.rb +402 -0
  208. data/lib/graphql/schema/scalar.rb +68 -0
  209. data/lib/graphql/schema/subscription.rb +148 -0
  210. data/lib/graphql/schema/timeout.rb +123 -0
  211. data/lib/graphql/schema/type_expression.rb +29 -5
  212. data/lib/graphql/schema/type_membership.rb +51 -0
  213. data/lib/graphql/schema/union.rb +81 -0
  214. data/lib/graphql/schema/unique_within_type.rb +34 -0
  215. data/lib/graphql/schema/validator/allow_blank_validator.rb +29 -0
  216. data/lib/graphql/schema/validator/allow_null_validator.rb +26 -0
  217. data/lib/graphql/schema/validator/exclusion_validator.rb +33 -0
  218. data/lib/graphql/schema/validator/format_validator.rb +48 -0
  219. data/lib/graphql/schema/validator/inclusion_validator.rb +35 -0
  220. data/lib/graphql/schema/validator/length_validator.rb +59 -0
  221. data/lib/graphql/schema/validator/numericality_validator.rb +82 -0
  222. data/lib/graphql/schema/validator/required_validator.rb +82 -0
  223. data/lib/graphql/schema/validator.rb +171 -0
  224. data/lib/graphql/schema/warden.rb +413 -0
  225. data/lib/graphql/schema/wrapper.rb +24 -0
  226. data/lib/graphql/schema.rb +1179 -104
  227. data/lib/graphql/static_validation/all_rules.rb +14 -0
  228. data/lib/graphql/static_validation/base_visitor.rb +200 -0
  229. data/lib/graphql/static_validation/definition_dependencies.rb +198 -0
  230. data/lib/graphql/static_validation/error.rb +46 -0
  231. data/lib/graphql/static_validation/interpreter_visitor.rb +14 -0
  232. data/lib/graphql/static_validation/literal_validator.rb +113 -22
  233. data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +59 -11
  234. data/lib/graphql/static_validation/rules/argument_literals_are_compatible_error.rb +48 -0
  235. data/lib/graphql/static_validation/rules/argument_names_are_unique.rb +31 -0
  236. data/lib/graphql/static_validation/rules/argument_names_are_unique_error.rb +30 -0
  237. data/lib/graphql/static_validation/rules/arguments_are_defined.rb +62 -8
  238. data/lib/graphql/static_validation/rules/arguments_are_defined_error.rb +37 -0
  239. data/lib/graphql/static_validation/rules/directives_are_defined.rb +20 -13
  240. data/lib/graphql/static_validation/rules/directives_are_defined_error.rb +29 -0
  241. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +32 -26
  242. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations_error.rb +31 -0
  243. data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +21 -23
  244. data/lib/graphql/static_validation/rules/fields_are_defined_on_type_error.rb +32 -0
  245. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +55 -18
  246. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections_error.rb +31 -0
  247. data/lib/graphql/static_validation/rules/fields_will_merge.rb +390 -70
  248. data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +53 -0
  249. data/lib/graphql/static_validation/rules/fragment_names_are_unique.rb +30 -0
  250. data/lib/graphql/static_validation/rules/fragment_names_are_unique_error.rb +29 -0
  251. data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +54 -37
  252. data/lib/graphql/static_validation/rules/fragment_spreads_are_possible_error.rb +35 -0
  253. data/lib/graphql/static_validation/rules/fragment_types_exist.rb +26 -16
  254. data/lib/graphql/static_validation/rules/fragment_types_exist_error.rb +29 -0
  255. data/lib/graphql/static_validation/rules/fragments_are_finite.rb +13 -19
  256. data/lib/graphql/static_validation/rules/fragments_are_finite_error.rb +29 -0
  257. data/lib/graphql/static_validation/rules/fragments_are_named.rb +16 -0
  258. data/lib/graphql/static_validation/rules/fragments_are_named_error.rb +26 -0
  259. data/lib/graphql/static_validation/rules/fragments_are_on_composite_types.rb +25 -20
  260. data/lib/graphql/static_validation/rules/fragments_are_on_composite_types_error.rb +30 -0
  261. data/lib/graphql/static_validation/rules/fragments_are_used.rb +22 -33
  262. data/lib/graphql/static_validation/rules/fragments_are_used_error.rb +29 -0
  263. data/lib/graphql/static_validation/rules/input_object_names_are_unique.rb +30 -0
  264. data/lib/graphql/static_validation/rules/input_object_names_are_unique_error.rb +30 -0
  265. data/lib/graphql/static_validation/rules/mutation_root_exists.rb +17 -0
  266. data/lib/graphql/static_validation/rules/mutation_root_exists_error.rb +26 -0
  267. data/lib/graphql/static_validation/rules/no_definitions_are_present.rb +41 -0
  268. data/lib/graphql/static_validation/rules/no_definitions_are_present_error.rb +25 -0
  269. data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid.rb +66 -0
  270. data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid_error.rb +29 -0
  271. data/lib/graphql/static_validation/rules/operation_names_are_valid.rb +36 -0
  272. data/lib/graphql/static_validation/rules/operation_names_are_valid_error.rb +28 -0
  273. data/lib/graphql/static_validation/rules/query_root_exists.rb +17 -0
  274. data/lib/graphql/static_validation/rules/query_root_exists_error.rb +26 -0
  275. data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +22 -21
  276. data/lib/graphql/static_validation/rules/required_arguments_are_present_error.rb +35 -0
  277. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +59 -0
  278. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present_error.rb +35 -0
  279. data/lib/graphql/static_validation/rules/subscription_root_exists.rb +17 -0
  280. data/lib/graphql/static_validation/rules/subscription_root_exists_error.rb +26 -0
  281. data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +56 -0
  282. data/lib/graphql/static_validation/rules/unique_directives_per_location_error.rb +29 -0
  283. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +36 -18
  284. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed_error.rb +39 -0
  285. data/lib/graphql/static_validation/rules/variable_names_are_unique.rb +24 -0
  286. data/lib/graphql/static_validation/rules/variable_names_are_unique_error.rb +29 -0
  287. data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +103 -39
  288. data/lib/graphql/static_validation/rules/variable_usages_are_allowed_error.rb +38 -0
  289. data/lib/graphql/static_validation/rules/variables_are_input_types.rb +22 -14
  290. data/lib/graphql/static_validation/rules/variables_are_input_types_error.rb +32 -0
  291. data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +92 -70
  292. data/lib/graphql/static_validation/rules/variables_are_used_and_defined_error.rb +37 -0
  293. data/lib/graphql/static_validation/type_stack.rb +85 -24
  294. data/lib/graphql/static_validation/validation_context.rb +25 -46
  295. data/lib/graphql/static_validation/validation_timeout_error.rb +25 -0
  296. data/lib/graphql/static_validation/validator.rb +46 -15
  297. data/lib/graphql/static_validation.rb +6 -3
  298. data/lib/graphql/string_encoding_error.rb +20 -0
  299. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +247 -0
  300. data/lib/graphql/subscriptions/broadcast_analyzer.rb +81 -0
  301. data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +58 -0
  302. data/lib/graphql/subscriptions/event.rb +144 -0
  303. data/lib/graphql/subscriptions/instrumentation.rb +28 -0
  304. data/lib/graphql/subscriptions/serialize.rb +158 -0
  305. data/lib/graphql/subscriptions.rb +306 -0
  306. data/lib/graphql/tracing/active_support_notifications_tracing.rb +21 -0
  307. data/lib/graphql/tracing/appoptics_tracing.rb +173 -0
  308. data/lib/graphql/tracing/appsignal_tracing.rb +51 -0
  309. data/lib/graphql/tracing/data_dog_tracing.rb +100 -0
  310. data/lib/graphql/tracing/instrumentation_tracing.rb +83 -0
  311. data/lib/graphql/tracing/new_relic_tracing.rb +51 -0
  312. data/lib/graphql/tracing/notifications_tracing.rb +59 -0
  313. data/lib/graphql/tracing/platform_tracing.rb +122 -0
  314. data/lib/graphql/tracing/prometheus_tracing/graphql_collector.rb +32 -0
  315. data/lib/graphql/tracing/prometheus_tracing.rb +67 -0
  316. data/lib/graphql/tracing/scout_tracing.rb +54 -0
  317. data/lib/graphql/tracing/statsd_tracing.rb +42 -0
  318. data/lib/graphql/tracing.rb +94 -0
  319. data/lib/graphql/type_kinds.rb +50 -22
  320. data/lib/graphql/types/big_int.rb +23 -0
  321. data/lib/graphql/types/boolean.rb +18 -0
  322. data/lib/graphql/types/float.rb +19 -0
  323. data/lib/graphql/types/id.rb +24 -0
  324. data/lib/graphql/types/int.rb +36 -0
  325. data/lib/graphql/types/iso_8601_date.rb +45 -0
  326. data/lib/graphql/types/iso_8601_date_time.rb +76 -0
  327. data/lib/graphql/types/json.rb +25 -0
  328. data/lib/graphql/types/relay/base_connection.rb +49 -0
  329. data/lib/graphql/types/relay/base_edge.rb +29 -0
  330. data/lib/graphql/types/relay/connection_behaviors.rb +154 -0
  331. data/lib/graphql/types/relay/default_relay.rb +21 -0
  332. data/lib/graphql/types/relay/edge_behaviors.rb +64 -0
  333. data/lib/graphql/types/relay/has_node_field.rb +41 -0
  334. data/lib/graphql/types/relay/has_nodes_field.rb +41 -0
  335. data/lib/graphql/types/relay/node.rb +15 -0
  336. data/lib/graphql/types/relay/node_behaviors.rb +19 -0
  337. data/lib/graphql/types/relay/page_info.rb +11 -0
  338. data/lib/graphql/types/relay/page_info_behaviors.rb +25 -0
  339. data/lib/graphql/types/relay.rb +39 -0
  340. data/lib/graphql/types/string.rb +29 -0
  341. data/lib/graphql/types.rb +11 -0
  342. data/lib/graphql/unauthorized_error.rb +29 -0
  343. data/lib/graphql/unauthorized_field_error.rb +23 -0
  344. data/lib/graphql/unresolved_type_error.rb +35 -0
  345. data/lib/graphql/version.rb +2 -1
  346. data/lib/graphql.rb +86 -41
  347. data/readme.md +15 -101
  348. metadata +394 -279
  349. data/lib/graphql/analysis/analyze_query.rb +0 -73
  350. data/lib/graphql/analysis/max_query_complexity.rb +0 -25
  351. data/lib/graphql/analysis/max_query_depth.rb +0 -25
  352. data/lib/graphql/analysis/query_complexity.rb +0 -122
  353. data/lib/graphql/analysis/query_depth.rb +0 -54
  354. data/lib/graphql/argument.rb +0 -25
  355. data/lib/graphql/base_type.rb +0 -115
  356. data/lib/graphql/boolean_type.rb +0 -9
  357. data/lib/graphql/define/assign_argument.rb +0 -20
  358. data/lib/graphql/define/assign_enum_value.rb +0 -16
  359. data/lib/graphql/define/assign_object_field.rb +0 -21
  360. data/lib/graphql/define/assignment_dictionary.rb +0 -26
  361. data/lib/graphql/define/defined_object_proxy.rb +0 -32
  362. data/lib/graphql/define/instance_definable.rb +0 -79
  363. data/lib/graphql/define/non_null_with_bang.rb +0 -15
  364. data/lib/graphql/define/type_definer.rb +0 -30
  365. data/lib/graphql/define.rb +0 -8
  366. data/lib/graphql/directive/include_directive.rb +0 -10
  367. data/lib/graphql/directive/skip_directive.rb +0 -11
  368. data/lib/graphql/directive.rb +0 -49
  369. data/lib/graphql/enum_type.rb +0 -95
  370. data/lib/graphql/field.rb +0 -131
  371. data/lib/graphql/float_type.rb +0 -5
  372. data/lib/graphql/id_type.rb +0 -12
  373. data/lib/graphql/input_object_type.rb +0 -71
  374. data/lib/graphql/int_type.rb +0 -5
  375. data/lib/graphql/interface_type.rb +0 -38
  376. data/lib/graphql/internal_representation/node.rb +0 -81
  377. data/lib/graphql/internal_representation/rewrite.rb +0 -177
  378. data/lib/graphql/internal_representation.rb +0 -2
  379. data/lib/graphql/introspection/arguments_field.rb +0 -5
  380. data/lib/graphql/introspection/enum_values_field.rb +0 -13
  381. data/lib/graphql/introspection/fields_field.rb +0 -13
  382. data/lib/graphql/introspection/input_fields_field.rb +0 -12
  383. data/lib/graphql/introspection/interfaces_field.rb +0 -5
  384. data/lib/graphql/introspection/of_type_field.rb +0 -6
  385. data/lib/graphql/introspection/possible_types_field.rb +0 -11
  386. data/lib/graphql/introspection/schema_field.rb +0 -15
  387. data/lib/graphql/introspection/type_by_name_field.rb +0 -16
  388. data/lib/graphql/introspection/typename_field.rb +0 -15
  389. data/lib/graphql/list_type.rb +0 -46
  390. data/lib/graphql/non_null_type.rb +0 -43
  391. data/lib/graphql/object_type.rb +0 -93
  392. data/lib/graphql/query/arguments.rb +0 -76
  393. data/lib/graphql/query/directive_resolution.rb +0 -16
  394. data/lib/graphql/query/executor.rb +0 -45
  395. data/lib/graphql/query/literal_input.rb +0 -90
  396. data/lib/graphql/query/serial_execution/execution_context.rb +0 -31
  397. data/lib/graphql/query/serial_execution/field_resolution.rb +0 -82
  398. data/lib/graphql/query/serial_execution/operation_resolution.rb +0 -27
  399. data/lib/graphql/query/serial_execution/selection_resolution.rb +0 -42
  400. data/lib/graphql/query/serial_execution/value_resolution.rb +0 -107
  401. data/lib/graphql/query/serial_execution.rb +0 -41
  402. data/lib/graphql/query/type_resolver.rb +0 -25
  403. data/lib/graphql/scalar_type.rb +0 -53
  404. data/lib/graphql/schema/catchall_middleware.rb +0 -34
  405. data/lib/graphql/schema/middleware_chain.rb +0 -28
  406. data/lib/graphql/schema/possible_types.rb +0 -34
  407. data/lib/graphql/schema/reduce_types.rb +0 -68
  408. data/lib/graphql/schema/rescue_middleware.rb +0 -53
  409. data/lib/graphql/schema/timeout_middleware.rb +0 -67
  410. data/lib/graphql/schema/type_map.rb +0 -30
  411. data/lib/graphql/schema/validation.rb +0 -164
  412. data/lib/graphql/static_validation/arguments_validator.rb +0 -48
  413. data/lib/graphql/static_validation/message.rb +0 -36
  414. data/lib/graphql/string_type.rb +0 -5
  415. data/lib/graphql/union_type.rb +0 -38
  416. data/spec/graphql/analysis/analyze_query_spec.rb +0 -50
  417. data/spec/graphql/analysis/max_query_complexity_spec.rb +0 -62
  418. data/spec/graphql/analysis/max_query_depth_spec.rb +0 -100
  419. data/spec/graphql/analysis/query_complexity_spec.rb +0 -235
  420. data/spec/graphql/analysis/query_depth_spec.rb +0 -80
  421. data/spec/graphql/argument_spec.rb +0 -20
  422. data/spec/graphql/base_type_spec.rb +0 -24
  423. data/spec/graphql/boolean_type_spec.rb +0 -20
  424. data/spec/graphql/define/instance_definable_spec.rb +0 -55
  425. data/spec/graphql/directive_spec.rb +0 -77
  426. data/spec/graphql/enum_type_spec.rb +0 -31
  427. data/spec/graphql/execution_error_spec.rb +0 -61
  428. data/spec/graphql/field_spec.rb +0 -92
  429. data/spec/graphql/float_type_spec.rb +0 -15
  430. data/spec/graphql/id_type_spec.rb +0 -32
  431. data/spec/graphql/input_object_type_spec.rb +0 -162
  432. data/spec/graphql/int_type_spec.rb +0 -15
  433. data/spec/graphql/interface_type_spec.rb +0 -56
  434. data/spec/graphql/internal_representation/rewrite_spec.rb +0 -120
  435. data/spec/graphql/introspection/directive_type_spec.rb +0 -50
  436. data/spec/graphql/introspection/input_value_type_spec.rb +0 -42
  437. data/spec/graphql/introspection/introspection_query_spec.rb +0 -10
  438. data/spec/graphql/introspection/schema_type_spec.rb +0 -45
  439. data/spec/graphql/introspection/type_type_spec.rb +0 -122
  440. data/spec/graphql/language/generation_spec.rb +0 -42
  441. data/spec/graphql/language/parser_spec.rb +0 -442
  442. data/spec/graphql/language/visitor_spec.rb +0 -49
  443. data/spec/graphql/list_type_spec.rb +0 -32
  444. data/spec/graphql/non_null_type_spec.rb +0 -31
  445. data/spec/graphql/object_type_spec.rb +0 -42
  446. data/spec/graphql/query/arguments_spec.rb +0 -25
  447. data/spec/graphql/query/context_spec.rb +0 -83
  448. data/spec/graphql/query/executor_spec.rb +0 -273
  449. data/spec/graphql/query/serial_execution/execution_context_spec.rb +0 -53
  450. data/spec/graphql/query/serial_execution/value_resolution_spec.rb +0 -66
  451. data/spec/graphql/query/type_resolver_spec.rb +0 -8
  452. data/spec/graphql/query/variables_spec.rb +0 -28
  453. data/spec/graphql/query_spec.rb +0 -363
  454. data/spec/graphql/scalar_type_spec.rb +0 -61
  455. data/spec/graphql/schema/catchall_middleware_spec.rb +0 -32
  456. data/spec/graphql/schema/middleware_chain_spec.rb +0 -42
  457. data/spec/graphql/schema/printer_spec.rb +0 -190
  458. data/spec/graphql/schema/reduce_types_spec.rb +0 -102
  459. data/spec/graphql/schema/rescue_middleware_spec.rb +0 -33
  460. data/spec/graphql/schema/timeout_middleware_spec.rb +0 -180
  461. data/spec/graphql/schema/type_expression_spec.rb +0 -38
  462. data/spec/graphql/schema/validation_spec.rb +0 -219
  463. data/spec/graphql/schema_spec.rb +0 -23
  464. data/spec/graphql/static_validation/rules/argument_literals_are_compatible_spec.rb +0 -63
  465. data/spec/graphql/static_validation/rules/arguments_are_defined_spec.rb +0 -48
  466. data/spec/graphql/static_validation/rules/directives_are_defined_spec.rb +0 -34
  467. data/spec/graphql/static_validation/rules/directives_are_in_valid_locations_spec.rb +0 -39
  468. data/spec/graphql/static_validation/rules/fields_are_defined_on_type_spec.rb +0 -60
  469. data/spec/graphql/static_validation/rules/fields_have_appropriate_selections_spec.rb +0 -31
  470. data/spec/graphql/static_validation/rules/fields_will_merge_spec.rb +0 -48
  471. data/spec/graphql/static_validation/rules/fragment_spreads_are_possible_spec.rb +0 -47
  472. data/spec/graphql/static_validation/rules/fragment_types_exist_spec.rb +0 -39
  473. data/spec/graphql/static_validation/rules/fragments_are_finite_spec.rb +0 -44
  474. data/spec/graphql/static_validation/rules/fragments_are_on_composite_types_spec.rb +0 -49
  475. data/spec/graphql/static_validation/rules/fragments_are_used_spec.rb +0 -25
  476. data/spec/graphql/static_validation/rules/required_arguments_are_present_spec.rb +0 -42
  477. data/spec/graphql/static_validation/rules/variable_default_values_are_correctly_typed_spec.rb +0 -44
  478. data/spec/graphql/static_validation/rules/variable_usages_are_allowed_spec.rb +0 -63
  479. data/spec/graphql/static_validation/rules/variables_are_input_types_spec.rb +0 -37
  480. data/spec/graphql/static_validation/rules/variables_are_used_and_defined_spec.rb +0 -53
  481. data/spec/graphql/static_validation/type_stack_spec.rb +0 -37
  482. data/spec/graphql/static_validation/validator_spec.rb +0 -69
  483. data/spec/graphql/string_type_spec.rb +0 -15
  484. data/spec/graphql/union_type_spec.rb +0 -31
  485. data/spec/spec_helper.rb +0 -18
  486. data/spec/support/dairy_app.rb +0 -309
  487. data/spec/support/dairy_data.rb +0 -23
  488. data/spec/support/minimum_input_object.rb +0 -16
  489. data/spec/support/star_wars_data.rb +0 -71
  490. data/spec/support/star_wars_schema.rb +0 -76
@@ -0,0 +1,386 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module Language
4
+ class Printer
5
+ # Turn an arbitrary AST node back into a string.
6
+ #
7
+ # @example Turning a document into a query string
8
+ # document = GraphQL.parse(query_string)
9
+ # GraphQL::Language::Printer.new.print(document)
10
+ # # => "{ ... }"
11
+ #
12
+ #
13
+ # @example Building a custom printer
14
+ #
15
+ # class MyPrinter < GraphQL::Language::Printer
16
+ # def print_argument(arg)
17
+ # "#{arg.name}: <HIDDEN>"
18
+ # end
19
+ # end
20
+ #
21
+ # MyPrinter.new.print(document)
22
+ # # => "mutation { pay(creditCard: <HIDDEN>) { success } }"
23
+ #
24
+ #
25
+ # @param indent [String] Whitespace to add to the printed node
26
+ # @return [String] Valid GraphQL for `node`
27
+ def print(node, indent: "")
28
+ print_node(node, indent: indent)
29
+ end
30
+
31
+ protected
32
+
33
+ def print_document(document)
34
+ document.definitions.map { |d| print_node(d) }.join("\n\n")
35
+ end
36
+
37
+ def print_argument(argument)
38
+ "#{argument.name}: #{print_node(argument.value)}".dup
39
+ end
40
+
41
+ def print_directive(directive)
42
+ out = "@#{directive.name}".dup
43
+
44
+ if directive.arguments.any?
45
+ out << "(#{directive.arguments.map { |a| print_argument(a) }.join(", ")})"
46
+ end
47
+
48
+ out
49
+ end
50
+
51
+ def print_enum(enum)
52
+ "#{enum.name}".dup
53
+ end
54
+
55
+ def print_null_value
56
+ "null".dup
57
+ end
58
+
59
+ def print_field(field, indent: "")
60
+ out = "#{indent}".dup
61
+ out << "#{field.alias}: " if field.alias
62
+ out << "#{field.name}"
63
+ out << "(#{field.arguments.map { |a| print_argument(a) }.join(", ")})" if field.arguments.any?
64
+ out << print_directives(field.directives)
65
+ out << print_selections(field.selections, indent: indent)
66
+ out
67
+ end
68
+
69
+ def print_fragment_definition(fragment_def, indent: "")
70
+ out = "#{indent}fragment #{fragment_def.name}".dup
71
+ if fragment_def.type
72
+ out << " on #{print_node(fragment_def.type)}"
73
+ end
74
+ out << print_directives(fragment_def.directives)
75
+ out << print_selections(fragment_def.selections, indent: indent)
76
+ out
77
+ end
78
+
79
+ def print_fragment_spread(fragment_spread, indent: "")
80
+ out = "#{indent}...#{fragment_spread.name}".dup
81
+ out << print_directives(fragment_spread.directives)
82
+ out
83
+ end
84
+
85
+ def print_inline_fragment(inline_fragment, indent: "")
86
+ out = "#{indent}...".dup
87
+ if inline_fragment.type
88
+ out << " on #{print_node(inline_fragment.type)}"
89
+ end
90
+ out << print_directives(inline_fragment.directives)
91
+ out << print_selections(inline_fragment.selections, indent: indent)
92
+ out
93
+ end
94
+
95
+ def print_input_object(input_object)
96
+ "{#{input_object.arguments.map { |a| print_argument(a) }.join(", ")}}"
97
+ end
98
+
99
+ def print_list_type(list_type)
100
+ "[#{print_node(list_type.of_type)}]".dup
101
+ end
102
+
103
+ def print_non_null_type(non_null_type)
104
+ "#{print_node(non_null_type.of_type)}!".dup
105
+ end
106
+
107
+ def print_operation_definition(operation_definition, indent: "")
108
+ out = "#{indent}#{operation_definition.operation_type}".dup
109
+ out << " #{operation_definition.name}" if operation_definition.name
110
+
111
+ if operation_definition.variables.any?
112
+ out << "(#{operation_definition.variables.map { |v| print_variable_definition(v) }.join(", ")})"
113
+ end
114
+
115
+ out << print_directives(operation_definition.directives)
116
+ out << print_selections(operation_definition.selections, indent: indent)
117
+ out
118
+ end
119
+
120
+ def print_type_name(type_name)
121
+ "#{type_name.name}".dup
122
+ end
123
+
124
+ def print_variable_definition(variable_definition)
125
+ out = "$#{variable_definition.name}: #{print_node(variable_definition.type)}".dup
126
+ out << " = #{print_node(variable_definition.default_value)}" unless variable_definition.default_value.nil?
127
+ out
128
+ end
129
+
130
+ def print_variable_identifier(variable_identifier)
131
+ "$#{variable_identifier.name}".dup
132
+ end
133
+
134
+ def print_schema_definition(schema)
135
+ has_conventional_names = (schema.query.nil? || schema.query == 'Query') &&
136
+ (schema.mutation.nil? || schema.mutation == 'Mutation') &&
137
+ (schema.subscription.nil? || schema.subscription == 'Subscription')
138
+
139
+ if has_conventional_names && schema.directives.empty?
140
+ return
141
+ end
142
+
143
+ out = "schema".dup
144
+ if schema.directives.any?
145
+ schema.directives.each do |dir|
146
+ out << "\n "
147
+ out << print_node(dir)
148
+ end
149
+ if !has_conventional_names
150
+ out << "\n"
151
+ end
152
+ end
153
+
154
+ if !has_conventional_names
155
+ if schema.directives.empty?
156
+ out << " "
157
+ end
158
+ out << "{\n"
159
+ out << " query: #{schema.query}\n" if schema.query
160
+ out << " mutation: #{schema.mutation}\n" if schema.mutation
161
+ out << " subscription: #{schema.subscription}\n" if schema.subscription
162
+ out << "}"
163
+ end
164
+ out
165
+ end
166
+
167
+ def print_scalar_type_definition(scalar_type)
168
+ out = print_description(scalar_type)
169
+ out << "scalar #{scalar_type.name}"
170
+ out << print_directives(scalar_type.directives)
171
+ end
172
+
173
+ def print_object_type_definition(object_type)
174
+ out = print_description(object_type)
175
+ out << "type #{object_type.name}"
176
+ out << print_implements(object_type) unless object_type.interfaces.empty?
177
+ out << print_directives(object_type.directives)
178
+ out << print_field_definitions(object_type.fields)
179
+ end
180
+
181
+ def print_implements(type)
182
+ " implements #{type.interfaces.map(&:name).join(" & ")}"
183
+ end
184
+
185
+ def print_input_value_definition(input_value)
186
+ out = "#{input_value.name}: #{print_node(input_value.type)}".dup
187
+ out << " = #{print_node(input_value.default_value)}" unless input_value.default_value.nil?
188
+ out << print_directives(input_value.directives)
189
+ end
190
+
191
+ def print_arguments(arguments, indent: "")
192
+ if arguments.all?{ |arg| !arg.description }
193
+ return "(#{arguments.map{ |arg| print_input_value_definition(arg) }.join(", ")})"
194
+ end
195
+
196
+ out = "(\n".dup
197
+ out << arguments.map.with_index{ |arg, i|
198
+ "#{print_description(arg, indent: " " + indent, first_in_block: i == 0)} #{indent}"\
199
+ "#{print_input_value_definition(arg)}"
200
+ }.join("\n")
201
+ out << "\n#{indent})"
202
+ end
203
+
204
+ def print_field_definition(field)
205
+ out = field.name.dup
206
+ unless field.arguments.empty?
207
+ out << print_arguments(field.arguments, indent: " ")
208
+ end
209
+ out << ": #{print_node(field.type)}"
210
+ out << print_directives(field.directives)
211
+ end
212
+
213
+ def print_interface_type_definition(interface_type)
214
+ out = print_description(interface_type)
215
+ out << "interface #{interface_type.name}"
216
+ out << print_implements(interface_type) if interface_type.interfaces.any?
217
+ out << print_directives(interface_type.directives)
218
+ out << print_field_definitions(interface_type.fields)
219
+ end
220
+
221
+ def print_union_type_definition(union_type)
222
+ out = print_description(union_type)
223
+ out << "union #{union_type.name}"
224
+ out << print_directives(union_type.directives)
225
+ out << " = " + union_type.types.map(&:name).join(" | ")
226
+ end
227
+
228
+ def print_enum_type_definition(enum_type)
229
+ out = print_description(enum_type)
230
+ out << "enum #{enum_type.name}#{print_directives(enum_type.directives)} {\n"
231
+ enum_type.values.each.with_index do |value, i|
232
+ out << print_description(value, indent: ' ', first_in_block: i == 0)
233
+ out << print_enum_value_definition(value)
234
+ end
235
+ out << "}"
236
+ end
237
+
238
+ def print_enum_value_definition(enum_value)
239
+ out = " #{enum_value.name}".dup
240
+ out << print_directives(enum_value.directives)
241
+ out << "\n"
242
+ end
243
+
244
+ def print_input_object_type_definition(input_object_type)
245
+ out = print_description(input_object_type)
246
+ out << "input #{input_object_type.name}"
247
+ out << print_directives(input_object_type.directives)
248
+ if !input_object_type.fields.empty?
249
+ out << " {\n"
250
+ input_object_type.fields.each.with_index do |field, i|
251
+ out << print_description(field, indent: ' ', first_in_block: i == 0)
252
+ out << " #{print_input_value_definition(field)}\n"
253
+ end
254
+ out << "}"
255
+ end
256
+ out
257
+ end
258
+
259
+ def print_directive_definition(directive)
260
+ out = print_description(directive)
261
+ out << "directive @#{directive.name}"
262
+
263
+ if directive.arguments.any?
264
+ out << print_arguments(directive.arguments)
265
+ end
266
+
267
+ if directive.repeatable
268
+ out << " repeatable"
269
+ end
270
+
271
+ out << " on #{directive.locations.map(&:name).join(' | ')}"
272
+ end
273
+
274
+ def print_description(node, indent: "", first_in_block: true)
275
+ return ''.dup unless node.description
276
+
277
+ description = indent != '' && !first_in_block ? "\n".dup : "".dup
278
+ description << GraphQL::Language::BlockString.print(node.description, indent: indent)
279
+ end
280
+
281
+ def print_field_definitions(fields)
282
+ if fields.empty?
283
+ ""
284
+ else
285
+ out = " {\n".dup
286
+ fields.each.with_index do |field, i|
287
+ out << print_description(field, indent: ' ', first_in_block: i == 0)
288
+ out << " #{print_field_definition(field)}\n"
289
+ end
290
+ out << "}"
291
+ end
292
+ end
293
+
294
+ def print_directives(directives)
295
+ if directives.any?
296
+ directives.map { |d| " #{print_directive(d)}" }.join
297
+ else
298
+ ""
299
+ end
300
+ end
301
+
302
+ def print_selections(selections, indent: "")
303
+ if selections.any?
304
+ out = " {\n".dup
305
+ selections.each do |selection|
306
+ out << print_node(selection, indent: indent + " ") << "\n"
307
+ end
308
+ out << "#{indent}}"
309
+ else
310
+ ""
311
+ end
312
+ end
313
+
314
+ def print_node(node, indent: "")
315
+ case node
316
+ when Nodes::Document
317
+ print_document(node)
318
+ when Nodes::Argument
319
+ print_argument(node)
320
+ when Nodes::Directive
321
+ print_directive(node)
322
+ when Nodes::Enum
323
+ print_enum(node)
324
+ when Nodes::NullValue
325
+ print_null_value
326
+ when Nodes::Field
327
+ print_field(node, indent: indent)
328
+ when Nodes::FragmentDefinition
329
+ print_fragment_definition(node, indent: indent)
330
+ when Nodes::FragmentSpread
331
+ print_fragment_spread(node, indent: indent)
332
+ when Nodes::InlineFragment
333
+ print_inline_fragment(node, indent: indent)
334
+ when Nodes::InputObject
335
+ print_input_object(node)
336
+ when Nodes::ListType
337
+ print_list_type(node)
338
+ when Nodes::NonNullType
339
+ print_non_null_type(node)
340
+ when Nodes::OperationDefinition
341
+ print_operation_definition(node, indent: indent)
342
+ when Nodes::TypeName
343
+ print_type_name(node)
344
+ when Nodes::VariableDefinition
345
+ print_variable_definition(node)
346
+ when Nodes::VariableIdentifier
347
+ print_variable_identifier(node)
348
+ when Nodes::SchemaDefinition
349
+ print_schema_definition(node)
350
+ when Nodes::ScalarTypeDefinition
351
+ print_scalar_type_definition(node)
352
+ when Nodes::ObjectTypeDefinition
353
+ print_object_type_definition(node)
354
+ when Nodes::InputValueDefinition
355
+ print_input_value_definition(node)
356
+ when Nodes::FieldDefinition
357
+ print_field_definition(node)
358
+ when Nodes::InterfaceTypeDefinition
359
+ print_interface_type_definition(node)
360
+ when Nodes::UnionTypeDefinition
361
+ print_union_type_definition(node)
362
+ when Nodes::EnumTypeDefinition
363
+ print_enum_type_definition(node)
364
+ when Nodes::EnumValueDefinition
365
+ print_enum_value_definition(node)
366
+ when Nodes::InputObjectTypeDefinition
367
+ print_input_object_type_definition(node)
368
+ when Nodes::DirectiveDefinition
369
+ print_directive_definition(node)
370
+ when FalseClass, Float, Integer, NilClass, String, TrueClass, Symbol
371
+ GraphQL::Language.serialize(node)
372
+ when Array
373
+ "[#{node.map { |v| print_node(v) }.join(", ")}]".dup
374
+ when Hash
375
+ "{#{node.map { |k, v| "#{k}: #{print_node(v)}" }.join(", ")}}".dup
376
+ else
377
+ GraphQL::Language.serialize(node.to_s)
378
+ end
379
+ end
380
+
381
+ private
382
+
383
+ attr_reader :node
384
+ end
385
+ end
386
+ end
@@ -0,0 +1,222 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module Language
4
+ # A custom printer used to print sanitized queries. It inlines provided variables
5
+ # within the query for facilitate logging and analysis of queries.
6
+ #
7
+ # The printer returns `nil` if the query is invalid.
8
+ #
9
+ # Since the GraphQL Ruby AST for a GraphQL query doesnt contain any reference
10
+ # on the type of fields or arguments, we have to track the current object, field
11
+ # and input type while printing the query.
12
+ #
13
+ # @example Printing a scrubbed string
14
+ # printer = QueryPrinter.new(query)
15
+ # puts printer.sanitized_query_string
16
+ #
17
+ # @see {Query#sanitized_query_string}
18
+ class SanitizedPrinter < GraphQL::Language::Printer
19
+
20
+ REDACTED = "\"<REDACTED>\""
21
+
22
+ def initialize(query, inline_variables: true)
23
+ @query = query
24
+ @current_type = nil
25
+ @current_field = nil
26
+ @current_input_type = nil
27
+ @inline_variables = inline_variables
28
+ end
29
+
30
+ # @return [String, nil] A scrubbed query string, if the query was valid.
31
+ def sanitized_query_string
32
+ if query.valid?
33
+ print(query.document)
34
+ else
35
+ nil
36
+ end
37
+ end
38
+
39
+ def print_node(node, indent: "")
40
+ case node
41
+ when FalseClass, Float, Integer, String, TrueClass
42
+ if @current_argument && redact_argument_value?(@current_argument, node)
43
+ redacted_argument_value(@current_argument)
44
+ else
45
+ super
46
+ end
47
+ when Array
48
+ old_input_type = @current_input_type
49
+ if @current_input_type && @current_input_type.list?
50
+ @current_input_type = @current_input_type.of_type
51
+ @current_input_type = @current_input_type.of_type if @current_input_type.non_null?
52
+ end
53
+
54
+ res = super
55
+ @current_input_type = old_input_type
56
+ res
57
+ else
58
+ super
59
+ end
60
+ end
61
+
62
+ # Indicates whether or not to redact non-null values for the given argument. Defaults to redacting all strings
63
+ # arguments but this can be customized by subclasses.
64
+ def redact_argument_value?(argument, value)
65
+ # Default to redacting any strings or custom scalars encoded as strings
66
+ type = argument.type.unwrap
67
+ value.is_a?(String) && type.kind.scalar? && (type.graphql_name == "String" || !type.default_scalar?)
68
+ end
69
+
70
+ # Returns the value to use for redacted versions of the given argument. Defaults to the
71
+ # string "<REDACTED>".
72
+ def redacted_argument_value(argument)
73
+ REDACTED
74
+ end
75
+
76
+ def print_argument(argument)
77
+ # We won't have type information if we're recursing into a custom scalar
78
+ return super if @current_input_type && @current_input_type.kind.scalar?
79
+
80
+ arg_owner = @current_input_type || @current_directive || @current_field
81
+ old_current_argument = @current_argument
82
+ @current_argument = arg_owner.get_argument(argument.name, @query.context)
83
+
84
+ old_input_type = @current_input_type
85
+ @current_input_type = @current_argument.type.non_null? ? @current_argument.type.of_type : @current_argument.type
86
+
87
+ argument_value = if coerce_argument_value_to_list?(@current_input_type, argument.value)
88
+ [argument.value]
89
+ else
90
+ argument.value
91
+ end
92
+ res = "#{argument.name}: #{print_node(argument_value)}".dup
93
+
94
+ @current_input_type = old_input_type
95
+ @current_argument = old_current_argument
96
+ res
97
+ end
98
+
99
+ def coerce_argument_value_to_list?(type, value)
100
+ type.list? &&
101
+ !value.is_a?(Array) &&
102
+ !value.nil? &&
103
+ !value.is_a?(GraphQL::Language::Nodes::VariableIdentifier)
104
+ end
105
+
106
+ def print_variable_identifier(variable_id)
107
+ if @inline_variables
108
+ variable_value = query.variables[variable_id.name]
109
+ print_node(value_to_ast(variable_value, @current_input_type))
110
+ else
111
+ super
112
+ end
113
+ end
114
+
115
+ def print_field(field, indent: "")
116
+ @current_field = query.get_field(@current_type, field.name)
117
+ old_type = @current_type
118
+ @current_type = @current_field.type.unwrap
119
+ res = super
120
+ @current_type = old_type
121
+ res
122
+ end
123
+
124
+ def print_inline_fragment(inline_fragment, indent: "")
125
+ old_type = @current_type
126
+
127
+ if inline_fragment.type
128
+ @current_type = query.get_type(inline_fragment.type.name)
129
+ end
130
+
131
+ res = super
132
+
133
+ @current_type = old_type
134
+
135
+ res
136
+ end
137
+
138
+ def print_fragment_definition(fragment_def, indent: "")
139
+ old_type = @current_type
140
+ @current_type = query.get_type(fragment_def.type.name)
141
+
142
+ res = super
143
+
144
+ @current_type = old_type
145
+
146
+ res
147
+ end
148
+
149
+ def print_directive(directive)
150
+ @current_directive = query.schema.directives[directive.name]
151
+
152
+ res = super
153
+
154
+ @current_directive = nil
155
+ res
156
+ end
157
+
158
+ # Print the operation definition but do not include the variable
159
+ # definitions since we will inline them within the query
160
+ def print_operation_definition(operation_definition, indent: "")
161
+ old_type = @current_type
162
+ @current_type = query.schema.public_send(operation_definition.operation_type)
163
+
164
+ if @inline_variables
165
+ out = "#{indent}#{operation_definition.operation_type}".dup
166
+ out << " #{operation_definition.name}" if operation_definition.name
167
+ out << print_directives(operation_definition.directives)
168
+ out << print_selections(operation_definition.selections, indent: indent)
169
+ else
170
+ out = super
171
+ end
172
+
173
+ @current_type = old_type
174
+ out
175
+ end
176
+
177
+ private
178
+
179
+ def value_to_ast(value, type)
180
+ type = type.of_type if type.non_null?
181
+
182
+ if value.nil?
183
+ return GraphQL::Language::Nodes::NullValue.new(name: "null")
184
+ end
185
+
186
+ case type.kind.name
187
+ when "INPUT_OBJECT"
188
+ value = if value.respond_to?(:to_unsafe_h)
189
+ # for ActionController::Parameters
190
+ value.to_unsafe_h
191
+ else
192
+ value.to_h
193
+ end
194
+
195
+ arguments = value.map do |key, val|
196
+ sub_type = type.get_argument(key.to_s, @query.context).type
197
+
198
+ GraphQL::Language::Nodes::Argument.new(
199
+ name: key.to_s,
200
+ value: value_to_ast(val, sub_type)
201
+ )
202
+ end
203
+ GraphQL::Language::Nodes::InputObject.new(
204
+ arguments: arguments
205
+ )
206
+ when "LIST"
207
+ if value.is_a?(Array)
208
+ value.map { |v| value_to_ast(v, type.of_type) }
209
+ else
210
+ [value].map { |v| value_to_ast(v, type.of_type) }
211
+ end
212
+ when "ENUM"
213
+ GraphQL::Language::Nodes::Enum.new(name: value)
214
+ else
215
+ value
216
+ end
217
+ end
218
+
219
+ attr_reader :query
220
+ end
221
+ end
222
+ end
@@ -1,21 +1,34 @@
1
+ # frozen_string_literal: true
1
2
  module GraphQL
2
3
  module Language
4
+ # Emitted by the lexer and passed to the parser.
5
+ # Contains type, value and position data.
3
6
  class Token
7
+ # @return [Symbol] The kind of token this is
4
8
  attr_reader :name
5
- def initialize(value:, name:, line:, col:)
9
+ # @return [String] The text of this token
10
+ attr_reader :value
11
+ attr_reader :prev_token, :line, :col
12
+
13
+ def initialize(name, value, line, col, prev_token)
6
14
  @name = name
7
- @value = value
15
+ @value = -value
8
16
  @line = line
9
17
  @col = col
18
+ @prev_token = prev_token
10
19
  end
11
20
 
12
- def to_s; @value; end
21
+ alias to_s value
13
22
  def to_i; @value.to_i; end
14
23
  def to_f; @value.to_f; end
15
24
 
16
25
  def line_and_column
17
26
  [@line, @col]
18
27
  end
28
+
29
+ def inspect
30
+ "(#{@name} #{@value.inspect} [#{@line}:#{@col}])"
31
+ end
19
32
  end
20
33
  end
21
34
  end