graphql 1.9.17 → 2.0.20

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 (413) hide show
  1. checksums.yaml +4 -4
  2. data/lib/generators/graphql/core.rb +21 -10
  3. data/lib/generators/graphql/enum_generator.rb +4 -10
  4. data/lib/generators/graphql/field_extractor.rb +31 -0
  5. data/lib/generators/graphql/input_generator.rb +50 -0
  6. data/lib/generators/graphql/install/mutation_root_generator.rb +34 -0
  7. data/lib/generators/graphql/{templates → install/templates}/base_mutation.erb +2 -0
  8. data/lib/generators/graphql/{templates → install/templates}/mutation_type.erb +2 -0
  9. data/lib/generators/graphql/install_generator.rb +45 -8
  10. data/lib/generators/graphql/interface_generator.rb +7 -7
  11. data/lib/generators/graphql/loader_generator.rb +1 -0
  12. data/lib/generators/graphql/mutation_create_generator.rb +22 -0
  13. data/lib/generators/graphql/mutation_delete_generator.rb +22 -0
  14. data/lib/generators/graphql/mutation_generator.rb +6 -30
  15. data/lib/generators/graphql/mutation_update_generator.rb +22 -0
  16. data/lib/generators/graphql/object_generator.rb +28 -12
  17. data/lib/generators/graphql/orm_mutations_base.rb +40 -0
  18. data/lib/generators/graphql/relay.rb +49 -0
  19. data/lib/generators/graphql/relay_generator.rb +21 -0
  20. data/lib/generators/graphql/scalar_generator.rb +4 -2
  21. data/lib/generators/graphql/templates/base_argument.erb +2 -0
  22. data/lib/generators/graphql/templates/base_connection.erb +8 -0
  23. data/lib/generators/graphql/templates/base_edge.erb +8 -0
  24. data/lib/generators/graphql/templates/base_enum.erb +2 -0
  25. data/lib/generators/graphql/templates/base_field.erb +2 -0
  26. data/lib/generators/graphql/templates/base_input_object.erb +2 -0
  27. data/lib/generators/graphql/templates/base_interface.erb +2 -0
  28. data/lib/generators/graphql/templates/base_object.erb +2 -0
  29. data/lib/generators/graphql/templates/base_scalar.erb +2 -0
  30. data/lib/generators/graphql/templates/base_union.erb +2 -0
  31. data/lib/generators/graphql/templates/enum.erb +7 -1
  32. data/lib/generators/graphql/templates/graphql_controller.erb +16 -12
  33. data/lib/generators/graphql/templates/input.erb +9 -0
  34. data/lib/generators/graphql/templates/interface.erb +6 -2
  35. data/lib/generators/graphql/templates/loader.erb +2 -0
  36. data/lib/generators/graphql/templates/mutation.erb +3 -1
  37. data/lib/generators/graphql/templates/mutation_create.erb +20 -0
  38. data/lib/generators/graphql/templates/mutation_delete.erb +20 -0
  39. data/lib/generators/graphql/templates/mutation_update.erb +21 -0
  40. data/lib/generators/graphql/templates/node_type.erb +9 -0
  41. data/lib/generators/graphql/templates/object.erb +7 -3
  42. data/lib/generators/graphql/templates/query_type.erb +3 -3
  43. data/lib/generators/graphql/templates/scalar.erb +5 -1
  44. data/lib/generators/graphql/templates/schema.erb +25 -27
  45. data/lib/generators/graphql/templates/union.erb +6 -2
  46. data/lib/generators/graphql/type_generator.rb +47 -10
  47. data/lib/generators/graphql/union_generator.rb +5 -5
  48. data/lib/graphql/analysis/ast/field_usage.rb +31 -2
  49. data/lib/graphql/analysis/ast/max_query_complexity.rb +0 -1
  50. data/lib/graphql/analysis/ast/query_complexity.rb +175 -68
  51. data/lib/graphql/analysis/ast/query_depth.rb +0 -1
  52. data/lib/graphql/analysis/ast/visitor.rb +54 -38
  53. data/lib/graphql/analysis/ast.rb +16 -16
  54. data/lib/graphql/analysis.rb +0 -7
  55. data/lib/graphql/backtrace/inspect_result.rb +0 -1
  56. data/lib/graphql/backtrace/table.rb +37 -16
  57. data/lib/graphql/backtrace/traced_error.rb +0 -1
  58. data/lib/graphql/backtrace/tracer.rb +39 -9
  59. data/lib/graphql/backtrace.rb +20 -17
  60. data/lib/graphql/dataloader/null_dataloader.rb +24 -0
  61. data/lib/graphql/dataloader/request.rb +19 -0
  62. data/lib/graphql/dataloader/request_all.rb +19 -0
  63. data/lib/graphql/dataloader/source.rb +164 -0
  64. data/lib/graphql/dataloader.rb +311 -0
  65. data/lib/graphql/date_encoding_error.rb +16 -0
  66. data/lib/graphql/deprecation.rb +9 -0
  67. data/lib/graphql/dig.rb +1 -1
  68. data/lib/graphql/execution/directive_checks.rb +2 -2
  69. data/lib/graphql/execution/errors.rb +77 -45
  70. data/lib/graphql/execution/interpreter/argument_value.rb +28 -0
  71. data/lib/graphql/execution/interpreter/arguments.rb +88 -0
  72. data/lib/graphql/execution/interpreter/arguments_cache.rb +105 -0
  73. data/lib/graphql/execution/interpreter/handles_raw_value.rb +18 -0
  74. data/lib/graphql/execution/interpreter/resolve.rb +62 -24
  75. data/lib/graphql/execution/interpreter/runtime.rb +773 -399
  76. data/lib/graphql/execution/interpreter.rb +206 -74
  77. data/lib/graphql/execution/lazy/lazy_method_map.rb +4 -0
  78. data/lib/graphql/execution/lazy.rb +11 -21
  79. data/lib/graphql/execution/lookahead.rb +65 -136
  80. data/lib/graphql/execution/multiplex.rb +6 -152
  81. data/lib/graphql/execution.rb +11 -4
  82. data/lib/graphql/filter.rb +1 -1
  83. data/lib/graphql/integer_decoding_error.rb +17 -0
  84. data/lib/graphql/integer_encoding_error.rb +18 -2
  85. data/lib/graphql/introspection/base_object.rb +2 -5
  86. data/lib/graphql/introspection/directive_location_enum.rb +2 -2
  87. data/lib/graphql/introspection/directive_type.rb +12 -6
  88. data/lib/graphql/introspection/dynamic_fields.rb +3 -8
  89. data/lib/graphql/introspection/entry_points.rb +5 -18
  90. data/lib/graphql/introspection/enum_value_type.rb +2 -2
  91. data/lib/graphql/introspection/field_type.rb +9 -5
  92. data/lib/graphql/introspection/input_value_type.rb +41 -11
  93. data/lib/graphql/introspection/introspection_query.rb +6 -92
  94. data/lib/graphql/introspection/schema_type.rb +12 -12
  95. data/lib/graphql/introspection/type_type.rb +34 -17
  96. data/lib/graphql/introspection.rb +100 -0
  97. data/lib/graphql/invalid_null_error.rb +18 -0
  98. data/lib/graphql/language/block_string.rb +20 -5
  99. data/lib/graphql/language/cache.rb +37 -0
  100. data/lib/graphql/language/definition_slice.rb +21 -10
  101. data/lib/graphql/language/document_from_schema_definition.rb +113 -71
  102. data/lib/graphql/language/lexer.rb +216 -1462
  103. data/lib/graphql/language/nodes.rb +128 -131
  104. data/lib/graphql/language/parser.rb +957 -912
  105. data/lib/graphql/language/parser.y +148 -120
  106. data/lib/graphql/language/printer.rb +48 -23
  107. data/lib/graphql/language/sanitized_printer.rb +222 -0
  108. data/lib/graphql/language/token.rb +0 -4
  109. data/lib/graphql/language/visitor.rb +192 -84
  110. data/lib/graphql/language.rb +3 -1
  111. data/lib/graphql/name_validator.rb +2 -7
  112. data/lib/graphql/pagination/active_record_relation_connection.rb +77 -0
  113. data/lib/graphql/pagination/array_connection.rb +79 -0
  114. data/lib/graphql/pagination/connection.rb +253 -0
  115. data/lib/graphql/pagination/connections.rb +135 -0
  116. data/lib/graphql/pagination/mongoid_relation_connection.rb +25 -0
  117. data/lib/graphql/pagination/relation_connection.rb +228 -0
  118. data/lib/graphql/pagination/sequel_dataset_connection.rb +28 -0
  119. data/lib/graphql/pagination.rb +6 -0
  120. data/lib/graphql/parse_error.rb +0 -1
  121. data/lib/graphql/query/context.rb +204 -203
  122. data/lib/graphql/query/fingerprint.rb +26 -0
  123. data/lib/graphql/query/input_validation_result.rb +33 -7
  124. data/lib/graphql/query/null_context.rb +21 -8
  125. data/lib/graphql/query/validation_pipeline.rb +16 -38
  126. data/lib/graphql/query/variable_validation_error.rb +3 -3
  127. data/lib/graphql/query/variables.rb +39 -12
  128. data/lib/graphql/query.rb +88 -40
  129. data/lib/graphql/railtie.rb +6 -102
  130. data/lib/graphql/rake_task/validate.rb +4 -1
  131. data/lib/graphql/rake_task.rb +41 -10
  132. data/lib/graphql/relay/range_add.rb +17 -10
  133. data/lib/graphql/relay.rb +0 -15
  134. data/lib/graphql/rubocop/graphql/base_cop.rb +36 -0
  135. data/lib/graphql/rubocop/graphql/default_null_true.rb +43 -0
  136. data/lib/graphql/rubocop/graphql/default_required_true.rb +43 -0
  137. data/lib/graphql/rubocop.rb +4 -0
  138. data/lib/graphql/schema/addition.rb +245 -0
  139. data/lib/graphql/schema/argument.rb +284 -33
  140. data/lib/graphql/schema/base_64_encoder.rb +2 -0
  141. data/lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb +1 -1
  142. data/lib/graphql/schema/build_from_definition/resolve_map.rb +13 -5
  143. data/lib/graphql/schema/build_from_definition.rb +336 -205
  144. data/lib/graphql/schema/built_in_types.rb +5 -5
  145. data/lib/graphql/schema/directive/deprecated.rb +18 -0
  146. data/lib/graphql/schema/directive/feature.rb +1 -1
  147. data/lib/graphql/schema/directive/flagged.rb +57 -0
  148. data/lib/graphql/schema/directive/include.rb +2 -2
  149. data/lib/graphql/schema/directive/one_of.rb +12 -0
  150. data/lib/graphql/schema/directive/skip.rb +2 -2
  151. data/lib/graphql/schema/directive/transform.rb +14 -2
  152. data/lib/graphql/schema/directive.rb +134 -15
  153. data/lib/graphql/schema/enum.rb +137 -39
  154. data/lib/graphql/schema/enum_value.rb +20 -23
  155. data/lib/graphql/schema/field/connection_extension.rb +50 -20
  156. data/lib/graphql/schema/field/scope_extension.rb +1 -1
  157. data/lib/graphql/schema/field.rb +503 -331
  158. data/lib/graphql/schema/field_extension.rb +89 -2
  159. data/lib/graphql/schema/find_inherited_value.rb +17 -1
  160. data/lib/graphql/schema/finder.rb +16 -14
  161. data/lib/graphql/schema/input_object.rb +182 -60
  162. data/lib/graphql/schema/interface.rb +24 -49
  163. data/lib/graphql/schema/introspection_system.rb +103 -37
  164. data/lib/graphql/schema/late_bound_type.rb +9 -2
  165. data/lib/graphql/schema/list.rb +61 -3
  166. data/lib/graphql/schema/loader.rb +144 -96
  167. data/lib/graphql/schema/member/base_dsl_methods.rb +41 -37
  168. data/lib/graphql/schema/member/build_type.rb +24 -15
  169. data/lib/graphql/schema/member/has_arguments.rb +310 -26
  170. data/lib/graphql/schema/member/has_ast_node.rb +32 -0
  171. data/lib/graphql/schema/member/has_deprecation_reason.rb +24 -0
  172. data/lib/graphql/schema/member/has_directives.rb +120 -0
  173. data/lib/graphql/schema/member/has_fields.rb +112 -34
  174. data/lib/graphql/schema/member/has_interfaces.rb +129 -0
  175. data/lib/graphql/schema/member/has_unresolved_type_error.rb +15 -0
  176. data/lib/graphql/schema/member/has_validators.rb +57 -0
  177. data/lib/graphql/schema/member/relay_shortcuts.rb +47 -2
  178. data/lib/graphql/schema/member/type_system_helpers.rb +20 -3
  179. data/lib/graphql/schema/member/validates_input.rb +33 -0
  180. data/lib/graphql/schema/member.rb +11 -6
  181. data/lib/graphql/schema/mutation.rb +4 -9
  182. data/lib/graphql/schema/non_null.rb +34 -4
  183. data/lib/graphql/schema/object.rb +36 -60
  184. data/lib/graphql/schema/printer.rb +16 -35
  185. data/lib/graphql/schema/relay_classic_mutation.rb +91 -44
  186. data/lib/graphql/schema/resolver/has_payload_type.rb +51 -11
  187. data/lib/graphql/schema/resolver.rb +147 -94
  188. data/lib/graphql/schema/scalar.rb +40 -15
  189. data/lib/graphql/schema/subscription.rb +60 -31
  190. data/lib/graphql/schema/timeout.rb +45 -35
  191. data/lib/graphql/schema/type_expression.rb +21 -13
  192. data/lib/graphql/schema/type_membership.rb +23 -6
  193. data/lib/graphql/schema/union.rb +49 -15
  194. data/lib/graphql/schema/unique_within_type.rb +1 -2
  195. data/lib/graphql/schema/validator/allow_blank_validator.rb +29 -0
  196. data/lib/graphql/schema/validator/allow_null_validator.rb +26 -0
  197. data/lib/graphql/schema/validator/exclusion_validator.rb +33 -0
  198. data/lib/graphql/schema/validator/format_validator.rb +48 -0
  199. data/lib/graphql/schema/validator/inclusion_validator.rb +35 -0
  200. data/lib/graphql/schema/validator/length_validator.rb +59 -0
  201. data/lib/graphql/schema/validator/numericality_validator.rb +82 -0
  202. data/lib/graphql/schema/validator/required_validator.rb +82 -0
  203. data/lib/graphql/schema/validator.rb +171 -0
  204. data/lib/graphql/schema/warden.rb +211 -35
  205. data/lib/graphql/schema/wrapper.rb +0 -5
  206. data/lib/graphql/schema.rb +833 -889
  207. data/lib/graphql/static_validation/all_rules.rb +3 -0
  208. data/lib/graphql/static_validation/base_visitor.rb +21 -31
  209. data/lib/graphql/static_validation/definition_dependencies.rb +7 -2
  210. data/lib/graphql/static_validation/error.rb +3 -1
  211. data/lib/graphql/static_validation/literal_validator.rb +69 -26
  212. data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +45 -83
  213. data/lib/graphql/static_validation/rules/argument_literals_are_compatible_error.rb +22 -6
  214. data/lib/graphql/static_validation/rules/arguments_are_defined.rb +35 -26
  215. data/lib/graphql/static_validation/rules/arguments_are_defined_error.rb +4 -2
  216. data/lib/graphql/static_validation/rules/directives_are_defined.rb +12 -6
  217. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +14 -14
  218. data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +4 -4
  219. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +5 -5
  220. data/lib/graphql/static_validation/rules/fields_will_merge.rb +94 -51
  221. data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +25 -4
  222. data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +3 -3
  223. data/lib/graphql/static_validation/rules/fragments_are_finite.rb +2 -2
  224. data/lib/graphql/static_validation/rules/input_object_names_are_unique.rb +30 -0
  225. data/lib/graphql/static_validation/rules/input_object_names_are_unique_error.rb +30 -0
  226. data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid.rb +66 -0
  227. data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid_error.rb +29 -0
  228. data/lib/graphql/static_validation/rules/query_root_exists.rb +17 -0
  229. data/lib/graphql/static_validation/rules/query_root_exists_error.rb +26 -0
  230. data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +4 -2
  231. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +9 -10
  232. data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +13 -7
  233. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +12 -13
  234. data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +19 -14
  235. data/lib/graphql/static_validation/rules/variables_are_input_types.rb +1 -1
  236. data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +5 -3
  237. data/lib/graphql/static_validation/type_stack.rb +2 -2
  238. data/lib/graphql/static_validation/validation_context.rb +13 -3
  239. data/lib/graphql/static_validation/validation_timeout_error.rb +25 -0
  240. data/lib/graphql/static_validation/validator.rb +32 -20
  241. data/lib/graphql/static_validation.rb +1 -2
  242. data/lib/graphql/string_encoding_error.rb +13 -3
  243. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +129 -22
  244. data/lib/graphql/subscriptions/broadcast_analyzer.rb +81 -0
  245. data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +58 -0
  246. data/lib/graphql/subscriptions/event.rb +84 -35
  247. data/lib/graphql/subscriptions/instrumentation.rb +0 -47
  248. data/lib/graphql/subscriptions/serialize.rb +53 -6
  249. data/lib/graphql/subscriptions.rb +137 -57
  250. data/lib/graphql/tracing/active_support_notifications_trace.rb +16 -0
  251. data/lib/graphql/tracing/active_support_notifications_tracing.rb +8 -17
  252. data/lib/graphql/tracing/appoptics_trace.rb +231 -0
  253. data/lib/graphql/tracing/appoptics_tracing.rb +173 -0
  254. data/lib/graphql/tracing/appsignal_trace.rb +71 -0
  255. data/lib/graphql/tracing/appsignal_tracing.rb +23 -0
  256. data/lib/graphql/tracing/data_dog_trace.rb +148 -0
  257. data/lib/graphql/tracing/data_dog_tracing.rb +34 -2
  258. data/lib/graphql/tracing/new_relic_trace.rb +75 -0
  259. data/lib/graphql/tracing/new_relic_tracing.rb +9 -12
  260. data/lib/graphql/tracing/notifications_trace.rb +41 -0
  261. data/lib/graphql/tracing/notifications_tracing.rb +59 -0
  262. data/lib/graphql/tracing/platform_trace.rb +107 -0
  263. data/lib/graphql/tracing/platform_tracing.rb +76 -35
  264. data/lib/graphql/tracing/prometheus_trace.rb +89 -0
  265. data/lib/graphql/tracing/prometheus_tracing/graphql_collector.rb +4 -1
  266. data/lib/graphql/tracing/prometheus_tracing.rb +11 -3
  267. data/lib/graphql/tracing/scout_trace.rb +72 -0
  268. data/lib/graphql/tracing/scout_tracing.rb +19 -0
  269. data/lib/graphql/tracing/statsd_trace.rb +56 -0
  270. data/lib/graphql/tracing/statsd_tracing.rb +42 -0
  271. data/lib/graphql/tracing.rb +143 -67
  272. data/lib/graphql/type_kinds.rb +6 -3
  273. data/lib/graphql/types/big_int.rb +5 -1
  274. data/lib/graphql/types/int.rb +10 -3
  275. data/lib/graphql/types/iso_8601_date.rb +20 -9
  276. data/lib/graphql/types/iso_8601_date_time.rb +36 -10
  277. data/lib/graphql/types/relay/base_connection.rb +18 -90
  278. data/lib/graphql/types/relay/base_edge.rb +2 -34
  279. data/lib/graphql/types/relay/connection_behaviors.rb +176 -0
  280. data/lib/graphql/types/relay/edge_behaviors.rb +75 -0
  281. data/lib/graphql/types/relay/has_node_field.rb +41 -0
  282. data/lib/graphql/types/relay/has_nodes_field.rb +41 -0
  283. data/lib/graphql/types/relay/node.rb +2 -4
  284. data/lib/graphql/types/relay/node_behaviors.rb +25 -0
  285. data/lib/graphql/types/relay/page_info.rb +2 -14
  286. data/lib/graphql/types/relay/page_info_behaviors.rb +30 -0
  287. data/lib/graphql/types/relay.rb +10 -5
  288. data/lib/graphql/types/string.rb +8 -2
  289. data/lib/graphql/unauthorized_error.rb +2 -2
  290. data/lib/graphql/unresolved_type_error.rb +2 -2
  291. data/lib/graphql/version.rb +1 -1
  292. data/lib/graphql.rb +60 -66
  293. data/readme.md +3 -6
  294. metadata +124 -236
  295. data/lib/graphql/analysis/analyze_query.rb +0 -91
  296. data/lib/graphql/analysis/field_usage.rb +0 -45
  297. data/lib/graphql/analysis/max_query_complexity.rb +0 -26
  298. data/lib/graphql/analysis/max_query_depth.rb +0 -26
  299. data/lib/graphql/analysis/query_complexity.rb +0 -88
  300. data/lib/graphql/analysis/query_depth.rb +0 -43
  301. data/lib/graphql/analysis/reducer_state.rb +0 -48
  302. data/lib/graphql/argument.rb +0 -159
  303. data/lib/graphql/authorization.rb +0 -82
  304. data/lib/graphql/backwards_compatibility.rb +0 -60
  305. data/lib/graphql/base_type.rb +0 -226
  306. data/lib/graphql/boolean_type.rb +0 -2
  307. data/lib/graphql/compatibility/execution_specification/counter_schema.rb +0 -53
  308. data/lib/graphql/compatibility/execution_specification/specification_schema.rb +0 -200
  309. data/lib/graphql/compatibility/execution_specification.rb +0 -435
  310. data/lib/graphql/compatibility/lazy_execution_specification/lazy_schema.rb +0 -111
  311. data/lib/graphql/compatibility/lazy_execution_specification.rb +0 -213
  312. data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +0 -91
  313. data/lib/graphql/compatibility/query_parser_specification/query_assertions.rb +0 -79
  314. data/lib/graphql/compatibility/query_parser_specification.rb +0 -264
  315. data/lib/graphql/compatibility/schema_parser_specification.rb +0 -680
  316. data/lib/graphql/compatibility.rb +0 -5
  317. data/lib/graphql/define/assign_argument.rb +0 -12
  318. data/lib/graphql/define/assign_connection.rb +0 -13
  319. data/lib/graphql/define/assign_enum_value.rb +0 -18
  320. data/lib/graphql/define/assign_global_id_field.rb +0 -11
  321. data/lib/graphql/define/assign_mutation_function.rb +0 -34
  322. data/lib/graphql/define/assign_object_field.rb +0 -42
  323. data/lib/graphql/define/defined_object_proxy.rb +0 -50
  324. data/lib/graphql/define/instance_definable.rb +0 -300
  325. data/lib/graphql/define/no_definition_error.rb +0 -7
  326. data/lib/graphql/define/non_null_with_bang.rb +0 -16
  327. data/lib/graphql/define/type_definer.rb +0 -31
  328. data/lib/graphql/define.rb +0 -31
  329. data/lib/graphql/deprecated_dsl.rb +0 -42
  330. data/lib/graphql/directive/deprecated_directive.rb +0 -13
  331. data/lib/graphql/directive/include_directive.rb +0 -2
  332. data/lib/graphql/directive/skip_directive.rb +0 -2
  333. data/lib/graphql/directive.rb +0 -104
  334. data/lib/graphql/enum_type.rb +0 -193
  335. data/lib/graphql/execution/execute.rb +0 -326
  336. data/lib/graphql/execution/flatten.rb +0 -40
  337. data/lib/graphql/execution/instrumentation.rb +0 -92
  338. data/lib/graphql/execution/interpreter/hash_response.rb +0 -46
  339. data/lib/graphql/execution/lazy/resolve.rb +0 -91
  340. data/lib/graphql/execution/typecast.rb +0 -50
  341. data/lib/graphql/field/resolve.rb +0 -59
  342. data/lib/graphql/field.rb +0 -330
  343. data/lib/graphql/float_type.rb +0 -2
  344. data/lib/graphql/function.rb +0 -153
  345. data/lib/graphql/id_type.rb +0 -2
  346. data/lib/graphql/input_object_type.rb +0 -154
  347. data/lib/graphql/int_type.rb +0 -2
  348. data/lib/graphql/interface_type.rb +0 -86
  349. data/lib/graphql/internal_representation/document.rb +0 -27
  350. data/lib/graphql/internal_representation/node.rb +0 -206
  351. data/lib/graphql/internal_representation/print.rb +0 -51
  352. data/lib/graphql/internal_representation/rewrite.rb +0 -184
  353. data/lib/graphql/internal_representation/scope.rb +0 -88
  354. data/lib/graphql/internal_representation/visit.rb +0 -36
  355. data/lib/graphql/internal_representation.rb +0 -7
  356. data/lib/graphql/language/lexer.rl +0 -258
  357. data/lib/graphql/list_type.rb +0 -80
  358. data/lib/graphql/literal_validation_error.rb +0 -6
  359. data/lib/graphql/non_null_type.rb +0 -81
  360. data/lib/graphql/object_type.rb +0 -141
  361. data/lib/graphql/query/arguments.rb +0 -187
  362. data/lib/graphql/query/arguments_cache.rb +0 -25
  363. data/lib/graphql/query/executor.rb +0 -53
  364. data/lib/graphql/query/literal_input.rb +0 -116
  365. data/lib/graphql/query/serial_execution/field_resolution.rb +0 -92
  366. data/lib/graphql/query/serial_execution/operation_resolution.rb +0 -19
  367. data/lib/graphql/query/serial_execution/selection_resolution.rb +0 -23
  368. data/lib/graphql/query/serial_execution/value_resolution.rb +0 -87
  369. data/lib/graphql/query/serial_execution.rb +0 -39
  370. data/lib/graphql/relay/array_connection.rb +0 -85
  371. data/lib/graphql/relay/base_connection.rb +0 -172
  372. data/lib/graphql/relay/connection_instrumentation.rb +0 -54
  373. data/lib/graphql/relay/connection_resolve.rb +0 -43
  374. data/lib/graphql/relay/connection_type.rb +0 -40
  375. data/lib/graphql/relay/edge.rb +0 -27
  376. data/lib/graphql/relay/edge_type.rb +0 -18
  377. data/lib/graphql/relay/edges_instrumentation.rb +0 -40
  378. data/lib/graphql/relay/global_id_resolve.rb +0 -18
  379. data/lib/graphql/relay/mongo_relation_connection.rb +0 -50
  380. data/lib/graphql/relay/mutation/instrumentation.rb +0 -23
  381. data/lib/graphql/relay/mutation/resolve.rb +0 -56
  382. data/lib/graphql/relay/mutation/result.rb +0 -38
  383. data/lib/graphql/relay/mutation.rb +0 -190
  384. data/lib/graphql/relay/node.rb +0 -36
  385. data/lib/graphql/relay/page_info.rb +0 -7
  386. data/lib/graphql/relay/relation_connection.rb +0 -190
  387. data/lib/graphql/relay/type_extensions.rb +0 -30
  388. data/lib/graphql/scalar_type.rb +0 -133
  389. data/lib/graphql/schema/catchall_middleware.rb +0 -35
  390. data/lib/graphql/schema/default_parse_error.rb +0 -10
  391. data/lib/graphql/schema/default_type_error.rb +0 -15
  392. data/lib/graphql/schema/member/accepts_definition.rb +0 -152
  393. data/lib/graphql/schema/member/cached_graphql_definition.rb +0 -26
  394. data/lib/graphql/schema/member/instrumentation.rb +0 -132
  395. data/lib/graphql/schema/middleware_chain.rb +0 -82
  396. data/lib/graphql/schema/possible_types.rb +0 -39
  397. data/lib/graphql/schema/rescue_middleware.rb +0 -60
  398. data/lib/graphql/schema/timeout_middleware.rb +0 -86
  399. data/lib/graphql/schema/traversal.rb +0 -228
  400. data/lib/graphql/schema/validation.rb +0 -303
  401. data/lib/graphql/static_validation/default_visitor.rb +0 -15
  402. data/lib/graphql/static_validation/no_validate_visitor.rb +0 -10
  403. data/lib/graphql/string_type.rb +0 -2
  404. data/lib/graphql/subscriptions/subscription_root.rb +0 -66
  405. data/lib/graphql/tracing/skylight_tracing.rb +0 -62
  406. data/lib/graphql/types/relay/base_field.rb +0 -22
  407. data/lib/graphql/types/relay/base_interface.rb +0 -29
  408. data/lib/graphql/types/relay/base_object.rb +0 -26
  409. data/lib/graphql/types/relay/node_field.rb +0 -43
  410. data/lib/graphql/types/relay/nodes_field.rb +0 -45
  411. data/lib/graphql/union_type.rb +0 -128
  412. data/lib/graphql/upgrader/member.rb +0 -936
  413. data/lib/graphql/upgrader/schema.rb +0 -37
