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,99 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module Language
4
+ module BlockString
5
+ # Remove leading and trailing whitespace from a block string.
6
+ # See "Block Strings" in https://github.com/facebook/graphql/blob/master/spec/Section%202%20--%20Language.md
7
+ def self.trim_whitespace(str)
8
+ # Early return for the most common cases:
9
+ if str == ""
10
+ return "".dup
11
+ elsif !(has_newline = str.include?("\n")) && !(str.start_with?(" "))
12
+ return str
13
+ end
14
+
15
+ lines = has_newline ? str.split("\n") : [str]
16
+ common_indent = nil
17
+
18
+ # find the common whitespace
19
+ lines.each_with_index do |line, idx|
20
+ if idx == 0
21
+ next
22
+ end
23
+ line_length = line.size
24
+ line_indent = if line.match?(/\A [^ ]/)
25
+ 2
26
+ elsif line.match?(/\A [^ ]/)
27
+ 4
28
+ elsif line.match?(/\A[^ ]/)
29
+ 0
30
+ else
31
+ line[/\A */].size
32
+ end
33
+ if line_indent < line_length && (common_indent.nil? || line_indent < common_indent)
34
+ common_indent = line_indent
35
+ end
36
+ end
37
+
38
+ # Remove the common whitespace
39
+ if common_indent && common_indent > 0
40
+ lines.each_with_index do |line, idx|
41
+ if idx == 0
42
+ next
43
+ else
44
+ line.slice!(0, common_indent)
45
+ end
46
+ end
47
+ end
48
+
49
+ # Remove leading & trailing blank lines
50
+ while lines.size > 0 && lines[0].empty?
51
+ lines.shift
52
+ end
53
+ while lines.size > 0 && lines[-1].empty?
54
+ lines.pop
55
+ end
56
+
57
+ # Rebuild the string
58
+ lines.size > 1 ? lines.join("\n") : (lines.first || "".dup)
59
+ end
60
+
61
+ def self.print(str, indent: '')
62
+ lines = str.split("\n")
63
+
64
+ block_str = "#{indent}\"\"\"\n".dup
65
+
66
+ lines.each do |line|
67
+ if line == ''
68
+ block_str << "\n"
69
+ else
70
+ sublines = break_line(line, 120 - indent.length)
71
+ sublines.each do |subline|
72
+ block_str << "#{indent}#{subline}\n"
73
+ end
74
+ end
75
+ end
76
+
77
+ block_str << "#{indent}\"\"\"\n".dup
78
+ end
79
+
80
+ private
81
+
82
+ def self.break_line(line, length)
83
+ return [line] if line.length < length + 5
84
+
85
+ parts = line.split(Regexp.new("((?: |^).{15,#{length - 40}}(?= |$))"))
86
+ return [line] if parts.length < 4
87
+
88
+ sublines = [parts.slice!(0, 3).join]
89
+
90
+ parts.each_with_index do |part, i|
91
+ next if i % 2 == 1
92
+ sublines << "#{part[1..-1]}#{parts[i + 1]}"
93
+ end
94
+
95
+ sublines
96
+ end
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'graphql/version'
4
+ require 'digest/sha2'
5
+
6
+ module GraphQL
7
+ module Language
8
+ class Cache
9
+ def initialize(path)
10
+ @path = path
11
+ end
12
+
13
+ DIGEST = Digest::SHA256.new << GraphQL::VERSION
14
+ def fetch(filename)
15
+ hash = DIGEST.dup << filename
16
+ begin
17
+ hash << File.mtime(filename).to_i.to_s
18
+ rescue SystemCallError
19
+ return yield
20
+ end
21
+ cache_path = @path.join(hash.to_s)
22
+
23
+ if cache_path.exist?
24
+ Marshal.load(cache_path.read)
25
+ else
26
+ payload = yield
27
+ tmp_path = "#{cache_path}.#{rand}"
28
+
29
+ @path.mkpath
30
+ File.binwrite(tmp_path, Marshal.dump(payload))
31
+ File.rename(tmp_path, cache_path.to_s)
32
+ payload
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module Language
4
+ module DefinitionSlice
5
+ extend self
6
+
7
+ def slice(document, name)
8
+ definitions = {}
9
+ document.definitions.each { |d| definitions[d.name] = d }
10
+ names = Set.new
11
+ DependencyVisitor.find_definition_dependencies(definitions, name, names)
12
+ definitions = document.definitions.select { |d| names.include?(d.name) }
13
+ Nodes::Document.new(definitions: definitions)
14
+ end
15
+
16
+ private
17
+
18
+ class DependencyVisitor < GraphQL::Language::Visitor
19
+ def initialize(doc, definitions, names)
20
+ @names = names
21
+ @definitions = definitions
22
+ super(doc)
23
+ end
24
+
25
+ def on_fragment_spread(node, parent)
26
+ if fragment = @definitions[node.name]
27
+ self.class.find_definition_dependencies(@definitions, fragment.name, @names)
28
+ end
29
+ super
30
+ end
31
+
32
+ def self.find_definition_dependencies(definitions, name, names)
33
+ names.add(name)
34
+ visitor = self.new(definitions[name], definitions, names)
35
+ visitor.visit
36
+ nil
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,335 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module Language
4
+ # @api private
5
+ #
6
+ # {GraphQL::Language::DocumentFromSchemaDefinition} is used to convert a {GraphQL::Schema} object
7
+ # To a {GraphQL::Language::Document} AST node.
8
+ #
9
+ # @param context [Hash]
10
+ # @param only [<#call(member, ctx)>]
11
+ # @param except [<#call(member, ctx)>]
12
+ # @param include_introspection_types [Boolean] Whether or not to include introspection types in the AST
13
+ # @param include_built_in_scalars [Boolean] Whether or not to include built in scalars in the AST
14
+ # @param include_built_in_directives [Boolean] Whether or not to include built in directives in the AST
15
+ class DocumentFromSchemaDefinition
16
+ def initialize(
17
+ schema, context: nil, only: nil, except: nil, include_introspection_types: false,
18
+ include_built_in_directives: false, include_built_in_scalars: false, always_include_schema: false
19
+ )
20
+ @schema = schema
21
+ @always_include_schema = always_include_schema
22
+ @include_introspection_types = include_introspection_types
23
+ @include_built_in_scalars = include_built_in_scalars
24
+ @include_built_in_directives = include_built_in_directives
25
+
26
+ filter = GraphQL::Filter.new(only: only, except: except)
27
+ if @schema.respond_to?(:visible?)
28
+ filter = filter.merge(only: @schema.method(:visible?))
29
+ end
30
+
31
+ schema_context = schema.context_class.new(query: nil, object: nil, schema: schema, values: context)
32
+ @warden = GraphQL::Schema::Warden.new(
33
+ filter,
34
+ schema: @schema,
35
+ context: schema_context,
36
+ )
37
+ schema_context.warden = @warden
38
+ end
39
+
40
+ def document
41
+ GraphQL::Language::Nodes::Document.new(
42
+ definitions: build_definition_nodes
43
+ )
44
+ end
45
+
46
+ def build_schema_node
47
+ schema_options = {
48
+ # `@schema.directives` is covered by `build_definition_nodes`
49
+ directives: definition_directives(@schema, :schema_directives),
50
+ }
51
+ if !schema_respects_root_name_conventions?(@schema)
52
+ schema_options.merge!({
53
+ query: (q = warden.root_type_for_operation("query")) && q.graphql_name,
54
+ mutation: (m = warden.root_type_for_operation("mutation")) && m.graphql_name,
55
+ subscription: (s = warden.root_type_for_operation("subscription")) && s.graphql_name,
56
+ })
57
+ end
58
+ GraphQL::Language::Nodes::SchemaDefinition.new(schema_options)
59
+ end
60
+
61
+ def build_object_type_node(object_type)
62
+ GraphQL::Language::Nodes::ObjectTypeDefinition.new(
63
+ name: object_type.graphql_name,
64
+ interfaces: warden.interfaces(object_type).sort_by(&:graphql_name).map { |iface| build_type_name_node(iface) },
65
+ fields: build_field_nodes(warden.fields(object_type)),
66
+ description: object_type.description,
67
+ directives: directives(object_type),
68
+ )
69
+ end
70
+
71
+ def build_field_node(field)
72
+ GraphQL::Language::Nodes::FieldDefinition.new(
73
+ name: field.graphql_name,
74
+ arguments: build_argument_nodes(warden.arguments(field)),
75
+ type: build_type_name_node(field.type),
76
+ description: field.description,
77
+ directives: directives(field),
78
+ )
79
+ end
80
+
81
+ def build_union_type_node(union_type)
82
+ GraphQL::Language::Nodes::UnionTypeDefinition.new(
83
+ name: union_type.graphql_name,
84
+ description: union_type.description,
85
+ types: warden.possible_types(union_type).sort_by(&:graphql_name).map { |type| build_type_name_node(type) },
86
+ directives: directives(union_type),
87
+ )
88
+ end
89
+
90
+ def build_interface_type_node(interface_type)
91
+ GraphQL::Language::Nodes::InterfaceTypeDefinition.new(
92
+ name: interface_type.graphql_name,
93
+ interfaces: warden.interfaces(interface_type).sort_by(&:graphql_name).map { |type| build_type_name_node(type) },
94
+ description: interface_type.description,
95
+ fields: build_field_nodes(warden.fields(interface_type)),
96
+ directives: directives(interface_type),
97
+ )
98
+ end
99
+
100
+ def build_enum_type_node(enum_type)
101
+ GraphQL::Language::Nodes::EnumTypeDefinition.new(
102
+ name: enum_type.graphql_name,
103
+ values: warden.enum_values(enum_type).sort_by(&:graphql_name).map do |enum_value|
104
+ build_enum_value_node(enum_value)
105
+ end,
106
+ description: enum_type.description,
107
+ directives: directives(enum_type),
108
+ )
109
+ end
110
+
111
+ def build_enum_value_node(enum_value)
112
+ GraphQL::Language::Nodes::EnumValueDefinition.new(
113
+ name: enum_value.graphql_name,
114
+ description: enum_value.description,
115
+ directives: directives(enum_value),
116
+ )
117
+ end
118
+
119
+ def build_scalar_type_node(scalar_type)
120
+ GraphQL::Language::Nodes::ScalarTypeDefinition.new(
121
+ name: scalar_type.graphql_name,
122
+ description: scalar_type.description,
123
+ directives: directives(scalar_type),
124
+ )
125
+ end
126
+
127
+ def build_argument_node(argument)
128
+ if argument.default_value?
129
+ default_value = build_default_value(argument.default_value, argument.type)
130
+ else
131
+ default_value = nil
132
+ end
133
+
134
+ argument_node = GraphQL::Language::Nodes::InputValueDefinition.new(
135
+ name: argument.graphql_name,
136
+ description: argument.description,
137
+ type: build_type_name_node(argument.type),
138
+ default_value: default_value,
139
+ directives: directives(argument),
140
+ )
141
+
142
+ argument_node
143
+ end
144
+
145
+ def build_input_object_node(input_object)
146
+ GraphQL::Language::Nodes::InputObjectTypeDefinition.new(
147
+ name: input_object.graphql_name,
148
+ fields: build_argument_nodes(warden.arguments(input_object)),
149
+ description: input_object.description,
150
+ directives: directives(input_object),
151
+ )
152
+ end
153
+
154
+ def build_directive_node(directive)
155
+ GraphQL::Language::Nodes::DirectiveDefinition.new(
156
+ name: directive.graphql_name,
157
+ repeatable: directive.repeatable?,
158
+ arguments: build_argument_nodes(warden.arguments(directive)),
159
+ locations: build_directive_location_nodes(directive.locations),
160
+ description: directive.description,
161
+ )
162
+ end
163
+
164
+ def build_directive_location_nodes(locations)
165
+ locations.sort.map { |location| build_directive_location_node(location) }
166
+ end
167
+
168
+ def build_directive_location_node(location)
169
+ GraphQL::Language::Nodes::DirectiveLocation.new(
170
+ name: location.to_s
171
+ )
172
+ end
173
+
174
+ def build_type_name_node(type)
175
+ case type.kind.name
176
+ when "LIST"
177
+ GraphQL::Language::Nodes::ListType.new(
178
+ of_type: build_type_name_node(type.of_type)
179
+ )
180
+ when "NON_NULL"
181
+ GraphQL::Language::Nodes::NonNullType.new(
182
+ of_type: build_type_name_node(type.of_type)
183
+ )
184
+ else
185
+ GraphQL::Language::Nodes::TypeName.new(name: type.graphql_name)
186
+ end
187
+ end
188
+
189
+ def build_default_value(default_value, type)
190
+ if default_value.nil?
191
+ return GraphQL::Language::Nodes::NullValue.new(name: "null")
192
+ end
193
+
194
+ case type.kind.name
195
+ when "SCALAR"
196
+ type.coerce_isolated_result(default_value)
197
+ when "ENUM"
198
+ GraphQL::Language::Nodes::Enum.new(name: type.coerce_isolated_result(default_value))
199
+ when "INPUT_OBJECT"
200
+ GraphQL::Language::Nodes::InputObject.new(
201
+ arguments: default_value.to_h.map do |arg_name, arg_value|
202
+ args = @warden.arguments(type)
203
+ arg = args.find { |a| a.keyword.to_s == arg_name.to_s }
204
+ if arg.nil?
205
+ raise ArgumentError, "No argument definition on #{type.graphql_name} for argument: #{arg_name.inspect} (expected one of: #{args.map(&:keyword)})"
206
+ end
207
+ GraphQL::Language::Nodes::Argument.new(
208
+ name: arg.graphql_name.to_s,
209
+ value: build_default_value(arg_value, arg.type)
210
+ )
211
+ end
212
+ )
213
+ when "NON_NULL"
214
+ build_default_value(default_value, type.of_type)
215
+ when "LIST"
216
+ default_value.to_a.map { |v| build_default_value(v, type.of_type) }
217
+ else
218
+ raise GraphQL::RequiredImplementationMissingError, "Unexpected default value type #{type.inspect}"
219
+ end
220
+ end
221
+
222
+ def build_type_definition_node(type)
223
+ case type.kind.name
224
+ when "OBJECT"
225
+ build_object_type_node(type)
226
+ when "UNION"
227
+ build_union_type_node(type)
228
+ when "INTERFACE"
229
+ build_interface_type_node(type)
230
+ when "SCALAR"
231
+ build_scalar_type_node(type)
232
+ when "ENUM"
233
+ build_enum_type_node(type)
234
+ when "INPUT_OBJECT"
235
+ build_input_object_node(type)
236
+ else
237
+ raise TypeError
238
+ end
239
+ end
240
+
241
+ def build_argument_nodes(arguments)
242
+ arguments
243
+ .map { |arg| build_argument_node(arg) }
244
+ .sort_by(&:name)
245
+ end
246
+
247
+ def build_directive_nodes(directives)
248
+ if !include_built_in_directives
249
+ directives = directives.reject { |directive| directive.default_directive? }
250
+ end
251
+
252
+ directives
253
+ .map { |directive| build_directive_node(directive) }
254
+ .sort_by(&:name)
255
+ end
256
+
257
+ def build_definition_nodes
258
+ definitions = []
259
+ definitions << build_schema_node if include_schema_node?
260
+ definitions += build_directive_nodes(warden.directives)
261
+ definitions += build_type_definition_nodes(warden.reachable_types)
262
+ definitions
263
+ end
264
+
265
+ def build_type_definition_nodes(types)
266
+ if !include_introspection_types
267
+ types = types.reject { |type| type.introspection? }
268
+ end
269
+
270
+ if !include_built_in_scalars
271
+ types = types.reject { |type| type.kind.scalar? && type.default_scalar? }
272
+ end
273
+
274
+ types
275
+ .map { |type| build_type_definition_node(type) }
276
+ .sort_by(&:name)
277
+ end
278
+
279
+ def build_field_nodes(fields)
280
+ fields
281
+ .map { |field| build_field_node(field) }
282
+ .sort_by(&:name)
283
+ end
284
+
285
+ private
286
+
287
+ def include_schema_node?
288
+ always_include_schema ||
289
+ !schema_respects_root_name_conventions?(schema) ||
290
+ !schema.schema_directives.empty?
291
+ end
292
+
293
+ def schema_respects_root_name_conventions?(schema)
294
+ (schema.query.nil? || schema.query.graphql_name == 'Query') &&
295
+ (schema.mutation.nil? || schema.mutation.graphql_name == 'Mutation') &&
296
+ (schema.subscription.nil? || schema.subscription.graphql_name == 'Subscription')
297
+ end
298
+
299
+ def directives(member)
300
+ definition_directives(member, :directives)
301
+ end
302
+
303
+ def definition_directives(member, directives_method)
304
+ dirs = if !member.respond_to?(directives_method) || member.directives.empty?
305
+ []
306
+ else
307
+ member.public_send(directives_method).map do |dir|
308
+ args = []
309
+ dir.arguments.argument_values.each_value do |arg_value| # rubocop:disable Development/ContextIsPassedCop -- directive instance method
310
+ arg_defn = arg_value.definition
311
+ if arg_defn.default_value? && arg_value.value == arg_defn.default_value
312
+ next
313
+ else
314
+ value_node = build_default_value(arg_value.value, arg_value.definition.type)
315
+ args << GraphQL::Language::Nodes::Argument.new(
316
+ name: arg_value.definition.name,
317
+ value: value_node,
318
+ )
319
+ end
320
+ end
321
+ GraphQL::Language::Nodes::Directive.new(
322
+ name: dir.class.graphql_name,
323
+ arguments: args
324
+ )
325
+ end
326
+ end
327
+
328
+ dirs
329
+ end
330
+
331
+ attr_reader :schema, :warden, :always_include_schema,
332
+ :include_introspection_types, :include_built_in_directives, :include_built_in_scalars
333
+ end
334
+ end
335
+ end
@@ -1,93 +1,23 @@
1
+ # frozen_string_literal: true
1
2
  module GraphQL
