graphql 1.8.0 → 1.12.12

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 (924) hide show
  1. checksums.yaml +5 -5
  2. data/lib/generators/graphql/core.rb +20 -3
  3. data/lib/generators/graphql/enum_generator.rb +3 -3
  4. data/lib/generators/graphql/install_generator.rb +52 -7
  5. data/lib/generators/graphql/loader_generator.rb +1 -0
  6. data/lib/generators/graphql/mutation_generator.rb +7 -6
  7. data/lib/generators/graphql/object_generator.rb +52 -8
  8. data/lib/generators/graphql/relay.rb +55 -0
  9. data/lib/generators/graphql/relay_generator.rb +21 -0
  10. data/lib/generators/graphql/scalar_generator.rb +20 -0
  11. data/lib/generators/graphql/templates/base_argument.erb +6 -0
  12. data/lib/generators/graphql/templates/base_connection.erb +8 -0
  13. data/lib/generators/graphql/templates/base_edge.erb +8 -0
  14. data/lib/generators/graphql/templates/base_enum.erb +6 -0
  15. data/lib/generators/graphql/templates/base_field.erb +7 -0
  16. data/lib/generators/graphql/templates/base_input_object.erb +7 -0
  17. data/lib/generators/graphql/templates/base_interface.erb +9 -0
  18. data/lib/generators/graphql/templates/base_mutation.erb +10 -0
  19. data/lib/generators/graphql/templates/base_object.erb +7 -0
  20. data/lib/generators/graphql/templates/base_scalar.erb +6 -0
  21. data/lib/generators/graphql/templates/base_union.erb +6 -0
  22. data/lib/generators/graphql/templates/enum.erb +7 -4
  23. data/lib/generators/graphql/templates/graphql_controller.erb +28 -9
  24. data/lib/generators/graphql/templates/interface.erb +8 -4
  25. data/lib/generators/graphql/templates/loader.erb +16 -12
  26. data/lib/generators/graphql/templates/mutation.erb +13 -9
  27. data/lib/generators/graphql/templates/mutation_type.erb +10 -9
  28. data/lib/generators/graphql/templates/node_type.erb +9 -0
  29. data/lib/generators/graphql/templates/object.erb +8 -5
  30. data/lib/generators/graphql/templates/query_type.erb +12 -12
  31. data/lib/generators/graphql/templates/scalar.erb +15 -0
  32. data/lib/generators/graphql/templates/schema.erb +13 -30
  33. data/lib/generators/graphql/templates/union.erb +7 -4
  34. data/lib/generators/graphql/type_generator.rb +34 -18
  35. data/lib/generators/graphql/union_generator.rb +1 -1
  36. data/lib/graphql/analysis/analyze_query.rb +18 -2
  37. data/lib/graphql/analysis/ast/analyzer.rb +84 -0
  38. data/lib/graphql/analysis/ast/field_usage.rb +28 -0
  39. data/lib/graphql/analysis/ast/max_query_complexity.rb +23 -0
  40. data/lib/graphql/analysis/ast/max_query_depth.rb +22 -0
  41. data/lib/graphql/analysis/ast/query_complexity.rb +234 -0
  42. data/lib/graphql/analysis/ast/query_depth.rb +56 -0
  43. data/lib/graphql/analysis/ast/visitor.rb +268 -0
  44. data/lib/graphql/analysis/ast.rb +91 -0
  45. data/lib/graphql/analysis/query_depth.rb +4 -17
  46. data/lib/graphql/analysis.rb +1 -0
  47. data/lib/graphql/argument.rb +40 -39
  48. data/lib/graphql/authorization.rb +82 -0
  49. data/lib/graphql/backtrace/inspect_result.rb +0 -1
  50. data/lib/graphql/backtrace/legacy_tracer.rb +56 -0
  51. data/lib/graphql/backtrace/table.rb +44 -5
  52. data/lib/graphql/backtrace/traced_error.rb +0 -1
  53. data/lib/graphql/backtrace/tracer.rb +37 -9
  54. data/lib/graphql/backtrace.rb +28 -19
  55. data/lib/graphql/backwards_compatibility.rb +3 -2
  56. data/lib/graphql/base_type.rb +9 -4
  57. data/lib/graphql/boolean_type.rb +1 -8
  58. data/lib/graphql/coercion_error.rb +8 -0
  59. data/lib/graphql/compatibility/execution_specification/specification_schema.rb +3 -4
  60. data/lib/graphql/compatibility/execution_specification.rb +1 -0
  61. data/lib/graphql/compatibility/lazy_execution_specification/lazy_schema.rb +3 -2
  62. data/lib/graphql/compatibility/lazy_execution_specification.rb +2 -0
  63. data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +5 -9
  64. data/lib/graphql/compatibility/query_parser_specification.rb +2 -0
  65. data/lib/graphql/compatibility/schema_parser_specification.rb +443 -7
  66. data/lib/graphql/dataloader/null_dataloader.rb +22 -0
  67. data/lib/graphql/dataloader/request.rb +19 -0
  68. data/lib/graphql/dataloader/request_all.rb +19 -0
  69. data/lib/graphql/dataloader/source.rb +107 -0
  70. data/lib/graphql/dataloader.rb +252 -0
  71. data/lib/graphql/define/assign_enum_value.rb +1 -1
  72. data/lib/graphql/define/assign_global_id_field.rb +2 -2
  73. data/lib/graphql/define/assign_object_field.rb +3 -3
  74. data/lib/graphql/define/defined_object_proxy.rb +3 -0
  75. data/lib/graphql/define/instance_definable.rb +52 -110
  76. data/lib/graphql/define/type_definer.rb +5 -5
  77. data/lib/graphql/deprecated_dsl.rb +7 -2
  78. data/lib/graphql/deprecation.rb +13 -0
  79. data/lib/graphql/dig.rb +19 -0
  80. data/lib/graphql/directive/deprecated_directive.rb +1 -12
  81. data/lib/graphql/directive/include_directive.rb +1 -7
  82. data/lib/graphql/directive/skip_directive.rb +1 -8
  83. data/lib/graphql/directive.rb +21 -2
  84. data/lib/graphql/enum_type.rb +16 -71
  85. data/lib/graphql/execution/directive_checks.rb +2 -2
  86. data/lib/graphql/execution/errors.rb +162 -0
  87. data/lib/graphql/execution/execute.rb +112 -46
  88. data/lib/graphql/execution/instrumentation.rb +30 -20
  89. data/lib/graphql/execution/interpreter/argument_value.rb +28 -0
  90. data/lib/graphql/execution/interpreter/arguments.rb +88 -0
  91. data/lib/graphql/execution/interpreter/arguments_cache.rb +103 -0
  92. data/lib/graphql/execution/interpreter/execution_errors.rb +29 -0
  93. data/lib/graphql/execution/interpreter/handles_raw_value.rb +18 -0
  94. data/lib/graphql/execution/interpreter/resolve.rb +66 -0
  95. data/lib/graphql/execution/interpreter/runtime.rb +817 -0
  96. data/lib/graphql/execution/interpreter.rb +122 -0
  97. data/lib/graphql/execution/lazy/lazy_method_map.rb +4 -0
  98. data/lib/graphql/execution/lazy.rb +27 -3
  99. data/lib/graphql/execution/lookahead.rb +307 -0
  100. data/lib/graphql/execution/multiplex.rb +84 -50
  101. data/lib/graphql/execution.rb +3 -0
  102. data/lib/graphql/execution_error.rb +15 -2
  103. data/lib/graphql/field.rb +19 -123
  104. data/lib/graphql/filter.rb +1 -1
  105. data/lib/graphql/float_type.rb +1 -8
  106. data/lib/graphql/function.rb +6 -31
  107. data/lib/graphql/id_type.rb +1 -15
  108. data/lib/graphql/input_object_type.rb +12 -26
  109. data/lib/graphql/int_type.rb +1 -8
  110. data/lib/graphql/integer_decoding_error.rb +17 -0
  111. data/lib/graphql/integer_encoding_error.rb +20 -0
  112. data/lib/graphql/interface_type.rb +26 -22
  113. data/lib/graphql/internal_representation/document.rb +2 -2
  114. data/lib/graphql/internal_representation/rewrite.rb +127 -142
  115. data/lib/graphql/internal_representation/scope.rb +2 -2
  116. data/lib/graphql/internal_representation/visit.rb +3 -2
  117. data/lib/graphql/introspection/base_object.rb +2 -5
  118. data/lib/graphql/introspection/directive_type.rb +8 -4
  119. data/lib/graphql/introspection/dynamic_fields.rb +9 -3
  120. data/lib/graphql/introspection/entry_points.rb +15 -9
  121. data/lib/graphql/introspection/enum_value_type.rb +4 -0
  122. data/lib/graphql/introspection/field_type.rb +7 -3
  123. data/lib/graphql/introspection/input_value_type.rb +33 -5
  124. data/lib/graphql/introspection/introspection_query.rb +6 -92
  125. data/lib/graphql/introspection/schema_type.rb +6 -5
  126. data/lib/graphql/introspection/type_type.rb +14 -7
  127. data/lib/graphql/introspection.rb +96 -3
  128. data/lib/graphql/invalid_null_error.rb +19 -1
  129. data/lib/graphql/language/block_string.rb +63 -7
  130. data/lib/graphql/language/cache.rb +37 -0
  131. data/lib/graphql/language/definition_slice.rb +21 -10
  132. data/lib/graphql/language/document_from_schema_definition.rb +136 -71
  133. data/lib/graphql/language/lexer.rb +215 -153
  134. data/lib/graphql/language/lexer.rl +86 -53
  135. data/lib/graphql/language/nodes.rb +456 -301
  136. data/lib/graphql/language/parser.rb +1109 -861
  137. data/lib/graphql/language/parser.y +177 -98
  138. data/lib/graphql/language/printer.rb +4 -4
  139. data/lib/graphql/language/sanitized_printer.rb +222 -0
  140. data/lib/graphql/language/token.rb +6 -2
  141. data/lib/graphql/language/visitor.rb +168 -16
  142. data/lib/graphql/language.rb +3 -2
  143. data/lib/graphql/list_type.rb +1 -0
  144. data/lib/graphql/load_application_object_failed_error.rb +22 -0
  145. data/lib/graphql/name_validator.rb +6 -7
  146. data/lib/graphql/non_null_type.rb +1 -10
  147. data/lib/graphql/object_type.rb +52 -59
  148. data/lib/graphql/pagination/active_record_relation_connection.rb +48 -0
  149. data/lib/graphql/pagination/array_connection.rb +77 -0
  150. data/lib/graphql/pagination/connection.rb +226 -0
  151. data/lib/graphql/pagination/connections.rb +136 -0
  152. data/lib/graphql/pagination/mongoid_relation_connection.rb +25 -0
  153. data/lib/graphql/pagination/relation_connection.rb +196 -0
  154. data/lib/graphql/pagination/sequel_dataset_connection.rb +28 -0
  155. data/lib/graphql/pagination.rb +6 -0
  156. data/lib/graphql/parse_error.rb +0 -1
  157. data/lib/graphql/query/arguments.rb +33 -20
  158. data/lib/graphql/query/arguments_cache.rb +1 -2
  159. data/lib/graphql/query/context.rb +92 -23
  160. data/lib/graphql/query/executor.rb +1 -2
  161. data/lib/graphql/query/fingerprint.rb +26 -0
  162. data/lib/graphql/query/input_validation_result.rb +23 -6
  163. data/lib/graphql/query/literal_input.rb +30 -9
  164. data/lib/graphql/query/null_context.rb +18 -3
  165. data/lib/graphql/query/result.rb +1 -1
  166. data/lib/graphql/query/serial_execution.rb +1 -0
  167. data/lib/graphql/query/validation_pipeline.rb +45 -26
  168. data/lib/graphql/query/variable_validation_error.rb +25 -2
  169. data/lib/graphql/query/variables.rb +33 -27
  170. data/lib/graphql/query.rb +119 -29
  171. data/lib/graphql/railtie.rb +15 -7
  172. data/lib/graphql/rake_task/validate.rb +4 -1
  173. data/lib/graphql/rake_task.rb +12 -9
  174. data/lib/graphql/relay/array_connection.rb +11 -13
  175. data/lib/graphql/relay/base_connection.rb +33 -14
  176. data/lib/graphql/relay/connection_instrumentation.rb +24 -18
  177. data/lib/graphql/relay/connection_resolve.rb +7 -27
  178. data/lib/graphql/relay/connection_type.rb +4 -2
  179. data/lib/graphql/relay/edge_type.rb +2 -0
  180. data/lib/graphql/relay/edges_instrumentation.rb +9 -25
  181. data/lib/graphql/relay/mongo_relation_connection.rb +10 -0
  182. data/lib/graphql/relay/mutation/instrumentation.rb +1 -2
  183. data/lib/graphql/relay/mutation/resolve.rb +2 -4
  184. data/lib/graphql/relay/mutation.rb +4 -87
  185. data/lib/graphql/relay/node.rb +8 -36
  186. data/lib/graphql/relay/page_info.rb +1 -9
  187. data/lib/graphql/relay/range_add.rb +23 -9
  188. data/lib/graphql/relay/relation_connection.rb +18 -16
  189. data/lib/graphql/relay/type_extensions.rb +2 -0
  190. data/lib/graphql/relay.rb +0 -1
  191. data/lib/graphql/scalar_type.rb +17 -61
  192. data/lib/graphql/schema/addition.rb +238 -0
  193. data/lib/graphql/schema/argument.rb +263 -15
  194. data/lib/graphql/schema/base_64_bp.rb +26 -0
  195. data/lib/graphql/schema/base_64_encoder.rb +10 -4
  196. data/lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb +1 -1
  197. data/lib/graphql/schema/build_from_definition/resolve_map.rb +13 -5
  198. data/lib/graphql/schema/build_from_definition.rb +317 -206
  199. data/lib/graphql/schema/built_in_types.rb +12 -0
  200. data/lib/graphql/schema/default_type_error.rb +3 -1
  201. data/lib/graphql/schema/directive/deprecated.rb +18 -0
  202. data/lib/graphql/schema/directive/feature.rb +66 -0
  203. data/lib/graphql/schema/directive/flagged.rb +57 -0
  204. data/lib/graphql/schema/directive/include.rb +25 -0
  205. data/lib/graphql/schema/directive/skip.rb +25 -0
  206. data/lib/graphql/schema/directive/transform.rb +60 -0
  207. data/lib/graphql/schema/directive.rb +210 -0
  208. data/lib/graphql/schema/enum.rb +55 -4
  209. data/lib/graphql/schema/enum_value.rb +24 -5
  210. data/lib/graphql/schema/field/connection_extension.rb +76 -0
  211. data/lib/graphql/schema/field/scope_extension.rb +22 -0
  212. data/lib/graphql/schema/field.rb +548 -125
  213. data/lib/graphql/schema/field_extension.rb +69 -0
  214. data/lib/graphql/schema/find_inherited_value.rb +35 -0
  215. data/lib/graphql/schema/finder.rb +13 -11
  216. data/lib/graphql/schema/input_object.rb +190 -17
  217. data/lib/graphql/schema/interface.rb +49 -7
  218. data/lib/graphql/schema/introspection_system.rb +112 -36
  219. data/lib/graphql/schema/late_bound_type.rb +3 -2
  220. data/lib/graphql/schema/list.rb +55 -12
  221. data/lib/graphql/schema/loader.rb +164 -111
  222. data/lib/graphql/schema/member/base_dsl_methods.rb +59 -30
  223. data/lib/graphql/schema/member/build_type.rb +60 -14
  224. data/lib/graphql/schema/member/cached_graphql_definition.rb +5 -0
  225. data/lib/graphql/schema/member/has_arguments.rb +198 -4
  226. data/lib/graphql/schema/member/has_ast_node.rb +20 -0
  227. data/lib/graphql/schema/member/has_deprecation_reason.rb +25 -0
  228. data/lib/graphql/schema/member/has_directives.rb +98 -0
  229. data/lib/graphql/schema/member/has_fields.rb +51 -76
  230. data/lib/graphql/schema/member/has_path.rb +25 -0
  231. data/lib/graphql/schema/member/has_unresolved_type_error.rb +15 -0
  232. data/lib/graphql/schema/member/has_validators.rb +31 -0
  233. data/lib/graphql/schema/member/instrumentation.rb +42 -26
  234. data/lib/graphql/schema/member/relay_shortcuts.rb +47 -0
  235. data/lib/graphql/schema/member/scoped.rb +21 -0
  236. data/lib/graphql/schema/member/type_system_helpers.rb +7 -3
  237. data/lib/graphql/schema/member/validates_input.rb +33 -0
  238. data/lib/graphql/schema/member.rb +20 -4
  239. data/lib/graphql/schema/middleware_chain.rb +1 -1
  240. data/lib/graphql/schema/mutation.rb +13 -57
  241. data/lib/graphql/schema/non_null.rb +40 -11
  242. data/lib/graphql/schema/object.rb +145 -9
  243. data/lib/graphql/schema/possible_types.rb +14 -7
  244. data/lib/graphql/schema/printer.rb +7 -19
  245. data/lib/graphql/schema/relay_classic_mutation.rb +56 -9
  246. data/lib/graphql/schema/rescue_middleware.rb +7 -2
  247. data/lib/graphql/schema/resolver/has_payload_type.rb +71 -0
  248. data/lib/graphql/schema/resolver.rb +297 -6
  249. data/lib/graphql/schema/scalar.rb +37 -3
  250. data/lib/graphql/schema/subscription.rb +127 -0
  251. data/lib/graphql/schema/timeout.rb +123 -0
  252. data/lib/graphql/schema/timeout_middleware.rb +7 -4
  253. data/lib/graphql/schema/traversal.rb +14 -3
  254. data/lib/graphql/schema/type_expression.rb +21 -13
  255. data/lib/graphql/schema/type_membership.rb +34 -0
  256. data/lib/graphql/schema/union.rb +60 -6
  257. data/lib/graphql/schema/unique_within_type.rb +3 -1
  258. data/lib/graphql/schema/validation.rb +40 -13
  259. data/lib/graphql/schema/validator/exclusion_validator.rb +31 -0
  260. data/lib/graphql/schema/validator/format_validator.rb +49 -0
  261. data/lib/graphql/schema/validator/inclusion_validator.rb +33 -0
  262. data/lib/graphql/schema/validator/length_validator.rb +57 -0
  263. data/lib/graphql/schema/validator/numericality_validator.rb +71 -0
  264. data/lib/graphql/schema/validator/required_validator.rb +68 -0
  265. data/lib/graphql/schema/validator.rb +163 -0
  266. data/lib/graphql/schema/warden.rb +192 -25
  267. data/lib/graphql/schema/wrapper.rb +29 -0
  268. data/lib/graphql/schema.rb +1078 -205
  269. data/lib/graphql/static_validation/all_rules.rb +5 -2
  270. data/lib/graphql/static_validation/base_visitor.rb +214 -0
  271. data/lib/graphql/static_validation/default_visitor.rb +15 -0
  272. data/lib/graphql/static_validation/definition_dependencies.rb +74 -71
  273. data/lib/graphql/static_validation/error.rb +44 -0
  274. data/lib/graphql/static_validation/interpreter_visitor.rb +14 -0
  275. data/lib/graphql/static_validation/literal_validator.rb +87 -19
  276. data/lib/graphql/static_validation/no_validate_visitor.rb +10 -0
  277. data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +55 -17
  278. data/lib/graphql/static_validation/rules/argument_literals_are_compatible_error.rb +48 -0
  279. data/lib/graphql/static_validation/rules/argument_names_are_unique.rb +31 -0
  280. data/lib/graphql/static_validation/rules/argument_names_are_unique_error.rb +30 -0
  281. data/lib/graphql/static_validation/rules/arguments_are_defined.rb +61 -8
  282. data/lib/graphql/static_validation/rules/arguments_are_defined_error.rb +37 -0
  283. data/lib/graphql/static_validation/rules/directives_are_defined.rb +12 -15
  284. data/lib/graphql/static_validation/rules/directives_are_defined_error.rb +29 -0
  285. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +19 -14
  286. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations_error.rb +31 -0
  287. data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +18 -20
  288. data/lib/graphql/static_validation/rules/fields_are_defined_on_type_error.rb +32 -0
  289. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +33 -17
  290. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections_error.rb +31 -0
  291. data/lib/graphql/static_validation/rules/fields_will_merge.rb +381 -30
  292. data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +32 -0
  293. data/lib/graphql/static_validation/rules/fragment_names_are_unique.rb +20 -13
  294. data/lib/graphql/static_validation/rules/fragment_names_are_unique_error.rb +29 -0
  295. data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +37 -29
  296. data/lib/graphql/static_validation/rules/fragment_spreads_are_possible_error.rb +35 -0
  297. data/lib/graphql/static_validation/rules/fragment_types_exist.rb +25 -17
  298. data/lib/graphql/static_validation/rules/fragment_types_exist_error.rb +29 -0
  299. data/lib/graphql/static_validation/rules/fragments_are_finite.rb +12 -10
  300. data/lib/graphql/static_validation/rules/fragments_are_finite_error.rb +29 -0
  301. data/lib/graphql/static_validation/rules/fragments_are_named.rb +7 -11
  302. data/lib/graphql/static_validation/rules/fragments_are_named_error.rb +26 -0
  303. data/lib/graphql/static_validation/rules/fragments_are_on_composite_types.rb +16 -16
  304. data/lib/graphql/static_validation/rules/fragments_are_on_composite_types_error.rb +30 -0
  305. data/lib/graphql/static_validation/rules/fragments_are_used.rb +21 -14
  306. data/lib/graphql/static_validation/rules/fragments_are_used_error.rb +29 -0
  307. data/lib/graphql/static_validation/rules/input_object_names_are_unique.rb +30 -0
  308. data/lib/graphql/static_validation/rules/input_object_names_are_unique_error.rb +30 -0
  309. data/lib/graphql/static_validation/rules/mutation_root_exists.rb +10 -14
  310. data/lib/graphql/static_validation/rules/mutation_root_exists_error.rb +26 -0
  311. data/lib/graphql/static_validation/rules/no_definitions_are_present.rb +31 -22
  312. data/lib/graphql/static_validation/rules/no_definitions_are_present_error.rb +25 -0
  313. data/lib/graphql/static_validation/rules/operation_names_are_valid.rb +25 -17
  314. data/lib/graphql/static_validation/rules/operation_names_are_valid_error.rb +28 -0
  315. data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +19 -20
  316. data/lib/graphql/static_validation/rules/required_arguments_are_present_error.rb +35 -0
  317. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +59 -0
  318. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present_error.rb +35 -0
  319. data/lib/graphql/static_validation/rules/subscription_root_exists.rb +10 -14
  320. data/lib/graphql/static_validation/rules/subscription_root_exists_error.rb +26 -0
  321. data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +28 -17
  322. data/lib/graphql/static_validation/rules/unique_directives_per_location_error.rb +29 -0
  323. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +35 -19
  324. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed_error.rb +39 -0
  325. data/lib/graphql/static_validation/rules/variable_names_are_unique.rb +15 -14
  326. data/lib/graphql/static_validation/rules/variable_names_are_unique_error.rb +29 -0
  327. data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +46 -36
  328. data/lib/graphql/static_validation/rules/variable_usages_are_allowed_error.rb +38 -0
  329. data/lib/graphql/static_validation/rules/variables_are_input_types.rb +18 -14
  330. data/lib/graphql/static_validation/rules/variables_are_input_types_error.rb +32 -0
  331. data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +76 -66
  332. data/lib/graphql/static_validation/rules/variables_are_used_and_defined_error.rb +37 -0
  333. data/lib/graphql/static_validation/type_stack.rb +2 -2
  334. data/lib/graphql/static_validation/validation_context.rb +9 -54
  335. data/lib/graphql/static_validation/validation_timeout_error.rb +25 -0
  336. data/lib/graphql/static_validation/validator.rb +56 -16
  337. data/lib/graphql/static_validation.rb +6 -3
  338. data/lib/graphql/string_type.rb +1 -17
  339. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +116 -24
  340. data/lib/graphql/subscriptions/broadcast_analyzer.rb +81 -0
  341. data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +21 -0
  342. data/lib/graphql/subscriptions/event.rb +62 -8
  343. data/lib/graphql/subscriptions/instrumentation.rb +12 -5
  344. data/lib/graphql/subscriptions/serialize.rb +33 -6
  345. data/lib/graphql/subscriptions/subscription_root.rb +76 -0
  346. data/lib/graphql/subscriptions.rb +119 -35
  347. data/lib/graphql/tracing/active_support_notifications_tracing.rb +16 -12
  348. data/lib/graphql/tracing/appoptics_tracing.rb +173 -0
  349. data/lib/graphql/tracing/appsignal_tracing.rb +9 -1
  350. data/lib/graphql/tracing/data_dog_tracing.rb +28 -1
  351. data/lib/graphql/tracing/new_relic_tracing.rb +12 -15
  352. data/lib/graphql/tracing/platform_tracing.rb +70 -3
  353. data/lib/graphql/tracing/prometheus_tracing/graphql_collector.rb +32 -0
  354. data/lib/graphql/tracing/prometheus_tracing.rb +67 -0
  355. data/lib/graphql/tracing/scout_tracing.rb +20 -1
  356. data/lib/graphql/tracing/skylight_tracing.rb +33 -2
  357. data/lib/graphql/tracing/statsd_tracing.rb +42 -0
  358. data/lib/graphql/tracing.rb +26 -41
  359. data/lib/graphql/type_kinds.rb +41 -14
  360. data/lib/graphql/types/big_int.rb +19 -0
  361. data/lib/graphql/types/boolean.rb +18 -0
  362. data/lib/graphql/types/float.rb +19 -0
  363. data/lib/graphql/types/id.rb +24 -0
  364. data/lib/graphql/types/int.rb +36 -0
  365. data/lib/graphql/types/iso_8601_date.rb +34 -0
  366. data/lib/graphql/types/iso_8601_date_time.rb +65 -0
  367. data/lib/graphql/types/json.rb +25 -0
  368. data/lib/graphql/types/relay/base_connection.rb +39 -0
  369. data/lib/graphql/types/relay/base_edge.rb +29 -0
  370. data/lib/graphql/types/relay/connection_behaviors.rb +156 -0
  371. data/lib/graphql/types/relay/default_relay.rb +27 -0
  372. data/lib/graphql/types/relay/edge_behaviors.rb +53 -0
  373. data/lib/graphql/types/relay/has_node_field.rb +41 -0
  374. data/lib/graphql/types/relay/has_nodes_field.rb +41 -0
  375. data/lib/graphql/types/relay/node.rb +15 -0
  376. data/lib/graphql/types/relay/node_behaviors.rb +15 -0
  377. data/lib/graphql/types/relay/node_field.rb +25 -0
  378. data/lib/graphql/types/relay/nodes_field.rb +27 -0
  379. data/lib/graphql/types/relay/page_info.rb +11 -0
  380. data/lib/graphql/types/relay/page_info_behaviors.rb +25 -0
  381. data/lib/graphql/types/relay.rb +41 -0
  382. data/lib/graphql/types/string.rb +29 -0
  383. data/lib/graphql/types.rb +11 -0
  384. data/lib/graphql/unauthorized_error.rb +29 -0
  385. data/lib/graphql/unauthorized_field_error.rb +23 -0
  386. data/lib/graphql/union_type.rb +78 -45
  387. data/lib/graphql/unresolved_type_error.rb +2 -2
  388. data/lib/graphql/upgrader/member.rb +157 -114
  389. data/lib/graphql/upgrader/schema.rb +1 -0
  390. data/lib/graphql/version.rb +1 -1
  391. data/lib/graphql.rb +108 -20
  392. data/readme.md +8 -8
  393. metadata +213 -1157
  394. data/lib/generators/graphql/function_generator.rb +0 -18
  395. data/lib/generators/graphql/templates/function.erb +0 -17
  396. data/lib/graphql/introspection/schema_field.rb +0 -16
  397. data/lib/graphql/introspection/type_by_name_field.rb +0 -22
  398. data/lib/graphql/introspection/typename_field.rb +0 -12
  399. data/lib/graphql/language/comments.rb +0 -45
  400. data/lib/graphql/static_validation/arguments_validator.rb +0 -50
  401. data/lib/graphql/static_validation/message.rb +0 -40
  402. data/spec/dummy/Gemfile +0 -12
  403. data/spec/dummy/Gemfile.lock +0 -149
  404. data/spec/dummy/README.md +0 -24
  405. data/spec/dummy/Rakefile +0 -7
  406. data/spec/dummy/app/assets/config/manifest.js +0 -1
  407. data/spec/dummy/app/assets/javascripts/application.js +0 -66
  408. data/spec/dummy/app/channels/application_cable/channel.rb +0 -5
  409. data/spec/dummy/app/channels/application_cable/connection.rb +0 -5
  410. data/spec/dummy/app/channels/graphql_channel.rb +0 -105
  411. data/spec/dummy/app/controllers/application_controller.rb +0 -4
  412. data/spec/dummy/app/controllers/pages_controller.rb +0 -5
  413. data/spec/dummy/app/helpers/application_helper.rb +0 -3
  414. data/spec/dummy/app/jobs/application_job.rb +0 -3
  415. data/spec/dummy/app/views/layouts/application.html.erb +0 -12
  416. data/spec/dummy/app/views/pages/show.html +0 -16
  417. data/spec/dummy/bin/bundle +0 -4
  418. data/spec/dummy/bin/rails +0 -5
  419. data/spec/dummy/bin/rake +0 -5
  420. data/spec/dummy/bin/setup +0 -31
  421. data/spec/dummy/bin/update +0 -27
  422. data/spec/dummy/bin/yarn +0 -12
  423. data/spec/dummy/config/application.rb +0 -30
  424. data/spec/dummy/config/boot.rb +0 -4
  425. data/spec/dummy/config/cable.yml +0 -10
  426. data/spec/dummy/config/environment.rb +0 -6
  427. data/spec/dummy/config/environments/development.rb +0 -40
  428. data/spec/dummy/config/environments/production.rb +0 -76
  429. data/spec/dummy/config/environments/test.rb +0 -37
  430. data/spec/dummy/config/initializers/application_controller_renderer.rb +0 -9
  431. data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -8
  432. data/spec/dummy/config/initializers/cookies_serializer.rb +0 -6
  433. data/spec/dummy/config/initializers/filter_parameter_logging.rb +0 -5
  434. data/spec/dummy/config/initializers/inflections.rb +0 -17
  435. data/spec/dummy/config/initializers/mime_types.rb +0 -5
  436. data/spec/dummy/config/initializers/wrap_parameters.rb +0 -10
  437. data/spec/dummy/config/locales/en.yml +0 -33
  438. data/spec/dummy/config/puma.rb +0 -57
  439. data/spec/dummy/config/routes.rb +0 -4
  440. data/spec/dummy/config/secrets.yml +0 -32
  441. data/spec/dummy/config.ru +0 -6
  442. data/spec/dummy/log/development.log +0 -599
  443. data/spec/dummy/log/test.log +0 -1220
  444. data/spec/dummy/package.json +0 -5
  445. data/spec/dummy/public/404.html +0 -67
  446. data/spec/dummy/public/422.html +0 -67
  447. data/spec/dummy/public/500.html +0 -66
  448. data/spec/dummy/public/apple-touch-icon-precomposed.png +0 -0
  449. data/spec/dummy/public/apple-touch-icon.png +0 -0
  450. data/spec/dummy/public/favicon.ico +0 -0
  451. data/spec/dummy/public/robots.txt +0 -1
  452. data/spec/dummy/test/application_system_test_case.rb +0 -6
  453. data/spec/dummy/test/system/action_cable_subscription_test.rb +0 -45
  454. data/spec/dummy/test/test_helper.rb +0 -3
  455. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/-5/-5OWGoO21F6_WNuECrXgkwH7NcKlWSSe2GjVanwsmUk.cache +0 -0
  456. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/-T/-TNJ0-j8HjZCYUE7EDQlhfGu64B8guOUPkXYO6HFhus.cache +0 -0
  457. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/-x/-xYZjAnuuzgR79fcznLTQtSdh6AARxu8FcQ_J6p7L3U.cache +0 -0
  458. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/09/09tM9-9HC9J7np7PawoxLz0YZYB_jmwdMFL4N4WBJdM.cache +0 -1
  459. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/0H/0HR_baZ3Owzw1Gx5epPCDhsl0UXWGh73zDkQu08IHuc.cache +0 -1
  460. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/13/13HiV12xyoQvT-1L39ZzLwMZxjyaGMiENmfw7f-QTIc.cache +0 -0
  461. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/1I/1IbYhe7oTUZvWCe0pIMBMp5bLq5pCuxuxlgnQV1TAno.cache +0 -2
  462. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/1I/1i4n3ptJre3b2zbA9AvgzE-ThTU_1mqSX3AlMtS_Qxk.cache +0 -1
  463. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/1L/1LQJg_vkfK3o2UCvJGQKuGjXydCfw7GerrpJCGiKw5k.cache +0 -1
  464. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/1U/1U5446rsEAdkd13irJZX_XQoEKv9Ay8wSrKES_-gD8k.cache +0 -0
  465. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/2c/2cKLFtRkYbS9lni4MJ8unG2jW0YmNgK6tdelamzjM30.cache +0 -0
  466. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/2m/2mGtEm87jDbeppJBYdnCWjRDV5cQaosG-bKVwVN7_kE.cache +0 -1
  467. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/2p/2pt2peFCVR6OoIrgufIQbrDGMcFLYwrJtHsLENF31jQ.cache +0 -0
  468. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/2u/2uWP73mE8FRywvUKKT08RhFuNUlVUEopIKdt0Jtt8y8.cache +0 -1
  469. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/3-/3-C6wEhMG8qKt4rLfzJzMlRBgxb5aDJIB2m5WS0WbAI.cache +0 -0
  470. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/33/33_yR0KysvUnUWvR5TzwELDqGApTbi2ex2o3vY-ybfU.cache +0 -1
  471. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/3N/3NTAQ9mVEZbccGibE39JpeqlDw2L6zcUtlRsbPCT918.cache +0 -2
  472. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/3V/3V8ZntS_gc1fums5LuLZK0a_nwPIjLXSD0JNF_3ScEk.cache +0 -0
  473. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/3W/3Wtf5pCWdqq0AB-iB0Y9uUNrTkruRxIEf1XFn_BETU0.cache +0 -1
  474. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/4U/4UAd9Le8LhEYS8mCovy_yQC_ofpTBWt1Q997x0hg6xY.cache +0 -0
  475. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/4V/4VaOsvficwh2EmmuR-pEJTISpR9mbr8Cf7jYYyptEwY.cache +0 -2
  476. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/53/53WajXFPOCZVqMrL7nxYAYl90fSweya9XM4vrDJhU6c.cache +0 -1
  477. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/53/53oHiwCXSKokJPEWS6w53bGXkeZm-YAcDuXcBhNscEY.cache +0 -0
  478. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/5Q/5QrnrmEh-kADCXW4bexyNOrjfDmlq_YHgPcEYcHtz28.cache +0 -0
  479. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/5T/5ThW8FwEh4SPqrxD1RKHSc3o-vA_2ff5zKoly--6uuM.cache +0 -0
  480. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/5d/5dGYuqW7Lp3oCc1lq8B9Uoa0lfgE4iOEiGvgwRf1JHA.cache +0 -0
  481. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/5f/5fUAiOa1Zm-ove4HOeSLN1OQmEMHu0OYjHrYIK3-SGE.cache +0 -2
  482. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/5f/5flfgUDFCRhrUbGifk2RfSEGWOBMubAcaWg4ZadI5PY.cache +0 -1
  483. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/5i/5iW33HH6azj0ds2lqDaOB1666CY_uOHhVAQavgh7tYw.cache +0 -1
  484. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/5i/5iguGafb4hOn8262Kn8Q37ogNN9MxxQKGKNzHAzUcvI.cache +0 -1
  485. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/5m/5m0G50I6WuIDftOEFtJHjC0KmN1mnhe51wBZ2dq9la0.cache +0 -0
  486. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/5m/5mzbQNNLQ1vmll1Azo5cAZpDY2Zc7C_CLYJH2zKtzYY.cache +0 -0
  487. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/6K/6KeDYkyM_nd3JJSp2B4HtcpdeA3uHgJLSlRaEVpH328.cache +0 -1
  488. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/6V/6Vgv7g9Uc08fiIpuLxlhqPTfx6tGo1yLedmmUvEL41A.cache +0 -2
  489. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/6n/6nd7P_DUqcusZX7UkA5TILZyMrcu-AYfxnc2Kz_J0qQ.cache +0 -1
  490. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/6x/6x8om3H3i1stGMEt1wnZ3OsVPGj-sxwE-eyd7A6hSi8.cache +0 -0
  491. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/70/7037jorQaO3wUpzYOJoDOd8cgJMeC2uTysojXmeaYzs.cache +0 -0
  492. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/7p/7pN8wYS-6xc_x5BzT4gRgFAiVGhhcW9NHg_e6Ng5CDw.cache +0 -0
  493. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/7r/7rgR5Gy_i08FxXwdCvtqSCXSghB7e5EXB2Vox4MQVUg.cache +0 -2
  494. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/8Q/8Qz_ptqTPNDlaE2aAVgaFiIBByiF2fhNHKQJFggzJYA.cache +0 -0
  495. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/8e/8ezXMOIySx7oyopI2nH1EXfCzPCFHTJiS3q2tvyEZjY.cache +0 -1
  496. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/8m/8mj2T6yy847Mc2Z7k3Xzh8O91hhVJt3NrPe8ASNDlIA.cache +0 -1
  497. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/8w/8wY_SKagj8wHuwGNAAf6JnQ8joMbC6cEYpHrTAI8Urc.cache +0 -1
  498. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/99/99m8UCKl4j8IpsVOK8ltLHyNh8Ae0nHw3GBkC34V_co.cache +0 -0
  499. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/9a/9abVi8XfoB8pGShaL5_-jzZGJIxKmedpFY0HQ5h24oE.cache +0 -1
  500. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/9g/9gsAnrIrurboVInpkI-XlUZdUGmshgVKXpdRCtXUt6U.cache +0 -2
  501. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/9l/9lUXwCLUk9jTC-3kZdXDSRo-klgJVL54qVOIQmKxlyo.cache +0 -1
  502. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/9z/9zFndwRgSOtYlsafWZK_zfCvnqMF4Vv9IqkVxn0gUbM.cache +0 -1
  503. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/A2/A2LHSq1LhqpUvGzPhj15d7c1Sj2RkYyajxf8ipO1x0A.cache +0 -1
  504. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/AO/AOgGJjES3shgkGKKaEb6GMfcfUm18alfRVbYsMJKFyc.cache +0 -0
  505. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ag/AgIFaB92zNMX4-Gy1uYelrx1pnszMI9CxP0aO62ismQ.cache +0 -1
  506. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ag/agBYa9WG7ZT869eaOCVQ4mfpe9AWU8oNjU0g9foJZxk.cache +0 -1
  507. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/B4/B43LeT9Wba4fLvXw-C_kKq-x9HwYZxnBBiltbIufzzQ.cache +0 -0
  508. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/B4/b4w856SSmGPJvZoawjQ63nUN1himU_z41nfZQNGvdag.cache +0 -0
  509. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Bg/BgLjB8mXnvRh9DrKcGI_KblFPuA84hjh4nJC50FDsWc.cache +0 -2
  510. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Bw/Bwb0DDjQm45Eqy64G2YHrm2eOj1PkqG51Hh3MWG0V40.cache +0 -1
  511. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/C4/C4hGtajZFD6B_bt3ow2qxPGLb1ycjE_7G8Ssi2q5HuA.cache +0 -1
  512. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/CA/CAI82me2PN_gR-kiw8xQDx9FQBiLj_cyO4HVfZfiqf8.cache +0 -0
  513. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/CR/CR85EGUmeGMQQR96qjUurW5HSk4vr5JgWDLQEFxhnAY.cache +0 -1
  514. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Cn/CniRwlPjVCW9FLyHc9oNHIvE-TdlvyAP-lAOrkSBsQg.cache +0 -1
  515. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/D1/D1ZVypz4A_qF0cewMs2YiW5uWi7MKEdPOoOXeBQKeL0.cache +0 -1
  516. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/D4/D4osajB0M3Tk4bo3qAkcpkXlGHReFCOJxlo20Deiqk4.cache +0 -0
  517. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/D9/D9cZjx3n4E4qKXoR9rROjaYWpm1nnip45O0Ubyqyho8.cache +0 -0
  518. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/DP/DPvPPYoq_7HYVvKapcWxWL0bSIyINU7Oc93He65SrAk.cache +0 -1
  519. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/DT/DTQyMpr4ABZYQetsdRJ5A7S4jf1r3ie4FGOR7GZBNSs.cache +0 -3
  520. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Df/Dfl0fgtV2z9SkiRUCnFBU6pD3TPmL0rI_lUqOVSglz8.cache +0 -0
  521. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Df/dfOhvqqzI4Yxr6VUUn6T5DARFk5SNeEasmpVaiBivxQ.cache +0 -1
  522. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Dl/DlaCy1X82C9F58mF2UUes54AZzBUIGyuFiZEc9PUW0U.cache +0 -1
  523. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Dq/DqJ5_yJPrP5iLlOQyTQsjAVI5FE5LCVDkED0f7GgsSo.cache +0 -3
  524. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Dy/DyHdMGh9NYCQ6KM4Cs6ySrmxIGQLcs3urJo2ni_GHeI.cache +0 -0
  525. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/E8/E84Qt1hM8br74RgXrkdGt8CGM8KnVROweUTPah6hpao.cache +0 -0
  526. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ea/Ea7ca7cxAj6u9A8UKN2ZVtAFE3GXgmTZtHiorPaUnTg.cache +0 -1
  527. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/F8/F8MUNRzORGFgr329fNM0xLaoWCXdv3BIalT7dsvLfjs.cache +0 -0
  528. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/FN/FNAoxlHjPOpzywpYUXo13-PLULLhE4lZ8jRmsdCpQ8s.cache +0 -2
  529. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/FS/FS-IBIwKNJB6ey4YiEJy3WQxdihlzqhn27zuXCPW3I4.cache +0 -0
  530. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/FS/fsx-7r5CnuEuuruO05WoCqUE7I7yHdsHFyufpAo9L_w.cache +0 -2
  531. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/FU/FU7chcPDGpikN_If4SNgCUiwKbAtWa-dV0x644C-R8A.cache +0 -0
  532. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/FZ/FZS5A8sTziH2yLSQsehYe2Lov6tTh7qddnYpUCOrSg8.cache +0 -0
  533. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/F_/F_wHSssqVgbtl2xnKiCAx8T1yXJcm6G6FFYyEQOM1vk.cache +0 -1
  534. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Gx/GxO9oxH-DZ8Vk1eqP17OKFSocWisT4gGJtcGM1t5Fio.cache +0 -2
  535. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/H6/H6QLQGIr0MZMFEBwWkJpjKCoSmnCM1d1b7Z2bT1pchI.cache +0 -0
  536. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/HC/HCDOUd7-S45aJ_PjVAC_Vmjyud3i1aQv4cE3t9_Z3Dw.cache +0 -2
  537. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/HN/HNBghWjxKPnFYO5L6fJf8R4AeZ0rdAOL6sUFWovnBwU.cache +0 -1
  538. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Hb/HbX5bR5UYD1vbffHD_0rvCrL9QARJ6bCpD00MQdR1g4.cache +0 -1
  539. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Hm/HmOkSBI1TuhJ1te9t-y9GHxMWn2FVl-RnFS8oWi7V_w.cache +0 -1
  540. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/IN/INJypnigTMfqqPOcC-b9F0Iye_HbwItx-5XDHLUtWDc.cache +0 -1
  541. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ig/IgW_xNyC9axLdFbnQLpkLYqhAzSgmdACo0mT8ai455Y.cache +0 -1
  542. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/JY/JYy-al-c4ButCglqQfY9a5PZV6XFNBjtHD9sWas7NbE.cache +0 -1
  543. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ja/Jah1OygWPoT6OkBv-5VE19u3b0vGJTHsGse68OBZmtQ.cache +0 -2
  544. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/K0/K0-nXg3QbjeMtvvRvPXZiL0kCh0YtyApX9XrJrj95Po.cache +0 -0
  545. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/KB/KB07ZaKNC5uXJ7TjLi-WqnY6g7dq8wWp_8N3HNjBNxg.cache +0 -3
  546. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/KI/KIVgv3yfi4fSugBTELntGMTgpB8JKD1c5_CxdEvkfaw.cache +0 -1
  547. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/KO/KOgbmY0o5uemlVX1FmoTnTDK6QDnydWoRF2Ht9TtN2U.cache +0 -1
  548. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/LI/LIHDRdjIBdKfW4tnKTESwsWFz4OeCV-sJZtEKUYaLiU.cache +0 -1
  549. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/La/LavB01ePIpCqyhy1AJu1V9piCEAYuTyS5bjdSEVqEoY.cache +0 -1
  550. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Lx/Lx6tpPxpS0hrFKiVXiv37Q4bFJjhDJJak7WUoOemLC8.cache +0 -0
  551. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Lx/LxRPPEO9CB_ckDd1jRPcKJjsm_Gc0CGMSmrdUXXpzjs.cache +0 -2
  552. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/M6/M6hnb_EIRICxNcrNSkV7ekfCpVo0O9U2XSSaLxDqONI.cache +0 -1
  553. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Mq/MqwfYiRcCBhwwS_cH5IyKUMsvSreSqmpD_WV3AHeZcw.cache +0 -0
  554. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/N-/N-bT7IhQ1pVoh_gTwxXqeK3dVlmJkxatBZyFP43Si3I.cache +0 -2
  555. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/N1/N1EMMEzwuRyuF1gWtXmBNA8MMh4jYud3NP4IQ4_6APY.cache +0 -1
  556. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/NV/NVd17BdcRmpEVFGZDHcRFIgNC2usd2N50atmE6dfOiI.cache +0 -1
  557. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/NV/NvHlFPeFw2ONsOqGrVoMfZKZNz-6Hio21cxECqHgZd4.cache +0 -0
  558. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ON/ONTTDNMWFhjcmhKbOP3KqbRtGvxLORP9OH6wMiCk_Ys.cache +0 -2
  559. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ol/Olkqarn5mhfEd6uRArgjaOA-B1ZXvvcXpuIFVyoDAXc.cache +0 -0
  560. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/P-/P-STcrlrr_UHY2DAzJOcMU2FOt1STMToqoJ3hYaAEEE.cache +0 -1
  561. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/PA/PAJgjBwkjHBCPPw8wWUsKsUR7TvgP4RK7PV8-Jdqluw.cache +0 -2
  562. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/PA/paWxJFaOGYb5g3bPUex7k8lTzXqbJ4F0Uw_zBZI8XxU.cache +0 -1
  563. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/PP/PPmjUfdcsG-U5YdKOGrvFGoDVweIuWHjIggt6U2rRIo.cache +0 -0
  564. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Pm/PmTiqVQJ4334Q0J-QCdlEdApesHyk8Lwuunb-_RivmU.cache +0 -1
  565. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/QY/QYJsCmNADCk6tDZF57r1lz6gqD88LSPkQXtY3Vm-uUI.cache +0 -1
  566. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Q_/Q_J_xCMNzLrUyke5pUNpWmyoVj_lW8yCigUKNE9FyXs.cache +0 -1
  567. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/RB/RBv3Nnh3mIqYx7YWNYxr9uuJlQKt0sISacYDiDkOJ3w.cache +0 -1
  568. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/RE/REff4oUdSjRZwuhZkynEkMbvKkAnflI5V3ti3ZCXtO0.cache +0 -2
  569. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Rw/RwDuCV-XpnCtjNkvhpJfBuxXMk0b5AD3L9eR6M-wcy0.cache +0 -3
  570. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/S2/S2ulcWK2u8bC-jxhkG5P2oDyoR91wKtZkw6I5RfTz24.cache +0 -0
  571. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/SD/SDQnsrLw-b0RFX481lQQF9x0HiZaefzuBAuOj3cwo9I.cache +0 -1
  572. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/SD/sDGKBkb0LsWWFOmHNgz4ahOe6iLlCfJ8Zy8iInv4teI.cache +0 -0
  573. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/SM/SMCVX47Gg93AptU_3a66VblIT3KLHqKrkHHuMhfPIxk.cache +0 -1
  574. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/SQ/SQPrFInSYpfPUMfXYJXnph6q8eAFQsL_plvmqSwAVEM.cache +0 -2
  575. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/SR/SRppQZkF9KwCpA8Ud3swxGKHJUSM5M75OTHlmfiTeAY.cache +0 -1
  576. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/TE/TEEzQHAX6KOPY3AIg2OPhwQPpIrKlcqGJnqKnvz9YDE.cache +0 -1
  577. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Tr/Tr5ExKD0jPytz0PJn0sVycLrI6t9y-4wGKO4MTwzi2U.cache +0 -2
  578. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Tr/TrY4Ml48luBYhVfMdvwlyB7zO-QQQaWIW7ORlLUnYRg.cache +0 -1
  579. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Tt/Tt0V7r8e-tdXVEGXDjN31D88EHb3z-Jo47tXWmAPCwA.cache +0 -0
  580. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Tx/TxxBMsRYAeLcndv5YuF1FkCV30qi1yhYI8AzTki0Zmo.cache +0 -2
  581. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/U9/U9dnnrqeoOE-mYHdH4XmicZAjMQbjhjXdiA8VlMGsHA.cache +0 -0
  582. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/UA/UA89Y066oW41G1gWoHWdEXcPU2JZ66j8dnXKwoc3yJc.cache +0 -2
  583. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/UK/UKklu-xV4ZGx7P5-zWqENrlHQUaedqEuUNTgezjc3g0.cache +0 -2
  584. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/UL/ULdjhhb0bRuqmaG7XSZlFYzGYCXTDnqZuJBTWRlzqgw.cache +0 -0
  585. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/US/USYEqEC54xCRgdxfID_BklmAl2jIXZAKJ9BhapbMqNg.cache +0 -1
  586. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Up/UpPNgh0yYoUsyMDh5zWqe_U6qJIyTC6-dxMMAs1vvlM.cache +0 -1
  587. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/V5/V5dKKdHyA7y6N44igdqPBARmoV0tYdUsUrmf2lJkF6M.cache +0 -1
  588. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/VJ/VJ9Lp37PnSDzVOvhSVhKc2eG-KOuv3bRFxar6M8LLnA.cache +0 -1
  589. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/VP/VPf8mKPeiYU53d-M_P60d-YL6wdTka1rTVRa4F5dB_k.cache +0 -0
  590. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/VY/VYJV9KoRx38NfAvSvXouEYF_0k-Su_KdFuSSXPOoSOg.cache +0 -1
  591. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/W2/W2nmNoF054n5uT-S7jhvUpaJqxHYWiJnHNP8fbjwjj0.cache +0 -1
  592. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/WA/WA0OKbW1ShDLWAbN4voLShkG6JaNjvWeSNF3ZpLcUqY.cache +0 -0
  593. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Wg/Wguh-szFGTI1gaL6npYwPekMXflugRei7F_mOyRucXg.cache +0 -0
  594. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Wr/WriMHycrWjgHpmRpAo9N4nvDB5T0lBL5EOTTUQUHwn4.cache +0 -1
  595. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ws/WsHB1qkchRYVF4JV0Yqtr-QiyZ26DiLFtKTrCRVc5kI.cache +0 -0
  596. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/X-/X-khLYMA9mqFRPg3zAi86mREDxpKl4bdKYp3uF6WHos.cache +0 -0
  597. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/XD/XDRDiP6A_Qz7pCCfZHYO6Xfob7trS4JQQoX_ByuWnRI.cache +0 -2
  598. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Xr/XrGClLu5lOe_6gWU_Nm-tCAC6tUCFpoTPwyKLHmrnNw.cache +0 -0
  599. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Xu/XU4k1OXnfMils5SrirorPvDSyDSqiOWLZNtmAH1HH8k.cache +0 -0
  600. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Xu/XupuIipXyzmZQIRfy2SfGTCS21Y-sBxWWjFWmnxYllM.cache +0 -1
  601. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Xx/XxkX9e-7J9By7nLHpwyUoOdUJ78twXYUefvXKie2WkA.cache +0 -1
  602. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Yf/YfGn3oqi1Sm1_rHBqpmph8QpfhWTITbEUWS9waD_HKg.cache +0 -0
  603. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Yf/yfhQwhH-ul-osfCM7_EXtSEeujd0TqsbqPoVgj7ehi0.cache +0 -0
  604. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Yl/YlIiT75oC_1vUeD7NoTHufIKf1Tdnjg82aJbfI79WGQ.cache +0 -2
  605. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Z-/Z--HP-BzybXzcZ6TPTFHonJqTM1B3B2g-5uUSi_EuSc.cache +0 -0
  606. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ZT/ZTVpqYlcQg-w8iygSuUB7UBreT5bxLOPDNlKjzg5kMY.cache +0 -0
  607. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ZT/ztYH9puOw0lwdIjwlH18IT68aY0KvTPEiAQTrxn4doQ.cache +0 -2
  608. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Za/ZaT_Lz8qe4rCd9sYS8dWxhl6MB_pWFUu7sqohGkRsAo.cache +0 -0
  609. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Zz/Zzsh2ASGqBSWLSWIU4fAyxS3iVuJDxdTCw8jOOsUNzA.cache +0 -1
  610. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/_-/_-Y1fY6ejeTyiaDheuPSN_aPVwcvRdIlowBkfFxEY0c.cache +0 -0
  611. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/_6/_61xcFfBTsk2JixNV1J-NP9FtW67n0Haapr-7H5toEU.cache +0 -2
  612. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/_R/_RQaUmRUEEXsJ7wurDZfjh63xJqRWfkCTDSiA0pvOIg.cache +0 -2
  613. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/_m/_mRvClvA9ew3lpKq5JBpjPY232J6bAj9K_XP3N2HFD8.cache +0 -0
  614. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/_z/_zNZb_3SH_fXs-tDFm3LtWun9BlLzBVn3aDO9l6K-NQ.cache +0 -1
  615. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/a7/a7lacDViLUEaXFwV6UuZfTUood23K0X7_s2YYxP7dQw.cache +0 -1
  616. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/aV/aVdjJbgLyd5MLwvnXSaX_83wDD0zG8DQnKs4hlOXOJ0.cache +0 -1
  617. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/al/alJwyXpJHF8RaBpaslorYD4Et6PO_-7Jr1qQmR_Wtys.cache +0 -0
  618. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/bC/bCSJnsDI4K9-Hwd7p_GC9M36gA2QbYgtfl-Guk1Ev80.cache +0 -1
  619. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/bM/bMopwpsFeLUsi20J9L9mPnoi6ZMJMVHIzxbTHbWrBho.cache +0 -2
  620. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/bd/bdikSDf26RlvOPFhOT9G-XHnMj8ptHrTYB3QUuABCUQ.cache +0 -0
  621. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/bi/BIkdhfxsezxM4q-HZ4oCNTq97WEJTigcq0tpX2cDvbY.cache +0 -0
  622. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/bi/biczy7hoa1_tzXKc6t2QU3WdkhkfdBfwwq66GVVz914.cache +0 -1
  623. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/bq/bqRZ6xUe_GzjdFbiyk0iMQoNHY4xk1gccuw3l8KUJz8.cache +0 -2
  624. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/bv/bvfgzCTJxyiwgFWSXthcO14iFDl_K1NuT0vWVXcI-WU.cache +0 -0
  625. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/cZ/cZw-zK9k1to5xz_hZ8FQB5wpR9Ks1-bhn7kJJVu9Ki0.cache +0 -1
  626. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ci/cipvvZ93wZHrDs_W1liu4PQTEJsKuPhbk6JG1DsMfxM.cache +0 -1
  627. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ck/ckLh5gBuqdrZ9fuxYz87cU_3hhZMI_7tcqNJ2EjtgpI.cache +0 -0
  628. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/dG/dGyq85wVf9waxk23R1VlUQQMflMpPSsiMOTM9TtZ1f0.cache +0 -0
  629. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/d_/d_Ckuu1Nlhrqje-LDVqGwCu8pLiyAX31uSdo7QCELeI.cache +0 -2
  630. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/db/db0UgKlp2vcgigF3FfR0UlilfVgDEJuew9qxLsuR374.cache +0 -0
  631. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/db/dbXmPOhlH1AKN08KRg0ow8KOe-_XKeBNOg0HJvnqQCs.cache +0 -0
  632. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/dr/drw7hbVGSDH0ujUo0r9Fmfbjvw8_eoOc6fCktj5IKak.cache +0 -2
  633. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/e7/e7SEwN9e5ctMuXdXSRM6IB2fFMiIP2UAmvXjDKktd5w.cache +0 -1
  634. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/eW/eWG0d21oPZQGuYiCLej8OsRayN0--zxnvn7KHFqrQus.cache +0 -1
  635. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/fA/fADdr9ULIrFxI-36hG3S8yfvCp2VHyR6WzSZNIPM3C0.cache +0 -1
  636. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/fE/fEt1GN3H2qJiB0PwX6Cd43UrRkzLxTRIeUyyrydPe_A.cache +0 -2
  637. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ff/FfxmA4CMHQZT7exx0G7NS1Wpcnny0vzp-Jhc2H36bp8.cache +0 -1
  638. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ff/ffguBp3lFlcLuH9rWtl1JJxs9dDTIfm-FCMONYpUdww.cache +0 -1
  639. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/gE/gEiiG4GZNy_djEjK2pHm_NgA-gyhLZhdQvo0Yt96GqE.cache +0 -0
  640. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/gn/gnA9ZSqpjccNL2m8pe_jBvY6SinXlCzXDWyop83Od8s.cache +0 -1
  641. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/he/hepQXqLZteSsVIUXJaeKnrpVYKb53gbWe1xr6tuFN3Y.cache +0 -1
  642. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/hy/hyMfoAGcpyTZYoedJT2E2u3X96FEwATK-lIPMFlN_bw.cache +0 -0
  643. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/i9/I9UL3IEpQ14Bi9EpF3TLd0P5Rabp6ulJbgz2f1o-neA.cache +0 -1
  644. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/i9/i9lFglNaFPcJgnmxvuMjrY_R8pXY0CN9SiUKFgVFPSM.cache +0 -0
  645. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/iE/iEzDISmI13GuIeJehYePCIVyUe7XZ-_q9pvIv0UzneM.cache +0 -1
  646. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/i_/i_hzz-9VlGYj7yvx9yYWRKRw2UwxqFHQrRZw6vzXsWc.cache +0 -0
  647. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ij/ijLUBXXLleeHIaUQp-SQmpq0HpH94rYlbW5OJbKpnsg.cache +0 -1
  648. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/iq/iqPK1x8VfJwa8KcViAxJc6WCCa1dqE_7ubcbyoyjecg.cache +0 -1
  649. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/iw/iw-6QMCNXnMzL5koGPyFgnCllIbeX88-V7N5GRRqxLA.cache +0 -0
  650. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/j2/j2NpPyjDjX23FPlgIi_Hf4oc4HH6a74elyfPP9wF0jU.cache +0 -2
  651. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/jK/jKof1JYBdCVS3OYs9Itw8Fbr1nIPR8DLSEB8WKSDLyw.cache +0 -2
  652. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/jS/jSnpKdnMVeeGtUODVf-9I1I3xvGWQr4uOtIB8Oul4Zw.cache +0 -1
  653. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/jn/jnwTDvpqs0w9VZpZ5GUZ60o6cpUhzgo69c_ooHHmNvM.cache +0 -0
  654. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/kU/kUok4qdkoYsQOP59lJgy9rPyE-T3sh8l0dVDE6KzfeI.cache +0 -1
  655. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/kv/KVJz4npl0nKN-Dp49qjcOml4Tpxq_AZ8RNO1Bi387Is.cache +0 -2
  656. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/kv/kvTGOzOr1lqLnY61yqldR_vtHpoCKFYDFpl7_fnCtcE.cache +0 -1
  657. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/kz/kz7lpLb0SoWDdaStz39DkoaQykVp0h3Jl4agZcEh6L4.cache +0 -1
  658. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/l8/l8UyUr0lncdtUUTZFwO0ulkW8Bl3z83viCwii7OewZk.cache +0 -1
  659. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/lH/lHDGd3_dxi_xz9n5_wYFy7hKMxp78Q39u_XQKZWub_Y.cache +0 -0
  660. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/lO/lOAan3cMwCE_Hli6gsDML88xFNfn0nxPmvrSkW7eEOw.cache +0 -1
  661. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/lU/lUmP4mi3T8xmwS_odQgw8llzs35KCOMZCTv0DANy9dM.cache +0 -1
  662. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/lY/lYdwx9C-FXcmiLA5bsEfQIBwpcg3twu1lz6rFXROyCI.cache +0 -0
  663. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/lj/ljpGLuZae0hOTv1h7MGCiJ30O0qhPCuvEKLhD5zpV8Q.cache +0 -0
  664. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/m1/M1pv8MJEPLXGLvS8QxVh3DSO9cI4mRt5FHFWdrvUj6o.cache +0 -2
  665. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/m1/M1yW7a2h3VzoyhwmJIKGEXjCQN8GsQcnvcKaklurytE.cache +0 -1
  666. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/m1/m1jB-0OsQz_CCr-Q_KIlpfF7BsJBF8GXMfk9pZdJsdg.cache +0 -0
  667. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/m3/m3WJ72qtNo4wVe78N9YRArVH33D15hEwdVd67wJbvOQ.cache +0 -0
  668. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/m4/m4EE0-xa87oylMzux18a-d2pR0zDtF2GCbYzwdSvQH4.cache +0 -0
  669. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/m7/m77qH7ZqH0_0SmwJbiKGDd-aLau1Dav847DC6ge46zY.cache +0 -1
  670. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/mS/mSWxg1xZbGaeYGDXMe8nsYZC_LfhiNdjSTL2J2ELE0s.cache +0 -0
  671. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/mb/mb6HAyivnzHzDrkN35ifr4kL7MuksZYWamdJBUjhoHQ.cache +0 -0
  672. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/me/melFFxMi_bgtkEkztQhKusyFDqKEeVVzurk_1_TPt6A.cache +0 -1
  673. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/mm/mms9rxcyPm09RjefBI321LIRPUAobgQ1X4A8Uu4w9Fc.cache +0 -0
  674. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/nA/nA0Bu-48plSRK0cxt2gE2-TXvwcDsTjvHLFR7KshbPY.cache +0 -0
  675. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/nA/nAGwhUtXjENu4Jl3uTJFFRnDhJAOlMAmuju7JcllSRM.cache +0 -1
  676. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/nN/nN4lOF8mi-IWkm3zsqohaHbvJS4uG-_tiFsB6h1PsFc.cache +0 -0
  677. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ne/neLH-4_-lhKrkmcWjkrdYAoT5xDuc9EzJ5-81ZXeeXc.cache +0 -2
  678. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/nj/njVJUsm_4wugUz9SwMbITIhSGErMWqSZ16AEUFn2RHo.cache +0 -0
  679. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/nq/nqz2Ja53LHhXhFb6ChNpDKnBMWNdp17ZtNhrn-9wdR0.cache +0 -0
  680. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/oY/oYHos9r6mwOX5jDyDTWjnpRR_SvWe4EX9gAl20Gqj8I.cache +0 -1
  681. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/oj/ojlR_0dl68-YErHzTDzB8lO8nKxQzG6x_Axc5oWIeBg.cache +0 -2
  682. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/pE/pE7gO6pQ-z187Swb4hT554wmqsq-cNzgPWLrCz-LQQQ.cache +0 -0
  683. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/pG/pGc_RfrP3RwCp5SBabj-nGnfyeSnUp1Ed1ajCG5Yx-A.cache +0 -1
  684. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/pQ/PQZm6DUZqIXs_3Wo9ISeQRb0vYyB0XG7iGSHr9_TWlc.cache +0 -0
  685. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/pQ/pQXlqH4DBItuAHNMXGnwQmnzYkwJ2m7kUgKQbdbZM1E.cache +0 -0
  686. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/pj/pJtdFKizdxA_xBjuuXQWYnEvCcImUQtT5Rh-tGG6v48.cache +0 -2
  687. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/pj/pjg7FTDRmEzqh8W3ijd1Y3GbffQuQwwSKEZ6ftoPnJE.cache +0 -2
  688. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ps/ps7w7RIcMoa1jxZu4r5mWxnZzl8qM4Bs9AietV5a9nU.cache +0 -0
  689. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/qU/qUif8_vci3i4xpLoHjkoVXT-baN2Z_qabhqo2Wl1KU4.cache +0 -2
  690. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/qf/qfMsgo__LLXJ_4thqBkUaDYPnaucsAJhMl6uN74w1GM.cache +0 -1
  691. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/qj/qjbZ2Uz7G_0aKEQT3Nmuu0k2FkDTmVTemeoG3gw3oSw.cache +0 -1
  692. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/qx/qxng7xwKb01YKazp0ij03cuEDbzSNSakHHwLx7XNEck.cache +0 -1
  693. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/r5/r5EpktDep6rAU9paabInRkyyMPudlyFSWlHRFmSKXcI.cache +0 -1
  694. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/rX/rX6desISJ78BGVzR2gPZKb2BiWY-N596DjfIgaTTkew.cache +0 -1
  695. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/r_/r_57OZEW0SEEUS9tJZwHYMvqjkbw3-3qfgomLAKJzoE.cache +0 -0
  696. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/rh/rhT44pxmkWo5fhkEb829kceOiGof5L5L55DT5Uv9LKQ.cache +0 -0
  697. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/s4/s4BZ5EXO5EOticOtqwWaw3qjnMod3t0AfgXahBpqSZA.cache +0 -0
  698. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/sj/sjRjnjRB37lH2vrgtkdJ8Cz84__IJ978IuKTM7HcztI.cache +0 -0
  699. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/tF/tFofktc3WRxmXDS1NTWdUstzycUbsShJBMHatxLvxqQ.cache +0 -2
  700. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/tL/tLQy_cVJ8R8R35MKxmAuxHklAoaJTyXFO-eL8dXcMKY.cache +0 -1
  701. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/um/um1JrirR4hJhK-1rE-HywlyCi5ibgxHVrReiujZBWJM.cache +0 -1
  702. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/v4/v4fwVytD7ITcE0_GDbslZEYud8a5Okm85fV1o7SDl6g.cache +0 -0
  703. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/vH/vHyq2njTP0fsOdOun0eFn07YnFCTmJJkD89-pJ9tKYA.cache +0 -0
  704. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/vK/vKDpBE4UJEuJjeJqLtVQSQ7wHxJ1ywxrRt8Y1XQBxtk.cache +0 -0
  705. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/vK/vk4eyljHSm11GcRNbA0QEqn13Y4bEfxOcBwiesL-XvQ.cache +0 -1
  706. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/v_/v_0PAQt0iipQjFP5zjgkkk9Stnpf4VzvnMv67d1Keuw.cache +0 -1
  707. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/w6/w6JBeSUs8dNJNtbRF-HVG3csGda2FlttAEBSpSHoqcE.cache +0 -0
  708. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/wc/wcSdAX-yztEvzKx_xYHtqxT47ZyaLoLal_vKwPxEP08.cache +0 -2
  709. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/wd/wdT9U4MKxe1PyqNjVuCKMpCl3dxGCIRJIlwUTfh2DQU.cache +0 -1
  710. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/wh/whuY0tTNf66sTcgILzLfelCAHIBpDZZIiOIuI12HNQw.cache +0 -2
  711. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/wi/wiKqSHxw-MJpM466KPFAcPyzBHxbpGGYW578TqFEJeg.cache +0 -1
  712. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/wi/wixK89IvA4Xk2MyJxkyLg-2xRs2vRPzY_OIs37bi8XA.cache +0 -1
  713. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/wz/wzY0ol5RRJK1j-hK9nckKoTMWK5TJDii5QSZMGTu5hk.cache +0 -0
  714. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/x3/x3jUhlqTEK-rA6zTC8_MWGyKD8tZRhz2nPu0nCBgEGI.cache +0 -1
  715. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/xI/xIaxut_fEIhKBDqljTNwYaADK9kj3gG0ESrfHs-5_og.cache +0 -3
  716. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/xL/xLZtF0WWBePfiVBWxxi6brXCLsEfcrj435b9xJupeeU.cache +0 -0
  717. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/xL/xLktzniI5dkWKAifTMHzZvRHyRHOexsqV-ZRsdLXx0g.cache +0 -2
  718. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/xv/xvoydM1zth53tauNTatJNfb-o44mAGDD9-85yRkpeqY.cache +0 -0
  719. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/y0/y0SJOqIx2fn1SKqOkAihsQow0trRJrSIyAswufVuoA8.cache +0 -0
  720. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/yH/yHfd9J_SJGssjygyWK8-uLlvE6IlN6DIda7947QWVsI.cache +0 -1
  721. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/yQ/yQP_20gvJZ1MfkfWE7nU-EFpqbMzANYy8OWuQuaDyLM.cache +0 -2
  722. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/yv/yvOcRnWhg9dCjr1_rScAH4M8-rUQVY9oHFqBGVoMniI.cache +0 -0
  723. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/z2/z2ro57FqSGT_X2jnC68fS-HrFmCh7Wbrnrm45BceZoM.cache +0 -0
  724. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/zJ/zJfViroVCTZxyBh0pLP8_QiOxemqmKRkiU7BHAf5HxA.cache +0 -0
  725. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/zP/zPBLf0GnkvCm86BY_8PtGJRyawPWy-JxWZp25_yNRfk.cache +0 -2
  726. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/zg/zgpzeaX-KZErHyGJ1aBH3ZusweNXMneVZule88XsIJI.cache +0 -1
  727. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/zm/zmEmiHcLam0fJ2odLUV8n4hg9GN2gBDrJo7JCkkg8f4.cache +0 -1
  728. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/zy/zYFltDy-8VC-uKq2BVEiJJyYXNFvVzAKuMlR3ZIYZsk.cache +0 -0
  729. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/zy/zywotY5ANjNyE78CLDqC1eYRFwL1ZFzkT9J5LzNlI4M.cache +0 -1
  730. data/spec/dummy/tmp/restart.txt +0 -0
  731. data/spec/dummy/tmp/screenshots/failures_test_it_handles_subscriptions.png +0 -0
  732. data/spec/fixtures/upgrader/account.original.rb +0 -19
  733. data/spec/fixtures/upgrader/account.transformed.rb +0 -20
  734. data/spec/fixtures/upgrader/blame_range.original.rb +0 -43
  735. data/spec/fixtures/upgrader/blame_range.transformed.rb +0 -30
  736. data/spec/fixtures/upgrader/date_time.original.rb +0 -24
  737. data/spec/fixtures/upgrader/date_time.transformed.rb +0 -23
  738. data/spec/fixtures/upgrader/delete_project.original.rb +0 -28
  739. data/spec/fixtures/upgrader/delete_project.transformed.rb +0 -27
  740. data/spec/fixtures/upgrader/gist_order_field.original.rb +0 -14
  741. data/spec/fixtures/upgrader/gist_order_field.transformed.rb +0 -13
  742. data/spec/fixtures/upgrader/increment_count.original.rb +0 -59
  743. data/spec/fixtures/upgrader/increment_count.transformed.rb +0 -50
  744. data/spec/fixtures/upgrader/photo.original.rb +0 -10
  745. data/spec/fixtures/upgrader/photo.transformed.rb +0 -12
  746. data/spec/fixtures/upgrader/release_order.original.rb +0 -15
  747. data/spec/fixtures/upgrader/release_order.transformed.rb +0 -14
  748. data/spec/fixtures/upgrader/starrable.original.rb +0 -49
  749. data/spec/fixtures/upgrader/starrable.transformed.rb +0 -46
  750. data/spec/fixtures/upgrader/subscribable.original.rb +0 -55
  751. data/spec/fixtures/upgrader/subscribable.transformed.rb +0 -51
  752. data/spec/fixtures/upgrader/type_x.original.rb +0 -65
  753. data/spec/fixtures/upgrader/type_x.transformed.rb +0 -56
  754. data/spec/generators/graphql/enum_generator_spec.rb +0 -29
  755. data/spec/generators/graphql/function_generator_spec.rb +0 -59
  756. data/spec/generators/graphql/install_generator_spec.rb +0 -205
  757. data/spec/generators/graphql/interface_generator_spec.rb +0 -32
  758. data/spec/generators/graphql/loader_generator_spec.rb +0 -55
  759. data/spec/generators/graphql/mutation_generator_spec.rb +0 -65
  760. data/spec/generators/graphql/object_generator_spec.rb +0 -51
  761. data/spec/generators/graphql/union_generator_spec.rb +0 -64
  762. data/spec/graphql/analysis/analyze_query_spec.rb +0 -234
  763. data/spec/graphql/analysis/field_usage_spec.rb +0 -62
  764. data/spec/graphql/analysis/max_query_complexity_spec.rb +0 -102
  765. data/spec/graphql/analysis/max_query_depth_spec.rb +0 -101
  766. data/spec/graphql/analysis/query_complexity_spec.rb +0 -301
  767. data/spec/graphql/analysis/query_depth_spec.rb +0 -81
  768. data/spec/graphql/argument_spec.rb +0 -151
  769. data/spec/graphql/backtrace_spec.rb +0 -206
  770. data/spec/graphql/base_type_spec.rb +0 -169
  771. data/spec/graphql/boolean_type_spec.rb +0 -21
  772. data/spec/graphql/compatibility/execution_specification_spec.rb +0 -4
  773. data/spec/graphql/compatibility/lazy_execution_specification_spec.rb +0 -4
  774. data/spec/graphql/compatibility/query_parser_specification_spec.rb +0 -6
  775. data/spec/graphql/compatibility/schema_parser_specification_spec.rb +0 -6
  776. data/spec/graphql/define/assign_argument_spec.rb +0 -61
  777. data/spec/graphql/define/instance_definable_spec.rb +0 -203
  778. data/spec/graphql/directive/skip_directive_spec.rb +0 -9
  779. data/spec/graphql/directive_spec.rb +0 -253
  780. data/spec/graphql/enum_type_spec.rb +0 -153
  781. data/spec/graphql/execution/execute_spec.rb +0 -206
  782. data/spec/graphql/execution/instrumentation_spec.rb +0 -165
  783. data/spec/graphql/execution/lazy/lazy_method_map_spec.rb +0 -57
  784. data/spec/graphql/execution/lazy_spec.rb +0 -174
  785. data/spec/graphql/execution/multiplex_spec.rb +0 -183
  786. data/spec/graphql/execution/typecast_spec.rb +0 -47
  787. data/spec/graphql/execution_error_spec.rb +0 -292
  788. data/spec/graphql/field_spec.rb +0 -246
  789. data/spec/graphql/float_type_spec.rb +0 -16
  790. data/spec/graphql/function_spec.rb +0 -129
  791. data/spec/graphql/id_type_spec.rb +0 -33
  792. data/spec/graphql/input_object_type_spec.rb +0 -353
  793. data/spec/graphql/int_type_spec.rb +0 -16
  794. data/spec/graphql/interface_type_spec.rb +0 -152
  795. data/spec/graphql/internal_representation/print_spec.rb +0 -41
  796. data/spec/graphql/internal_representation/rewrite_spec.rb +0 -374
  797. data/spec/graphql/introspection/directive_type_spec.rb +0 -61
  798. data/spec/graphql/introspection/input_value_type_spec.rb +0 -105
  799. data/spec/graphql/introspection/introspection_query_spec.rb +0 -59
  800. data/spec/graphql/introspection/schema_type_spec.rb +0 -55
  801. data/spec/graphql/introspection/type_by_name_field_spec.rb +0 -38
  802. data/spec/graphql/introspection/type_type_spec.rb +0 -156
  803. data/spec/graphql/language/block_string_spec.rb +0 -70
  804. data/spec/graphql/language/definition_slice_spec.rb +0 -226
  805. data/spec/graphql/language/document_from_schema_definition_spec.rb +0 -770
  806. data/spec/graphql/language/equality_spec.rb +0 -84
  807. data/spec/graphql/language/generation_spec.rb +0 -36
  808. data/spec/graphql/language/lexer_spec.rb +0 -66
  809. data/spec/graphql/language/nodes_spec.rb +0 -45
  810. data/spec/graphql/language/parser_spec.rb +0 -90
  811. data/spec/graphql/language/printer_spec.rb +0 -203
  812. data/spec/graphql/language/visitor_spec.rb +0 -50
  813. data/spec/graphql/list_type_spec.rb +0 -57
  814. data/spec/graphql/non_null_type_spec.rb +0 -48
  815. data/spec/graphql/object_type_spec.rb +0 -192
  816. data/spec/graphql/query/arguments_spec.rb +0 -325
  817. data/spec/graphql/query/context_spec.rb +0 -264
  818. data/spec/graphql/query/executor_spec.rb +0 -310
  819. data/spec/graphql/query/literal_input_spec.rb +0 -91
  820. data/spec/graphql/query/result_spec.rb +0 -29
  821. data/spec/graphql/query/serial_execution/value_resolution_spec.rb +0 -109
  822. data/spec/graphql/query/variables_spec.rb +0 -355
  823. data/spec/graphql/query_spec.rb +0 -780
  824. data/spec/graphql/rake_task_spec.rb +0 -59
  825. data/spec/graphql/relay/array_connection_spec.rb +0 -290
  826. data/spec/graphql/relay/base_connection_spec.rb +0 -93
  827. data/spec/graphql/relay/connection_instrumentation_spec.rb +0 -83
  828. data/spec/graphql/relay/connection_resolve_spec.rb +0 -63
  829. data/spec/graphql/relay/connection_type_spec.rb +0 -81
  830. data/spec/graphql/relay/edge_spec.rb +0 -10
  831. data/spec/graphql/relay/mongo_relation_connection_spec.rb +0 -474
  832. data/spec/graphql/relay/mutation_spec.rb +0 -339
  833. data/spec/graphql/relay/node_spec.rb +0 -263
  834. data/spec/graphql/relay/page_info_spec.rb +0 -111
  835. data/spec/graphql/relay/range_add_spec.rb +0 -117
  836. data/spec/graphql/relay/relation_connection_spec.rb +0 -808
  837. data/spec/graphql/scalar_type_spec.rb +0 -66
  838. data/spec/graphql/schema/argument_spec.rb +0 -87
  839. data/spec/graphql/schema/build_from_definition_spec.rb +0 -1072
  840. data/spec/graphql/schema/catchall_middleware_spec.rb +0 -34
  841. data/spec/graphql/schema/enum_spec.rb +0 -74
  842. data/spec/graphql/schema/field_spec.rb +0 -225
  843. data/spec/graphql/schema/finder_spec.rb +0 -135
  844. data/spec/graphql/schema/input_object_spec.rb +0 -111
  845. data/spec/graphql/schema/instrumentation_spec.rb +0 -40
  846. data/spec/graphql/schema/interface_spec.rb +0 -185
  847. data/spec/graphql/schema/introspection_system_spec.rb +0 -39
  848. data/spec/graphql/schema/loader_spec.rb +0 -281
  849. data/spec/graphql/schema/member/accepts_definition_spec.rb +0 -111
  850. data/spec/graphql/schema/member/build_type_spec.rb +0 -17
  851. data/spec/graphql/schema/member/has_fields_spec.rb +0 -129
  852. data/spec/graphql/schema/member/type_system_helpers_spec.rb +0 -63
  853. data/spec/graphql/schema/middleware_chain_spec.rb +0 -57
  854. data/spec/graphql/schema/mutation_spec.rb +0 -148
  855. data/spec/graphql/schema/object_spec.rb +0 -175
  856. data/spec/graphql/schema/printer_spec.rb +0 -707
  857. data/spec/graphql/schema/relay_classic_mutation_spec.rb +0 -38
  858. data/spec/graphql/schema/rescue_middleware_spec.rb +0 -74
  859. data/spec/graphql/schema/resolver_spec.rb +0 -131
  860. data/spec/graphql/schema/scalar_spec.rb +0 -95
  861. data/spec/graphql/schema/timeout_middleware_spec.rb +0 -188
  862. data/spec/graphql/schema/traversal_spec.rb +0 -222
  863. data/spec/graphql/schema/type_expression_spec.rb +0 -39
  864. data/spec/graphql/schema/union_spec.rb +0 -65
  865. data/spec/graphql/schema/unique_within_type_spec.rb +0 -44
  866. data/spec/graphql/schema/validation_spec.rb +0 -355
  867. data/spec/graphql/schema/warden_spec.rb +0 -740
  868. data/spec/graphql/schema_spec.rb +0 -472
  869. data/spec/graphql/static_validation/rules/argument_literals_are_compatible_spec.rb +0 -272
  870. data/spec/graphql/static_validation/rules/arguments_are_defined_spec.rb +0 -69
  871. data/spec/graphql/static_validation/rules/directives_are_defined_spec.rb +0 -33
  872. data/spec/graphql/static_validation/rules/directives_are_in_valid_locations_spec.rb +0 -40
  873. data/spec/graphql/static_validation/rules/fields_are_defined_on_type_spec.rb +0 -162
  874. data/spec/graphql/static_validation/rules/fields_have_appropriate_selections_spec.rb +0 -53
  875. data/spec/graphql/static_validation/rules/fields_will_merge_spec.rb +0 -614
  876. data/spec/graphql/static_validation/rules/fragment_names_are_unique_spec.rb +0 -27
  877. data/spec/graphql/static_validation/rules/fragment_spreads_are_possible_spec.rb +0 -49
  878. data/spec/graphql/static_validation/rules/fragment_types_exist_spec.rb +0 -40
  879. data/spec/graphql/static_validation/rules/fragments_are_finite_spec.rb +0 -121
  880. data/spec/graphql/static_validation/rules/fragments_are_named_spec.rb +0 -23
  881. data/spec/graphql/static_validation/rules/fragments_are_on_composite_types_spec.rb +0 -53
  882. data/spec/graphql/static_validation/rules/fragments_are_used_spec.rb +0 -41
  883. data/spec/graphql/static_validation/rules/mutation_root_exists_spec.rb +0 -38
  884. data/spec/graphql/static_validation/rules/no_definitions_are_present_spec.rb +0 -28
  885. data/spec/graphql/static_validation/rules/operation_names_are_valid_spec.rb +0 -79
  886. data/spec/graphql/static_validation/rules/required_arguments_are_present_spec.rb +0 -64
  887. data/spec/graphql/static_validation/rules/subscription_root_exists_spec.rb +0 -33
  888. data/spec/graphql/static_validation/rules/unique_directives_per_location_spec.rb +0 -181
  889. data/spec/graphql/static_validation/rules/variable_default_values_are_correctly_typed_spec.rb +0 -137
  890. data/spec/graphql/static_validation/rules/variable_names_are_unique_spec.rb +0 -23
  891. data/spec/graphql/static_validation/rules/variable_usages_are_allowed_spec.rb +0 -232
  892. data/spec/graphql/static_validation/rules/variables_are_input_types_spec.rb +0 -74
  893. data/spec/graphql/static_validation/rules/variables_are_used_and_defined_spec.rb +0 -61
  894. data/spec/graphql/static_validation/type_stack_spec.rb +0 -38
  895. data/spec/graphql/static_validation/validator_spec.rb +0 -141
  896. data/spec/graphql/string_type_spec.rb +0 -80
  897. data/spec/graphql/subscriptions/serialize_spec.rb +0 -71
  898. data/spec/graphql/subscriptions_spec.rb +0 -483
  899. data/spec/graphql/tracing/active_support_notifications_tracing_spec.rb +0 -55
  900. data/spec/graphql/tracing/new_relic_tracing_spec.rb +0 -47
  901. data/spec/graphql/tracing/platform_tracing_spec.rb +0 -115
  902. data/spec/graphql/tracing/scout_tracing_spec.rb +0 -17
  903. data/spec/graphql/tracing_spec.rb +0 -52
  904. data/spec/graphql/union_type_spec.rb +0 -161
  905. data/spec/graphql/upgrader/member_spec.rb +0 -516
  906. data/spec/graphql/upgrader/schema_spec.rb +0 -82
  907. data/spec/rails_dependency_sanity_spec.rb +0 -14
  908. data/spec/spec_helper.rb +0 -113
  909. data/spec/support/base_generator_test.rb +0 -7
  910. data/spec/support/dummy/data.rb +0 -42
  911. data/spec/support/dummy/schema.rb +0 -459
  912. data/spec/support/jazz.rb +0 -544
  913. data/spec/support/lazy_helpers.rb +0 -150
  914. data/spec/support/magic_cards/schema.graphql +0 -33
  915. data/spec/support/minimum_input_object.rb +0 -21
  916. data/spec/support/new_relic.rb +0 -24
  917. data/spec/support/parser/filename_example.graphql +0 -5
  918. data/spec/support/parser/filename_example_error_1.graphql +0 -4
  919. data/spec/support/parser/filename_example_error_2.graphql +0 -5
  920. data/spec/support/star_trek/data.rb +0 -109
  921. data/spec/support/star_trek/schema.rb +0 -388
  922. data/spec/support/star_wars/data.rb +0 -109
  923. data/spec/support/star_wars/schema.rb +0 -392
  924. data/spec/support/static_validation_helpers.rb +0 -28