@@ -16,10 +16,8 @@ module GraphQL
16
16
  class ValidationPipeline
17
17
  attr_reader :max_depth, :max_complexity
18
18
 
19
- def initialize(query:, validate:, parse_error:, operation_name_error:, max_depth:, max_complexity:)
19
+ def initialize(query:, parse_error:, operation_name_error:, max_depth:, max_complexity:)
20
20
  @validation_errors = []
21
- @internal_representation = nil
22
- @validate = validate
23
21
  @parse_error = parse_error
24
22
  @operation_name_error = operation_name_error
25
23
  @query = query
@@ -36,23 +34,21 @@ module GraphQL
36
34
  @valid
37
35
  end
38
36
 
39
- # @return [Array<GraphQL::StaticValidation::Error >] Static validation errors for the query string
37
+ # @return [Array<GraphQL::StaticValidation::Error, GraphQL::Query::VariableValidationError>] Static validation errors for the query string
40
38
  def validation_errors
41
39
  ensure_has_validated
42
40
  @validation_errors
43
41
  end
44
42
 
45
- # @return [Hash<String, nil => GraphQL::InternalRepresentation::Node] Operation name -> Irep node pairs
46
- def internal_representation
47
- ensure_has_validated
48
- @internal_representation
49
- end
50
-
51
43
  def analyzers
