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,159 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ class Backtrace
4
+ # A class for turning a context into a human-readable table or array
5
+ class Table
6
+ MIN_COL_WIDTH = 4
7
+ MAX_COL_WIDTH = 100
8
+ HEADERS = [
9
+ "Loc",
10
+ "Field",
11
+ "Object",
12
+ "Arguments",
13
+ "Result",
14
+ ]
15
+
16
+ def initialize(context, value:)
17
+ @context = context
18
+ @override_value = value
19
+ end
20
+
21
+ # @return [String] A table layout of backtrace with metadata
22
+ def to_table
23
+ @to_table ||= render_table(rows)
24
+ end
25
+
26
+ # @return [Array<String>] An array of position + field name entries
27
+ def to_backtrace
28
+ @to_backtrace ||= begin
29
+ backtrace = rows.map { |r| "#{r[0]}: #{r[1]}" }
30
+ # skip the header entry
31
+ backtrace.shift
32
+ backtrace
33
+ end
34
+ end
35
+
36
+ private
37
+
38
+ def rows
39
+ @rows ||= build_rows(@context, rows: [HEADERS], top: true)
40
+ end
41
+
42
+ # @return [String]
43
+ def render_table(rows)
44
+ max = Array.new(HEADERS.length, MIN_COL_WIDTH)
45
+
46
+ rows.each do |row|
47
+ row.each_with_index do |col, idx|
48
+ col_len = col.length
49
+ max_len = max[idx]
50
+ if col_len > max_len
51
+ if col_len > MAX_COL_WIDTH
52
+ max[idx] = MAX_COL_WIDTH
53
+ else
54
+ max[idx] = col_len
55
+ end
56
+ end
57
+ end
58
+ end
59
+
60
+ table = "".dup
61
+ last_col_idx = max.length - 1
62
+ rows.each do |row|
63
+ table << row.map.each_with_index do |col, idx|
64
+ max_len = max[idx]
65
+ if idx < last_col_idx
66
+ col = col.ljust(max_len)
67
+ end
68
+ if col.length > max_len
69
+ col = col[0, max_len - 3] + "..."
70
+ end
71
+ col
72
+ end.join(" | ")
73
+ table << "\n"
74
+ end
75
+ table
76
+ end
77
+
78
+ # @return [Array] 5 items for a backtrace table (not `key`)
79
+ def build_rows(context_entry, rows:, top: false)
80
+ case context_entry
81
+ when Backtrace::Frame
82
+ field_alias = context_entry.ast_node.respond_to?(:alias) && context_entry.ast_node.alias
83
+ value = if top && @override_value
84
+ @override_value
85
+ else
86
+ value_at(@context.query.context.namespace(:interpreter)[:runtime], context_entry.path)
87
+ end
88
+ rows << [
89
+ "#{context_entry.ast_node ? context_entry.ast_node.position.join(":") : ""}",
90
+ "#{context_entry.field.path}#{field_alias ? " as #{field_alias}" : ""}",
91
+ "#{context_entry.object.object.inspect}",
92
+ context_entry.arguments.to_h.inspect, # rubocop:disable Development/ContextIsPassedCop -- unrelated method
93
+ Backtrace::InspectResult.inspect_result(value),
94
+ ]
95
+ if (parent = context_entry.parent_frame)
96
+ build_rows(parent, rows: rows)
97
+ else
98
+ rows
99
+ end
100
+ when GraphQL::Query::Context::FieldResolutionContext
101
+ ctx = context_entry
102
+ field_name = "#{ctx.irep_node.owner_type.name}.#{ctx.field.name}"
103
+ position = "#{ctx.ast_node.line}:#{ctx.ast_node.col}"
104
+ field_alias = ctx.ast_node.alias
105
+ object = ctx.object
106
+ if object.is_a?(GraphQL::Schema::Object)
107
+ object = object.object
108
+ end
109
+ rows << [
110
+ "#{position}",
111
+ "#{field_name}#{field_alias ? " as #{field_alias}" : ""}",
112
+ "#{object.inspect}",
113
+ ctx.irep_node.arguments.to_h.inspect,
114
+ Backtrace::InspectResult.inspect_result(top && @override_value ? @override_value : ctx.value),
115
+ ]
116
+
117
+ build_rows(ctx.parent, rows: rows)
118
+ when GraphQL::Query::Context
119
+ query = context_entry.query
120
+ op = query.selected_operation
121
+ if op
122
+ op_type = op.operation_type
123
+ position = "#{op.line}:#{op.col}"
124
+ else
125
+ op_type = "query"
126
+ position = "?:?"
127
+ end
128
+ op_name = query.selected_operation_name
129
+ object = query.root_value
130
+ if object.is_a?(GraphQL::Schema::Object)
131
+ object = object.object
132
+ end
133
+ value = value_at(context_entry.namespace(:interpreter)[:runtime], [])
134
+ rows << [
135
+ "#{position}",
136
+ "#{op_type}#{op_name ? " #{op_name}" : ""}",
137
+ "#{object.inspect}",
138
+ query.variables.to_h.inspect,
139
+ Backtrace::InspectResult.inspect_result(value),
140
+ ]
141
+ else
142
+ raise "Unexpected get_rows subject #{context_entry.class} (#{context_entry.inspect})"
143
+ end
144
+ end
145
+
146
+ def value_at(runtime, path)
147
+ response = runtime.final_result
148
+ path.each do |key|
149
+ if response && (response = response[key])
150
+ next
151
+ else
152
+ break
153
+ end
154
+ end
155
+ response
156
+ end
157
+ end
158
+ end
159
+ end
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ class Backtrace
4
+ # When {Backtrace} is enabled, raised errors are wrapped with {TracedError}.
5
+ class TracedError < GraphQL::Error
6
+ # @return [Array<String>] Printable backtrace of GraphQL error context
7
+ attr_reader :graphql_backtrace
8
+
9
+ # @return [GraphQL::Query::Context] The context at the field where the error was raised
10
+ attr_reader :context
11
+
12
+ MESSAGE_TEMPLATE = <<-MESSAGE
13
+ Unhandled error during GraphQL execution:
14
+
15
+ %{cause_message}
16
+ %{cause_backtrace}
17
+ %{cause_backtrace_more}
18
+ Use #cause to access the original exception (including #cause.backtrace).
19
+
20
+ GraphQL Backtrace:
21
+ %{graphql_table}
22
+ MESSAGE
23
+
24
+ # This many lines of the original Ruby backtrace
25
+ # are included in the message
26
+ CAUSE_BACKTRACE_PREVIEW_LENGTH = 10
27
+
28
+ def initialize(err, current_ctx)
29
+ @context = current_ctx
30
+ backtrace = Backtrace.new(current_ctx, value: err)
31
+ @graphql_backtrace = backtrace.to_a
32
+
33
+ cause_backtrace_preview = err.backtrace.first(CAUSE_BACKTRACE_PREVIEW_LENGTH).join("\n ")
34
+
35
+ cause_backtrace_remainder_length = err.backtrace.length - CAUSE_BACKTRACE_PREVIEW_LENGTH
36
+ cause_backtrace_more = if cause_backtrace_remainder_length < 0
37
+ ""
38
+ elsif cause_backtrace_remainder_length == 1
39
+ "... and 1 more line\n"
40
+ else
41
+ "... and #{cause_backtrace_remainder_length} more lines\n"
42
+ end
43
+
44
+ message = MESSAGE_TEMPLATE % {
45
+ cause_message: err.message,
46
+ cause_backtrace: cause_backtrace_preview,
47
+ cause_backtrace_more: cause_backtrace_more,
48
+ graphql_table: backtrace.inspect,
49
+ }
50
+ super(message)
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,81 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ class Backtrace
4
+ # TODO this is not fiber-friendly
5
+ module Tracer
6
+ module_function
7
+
8
+ # Implement the {GraphQL::Tracing} API.
9
+ def trace(key, metadata)
10
+ case key
11
+ when "lex", "parse"
12
+ # No context here, don't have a query yet
13
+ nil
14
+ when "execute_multiplex", "analyze_multiplex"
15
+ # No query context yet
16
+ nil
17
+ when "validate", "analyze_query", "execute_query", "execute_query_lazy"
18
+ push_key = []
19
+ if (query = metadata[:query]) || ((queries = metadata[:queries]) && (query = queries.first))
20
+ push_data = query
21
+ multiplex = query.multiplex
22
+ elsif (multiplex = metadata[:multiplex])
23
+ push_data = multiplex.queries.first
24
+ end
25
+ when "execute_field", "execute_field_lazy"
26
+ query = metadata[:query] || raise(ArgumentError, "Add `legacy: true` to use GraphQL::Backtrace without the interpreter runtime.")
27
+ multiplex = query.multiplex
28
+ push_key = metadata[:path]
29
+ parent_frame = multiplex.context[:graphql_backtrace_contexts][push_key[0..-2]]
30
+
31
+ if parent_frame.is_a?(GraphQL::Query)
32
+ parent_frame = parent_frame.context
33
+ end
34
+
35
+ push_data = Frame.new(
36
+ query: query,
37
+ path: push_key,
38
+ ast_node: metadata[:ast_node],
39
+ field: metadata[:field],
40
+ object: metadata[:object],
41
+ arguments: metadata[:arguments],
42
+ parent_frame: parent_frame,
43
+ )
44
+ else
45
+ # Custom key, no backtrace data for this
46
+ nil
47
+ end
48
+
49
+ if push_data && multiplex
50
+ push_storage = multiplex.context[:graphql_backtrace_contexts] ||= {}
51
+ push_storage[push_key] = push_data
52
+ multiplex.context[:last_graphql_backtrace_context] = push_data
53
+ end
54
+
55
+ if key == "execute_multiplex"
56
+ multiplex_context = metadata[:multiplex].context
57
+ begin
58
+ yield
59
+ rescue StandardError => err
60
+ # This is an unhandled error from execution,
61
+ # Re-raise it with a GraphQL trace.
62
+ potential_context = multiplex_context[:last_graphql_backtrace_context]
63
+
64
+ if potential_context.is_a?(GraphQL::Query::Context) ||
65
+ potential_context.is_a?(GraphQL::Query::Context::FieldResolutionContext) ||
66
+ potential_context.is_a?(Backtrace::Frame)
67
+ raise TracedError.new(err, potential_context)
68
+ else
69
+ raise
70
+ end
71
+ ensure
72
+ multiplex_context.delete(:graphql_backtrace_contexts)
73
+ multiplex_context.delete(:last_graphql_backtrace_context)
74
+ end
75
+ else
76
+ yield
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+ require "graphql/backtrace/inspect_result"
3
+ require "graphql/backtrace/legacy_tracer"
4
+ require "graphql/backtrace/table"
5
+ require "graphql/backtrace/traced_error"
6
+ require "graphql/backtrace/tracer"
7
+ module GraphQL
8
+ # Wrap unhandled errors with {TracedError}.
9
+ #
10
+ # {TracedError} provides a GraphQL backtrace with arguments and return values.
11
+ # The underlying error is available as {TracedError#cause}.
12
+ #
13
+ # @example toggling backtrace annotation
14
+ # class MySchema < GraphQL::Schema
15
+ # if Rails.env.development? || Rails.env.test?
16
+ # use GraphQL::Backtrace
17
+ # end
18
+ # end
19
+ #
20
+ class Backtrace
21
+ include Enumerable
22
+ extend Forwardable
23
+
24
+ def_delegators :to_a, :each, :[]
25
+
26
+ def self.use(schema_defn, legacy: false)
27
+ tracer = if legacy
28
+ self::LegacyTracer
29
+ else
30
+ self::Tracer
31
+ end
32
+ schema_defn.tracer(tracer)
33
+ end
34
+
35
+ def initialize(context, value: nil)
36
+ @table = Table.new(context, value: value)
37
+ end
38
+
39
+ def inspect
40
+ @table.to_table
41
+ end
42
+
43
+ alias :to_s :inspect
44
+
45
+ def to_a
46
+ @table.to_backtrace
47
+ end
48
+
49
+ # Used for internal bookkeeping
50
+ # @api private
51
+ class Frame
52
+ attr_reader :path, :query, :ast_node, :object, :field, :arguments, :parent_frame
53
+ def initialize(path:, query:, ast_node:, object:, field:, arguments:, parent_frame:)
54
+ @path = path
55
+ @query = query
56
+ @ast_node = ast_node
57
+ @field = field
58
+ @object = object
59
+ @arguments = arguments
60
+ @parent_frame = parent_frame
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ # Helpers for migrating in a backwards-compatible way
4
+ # Remove this in GraphQL-Ruby 2.0, when all users of it will be gone.
5
+ # @api private
6
+ module BackwardsCompatibility
7
+ module_function
8
+ # Given a callable whose API used to take `from` arguments,
9
+ # check its arity, and if needed, apply a wrapper so that
10
+ # it can be called with `to` arguments.
11
+ # If a wrapper is applied, warn the application with `name`.
12
+ #
13
+ # If `last`, then use the last arguments to call the function.
14
+ def wrap_arity(callable, from:, to:, name:, last: false)
15
+ arity = get_arity(callable)
16
+ if arity == to || arity < 0
17
+ # It already matches, return it as is
18
+ callable
19
+ elsif arity == from
20
+ # It has the old arity, so wrap it with an arity converter
21
+ message ="#{name} with #{from} arguments is deprecated, it now accepts #{to} arguments, see:"
22
+ backtrace = caller(0, 20)
23
+ # Find the first line in the trace that isn't library internals:
24
+ user_line = backtrace.find {|l| l !~ /lib\/graphql/ }
25
+ GraphQL::Deprecation.warn(message + "\n" + user_line + "\n")
26
+ wrapper = last ? LastArgumentsWrapper : FirstArgumentsWrapper
27
+ wrapper.new(callable, from)
28
+ else
29
+ raise "Can't wrap #{callable} (arity: #{arity}) to have arity #{to}"
30
+ end
31
+ end
32
+
33
+ def get_arity(callable)
34
+ case callable
35
+ when Method, Proc
36
+ callable.arity
37
+ else
38
+ callable.method(:call).arity
39
+ end
40
+ end
41
+
42
+ class FirstArgumentsWrapper
43
+ def initialize(callable, old_arity)
44
+ @callable = callable
45
+ @old_arity = old_arity
46
+ end
47
+
48
+ def call(*args)
49
+ backwards_compat_args = args.first(@old_arity)
50
+ @callable.call(*backwards_compat_args)
51
+ end
52
+ end
53
+
54
+ class LastArgumentsWrapper < FirstArgumentsWrapper
55
+ def call(*args)
56
+ backwards_compat_args = args.last(@old_arity)
57
+ @callable.call(*backwards_compat_args)
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,230 @@
1
+ # frozen_string_literal: true
2
+ require "graphql/relay/type_extensions"
3
+
4
+ module GraphQL
5
+ # The parent for all type classes.
6
+ class BaseType
7
+ include GraphQL::Define::NonNullWithBang
8
+ include GraphQL::Define::InstanceDefinable
9
+ include GraphQL::Relay::TypeExtensions
10
+
11
+ accepts_definitions :name, :description,
12
+ :introspection,
13
+ :default_scalar,
14
+ :default_relay,
15
+ {
16
+ connection: GraphQL::Define::AssignConnection,
17
+ global_id_field: GraphQL::Define::AssignGlobalIdField,
18
+ }
19
+
20
+ ensure_defined(:graphql_name, :name, :description, :introspection?, :default_scalar?)
21
+
22
+ attr_accessor :ast_node
23
+
24
+ def initialize
25
+ @introspection = false
26
+ @default_scalar = false
27
+ @default_relay = false
28
+ end
29
+
30
+ def initialize_copy(other)
31
+ super
32
+ # Reset these derived defaults
33
+ @connection_type = nil
34
+ @edge_type = nil
35
+ end
36
+
37
+ # @return [String] the name of this type, must be unique within a Schema
38
+ attr_reader :name
39
+ # Future-compatible alias
40
+ # @see {GraphQL::SchemaMember}
41
+ alias :graphql_name :name
42
+ # Future-compatible alias
43
+ # @see {GraphQL::SchemaMember}
44
+ alias :graphql_definition :itself
45
+
46
+ def type_class
47
+ metadata[:type_class]
48
+ end
49
+
50
+ def name=(name)
51
+ GraphQL::NameValidator.validate!(name)
52
+ @name = name
53
+ end
54
+
55
+ # @return [String, nil] a description for this type
56
+ attr_accessor :description
57
+
58
+ # @return [Boolean] Is this type a predefined introspection type?
59
+ def introspection?
60
+ @introspection
61
+ end
62
+
63
+ # @return [Boolean] Is this type a built-in scalar type? (eg, `String`, `Int`)
64
+ def default_scalar?
65
+ @default_scalar
66
+ end
67
+
68
+ # @return [Boolean] Is this type a built-in Relay type? (`Node`, `PageInfo`)
69
+ def default_relay?
70
+ @default_relay
71
+ end
72
+
73
+ # @api private
74
+ attr_writer :introspection, :default_scalar, :default_relay
75
+
76
+ # @param other [GraphQL::BaseType] compare to this object
77
+ # @return [Boolean] are these types equivalent? (incl. non-null, list)
78
+ # @see {ModifiesAnotherType#==} for override on List & NonNull types
79
+ def ==(other)
80
+ other.is_a?(GraphQL::BaseType) && self.name == other.name
81
+ end
82
+
83
+ # If this type is modifying an underlying type,
84
+ # return the underlying type. (Otherwise, return `self`.)
85
+ def unwrap
86
+ self
87
+ end
88
+
89
+ # @return [GraphQL::NonNullType] a non-null version of this type
90
+ def to_non_null_type
91
+ GraphQL::NonNullType.new(of_type: self)
92
+ end
93
+
94
+ # @return [GraphQL::ListType] a list version of this type
95
+ def to_list_type
96
+ GraphQL::ListType.new(of_type: self)
97
+ end
98
+
99
+ module ModifiesAnotherType
100
+ def unwrap
101
+ self.of_type.unwrap
102
+ end
103
+
104
+ def ==(other)
105
+ other.is_a?(ModifiesAnotherType) && other.of_type == of_type
106
+ end
107
+ end
108
+
109
+ # Find out which possible type to use for `value`.
110
+ # Returns self if there are no possible types (ie, not Union or Interface)
111
+ def resolve_type(value, ctx)
112
+ self
113
+ end
114
+
115
+ # Print the human-readable name of this type using the query-string naming pattern
116
+ def to_s
117
+ name
118
+ end
119
+
120
+ alias :inspect :to_s
121
+ alias :to_type_signature :to_s
122
+
123
+ def valid_isolated_input?(value)
124
+ valid_input?(value, GraphQL::Query::NullContext)
125
+ end
126
+
127
+ def validate_isolated_input(value)
128
+ validate_input(value, GraphQL::Query::NullContext)
129
+ end
130
+
131
+ def coerce_isolated_input(value)
132
+ coerce_input(value, GraphQL::Query::NullContext)
133
+ end
134
+
135
+ def coerce_isolated_result(value)
136
+ coerce_result(value, GraphQL::Query::NullContext)
137
+ end
138
+
139
+ def valid_input?(value, ctx = nil)
140
+ if ctx.nil?
141
+ warn_deprecated_coerce("valid_isolated_input?")
142
+ ctx = GraphQL::Query::NullContext
143
+ end
144
+
145
+ validate_input(value, ctx).valid?
146
+ end
147
+
148
+ def validate_input(value, ctx = nil)
149
+ if ctx.nil?
150
+ warn_deprecated_coerce("validate_isolated_input")
151
+ ctx = GraphQL::Query::NullContext
152
+ end
153
+
154
+ if value.nil?
155
+ GraphQL::Query::InputValidationResult.new
156
+ else
157
+ validate_non_null_input(value, ctx)
158
+ end
159
+ end
160
+
161
+ def coerce_input(value, ctx = nil)
162
+ if value.nil?
163
+ nil
164
+ else
165
+ if ctx.nil?
166
+ warn_deprecated_coerce("coerce_isolated_input")
167
+ ctx = GraphQL::Query::NullContext
168
+ end
169
+ coerce_non_null_input(value, ctx)
170
+ end
171
+ end
172
+
173
+ def coerce_result(value, ctx)
174
+ raise GraphQL::RequiredImplementationMissingError
175
+ end
176
+
177
+ # Types with fields may override this
178
+ # @param name [String] field name to lookup for this type
179
+ # @return [GraphQL::Field, nil]
180
+ def get_field(name)
181
+ nil
182
+ end
183
+
184
+ # During schema definition, types can be defined inside procs or as strings.
185
+ # This function converts it to a type instance
186
+ # @return [GraphQL::BaseType]
187
+ def self.resolve_related_type(type_arg)
188
+ case type_arg
189
+ when Proc
190
+ # lazy-eval it, then try again
191
+ resolve_related_type(type_arg.call)
192
+ when String
193
+ # Get a constant by this name
194
+ resolve_related_type(Object.const_get(type_arg))
195
+ else
196
+ if type_arg.respond_to?(:graphql_definition)
197
+ type_arg.graphql_definition
198
+ else
199
+ type_arg
200
+ end
201
+ end
202
+ end
203
+
204
+ # Return a GraphQL string for the type definition
205
+ # @param schema [GraphQL::Schema]
206
+ # @param printer [GraphQL::Schema::Printer]
207
+ # @see {GraphQL::Schema::Printer#initialize for additional options}
208
+ # @return [String] type definition
209
+ def to_definition(schema, printer: nil, **args)
210
+ printer ||= GraphQL::Schema::Printer.new(schema, **args)
211
+ printer.print_type(self)
212
+ end
213
+
214
+ # Returns true if this is a non-nullable type. A nullable list of non-nullables is considered nullable.
215
+ def non_null?
216
+ false
217
+ end
218
+
219
+ # Returns true if this is a list type. A non-nullable list is considered a list.
220
+ def list?
221
+ false
222
+ end
223
+
224
+ private
225
+
226
+ def warn_deprecated_coerce(alt_method_name)
227
+ GraphQL::Deprecation.warn("Coercing without a context is deprecated; use `#{alt_method_name}` if you don't want context-awareness")
228
+ end
229
+ end
230
+ end
@@ -0,0 +1,2 @@
1
+ # frozen_string_literal: true
2
+ GraphQL::BOOLEAN_TYPE = GraphQL::Types::Boolean.graphql_definition
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ class CoercionError < GraphQL::Error
4
+ # @return [Hash] Optional custom data for error objects which will be added
5
+ # under the `extensions` key.
6
+ attr_accessor :extensions
7
+
8
+ def initialize(message, extensions: nil)
9
+ @extensions = extensions
10
+ super(message)
11
+ end
12
+ end
13
+ end