@@ -1,4 +1,6 @@
1
1
  # frozen_string_literal: true
2
+ require "timeout"
3
+
2
4
  module GraphQL
3
5
  module StaticValidation
4
6
  # Initialized with a {GraphQL::Schema}, then it can validate {GraphQL::Language::Nodes::Documents}s based on that schema.
@@ -20,33 +22,71 @@ module GraphQL
20
22
 
21
23
  # Validate `query` against the schema. Returns an array of message hashes.
22
24
  # @param query [GraphQL::Query]
25
+ # @param validate [Boolean]
26
+ # @param timeout [Float] Number of seconds to wait before aborting validation. Any positive number may be used, including Floats to specify fractional seconds.
23
27
  # @return [Array<Hash>]
24
- def validate(query, validate: true)
28
+ def validate(query, validate: true, timeout: nil)
25
29
  query.trace("validate", { validate: validate, query: query }) do
26
- context = GraphQL::StaticValidation::ValidationContext.new(query)
27
- rewrite = GraphQL::InternalRepresentation::Rewrite.new
30
+ can_skip_rewrite = query.context.interpreter? && query.schema.using_ast_analysis? && query.schema.is_a?(Class)
31
+ errors = if validate == false && can_skip_rewrite
32
+ []
33
+ else
34
+ rules_to_use = validate ? @rules : []
35
+ visitor_class = BaseVisitor.including_rules(rules_to_use, rewrite: !can_skip_rewrite)
36
+
37
+ context = GraphQL::StaticValidation::ValidationContext.new(query, visitor_class)
28
38
 
