graphql_cody 1.13.0

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.
Files changed (444) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +5 -0
  3. data/MIT-LICENSE +20 -0
  4. data/lib/generators/graphql/core.rb +74 -0
  5. data/lib/generators/graphql/enum_generator.rb +33 -0
  6. data/lib/generators/graphql/install_generator.rb +190 -0
  7. data/lib/generators/graphql/interface_generator.rb +27 -0
  8. data/lib/generators/graphql/loader_generator.rb +21 -0
  9. data/lib/generators/graphql/mutation_generator.rb +55 -0
  10. data/lib/generators/graphql/object_generator.rb +79 -0
  11. data/lib/generators/graphql/relay.rb +63 -0
  12. data/lib/generators/graphql/relay_generator.rb +21 -0
  13. data/lib/generators/graphql/scalar_generator.rb +20 -0
  14. data/lib/generators/graphql/templates/base_argument.erb +6 -0
  15. data/lib/generators/graphql/templates/base_connection.erb +8 -0
  16. data/lib/generators/graphql/templates/base_edge.erb +8 -0
  17. data/lib/generators/graphql/templates/base_enum.erb +6 -0
  18. data/lib/generators/graphql/templates/base_field.erb +7 -0
  19. data/lib/generators/graphql/templates/base_input_object.erb +7 -0
  20. data/lib/generators/graphql/templates/base_interface.erb +9 -0
  21. data/lib/generators/graphql/templates/base_mutation.erb +10 -0
  22. data/lib/generators/graphql/templates/base_object.erb +7 -0
  23. data/lib/generators/graphql/templates/base_scalar.erb +6 -0
  24. data/lib/generators/graphql/templates/base_union.erb +6 -0
  25. data/lib/generators/graphql/templates/enum.erb +7 -0
  26. data/lib/generators/graphql/templates/graphql_controller.erb +52 -0
  27. data/lib/generators/graphql/templates/interface.erb +8 -0
  28. data/lib/generators/graphql/templates/loader.erb +19 -0
  29. data/lib/generators/graphql/templates/mutation.erb +16 -0
  30. data/lib/generators/graphql/templates/mutation_type.erb +12 -0
  31. data/lib/generators/graphql/templates/node_type.erb +9 -0
  32. data/lib/generators/graphql/templates/object.erb +8 -0
  33. data/lib/generators/graphql/templates/query_type.erb +15 -0
  34. data/lib/generators/graphql/templates/scalar.erb +15 -0
  35. data/lib/generators/graphql/templates/schema.erb +27 -0
  36. data/lib/generators/graphql/templates/union.erb +7 -0
  37. data/lib/generators/graphql/type_generator.rb +98 -0
  38. data/lib/generators/graphql/union_generator.rb +33 -0
  39. data/lib/graphql/analysis/analyze_query.rb +98 -0
  40. data/lib/graphql/analysis/ast/analyzer.rb +84 -0
  41. data/lib/graphql/analysis/ast/field_usage.rb +51 -0
  42. data/lib/graphql/analysis/ast/max_query_complexity.rb +23 -0
  43. data/lib/graphql/analysis/ast/max_query_depth.rb +22 -0
  44. data/lib/graphql/analysis/ast/query_complexity.rb +230 -0
  45. data/lib/graphql/analysis/ast/query_depth.rb +56 -0
  46. data/lib/graphql/analysis/ast/visitor.rb +268 -0
  47. data/lib/graphql/analysis/ast.rb +91 -0
  48. data/lib/graphql/analysis/field_usage.rb +45 -0
  49. data/lib/graphql/analysis/max_query_complexity.rb +26 -0
  50. data/lib/graphql/analysis/max_query_depth.rb +26 -0
  51. data/lib/graphql/analysis/query_complexity.rb +88 -0
  52. data/lib/graphql/analysis/query_depth.rb +43 -0
  53. data/lib/graphql/analysis/reducer_state.rb +48 -0
  54. data/lib/graphql/analysis.rb +9 -0
  55. data/lib/graphql/analysis_error.rb +5 -0
  56. data/lib/graphql/argument.rb +131 -0
  57. data/lib/graphql/authorization.rb +82 -0
  58. data/lib/graphql/backtrace/inspect_result.rb +50 -0
  59. data/lib/graphql/backtrace/legacy_tracer.rb +56 -0
  60. data/lib/graphql/backtrace/table.rb +159 -0
  61. data/lib/graphql/backtrace/traced_error.rb +54 -0
  62. data/lib/graphql/backtrace/tracer.rb +81 -0
  63. data/lib/graphql/backtrace.rb +64 -0
  64. data/lib/graphql/backwards_compatibility.rb +61 -0
  65. data/lib/graphql/base_type.rb +230 -0
  66. data/lib/graphql/boolean_type.rb +2 -0
  67. data/lib/graphql/coercion_error.rb +13 -0
  68. data/lib/graphql/compatibility/execution_specification/counter_schema.rb +53 -0
  69. data/lib/graphql/compatibility/execution_specification/specification_schema.rb +200 -0
  70. data/lib/graphql/compatibility/execution_specification.rb +436 -0
  71. data/lib/graphql/compatibility/lazy_execution_specification/lazy_schema.rb +111 -0
  72. data/lib/graphql/compatibility/lazy_execution_specification.rb +215 -0
  73. data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +87 -0
  74. data/lib/graphql/compatibility/query_parser_specification/query_assertions.rb +79 -0
  75. data/lib/graphql/compatibility/query_parser_specification.rb +266 -0
  76. data/lib/graphql/compatibility/schema_parser_specification.rb +682 -0
  77. data/lib/graphql/compatibility.rb +5 -0
  78. data/lib/graphql/dataloader/null_dataloader.rb +22 -0
  79. data/lib/graphql/dataloader/request.rb +19 -0
  80. data/lib/graphql/dataloader/request_all.rb +19 -0
  81. data/lib/graphql/dataloader/source.rb +155 -0
  82. data/lib/graphql/dataloader.rb +308 -0
  83. data/lib/graphql/define/assign_argument.rb +12 -0
  84. data/lib/graphql/define/assign_connection.rb +13 -0
  85. data/lib/graphql/define/assign_enum_value.rb +18 -0
  86. data/lib/graphql/define/assign_global_id_field.rb +11 -0
  87. data/lib/graphql/define/assign_mutation_function.rb +34 -0
  88. data/lib/graphql/define/assign_object_field.rb +42 -0
  89. data/lib/graphql/define/defined_object_proxy.rb +53 -0
  90. data/lib/graphql/define/instance_definable.rb +240 -0
  91. data/lib/graphql/define/no_definition_error.rb +7 -0
  92. data/lib/graphql/define/non_null_with_bang.rb +16 -0
  93. data/lib/graphql/define/type_definer.rb +31 -0
  94. data/lib/graphql/define.rb +31 -0
  95. data/lib/graphql/deprecated_dsl.rb +55 -0
  96. data/lib/graphql/deprecation.rb +9 -0
  97. data/lib/graphql/dig.rb +19 -0
  98. data/lib/graphql/directive/deprecated_directive.rb +2 -0
  99. data/lib/graphql/directive/include_directive.rb +2 -0
  100. data/lib/graphql/directive/skip_directive.rb +2 -0
  101. data/lib/graphql/directive.rb +107 -0
  102. data/lib/graphql/enum_type.rb +133 -0
  103. data/lib/graphql/execution/directive_checks.rb +37 -0
  104. data/lib/graphql/execution/errors.rb +163 -0
  105. data/lib/graphql/execution/execute.rb +333 -0
  106. data/lib/graphql/execution/flatten.rb +40 -0
  107. data/lib/graphql/execution/instrumentation.rb +92 -0
  108. data/lib/graphql/execution/interpreter/argument_value.rb +28 -0
  109. data/lib/graphql/execution/interpreter/arguments.rb +88 -0
  110. data/lib/graphql/execution/interpreter/arguments_cache.rb +103 -0
  111. data/lib/graphql/execution/interpreter/execution_errors.rb +29 -0
  112. data/lib/graphql/execution/interpreter/handles_raw_value.rb +18 -0
  113. data/lib/graphql/execution/interpreter/resolve.rb +70 -0
  114. data/lib/graphql/execution/interpreter/runtime.rb +949 -0
  115. data/lib/graphql/execution/interpreter.rb +122 -0
  116. data/lib/graphql/execution/lazy/lazy_method_map.rb +98 -0
  117. data/lib/graphql/execution/lazy/resolve.rb +91 -0
  118. data/lib/graphql/execution/lazy.rb +83 -0
  119. data/lib/graphql/execution/lookahead.rb +307 -0
  120. data/lib/graphql/execution/multiplex.rb +214 -0
  121. data/lib/graphql/execution/typecast.rb +50 -0
  122. data/lib/graphql/execution.rb +11 -0
  123. data/lib/graphql/execution_error.rb +58 -0
  124. data/lib/graphql/field/resolve.rb +59 -0
  125. data/lib/graphql/field.rb +226 -0
  126. data/lib/graphql/filter.rb +53 -0
  127. data/lib/graphql/float_type.rb +2 -0
  128. data/lib/graphql/function.rb +128 -0
  129. data/lib/graphql/id_type.rb +2 -0
  130. data/lib/graphql/input_object_type.rb +138 -0
  131. data/lib/graphql/int_type.rb +2 -0
  132. data/lib/graphql/integer_decoding_error.rb +17 -0
  133. data/lib/graphql/integer_encoding_error.rb +36 -0
  134. data/lib/graphql/interface_type.rb +72 -0
  135. data/lib/graphql/internal_representation/document.rb +27 -0
  136. data/lib/graphql/internal_representation/node.rb +206 -0
  137. data/lib/graphql/internal_representation/print.rb +51 -0
  138. data/lib/graphql/internal_representation/rewrite.rb +184 -0
  139. data/lib/graphql/internal_representation/scope.rb +88 -0
  140. data/lib/graphql/internal_representation/visit.rb +36 -0
  141. data/lib/graphql/internal_representation.rb +7 -0
  142. data/lib/graphql/introspection/base_object.rb +13 -0
  143. data/lib/graphql/introspection/directive_location_enum.rb +15 -0
  144. data/lib/graphql/introspection/directive_type.rb +29 -0
  145. data/lib/graphql/introspection/dynamic_fields.rb +17 -0
  146. data/lib/graphql/introspection/entry_points.rb +35 -0
  147. data/lib/graphql/introspection/enum_value_type.rb +23 -0
  148. data/lib/graphql/introspection/field_type.rb +28 -0
  149. data/lib/graphql/introspection/input_value_type.rb +67 -0
  150. data/lib/graphql/introspection/introspection_query.rb +7 -0
  151. data/lib/graphql/introspection/schema_type.rb +44 -0
  152. data/lib/graphql/introspection/type_kind_enum.rb +13 -0
  153. data/lib/graphql/introspection/type_type.rb +95 -0
  154. data/lib/graphql/introspection.rb +114 -0
  155. data/lib/graphql/invalid_name_error.rb +11 -0
  156. data/lib/graphql/invalid_null_error.rb +50 -0
  157. data/lib/graphql/language/block_string.rb +99 -0
  158. data/lib/graphql/language/cache.rb +37 -0
  159. data/lib/graphql/language/definition_slice.rb +41 -0
  160. data/lib/graphql/language/document_from_schema_definition.rb +347 -0
  161. data/lib/graphql/language/generation.rb +24 -0
  162. data/lib/graphql/language/lexer.rb +1467 -0
  163. data/lib/graphql/language/lexer.rl +258 -0
  164. data/lib/graphql/language/nodes.rb +707 -0
  165. data/lib/graphql/language/parser.rb +1974 -0
  166. data/lib/graphql/language/parser.y +544 -0
  167. data/lib/graphql/language/printer.rb +366 -0
  168. data/lib/graphql/language/sanitized_printer.rb +222 -0
  169. data/lib/graphql/language/token.rb +34 -0
  170. data/lib/graphql/language/visitor.rb +242 -0
  171. data/lib/graphql/language.rb +36 -0
  172. data/lib/graphql/list_type.rb +80 -0
  173. data/lib/graphql/load_application_object_failed_error.rb +22 -0
  174. data/lib/graphql/name_validator.rb +11 -0
  175. data/lib/graphql/non_null_type.rb +71 -0
  176. data/lib/graphql/object_type.rb +130 -0
  177. data/lib/graphql/pagination/active_record_relation_connection.rb +48 -0
  178. data/lib/graphql/pagination/array_connection.rb +77 -0
  179. data/lib/graphql/pagination/connection.rb +226 -0
  180. data/lib/graphql/pagination/connections.rb +160 -0
  181. data/lib/graphql/pagination/mongoid_relation_connection.rb +25 -0
  182. data/lib/graphql/pagination/relation_connection.rb +196 -0
  183. data/lib/graphql/pagination/sequel_dataset_connection.rb +28 -0
  184. data/lib/graphql/pagination.rb +6 -0
  185. data/lib/graphql/parse_error.rb +24 -0
  186. data/lib/graphql/query/arguments.rb +189 -0
  187. data/lib/graphql/query/arguments_cache.rb +24 -0
  188. data/lib/graphql/query/context.rb +371 -0
  189. data/lib/graphql/query/executor.rb +52 -0
  190. data/lib/graphql/query/fingerprint.rb +26 -0
  191. data/lib/graphql/query/input_validation_result.rb +43 -0
  192. data/lib/graphql/query/literal_input.rb +136 -0
  193. data/lib/graphql/query/null_context.rb +55 -0
  194. data/lib/graphql/query/result.rb +63 -0
  195. data/lib/graphql/query/serial_execution/field_resolution.rb +92 -0
  196. data/lib/graphql/query/serial_execution/operation_resolution.rb +19 -0
  197. data/lib/graphql/query/serial_execution/selection_resolution.rb +23 -0
  198. data/lib/graphql/query/serial_execution/value_resolution.rb +87 -0
  199. data/lib/graphql/query/serial_execution.rb +40 -0
  200. data/lib/graphql/query/validation_pipeline.rb +139 -0
  201. data/lib/graphql/query/variable_validation_error.rb +44 -0
  202. data/lib/graphql/query/variables.rb +78 -0
  203. data/lib/graphql/query.rb +454 -0
  204. data/lib/graphql/railtie.rb +117 -0
  205. data/lib/graphql/rake_task/validate.rb +63 -0
  206. data/lib/graphql/rake_task.rb +145 -0
  207. data/lib/graphql/relay/array_connection.rb +83 -0
  208. data/lib/graphql/relay/base_connection.rb +189 -0
  209. data/lib/graphql/relay/connection_instrumentation.rb +54 -0
  210. data/lib/graphql/relay/connection_resolve.rb +43 -0
  211. data/lib/graphql/relay/connection_type.rb +41 -0
  212. data/lib/graphql/relay/edge.rb +27 -0
  213. data/lib/graphql/relay/edge_type.rb +19 -0
  214. data/lib/graphql/relay/edges_instrumentation.rb +39 -0
  215. data/lib/graphql/relay/global_id_resolve.rb +18 -0
  216. data/lib/graphql/relay/mongo_relation_connection.rb +50 -0
  217. data/lib/graphql/relay/mutation/instrumentation.rb +23 -0
  218. data/lib/graphql/relay/mutation/resolve.rb +56 -0
  219. data/lib/graphql/relay/mutation/result.rb +38 -0
  220. data/lib/graphql/relay/mutation.rb +106 -0
  221. data/lib/graphql/relay/node.rb +39 -0
  222. data/lib/graphql/relay/page_info.rb +7 -0
  223. data/lib/graphql/relay/range_add.rb +59 -0
  224. data/lib/graphql/relay/relation_connection.rb +188 -0
  225. data/lib/graphql/relay/type_extensions.rb +32 -0
  226. data/lib/graphql/relay.rb +18 -0
  227. data/lib/graphql/rubocop/graphql/base_cop.rb +36 -0
  228. data/lib/graphql/rubocop/graphql/default_null_true.rb +43 -0
  229. data/lib/graphql/rubocop/graphql/default_required_true.rb +43 -0
  230. data/lib/graphql/rubocop.rb +4 -0
  231. data/lib/graphql/runtime_type_error.rb +5 -0
  232. data/lib/graphql/scalar_type.rb +91 -0
  233. data/lib/graphql/schema/addition.rb +247 -0
  234. data/lib/graphql/schema/argument.rb +383 -0
  235. data/lib/graphql/schema/base_64_bp.rb +26 -0
  236. data/lib/graphql/schema/base_64_encoder.rb +21 -0
  237. data/lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb +47 -0
  238. data/lib/graphql/schema/build_from_definition/resolve_map.rb +78 -0
  239. data/lib/graphql/schema/build_from_definition.rb +477 -0
  240. data/lib/graphql/schema/built_in_types.rb +12 -0
  241. data/lib/graphql/schema/catchall_middleware.rb +35 -0
  242. data/lib/graphql/schema/default_parse_error.rb +10 -0
  243. data/lib/graphql/schema/default_type_error.rb +17 -0
  244. data/lib/graphql/schema/directive/deprecated.rb +18 -0
  245. data/lib/graphql/schema/directive/feature.rb +66 -0
  246. data/lib/graphql/schema/directive/flagged.rb +57 -0
  247. data/lib/graphql/schema/directive/include.rb +25 -0
  248. data/lib/graphql/schema/directive/skip.rb +25 -0
  249. data/lib/graphql/schema/directive/transform.rb +60 -0
  250. data/lib/graphql/schema/directive.rb +210 -0
  251. data/lib/graphql/schema/enum.rb +193 -0
  252. data/lib/graphql/schema/enum_value.rb +97 -0
  253. data/lib/graphql/schema/field/connection_extension.rb +76 -0
  254. data/lib/graphql/schema/field/scope_extension.rb +22 -0
  255. data/lib/graphql/schema/field.rb +880 -0
  256. data/lib/graphql/schema/field_extension.rb +69 -0
  257. data/lib/graphql/schema/find_inherited_value.rb +36 -0
  258. data/lib/graphql/schema/finder.rb +155 -0
  259. data/lib/graphql/schema/input_object.rb +253 -0
  260. data/lib/graphql/schema/interface.rb +136 -0
  261. data/lib/graphql/schema/introspection_system.rb +169 -0
  262. data/lib/graphql/schema/invalid_type_error.rb +7 -0
  263. data/lib/graphql/schema/late_bound_type.rb +33 -0
  264. data/lib/graphql/schema/list.rb +75 -0
  265. data/lib/graphql/schema/loader.rb +226 -0
  266. data/lib/graphql/schema/member/accepts_definition.rb +159 -0
  267. data/lib/graphql/schema/member/base_dsl_methods.rb +129 -0
  268. data/lib/graphql/schema/member/build_type.rb +180 -0
  269. data/lib/graphql/schema/member/cached_graphql_definition.rb +31 -0
  270. data/lib/graphql/schema/member/graphql_type_names.rb +21 -0
  271. data/lib/graphql/schema/member/has_arguments.rb +332 -0
  272. data/lib/graphql/schema/member/has_ast_node.rb +20 -0
  273. data/lib/graphql/schema/member/has_deprecation_reason.rb +25 -0
  274. data/lib/graphql/schema/member/has_directives.rb +98 -0
  275. data/lib/graphql/schema/member/has_fields.rb +163 -0
  276. data/lib/graphql/schema/member/has_interfaces.rb +90 -0
  277. data/lib/graphql/schema/member/has_path.rb +25 -0
  278. data/lib/graphql/schema/member/has_unresolved_type_error.rb +15 -0
  279. data/lib/graphql/schema/member/has_validators.rb +31 -0
  280. data/lib/graphql/schema/member/instrumentation.rb +131 -0
  281. data/lib/graphql/schema/member/relay_shortcuts.rb +47 -0
  282. data/lib/graphql/schema/member/scoped.rb +21 -0
  283. data/lib/graphql/schema/member/type_system_helpers.rb +38 -0
  284. data/lib/graphql/schema/member/validates_input.rb +33 -0
  285. data/lib/graphql/schema/member.rb +161 -0
  286. data/lib/graphql/schema/middleware_chain.rb +82 -0
  287. data/lib/graphql/schema/mutation.rb +94 -0
  288. data/lib/graphql/schema/non_null.rb +67 -0
  289. data/lib/graphql/schema/null_mask.rb +11 -0
  290. data/lib/graphql/schema/object.rb +150 -0
  291. data/lib/graphql/schema/possible_types.rb +44 -0
  292. data/lib/graphql/schema/printer.rb +100 -0
  293. data/lib/graphql/schema/relay_classic_mutation.rb +160 -0
  294. data/lib/graphql/schema/rescue_middleware.rb +60 -0
  295. data/lib/graphql/schema/resolver/has_payload_type.rb +96 -0
  296. data/lib/graphql/schema/resolver.rb +397 -0
  297. data/lib/graphql/schema/scalar.rb +69 -0
  298. data/lib/graphql/schema/subscription.rb +155 -0
  299. data/lib/graphql/schema/timeout.rb +123 -0
  300. data/lib/graphql/schema/timeout_middleware.rb +88 -0
  301. data/lib/graphql/schema/traversal.rb +228 -0
  302. data/lib/graphql/schema/type_expression.rb +43 -0
  303. data/lib/graphql/schema/type_membership.rb +48 -0
  304. data/lib/graphql/schema/union.rb +95 -0
  305. data/lib/graphql/schema/unique_within_type.rb +34 -0
  306. data/lib/graphql/schema/validation.rb +313 -0
  307. data/lib/graphql/schema/validator/allow_blank_validator.rb +29 -0
  308. data/lib/graphql/schema/validator/allow_null_validator.rb +26 -0
  309. data/lib/graphql/schema/validator/exclusion_validator.rb +33 -0
  310. data/lib/graphql/schema/validator/format_validator.rb +48 -0
  311. data/lib/graphql/schema/validator/inclusion_validator.rb +35 -0
  312. data/lib/graphql/schema/validator/length_validator.rb +59 -0
  313. data/lib/graphql/schema/validator/numericality_validator.rb +82 -0
  314. data/lib/graphql/schema/validator/required_validator.rb +68 -0
  315. data/lib/graphql/schema/validator.rb +174 -0
  316. data/lib/graphql/schema/warden.rb +409 -0
  317. data/lib/graphql/schema/wrapper.rb +29 -0
  318. data/lib/graphql/schema.rb +1945 -0
  319. data/lib/graphql/static_validation/all_rules.rb +40 -0
  320. data/lib/graphql/static_validation/base_visitor.rb +217 -0
  321. data/lib/graphql/static_validation/default_visitor.rb +15 -0
  322. data/lib/graphql/static_validation/definition_dependencies.rb +198 -0
  323. data/lib/graphql/static_validation/error.rb +46 -0
  324. data/lib/graphql/static_validation/interpreter_visitor.rb +14 -0
  325. data/lib/graphql/static_validation/literal_validator.rb +139 -0
  326. data/lib/graphql/static_validation/no_validate_visitor.rb +10 -0
  327. data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +66 -0
  328. data/lib/graphql/static_validation/rules/argument_literals_are_compatible_error.rb +48 -0
  329. data/lib/graphql/static_validation/rules/argument_names_are_unique.rb +31 -0
  330. data/lib/graphql/static_validation/rules/argument_names_are_unique_error.rb +30 -0
  331. data/lib/graphql/static_validation/rules/arguments_are_defined.rb +71 -0
  332. data/lib/graphql/static_validation/rules/arguments_are_defined_error.rb +37 -0
  333. data/lib/graphql/static_validation/rules/directives_are_defined.rb +23 -0
  334. data/lib/graphql/static_validation/rules/directives_are_defined_error.rb +29 -0
  335. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +65 -0
  336. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations_error.rb +31 -0
  337. data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +30 -0
  338. data/lib/graphql/static_validation/rules/fields_are_defined_on_type_error.rb +32 -0
  339. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +73 -0
  340. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections_error.rb +31 -0
  341. data/lib/graphql/static_validation/rules/fields_will_merge.rb +418 -0
  342. data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +53 -0
  343. data/lib/graphql/static_validation/rules/fragment_names_are_unique.rb +30 -0
  344. data/lib/graphql/static_validation/rules/fragment_names_are_unique_error.rb +29 -0
  345. data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +73 -0
  346. data/lib/graphql/static_validation/rules/fragment_spreads_are_possible_error.rb +35 -0
  347. data/lib/graphql/static_validation/rules/fragment_types_exist.rb +39 -0
  348. data/lib/graphql/static_validation/rules/fragment_types_exist_error.rb +29 -0
  349. data/lib/graphql/static_validation/rules/fragments_are_finite.rb +21 -0
  350. data/lib/graphql/static_validation/rules/fragments_are_finite_error.rb +29 -0
  351. data/lib/graphql/static_validation/rules/fragments_are_named.rb +16 -0
  352. data/lib/graphql/static_validation/rules/fragments_are_named_error.rb +26 -0
  353. data/lib/graphql/static_validation/rules/fragments_are_on_composite_types.rb +37 -0
  354. data/lib/graphql/static_validation/rules/fragments_are_on_composite_types_error.rb +30 -0
  355. data/lib/graphql/static_validation/rules/fragments_are_used.rb +32 -0
  356. data/lib/graphql/static_validation/rules/fragments_are_used_error.rb +29 -0
  357. data/lib/graphql/static_validation/rules/input_object_names_are_unique.rb +30 -0
  358. data/lib/graphql/static_validation/rules/input_object_names_are_unique_error.rb +30 -0
  359. data/lib/graphql/static_validation/rules/mutation_root_exists.rb +17 -0
  360. data/lib/graphql/static_validation/rules/mutation_root_exists_error.rb +26 -0
  361. data/lib/graphql/static_validation/rules/no_definitions_are_present.rb +41 -0
  362. data/lib/graphql/static_validation/rules/no_definitions_are_present_error.rb +25 -0
  363. data/lib/graphql/static_validation/rules/operation_names_are_valid.rb +36 -0
  364. data/lib/graphql/static_validation/rules/operation_names_are_valid_error.rb +28 -0
  365. data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +37 -0
  366. data/lib/graphql/static_validation/rules/required_arguments_are_present_error.rb +35 -0
  367. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +59 -0
  368. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present_error.rb +35 -0
  369. data/lib/graphql/static_validation/rules/subscription_root_exists.rb +17 -0
  370. data/lib/graphql/static_validation/rules/subscription_root_exists_error.rb +26 -0
  371. data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +50 -0
  372. data/lib/graphql/static_validation/rules/unique_directives_per_location_error.rb +29 -0
  373. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +46 -0
  374. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed_error.rb +39 -0
  375. data/lib/graphql/static_validation/rules/variable_names_are_unique.rb +24 -0
  376. data/lib/graphql/static_validation/rules/variable_names_are_unique_error.rb +29 -0
  377. data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +153 -0
  378. data/lib/graphql/static_validation/rules/variable_usages_are_allowed_error.rb +38 -0
  379. data/lib/graphql/static_validation/rules/variables_are_input_types.rb +39 -0
  380. data/lib/graphql/static_validation/rules/variables_are_input_types_error.rb +32 -0
  381. data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +155 -0
  382. data/lib/graphql/static_validation/rules/variables_are_used_and_defined_error.rb +37 -0
  383. data/lib/graphql/static_validation/type_stack.rb +216 -0
  384. data/lib/graphql/static_validation/validation_context.rb +49 -0
  385. data/lib/graphql/static_validation/validation_timeout_error.rb +25 -0
  386. data/lib/graphql/static_validation/validator.rb +96 -0
  387. data/lib/graphql/static_validation.rb +19 -0
  388. data/lib/graphql/string_encoding_error.rb +20 -0
  389. data/lib/graphql/string_type.rb +2 -0
  390. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +245 -0
  391. data/lib/graphql/subscriptions/broadcast_analyzer.rb +81 -0
  392. data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +21 -0
  393. data/lib/graphql/subscriptions/event.rb +144 -0
  394. data/lib/graphql/subscriptions/instrumentation.rb +79 -0
  395. data/lib/graphql/subscriptions/serialize.rb +138 -0
  396. data/lib/graphql/subscriptions/subscription_root.rb +76 -0
  397. data/lib/graphql/subscriptions.rb +299 -0
  398. data/lib/graphql/tracing/active_support_notifications_tracing.rb +35 -0
  399. data/lib/graphql/tracing/appoptics_tracing.rb +173 -0
  400. data/lib/graphql/tracing/appsignal_tracing.rb +51 -0
  401. data/lib/graphql/tracing/data_dog_tracing.rb +76 -0
  402. data/lib/graphql/tracing/new_relic_tracing.rb +51 -0
  403. data/lib/graphql/tracing/platform_tracing.rb +139 -0
  404. data/lib/graphql/tracing/prometheus_tracing/graphql_collector.rb +32 -0
  405. data/lib/graphql/tracing/prometheus_tracing.rb +67 -0
  406. data/lib/graphql/tracing/scout_tracing.rb +54 -0
  407. data/lib/graphql/tracing/skylight_tracing.rb +70 -0
  408. data/lib/graphql/tracing/statsd_tracing.rb +42 -0
  409. data/lib/graphql/tracing.rb +95 -0
  410. data/lib/graphql/type_kinds.rb +77 -0
  411. data/lib/graphql/types/big_int.rb +23 -0
  412. data/lib/graphql/types/boolean.rb +18 -0
  413. data/lib/graphql/types/float.rb +19 -0
  414. data/lib/graphql/types/id.rb +24 -0
  415. data/lib/graphql/types/int.rb +36 -0
  416. data/lib/graphql/types/iso_8601_date.rb +34 -0
  417. data/lib/graphql/types/iso_8601_date_time.rb +65 -0
  418. data/lib/graphql/types/json.rb +25 -0
  419. data/lib/graphql/types/relay/base_connection.rb +39 -0
  420. data/lib/graphql/types/relay/base_edge.rb +29 -0
  421. data/lib/graphql/types/relay/connection_behaviors.rb +156 -0
  422. data/lib/graphql/types/relay/default_relay.rb +27 -0
  423. data/lib/graphql/types/relay/edge_behaviors.rb +53 -0
  424. data/lib/graphql/types/relay/has_node_field.rb +41 -0
  425. data/lib/graphql/types/relay/has_nodes_field.rb +41 -0
  426. data/lib/graphql/types/relay/node.rb +15 -0
  427. data/lib/graphql/types/relay/node_behaviors.rb +15 -0
  428. data/lib/graphql/types/relay/node_field.rb +25 -0
  429. data/lib/graphql/types/relay/nodes_field.rb +27 -0
  430. data/lib/graphql/types/relay/page_info.rb +11 -0
  431. data/lib/graphql/types/relay/page_info_behaviors.rb +25 -0
  432. data/lib/graphql/types/relay.rb +41 -0
  433. data/lib/graphql/types/string.rb +29 -0
  434. data/lib/graphql/types.rb +11 -0
  435. data/lib/graphql/unauthorized_error.rb +29 -0
  436. data/lib/graphql/unauthorized_field_error.rb +23 -0
  437. data/lib/graphql/union_type.rb +115 -0
  438. data/lib/graphql/unresolved_type_error.rb +35 -0
  439. data/lib/graphql/upgrader/member.rb +937 -0
  440. data/lib/graphql/upgrader/schema.rb +38 -0
  441. data/lib/graphql/version.rb +4 -0
  442. data/lib/graphql.rb +168 -0
  443. data/readme.md +49 -0
  444. metadata +714 -0