2
3
  module Language
4
+ # Exposes {.generate}, which turns AST nodes back into query strings.
3
5
  module Generation
4
- def self.generate(node, indent: "")
5
- case node
6
- when Nodes::Document
7
- node.definitions.map { |d| generate(d) }.join("\n")
8
- when Nodes::Argument
9
- "#{node.name}: #{generate(node.value)}"
10
- when Nodes::Directive
11
- "@#{node.name}(#{node.arguments.map { |a| generate(a) }.join(", ")})"
12
- when Nodes::Enum
13
- "#{node.name}"
14
- when Nodes::Field
15
- out = "#{indent}"
16
- out << "#{node.alias}: " if node.alias
17
- out << "#{node.name}"
18
- out << "(#{node.arguments.map { |a| generate(a) }.join(", ")})" if node.arguments.any?
19
- out << generate_directives(node.directives)
20
- out << generate_selections(node.selections, indent: indent)
21
- out
22
- when Nodes::FragmentDefinition
23
- out = "#{indent}fragment #{node.name}"
24
- out << " on #{node.type}" if node.type
25
- out << generate_directives(node.directives)
26
- out << generate_selections(node.selections, indent: indent)
27
- out
6
+ extend self
28
7
 
29
- when Nodes::FragmentSpread
30
- out = "#{indent}... #{node.name}"
31
- out << generate_directives(node.directives)
32
- out
33
- when Nodes::InlineFragment
34
- out = "#{indent}..."
35
- out << " on #{node.type}" if node.type
36
- out << generate_directives(node.directives)
37
- out << generate_selections(node.selections, indent: indent)
38
- out
39
- when Nodes::InputObject
40
- generate(node.to_h)
41
- when Nodes::ListType
42
- "[#{generate(node.of_type)}]"
43
- when Nodes::NonNullType
44
- "#{generate(node.of_type)}!"
45
- when Nodes::OperationDefinition
46
- out = "#{indent}#{node.operation_type}"
47
- out << " #{node.name}" if node.name
48
- out << "(#{node.variables.map { |v| generate(v) }.join(", ")})" if node.variables.any?
49
- out << generate_directives(node.directives)
50
- out << generate_selections(node.selections, indent: indent)
51
- out
52
- when Nodes::TypeName
53
- "#{node.name}"
54
- when Nodes::VariableDefinition
55
- out = "$#{node.name}: #{generate(node.type)}"
56
- out << " = #{generate(node.default_value)}" if node.default_value
57
- out
58
- when Nodes::VariableIdentifier
59
- "$#{node.name}"
60
- when Nodes::AbstractNode
61
- node.to_query_string(indent: indent)
62
- when FalseClass, Float, Integer, NilClass, String, TrueClass
63
- JSON.generate(node, quirks_mode: true)
64
- when Array
65
- "[#{node.map { |v| generate(v) }.join(", ")}]"
66
- when Hash
67
- "{#{node.map { |k, v| "#{k}: #{generate(v)}" }.join(", ")}}"
68
- else
69
- raise TypeError
70
- end
71
- end
72
-
73
- def self.generate_directives(directives)
74
- if directives.any?
75
- directives.map { |d| " #{generate(d)}" }.join
76
- else
77
- ""
78
- end
79
- end
80
-
81
- def self.generate_selections(selections, indent: "")
82
- if selections.any?
83
- out = " {\n"
84
- selections.each do |selection|
85
- out << generate(selection, indent: indent + " ") << "\n"
86
- end
87
- out << "#{indent}}"
88
- else
89
- ""
90
- end
8
+ # Turn an AST node back into a string.
9
+ #
10
+ # @example Turning a document into a query
11
+ # document = GraphQL.parse(query_string)
12
+ # GraphQL::Language::Generation.generate(document)
13
+ # # => "{ ... }"
14
+ #
15
+ # @param node [GraphQL::Language::Nodes::AbstractNode] an AST node to recursively stringify
16
+ # @param indent [String] Whitespace to add to each printed node
17
+ # @param printer [GraphQL::Language::Printer] An optional custom printer for printing AST nodes. Defaults to GraphQL::Language::Printer
18
+ # @return [String] Valid GraphQL for `node`
19
+ def generate(node, indent: "", printer: GraphQL::Language::Printer.new)
20
+ printer.print(node, indent: indent)
91
21
  end
92
22
  end
93
23
  end