29
- # Put this first so its enters and exits are always called
30
- rewrite.validate(context)
39
+ begin
40
+ # CAUTION: Usage of the timeout module makes the assumption that validation rules are stateless Ruby code that requires no cleanup if process was interrupted. This means no blocking IO calls, native gems, locks, or `rescue` clauses that must be reached.
41
+ # A timeout value of 0 or nil will execute the block without any timeout.
42
+ Timeout::timeout(timeout) do
43
+ # Attach legacy-style rules.
44
+ # Only loop through rules if it has legacy-style rules
45
+ unless (legacy_rules = rules_to_use - GraphQL::StaticValidation::ALL_RULES).empty?
46
+ legacy_rules.each do |rule_class_or_module|
47
+ if rule_class_or_module.method_defined?(:validate)
48
+ GraphQL::Deprecation.warn "Legacy validator rules will be removed from GraphQL-Ruby 2.0, use a module instead (see the built-in rules: https://github.com/rmosolgo/graphql-ruby/tree/master/lib/graphql/static_validation/rules)"
49
+ GraphQL::Deprecation.warn " -> Legacy validator: #{rule_class_or_module}"
50
+ rule_class_or_module.new.validate(context)
51
+ end
52
+ end
53
+ end
31
54
 
32
- # If the caller opted out of validation, don't attach these
33
- if validate
34
- @rules.each do |rules|
35
- rules.new.validate(context)
55
+ context.visitor.visit
56
+ end
57
+ rescue Timeout::Error
58
+ handle_timeout(query, context)
36
59
  end
