graphql 1.9.0 → 2.1.1

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

Potentially problematic release.


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

Files changed (723) hide show
  1. checksums.yaml +5 -5
  2. data/lib/generators/graphql/core.rb +21 -9
  3. data/lib/generators/graphql/enum_generator.rb +4 -10
  4. data/lib/generators/graphql/field_extractor.rb +31 -0
  5. data/lib/generators/graphql/input_generator.rb +50 -0
  6. data/lib/generators/graphql/install/mutation_root_generator.rb +34 -0
  7. data/lib/generators/graphql/install/templates/base_mutation.erb +12 -0
  8. data/lib/generators/graphql/{templates → install/templates}/mutation_type.erb +4 -0
  9. data/lib/generators/graphql/install_generator.rb +49 -9
  10. data/lib/generators/graphql/interface_generator.rb +7 -7
  11. data/lib/generators/graphql/loader_generator.rb +1 -0
  12. data/lib/generators/graphql/mutation_create_generator.rb +22 -0
  13. data/lib/generators/graphql/mutation_delete_generator.rb +22 -0
  14. data/lib/generators/graphql/mutation_generator.rb +6 -30
  15. data/lib/generators/graphql/mutation_update_generator.rb +22 -0
  16. data/lib/generators/graphql/object_generator.rb +28 -12
  17. data/lib/generators/graphql/orm_mutations_base.rb +40 -0
  18. data/lib/generators/graphql/relay.rb +66 -0
  19. data/lib/generators/graphql/relay_generator.rb +21 -0
  20. data/lib/generators/graphql/scalar_generator.rb +4 -2
  21. data/lib/generators/graphql/templates/base_argument.erb +8 -0
  22. data/lib/generators/graphql/templates/base_connection.erb +10 -0
  23. data/lib/generators/graphql/templates/base_edge.erb +10 -0
  24. data/lib/generators/graphql/templates/base_enum.erb +4 -0
  25. data/lib/generators/graphql/templates/base_field.erb +9 -0
  26. data/lib/generators/graphql/templates/base_input_object.erb +5 -0
  27. data/lib/generators/graphql/templates/base_interface.erb +6 -0
  28. data/lib/generators/graphql/templates/base_object.erb +5 -0
  29. data/lib/generators/graphql/templates/base_scalar.erb +4 -0
  30. data/lib/generators/graphql/templates/base_union.erb +4 -0
  31. data/lib/generators/graphql/templates/enum.erb +7 -1
  32. data/lib/generators/graphql/templates/graphql_controller.erb +23 -12
  33. data/lib/generators/graphql/templates/input.erb +9 -0
  34. data/lib/generators/graphql/templates/interface.erb +6 -2
  35. data/lib/generators/graphql/templates/loader.erb +4 -0
  36. data/lib/generators/graphql/templates/mutation.erb +5 -1
  37. data/lib/generators/graphql/templates/mutation_create.erb +20 -0
  38. data/lib/generators/graphql/templates/mutation_delete.erb +20 -0
  39. data/lib/generators/graphql/templates/mutation_update.erb +21 -0
  40. data/lib/generators/graphql/templates/node_type.erb +11 -0
  41. data/lib/generators/graphql/templates/object.erb +7 -3
  42. data/lib/generators/graphql/templates/query_type.erb +5 -3
  43. data/lib/generators/graphql/templates/scalar.erb +5 -1
  44. data/lib/generators/graphql/templates/schema.erb +27 -27
  45. data/lib/generators/graphql/templates/union.erb +6 -2
  46. data/lib/generators/graphql/type_generator.rb +47 -10
  47. data/lib/generators/graphql/union_generator.rb +5 -5
  48. data/lib/graphql/analysis/ast/analyzer.rb +41 -12
  49. data/lib/graphql/analysis/ast/field_usage.rb +32 -3
  50. data/lib/graphql/analysis/ast/max_query_complexity.rb +4 -5
  51. data/lib/graphql/analysis/ast/max_query_depth.rb +7 -3
  52. data/lib/graphql/analysis/ast/query_complexity.rb +182 -66
  53. data/lib/graphql/analysis/ast/query_depth.rb +15 -26
  54. data/lib/graphql/analysis/ast/visitor.rb +83 -62
  55. data/lib/graphql/analysis/ast.rb +23 -20
  56. data/lib/graphql/analysis.rb +0 -7
  57. data/lib/graphql/backtrace/inspect_result.rb +0 -1
  58. data/lib/graphql/backtrace/table.rb +37 -16
  59. data/lib/graphql/backtrace/trace.rb +96 -0
  60. data/lib/graphql/backtrace/traced_error.rb +0 -1
  61. data/lib/graphql/backtrace/tracer.rb +39 -9
  62. data/lib/graphql/backtrace.rb +22 -18
  63. data/lib/graphql/coercion_error.rb +8 -0
  64. data/lib/graphql/dataloader/null_dataloader.rb +24 -0
  65. data/lib/graphql/dataloader/request.rb +19 -0
  66. data/lib/graphql/dataloader/request_all.rb +19 -0
  67. data/lib/graphql/dataloader/source.rb +195 -0
  68. data/lib/graphql/dataloader.rb +320 -0
  69. data/lib/graphql/date_encoding_error.rb +16 -0
  70. data/lib/graphql/deprecation.rb +9 -0
  71. data/lib/graphql/dig.rb +1 -1
  72. data/lib/graphql/execution/directive_checks.rb +2 -2
  73. data/lib/graphql/execution/errors.rb +93 -0
  74. data/lib/graphql/execution/interpreter/argument_value.rb +28 -0
  75. data/lib/graphql/execution/interpreter/arguments.rb +88 -0
  76. data/lib/graphql/execution/interpreter/arguments_cache.rb +105 -0
  77. data/lib/graphql/execution/interpreter/handles_raw_value.rb +18 -0
  78. data/lib/graphql/execution/interpreter/resolve.rb +62 -24
  79. data/lib/graphql/execution/interpreter/runtime/graphql_result.rb +170 -0
  80. data/lib/graphql/execution/interpreter/runtime.rb +695 -392
  81. data/lib/graphql/execution/interpreter.rb +199 -74
  82. data/lib/graphql/execution/lazy/lazy_method_map.rb +4 -0
  83. data/lib/graphql/execution/lazy.rb +11 -21
  84. data/lib/graphql/execution/lookahead.rb +110 -150
  85. data/lib/graphql/execution/multiplex.rb +6 -148
  86. data/lib/graphql/execution.rb +12 -4
  87. data/lib/graphql/execution_error.rb +3 -2
  88. data/lib/graphql/integer_decoding_error.rb +17 -0
  89. data/lib/graphql/integer_encoding_error.rb +26 -2
  90. data/lib/graphql/introspection/base_object.rb +2 -5
  91. data/lib/graphql/introspection/directive_location_enum.rb +2 -2
  92. data/lib/graphql/introspection/directive_type.rb +12 -6
  93. data/lib/graphql/introspection/dynamic_fields.rb +3 -8
  94. data/lib/graphql/introspection/entry_points.rb +6 -18
  95. data/lib/graphql/introspection/enum_value_type.rb +2 -2
  96. data/lib/graphql/introspection/field_type.rb +9 -5
  97. data/lib/graphql/introspection/input_value_type.rb +41 -7
  98. data/lib/graphql/introspection/introspection_query.rb +6 -92
  99. data/lib/graphql/introspection/schema_type.rb +13 -12
  100. data/lib/graphql/introspection/type_type.rb +34 -17
  101. data/lib/graphql/introspection.rb +100 -0
  102. data/lib/graphql/invalid_null_error.rb +18 -0
  103. data/lib/graphql/language/block_string.rb +50 -23
  104. data/lib/graphql/language/cache.rb +37 -0
  105. data/lib/graphql/language/definition_slice.rb +21 -10
  106. data/lib/graphql/language/document_from_schema_definition.rb +153 -87
  107. data/lib/graphql/language/lexer.rb +249 -1450
  108. data/lib/graphql/language/nodes.rb +152 -142
  109. data/lib/graphql/language/parser.rb +1036 -953
  110. data/lib/graphql/language/parser.y +159 -120
  111. data/lib/graphql/language/printer.rb +342 -154
  112. data/lib/graphql/language/sanitized_printer.rb +220 -0
  113. data/lib/graphql/language/static_visitor.rb +167 -0
  114. data/lib/graphql/language/token.rb +2 -2
  115. data/lib/graphql/language/visitor.rb +196 -140
  116. data/lib/graphql/language.rb +4 -1
  117. data/lib/graphql/load_application_object_failed_error.rb +22 -0
  118. data/lib/graphql/name_validator.rb +2 -7
  119. data/lib/graphql/pagination/active_record_relation_connection.rb +77 -0
  120. data/lib/graphql/pagination/array_connection.rb +79 -0
  121. data/lib/graphql/pagination/connection.rb +275 -0
  122. data/lib/graphql/pagination/connections.rb +135 -0
  123. data/lib/graphql/pagination/mongoid_relation_connection.rb +25 -0
  124. data/lib/graphql/pagination/relation_connection.rb +228 -0
  125. data/lib/graphql/pagination/sequel_dataset_connection.rb +28 -0
  126. data/lib/graphql/pagination.rb +6 -0
  127. data/lib/graphql/parse_error.rb +0 -1
  128. data/lib/graphql/query/context/scoped_context.rb +101 -0
  129. data/lib/graphql/query/context.rb +157 -187
  130. data/lib/graphql/query/fingerprint.rb +26 -0
  131. data/lib/graphql/query/input_validation_result.rb +33 -7
  132. data/lib/graphql/query/null_context.rb +21 -14
  133. data/lib/graphql/query/validation_pipeline.rb +17 -38
  134. data/lib/graphql/query/variable_validation_error.rb +17 -3
  135. data/lib/graphql/query/variables.rb +49 -14
  136. data/lib/graphql/query.rb +142 -61
  137. data/lib/graphql/railtie.rb +6 -102
  138. data/lib/graphql/rake_task/validate.rb +5 -2
  139. data/lib/graphql/rake_task.rb +42 -20
  140. data/lib/graphql/relay/range_add.rb +17 -10
  141. data/lib/graphql/relay.rb +0 -15
  142. data/lib/graphql/rubocop/graphql/base_cop.rb +36 -0
  143. data/lib/graphql/rubocop/graphql/default_null_true.rb +43 -0
  144. data/lib/graphql/rubocop/graphql/default_required_true.rb +43 -0
  145. data/lib/graphql/rubocop.rb +4 -0
  146. data/lib/graphql/schema/addition.rb +271 -0
  147. data/lib/graphql/schema/always_visible.rb +10 -0
  148. data/lib/graphql/schema/argument.rb +301 -32
  149. data/lib/graphql/schema/base_64_bp.rb +3 -2
  150. data/lib/graphql/schema/base_64_encoder.rb +2 -0
  151. data/lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb +1 -1
  152. data/lib/graphql/schema/build_from_definition/resolve_map.rb +13 -5
  153. data/lib/graphql/schema/build_from_definition.rb +349 -203
  154. data/lib/graphql/schema/built_in_types.rb +5 -5
  155. data/lib/graphql/schema/directive/deprecated.rb +18 -0
  156. data/lib/graphql/schema/directive/feature.rb +2 -2
  157. data/lib/graphql/schema/directive/flagged.rb +57 -0
  158. data/lib/graphql/schema/directive/include.rb +2 -2
  159. data/lib/graphql/schema/directive/one_of.rb +12 -0
  160. data/lib/graphql/schema/directive/skip.rb +2 -2
  161. data/lib/graphql/schema/directive/specified_by.rb +14 -0
  162. data/lib/graphql/schema/directive/transform.rb +14 -2
  163. data/lib/graphql/schema/directive.rb +134 -15
  164. data/lib/graphql/schema/enum.rb +137 -39
  165. data/lib/graphql/schema/enum_value.rb +17 -23
  166. data/lib/graphql/schema/field/connection_extension.rb +36 -20
  167. data/lib/graphql/schema/field/scope_extension.rb +15 -5
  168. data/lib/graphql/schema/field.rb +570 -334
  169. data/lib/graphql/schema/field_extension.rb +88 -4
  170. data/lib/graphql/schema/find_inherited_value.rb +31 -0
  171. data/lib/graphql/schema/finder.rb +16 -14
  172. data/lib/graphql/schema/has_single_input_argument.rb +156 -0
  173. data/lib/graphql/schema/input_object.rb +190 -48
  174. data/lib/graphql/schema/interface.rb +24 -49
  175. data/lib/graphql/schema/introspection_system.rb +109 -36
  176. data/lib/graphql/schema/late_bound_type.rb +9 -2
  177. data/lib/graphql/schema/list.rb +61 -3
  178. data/lib/graphql/schema/loader.rb +146 -97
  179. data/lib/graphql/schema/member/base_dsl_methods.rb +45 -51
  180. data/lib/graphql/schema/member/build_type.rb +34 -17
  181. data/lib/graphql/schema/member/has_arguments.rb +385 -10
  182. data/lib/graphql/schema/member/has_ast_node.rb +32 -0
  183. data/lib/graphql/schema/member/has_deprecation_reason.rb +24 -0
  184. data/lib/graphql/schema/member/has_directives.rb +118 -0
  185. data/lib/graphql/schema/member/has_fields.rb +180 -35
  186. data/lib/graphql/schema/member/has_interfaces.rb +143 -0
  187. data/lib/graphql/schema/member/has_unresolved_type_error.rb +15 -0
  188. data/lib/graphql/schema/member/has_validators.rb +57 -0
  189. data/lib/graphql/schema/member/relay_shortcuts.rb +47 -2
  190. data/lib/graphql/schema/member/scoped.rb +19 -0
  191. data/lib/graphql/schema/member/type_system_helpers.rb +20 -3
  192. data/lib/graphql/schema/member/validates_input.rb +33 -0
  193. data/lib/graphql/schema/member.rb +11 -6
  194. data/lib/graphql/schema/mutation.rb +4 -9
  195. data/lib/graphql/schema/non_null.rb +34 -4
  196. data/lib/graphql/schema/object.rb +55 -64
  197. data/lib/graphql/schema/printer.rb +26 -40
  198. data/lib/graphql/schema/relay_classic_mutation.rb +13 -80
  199. data/lib/graphql/schema/resolver/has_payload_type.rb +53 -12
  200. data/lib/graphql/schema/resolver.rb +182 -162
  201. data/lib/graphql/schema/scalar.rb +40 -15
  202. data/lib/graphql/schema/subscription.rb +85 -27
  203. data/lib/graphql/schema/timeout.rb +119 -0
  204. data/lib/graphql/schema/type_expression.rb +21 -13
  205. data/lib/graphql/schema/type_membership.rb +51 -0
  206. data/lib/graphql/schema/union.rb +69 -15
  207. data/lib/graphql/schema/unique_within_type.rb +1 -2
  208. data/lib/graphql/schema/validator/allow_blank_validator.rb +29 -0
  209. data/lib/graphql/schema/validator/allow_null_validator.rb +26 -0
  210. data/lib/graphql/schema/validator/exclusion_validator.rb +33 -0
  211. data/lib/graphql/schema/validator/format_validator.rb +48 -0
  212. data/lib/graphql/schema/validator/inclusion_validator.rb +35 -0
  213. data/lib/graphql/schema/validator/length_validator.rb +59 -0
  214. data/lib/graphql/schema/validator/numericality_validator.rb +82 -0
  215. data/lib/graphql/schema/validator/required_validator.rb +82 -0
  216. data/lib/graphql/schema/validator.rb +171 -0
  217. data/lib/graphql/schema/warden.rb +330 -59
  218. data/lib/graphql/schema/wrapper.rb +0 -5
  219. data/lib/graphql/schema.rb +985 -858
  220. data/lib/graphql/static_validation/all_rules.rb +4 -1
  221. data/lib/graphql/static_validation/base_visitor.rb +33 -32
  222. data/lib/graphql/static_validation/definition_dependencies.rb +28 -14
  223. data/lib/graphql/static_validation/error.rb +3 -1
  224. data/lib/graphql/static_validation/literal_validator.rb +71 -28
  225. data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +46 -79
  226. data/lib/graphql/static_validation/rules/argument_literals_are_compatible_error.rb +23 -6
  227. data/lib/graphql/static_validation/rules/arguments_are_defined.rb +35 -26
  228. data/lib/graphql/static_validation/rules/arguments_are_defined_error.rb +4 -2
  229. data/lib/graphql/static_validation/rules/directives_are_defined.rb +12 -6
  230. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +14 -14
  231. data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +4 -4
  232. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +15 -7
  233. data/lib/graphql/static_validation/rules/fields_will_merge.rb +107 -57
  234. data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +25 -4
  235. data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +3 -3
  236. data/lib/graphql/static_validation/rules/fragments_are_finite.rb +2 -2
  237. data/lib/graphql/static_validation/rules/input_object_names_are_unique.rb +30 -0
  238. data/lib/graphql/static_validation/rules/input_object_names_are_unique_error.rb +30 -0
  239. data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid.rb +66 -0
  240. data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid_error.rb +29 -0
  241. data/lib/graphql/static_validation/rules/query_root_exists.rb +17 -0
  242. data/lib/graphql/static_validation/rules/query_root_exists_error.rb +26 -0
  243. data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +6 -4
  244. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +22 -10
  245. data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +13 -7
  246. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +12 -13
  247. data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +19 -14
  248. data/lib/graphql/static_validation/rules/variables_are_input_types.rb +1 -1
  249. data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +5 -3
  250. data/lib/graphql/static_validation/validation_context.rb +17 -7
  251. data/lib/graphql/static_validation/validation_timeout_error.rb +25 -0
  252. data/lib/graphql/static_validation/validator.rb +32 -20
  253. data/lib/graphql/static_validation.rb +1 -3
  254. data/lib/graphql/string_encoding_error.rb +13 -3
  255. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +134 -24
  256. data/lib/graphql/subscriptions/broadcast_analyzer.rb +81 -0
  257. data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +58 -0
  258. data/lib/graphql/subscriptions/event.rb +90 -27
  259. data/lib/graphql/subscriptions/instrumentation.rb +0 -47
  260. data/lib/graphql/subscriptions/serialize.rb +53 -6
  261. data/lib/graphql/subscriptions.rb +147 -62
  262. data/lib/graphql/tracing/active_support_notifications_trace.rb +16 -0
  263. data/lib/graphql/tracing/active_support_notifications_tracing.rb +8 -17
  264. data/lib/graphql/tracing/appoptics_trace.rb +251 -0
  265. data/lib/graphql/tracing/appoptics_tracing.rb +173 -0
  266. data/lib/graphql/tracing/appsignal_trace.rb +77 -0
  267. data/lib/graphql/tracing/appsignal_tracing.rb +23 -0
  268. data/lib/graphql/tracing/data_dog_trace.rb +196 -0
  269. data/lib/graphql/tracing/data_dog_tracing.rb +53 -2
  270. data/lib/graphql/tracing/legacy_trace.rb +69 -0
  271. data/lib/graphql/tracing/new_relic_trace.rb +75 -0
  272. data/lib/graphql/tracing/new_relic_tracing.rb +9 -12
  273. data/lib/graphql/tracing/notifications_trace.rb +45 -0
  274. data/lib/graphql/tracing/notifications_tracing.rb +59 -0
  275. data/lib/graphql/tracing/platform_trace.rb +118 -0
  276. data/lib/graphql/tracing/platform_tracing.rb +77 -31
  277. data/lib/graphql/tracing/prometheus_trace.rb +89 -0
  278. data/lib/graphql/tracing/prometheus_tracing/graphql_collector.rb +5 -2
  279. data/lib/graphql/tracing/prometheus_tracing.rb +11 -3
  280. data/lib/graphql/tracing/scout_trace.rb +72 -0
  281. data/lib/graphql/tracing/scout_tracing.rb +19 -0
  282. data/lib/graphql/tracing/statsd_trace.rb +56 -0
  283. data/lib/graphql/tracing/statsd_tracing.rb +42 -0
  284. data/lib/graphql/tracing/trace.rb +75 -0
  285. data/lib/graphql/tracing.rb +24 -67
  286. data/lib/graphql/type_kinds.rb +6 -3
  287. data/lib/graphql/types/big_int.rb +23 -0
  288. data/lib/graphql/types/int.rb +11 -3
  289. data/lib/graphql/types/iso_8601_date.rb +45 -0
  290. data/lib/graphql/types/iso_8601_date_time.rb +36 -8
  291. data/lib/graphql/types/json.rb +25 -0
  292. data/lib/graphql/types/relay/base_connection.rb +18 -90
  293. data/lib/graphql/types/relay/base_edge.rb +2 -36
  294. data/lib/graphql/types/relay/connection_behaviors.rb +193 -0
  295. data/lib/graphql/types/relay/edge_behaviors.rb +82 -0
  296. data/lib/graphql/types/relay/has_node_field.rb +41 -0
  297. data/lib/graphql/types/relay/has_nodes_field.rb +41 -0
  298. data/lib/graphql/types/relay/node.rb +2 -4
  299. data/lib/graphql/types/relay/node_behaviors.rb +25 -0
  300. data/lib/graphql/types/relay/page_info.rb +2 -14
  301. data/lib/graphql/types/relay/page_info_behaviors.rb +30 -0
  302. data/lib/graphql/types/relay.rb +10 -5
  303. data/lib/graphql/types/string.rb +8 -2
  304. data/lib/graphql/types.rb +3 -0
  305. data/lib/graphql/unauthorized_error.rb +3 -3
  306. data/lib/graphql/unauthorized_field_error.rb +1 -1
  307. data/lib/graphql/unresolved_type_error.rb +2 -2
  308. data/lib/graphql/version.rb +1 -1
  309. data/lib/graphql.rb +68 -54
  310. data/readme.md +4 -7
  311. metadata +150 -822
  312. data/lib/graphql/analysis/analyze_query.rb +0 -91
  313. data/lib/graphql/analysis/field_usage.rb +0 -45
  314. data/lib/graphql/analysis/max_query_complexity.rb +0 -26
  315. data/lib/graphql/analysis/max_query_depth.rb +0 -26
  316. data/lib/graphql/analysis/query_complexity.rb +0 -88
  317. data/lib/graphql/analysis/query_depth.rb +0 -56
  318. data/lib/graphql/analysis/reducer_state.rb +0 -48
  319. data/lib/graphql/argument.rb +0 -153
  320. data/lib/graphql/authorization.rb +0 -82
  321. data/lib/graphql/backwards_compatibility.rb +0 -60
  322. data/lib/graphql/base_type.rb +0 -226
  323. data/lib/graphql/boolean_type.rb +0 -2
  324. data/lib/graphql/compatibility/execution_specification/counter_schema.rb +0 -53
  325. data/lib/graphql/compatibility/execution_specification/specification_schema.rb +0 -200
  326. data/lib/graphql/compatibility/execution_specification.rb +0 -435
  327. data/lib/graphql/compatibility/lazy_execution_specification/lazy_schema.rb +0 -111
  328. data/lib/graphql/compatibility/lazy_execution_specification.rb +0 -213
  329. data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +0 -91
  330. data/lib/graphql/compatibility/query_parser_specification/query_assertions.rb +0 -79
  331. data/lib/graphql/compatibility/query_parser_specification.rb +0 -264
  332. data/lib/graphql/compatibility/schema_parser_specification.rb +0 -680
  333. data/lib/graphql/compatibility.rb +0 -5
  334. data/lib/graphql/define/assign_argument.rb +0 -12
  335. data/lib/graphql/define/assign_connection.rb +0 -13
  336. data/lib/graphql/define/assign_enum_value.rb +0 -18
  337. data/lib/graphql/define/assign_global_id_field.rb +0 -11
  338. data/lib/graphql/define/assign_mutation_function.rb +0 -34
  339. data/lib/graphql/define/assign_object_field.rb +0 -42
  340. data/lib/graphql/define/defined_object_proxy.rb +0 -50
  341. data/lib/graphql/define/instance_definable.rb +0 -300
  342. data/lib/graphql/define/no_definition_error.rb +0 -7
  343. data/lib/graphql/define/non_null_with_bang.rb +0 -16
  344. data/lib/graphql/define/type_definer.rb +0 -31
  345. data/lib/graphql/define.rb +0 -31
  346. data/lib/graphql/deprecated_dsl.rb +0 -42
  347. data/lib/graphql/directive/deprecated_directive.rb +0 -13
  348. data/lib/graphql/directive/include_directive.rb +0 -2
  349. data/lib/graphql/directive/skip_directive.rb +0 -2
  350. data/lib/graphql/directive.rb +0 -104
  351. data/lib/graphql/enum_type.rb +0 -193
  352. data/lib/graphql/execution/execute.rb +0 -319
  353. data/lib/graphql/execution/flatten.rb +0 -40
  354. data/lib/graphql/execution/instrumentation.rb +0 -92
  355. data/lib/graphql/execution/interpreter/hash_response.rb +0 -46
  356. data/lib/graphql/execution/lazy/resolve.rb +0 -91
  357. data/lib/graphql/execution/typecast.rb +0 -50
  358. data/lib/graphql/field/resolve.rb +0 -59
  359. data/lib/graphql/field.rb +0 -330
  360. data/lib/graphql/filter.rb +0 -53
  361. data/lib/graphql/float_type.rb +0 -2
  362. data/lib/graphql/function.rb +0 -153
  363. data/lib/graphql/id_type.rb +0 -2
  364. data/lib/graphql/input_object_type.rb +0 -153
  365. data/lib/graphql/int_type.rb +0 -2
  366. data/lib/graphql/interface_type.rb +0 -86
  367. data/lib/graphql/internal_representation/document.rb +0 -27
  368. data/lib/graphql/internal_representation/node.rb +0 -206
  369. data/lib/graphql/internal_representation/print.rb +0 -51
  370. data/lib/graphql/internal_representation/rewrite.rb +0 -184
  371. data/lib/graphql/internal_representation/scope.rb +0 -88
  372. data/lib/graphql/internal_representation/visit.rb +0 -36
  373. data/lib/graphql/internal_representation.rb +0 -7
  374. data/lib/graphql/language/lexer.rl +0 -236
  375. data/lib/graphql/list_type.rb +0 -80
  376. data/lib/graphql/literal_validation_error.rb +0 -6
  377. data/lib/graphql/non_null_type.rb +0 -81
  378. data/lib/graphql/object_type.rb +0 -141
  379. data/lib/graphql/query/arguments.rb +0 -179
  380. data/lib/graphql/query/arguments_cache.rb +0 -25
  381. data/lib/graphql/query/executor.rb +0 -53
  382. data/lib/graphql/query/literal_input.rb +0 -115
  383. data/lib/graphql/query/serial_execution/field_resolution.rb +0 -92
  384. data/lib/graphql/query/serial_execution/operation_resolution.rb +0 -19
  385. data/lib/graphql/query/serial_execution/selection_resolution.rb +0 -23
  386. data/lib/graphql/query/serial_execution/value_resolution.rb +0 -87
  387. data/lib/graphql/query/serial_execution.rb +0 -39
  388. data/lib/graphql/relay/array_connection.rb +0 -85
  389. data/lib/graphql/relay/base_connection.rb +0 -172
  390. data/lib/graphql/relay/connection_instrumentation.rb +0 -54
  391. data/lib/graphql/relay/connection_resolve.rb +0 -43
  392. data/lib/graphql/relay/connection_type.rb +0 -40
  393. data/lib/graphql/relay/edge.rb +0 -27
  394. data/lib/graphql/relay/edge_type.rb +0 -18
  395. data/lib/graphql/relay/edges_instrumentation.rb +0 -40
  396. data/lib/graphql/relay/global_id_resolve.rb +0 -18
  397. data/lib/graphql/relay/mongo_relation_connection.rb +0 -50
  398. data/lib/graphql/relay/mutation/instrumentation.rb +0 -23
  399. data/lib/graphql/relay/mutation/resolve.rb +0 -56
  400. data/lib/graphql/relay/mutation/result.rb +0 -38
  401. data/lib/graphql/relay/mutation.rb +0 -190
  402. data/lib/graphql/relay/node.rb +0 -36
  403. data/lib/graphql/relay/page_info.rb +0 -7
  404. data/lib/graphql/relay/relation_connection.rb +0 -186
  405. data/lib/graphql/relay/type_extensions.rb +0 -30
  406. data/lib/graphql/scalar_type.rb +0 -135
  407. data/lib/graphql/schema/catchall_middleware.rb +0 -35
  408. data/lib/graphql/schema/default_parse_error.rb +0 -10
  409. data/lib/graphql/schema/default_type_error.rb +0 -15
  410. data/lib/graphql/schema/member/accepts_definition.rb +0 -152
  411. data/lib/graphql/schema/member/cached_graphql_definition.rb +0 -26
  412. data/lib/graphql/schema/member/instrumentation.rb +0 -121
  413. data/lib/graphql/schema/middleware_chain.rb +0 -82
  414. data/lib/graphql/schema/possible_types.rb +0 -39
  415. data/lib/graphql/schema/rescue_middleware.rb +0 -55
  416. data/lib/graphql/schema/timeout_middleware.rb +0 -85
  417. data/lib/graphql/schema/traversal.rb +0 -228
  418. data/lib/graphql/schema/validation.rb +0 -286
  419. data/lib/graphql/static_validation/default_visitor.rb +0 -15
  420. data/lib/graphql/static_validation/no_validate_visitor.rb +0 -10
  421. data/lib/graphql/static_validation/type_stack.rb +0 -216
  422. data/lib/graphql/string_type.rb +0 -2
  423. data/lib/graphql/subscriptions/subscription_root.rb +0 -66
  424. data/lib/graphql/tracing/skylight_tracing.rb +0 -61
  425. data/lib/graphql/types/relay/base_field.rb +0 -22
  426. data/lib/graphql/types/relay/base_interface.rb +0 -29
  427. data/lib/graphql/types/relay/base_object.rb +0 -26
  428. data/lib/graphql/types/relay/node_field.rb +0 -43
  429. data/lib/graphql/types/relay/nodes_field.rb +0 -45
  430. data/lib/graphql/union_type.rb +0 -100
  431. data/lib/graphql/upgrader/member.rb +0 -899
  432. data/lib/graphql/upgrader/schema.rb +0 -37
  433. data/spec/dummy/Gemfile +0 -12
  434. data/spec/dummy/Gemfile.lock +0 -157
  435. data/spec/dummy/README.md +0 -24
  436. data/spec/dummy/Rakefile +0 -7
  437. data/spec/dummy/app/assets/config/manifest.js +0 -1
  438. data/spec/dummy/app/assets/javascripts/application.js +0 -66
  439. data/spec/dummy/app/channels/application_cable/channel.rb +0 -5
  440. data/spec/dummy/app/channels/application_cable/connection.rb +0 -5
  441. data/spec/dummy/app/channels/graphql_channel.rb +0 -116
  442. data/spec/dummy/app/controllers/application_controller.rb +0 -4
  443. data/spec/dummy/app/controllers/pages_controller.rb +0 -5
  444. data/spec/dummy/app/helpers/application_helper.rb +0 -3
  445. data/spec/dummy/app/jobs/application_job.rb +0 -3
  446. data/spec/dummy/app/views/layouts/application.html.erb +0 -12
  447. data/spec/dummy/app/views/pages/show.html +0 -16
  448. data/spec/dummy/bin/bundle +0 -4
  449. data/spec/dummy/bin/rails +0 -5
  450. data/spec/dummy/bin/rake +0 -5
  451. data/spec/dummy/bin/setup +0 -31
  452. data/spec/dummy/bin/update +0 -27
  453. data/spec/dummy/bin/yarn +0 -12
  454. data/spec/dummy/config/application.rb +0 -30
  455. data/spec/dummy/config/boot.rb +0 -4
  456. data/spec/dummy/config/cable.yml +0 -10
  457. data/spec/dummy/config/environment.rb +0 -6
  458. data/spec/dummy/config/environments/development.rb +0 -40
  459. data/spec/dummy/config/environments/production.rb +0 -76
  460. data/spec/dummy/config/environments/test.rb +0 -37
  461. data/spec/dummy/config/initializers/application_controller_renderer.rb +0 -9
  462. data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -8
  463. data/spec/dummy/config/initializers/cookies_serializer.rb +0 -6
  464. data/spec/dummy/config/initializers/filter_parameter_logging.rb +0 -5
  465. data/spec/dummy/config/initializers/inflections.rb +0 -17
  466. data/spec/dummy/config/initializers/mime_types.rb +0 -5
  467. data/spec/dummy/config/initializers/wrap_parameters.rb +0 -10
  468. data/spec/dummy/config/locales/en.yml +0 -33
  469. data/spec/dummy/config/puma.rb +0 -57
  470. data/spec/dummy/config/routes.rb +0 -4
  471. data/spec/dummy/config/secrets.yml +0 -32
  472. data/spec/dummy/config.ru +0 -6
  473. data/spec/dummy/log/test.log +0 -199
  474. data/spec/dummy/package.json +0 -5
  475. data/spec/dummy/public/404.html +0 -67
  476. data/spec/dummy/public/422.html +0 -67
  477. data/spec/dummy/public/500.html +0 -66
  478. data/spec/dummy/public/apple-touch-icon-precomposed.png +0 -0
  479. data/spec/dummy/public/apple-touch-icon.png +0 -0
  480. data/spec/dummy/public/favicon.ico +0 -0
  481. data/spec/dummy/public/robots.txt +0 -1
  482. data/spec/dummy/test/application_system_test_case.rb +0 -6
  483. data/spec/dummy/test/system/action_cable_subscription_test.rb +0 -45
  484. data/spec/dummy/test/test_helper.rb +0 -4
  485. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/4w/4wzXRZrAkwKdgYaSE0pid5eB-fer8vSfSku_NPg4rMA.cache +0 -0
  486. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/7I/7IHVBiJT06QSpgLpLoJIxboQ0B-D_tMTxsvoezBTV3Q.cache +0 -1
  487. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/8w/8wY_SKagj8wHuwGNAAf6JnQ8joMbC6cEYpHrTAI8Urc.cache +0 -1
  488. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/AK/AKzz1u6bGb4auXcrObA_g5LL-oV0ejNGa448AgAi_WQ.cache +0 -1
  489. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ET/ETW4uxvaYpruL8y6_ZptUH82ZowMaHIqvg5WexBFdEM.cache +0 -3
  490. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/F1/F1TWpjjyA56k9Z90n5B3xRn7DUdGjX73QCkYC6k07JQ.cache +0 -0
  491. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/F8/F8MUNRzORGFgr329fNM0xLaoWCXdv3BIalT7dsvLfjs.cache +0 -2
  492. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/KB/KB07ZaKNC5uXJ7TjLi-WqnY6g7dq8wWp_8N3HNjBNxg.cache +0 -2
  493. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ms/MsKSimH_UCB-H1tLvDABDHuvGciuoW6kVqQWDrXU5FQ.cache +0 -0
  494. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Mt/Mtci-Kim50aPOmeClD4AIicKn1d1WJ0n454IjSd94sk.cache +0 -0
  495. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/QH/QHt3Tc1Y6M66Oo_pDuMyWrQNs4Pp3SMeZR5K1wJj2Ts.cache +0 -1
  496. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/XU/XU4k1OXnfMils5SrirorPvDSyDSqiOWLZNtmAH1HH8k.cache +0 -0
  497. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ZI/ZIof7mZxWWCnraIFOCuV6a8QRWzKJXJnx2Xd7C0ZyX0.cache +0 -1
  498. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/cG/cGc_puuPS5pZKgUcy1Y_i1L6jl5UtsiIrMH59rTzR6c.cache +0 -3
  499. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/df/dfro_B6bx3KP1Go-7jEOqqZ2j4hVRseXIc3es9PKQno.cache +0 -1
  500. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/jO/jO1DfbqnG0mTULsjJJANc3fefrG2zt7DIMmcptMT628.cache +0 -1
  501. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/pE/pE7gO6pQ-z187Swb4hT554wmqsq-cNzgPWLrCz-LQQQ.cache +0 -0
  502. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/r9/r9iU1l58a6rxkZSW5RSC52_tD-_UQuHxoMVnkfJ7Mhs.cache +0 -1
  503. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/xi/xitPPFfPIyDMpaznV0sBBcw8eSCV8PJcLLWin78sCgE.cache +0 -0
  504. data/spec/dummy/tmp/screenshots/failures_test_it_handles_subscriptions.png +0 -0
  505. data/spec/fixtures/upgrader/account.original.rb +0 -19
  506. data/spec/fixtures/upgrader/account.transformed.rb +0 -20
  507. data/spec/fixtures/upgrader/blame_range.original.rb +0 -43
  508. data/spec/fixtures/upgrader/blame_range.transformed.rb +0 -30
  509. data/spec/fixtures/upgrader/date_time.original.rb +0 -24
  510. data/spec/fixtures/upgrader/date_time.transformed.rb +0 -23
  511. data/spec/fixtures/upgrader/delete_project.original.rb +0 -28
  512. data/spec/fixtures/upgrader/delete_project.transformed.rb +0 -27
  513. data/spec/fixtures/upgrader/gist_order_field.original.rb +0 -14
  514. data/spec/fixtures/upgrader/gist_order_field.transformed.rb +0 -13
  515. data/spec/fixtures/upgrader/increment_count.original.rb +0 -59
  516. data/spec/fixtures/upgrader/increment_count.transformed.rb +0 -50
  517. data/spec/fixtures/upgrader/photo.original.rb +0 -10
  518. data/spec/fixtures/upgrader/photo.transformed.rb +0 -12
  519. data/spec/fixtures/upgrader/release_order.original.rb +0 -15
  520. data/spec/fixtures/upgrader/release_order.transformed.rb +0 -14
  521. data/spec/fixtures/upgrader/starrable.original.rb +0 -49
  522. data/spec/fixtures/upgrader/starrable.transformed.rb +0 -46
  523. data/spec/fixtures/upgrader/subscribable.original.rb +0 -55
  524. data/spec/fixtures/upgrader/subscribable.transformed.rb +0 -51
  525. data/spec/fixtures/upgrader/type_x.original.rb +0 -65
  526. data/spec/fixtures/upgrader/type_x.transformed.rb +0 -56
  527. data/spec/graphql/analysis/analyze_query_spec.rb +0 -272
  528. data/spec/graphql/analysis/ast/field_usage_spec.rb +0 -51
  529. data/spec/graphql/analysis/ast/max_query_complexity_spec.rb +0 -120
  530. data/spec/graphql/analysis/ast/max_query_depth_spec.rb +0 -114
  531. data/spec/graphql/analysis/ast/query_complexity_spec.rb +0 -299
  532. data/spec/graphql/analysis/ast/query_depth_spec.rb +0 -108
  533. data/spec/graphql/analysis/ast_spec.rb +0 -269
  534. data/spec/graphql/analysis/field_usage_spec.rb +0 -62
  535. data/spec/graphql/analysis/max_query_complexity_spec.rb +0 -102
  536. data/spec/graphql/analysis/max_query_depth_spec.rb +0 -101
  537. data/spec/graphql/analysis/query_complexity_spec.rb +0 -301
  538. data/spec/graphql/analysis/query_depth_spec.rb +0 -81
  539. data/spec/graphql/argument_spec.rb +0 -159
  540. data/spec/graphql/authorization_spec.rb +0 -901
  541. data/spec/graphql/backtrace_spec.rb +0 -206
  542. data/spec/graphql/base_type_spec.rb +0 -171
  543. data/spec/graphql/boolean_type_spec.rb +0 -21
  544. data/spec/graphql/compatibility/execution_specification_spec.rb +0 -4
  545. data/spec/graphql/compatibility/lazy_execution_specification_spec.rb +0 -4
  546. data/spec/graphql/compatibility/query_parser_specification_spec.rb +0 -6
  547. data/spec/graphql/compatibility/schema_parser_specification_spec.rb +0 -6
  548. data/spec/graphql/define/assign_argument_spec.rb +0 -61
  549. data/spec/graphql/define/instance_definable_spec.rb +0 -203
  550. data/spec/graphql/directive/skip_directive_spec.rb +0 -9
  551. data/spec/graphql/directive_spec.rb +0 -295
  552. data/spec/graphql/enum_type_spec.rb +0 -158
  553. data/spec/graphql/execution/execute_spec.rb +0 -303
  554. data/spec/graphql/execution/instrumentation_spec.rb +0 -184
  555. data/spec/graphql/execution/interpreter_spec.rb +0 -485
  556. data/spec/graphql/execution/lazy/lazy_method_map_spec.rb +0 -57
  557. data/spec/graphql/execution/lazy_spec.rb +0 -240
  558. data/spec/graphql/execution/lookahead_spec.rb +0 -363
  559. data/spec/graphql/execution/multiplex_spec.rb +0 -211
  560. data/spec/graphql/execution/typecast_spec.rb +0 -47
  561. data/spec/graphql/execution_error_spec.rb +0 -325
  562. data/spec/graphql/field_spec.rb +0 -246
  563. data/spec/graphql/float_type_spec.rb +0 -16
  564. data/spec/graphql/function_spec.rb +0 -129
  565. data/spec/graphql/id_type_spec.rb +0 -33
  566. data/spec/graphql/input_object_type_spec.rb +0 -25
  567. data/spec/graphql/int_type_spec.rb +0 -35
  568. data/spec/graphql/interface_type_spec.rb +0 -196
  569. data/spec/graphql/internal_representation/print_spec.rb +0 -41
  570. data/spec/graphql/internal_representation/rewrite_spec.rb +0 -376
  571. data/spec/graphql/introspection/directive_type_spec.rb +0 -61
  572. data/spec/graphql/introspection/input_value_type_spec.rb +0 -105
  573. data/spec/graphql/introspection/introspection_query_spec.rb +0 -59
  574. data/spec/graphql/introspection/schema_type_spec.rb +0 -56
  575. data/spec/graphql/introspection/type_type_spec.rb +0 -155
  576. data/spec/graphql/language/block_string_spec.rb +0 -70
  577. data/spec/graphql/language/definition_slice_spec.rb +0 -226
  578. data/spec/graphql/language/document_from_schema_definition_spec.rb +0 -770
  579. data/spec/graphql/language/equality_spec.rb +0 -84
  580. data/spec/graphql/language/generation_spec.rb +0 -38
  581. data/spec/graphql/language/lexer_spec.rb +0 -135
  582. data/spec/graphql/language/nodes_spec.rb +0 -67
  583. data/spec/graphql/language/parser_spec.rb +0 -175
  584. data/spec/graphql/language/printer_spec.rb +0 -215
  585. data/spec/graphql/language/visitor_spec.rb +0 -400
  586. data/spec/graphql/list_type_spec.rb +0 -57
  587. data/spec/graphql/non_null_type_spec.rb +0 -48
  588. data/spec/graphql/object_type_spec.rb +0 -197
  589. data/spec/graphql/query/arguments_spec.rb +0 -346
  590. data/spec/graphql/query/context_spec.rb +0 -292
  591. data/spec/graphql/query/executor_spec.rb +0 -314
  592. data/spec/graphql/query/literal_input_spec.rb +0 -91
  593. data/spec/graphql/query/result_spec.rb +0 -29
  594. data/spec/graphql/query/serial_execution/value_resolution_spec.rb +0 -109
  595. data/spec/graphql/query_spec.rb +0 -800
  596. data/spec/graphql/rake_task_spec.rb +0 -59
  597. data/spec/graphql/scalar_type_spec.rb +0 -66
  598. data/spec/graphql/schema/argument_spec.rb +0 -127
  599. data/spec/graphql/schema/build_from_definition_spec.rb +0 -1187
  600. data/spec/graphql/schema/catchall_middleware_spec.rb +0 -35
  601. data/spec/graphql/schema/directive/feature_spec.rb +0 -81
  602. data/spec/graphql/schema/directive/transform_spec.rb +0 -39
  603. data/spec/graphql/schema/enum_spec.rb +0 -83
  604. data/spec/graphql/schema/enum_value_spec.rb +0 -24
  605. data/spec/graphql/schema/field_extension_spec.rb +0 -115
  606. data/spec/graphql/schema/field_spec.rb +0 -301
  607. data/spec/graphql/schema/finder_spec.rb +0 -135
  608. data/spec/graphql/schema/input_object_spec.rb +0 -238
  609. data/spec/graphql/schema/instrumentation_spec.rb +0 -43
  610. data/spec/graphql/schema/interface_spec.rb +0 -215
  611. data/spec/graphql/schema/introspection_system_spec.rb +0 -47
  612. data/spec/graphql/schema/list_spec.rb +0 -46
  613. data/spec/graphql/schema/loader_spec.rb +0 -286
  614. data/spec/graphql/schema/member/accepts_definition_spec.rb +0 -115
  615. data/spec/graphql/schema/member/build_type_spec.rb +0 -63
  616. data/spec/graphql/schema/member/scoped_spec.rb +0 -177
  617. data/spec/graphql/schema/member/type_system_helpers_spec.rb +0 -63
  618. data/spec/graphql/schema/middleware_chain_spec.rb +0 -57
  619. data/spec/graphql/schema/mutation_spec.rb +0 -150
  620. data/spec/graphql/schema/non_null_spec.rb +0 -46
  621. data/spec/graphql/schema/object_spec.rb +0 -244
  622. data/spec/graphql/schema/printer_spec.rb +0 -869
  623. data/spec/graphql/schema/relay_classic_mutation_spec.rb +0 -234
  624. data/spec/graphql/schema/rescue_middleware_spec.rb +0 -74
  625. data/spec/graphql/schema/resolver_spec.rb +0 -640
  626. data/spec/graphql/schema/scalar_spec.rb +0 -101
  627. data/spec/graphql/schema/subscription_spec.rb +0 -416
  628. data/spec/graphql/schema/timeout_middleware_spec.rb +0 -188
  629. data/spec/graphql/schema/traversal_spec.rb +0 -222
  630. data/spec/graphql/schema/type_expression_spec.rb +0 -39
  631. data/spec/graphql/schema/union_spec.rb +0 -72
  632. data/spec/graphql/schema/unique_within_type_spec.rb +0 -44
  633. data/spec/graphql/schema/validation_spec.rb +0 -355
  634. data/spec/graphql/schema/warden_spec.rb +0 -926
  635. data/spec/graphql/static_validation/rules/argument_literals_are_compatible_spec.rb +0 -413
  636. data/spec/graphql/static_validation/rules/argument_names_are_unique_spec.rb +0 -44
  637. data/spec/graphql/static_validation/rules/arguments_are_defined_spec.rb +0 -112
  638. data/spec/graphql/static_validation/rules/directives_are_defined_spec.rb +0 -35
  639. data/spec/graphql/static_validation/rules/directives_are_in_valid_locations_spec.rb +0 -42
  640. data/spec/graphql/static_validation/rules/fields_are_defined_on_type_spec.rb +0 -167
  641. data/spec/graphql/static_validation/rules/fields_have_appropriate_selections_spec.rb +0 -66
  642. data/spec/graphql/static_validation/rules/fields_will_merge_spec.rb +0 -740
  643. data/spec/graphql/static_validation/rules/fragment_names_are_unique_spec.rb +0 -28
  644. data/spec/graphql/static_validation/rules/fragment_spreads_are_possible_spec.rb +0 -52
  645. data/spec/graphql/static_validation/rules/fragment_types_exist_spec.rb +0 -42
  646. data/spec/graphql/static_validation/rules/fragments_are_finite_spec.rb +0 -123
  647. data/spec/graphql/static_validation/rules/fragments_are_named_spec.rb +0 -24
  648. data/spec/graphql/static_validation/rules/fragments_are_on_composite_types_spec.rb +0 -56
  649. data/spec/graphql/static_validation/rules/fragments_are_used_spec.rb +0 -61
  650. data/spec/graphql/static_validation/rules/mutation_root_exists_spec.rb +0 -39
  651. data/spec/graphql/static_validation/rules/no_definitions_are_present_spec.rb +0 -62
  652. data/spec/graphql/static_validation/rules/operation_names_are_valid_spec.rb +0 -82
  653. data/spec/graphql/static_validation/rules/required_arguments_are_present_spec.rb +0 -73
  654. data/spec/graphql/static_validation/rules/required_input_object_attributes_are_present_spec.rb +0 -58
  655. data/spec/graphql/static_validation/rules/subscription_root_exists_spec.rb +0 -34
  656. data/spec/graphql/static_validation/rules/unique_directives_per_location_spec.rb +0 -188
  657. data/spec/graphql/static_validation/rules/variable_default_values_are_correctly_typed_spec.rb +0 -196
  658. data/spec/graphql/static_validation/rules/variable_names_are_unique_spec.rb +0 -23
  659. data/spec/graphql/static_validation/rules/variable_usages_are_allowed_spec.rb +0 -236
  660. data/spec/graphql/static_validation/rules/variables_are_input_types_spec.rb +0 -78
  661. data/spec/graphql/static_validation/rules/variables_are_used_and_defined_spec.rb +0 -81
  662. data/spec/graphql/static_validation/type_stack_spec.rb +0 -29
  663. data/spec/graphql/static_validation/validator_spec.rb +0 -204
  664. data/spec/graphql/string_type_spec.rb +0 -80
  665. data/spec/graphql/subscriptions/serialize_spec.rb +0 -49
  666. data/spec/graphql/subscriptions_spec.rb +0 -502
  667. data/spec/graphql/tracing/new_relic_tracing_spec.rb +0 -63
  668. data/spec/graphql/tracing/platform_tracing_spec.rb +0 -137
  669. data/spec/graphql/tracing/prometheus_tracing_spec.rb +0 -42
  670. data/spec/graphql/tracing/scout_tracing_spec.rb +0 -17
  671. data/spec/graphql/tracing/skylight_tracing_spec.rb +0 -63
  672. data/spec/graphql/tracing_spec.rb +0 -52
  673. data/spec/graphql/types/iso_8601_date_time_spec.rb +0 -137
  674. data/spec/graphql/union_type_spec.rb +0 -211
  675. data/spec/graphql/upgrader/member_spec.rb +0 -583
  676. data/spec/graphql/upgrader/schema_spec.rb +0 -82
  677. data/spec/integration/mongoid/graphql/relay/mongo_relation_connection_spec.rb +0 -528
  678. data/spec/integration/mongoid/spec_helper.rb +0 -2
  679. data/spec/integration/mongoid/star_trek/data.rb +0 -126
  680. data/spec/integration/mongoid/star_trek/schema.rb +0 -425
  681. data/spec/integration/rails/data.rb +0 -110
  682. data/spec/integration/rails/generators/base_generator_test.rb +0 -7
  683. data/spec/integration/rails/generators/graphql/enum_generator_spec.rb +0 -30
  684. data/spec/integration/rails/generators/graphql/install_generator_spec.rb +0 -218
  685. data/spec/integration/rails/generators/graphql/interface_generator_spec.rb +0 -34
  686. data/spec/integration/rails/generators/graphql/loader_generator_spec.rb +0 -59
  687. data/spec/integration/rails/generators/graphql/mutation_generator_spec.rb +0 -71
  688. data/spec/integration/rails/generators/graphql/object_generator_spec.rb +0 -54
  689. data/spec/integration/rails/generators/graphql/scalar_generator_spec.rb +0 -28
  690. data/spec/integration/rails/generators/graphql/union_generator_spec.rb +0 -67
  691. data/spec/integration/rails/graphql/input_object_type_spec.rb +0 -364
  692. data/spec/integration/rails/graphql/query/variables_spec.rb +0 -375
  693. data/spec/integration/rails/graphql/relay/array_connection_spec.rb +0 -290
  694. data/spec/integration/rails/graphql/relay/base_connection_spec.rb +0 -101
  695. data/spec/integration/rails/graphql/relay/connection_instrumentation_spec.rb +0 -80
  696. data/spec/integration/rails/graphql/relay/connection_resolve_spec.rb +0 -79
  697. data/spec/integration/rails/graphql/relay/connection_type_spec.rb +0 -106
  698. data/spec/integration/rails/graphql/relay/edge_spec.rb +0 -10
  699. data/spec/integration/rails/graphql/relay/mutation_spec.rb +0 -387
  700. data/spec/integration/rails/graphql/relay/node_spec.rb +0 -263
  701. data/spec/integration/rails/graphql/relay/page_info_spec.rb +0 -111
  702. data/spec/integration/rails/graphql/relay/range_add_spec.rb +0 -117
  703. data/spec/integration/rails/graphql/relay/relation_connection_spec.rb +0 -837
  704. data/spec/integration/rails/graphql/schema_spec.rb +0 -476
  705. data/spec/integration/rails/graphql/tracing/active_support_notifications_tracing_spec.rb +0 -62
  706. data/spec/integration/rails/spec_helper.rb +0 -25
  707. data/spec/integration/tmp/app/graphql/types/family_type.rb +0 -9
  708. data/spec/spec_helper.rb +0 -116
  709. data/spec/support/dummy/data.rb +0 -45
  710. data/spec/support/dummy/schema.rb +0 -492
  711. data/spec/support/error_bubbling_helpers.rb +0 -23
  712. data/spec/support/global_id.rb +0 -23
  713. data/spec/support/jazz.rb +0 -759
  714. data/spec/support/lazy_helpers.rb +0 -192
  715. data/spec/support/magic_cards/schema.graphql +0 -33
  716. data/spec/support/minimum_input_object.rb +0 -21
  717. data/spec/support/new_relic.rb +0 -27
  718. data/spec/support/parser/filename_example.graphql +0 -5
  719. data/spec/support/parser/filename_example_error_1.graphql +0 -4
  720. data/spec/support/parser/filename_example_error_2.graphql +0 -5
  721. data/spec/support/skylight.rb +0 -39
  722. data/spec/support/star_wars/schema.rb +0 -465
  723. data/spec/support/static_validation_helpers.rb +0 -32