52
44
  ensure_has_validated
53
45
  @query_analyzers
54
46
  end
55
47
 
48
+ def has_validated?
49
+ @has_validated == true
50
+ end
51
+
56
52
  private
57
53
 
58
54
  # If the pipeline wasn't run yet, run it.
@@ -63,7 +59,7 @@ module GraphQL
63
59
 
64
60
  if @parse_error
65
61
  # This is kind of crazy: we push the parse error into `ctx`
66
- # in {DefaultParseError} so that users can _opt out_ by redefining that hook.
62
+ # in `def self.parse_error` by default so that users can _opt out_ by redefining that hook.
67
63
  # That means we can't _re-add_ the error here (otherwise we'd either
68
64
  # add it twice _or_ override the user's choice to not add it).
69
65
  # So we just have to know that it was invalid and go from there.
@@ -72,9 +68,8 @@ module GraphQL
72
68
  elsif @operation_name_error
73
69
  @validation_errors << @operation_name_error
74
70
  else
75
- validation_result = @schema.static_validator.validate(@query, validate: @validate)
71
+ validation_result = @schema.static_validator.validate(@query, validate: @query.validate, timeout: @schema.validate_timeout, max_errors: @schema.validate_max_errors)
76
72
  @validation_errors.concat(validation_result[:errors])