60
+
61
+ context.errors
37
62
  end
38
63
 
39
- context.visitor.visit
40
- # Post-validation: allow validators to register handlers on rewritten query nodes
41
- rewrite_result = rewrite.document
42
- GraphQL::InternalRepresentation::Visit.visit_each_node(rewrite_result.operation_definitions, context.each_irep_node_handlers)
64
+ irep = if errors.empty? && context
65
+ # Only return this if there are no errors and validation was actually run
66
+ context.visitor.rewrite_document
67
+ else
68
+ nil
69
+ end
43
70
 
44
71
  {
45
- errors: context.errors,
46
- # If there were errors, the irep is garbage
47
- irep: context.errors.any? ? nil : rewrite_result,
72
+ errors: errors,
73
+ irep: irep,
48
74
  }
49
75
  end
76
+ rescue GraphQL::ExecutionError => e
77
+ {
78
+ errors: [e],
79
+ irep: nil,
80
+ }
81
+ end
82
+
83
+ # Invoked when static validation times out.
84
+ # @param query [GraphQL::Query]
85
+ # @param context [GraphQL::StaticValidation::ValidationContext]
86
+ def handle_timeout(query, context)
87
+ context.errors << GraphQL::StaticValidation::ValidationTimeoutError.new(
88
+ "Timeout on validation of query"
89
+ )
50
90
  end