@@ -1,899 +0,0 @@
1
- # frozen_string_literal: true
2
- begin
3
- require 'parser/current'
4
- rescue LoadError
5
- raise LoadError, "GraphQL::Upgrader requires the 'parser' gem, please install it and/or add it to your Gemfile"
6
- end
7
-
8
- module GraphQL
9
- module Upgrader
10
- GRAPHQL_TYPES = '(Object|InputObject|Interface|Enum|Scalar|Union)'
11
-
12
- class Transform
13
- # @param input_text [String] Untransformed GraphQL-Ruby code
14
- # @return [String] The input text, with a transformation applied if necessary
15
- def apply(input_text)
16
- raise NotImplementedError, "Return transformed text here"
17
- end
18
-
19
- # Recursively transform a `.define`-DSL-based type expression into a class-ready expression, for example:
20
- #
21
- # - `types[X]` -> `[X, null: true]`
22
- # - `types[X.to_non_null_type]` -> `[X]`
23
- # - `Int` -> `Integer`
24
- # - `X!` -> `X`
25
- #
26
- # Notice that `!` is removed sometimes, because it doesn't exist in the class API.
27
- #
28
- # @param type_expr [String] A `.define`-ready expression of a return type or input type
29
- # @return [String] A class-ready expression of the same type`
30
- def normalize_type_expression(type_expr, preserve_bang: false)
31
- case type_expr
32
- when /\A!/
33
- # Handle the bang, normalize the inside
34
- "#{preserve_bang ? "!" : ""}#{normalize_type_expression(type_expr[1..-1], preserve_bang: preserve_bang)}"
35
- when /\Atypes\[.*\]\Z/
36
- # Unwrap the brackets, normalize, then re-wrap
37
- inner_type = type_expr[6..-2]
38
- if inner_type.start_with?("!")
39
- nullable = false
40
- inner_type = inner_type[1..-1]
41
- elsif inner_type.end_with?(".to_non_null_type")
42
- nullable = false
43
- inner_type = inner_type[0...-17]
44
- else
45
- nullable = true
46
- end
47
-
48
- "[#{normalize_type_expression(inner_type, preserve_bang: preserve_bang)}#{nullable ? ", null: true" : ""}]"
49
- when /\Atypes\./
50
- # Remove the prefix
51
- normalize_type_expression(type_expr[6..-1], preserve_bang: preserve_bang)
52
- when /\A->/
53
- # Remove the proc wrapper, don't re-apply it
54
- # because stabby is not supported in class-based definition
55
- # (and shouldn't ever be necessary)
56
- unwrapped = type_expr
57
- .sub(/\A->\s?\{\s*/, "")
58
- .sub(/\s*\}/, "")
59
- normalize_type_expression(unwrapped, preserve_bang: preserve_bang)
60
- when "Int"
61
- "Integer"
62
- else
63
- type_expr
64
- end
65
- end
66
-
67
- def underscorize(str)
68
- str
69
- .gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2') # URLDecoder -> URL_Decoder
70
- .gsub(/([a-z\d])([A-Z])/,'\1_\2') # someThing -> some_Thing
71
- .downcase
72
- end
73
-
74
- def apply_processor(input_text, processor)
75
- ruby_ast = Parser::CurrentRuby.parse(input_text)
76
- processor.process(ruby_ast)
77
- processor
78
- rescue Parser::SyntaxError
79
- puts "Error text:"
80
- puts input_text
81
- raise
82
- end
83
-
84
- def reindent_lines(input_text, from_indent:, to_indent:)
85
- prev_indent = " " * from_indent
86
- next_indent = " " * to_indent
87
- # For each line, remove the previous indent, then add the new indent
88
- lines = input_text.split("\n").map do |line|
89
- line = line.sub(prev_indent, "")
90
- "#{next_indent}#{line}".rstrip
91
- end
92
- lines.join("\n")
93
- end
94
-
95
- # Remove trailing whitespace
96
- def trim_lines(input_text)
97
- input_text.gsub(/ +$/, "")
98
- end
99
- end
100
-
101
- # Turns `{X} = GraphQL::{Y}Type.define do` into `class {X} < Types::Base{Y}`.
102
- class TypeDefineToClassTransform < Transform
103
- # @param base_class_pattern [String] Replacement pattern for the base class name. Use this if your base classes have nonstandard names.
104
- def initialize(base_class_pattern: "Types::Base\\3")
105
- @find_pattern = /( *)([a-zA-Z_0-9:]*) = GraphQL::#{GRAPHQL_TYPES}Type\.define do/
106
- @replace_pattern = "\\1class \\2 < #{base_class_pattern}"
107
- @interface_replace_pattern = "\\1module \\2\n\\1 include #{base_class_pattern}"
108
- end
109
-
110
- def apply(input_text)
111
- if input_text.include?("GraphQL::InterfaceType.define")
112
- input_text.sub(@find_pattern, @interface_replace_pattern)
113
- else
114
- input_text.sub(@find_pattern, @replace_pattern)
115
- end
116
- end
117
- end
118
-
119
- # Turns `{X} = GraphQL::Relay::Mutation.define do` into `class {X} < Mutations::BaseMutation`
120
- class MutationDefineToClassTransform < Transform
121
- # @param base_class_name [String] Replacement pattern for the base class name. Use this if your Mutation base class has a nonstandard name.
122
- def initialize(base_class_name: "Mutations::BaseMutation")
123
- @find_pattern = /([a-zA-Z_0-9:]*) = GraphQL::Relay::Mutation.define do/
124
- @replace_pattern = "class \\1 < #{base_class_name}"
125
- end
126
-
127
- def apply(input_text)
128
- input_text.sub(@find_pattern, @replace_pattern)
129
- end
130
- end
131
-
132
- # Remove `name "Something"` if it is redundant with the class name.
133
- # Or, if it is not redundant, move it to `graphql_name "Something"`.
134
- class NameTransform < Transform
135
- def apply(transformable)
136
- last_type_defn = transformable
137
- .split("\n")
138
- .select { |line| line.include?("class ") || line.include?("module ")}
139
- .last
140
-
141
- if last_type_defn && (matches = last_type_defn.match(/(class|module) (?<type_name>[a-zA-Z_0-9:]*)( <|$)/))
142
- type_name = matches[:type_name]
143
- # Get the name without any prefixes or suffixes
144
- type_name_without_the_type_part = type_name.split('::').last.gsub(/Type$/, '')
145
- # Find an overridden name value
146
- if matches = transformable.match(/ name ('|")(?<overridden_name>.*)('|")/)
147
- name = matches[:overridden_name]
148
- if type_name_without_the_type_part != name
149
- # If the overridden name is still required, use `graphql_name` for it
150
- transformable = transformable.sub(/ name (.*)/, ' graphql_name \1')
151
- else
152
- # Otherwise, remove it altogether
153
- transformable = transformable.sub(/\s+name ('|").*('|")/, '')
154
- end
155
- end
156
- end
157
-
158
- transformable
159
- end
160
- end
161
-
162
- # Remove newlines -- normalize the text for processing
163
- class RemoveNewlinesTransform
164
- def apply(input_text)
165
- keep_looking = true
166
- while keep_looking do
167
- keep_looking = false
168
- # Find the `field` call (or other method), and an open paren, but not a close paren, or a comma between arguments
169
- input_text = input_text.gsub(/(?<field>(?:field|input_field|return_field|connection|argument)(?:\([^)]*|.*,))\n\s*(?<next_line>.+)/) do
170
- keep_looking = true
171
- field = $~[:field].chomp
172
- next_line = $~[:next_line]
173
-
174
- "#{field} #{next_line}"
175
- end
176
- end
177
- input_text
178
- end
179
- end
180
-
181
- # Remove parens from method call - normalize for processing
182
- class RemoveMethodParensTransform < Transform
183
- def apply(input_text)
184
- input_text.sub(
185
- /(field|input_field|return_field|connection|argument)\( *(.*?) *\)( *)/,
186
- '\1 \2\3'
187
- )
188
- end
189
- end
190
-
191
- # Move `type X` to be the second positional argument to `field ...`
192
- class PositionalTypeArgTransform < Transform
193
- def apply(input_text)
194
- input_text.gsub(
195
- /(?<field>(?:field|input_field|return_field|connection|argument) :(?:[a-zA-Z_0-9]*)) do(?<block_contents>.*?)[ ]*type (?<return_type>.*?)\n/m
196
- ) do
197
- field = $~[:field]
198
- block_contents = $~[:block_contents]
199
- return_type = normalize_type_expression($~[:return_type], preserve_bang: true)
200
-
201
- "#{field}, #{return_type} do#{block_contents}"
202
- end
203
- end
204
- end
205
-
206
- # Find a configuration in the block and move it to a kwarg,
207
- # for example
208
- # ```
209
- # do
210
- # property :thing
211
- # end
212
- # ```
213
- # becomes:
214
- # ```
215
- # property: thing
216
- # ```
217
- class ConfigurationToKwargTransform < Transform
218
- def initialize(kwarg:)
219
- @kwarg = kwarg
220
- end
221
-
222
- def apply(input_text)
223
- input_text.gsub(
224
- /(?<field>(?:field|return_field|input_field|connection|argument).*) do(?<block_contents>.*?)[ ]*#{@kwarg} (?<kwarg_value>.*?)\n/m
225
- ) do
226
- field = $~[:field]
227
- block_contents = $~[:block_contents]
228
- kwarg_value = $~[:kwarg_value].strip
229
-
230
- "#{field}, #{@kwarg}: #{kwarg_value} do#{block_contents}"
231
- end
232
- end
233
- end
234
-
235
- # Transform `property:` kwarg to `method:` kwarg
236
- class PropertyToMethodTransform < Transform
237
- def apply(input_text)
238
- input_text.gsub /property:/, 'method:'
239
- end
240
- end
241
-
242
- # Find a keyword whose value is a string or symbol,
243
- # and if the value is equivalent to the field name,
244
- # remove the keyword altogether.
245
- class RemoveRedundantKwargTransform < Transform
246
- def initialize(kwarg:)
247
- @kwarg = kwarg
248
- @finder_pattern = /(field|return_field|input_field|connection|argument) :(?<name>[a-zA-Z_0-9]*).*#{@kwarg}: ['":](?<kwarg_value>[a-zA-Z_0-9?!]+)['"]?/
249
- end
250
-
251
- def apply(input_text)
252
- if input_text =~ @finder_pattern
253
- field_name = $~[:name]
254
- kwarg_value = $~[:kwarg_value]
255
- if field_name == kwarg_value
256
- # It's redundant, remove it
257
- input_text = input_text.sub(/, #{@kwarg}: ['":]#{kwarg_value}['"]?/, "")
258
- end
259
- end
260
- input_text
261
- end
262
- end
263
-
264
- # Take camelized field names and convert them to underscore case.
265
- # (They'll be automatically camelized later.)
266
- class UnderscoreizeFieldNameTransform < Transform
267
- def apply(input_text)
268
- input_text.gsub /(?<field_type>input_field|return_field|field|connection|argument) :(?<name>[a-zA-Z_0-9_]*)/ do
269
- field_type = $~[:field_type]
270
- camelized_name = $~[:name]
271
- underscored_name = underscorize(camelized_name)
272
- "#{field_type} :#{underscored_name}"
273
- end
274
- end
275
- end
276
-
277
- class ProcToClassMethodTransform < Transform
278
- # @param proc_name [String] The name of the proc to be moved to `def self.#{proc_name}`
279
- def initialize(proc_name)
280
- @proc_name = proc_name
281
- # This will tell us whether to operate on the input or not
282
- @proc_check_pattern = /#{proc_name}\s?->/
283
- end
284
-
285
- def apply(input_text)
286
- if input_text =~ @proc_check_pattern
287
- processor = apply_processor(input_text, NamedProcProcessor.new(@proc_name))
288
- proc_body = input_text[processor.proc_body_start..processor.proc_body_end]
289
- method_defn_indent = " " * processor.proc_defn_indent
290
- method_defn = "def self.#{@proc_name}(#{processor.proc_arg_names.join(", ")})\n#{method_defn_indent} #{proc_body}\n#{method_defn_indent}end\n"
291
- method_defn = trim_lines(method_defn)
292
- # replace the proc with the new method
293
- input_text[processor.proc_defn_start..processor.proc_defn_end] = method_defn
294
- end
295
- input_text
296
- end
297
-
298
- class NamedProcProcessor < Parser::AST::Processor
299
- attr_reader :proc_arg_names, :proc_defn_start, :proc_defn_end, :proc_defn_indent, :proc_body_start, :proc_body_end
300
- def initialize(proc_name)
301
- @proc_name_sym = proc_name.to_sym
302
- @proc_arg_names = nil
303
- # Beginning of the `#{proc_name} -> {...}` call
304
- @proc_defn_start = nil
305
- # End of the last `end/}`
306
- @proc_defn_end = nil
307
- # Amount of whitespace to insert to the rewritten body
308
- @proc_defn_indent = nil
309
- # First statement of the proc
310
- @proc_body_start = nil
311
- # End of last statement in the proc
312
- @proc_body_end = nil
313
- # Used for identifying the proper block
314
- @inside_proc = false
315
- end
316
-
317
- def on_send(node)
318
- receiver, method_name, _args = *node
319
- if method_name == @proc_name_sym && receiver.nil?
320
- source_exp = node.loc.expression
321
- @proc_defn_start = source_exp.begin.begin_pos
322
- @proc_defn_end = source_exp.end.end_pos
323
- @proc_defn_indent = source_exp.column
324
- @inside_proc = true
325
- end
326
- res = super(node)
327
- @inside_proc = false
328
- res
329
- end
330
-
331
- def on_block(node)
332
- send_node, args_node, body_node = node.children
333
- _receiver, method_name, _send_args_node = *send_node
334
- if method_name == :lambda && @inside_proc
335
- source_exp = body_node.loc.expression
336
- @proc_arg_names = args_node.children.map { |arg_node| arg_node.children[0].to_s }
337
- @proc_body_start = source_exp.begin.begin_pos
338
- @proc_body_end = source_exp.end.end_pos
339
- end
340
- super(node)
341
- end
342
- end
343
- end
344
-
345
- class MutationResolveProcToMethodTransform < Transform
346
- # @param proc_name [String] The name of the proc to be moved to `def self.#{proc_name}`
347
- def initialize(proc_name: "resolve")
348
- @proc_name = proc_name
349
- end
350
-
351
- # TODO dedup with ResolveProcToMethodTransform
352
- def apply(input_text)
353
- if input_text =~ /GraphQL::Relay::Mutation\.define/
354
- named_proc_processor = apply_processor(input_text, ProcToClassMethodTransform::NamedProcProcessor.new(@proc_name))
355
- resolve_proc_processor = apply_processor(input_text, ResolveProcToMethodTransform::ResolveProcProcessor.new)
356
- proc_body = input_text[named_proc_processor.proc_body_start..named_proc_processor.proc_body_end]
357
- method_defn_indent = " " * named_proc_processor.proc_defn_indent
358
-
359
- obj_arg_name, args_arg_name, ctx_arg_name = resolve_proc_processor.proc_arg_names
360
- # This is not good, it will hit false positives
361
- # Should use AST to make this substitution
362
- if obj_arg_name != "_"
363
- proc_body.gsub!(/([^\w:.]|^)#{obj_arg_name}([^\w:]|$)/, '\1object\2')
364
- end
365
- if ctx_arg_name != "_"
366
- proc_body.gsub!(/([^\w:.]|^)#{ctx_arg_name}([^\w:]|$)/, '\1context\2')
367
- end
368
-
369
- method_defn = "def #{@proc_name}(**#{args_arg_name})\n#{method_defn_indent} #{proc_body}\n#{method_defn_indent}end\n"
370
- method_defn = trim_lines(method_defn)
371
- # Update usage of args keys
372
- method_defn = method_defn.gsub(/#{args_arg_name}(?<method_begin>\.key\?\(?|\[)["':](?<arg_name>[a-zA-Z0-9_]+)["']?(?<method_end>\]|\))?/) do
373
- method_begin = $~[:method_begin]
374
- arg_name = underscorize($~[:arg_name])
375
- method_end = $~[:method_end]
376
- "#{args_arg_name}#{method_begin}:#{arg_name}#{method_end}"
377
- end
378
- # replace the proc with the new method
379
- input_text[named_proc_processor.proc_defn_start..named_proc_processor.proc_defn_end] = method_defn
380
- end
381
- input_text
382
- end
383
- end
384
-
385
- # Find hash literals which are returned from mutation resolves,
386
- # and convert their keys to underscores. This catches a lot of cases but misses
387
- # hashes which are initialized anywhere except in the return expression.
388
- class UnderscorizeMutationHashTransform < Transform
389
- def apply(input_text)
390
- if input_text =~ /def resolve\(\*\*/
391
- processor = apply_processor(input_text, ReturnedHashLiteralProcessor.new)
392
- # Use reverse_each to avoid messing up positions
393
- processor.keys_to_upgrade.reverse_each do |key_data|
394
- underscored_key = underscorize(key_data[:key].to_s)
395
- if key_data[:operator] == ":"
396
- input_text[key_data[:start]...key_data[:end]] = underscored_key
397
- else
398
- input_text[key_data[:start]...key_data[:end]] = ":#{underscored_key}"
399
- end
400
- end
401
- end
402
- input_text
403
- end
404
-
405
- class ReturnedHashLiteralProcessor < Parser::AST::Processor
406
- attr_reader :keys_to_upgrade
407
- def initialize
408
- @keys_to_upgrade = []
409
- end
410
-
411
- def on_def(node)
412
- method_name, _args, body = *node
413
- if method_name == :resolve
414
- possible_returned_hashes = find_returned_hashes(body, returning: false)
415
- possible_returned_hashes.each do |hash_node|
416
- pairs = *hash_node
417
- pairs.each do |pair_node|
418
- if pair_node.type == :pair # Skip over :kwsplat
419
- pair_k, _pair_v = *pair_node
420
- if pair_k.type == :sym && pair_k.children[0].to_s =~ /[a-z][A-Z]/ # Does it have any camelcase boundaries?
421
- source_exp = pair_k.loc.expression
422
- @keys_to_upgrade << {
423
- start: source_exp.begin.begin_pos,
424
- end: source_exp.end.end_pos,
425
- key: pair_k.children[0],
426
- operator: pair_node.loc.operator.source,
427
- }
428
- end
429
- end
430
- end
431
- end
432
- end
433
-
434
- end
435
-
436
- private
437
-
438
- # Look for hash nodes, starting from `node`.
439
- # Return hash nodes that are valid candiates for returning from this method.
440
- def find_returned_hashes(node, returning:)
441
- if node.is_a?(Array)
442
- *possible_returns, last_expression = *node
443
- return possible_returns.map { |c| find_returned_hashes(c, returning: false) }.flatten +
444
- # Check the last expression of a method body
445
- find_returned_hashes(last_expression, returning: returning)
446
- end
447
-
448
- case node.type
449
- when :hash
450
- if returning
451
- [node]
452
- else
453
- # This is some random hash literal
454
- []
455
- end
456
- when :begin
457
- # Check the last expression of a method body
458
- find_returned_hashes(node.children, returning: true)
459
- when :resbody
460
- _condition, _assign, body = *node
461
- find_returned_hashes(body, returning: returning)
462
- when :kwbegin
463
- find_returned_hashes(node.children, returning: returning)
464
- when :rescue
465
- try_body, rescue_body, _ensure_body = *node
466
- find_returned_hashes(try_body, returning: returning) + find_returned_hashes(rescue_body, returning: returning)
467
- when :block
468
- # Check methods with blocks for possible returns
469
- method_call, _args, *body = *node
470
- if method_call.type == :send
471
- find_returned_hashes(body, returning: returning)
472
- end
473
- when :if
474
- # Check each branch of a conditional
475
- _condition, *branches = *node
476
- branches.compact.map { |b| find_returned_hashes(b, returning: returning) }.flatten
477
- when :return
478
- find_returned_hashes(node.children.first, returning: true)
479
- else
480
- []
481
- end
482
- rescue
483
- p "--- UnderscorizeMutationHashTransform crashed on node: ---"
484
- p node
485
- raise
486
- end
487
-
488
- end
489
- end
490
-
491
- class ResolveProcToMethodTransform < Transform
492
- def apply(input_text)
493
- if input_text =~ /resolve\(? ?->/
494
- # - Find the proc literal
495
- # - Get the three argument names (obj, arg, ctx)
496
- # - Get the proc body
497
- # - Find and replace:
498
- # - The ctx argument becomes `context`
499
- # - The obj argument becomes `object`
500
- # - Args is trickier:
501
- # - If it's not used, remove it
502
- # - If it's used, abandon ship and make it `**args`
503
- # - Convert string args access to symbol access, since it's a Ruby **splat
504
- # - Convert camelized arg names to underscored arg names
505
- # - (It would be nice to correctly become Ruby kwargs, but that might be too hard)
506
- # - Add a `# TODO` comment to the method source?
507
- # - Rebuild the method:
508
- # - use the field name as the method name
509
- # - handle args as described above
510
- # - put the modified proc body as the method body
511
-
512
- input_text.match(/(?<field_type>input_field|field|connection|argument) :(?<name>[a-zA-Z_0-9_]*)/)
513
- field_name = $~[:name]
514
- processor = apply_processor(input_text, ResolveProcProcessor.new)
515
- proc_body = input_text[processor.proc_start..processor.proc_end]
516
- obj_arg_name, args_arg_name, ctx_arg_name = processor.proc_arg_names
517
- # This is not good, it will hit false positives
518
- # Should use AST to make this substitution
519
- if obj_arg_name != "_"
520
- proc_body.gsub!(/([^\w:.]|^)#{obj_arg_name}([^\w:]|$)/, '\1object\2')
521
- end
522
- if ctx_arg_name != "_"
523
- proc_body.gsub!(/([^\w:.]|^)#{ctx_arg_name}([^\w:]|$)/, '\1context\2')
524
- end
525
-
526
- method_def_indent = " " * (processor.resolve_indent - 2)
527
- # Turn the proc body into a method body
528
- method_body = reindent_lines(proc_body, from_indent: processor.resolve_indent + 2, to_indent: processor.resolve_indent)
529
- # Add `def... end`
530
- method_def = if input_text.include?("argument ")
531
- # This field has arguments
532
- "def #{field_name}(**#{args_arg_name})"
533
- else
534
- # No field arguments, so, no method arguments
535
- "def #{field_name}"
536
- end
537
- # Wrap the body in def ... end
538
- method_body = "\n#{method_def_indent}#{method_def}\n#{method_body}\n#{method_def_indent}end\n"
539
- # Update Argument access to be underscore and symbols
540
- # Update `args[...]` and `args.key?`
541
- method_body = method_body.gsub(/#{args_arg_name}(?<method_begin>\.key\?\(?|\[)["':](?<arg_name>[a-zA-Z0-9_]+)["']?(?<method_end>\]|\))?/) do
542
- method_begin = $~[:method_begin]
543
- arg_name = underscorize($~[:arg_name])
544
- method_end = $~[:method_end]
545
- "#{args_arg_name}#{method_begin}:#{arg_name}#{method_end}"
546
- end
547
-
548
- # Replace the resolve proc with the method
549
- input_text[processor.resolve_start..processor.resolve_end] = ""
550
- # The replacement above might have left some preceeding whitespace,
551
- # so remove it by deleting all whitespace chars before `resolve`:
552
- preceeding_whitespace = processor.resolve_start - 1
553
- while input_text[preceeding_whitespace] == " " && preceeding_whitespace > 0
554
- input_text[preceeding_whitespace] = ""
555
- preceeding_whitespace -= 1
556
- end
557
- input_text += method_body
558
- input_text
559
- else
560
- # No resolve proc
561
- input_text
562
- end
563
- end
564
-
565
- class ResolveProcProcessor < Parser::AST::Processor
566
- attr_reader :proc_start, :proc_end, :proc_arg_names, :resolve_start, :resolve_end, :resolve_indent
567
- def initialize
568
- @proc_arg_names = nil
569
- @resolve_start = nil
570
- @resolve_end = nil
571
- @resolve_indent = nil
572
- @proc_start = nil
573
- @proc_end = nil
574
- end
575
-
576
- def on_send(node)
577
- receiver, method_name, _args = *node
578
- if method_name == :resolve && receiver.nil?
579
- source_exp = node.loc.expression
580
- @resolve_start = source_exp.begin.begin_pos
581
- @resolve_end = source_exp.end.end_pos
582
- @resolve_indent = source_exp.column
583
- end
584
- super(node)
585
- end
586
-
587
- def on_block(node)
588
- send_node, args_node, body_node = node.children
589
- _receiver, method_name, _send_args_node = *send_node
590
- # Assume that the first three-argument proc we enter is the resolve
591
- if method_name == :lambda && args_node.children.size == 3 && @proc_arg_names.nil?
592
- source_exp = body_node.loc.expression
593
- @proc_arg_names = args_node.children.map { |arg_node| arg_node.children[0].to_s }
594
- @proc_start = source_exp.begin.begin_pos
595
- @proc_end = source_exp.end.end_pos
596
- end
597
- super(node)
598
- end
599
- end
600
- end
601
-
602
- # Transform `interfaces [A, B, C]` to `implements A\nimplements B\nimplements C\n`
603
- class InterfacesToImplementsTransform < Transform
604
- PATTERN = /(?<indent>\s*)(?:interfaces) \[\s*(?<interfaces>(?:[a-zA-Z_0-9:\.,\s]+))\]/m
605
- def apply(input_text)
606
- input_text.gsub(PATTERN) do
607
- indent = $~[:indent]
608
- interfaces = $~[:interfaces].split(',').map(&:strip).reject(&:empty?)
609
- # Preserve leading newlines before the `interfaces ...`
610
- # call, but don't re-insert them between `implements` calls.
611
- extra_leading_newlines = "\n" * (indent[/^\n*/].length - 1)
612
- indent = indent.sub(/^\n*/m, "")
613
- interfaces_calls = interfaces
614
- .map { |interface| "\n#{indent}implements #{interface}" }
615
- .join
616
- extra_leading_newlines + interfaces_calls
617
- end
618
- end
619
- end
620
-
621
- # Transform `possible_types [A, B, C]` to `possible_types(A, B, C)`
622
- class PossibleTypesTransform < Transform
623
- PATTERN = /(?<indent>\s*)(?:possible_types) \[\s*(?<possible_types>(?:[a-zA-Z_0-9:\.,\s]+))\]/m
624
- def apply(input_text)
625
- input_text.gsub(PATTERN) do
626
- indent = $~[:indent]
627
- possible_types = $~[:possible_types].split(',').map(&:strip).reject(&:empty?)
628
- extra_leading_newlines = indent[/^\n*/]
629
- method_indent = indent.sub(/^\n*/m, "")
630
- type_indent = " " + method_indent
631
- possible_types_call = "#{method_indent}possible_types(\n#{possible_types.map { |t| "#{type_indent}#{t},"}.join("\n")}\n#{method_indent})"
632
- extra_leading_newlines + trim_lines(possible_types_call)
633
- end
634
- end
635
- end
636
-
637
- class UpdateMethodSignatureTransform < Transform
638
- def apply(input_text)
639
- input_text.scan(/(?:input_field|field|return_field|connection|argument) .*$/).each do |field|
640
- matches = /(?<field_type>input_field|return_field|field|connection|argument) :(?<name>[a-zA-Z_0-9_]*)?(:?, +(?<return_type>([A-Za-z\[\]\.\!_0-9\(\)]|::|-> ?\{ ?| ?\})+))?(?<remainder>( |,|$).*)/.match(field)
641
- if matches
642
- name = matches[:name]
643
- return_type = matches[:return_type]
644
- remainder = matches[:remainder]
645
- field_type = matches[:field_type]
646
- with_block = remainder.gsub!(/\ do$/, '')
647
-
648
- remainder.gsub! /,$/, ''
649
- remainder.gsub! /^,/, ''
650
- remainder.chomp!
651
-
652
- if return_type
653
- non_nullable = return_type.sub! /(^|[^\[])!/, '\1'
654
- non_nullable ||= return_type.sub! /([^\[])\.to_non_null_type([^\]]|$)/, '\1'
655
- nullable = !non_nullable
656
- return_type = normalize_type_expression(return_type)
657
- else
658
- non_nullable = nil
659
- nullable = nil
660
- end
661
-
662
- input_text.sub!(field) do
663
- is_argument = ['argument', 'input_field'].include?(field_type)
664
- f = "#{is_argument ? 'argument' : 'field'} :#{name}"
665
-
666
- if return_type
667
- f += ", #{return_type}"
668
- end
669
-
670
- unless remainder.empty?
671
- f += ',' + remainder
672
- end
673
-
674
- if is_argument
675
- if nullable
676
- f += ', required: false'
677
- elsif non_nullable
678
- f += ', required: true'
679
- end
680
- else
681
- if nullable
682
- f += ', null: true'
683
- elsif non_nullable
684
- f += ', null: false'
685
- end
686
- end
687
-
688
- if field_type == 'connection'
689
- f += ', connection: true'
690
- end
691
-
692
- if with_block
693
- f += ' do'
694
- end
695
-
696
- f
697
- end
698
- end
699
- end
700
-
701
- input_text
702
- end
703
- end
704
-
705
- class RemoveEmptyBlocksTransform < Transform
706
- def apply(input_text)
707
- input_text.gsub(/\s*do\s*end/m, "")
708
- end
709
- end
710
-
711
- # Remove redundant newlines, which may have trailing spaces
712
- # Remove double newline after `do`
713
- # Remove double newline before `end`
714
- # Remove lines with whitespace only
715
- class RemoveExcessWhitespaceTransform < Transform
716
- def apply(input_text)
717
- input_text
718
- .gsub(/\n{3,}/m, "\n\n")
719
- .gsub(/do\n{2,}/m, "do\n")
720
- .gsub(/\n{2,}(\s*)end/m, "\n\\1end")
721
- .gsub(/\n +\n/m, "\n\n")
722
- end
723
- end
724
-
725
- # Skip this file if you see any `field`
726
- # helpers with `null: true` or `null: false` keywords
727
- # or `argument` helpers with `required:` keywords,
728
- # because it's already been transformed
729
- class SkipOnNullKeyword
730
- def skip?(input_text)
731
- input_text =~ /field.*null: (true|false)/ || input_text =~ /argument.*required: (true|false)/
732
- end
733
- end
734
-
735
- class Member
736
- def initialize(member, skip: SkipOnNullKeyword, type_transforms: DEFAULT_TYPE_TRANSFORMS, field_transforms: DEFAULT_FIELD_TRANSFORMS, clean_up_transforms: DEFAULT_CLEAN_UP_TRANSFORMS)
737
- @member = member
738
- @skip = skip
739
- @type_transforms = type_transforms
740
- @field_transforms = field_transforms
741
- @clean_up_transforms = clean_up_transforms
742
- end
743
-
744
- DEFAULT_TYPE_TRANSFORMS = [
745
- TypeDefineToClassTransform,
746
- MutationResolveProcToMethodTransform, # Do this before switching to class, so we can detect that its a mutation
747
- UnderscorizeMutationHashTransform,
748
- MutationDefineToClassTransform,
749
- NameTransform,
750
- InterfacesToImplementsTransform,
751
- PossibleTypesTransform,
752
- ProcToClassMethodTransform.new("coerce_input"),
753
- ProcToClassMethodTransform.new("coerce_result"),
754
- ProcToClassMethodTransform.new("resolve_type"),
755
- ]
756
-
757
- DEFAULT_FIELD_TRANSFORMS = [
758
- RemoveNewlinesTransform,
759
- RemoveMethodParensTransform,
760
- PositionalTypeArgTransform,
761
- ConfigurationToKwargTransform.new(kwarg: "property"),
762
- ConfigurationToKwargTransform.new(kwarg: "description"),
763
- ConfigurationToKwargTransform.new(kwarg: "deprecation_reason"),
764
- ConfigurationToKwargTransform.new(kwarg: "hash_key"),
765
- PropertyToMethodTransform,
766
- UnderscoreizeFieldNameTransform,
767
- ResolveProcToMethodTransform,
768
- UpdateMethodSignatureTransform,
769
- RemoveRedundantKwargTransform.new(kwarg: "hash_key"),
770
- RemoveRedundantKwargTransform.new(kwarg: "method"),
771
- ]
772
-
773
- DEFAULT_CLEAN_UP_TRANSFORMS = [
774
- RemoveExcessWhitespaceTransform,
775
- RemoveEmptyBlocksTransform,
776
- ]
777
-
778
- def upgrade
779
- type_source = @member.dup
780
- should_skip = @skip.new.skip?(type_source)
781
- # return the unmodified code
782
- if should_skip
783
- return type_source
784
- end
785
- # Transforms on type defn code:
786
- type_source = apply_transforms(type_source, @type_transforms)
787
- # Transforms on each field:
788
- field_sources = find_fields(type_source)
789
- field_sources.each do |field_source|
790
- transformed_field_source = apply_transforms(field_source.dup, @field_transforms)
791
- # Replace the original source code with the transformed source code:
792
- type_source = type_source.gsub(field_source, transformed_field_source)
793
- end
794
- # Clean-up:
795
- type_source = apply_transforms(type_source, @clean_up_transforms)
796
- # Return the transformed source:
797
- type_source
798
- end
799
-
800
- def upgradeable?
801
- return false if @member.include? '< GraphQL::Schema::'
802
- return false if @member =~ /< Types::Base#{GRAPHQL_TYPES}/
803
-
804
- true
805
- end
806
-
807
- private
808
-
809
- def apply_transforms(source_code, transforms, idx: 0)
810
- next_transform = transforms[idx]
811
- case next_transform
812
- when nil
813
- # We got to the end of the list
814
- source_code
815
- when Class
816
- # Apply a class
817
- next_source_code = next_transform.new.apply(source_code)
818
- apply_transforms(next_source_code, transforms, idx: idx + 1)
819
- else
820
- # Apply an already-initialized object which responds to `apply`
821
- next_source_code = next_transform.apply(source_code)
822
- apply_transforms(next_source_code, transforms, idx: idx + 1)
823
- end
824
- end
825
-
826
- # Parse the type, find calls to `field` and `connection`
827
- # Return strings containing those calls
828
- def find_fields(type_source)
829
- type_ast = Parser::CurrentRuby.parse(type_source)
830
- finder = FieldFinder.new
831
- finder.process(type_ast)
832
- field_sources = []
833
- # For each of the locations we found, extract the text for that definition.
834
- # The text will be transformed independently,
835
- # then the transformed text will replace the original text.
836
- FieldFinder::DEFINITION_METHODS.each do |def_method|
837
- finder.locations[def_method].each do |name, (starting_idx, ending_idx)|
838
- field_source = type_source[starting_idx..ending_idx]
839
- field_sources << field_source
840
- end
841
- end
842
- # Here's a crazy thing: the transformation is pure,
843
- # so definitions like `argument :id, types.ID` can be transformed once
844
- # then replaced everywhere. So:
845
- # - make a unique array here
846
- # - use `gsub` after performing the transformation.
847
- field_sources.uniq!
848
- field_sources
849
- rescue Parser::SyntaxError
850
- puts "Error Source:"
851
- puts type_source
852
- raise
853
- end
854
-
855
- class FieldFinder < Parser::AST::Processor
856
- # These methods are definition DSLs which may accept a block,
857
- # each of these definitions is passed for transformation in its own right.
858
- # `field` and `connection` take priority. In fact, they upgrade their
859
- # own arguments, so those upgrades turn out to be no-ops.
860
- DEFINITION_METHODS = [:field, :connection, :input_field, :return_field, :argument]
861
- attr_reader :locations
862
-
863
- def initialize
864
- # Pairs of `{ { method_name => { name => [start, end] } }`,
865
- # since fields/arguments are unique by name, within their category
866
- @locations = Hash.new { |h,k| h[k] = {} }
867
- end
868
-
869
- # @param send_node [node] The node which might be a `field` call, etc
870
- # @param source_node [node] The node whose source defines the bounds of the definition (eg, the surrounding block)
871
- def add_location(send_node:,source_node:)
872
- receiver_node, method_name, *arg_nodes = *send_node
873
- # Implicit self and one of the recognized methods
874
- if receiver_node.nil? && DEFINITION_METHODS.include?(method_name)
875
- name = arg_nodes[0]
876
- # This field may have already been added because
877
- # we find `(block ...)` nodes _before_ we find `(send ...)` nodes.
878
- if @locations[method_name][name].nil?
879
- starting_idx = source_node.loc.expression.begin.begin_pos
880
- ending_idx = source_node.loc.expression.end.end_pos
881
- @locations[method_name][name] = [starting_idx, ending_idx]
882
- end
883
- end
884
- end
885
-
886
- def on_block(node)
887
- send_node, _args_node, _body_node = *node
888
- add_location(send_node: send_node, source_node: node)
889
- super(node)
890
- end
891
-
892
- def on_send(node)
893
- add_location(send_node: node, source_node: node)
894
- super(node)
895
- end
896
- end
897
- end
898
- end
899
- end