77
- @internal_representation = validation_result[:irep]
78
73
 
79
74
  if @validation_errors.empty?
80
75
  @validation_errors.concat(@query.variables.errors)
@@ -90,6 +85,9 @@ module GraphQL
90
85
  end
91
86
 
92
87
  @valid = @validation_errors.empty?
88
+ rescue SystemStackError => err
89
+ @valid = false
90
+ @schema.query_stack_error(@query, err)
93
91
  end
94
92
 
95
93
  # If there are max_* values, add them,
@@ -97,35 +95,15 @@ module GraphQL
97
95
  def build_analyzers(schema, max_depth, max_complexity)
98
96
  qa = schema.query_analyzers.dup
99
97
 
100
- # Filter out the built in authorization analyzer.
101
- # It is deprecated and does not have an AST analyzer alternative.
102
- qa = qa.select do |analyzer|
103
- if analyzer == GraphQL::Authorization::Analyzer && schema.using_ast_analysis?
104
- raise "The Authorization analyzer is not supported with AST Analyzers"
105
- else
106
- true
107
- end
108
- end
109
-
110
98
  if max_depth || max_complexity
111
99
  # Depending on the analysis engine, we must use different analyzers
112
100
  # remove this once everything has switched over to AST analyzers
113
- if schema.using_ast_analysis?
114
- if max_depth
115
- qa << GraphQL::Analysis::AST::MaxQueryDepth
116
- end
117
- if max_complexity
118
- qa << GraphQL::Analysis::AST::MaxQueryComplexity
119
- end
120
- else
121
- if max_depth
122
- qa << GraphQL::Analysis::MaxQueryDepth.new(max_depth)
123
- end
124
- if max_complexity
125
- qa << GraphQL::Analysis::MaxQueryComplexity.new(max_complexity)
126
- end
101
+ if max_depth
102
+ qa << GraphQL::Analysis::AST::MaxQueryDepth
103
+ end
104
+ if max_complexity
105
+ qa << GraphQL::Analysis::AST::MaxQueryComplexity
127
106
  end