51
91
  end
52
92
  end
@@ -1,12 +1,13 @@
1
1
  # frozen_string_literal: true
2
- require "graphql/static_validation/message"
3
- require "graphql/static_validation/arguments_validator"
2
+ require "graphql/static_validation/error"
4
3
  require "graphql/static_validation/definition_dependencies"
5
4
  require "graphql/static_validation/type_stack"
6
5
  require "graphql/static_validation/validator"
7
6
  require "graphql/static_validation/validation_context"
7
+ require "graphql/static_validation/validation_timeout_error"
8
8
  require "graphql/static_validation/literal_validator"
9
-
9
+ require "graphql/static_validation/base_visitor"
10
+ require "graphql/static_validation/no_validate_visitor"
10
11
 
11
12
  rules_glob = File.expand_path("../static_validation/rules/*.rb", __FILE__)
12
13
  Dir.glob(rules_glob).each do |file|
@@ -14,3 +15,5 @@ Dir.glob(rules_glob).each do |file|
14
15
  end
15
16
 
16
17
  require "graphql/static_validation/all_rules"
18
+ require "graphql/static_validation/default_visitor"
19
+ require "graphql/static_validation/interpreter_visitor"
@@ -1,18 +1,2 @@
1
1
  # frozen_string_literal: true
2
- GraphQL::STRING_TYPE = GraphQL::ScalarType.define do
3
- name "String"
4
- description "Represents textual data as UTF-8 character sequences. This type is most often used by GraphQL to represent free-form human-readable text."
5
-
6
- coerce_result ->(value, ctx) {
7
- begin
8
- str = value.to_s
9
- str.encoding == Encoding::UTF_8 ? str : str.encode(Encoding::UTF_8)
10
- rescue EncodingError
11
- err = GraphQL::StringEncodingError.new(str)
12
- ctx.schema.type_error(err, ctx)
13
- end
14
- }
15
-
16
- coerce_input ->(value, _ctx) { value.is_a?(String) ? value : nil }
17
- default_scalar true
18
- end
2
+ GraphQL::STRING_TYPE = GraphQL::Types::String.graphql_definition
@@ -4,13 +4,14 @@ module GraphQL
4
4
  # A subscriptions implementation that sends data