@@ -0,0 +1,128 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ # @api deprecated
4
+ class Function
5
+ def self.inherited(subclass)
6
+ GraphQL::Deprecation.warn "GraphQL::Function (used for #{subclass}) will be removed from GraphQL-Ruby 2.0, please upgrade to resolvers: https://graphql-ruby.org/fields/resolvers.html"
7
+ end
8
+
9
+ # @return [Hash<String => GraphQL::Argument>] Arguments, keyed by name
10
+ def arguments
11
+ self.class.arguments
12
+ end
13
+
14
+ # @return [GraphQL::BaseType] Return type
15
+ def type
16
+ self.class.type
17
+ end
18
+
19
+ # @return [Object] This function's resolver
20
+ def call(obj, args, ctx)
21
+ raise GraphQL::RequiredImplementationMissingError
22
+ end
23
+
24
+ # @return [String, nil]
25
+ def description
26
+ self.class.description
27
+ end
28
+
29
+ # @return [String, nil]
30
+ def deprecation_reason
31
+ self.class.deprecation_reason
32
+ end
33
+
34
+ # @return [Integer, Proc]
35
+ def complexity
36
+ self.class.complexity || 1
37
+ end
38
+
39
+ class << self
40
+ # Define an argument for this function & its subclasses
41
+ # @see {GraphQL::Field} same arguments as the `argument` definition helper
42
+ # @return [void]
43
+ def argument(*args, **kwargs, &block)
44
+ argument = GraphQL::Argument.from_dsl(*args, **kwargs, &block)
45
+ own_arguments[argument.name] = argument
46
+ nil
47
+ end
48
+
49
+ # @return [Hash<String => GraphQL::Argument>] Arguments for this function class, including inherited arguments
50
+ def arguments
51
+ if parent_function?
52
+ own_arguments.merge(superclass.arguments)
53
+ else
54
+ own_arguments.dup
55
+ end
56
+ end
57
+
58
+ # Provides shorthand access to GraphQL's built-in types
59
+ def types
60
+ GraphQL::Define::TypeDefiner.instance
61
+ end
62
+
63
+ # Get or set the return type for this function class & descendants
64
+ # @return [GraphQL::BaseType]
65
+ def type(premade_type = nil, &block)
66
+ if block_given?
67
+ @type = GraphQL::ObjectType.define(&block)
68
+ elsif premade_type
69
+ @type = premade_type
70
+ elsif parent_function?
71
+ @type || superclass.type
72
+ else
73
+ @type
74
+ end
75
+ end
76
+
77
+ def build_field(function)
78
+ GraphQL::Field.define(
79
+ arguments: function.arguments,
80
+ complexity: function.complexity,
81
+ type: function.type,
82
+ resolve: function,
83
+ description: function.description,
84
+ function: function,
85
+ deprecation_reason: function.deprecation_reason,
86
+ )
87
+ end
88
+
89
+ # Class-level reader/writer which is inherited
90
+ # @api private
91
+ def self.inherited_value(name)
92
+ self.class_eval <<-RUBY
93
+ def #{name}(new_value = nil)
94
+ if new_value
95
+ @#{name} = new_value
96
+ elsif parent_function?
97
+ @#{name} || superclass.#{name}
98
+ else
99
+ @#{name}
100
+ end
101
+ end
102
+ RUBY
103
+ end
104
+
105
+ # @!method description(new_value = nil)
106
+ # Get or set this class's description
107
+ inherited_value(:description)
108
+ # @!method deprecation_reason(new_value = nil)
109
+ # Get or set this class's deprecation_reason
110
+ inherited_value(:deprecation_reason)
111
+ # @!method complexity(new_value = nil)
112
+ # Get or set this class's complexity
113
+ inherited_value(:complexity)
114
+
115
+ private
116
+
117
+ # Does this function inherit from another function?
118
+ def parent_function?
119
+ superclass <= GraphQL::Function
120
+ end
121
+
122
+ # Arguments defined on this class (not superclasses)
123
+ def own_arguments
124
+ @own_arguments ||= {}
125
+ end
126
+ end
127
+ end
128
+ end
@@ -0,0 +1,2 @@
1
+ # frozen_string_literal: true
2
+ GraphQL::ID_TYPE = GraphQL::Types::ID.graphql_definition
@@ -0,0 +1,138 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ # @api deprecated
4
+ class InputObjectType < GraphQL::BaseType
5
+ extend Define::InstanceDefinable::DeprecatedDefine
6
+
7
+ accepts_definitions(
8
+ :arguments, :mutation,
9
+ input_field: GraphQL::Define::AssignArgument,
10
+ argument: GraphQL::Define::AssignArgument
11
+ )
12
+
13
+ attr_accessor :mutation, :arguments, :arguments_class
14
+ ensure_defined(:mutation, :arguments, :input_fields)
15
+ alias :input_fields :arguments
16
+
17
+ # @!attribute mutation
18
+ # @return [GraphQL::Relay::Mutation, nil] The mutation this field was derived from, if it was derived from a mutation
19
+
20
+ # @!attribute arguments
21
+ # @return [Hash<String => GraphQL::Argument>] Map String argument names to their {GraphQL::Argument} implementations
22
+
23
+
24
+ def initialize
25
+ super
26
+ @arguments = {}
27
+ end
28
+
29
+ def initialize_copy(other)
30
+ super
31
+ @arguments = other.arguments.dup
32
+ end
33
+
34
+ def kind
35
+ GraphQL::TypeKinds::INPUT_OBJECT
36
+ end
37
+
38
+ def coerce_result(value, ctx = nil)
39
+ if ctx.nil?
40
+ warn_deprecated_coerce("coerce_isolated_result")
41
+ ctx = GraphQL::Query::NullContext
42
+ end
43
+
44
+ # Allow the application to provide values as :symbols, and convert them to the strings
45
+ value = value.reduce({}) { |memo, (k, v)| memo[k.to_s] = v; memo }
46
+
47
+ result = {}
48
+
49
+ arguments.each do |input_key, input_field_defn|
50
+ input_value = value[input_key]
51
+ if value.key?(input_key)
52
+ result[input_key] = if input_value.nil?
53
+ nil
54
+ else
55
+ input_field_defn.type.coerce_result(input_value, ctx)
56
+ end
57
+ end
58
+ end
59
+
60
+ result
61
+ end
62
+
63
+ def get_argument(argument_name)
64
+ arguments[argument_name]
65
+ end
66
+
67
+ private
68
+
69
+ def coerce_non_null_input(value, ctx)
70
+ input_values = {}
71
+ defaults_used = Set.new
72
+
73
+ arguments.each do |input_key, input_field_defn|
74
+ field_value = value[input_key]
75
+
76
+ if value.key?(input_key)
77
+ coerced_value = input_field_defn.type.coerce_input(field_value, ctx)
78
+ input_values[input_key] = input_field_defn.prepare(coerced_value, ctx)
79
+ elsif input_field_defn.default_value?
80
+ coerced_value = input_field_defn.type.coerce_input(input_field_defn.default_value, ctx)
81
+ input_values[input_key] = coerced_value
82
+ defaults_used << input_key
83
+ end
84
+ end
85
+
86
+ result = arguments_class.new(input_values, context: ctx, defaults_used: defaults_used)
87
+ result.prepare
88
+ end
89
+
90
+ # @api private
91
+ INVALID_OBJECT_MESSAGE = "Expected %{object} to be a key, value object responding to `to_h` or `to_unsafe_h`."
92
+
93
+ def validate_non_null_input(input, ctx)
94
+ warden = ctx.warden
95
+ result = GraphQL::Query::InputValidationResult.new
96
+
97
+ if input.is_a?(Array)
98
+ result.add_problem(INVALID_OBJECT_MESSAGE % { object: JSON.generate(input, quirks_mode: true) })
99
+ return result
100
+ end
101
+
102
+ # We're not actually _using_ the coerced result, we're just
103
+ # using these methods to make sure that the object will
104
+ # behave like a hash below, when we call `each` on it.
105
+ begin
106
+ input.to_h
107
+ rescue
108
+ begin
109
+ # Handle ActionController::Parameters:
110
+ input.to_unsafe_h
111
+ rescue
112
+ # We're not sure it'll act like a hash, so reject it:
113
+ result.add_problem(INVALID_OBJECT_MESSAGE % { object: JSON.generate(input, quirks_mode: true) })
114
+ return result
115
+ end
116
+ end
117
+
118
+ visible_arguments_map = warden.arguments(self).reduce({}) { |m, f| m[f.name] = f; m}
119
+
120
+ # Items in the input that are unexpected
121
+ input.each do |name, value|
122
+ if visible_arguments_map[name].nil?
123
+ result.add_problem("Field is not defined on #{self.graphql_name}", [name])
124
+ end
125
+ end
126
+
127
+ # Items in the input that are expected, but have invalid values
128
+ visible_arguments_map.map do |name, field|
129
+ field_result = field.type.validate_input(input[name], ctx)
130
+ if !field_result.valid?
131
+ result.merge_result!(name, field_result)
132
+ end
133
+ end
134
+
135
+ result
136
+ end
137
+ end
138
+ end
@@ -0,0 +1,2 @@
1
+ # frozen_string_literal: true
2
+ GraphQL::INT_TYPE = GraphQL::Types::Int.graphql_definition
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ # This error is raised when `Types::Int` is given an input value outside of 32-bit integer range.
4
+ #
5
+ # For really big integer values, consider `GraphQL::Types::BigInt`
6
+ #
7
+ # @see GraphQL::Types::Int which raises this error
8
+ class IntegerDecodingError < GraphQL::RuntimeTypeError
9
+ # The value which couldn't be decoded
10
+ attr_reader :integer_value
11
+
12
+ def initialize(value)
13
+ @integer_value = value
14
+ super("Integer out of bounds: #{value}. \nConsider using GraphQL::Types::BigInt instead.")
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ # This error is raised when `Types::Int` is asked to return a value outside of 32-bit integer range.
4
+ #
5
+ # For values outside that range, consider:
6
+ #
7
+ # - `ID` for database primary keys or other identifiers
8
+ # - `GraphQL::Types::BigInt` for really big integer values
9
+ #
10
+ # @see GraphQL::Types::Int which raises this error
11
+ class IntegerEncodingError < GraphQL::RuntimeTypeError
12
+ # The value which couldn't be encoded
13
+ attr_reader :integer_value
14
+
15
+ # @return [GraphQL::Schema::Field] The field that returned a too-big integer
16
+ attr_reader :field
17
+
18
+ # @return [Array<String, Integer>] Where the field appeared in the GraphQL response
19
+ attr_reader :path
20
+
21
+ def initialize(value, context:)
22
+ @integer_value = value
23
+ @field = context[:current_field]
24
+ @path = context[:current_path]
25
+ message = "Integer out of bounds: #{value}".dup
26
+ if @path
27
+ message << " @ #{@path.join(".")}"
28
+ end
29
+ if @field
30
+ message << " (#{@field.path})"
31
+ end
32
+ message << ". Consider using ID or GraphQL::Types::BigInt instead."
33
+ super(message)
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ # @api deprecated
4
+ class InterfaceType < GraphQL::BaseType
5
+ extend Define::InstanceDefinable::DeprecatedDefine
6
+
7
+ accepts_definitions :fields, :orphan_types, :resolve_type, field: GraphQL::Define::AssignObjectField
8
+
9
+ attr_accessor :fields, :orphan_types, :resolve_type_proc
10
+ attr_writer :type_membership_class
11
+ ensure_defined :fields, :orphan_types, :resolve_type_proc, :resolve_type
12
+
13
+ def initialize
14
+ super
15
+ @fields = {}
16
+ @orphan_types = []
17
+ @resolve_type_proc = nil
18
+ end
19
+
20
+ def initialize_copy(other)
21
+ super
22
+ @fields = other.fields.dup
23
+ @orphan_types = other.orphan_types.dup
24
+ end
25
+
26
+ def kind
27
+ GraphQL::TypeKinds::INTERFACE
28
+ end
29
+
30
+ def resolve_type(value, ctx)
31
+ ctx.query.resolve_type(self, value)
32
+ end
33
+
34
+ def resolve_type=(resolve_type_callable)
35
+ @resolve_type_proc = resolve_type_callable
36
+ end
37
+
38
+ # @return [GraphQL::Field] The defined field for `field_name`
39
+ def get_field(field_name)
40
+ fields[field_name]
41
+ end
42
+
43
+ # These fields don't have instrumenation applied
44
+ # @see [Schema#get_fields] Get fields with instrumentation
45
+ # @return [Array<GraphQL::Field>] All fields on this type
46
+ def all_fields
47
+ fields.values
48
+ end
49
+
50
+ # Get a possible type of this {InterfaceType} by type name
51
+ # @param type_name [String]
52
+ # @param ctx [GraphQL::Query::Context] The context for the current query
53
+ # @return [GraphQL::ObjectType, nil] The type named `type_name` if it exists and implements this {InterfaceType}, (else `nil`)
54
+ def get_possible_type(type_name, ctx)
55
+ type = ctx.query.get_type(type_name)
56
+ type if type && ctx.query.warden.possible_types(self).include?(type)
57
+ end
58
+
59
+ # Check if a type is a possible type of this {InterfaceType}
60
+ # @param type [String, GraphQL::BaseType] Name of the type or a type definition
61
+ # @param ctx [GraphQL::Query::Context] The context for the current query
62
+ # @return [Boolean] True if the `type` exists and is a member of this {InterfaceType}, (else `nil`)
63
+ def possible_type?(type, ctx)
64
+ type_name = type.is_a?(String) ? type : type.graphql_name
65
+ !get_possible_type(type_name, ctx).nil?
66
+ end
67
+
68
+ def type_membership_class
69
+ @type_membership_class || GraphQL::Schema::TypeMembership
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module InternalRepresentation
4
+ class Document
5
+ # @return [Hash<String, Node>] Operation Nodes of this query
6
+ attr_reader :operation_definitions
7
+
8
+ # @return [Hash<String, Node>] Fragment definition Nodes of this query
9
+ attr_reader :fragment_definitions
10
+
11
+ def initialize
12
+ @operation_definitions = {}
13
+ @fragment_definitions = {}
14
+ end
15
+
16
+ def [](key)
17
+ GraphQL::Deprecation.warn "#{self.class}#[] is deprecated; use `operation_definitions[]` instead"
18
+ operation_definitions[key]
19
+ end
20
+
21
+ def each(&block)
22
+ GraphQL::Deprecation.warn "#{self.class}#each is deprecated; use `operation_definitions.each` instead"
23
+ operation_definitions.each(&block)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,206 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module InternalRepresentation
4
+ class Node
5
+ # @api private
6
+ DEFAULT_TYPED_CHILDREN = Proc.new { |h, k| h[k] = {} }
7
+
8
+ # A specialized, reusable object for leaf nodes.
9
+ NO_TYPED_CHILDREN = Hash.new({}.freeze)
10
+ def NO_TYPED_CHILDREN.dup; self; end;
11
+ NO_TYPED_CHILDREN.freeze
12
+
13
+ # @return [String] the name this node has in the response
14
+ attr_reader :name
15
+
16
+ # @return [GraphQL::ObjectType]
17
+ attr_reader :owner_type
18
+
19
+ # Each key is a {GraphQL::ObjectType} which this selection _may_ be made on.
20
+ # The values for that key are selections which apply to that type.
21
+ #
22
+ # This value is derived from {#scoped_children} after the rewrite is finished.
23
+ # @return [Hash<GraphQL::ObjectType, Hash<String => Node>>]
24
+ def typed_children
25
+ @typed_children ||= begin
26
+ if @scoped_children.any?
27
+ new_tc = Hash.new(&DEFAULT_TYPED_CHILDREN)
28
+ all_object_types = Set.new
29
+ scoped_children.each_key { |t| all_object_types.merge(@query.possible_types(t)) }
30
+ # Remove any scoped children which don't follow this return type
31
+ # (This can happen with fragment merging where lexical scope is lost)
32
+ all_object_types &= @query.possible_types(@return_type.unwrap)
33
+ all_object_types.each do |t|
34
+ new_tc[t] = get_typed_children(t)
35
+ end
36
+ new_tc
37
+ else
38
+ NO_TYPED_CHILDREN
39
+ end
40
+
41
+ end
42
+ end
43
+
44
+ # These children correspond closely to scopes in the AST.
45
+ # Keys _may_ be abstract types. They're assumed to be read-only after rewrite is finished
46
+ # because {#typed_children} is derived from them.
47
+ #
48
+ # Using {#scoped_children} during the rewrite step reduces the overhead of reifying
49
+ # abstract types because they're only reified _after_ the rewrite.
50
+ # @return [Hash<GraphQL::BaseType, Hash<String => Node>>]
51
+ attr_reader :scoped_children
52
+
53
+ # @return [Array<Language::Nodes::AbstractNode>] AST nodes which are represented by this node
54
+ attr_reader :ast_nodes
55
+
56
+ # @return [Array<GraphQL::Field>] Field definitions for this node (there should only be one!)
57
+ attr_reader :definitions
58
+
59
+ # @return [GraphQL::BaseType] The expected wrapped type this node must return.
60
+ attr_reader :return_type
61
+
62
+ # @return [InternalRepresentation::Node, nil]
63
+ attr_reader :parent
64
+
65
+ def initialize(
66
+ name:, owner_type:, query:, return_type:, parent:,
67
+ ast_nodes: [],
68
+ definitions: []
69
+ )
70
+ @name = name
71
+ @query = query
72
+ @owner_type = owner_type
73
+ @parent = parent
74
+ @typed_children = nil
75
+ @scoped_children = Hash.new { |h1, k1| h1[k1] = {} }
76
+ @ast_nodes = ast_nodes
77
+ @definitions = definitions
78
+ @return_type = return_type
79
+ end
80
+
81
+ def initialize_copy(other_node)
82
+ super
83
+ # Bust some caches:
84
+ @typed_children = nil
85
+ @definition = nil
86
+ @definition_name = nil
87
+ @ast_node = nil
88
+ # Shallow-copy some state:
89
+ @scoped_children = other_node.scoped_children.dup
90
+ @ast_nodes = other_node.ast_nodes.dup
91
+ @definitions = other_node.definitions.dup
92
+ end
93
+
94
+ def ==(other)
95
+ other.is_a?(self.class) &&
96
+ other.name == name &&
97
+ other.parent == parent &&
98
+ other.return_type == return_type &&
99
+ other.owner_type == owner_type &&
100
+ other.scoped_children == scoped_children &&
101
+ other.definitions == definitions &&
102
+ other.ast_nodes == ast_nodes
103
+ end
104
+
105
+ def definition_name
106
+ definition && definition.name
107
+ end
108
+
109
+ def arguments
110
+ @query.arguments_for(self, definition)
111
+ end
112
+
113
+ def definition
114
+ @definition ||= begin
115
+ first_def = @definitions.first
116
+ first_def && @query.get_field(@owner_type, first_def.name)
117
+ end
118
+ end
119
+
120
+ def ast_node
121
+ @ast_node ||= ast_nodes.first
122
+ end
123
+
124
+ def inspect
125
+ all_children_names = scoped_children.values.map(&:keys).flatten.uniq.join(", ")
126
+ all_locations = ast_nodes.map {|n| "#{n.line}:#{n.col}" }.join(", ")
127
+ "#<Node #{@owner_type}.#{@name} -> #{@return_type} {#{all_children_names}} @ [#{all_locations}] #{object_id}>"
128
+ end
129
+
130
+ # Merge selections from `new_parent` into `self`.
131
+ # Selections are merged in place, not copied.
132
+ def deep_merge_node(new_parent, scope: nil, merge_self: true)
133
+ if merge_self
134
+ @ast_nodes |= new_parent.ast_nodes
135
+ @definitions |= new_parent.definitions
136
+ end
137
+ new_sc = new_parent.scoped_children
138
+ if new_sc.any?
139
+ scope ||= Scope.new(@query, @return_type.unwrap)
140
+ new_sc.each do |obj_type, new_fields|
141
+ inner_scope = scope.enter(obj_type)
142
+ inner_scope.each do |scoped_type|
143
+ prev_fields = @scoped_children[scoped_type]
144
+ new_fields.each do |name, new_node|
145
+ prev_node = prev_fields[name]
146
+ if prev_node
147
+ prev_node.deep_merge_node(new_node)
148
+ else
149
+ prev_fields[name] = new_node
150
+ end
151
+ end
152
+ end
153
+ end
154
+ end
155
+ end
156
+
157
+ # @return [GraphQL::Query]
158
+ attr_reader :query
159
+
160
+ def subscription_topic
161
+ @subscription_topic ||= begin
162
+ scope = if definition.subscription_scope
163
+ @query.context[definition.subscription_scope]
164
+ else
165
+ nil
166
+ end
167
+ Subscriptions::Event.serialize(
168
+ definition_name,
169
+ @query.arguments_for(self, definition),
170
+ definition,
171
+ scope: scope
172
+ )
173
+ end
174
+ end
175
+
176
+ protected
177
+
178
+ attr_writer :owner_type, :parent
179
+
180
+ private
181
+
182
+ # Get applicable children from {#scoped_children}
183
+ # @param obj_type [GraphQL::ObjectType]
184
+ # @return [Hash<String => Node>]
185
+ def get_typed_children(obj_type)
186
+ new_tc = {}
187
+ @scoped_children.each do |scope_type, scope_nodes|
188
+ if GraphQL::Execution::Typecast.subtype?(scope_type, obj_type)
189
+ scope_nodes.each do |name, new_node|
190
+ prev_node = new_tc[name]
191
+ if prev_node
192
+ prev_node.deep_merge_node(new_node)
193
+ else
194
+ copied_node = new_node.dup
195
+ copied_node.owner_type = obj_type
196
+ copied_node.parent = self
197
+ new_tc[name] = copied_node
198
+ end
199
+ end
200
+ end
201
+ end
202
+ new_tc
203
+ end
204
+ end
205
+ end
206
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module InternalRepresentation
4
+ module Print
5
+ module_function
6
+
7
+ def print(schema, query_string)
8
+ query = GraphQL::Query.new(schema, query_string)
9
+ print_node(query.irep_selection)
10
+ end
11
+
12
+ def print_node(node, indent: 0)
13
+ padding = " " * indent
14
+ typed_children_padding = " " * (indent + 2)
15
+ query_str = "".dup
16
+
17
+ if !node.definition
18
+ op_node = node.ast_node
19
+ name = op_node.name ? " " + op_node.name : ""
20
+ op_type = op_node.operation_type
21
+ query_str << "#{op_type}#{name}"
22
+ else
23
+ if node.name == node.definition_name
24
+ query_str << "#{padding}#{node.name}"
25
+ else
26
+ query_str << "#{padding}#{node.name}: #{node.definition_name}"
27
+ end
28
+
29
+ args = node.ast_nodes.map { |n| n.arguments.map(&:to_query_string).join(",") }.uniq
30
+ query_str << args.map { |a| "(#{a})"}.join("|")
31
+ end
32
+
33
+ if node.typed_children.any?
34
+ query_str << " {\n"
35
+ node.typed_children.each do |type, children|
36
+ query_str << "#{typed_children_padding}... on #{type.name} {\n"
37
+ children.each do |name, child|
38
+ query_str << print_node(child, indent: indent + 4)
39
+ end
40
+ query_str << "#{typed_children_padding}}\n"
41
+ end
42
+ query_str << "#{padding}}\n"
43
+ else
44
+ query_str << "\n"
45
+ end
46
+
47
+ query_str
48
+ end
49
+ end
50
+ end
51
+ end