128
-
129
107
  qa
130
108
  else
131
109
  qa
@@ -4,11 +4,11 @@ module GraphQL
4
4
  class VariableValidationError < GraphQL::ExecutionError
5
5
  attr_accessor :value, :validation_result
6
6
 
7
- def initialize(variable_ast, type, value, validation_result)
7
+ def initialize(variable_ast, type, value, validation_result, msg: nil)
8
8
  @value = value
9
9
  @validation_result = validation_result
10
10
 
11
- msg = "Variable #{variable_ast.name} of type #{type} was provided invalid value"
11
+ msg ||= "Variable $#{variable_ast.name} of type #{type.to_type_signature} was provided invalid value"
12
12
 
13
13
  if problem_fields.any?
14
14
  msg += " for #{problem_fields.join(", ")}"
@@ -23,7 +23,7 @@ module GraphQL
23
23
  # a one level deep merge explicitly. However beyond that only show the
24
24
  # latest value and problems.
25
25
  super.merge({ "extensions" => { "value" => value, "problems" => validation_result.problems }}) do |key, oldValue, newValue|
26
- if oldValue.respond_to? merge
26
+ if oldValue.respond_to?(:merge)
27
27
  oldValue.merge(newValue)
28
28
  else
29
29
  newValue
@@ -14,14 +14,18 @@ module GraphQL
14
14
  schema = ctx.schema
15
15
  @context = ctx
16
16
 
17
- @provided_variables = GraphQL::Argument.deep_stringify(provided_variables)
17
+ @provided_variables = deep_stringify(provided_variables)
18
18
  @errors = []
19
19
  @storage = ast_variables.each_with_object({}) do |ast_variable, memo|
20
+ if schema.validate_max_errors && schema.validate_max_errors <= @errors.count
21
+ add_max_errors_reached_message
22
+ break
23
+ end
20
24
  # Find the right value for this variable:
21
25
  # - First, use the value provided at runtime
22
26
  # - Then, fall back to the default value from the query string
23
27
  # If it's still nil, raise an error if it's required.
24
- variable_type = schema.type_from_ast(ast_variable.type)
28
+ variable_type = schema.type_from_ast(ast_variable.type, context: ctx)
25
29
  if variable_type.nil?
26
30
  # Pass -- it will get handled by a validator
27
31
  else
@@ -29,27 +33,27 @@ module GraphQL
29
33
  default_value = ast_variable.default_value
30
34
  provided_value = @provided_variables[variable_name]
31
35
  value_was_provided = @provided_variables.key?(variable_name)
32
-
36
+ max_errors = schema.validate_max_errors - @errors.count if schema.validate_max_errors
33
37
  begin
34
- validation_result = variable_type.validate_input(provided_value, ctx)
38
+ validation_result = variable_type.validate_input(provided_value, ctx, max_errors: max_errors)
35
39
  if validation_result.valid?
36
40
  if value_was_provided
37
41
  # Add the variable if a value was provided
38
- memo[variable_name] = schema.error_handler.with_error_handling(context) do
39
- variable_type.coerce_input(provided_value, ctx)
40
- end
42
+ memo[variable_name] = provided_value
41
43
  elsif default_value != nil
42
- # Add the variable if it wasn't provided but it has a default value (including `null`)
43
- memo[variable_name] = GraphQL::Query::LiteralInput.coerce(variable_type, default_value, self)
44
+ memo[variable_name] = if default_value.is_a?(Language::Nodes::NullValue)
45
+ nil
46
+ else
47
+ default_value
48
+ end
44
49
  end
45
50
  end
46
- rescue GraphQL::CoercionError, GraphQL::ExecutionError => ex
51
+ rescue GraphQL::ExecutionError => ex
47
52
  # TODO: This should really include the path to the problematic node in the variable value
48
53
  # like InputValidationResults generated by validate_non_null_input but unfortunately we don't
49
54
  # have this information available in the coerce_input call chain. Note this path is the path
50
55
  # that appears under errors.extensions.problems.path and NOT the result path under errors.path.
51
- validation_result = GraphQL::Query::InputValidationResult.new
52
- validation_result.add_problem(ex.message)
56
+ validation_result = GraphQL::Query::InputValidationResult.from_problem(ex.message)
53
57
  end
54
58
 
55
59
  if !validation_result.valid?
@@ -60,6 +64,29 @@ module GraphQL
60
64
  end
61
65
 
62
66
  def_delegators :@storage, :length, :key?, :[], :fetch, :to_h
67
+
68
+ private
69
+
70
+ def deep_stringify(val)
71
+ case val
72
+ when Array
73
+ val.map { |v| deep_stringify(v) }
74
+ when Hash
75
+ new_val = {}
76
+ val.each do |k, v|
77
+ new_val[k.to_s] = deep_stringify(v)
78
+ end
79
+ new_val
80
+ else
81
+ val
82
+ end
83
+ end
84
+
85
+ def add_max_errors_reached_message
86
+ message = "Too many errors processing variables, max validation error limit reached. Execution aborted"
87
+ validation_result = GraphQL::Query::InputValidationResult.from_problem(message)
88
+ errors << GraphQL::Query::VariableValidationError.new(nil, nil, nil, validation_result, msg: message)
89
+ end
63
90
  end
64
91
  end
65
92
  end
data/lib/graphql/query.rb CHANGED
@@ -1,12 +1,8 @@
1
1
  # frozen_string_literal: true
2
- require "graphql/query/arguments"
3
- require "graphql/query/arguments_cache"
4
2
  require "graphql/query/context"
5
- require "graphql/query/executor"
6
- require "graphql/query/literal_input"
3
+ require "graphql/query/fingerprint"
7
4
  require "graphql/query/null_context"
8
5
  require "graphql/query/result"
9
- require "graphql/query/serial_execution"
10
6
  require "graphql/query/variables"
11
7
  require "graphql/query/input_validation_result"
12
8
  require "graphql/query/variable_validation_error"
@@ -38,7 +34,16 @@ module GraphQL
38
34
  attr_accessor :operation_name
39
35
 
40
36
  # @return [Boolean] if false, static validation is skipped (execution behavior for invalid queries is undefined)
41
- attr_accessor :validate
37
+ attr_reader :validate
38
+
39
+ # @param new_validate [Boolean] if false, static validation is skipped. This can't be reasssigned after validation.
40
+ def validate=(new_validate)
41
+ if defined?(@validation_pipeline) && @validation_pipeline && @validation_pipeline.has_validated?
42
+ raise ArgumentError, "Can't reassign Query#validate= after validation has run, remove this assignment."
43
+ else
44
+ @validate = new_validate
45
+ end
46
+ end
42
47
 
43
48
  attr_writer :query_string
44
49
 
@@ -78,29 +83,37 @@ module GraphQL
78
83
  # @param max_complexity [Numeric] the maximum field complexity for this query (falls back to schema-level value)
79
84
  # @param except [<#call(schema_member, context)>] If provided, objects will be hidden from the schema when `.call(schema_member, context)` returns truthy
80
85
  # @param only [<#call(schema_member, context)>] If provided, objects will be hidden from the schema when `.call(schema_member, context)` returns false
81
- def initialize(schema, query_string = nil, query: nil, document: nil, context: nil, variables: nil, validate: true, subscription_topic: nil, operation_name: nil, root_value: nil, max_depth: schema.max_depth, max_complexity: schema.max_complexity, except: nil, only: nil)
86
+ def initialize(schema, query_string = nil, query: nil, document: nil, context: nil, variables: nil, validate: true, subscription_topic: nil, operation_name: nil, root_value: nil, max_depth: schema.max_depth, max_complexity: schema.max_complexity, except: nil, only: nil, warden: nil)
82
87
  # Even if `variables: nil` is passed, use an empty hash for simpler logic
83
88
  variables ||= {}
84
89
  @schema = schema
85
90
  @filter = schema.default_filter.merge(except: except, only: only)
86
91
  @context = schema.context_class.new(query: self, object: root_value, values: context)
92
+ @warden = warden
87
93
  @subscription_topic = subscription_topic
88
94
  @root_value = root_value
89
95
  @fragments = nil
90
96
  @operations = nil
91
97
  @validate = validate
92
- # TODO: remove support for global tracers
93
- @tracers = schema.tracers + GraphQL::Tracing.tracers + (context ? context.fetch(:tracers, []) : [])
98
+ context_tracers = (context ? context.fetch(:tracers, []) : [])
99
+ @tracers = schema.tracers + context_tracers
100
+
94
101
  # Support `ctx[:backtrace] = true` for wrapping backtraces
95
102
  if context && context[:backtrace] && !@tracers.include?(GraphQL::Backtrace::Tracer)
103
+ context_tracers += [GraphQL::Backtrace::Tracer]
96
104
  @tracers << GraphQL::Backtrace::Tracer
97
105
  end
98
106
 