5
5
  # as ActionCable broadcastings.
6
6
  #
7
- # Experimental, some things to keep in mind:
7
+ # Some things to keep in mind:
8
8
  #
9
9
  # - No queueing system; ActiveJob should be added
10
10
  # - Take care to reload context when re-delivering the subscription. (see {Query#subscription_update?})
11
+ # - Avoid the async ActionCable adapter and use the redis or PostgreSQL adapters instead. Otherwise calling #trigger won't work from background jobs or the Rails console.
11
12
  #
12
13
  # @example Adding ActionCableSubscriptions to your schema
13
- # MySchema = GraphQL::Schema.define do
14
+ # class MySchema < GraphQL::Schema
14
15
  # # ...
15
16
  # use GraphQL::Subscriptions::ActionCableSubscriptions
16
17
  # end
@@ -26,27 +27,29 @@ module GraphQL
26
27
  # variables = ensure_hash(data["variables"])
27
28
  # operation_name = data["operationName"]
28
29
  # context = {
29
- # current_user: current_user,
30
+ # # Re-implement whatever context methods you need
31
+ # # in this channel or ApplicationCable::Channel
32
+ # # current_user: current_user,
30
33
  # # Make sure the channel is in the context
31
34
  # channel: self,
32
35
  # }
33
36
  #
