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,50 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module Relay
4
+ # A connection implementation to expose MongoDB collection objects.
5
+ # It works for:
6
+ # - `Mongoid::Criteria`
7
+ class MongoRelationConnection < RelationConnection
8
+ private
9
+
10
+ def relation_offset(relation)
11
+ relation.options.skip
12
+ end
13
+
14
+ def relation_limit(relation)
15
+ relation.options.limit
16
+ end
17
+
18
+ def relation_count(relation)
19
+ # Must perform query (hence #to_a) to count results https://jira.mongodb.org/browse/MONGOID-2325
20
+ relation.to_a.count
21
+ end
22
+
23
+ def limit_nodes(sliced_nodes, limit)
24
+ if limit == 0
25
+ if sliced_nodes.respond_to?(:none) # added in Mongoid 4.0
26
+ sliced_nodes.without_options.none
27
+ else
28
+ sliced_nodes.where(id: nil) # trying to simulate #none for 3.1.7
29
+ end
30
+ else
31
+ sliced_nodes.limit(limit)
32
+ end
33
+ end
34
+ end
35
+
36
+ if defined?(Mongoid::Criteria)
37
+ BaseConnection.register_connection_implementation(Mongoid::Criteria, MongoRelationConnection)
38
+ end
39
+
40
+ # Mongoid 5 and 6
41
+ if defined?(Mongoid::Relations::Targets::Enumerable)
42
+ BaseConnection.register_connection_implementation(Mongoid::Relations::Targets::Enumerable, MongoRelationConnection)
43
+ end
44
+
45
+ # Mongoid 7
46
+ if defined?(Mongoid::Association::Referenced::HasMany::Targets::Enumerable)
47
+ BaseConnection.register_connection_implementation(Mongoid::Association::Referenced::HasMany::Targets::Enumerable, MongoRelationConnection)
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module Relay
4
+ class Mutation
5
+ # @api private
6
+ module Instrumentation
7
+ # Modify mutation `return_field` resolves by wrapping the returned object
8
+ # in a {Mutation::Result}.
9
+ #
10
+ # By using an instrumention, we can apply our wrapper _last_,
11
+ # giving users access to the original resolve function in earlier instrumentation.
12
+ def self.instrument(type, field)
13
+ if field.mutation.is_a?(GraphQL::Relay::Mutation) || (field.mutation.is_a?(Class) && field.mutation < GraphQL::Schema::RelayClassicMutation)
14
+ new_resolve = Mutation::Resolve.new(field.mutation, field.resolve_proc)
15
+ field.redefine(resolve: new_resolve)
16
+ else
17
+ field
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module Relay
4
+ class Mutation
5
+ # Wrap a user-provided resolve function,
6
+ # wrapping the returned value in a {Mutation::Result}.
7
+ # Also, pass the `clientMutationId` to that result object.
8
+ # @api private
9
+ class Resolve
10
+ def initialize(mutation, resolve)
11
+ @mutation = mutation
12
+ @resolve = resolve
13
+ @wrap_result = mutation.is_a?(GraphQL::Relay::Mutation) && mutation.has_generated_return_type?
14
+ @class_based = mutation.is_a?(Class)
15
+ end
16
+
17
+ def call(obj, args, ctx)
18
+ mutation_result = begin
19
+ @resolve.call(obj, args[:input], ctx)
20
+ rescue GraphQL::ExecutionError => err
21
+ err
22
+ end
23
+
24
+ ctx.schema.after_lazy(mutation_result) do |res|
25
+ build_result(res, args, ctx)
26
+ end
27
+ end
28
+
29
+ private
30
+
31
+ def build_result(mutation_result, args, ctx)
32
+ if mutation_result.is_a?(GraphQL::ExecutionError)
33
+ ctx.add_error(mutation_result)
34
+ mutation_result = nil
35
+ end
36
+
37
+ if mutation_result.nil?
38
+ nil
39
+ elsif @wrap_result
40
+ if mutation_result && !mutation_result.is_a?(Hash)
41
+ raise StandardError, "Expected `#{mutation_result}` to be a Hash."\
42
+ " Return a hash when using `return_field` or specify a custom `return_type`."
43
+ end
44
+
45
+ @mutation.result_class.new(client_mutation_id: args[:input][:clientMutationId], result: mutation_result)
46
+ elsif @class_based
47
+ mutation_result[:client_mutation_id] = args[:input][:client_mutation_id]
48
+ mutation_result
49
+ else
50
+ mutation_result
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module Relay
4
+ class Mutation
5
+ # Use this when the mutation's return type was generated from `return_field`s.
6
+ # It delegates field lookups to the hash returned from `resolve`.
7
+ # @api private
8
+ class Result
9
+ attr_reader :client_mutation_id
10
+ def initialize(client_mutation_id:, result:)
11
+ @client_mutation_id = client_mutation_id
12
+ result && result.each do |key, value|
13
+ self.public_send("#{key}=", value)
14
+ end
15
+ end
16
+
17
+ class << self
18
+ attr_accessor :mutation
19
+ end
20
+
21
+ # Build a subclass whose instances have a method
22
+ # for each of `mutation_defn`'s `return_field`s
23
+ # @param mutation_defn [GraphQL::Relay::Mutation]
24
+ # @return [Class]
25
+ def self.define_subclass(mutation_defn)
26
+ subclass = Class.new(self) do
27
+ mutation_result_methods = mutation_defn.return_type.all_fields.map do |f|
28
+ f.property || f.name
29
+ end
30
+ attr_accessor(*mutation_result_methods)
31
+ self.mutation = mutation_defn
32
+ end
33
+ subclass
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,106 @@
1
+ # frozen_string_literal: true
2
+ require "graphql/relay/mutation/instrumentation"
3
+ require "graphql/relay/mutation/resolve"
4
+ require "graphql/relay/mutation/result"
5
+
6
+ module GraphQL
7
+ module Relay
8
+ # @api deprecated
9
+ class Mutation
10
+ include GraphQL::Define::InstanceDefinable
11
+ accepts_definitions(
12
+ :name, :description, :resolve,
13
+ :return_type,
14
+ :return_interfaces,
15
+ input_field: GraphQL::Define::AssignArgument,
16
+ return_field: GraphQL::Define::AssignObjectField,
17
+ function: GraphQL::Define::AssignMutationFunction,
18
+ )
19
+ attr_accessor :name, :description, :fields, :arguments
20
+ attr_writer :return_type, :return_interfaces
21
+
22
+ ensure_defined(
23
+ :input_fields, :return_fields, :name, :description,
24
+ :fields, :arguments, :return_type,
25
+ :return_interfaces, :resolve=,
26
+ :field, :result_class, :input_type
27
+ )
28
+ # For backwards compat, but do we need this separate API?
29
+ alias :return_fields :fields
30
+ alias :input_fields :arguments
31
+
32
+ def initialize
33
+ GraphQL::Deprecation.warn "GraphQL::Relay::Mutation will be removed from GraphQL-Ruby 2.0, use GraphQL::Schema::RelayClassicMutation instead: https://graphql-ruby.org/mutations/mutation_classes"
34
+ @fields = {}
35
+ @arguments = {}
36
+ @has_generated_return_type = false
37
+ end
38
+
39
+ def has_generated_return_type?
40
+ # Trigger the generation of the return type, if it is dynamically generated:
41
+ return_type
42
+ @has_generated_return_type
43
+ end
44
+
45
+ def resolve=(new_resolve_proc)
46
+ @resolve_proc = new_resolve_proc
47
+ end
48
+
49
+ def field
50
+ @field ||= begin
51
+ relay_mutation = self
52
+ field_resolve_proc = @resolve_proc
53
+ GraphQL::Field.define do
54
+ type(relay_mutation.return_type)
55
+ description(relay_mutation.description)
56
+ argument :input, !relay_mutation.input_type
57
+ resolve(field_resolve_proc)
58
+ mutation(relay_mutation)
59
+ end
60
+ end
61
+ end
62
+
63
+ def return_interfaces
64
+ @return_interfaces ||= []
65
+ end
66
+
67
+ def return_type
68
+ @return_type ||= begin
69
+ @has_generated_return_type = true
70
+ relay_mutation = self
71
+ GraphQL::ObjectType.define do
72
+ name("#{relay_mutation.name}Payload")
73
+ description("Autogenerated return type of #{relay_mutation.name}")
74
+ field :clientMutationId, types.String, "A unique identifier for the client performing the mutation.", property: :client_mutation_id
75
+ interfaces relay_mutation.return_interfaces
76
+ relay_mutation.return_fields.each do |name, field_obj|
77
+ field name, field: field_obj
78
+ end
79
+ mutation(relay_mutation)
80
+ end
81
+ end
82
+ end
83
+
84
+ def input_type
85
+ @input_type ||= begin
86
+ relay_mutation = self
87
+ input_object_type = GraphQL::InputObjectType.define do
88
+ name("#{relay_mutation.name}Input")
89
+ description("Autogenerated input type of #{relay_mutation.name}")
90
+ input_field :clientMutationId, types.String, "A unique identifier for the client performing the mutation."
91
+ mutation(relay_mutation)
92
+ end
93
+ input_fields.each do |name, arg|
94
+ input_object_type.arguments[name] = arg
95
+ end
96
+
97
+ input_object_type
98
+ end
99
+ end
100
+
101
+ def result_class
102
+ @result_class ||= Result.define_subclass(self)
103
+ end
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module Relay
4
+ # Helpers for working with Relay-specific Node objects.
5
+ module Node
6
+ # @return [GraphQL::Field] a field for finding objects by their global ID.
7
+ def self.field(**kwargs, &block)
8
+ GraphQL::Deprecation.warn "GraphQL::Relay::Node.field will be removed from GraphQL-Ruby 2.0, use GraphQL::Types::Relay::NodeField instead"
9
+ # We have to define it fresh each time because
10
+ # its name will be modified and its description
11
+ # _may_ be modified.
12
+ field = GraphQL::Types::Relay::NodeField.graphql_definition
13
+
14
+ if kwargs.any? || block
15
+ field = field.redefine(**kwargs, &block)
16
+ end
17
+
18
+ field
19
+ end
20
+
21
+ def self.plural_field(**kwargs, &block)
22
+ GraphQL::Deprecation.warn "GraphQL::Relay::Nodes.field will be removed from GraphQL-Ruby 2.0, use GraphQL::Types::Relay::NodesField instead"
23
+ field = GraphQL::Types::Relay::NodesField.graphql_definition
24
+
25
+ if kwargs.any? || block
26
+ field = field.redefine(**kwargs, &block)
27
+ end
28
+
29
+ field
30
+ end
31
+
32
+ # @return [GraphQL::InterfaceType] The interface which all Relay types must implement
33
+ def self.interface
34
+ GraphQL::Deprecation.warn "GraphQL::Relay::Node.interface will be removed from GraphQL-Ruby 2.0, use GraphQL::Types::Relay::Node instead"
35
+ @interface ||= GraphQL::Types::Relay::Node.graphql_definition
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module Relay
4
+ # Wrap a Connection and expose its page info
5
+ PageInfo = GraphQL::Types::Relay::PageInfo.graphql_definition
6
+ end
7
+ end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module Relay
4
+ # This provides some isolation from `GraphQL::Relay` internals.
5
+ #
6
+ # Given a list of items and a new item, it will provide a connection and an edge.
7
+ #
8
+ # The connection doesn't receive outside arguments, so the list of items
9
+ # should be ordered and paginated before providing it here.
10
+ #
11
+ # @example Adding a comment to list of comments
12
+ # post = Post.find(args[:post_id])
13
+ # comments = post.comments
14
+ # new_comment = comments.build(body: args[:body])
15
+ # new_comment.save!
16
+ #
17
+ # range_add = GraphQL::Relay::RangeAdd.new(
18
+ # parent: post,
19
+ # collection: comments,
20
+ # item: new_comment,
21
+ # context: context,
22
+ # )
23
+ #
24
+ # response = {
25
+ # post: post,
26
+ # comments_connection: range_add.connection,
27
+ # new_comment_edge: range_add.edge,
28
+ # }
29
+ class RangeAdd
30
+ attr_reader :edge, :connection, :parent
31
+
32
+ # @param collection [Object] The list of items to wrap in a connection
33
+ # @param item [Object] The newly-added item (will be wrapped in `edge_class`)
34
+ # @param parent [Object] The owner of `collection`, will be passed to the connection if provided
35
+ # @param context [GraphQL::Query::Context] The surrounding `ctx`, will be passed to the connection if provided (this is required for cursor encoders)
36
+ # @param edge_class [Class] The class to wrap `item` with (defaults to the connection's edge class)
37
+ def initialize(collection:, item:, parent: nil, context: nil, edge_class: nil)
38
+ if context && context.schema.new_connections?
39
+ conn_class = context.schema.connections.wrapper_for(collection)
40
+ # The rest will be added by ConnectionExtension
41
+ @connection = conn_class.new(collection, parent: parent, context: context, edge_class: edge_class)
42
+ # Check if this connection supports it, to support old versions of GraphQL-Pro
43
+ @edge = if @connection.respond_to?(:range_add_edge)
44
+ @connection.range_add_edge(item)
45
+ else
46
+ @connection.edge_class.new(item, @connection)
47
+ end
48
+ else
49
+ connection_class = BaseConnection.connection_for_nodes(collection)
50
+ @connection = connection_class.new(collection, {}, parent: parent, context: context)
51
+ edge_class ||= Relay::Edge
52
+ @edge = edge_class.new(item, @connection)
53
+ end
54
+
55
+ @parent = parent
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,188 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module Relay
4
+ # A connection implementation to expose SQL collection objects.
5
+ # It works for:
6
+ # - `ActiveRecord::Relation`
7
+ # - `Sequel::Dataset`
8
+ class RelationConnection < BaseConnection
9
+ def cursor_from_node(item)
10
+ item_index = paged_nodes.index(item)
11
+ if item_index.nil?
12
+ raise("Can't generate cursor, item not found in connection: #{item}")
13
+ else
14
+ offset = item_index + 1 + ((paged_nodes_offset || 0) - (relation_offset(sliced_nodes) || 0))
15
+
16
+ if after
17
+ offset += offset_from_cursor(after)
18
+ elsif before
19
+ offset += offset_from_cursor(before) - 1 - sliced_nodes_count
20
+ end
21
+
22
+ encode(offset.to_s)
23
+ end
24
+ end
25
+
26
+ def has_next_page
27
+ if first
28
+ if defined?(ActiveRecord::Relation) && nodes.is_a?(ActiveRecord::Relation)
29
+ initial_offset = after ? offset_from_cursor(after) : 0
30
+ return paged_nodes.length >= first && nodes.offset(first + initial_offset).exists?
31
+ end
32
+ return paged_nodes.length >= first && sliced_nodes_count > first
33
+ end
34
+ if GraphQL::Relay::ConnectionType.bidirectional_pagination && last
35
+ return sliced_nodes_count >= last
36
+ end
37
+ false
38
+ end
39
+
40
+ def has_previous_page
41
+ if last
42
+ paged_nodes.length >= last && sliced_nodes_count > last
43
+ elsif GraphQL::Relay::ConnectionType.bidirectional_pagination && after
44
+ # We've already paginated through the collection a bit,
45
+ # there are nodes behind us
46
+ offset_from_cursor(after) > 0
47
+ else
48
+ false
49
+ end
50
+ end
51
+
52
+ def first
53
+ @first ||= begin
54
+ capped = limit_pagination_argument(arguments[:first], max_page_size)
55
+ if capped.nil? && last.nil?
56
+ capped = max_page_size
57
+ end
58
+ capped
59
+ end
60
+ end
61
+
62
+ def last
63
+ @last ||= limit_pagination_argument(arguments[:last], max_page_size)
64
+ end
65
+
66
+ private
67
+
68
+ # apply first / last limit results
69
+ # @return [Array]
70
+ def paged_nodes
71
+ return @paged_nodes if defined? @paged_nodes
72
+
73
+ items = sliced_nodes
74
+
75
+ if first
76
+ if relation_limit(items).nil? || relation_limit(items) > first
77
+ items = items.limit(first)
78
+ end
79
+ end
80
+
81
+ if last
82
+ if relation_limit(items)
83
+ if last <= relation_limit(items)
84
+ offset = (relation_offset(items) || 0) + (relation_limit(items) - last)
85
+ items = items.offset(offset).limit(last)
86
+ end
87
+ else
88
+ slice_count = relation_count(items)
89
+ offset = (relation_offset(items) || 0) + slice_count - [last, slice_count].min
90
+ items = items.offset(offset).limit(last)
91
+ end
92
+ end
93
+
94
+ if max_page_size && !first && !last
95
+ if relation_limit(items).nil? || relation_limit(items) > max_page_size
96
+ items = items.limit(max_page_size)
97
+ end
98
+ end
99
+
100
+ # Store this here so we can convert the relation to an Array
101
+ # (this avoids an extra DB call on Sequel)
102
+ @paged_nodes_offset = relation_offset(items)
103
+ @paged_nodes = items.to_a
104
+ end
105
+
106
+ def paged_nodes_offset
107
+ paged_nodes && @paged_nodes_offset
108
+ end
109
+
110
+ def relation_offset(relation)
111
+ if relation.respond_to?(:offset_value)
112
+ relation.offset_value
113
+ else
114
+ relation.opts[:offset]
115
+ end
116
+ end
117
+
118
+ def relation_limit(relation)
119
+ if relation.respond_to?(:limit_value)
120
+ relation.limit_value
121
+ else
122
+ relation.opts[:limit]
123
+ end
124
+ end
125
+
126
+ # If a relation contains a `.group` clause, a `.count` will return a Hash.
127
+ def relation_count(relation)
128
+ count_or_hash = if(defined?(ActiveRecord::Relation) && relation.is_a?(ActiveRecord::Relation))
129
+ relation.respond_to?(:unscope)? relation.unscope(:order).count(:all) : relation.count(:all)
130
+ else # eg, Sequel::Dataset, don't mess up others
131
+ relation.count
132
+ end
133
+ count_or_hash.is_a?(Integer) ? count_or_hash : count_or_hash.length
134
+ end
135
+
136
+ # Apply cursors to edges
137
+ def sliced_nodes
138
+ return @sliced_nodes if defined? @sliced_nodes
139
+
140
+ @sliced_nodes = nodes
141
+
142
+ if after
143
+ offset = (relation_offset(@sliced_nodes) || 0) + offset_from_cursor(after)
144
+ @sliced_nodes = @sliced_nodes.offset(offset)
145
+ end
146
+
147
+ if before && after
148
+ if offset_from_cursor(after) < offset_from_cursor(before)
149
+ @sliced_nodes = limit_nodes(@sliced_nodes, offset_from_cursor(before) - offset_from_cursor(after) - 1)
150
+ else
151
+ @sliced_nodes = limit_nodes(@sliced_nodes, 0)
152
+ end
153
+
154
+ elsif before
155
+ @sliced_nodes = limit_nodes(@sliced_nodes, offset_from_cursor(before) - 1)
156
+ end
157
+
158
+ @sliced_nodes
159
+ end
160
+
161
+ def limit_nodes(sliced_nodes, limit)
162
+ if limit > 0 || defined?(ActiveRecord::Relation) && sliced_nodes.is_a?(ActiveRecord::Relation)
163
+ sliced_nodes.limit(limit)
164
+ else
165
+ sliced_nodes.where(false)
166
+ end
167
+ end
168
+
169
+ def sliced_nodes_count
170
+ return @sliced_nodes_count if defined? @sliced_nodes_count
171
+
172
+ # If a relation contains a `.group` clause, a `.count` will return a Hash.
173
+ @sliced_nodes_count = relation_count(sliced_nodes)
174
+ end
175
+
176
+ def offset_from_cursor(cursor)
177
+ decode(cursor).to_i
178
+ end
179
+ end
180
+
181
+ if defined?(ActiveRecord::Relation)
182
+ BaseConnection.register_connection_implementation(ActiveRecord::Relation, RelationConnection)
183
+ end
184
+ if defined?(Sequel::Dataset)
185
+ BaseConnection.register_connection_implementation(Sequel::Dataset, RelationConnection)
186
+ end
187
+ end
188
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module Relay
4
+ # Mixin for Relay-related methods in type objects
5
+ # (used by BaseType and Schema::Member).
6
+ module TypeExtensions
7
+ # @return [GraphQL::ObjectType] The default connection type for this object type
8
+ def connection_type
9
+ @connection_type ||= define_connection
10
+ end
11
+
12
+ # Define a custom connection type for this object type
13
+ # @return [GraphQL::ObjectType]
14
+ def define_connection(**kwargs, &block)
15
+ GraphQL::Deprecation.warn ".connection_type and .define_connection will be removed from GraphQL-Ruby 2.0, use class-based type definitions instead: https://graphql-ruby.org/schema/class_based_api.html"
16
+ GraphQL::Relay::ConnectionType.create_type(self, **kwargs, &block)
17
+ end
18
+
19
+ # @return [GraphQL::ObjectType] The default edge type for this object type
20
+ def edge_type
21
+ @edge_type ||= define_edge
22
+ end
23
+
24
+ # Define a custom edge type for this object type
25
+ # @return [GraphQL::ObjectType]
26
+ def define_edge(**kwargs, &block)
27
+ GraphQL::Deprecation.warn ".edge_type and .define_edge will be removed from GraphQL-Ruby 2.0, use class-based type definitions instead: https://graphql-ruby.org/schema/class_based_api.html"
28
+ GraphQL::Relay::EdgeType.create_type(self, **kwargs, &block)
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'graphql/relay/page_info'
4
+ require 'graphql/relay/edge'
5
+ require 'graphql/relay/edge_type'
6
+ require 'graphql/relay/edges_instrumentation'
7
+ require 'graphql/relay/base_connection'
8
+ require 'graphql/relay/array_connection'
9
+ require 'graphql/relay/range_add'
10
+ require 'graphql/relay/relation_connection'
11
+ require 'graphql/relay/mongo_relation_connection'
12
+ require 'graphql/relay/global_id_resolve'
13
+ require 'graphql/relay/mutation'
14
+ require 'graphql/relay/node'
15
+ require 'graphql/relay/connection_instrumentation'
16
+ require 'graphql/relay/connection_resolve'
17
+ require 'graphql/relay/connection_type'
18
+ require 'graphql/relay/type_extensions'
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+ require "rubocop"
3
+
4
+ module GraphQL
5
+ module Rubocop
6
+ module GraphQL
7
+ class BaseCop < RuboCop::Cop::Base
8
+ extend RuboCop::Cop::AutoCorrector
9
+
10
+ # Return the source of `send_node`, but without the keyword argument represented by `pair_node`
11
+ def source_without_keyword_argument(send_node, pair_node)
12
+ # work back to the preceeding comma
13
+ first_pos = pair_node.location.expression.begin_pos
14
+ end_pos = pair_node.location.expression.end_pos
15
+ node_source = send_node.source_range.source
16
+ node_first_pos = send_node.location.expression.begin_pos
17
+
18
+ relative_first_pos = first_pos - node_first_pos
19
+ relative_last_pos = end_pos - node_first_pos
20
+
21
+ begin_removal_pos = relative_first_pos
22
+ while node_source[begin_removal_pos] != ","
23
+ begin_removal_pos -= 1
24
+ if begin_removal_pos < 1
25
+ raise "Invariant: somehow backtracked to beginning of node looking for a comma (node source: #{node_source.inspect})"
26
+ end
27
+ end
28
+
29
+ end_removal_pos = relative_last_pos
30
+ cleaned_node_source = node_source[0...begin_removal_pos] + node_source[end_removal_pos..-1]
31
+ cleaned_node_source
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end