107
+ if context_tracers.any? && !(schema.trace_class <= GraphQL::Tracing::LegacyTrace)
108
+ raise ArgumentError, "context[:tracers] and context[:backtrace] are not supported without `tracer_class(GraphQL::Tracing::LegacyTrace)` in the schema configuration, please add it."
109
+ end
110
+
111
+
99
112
  @analysis_errors = []
100
113
  if variables.is_a?(String)
101
114
  raise ArgumentError, "Query variables should be a Hash, not a String. Try JSON.parse to prepare variables."
102
115
  else
103
- @provided_variables = variables
116
+ @provided_variables = variables || {}
104
117
  end
105
118
 
106
119
  @query_string = query_string || query
@@ -110,6 +123,10 @@ module GraphQL
110
123
  raise ArgumentError, "Query should only be provided a query string or a document, not both."
111
124
  end
112
125
 
126
+ if @query_string && !@query_string.is_a?(String)
127
+ raise ArgumentError, "Query string argument should be a String, got #{@query_string.class.name} instead."
128
+ end
129
+
113
130
  # A two-layer cache of type resolution:
114
131
  # { abstract_type => { value => resolved_type } }
115
132
  @resolved_types_cache = Hash.new do |h1, k1|
@@ -118,8 +135,6 @@ module GraphQL
118
135
  end
119
136
  end
120
137
 
121
- @arguments_cache = ArgumentsCache.build(self)
122
-
123
138
  # Trying to execute a document
124
139
  # with no operations returns an empty hash
125
140
  @ast_variables = []
@@ -134,7 +149,6 @@ module GraphQL
134
149
  @executed = false
135
150
 
136
151
  # TODO add a general way to define schema-level filters
137
- # TODO also add this to schema dumps
138
152
  if @schema.respond_to?(:visible?)
139
153
  merge_filters(only: @schema.method(:visible?))
140
154
  end
@@ -145,7 +159,16 @@ module GraphQL
145
159
  @query_string ||= (document ? document.to_query_string : nil)
146
160
  end
147
161
 
148
- def_delegators :@schema, :interpreter?
162
+ def interpreter?
163
+ true
164
+ end
165
+
166
+ attr_accessor :multiplex
167
+
168
+ # @return [GraphQL::Tracing::Trace]
169
+ def current_trace
170
+ @current_trace ||= multiplex ? multiplex.current_trace : schema.new_trace(multiplex: multiplex, query: self)
171
+ end
149
172
 
150
173
  def subscription_update?
151
174
  @subscription_topic && subscription?
@@ -157,7 +180,6 @@ module GraphQL
157
180
  @lookahead ||= begin
158
181
  ast_node = selected_operation
159
182
  root_type = warden.root_type_for_operation(ast_node.operation_type || "query")
160
- root_type = root_type.metadata[:type_class] || raise("Invariant: `lookahead` only works with class-based types")
161
183
  GraphQL::Execution::Lookahead.new(query: self, root_type: root_type, ast_nodes: [ast_node])
162
184
  end
163
185
  end
@@ -187,9 +209,7 @@ module GraphQL
187
209
  # @return [Hash] A GraphQL response, with `"data"` and/or `"errors"` keys
188
210
  def result
189
211
  if !@executed
190
- with_prepared_ast {
191
- Execution::Multiplex.run_queries(@schema, [self], context: @context)
192
- }
212
+ Execution::Interpreter.run_all(@schema, [self], context: @context)
193
213
  end
194
214
  @result ||= Query::Result.new(query: self, values: @result_values)
195
215
  end
@@ -227,28 +247,60 @@ module GraphQL
227
247
  end
228
248
  end
229
249
 
230
- def irep_selection
231
- @selection ||= begin
232
- if selected_operation && internal_representation
233
- internal_representation.operation_definitions[selected_operation.name]
234
- else
235
- nil
236
- end
237
- end
250
+ # Node-level cache for calculating arguments. Used during execution and query analysis.
251
+ # @param ast_node [GraphQL::Language::Nodes::AbstractNode]
252
+ # @param definition [GraphQL::Schema::Field]
253
+ # @param parent_object [GraphQL::Schema::Object]
254
+ # @return Hash{Symbol => Object}
255
+ def arguments_for(ast_node, definition, parent_object: nil)
256
+ arguments_cache.fetch(ast_node, definition, parent_object)
238
257
  end
239
258
 
240
- # Node-level cache for calculating arguments. Used during execution and query analysis.
241
- # @api private
242
- # @return [GraphQL::Query::Arguments] Arguments for this node, merging default values, literal values and query variables
243
- def arguments_for(irep_or_ast_node, definition)
244
- @arguments_cache[irep_or_ast_node][definition]
259
+ def arguments_cache
260
+ @arguments_cache ||= Execution::Interpreter::ArgumentsCache.new(self)
261
+ end
262
+
263
+ # A version of the given query string, with:
264
+ # - Variables inlined to the query
265
+ # - Strings replaced with `<REDACTED>`
266
+ # @return [String, nil] Returns nil if the query is invalid.
267
+ def sanitized_query_string(inline_variables: true)
268
+ with_prepared_ast {
269
+ schema.sanitized_printer.new(self, inline_variables: inline_variables).sanitized_query_string
270
+ }
271
+ end
272
+
273
+ # This contains a few components:
274
+ #
275
+ # - The selected operation name (or `anonymous`)
276
+ # - The fingerprint of the query string
277
+ # - The number of given variables (for readability)
278
+ # - The fingerprint of the given variables
279
+ #
280
+ # This fingerprint can be used to track runs of the same operation-variables combination over time.
281
+ #
282
+ # @see operation_fingerprint
283
+ # @see variables_fingerprint
284
+ # @return [String] An opaque hash identifying this operation-variables combination
285
+ def fingerprint
286
+ @fingerprint ||= "#{operation_fingerprint}/#{variables_fingerprint}"
287
+ end
288
+
289
+ # @return [String] An opaque hash for identifying this query's given query string and selected operation
290
+ def operation_fingerprint
291
+ @operation_fingerprint ||= "#{selected_operation_name || "anonymous"}/#{Fingerprint.generate(query_string)}"
292
+ end
293
+
294
+ # @return [String] An opaque hash for identifying this query's given a variable values (not including defaults)
295
+ def variables_fingerprint
296
+ @variables_fingerprint ||= "#{provided_variables.size}/#{Fingerprint.generate(provided_variables.to_json)}"
245
297
  end
246
298
 
247
299
  def validation_pipeline
248
300
  with_prepared_ast { @validation_pipeline }
249
301
  end
250
302
 
251
- def_delegators :validation_pipeline, :validation_errors, :internal_representation,
303
+ def_delegators :validation_pipeline, :validation_errors,
252
304
  :analyzers, :ast_analyzers, :max_depth, :max_complexity
253
305
 
254
306
  attr_accessor :analysis_errors
@@ -301,10 +353,8 @@ module GraphQL
301
353
  end
302
354
 
303
355
  # @api private
304
- def with_error_handling
305
- schema.error_handler.with_error_handling(context) do
306
- yield
307
- end
356
+ def handle_or_reraise(err)
357
+ schema.handle_or_reraise(context, err)
308
358
  end
309
359
 
310
360
  private
@@ -321,12 +371,11 @@ module GraphQL
321
371
 
322
372
  def prepare_ast