34
- # result = MySchema.execute({
37
+ # result = MySchema.execute(
35
38
  # query: query,
36
39
  # context: context,
37
40
  # variables: variables,
38
41
  # operation_name: operation_name
39
- # })
42
+ # )
40
43
  #
41
44
  # payload = {
42
- # result: result.subscription? ? {data: nil} : result.to_h,
45
+ # result: result.to_h,
43
46
  # more: result.subscription?,
44
47
  # }
45
48
  #
46
49
  # # Track the subscription here so we can remove it
47
50
  # # on unsubscribe.
48
51
  # if result.context[:subscription_id]
49
- # @subscription_ids << context[:subscription_id]
52
+ # @subscription_ids << result.context[:subscription_id]
50
53
  # end
51
54
  #
52
55
  # transmit(payload)
@@ -54,9 +57,28 @@ module GraphQL
54
57
  #
55
58
  # def unsubscribed
56
59
  # @subscription_ids.each { |sid|
57
- # CardsSchema.subscriptions.delete_subscription(sid)
60
+ # MySchema.subscriptions.delete_subscription(sid)
58
61
  # }
59
62
  # end
63
+ #
64
+ # private
65
+ #
66
+ # def ensure_hash(ambiguous_param)
67
+ # case ambiguous_param
68
+ # when String
69
+ # if ambiguous_param.present?
70
+ # ensure_hash(JSON.parse(ambiguous_param))
71
+ # else
72
+ # {}
73
+ # end
74
+ # when Hash, ActionController::Parameters
75
+ # ambiguous_param
76
+ # when nil
77
+ # {}
78
+ # else
79
+ # raise ArgumentError, "Unexpected parameter: #{ambiguous_param}"
80
+ # end
81
+ # end
60
82
  # end
61
83
  #
62
84
  class ActionCableSubscriptions < GraphQL::Subscriptions
@@ -64,27 +86,32 @@ module GraphQL
64
86
  EVENT_PREFIX = "graphql-event:"
65
87
 
66
88
  # @param serializer [<#dump(obj), #load(string)] Used for serializing messages before handing them to `.broadcast(msg)`
67
- def initialize(serializer: Serialize, **rest)
89
+ # @param namespace [string] Used to namespace events and subscriptions (default: '')
90
+ def initialize(serializer: Serialize, namespace: '', action_cable: ActionCable, action_cable_coder: ActiveSupport::JSON, **rest)
68
91
  # A per-process map of subscriptions to deliver.
69
92
  # This is provided by Rails, so let's use it
70
93
  @subscriptions = Concurrent::Map.new
94
+ @events = Concurrent::Map.new { |h, k| h[k] = Concurrent::Map.new { |h2, k2| h2[k2] = Concurrent::Array.new } }
95
+ @action_cable = action_cable
96
+ @action_cable_coder = action_cable_coder
71
97
  @serializer = serializer
98
+ @transmit_ns = namespace
72
99
  super
73
100
  end
74
101
 
75
102
  # An event was triggered; Push the data over ActionCable.
76
103
  # Subscribers will re-evaluate locally.
77
104
  def execute_all(event, object)
78
- stream = EVENT_PREFIX + event.topic
105
+ stream = stream_event_name(event)
79
106
  message = @serializer.dump(object)
80
- ActionCable.server.broadcast(stream, message)
107
+ @action_cable.server.broadcast(stream, message)
81
108
  end
82
109
 
83
110
  # This subscription was re-evaluated.
84
111
  # Send it to the specific stream where this client was waiting.
85
112
  def deliver(subscription_id, result)
86
113
  payload = { result: result.to_h, more: true }
87
- ActionCable.server.broadcast(SUBSCRIPTION_PREFIX + subscription_id, payload)
114
+ @action_cable.server.broadcast(stream_subscription_name(subscription_id), payload)
88
115
  end
89
116
 
90
117
  # A query was run where these events were subscribed to.
@@ -92,33 +119,98 @@ module GraphQL
92
119
  # It will receive notifications when events come in
93
120
  # and re-evaluate the query locally.
94
121
  def write_subscription(query, events)
95
- channel = query.context[:channel]
122
+ channel = query.context.fetch(:channel)
96
123
  subscription_id = query.context[:subscription_id] ||= build_id
97
- stream = query.context[:action_cable_stream] ||= SUBSCRIPTION_PREFIX + subscription_id
124
+ stream = stream_subscription_name(subscription_id)
98
125
  channel.stream_from(stream)
99
126
  @subscriptions[subscription_id] = query
100
127
  events.each do |event|
101
- channel.stream_from(EVENT_PREFIX + event.topic, coder: ActiveSupport::JSON) do |message|
102
- execute(subscription_id, event, @serializer.load(message))
103
- nil
128
+ # Setup a new listener to run all events with this topic in this process
129
+ setup_stream(channel, event)
130
+ # Add this event to the list of events to be updated
131
+ @events[event.topic][event.fingerprint] << event
132
+ end
133
+ end
134
+
135
+ # Every subscribing channel is listening here, but only one of them takes any action.
136
+ # This is so we can reuse payloads when possible, and make one payload to send to
137
+ # all subscribers.
138
+ #
139
+ # But the problem is, any channel could close at any time, so each channel has to
140
+ # be ready to take over the primary position.
141
+ #
142
+ # To make sure there's always one-and-only-one channel building payloads,
143
+ # let the listener belonging to the first event on the list be
144
+ # the one to build and publish payloads.
145
+ #
146
+ def setup_stream(channel, initial_event)
147
+ topic = initial_event.topic
148
+ channel.stream_from(stream_event_name(initial_event), coder: @action_cable_coder) do |message|
149
+ events_by_fingerprint = @events[topic]
150
+ object = nil
151
+ events_by_fingerprint.each do |_fingerprint, events|
152
+ if events.any? && events.first == initial_event
153
+ # The fingerprint has told us that this response should be shared by all subscribers,
154
+ # so just run it once, then deliver the result to every subscriber
155
+ first_event = events.first
156
+ first_subscription_id = first_event.context.fetch(:subscription_id)
157
+ object ||= @serializer.load(message)
158
+ result = execute_update(first_subscription_id, first_event, object)
159
+ # Having calculated the result _once_, send the same payload to all subscribers
160
+ events.each do |event|
161
+ subscription_id = event.context.fetch(:subscription_id)
162
+ deliver(subscription_id, result)
163
+ end
164
+ end
104
165
  end
166
+ nil
105
167
  end
106
168
  end
107
169
 
108
170
  # Return the query from "storage" (in memory)
109
171
  def read_subscription(subscription_id)
110
172
  query = @subscriptions[subscription_id]
111
- {
112
- query_string: query.query_string,
113
- variables: query.provided_variables,
114
- context: query.context.to_h,
115
- operation_name: query.operation_name,
116
- }
173
+ if query.nil?
174
+ # This can happen when a subscription is triggered from an unsubscribed channel,
175
+ # see https://github.com/rmosolgo/graphql-ruby/issues/2478.
176
+ # (This `nil` is handled by `#execute_update`)
177
+ nil
178
+ else
179
+ {
180
+ query_string: query.query_string,
181
+ variables: query.provided_variables,
182
+ context: query.context.to_h,
183
+ operation_name: query.operation_name,
184
+ }
185
+ end
117
186
  end
118
187
 
119
188
  # The channel was closed, forget about it.
120
189
  def delete_subscription(subscription_id)
121
- @subscriptions.delete(subscription_id)
190
+ query = @subscriptions.delete(subscription_id)
191
+ # This can be `nil` when `.trigger` happens inside an unsubscribed ActionCable channel,
192
+ # see https://github.com/rmosolgo/graphql-ruby/issues/2478
193
+ if query
194
+ events = query.context.namespace(:subscriptions)[:events]
195
+ events.each do |event|
196
+ ev_by_fingerprint = @events[event.topic]
197
+ ev_for_fingerprint = ev_by_fingerprint[event.fingerprint]
198
+ ev_for_fingerprint.delete(event)
199
+ if ev_for_fingerprint.empty?
200
+ ev_by_fingerprint.delete(event.fingerprint)
201
+ end
202
+ end
203
+ end
204
+ end
205
+
206
+ private
207
+
208
+ def stream_subscription_name(subscription_id)
209
+ [SUBSCRIPTION_PREFIX, @transmit_ns, subscription_id].join
210
+ end
211
+
212
+ def stream_event_name(event)
213
+ [EVENT_PREFIX, @transmit_ns, event.topic].join
122
214
  end
123
215
  end
124
216
  end
@@ -0,0 +1,81 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GraphQL
4
+ class Subscriptions
5
+ # Detect whether the current operation:
6
+ # - Is a subscription operation
7
+ # - Is completely broadcastable
8
+ #
9
+ # Assign the result to `context.namespace(:subscriptions)[:subscription_broadcastable]`
10
+ # @api private
11
+ # @see Subscriptions#broadcastable? for a public API
12
+ class BroadcastAnalyzer < GraphQL::Analysis::AST::Analyzer
13
+ def initialize(subject)
14
+ super
15
+ @default_broadcastable = subject.schema.subscriptions.default_broadcastable
16
+ # Maybe this will get set to false while analyzing
17
+ @subscription_broadcastable = true
18
+ end
19
+
20
+ # Only analyze subscription operations
21
+ def analyze?
22
+ @query.subscription?
23
+ end
24
+
25
+ def on_enter_field(node, parent, visitor)
26
+ if (@subscription_broadcastable == false) || visitor.skipping?
27
+ return
28
+ end
29
+
30
+ current_field = visitor.field_definition
31
+ apply_broadcastable(current_field)
32
+
33
+ current_type = visitor.parent_type_definition
34
+ if current_type.kind.interface?
35
+ pt = @query.possible_types(current_type)
36
+ pt.each do |object_type|
37
+ ot_field = @query.get_field(object_type, current_field.graphql_name)
38
+ # Inherited fields would be exactly the same object;
39
+ # only check fields that are overrides of the inherited one
40
+ if ot_field && ot_field != current_field
41
+ apply_broadcastable(ot_field)
42
+ end
43
+ end
44
+ end
45
+ end
46
+
47
+ # Assign the result to context.
48
+ # (This method is allowed to return an error, but we don't need to)
49
+ # @return [void]
50
+ def result
51
+ query.context.namespace(:subscriptions)[:subscription_broadcastable] = @subscription_broadcastable
52
+ nil
53
+ end
54
+
55
+ private
56
+
57
+ # Modify `@subscription_broadcastable` based on `field_defn`'s configuration (and/or the default value)
58
+ def apply_broadcastable(field_defn)
59
+ current_field_broadcastable = field_defn.introspection? || field_defn.broadcastable?
60
+ case current_field_broadcastable
61
+ when nil
62
+ # If the value wasn't set, mix in the default value:
63
+ # - If the default is false and the current value is true, make it false
64
+ # - If the default is true and the current value is true, it stays true
65
+ # - If the default is false and the current value is false, keep it false
66
+ # - If the default is true and the current value is false, keep it false
67
+ @subscription_broadcastable = @subscription_broadcastable && @default_broadcastable
68
+ when false
69
+ # One non-broadcastable field is enough to make the whole subscription non-broadcastable
70
+ @subscription_broadcastable = false
71
+ when true
72
+ # Leave `@broadcastable_query` true if it's already true,
73
+ # but don't _set_ it to true if it was set to false by something else.
74
+ # Actually, just leave it!
75
+ else
76
+ raise ArgumentError, "Unexpected `.broadcastable?` value for #{field_defn.path}: #{current_field_broadcastable}"
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ class Subscriptions
4
+ class DefaultSubscriptionResolveExtension < GraphQL::Subscriptions::SubscriptionRoot::Extension
5
+ def resolve(context:, object:, arguments:)
6
+ has_override_implementation = @field.resolver ||
7
+ object.respond_to?(@field.resolver_method)
8
+
9
+ if !has_override_implementation
10
+ if context.query.subscription_update?
11
+ object.object
12
+ else
13
+ context.skip
14
+ end
15
+ else
16
+ yield(object, arguments)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -1,12 +1,10 @@
1
1
  # frozen_string_literal: true
2
- # test_via: ../subscriptions.rb
3
2
  module GraphQL
4
3
  class Subscriptions
5
4
  # This thing can be:
6
5
  # - Subscribed to by `subscription { ... }`
7
6
  # - Triggered by `MySchema.subscriber.trigger(name, arguments, obj)`
8
7
  #
9
- # An array of `Event`s are passed to `store.register(query, events)`.
10
8
  class Event
11
9
  # @return [String] Corresponds to the Subscription root field name
12
10
  attr_reader :name
@@ -36,18 +34,74 @@ module GraphQL
36
34
  when GraphQL::Query::Arguments
37
35
  arguments
38
36
  when Hash
39
- GraphQL::Query::LiteralInput.from_arguments(
40
- arguments,
41
- field,
42
- nil,
43
- )
37
+ if field.is_a?(GraphQL::Schema::Field)
38
+ stringify_args(field, arguments)
39
+ else
40
+ GraphQL::Query::LiteralInput.from_arguments(
41
+ arguments,
42
+ field,
43
+ nil,
44
+ )
45
+ end
44
46
  else
45
47
  raise ArgumentError, "Unexpected arguments: #{arguments}, must be Hash or GraphQL::Arguments"
46
48
  end
47
49
 
48
- sorted_h = normalized_args.to_h.sort.to_h
50
+ sorted_h = stringify_args(field, normalized_args.to_h)
49
51
  Serialize.dump_recursive([scope, name, sorted_h])
50
52
  end
53
+
54
+ # @return [String] a logical identifier for this event. (Stable when the query is broadcastable.)
55
+ def fingerprint
56
+ @fingerprint ||= begin
57
+ # When this query has been flagged as broadcastable,
58
+ # use a generalized, stable fingerprint so that
59
+ # duplicate subscriptions can be evaluated and distributed in bulk.
60
+ # (`@topic` includes field, args, and subscription scope already.)
61
+ if @context.namespace(:subscriptions)[:subscription_broadcastable]
62
+ "#{@topic}/#{@context.query.fingerprint}"
63
+ else
64
+ # not broadcastable, build a unique ID for this event
65
+ @context.schema.subscriptions.build_id
66
+ end
67
+ end
68
+ end
69
+
70
+ class << self
71
+ private
72
+ def stringify_args(arg_owner, args)
73
+ case args
74
+ when Hash
75
+ next_args = {}
76
+ args.each do |k, v|
77
+ arg_name = k.to_s
78
+ camelized_arg_name = GraphQL::Schema::Member::BuildType.camelize(arg_name)
79
+ arg_defn = get_arg_definition(arg_owner, camelized_arg_name)
80
+
81
+ if arg_defn
82
+ normalized_arg_name = camelized_arg_name
83
+ else
84
+ normalized_arg_name = arg_name
85
+ arg_defn = get_arg_definition(arg_owner, normalized_arg_name)
86
+ end
87
+
88
+ next_args[normalized_arg_name] = stringify_args(arg_defn.type, v)
89
+ end
90
+ # Make sure they're deeply sorted
91
+ next_args.sort.to_h
92
+ when Array
93
+ args.map { |a| stringify_args(arg_owner, a) }
94
+ when GraphQL::Schema::InputObject
95
+ stringify_args(arg_owner, args.to_h)
96
+ else
97
+ args
98
+ end
99
+ end
100
+
101
+ def get_arg_definition(arg_owner, arg_name)
102
+ arg_owner.arguments[arg_name] || arg_owner.arguments.each_value.find { |v| v.keyword.to_s == arg_name }
103
+ end
104
+ end
51
105
  end
52
106
  end
53
107
  end
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # test_via: ../subscriptions.rb
3
2
  module GraphQL
4
3
  class Subscriptions
5
4
  # Wrap the root fields of the subscription type with special logic for:
@@ -11,7 +10,7 @@ module GraphQL
11
10
  end
12
11
 
13
12
  def instrument(type, field)
14
- if type == @schema.subscription
13
+ if type == @schema.subscription.graphql_definition
15
14
  # This is a root field of `subscription`
16
15
  subscribing_resolve_proc = SubscriptionRegistrationResolve.new(field.resolve_proc)
17
16
  field.redefine(resolve: subscribing_resolve_proc)
@@ -44,7 +43,13 @@ module GraphQL
44
43
 
45
44
  # Wrap the proc with subscription registration logic
46
45
  def call(obj, args, ctx)
46
+ result = nil
47
+ if @inner_proc && !@inner_proc.is_a?(GraphQL::Field::Resolve::BuiltInResolve)
48
+ result = @inner_proc.call(obj, args, ctx)
49
+ end
50
+
47
51
  events = ctx.namespace(:subscriptions)[:events]
52
+
48
53
  if events
49
54
  # This is the first execution, so gather an Event
50
55
  # for the backend to register:
@@ -53,10 +58,12 @@ module GraphQL
53
58
  arguments: args,
54
59
  context: ctx,
55
60
  )
56
- ctx.skip
61
+ result
57
62
  elsif ctx.irep_node.subscription_topic == ctx.query.subscription_topic
58
- # The root object is _already_ the subscription update:
59
- if obj.is_a?(GraphQL::Schema::Object)
63
+ if !result.nil?
64
+ result
65
+ elsif obj.is_a?(GraphQL::Schema::Object)
66
+ # The root object is _already_ the subscription update:
60
67
  obj.object
61
68
  else
62
69
  obj
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # test_via: ../subscriptions.rb
3
2
  require "set"
4
3
  module GraphQL
5
4
  class Subscriptions
@@ -9,6 +8,9 @@ module GraphQL
9
8
  GLOBALID_KEY = "__gid__"
10
9
  SYMBOL_KEY = "__sym__"
11
10
  SYMBOL_KEYS_KEY = "__sym_keys__"
11
+ TIMESTAMP_KEY = "__timestamp__"
12
+ TIMESTAMP_FORMAT = "%Y-%m-%d %H:%M:%S.%N%Z" # eg '2020-01-01 23:59:59.123456789+05:00'
13
+ OPEN_STRUCT_KEY = "__ostruct__"
12
14
 
13
15
  module_function
14
16
 
@@ -53,12 +55,32 @@ module GraphQL
53
55
  # @return [Object] An object that load Global::Identification recursive
54
56
  def load_value(value)
55
57
  if value.is_a?(Array)
56
- value.map{|item| load_value(item)}
58
+ is_gids = (v1 = value[0]).is_a?(Hash) && v1.size == 1 && v1[GLOBALID_KEY]
59
+ if is_gids
60
+ # Assume it's an array of global IDs
61
+ ids = value.map { |v| v[GLOBALID_KEY] }
62
+ GlobalID::Locator.locate_many(ids)
63
+ else
64
+ value.map { |item| load_value(item) }
65
+ end
57
66
  elsif value.is_a?(Hash)
58
- if value.size == 1 && value.key?(GLOBALID_KEY)
59
- GlobalID::Locator.locate(value[GLOBALID_KEY])
60
- elsif value.size == 1 && value.key?(SYMBOL_KEY)
61
- value[SYMBOL_KEY].to_sym
67
+ if value.size == 1
68
+ case value.keys.first # there's only 1 key
69
+ when GLOBALID_KEY
70
+ GlobalID::Locator.locate(value[GLOBALID_KEY])
71
+ when SYMBOL_KEY
72
+ value[SYMBOL_KEY].to_sym
73
+ when TIMESTAMP_KEY
74
+ timestamp_class_name, timestamp_s = value[TIMESTAMP_KEY]
75
+ timestamp_class = Object.const_get(timestamp_class_name)
76
+ timestamp_class.strptime(timestamp_s, TIMESTAMP_FORMAT)
77
+ when OPEN_STRUCT_KEY
78
+ ostruct_values = load_value(value[OPEN_STRUCT_KEY])
79
+ OpenStruct.new(ostruct_values)
80
+ else
81
+ key = value.keys.first
82
+ { key => load_value(value[key]) }
83
+ end
62
84
  else
63
85
  loaded_h = {}
64
86
  sym_keys = value.fetch(SYMBOL_KEYS_KEY, [])
@@ -101,6 +123,11 @@ module GraphQL
101
123
  { SYMBOL_KEY => obj.to_s }
102
124
  elsif obj.respond_to?(:to_gid_param)
103
125
  {GLOBALID_KEY => obj.to_gid_param}
126
+ elsif obj.is_a?(Date) || obj.is_a?(Time)
127
+ # DateTime extends Date; for TimeWithZone, call `.utc` first.
128
+ { TIMESTAMP_KEY => [obj.class.name, obj.strftime(TIMESTAMP_FORMAT)] }
129
+ elsif obj.is_a?(OpenStruct)
130
+ { OPEN_STRUCT_KEY => dump_value(obj.to_h) }
104
131
  else
105
132
  obj
106
133
  end