323
373
  @prepared_ast = true
324
- @warden = GraphQL::Schema::Warden.new(@filter, schema: @schema, context: @context)
325
-
374
+ @warden ||= GraphQL::Schema::Warden.new(@filter, schema: @schema, context: @context)
326
375
  parse_error = nil
327
376
  @document ||= begin
328
377
  if query_string
329
- GraphQL.parse(query_string, tracer: self)
378
+ GraphQL.parse(query_string, trace: self.current_trace)
330
379
  end
331
380
  rescue GraphQL::ParseError => err
332
381
  parse_error = err
@@ -375,7 +424,6 @@ module GraphQL
375
424
 
376
425
  @validation_pipeline = GraphQL::Query::ValidationPipeline.new(
377
426
  query: self,
378
- validate: @validate,
379
427
  parse_error: parse_error,
380
428
  operation_name_error: operation_name_error,
381
429
  max_depth: @max_depth,
@@ -1,108 +1,12 @@
1
1
  # frozen_string_literal: true
2
-
3
-
4
2
  module GraphQL
5
3
  class Railtie < Rails::Railtie
6
- rake_tasks do
7
- # Defer this so that you only need the `parser` gem when you _run_ the upgrader
8
- def load_upgraders
9
- require_relative './upgrader/member'
10
- require_relative './upgrader/schema'
11
- end
12
-
13
- namespace :graphql do
14
- task :upgrade, [:dir] do |t, args|
15
- unless (dir = args[:dir])
16
- fail 'You have to give me a directory where your GraphQL schema and types live. ' \
17
- 'For example: `bin/rake graphql:upgrade[app/graphql/**/*]`'
18
- end
19
-
20
- Dir[dir].each do |file|
21
- # Members (types, interfaces, etc.)
22
- if file =~ /.*_(type|interface|enum|union|)\.rb$/
23
- Rake::Task["graphql:upgrade:member"].execute(Struct.new(:member_file).new(file))
24
- end
25
- end
26
-
27
- puts "Upgrade complete! Note that this is a best-effort approach, and may very well contain some bugs."
28
- puts "Don't forget to create the base objects. For example, you could run:"
29
- puts "\tbin/rake graphql:upgrade:create_base_objects[app/graphql]"
30
- end
31
-
32
- namespace :upgrade do
33
- task :create_base_objects, [:base_dir] do |t, args|
34
- unless (base_dir = args[:base_dir])
35
- fail 'You have to give me a directory where your GraphQL types live. ' \
36
- 'For example: `bin/rake graphql:upgrade:create_base_objects[app/graphql]`'
37
- end
38
-
39
- destination_file = File.join(base_dir, "types", "base_scalar.rb")
40
- unless File.exists?(destination_file)
41
- FileUtils.mkdir_p(File.dirname(destination_file))
42
- File.open(destination_file, 'w') do |f|
43
- f.puts "class Types::BaseScalar < GraphQL::Schema::Scalar\nend"
44
- end
45
- end
46
-
47
- destination_file = File.join(base_dir, "types", "base_input_object.rb")
48
- unless File.exists?(destination_file)
49
- FileUtils.mkdir_p(File.dirname(destination_file))
50
- File.open(destination_file, 'w') do |f|
51
- f.puts "class Types::BaseInputObject < GraphQL::Schema::InputObject\nend"
52
- end
53
- end
54
-
55
- destination_file = File.join(base_dir, "types", "base_enum.rb")
56
- unless File.exists?(destination_file)
57
- FileUtils.mkdir_p(File.dirname(destination_file))
58
- File.open(destination_file, 'w') do |f|
59
- f.puts "class Types::BaseEnum < GraphQL::Schema::Enum\nend"
60
- end
61
- end
62
-
63
- destination_file = File.join(base_dir, "types", "base_union.rb")
64
- unless File.exists?(destination_file)
65
- FileUtils.mkdir_p(File.dirname(destination_file))
66
- File.open(destination_file, 'w') do |f|
67
- f.puts "class Types::BaseUnion < GraphQL::Schema::Union\nend"
68
- end
69
- end
70
-
71
- destination_file = File.join(base_dir, "types", "base_interface.rb")
72
- unless File.exists?(destination_file)
73
- FileUtils.mkdir_p(File.dirname(destination_file))
74
- File.open(destination_file, 'w') do |f|
75
- f.puts "module Types::BaseInterface\n include GraphQL::Schema::Interface\nend"
76
- end
77
- end
78
-
79
- destination_file = File.join(base_dir, "types", "base_object.rb")
80
- unless File.exists?(destination_file)
81
- File.open(destination_file, 'w') do |f|
82
- f.puts "class Types::BaseObject < GraphQL::Schema::Object\nend"
83
- end
84
- end
85
- end
86
-
87
- task :schema, [:schema_file] do |t, args|
88
- schema_file = args.schema_file
89
- load_upgraders
90
- upgrader = GraphQL::Upgrader::Schema.new File.read(schema_file)
91
-
92
- puts "- Transforming schema #{schema_file}"
93
- File.open(schema_file, 'w') { |f| f.write upgrader.upgrade }
94
- end
95
-
96
- task :member, [:member_file] do |t, args|
97
- member_file = args.member_file
98
- load_upgraders
99
- upgrader = GraphQL::Upgrader::Member.new File.read(member_file)
100
- next unless upgrader.upgradeable?
101
-
102
- puts "- Transforming member #{member_file}"
103
- File.open(member_file, 'w') { |f| f.write upgrader.upgrade }
104
- end
105
- end
4
+ config.before_configuration do
5
+ # Bootsnap compile cache has similar expiration properties,
6
+ # so we assume that if the user has bootsnap setup it's ok
7
+ # to piggy back on it.
8
+ if ::Object.const_defined?("Bootsnap::CompileCache::ISeq") && Bootsnap::CompileCache::ISeq.cache_dir
9
+ Language::Parser.cache ||= Language::Cache.new(Pathname.new(Bootsnap::CompileCache::ISeq.cache_dir).join('graphql'))
106
10
  end
107
11
  end
108
12
  end
@@ -7,12 +7,15 @@ module GraphQL
7
7
  desc "Get the checksum of a graphql-pro version and compare it to published versions on GitHub and graphql-ruby.org"
8
8
  task "graphql:pro:validate", [:gem_version] do |t, args|
9
9
  version = args[:gem_version]
10
+ if version.nil?
11
+ raise ArgumentError, "A specific version is required, eg `rake graphql:pro:validate[1.12.0]`"
12
+ end
10
13
  check = "\e[32m✓\e[0m"
11
14
  ex = "\e[31m✘\e[0m"
12
15
  puts "Validating graphql-pro v#{version}"
13
16
  puts " - Checking for graphql-pro credentials..."
14
17
 
15
- creds = `bundle config gems.graphql.pro`[/[a-z0-9]{11}:[a-z0-9]{11}/]
18
+ creds = `bundle config gems.graphql.pro --parseable`[/[a-z0-9]{11}:[a-z0-9]{11}/]
16
19
  if creds.nil?
17
20
  puts " #{ex} failed, please set with `bundle config gems.graphql.pro $MY_CREDENTIALS`"
18
21
  exit(1)