graphql 1.12.12 → 2.4.8

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 (428) hide show
  1. checksums.yaml +4 -4
  2. data/lib/generators/graphql/core.rb +3 -8
  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 +60 -4
  10. data/lib/generators/graphql/interface_generator.rb +7 -7
  11. data/lib/generators/graphql/mutation_create_generator.rb +22 -0
  12. data/lib/generators/graphql/mutation_delete_generator.rb +22 -0
  13. data/lib/generators/graphql/mutation_generator.rb +5 -30
  14. data/lib/generators/graphql/mutation_update_generator.rb +22 -0
  15. data/lib/generators/graphql/object_generator.rb +10 -38
  16. data/lib/generators/graphql/orm_mutations_base.rb +40 -0
  17. data/lib/generators/graphql/relay.rb +23 -12
  18. data/lib/generators/graphql/scalar_generator.rb +4 -2
  19. data/lib/generators/graphql/templates/base_argument.erb +2 -0
  20. data/lib/generators/graphql/templates/base_connection.erb +2 -0
  21. data/lib/generators/graphql/templates/base_edge.erb +2 -0
  22. data/lib/generators/graphql/templates/base_enum.erb +2 -0
  23. data/lib/generators/graphql/templates/base_field.erb +2 -0
  24. data/lib/generators/graphql/templates/base_input_object.erb +2 -0
  25. data/lib/generators/graphql/templates/base_interface.erb +2 -0
  26. data/lib/generators/graphql/templates/base_object.erb +2 -0
  27. data/lib/generators/graphql/templates/base_resolver.erb +8 -0
  28. data/lib/generators/graphql/templates/base_scalar.erb +2 -0
  29. data/lib/generators/graphql/templates/base_union.erb +2 -0
  30. data/lib/generators/graphql/templates/enum.erb +5 -1
  31. data/lib/generators/graphql/templates/graphql_controller.erb +2 -0
  32. data/lib/generators/graphql/templates/input.erb +9 -0
  33. data/lib/generators/graphql/templates/interface.erb +4 -2
  34. data/lib/generators/graphql/templates/loader.erb +2 -0
  35. data/lib/generators/graphql/templates/mutation.erb +3 -1
  36. data/lib/generators/graphql/templates/mutation_create.erb +20 -0
  37. data/lib/generators/graphql/templates/mutation_delete.erb +20 -0
  38. data/lib/generators/graphql/templates/mutation_update.erb +21 -0
  39. data/lib/generators/graphql/templates/node_type.erb +2 -0
  40. data/lib/generators/graphql/templates/object.erb +4 -2
  41. data/lib/generators/graphql/templates/query_type.erb +2 -0
  42. data/lib/generators/graphql/templates/scalar.erb +3 -1
  43. data/lib/generators/graphql/templates/schema.erb +22 -2
  44. data/lib/generators/graphql/templates/union.erb +4 -2
  45. data/lib/generators/graphql/type_generator.rb +46 -10
  46. data/lib/generators/graphql/union_generator.rb +5 -5
  47. data/lib/graphql/analysis/analyzer.rb +89 -0
  48. data/lib/graphql/analysis/field_usage.rb +65 -28
  49. data/lib/graphql/analysis/max_query_complexity.rb +11 -17
  50. data/lib/graphql/analysis/max_query_depth.rb +13 -19
  51. data/lib/graphql/analysis/query_complexity.rb +156 -61
  52. data/lib/graphql/analysis/query_depth.rb +38 -23
  53. data/lib/graphql/analysis/visitor.rb +283 -0
  54. data/lib/graphql/analysis.rb +90 -6
  55. data/lib/graphql/autoload.rb +38 -0
  56. data/lib/graphql/backtrace/inspect_result.rb +0 -12
  57. data/lib/graphql/backtrace/table.rb +4 -22
  58. data/lib/graphql/backtrace/trace.rb +93 -0
  59. data/lib/graphql/backtrace/tracer.rb +8 -6
  60. data/lib/graphql/backtrace.rb +3 -8
  61. data/lib/graphql/coercion_error.rb +1 -9
  62. data/lib/graphql/current.rb +52 -0
  63. data/lib/graphql/dataloader/async_dataloader.rb +89 -0
  64. data/lib/graphql/dataloader/null_dataloader.rb +4 -2
  65. data/lib/graphql/dataloader/request.rb +5 -0
  66. data/lib/graphql/dataloader/source.rb +125 -33
  67. data/lib/graphql/dataloader.rb +193 -143
  68. data/lib/graphql/date_encoding_error.rb +16 -0
  69. data/lib/graphql/dig.rb +1 -1
  70. data/lib/graphql/duration_encoding_error.rb +16 -0
  71. data/lib/graphql/execution/errors.rb +12 -81
  72. data/lib/graphql/execution/interpreter/argument_value.rb +5 -1
  73. data/lib/graphql/execution/interpreter/arguments.rb +2 -2
  74. data/lib/graphql/execution/interpreter/arguments_cache.rb +33 -36
  75. data/lib/graphql/execution/interpreter/resolve.rb +38 -4
  76. data/lib/graphql/execution/interpreter/runtime/graphql_result.rb +175 -0
  77. data/lib/graphql/execution/interpreter/runtime.rb +447 -403
  78. data/lib/graphql/execution/interpreter.rb +126 -80
  79. data/lib/graphql/execution/lazy.rb +11 -21
  80. data/lib/graphql/execution/lookahead.rb +133 -55
  81. data/lib/graphql/execution/multiplex.rb +4 -172
  82. data/lib/graphql/execution.rb +11 -4
  83. data/lib/graphql/integer_encoding_error.rb +18 -2
  84. data/lib/graphql/introspection/directive_location_enum.rb +2 -2
  85. data/lib/graphql/introspection/directive_type.rb +6 -4
  86. data/lib/graphql/introspection/dynamic_fields.rb +3 -8
  87. data/lib/graphql/introspection/entry_points.rb +11 -18
  88. data/lib/graphql/introspection/enum_value_type.rb +2 -2
  89. data/lib/graphql/introspection/field_type.rb +4 -4
  90. data/lib/graphql/introspection/input_value_type.rb +10 -4
  91. data/lib/graphql/introspection/schema_type.rb +17 -15
  92. data/lib/graphql/introspection/type_type.rb +29 -16
  93. data/lib/graphql/introspection.rb +6 -2
  94. data/lib/graphql/invalid_null_error.rb +1 -1
  95. data/lib/graphql/language/block_string.rb +37 -25
  96. data/lib/graphql/language/cache.rb +13 -0
  97. data/lib/graphql/language/comment.rb +18 -0
  98. data/lib/graphql/language/definition_slice.rb +1 -1
  99. data/lib/graphql/language/document_from_schema_definition.rb +122 -81
  100. data/lib/graphql/language/lexer.rb +364 -1467
  101. data/lib/graphql/language/nodes.rb +197 -106
  102. data/lib/graphql/language/parser.rb +799 -1920
  103. data/lib/graphql/language/printer.rb +372 -160
  104. data/lib/graphql/language/sanitized_printer.rb +25 -27
  105. data/lib/graphql/language/static_visitor.rb +167 -0
  106. data/lib/graphql/language/visitor.rb +188 -141
  107. data/lib/graphql/language.rb +62 -1
  108. data/lib/graphql/load_application_object_failed_error.rb +5 -1
  109. data/lib/graphql/name_validator.rb +0 -4
  110. data/lib/graphql/pagination/active_record_relation_connection.rb +37 -8
  111. data/lib/graphql/pagination/array_connection.rb +8 -6
  112. data/lib/graphql/pagination/connection.rb +61 -7
  113. data/lib/graphql/pagination/connections.rb +22 -23
  114. data/lib/graphql/pagination/mongoid_relation_connection.rb +1 -2
  115. data/lib/graphql/pagination/relation_connection.rb +60 -28
  116. data/lib/graphql/query/context/scoped_context.rb +101 -0
  117. data/lib/graphql/query/context.rb +146 -222
  118. data/lib/graphql/query/input_validation_result.rb +10 -1
  119. data/lib/graphql/query/null_context.rb +15 -32
  120. data/lib/graphql/query/validation_pipeline.rb +15 -39
  121. data/lib/graphql/query/variable_validation_error.rb +3 -3
  122. data/lib/graphql/query/variables.rb +35 -17
  123. data/lib/graphql/query.rb +149 -82
  124. data/lib/graphql/railtie.rb +15 -109
  125. data/lib/graphql/rake_task/validate.rb +1 -1
  126. data/lib/graphql/rake_task.rb +30 -11
  127. data/lib/graphql/relay/range_add.rb +9 -16
  128. data/lib/graphql/relay.rb +0 -15
  129. data/lib/graphql/rubocop/graphql/base_cop.rb +36 -0
  130. data/lib/graphql/rubocop/graphql/default_null_true.rb +43 -0
  131. data/lib/graphql/rubocop/graphql/default_required_true.rb +43 -0
  132. data/lib/graphql/rubocop/graphql/field_type_in_block.rb +144 -0
  133. data/lib/graphql/rubocop/graphql/root_types_in_block.rb +38 -0
  134. data/lib/graphql/rubocop.rb +6 -0
  135. data/lib/graphql/schema/addition.rb +98 -54
  136. data/lib/graphql/schema/always_visible.rb +14 -0
  137. data/lib/graphql/schema/argument.rb +179 -82
  138. data/lib/graphql/schema/base_64_encoder.rb +3 -5
  139. data/lib/graphql/schema/build_from_definition.rb +77 -39
  140. data/lib/graphql/schema/directive/feature.rb +1 -1
  141. data/lib/graphql/schema/directive/flagged.rb +4 -4
  142. data/lib/graphql/schema/directive/include.rb +1 -1
  143. data/lib/graphql/schema/directive/one_of.rb +24 -0
  144. data/lib/graphql/schema/directive/skip.rb +1 -1
  145. data/lib/graphql/schema/directive/specified_by.rb +14 -0
  146. data/lib/graphql/schema/directive/transform.rb +2 -2
  147. data/lib/graphql/schema/directive.rb +36 -22
  148. data/lib/graphql/schema/enum.rb +158 -63
  149. data/lib/graphql/schema/enum_value.rb +12 -21
  150. data/lib/graphql/schema/field/connection_extension.rb +7 -17
  151. data/lib/graphql/schema/field/scope_extension.rb +8 -1
  152. data/lib/graphql/schema/field.rb +521 -359
  153. data/lib/graphql/schema/field_extension.rb +86 -2
  154. data/lib/graphql/schema/find_inherited_value.rb +3 -7
  155. data/lib/graphql/schema/finder.rb +5 -5
  156. data/lib/graphql/schema/has_single_input_argument.rb +160 -0
  157. data/lib/graphql/schema/input_object.rb +148 -99
  158. data/lib/graphql/schema/interface.rb +41 -64
  159. data/lib/graphql/schema/introspection_system.rb +12 -26
  160. data/lib/graphql/schema/late_bound_type.rb +12 -2
  161. data/lib/graphql/schema/list.rb +18 -7
  162. data/lib/graphql/schema/loader.rb +6 -5
  163. data/lib/graphql/schema/member/base_dsl_methods.rb +32 -18
  164. data/lib/graphql/schema/member/build_type.rb +16 -13
  165. data/lib/graphql/schema/member/has_arguments.rb +270 -86
  166. data/lib/graphql/schema/member/has_ast_node.rb +12 -0
  167. data/lib/graphql/schema/member/has_deprecation_reason.rb +3 -4
  168. data/lib/graphql/schema/member/has_directives.rb +81 -61
  169. data/lib/graphql/schema/member/has_fields.rb +169 -31
  170. data/lib/graphql/schema/member/has_interfaces.rb +143 -0
  171. data/lib/graphql/schema/member/has_unresolved_type_error.rb +5 -1
  172. data/lib/graphql/schema/member/has_validators.rb +32 -6
  173. data/lib/graphql/schema/member/relay_shortcuts.rb +47 -2
  174. data/lib/graphql/schema/member/scoped.rb +19 -0
  175. data/lib/graphql/schema/member/type_system_helpers.rb +16 -0
  176. data/lib/graphql/schema/member/validates_input.rb +6 -6
  177. data/lib/graphql/schema/member.rb +1 -6
  178. data/lib/graphql/schema/mutation.rb +7 -9
  179. data/lib/graphql/schema/non_null.rb +7 -7
  180. data/lib/graphql/schema/object.rb +38 -119
  181. data/lib/graphql/schema/printer.rb +24 -25
  182. data/lib/graphql/schema/relay_classic_mutation.rb +13 -91
  183. data/lib/graphql/schema/resolver/has_payload_type.rb +46 -11
  184. data/lib/graphql/schema/resolver.rb +118 -115
  185. data/lib/graphql/schema/scalar.rb +20 -21
  186. data/lib/graphql/schema/subscription.rb +95 -21
  187. data/lib/graphql/schema/timeout.rb +25 -29
  188. data/lib/graphql/schema/type_expression.rb +2 -2
  189. data/lib/graphql/schema/type_membership.rb +21 -4
  190. data/lib/graphql/schema/union.rb +16 -16
  191. data/lib/graphql/schema/unique_within_type.rb +1 -1
  192. data/lib/graphql/schema/validator/all_validator.rb +62 -0
  193. data/lib/graphql/schema/validator/allow_blank_validator.rb +29 -0
  194. data/lib/graphql/schema/validator/allow_null_validator.rb +26 -0
  195. data/lib/graphql/schema/validator/exclusion_validator.rb +3 -1
  196. data/lib/graphql/schema/validator/format_validator.rb +4 -5
  197. data/lib/graphql/schema/validator/inclusion_validator.rb +3 -1
  198. data/lib/graphql/schema/validator/length_validator.rb +5 -3
  199. data/lib/graphql/schema/validator/numericality_validator.rb +13 -2
  200. data/lib/graphql/schema/validator/required_validator.rb +56 -18
  201. data/lib/graphql/schema/validator.rb +38 -28
  202. data/lib/graphql/schema/visibility/migration.rb +188 -0
  203. data/lib/graphql/schema/visibility/profile.rb +359 -0
  204. data/lib/graphql/schema/visibility/visit.rb +190 -0
  205. data/lib/graphql/schema/visibility.rb +294 -0
  206. data/lib/graphql/schema/warden.rb +423 -134
  207. data/lib/graphql/schema/wrapper.rb +0 -5
  208. data/lib/graphql/schema.rb +1015 -1057
  209. data/lib/graphql/static_validation/all_rules.rb +3 -1
  210. data/lib/graphql/static_validation/base_visitor.rb +15 -28
  211. data/lib/graphql/static_validation/definition_dependencies.rb +7 -2
  212. data/lib/graphql/static_validation/error.rb +3 -1
  213. data/lib/graphql/static_validation/literal_validator.rb +24 -7
  214. data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +1 -1
  215. data/lib/graphql/static_validation/rules/argument_names_are_unique.rb +1 -1
  216. data/lib/graphql/static_validation/rules/arguments_are_defined.rb +4 -3
  217. data/lib/graphql/static_validation/rules/directives_are_defined.rb +13 -7
  218. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +15 -13
  219. data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +12 -2
  220. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +13 -5
  221. data/lib/graphql/static_validation/rules/fields_will_merge.rb +62 -35
  222. data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +25 -4
  223. data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +3 -3
  224. data/lib/graphql/static_validation/rules/fragment_types_exist.rb +12 -2
  225. data/lib/graphql/static_validation/rules/fragments_are_finite.rb +2 -2
  226. data/lib/graphql/static_validation/rules/fragments_are_on_composite_types.rb +1 -1
  227. data/lib/graphql/static_validation/rules/mutation_root_exists.rb +1 -1
  228. data/lib/graphql/static_validation/rules/no_definitions_are_present.rb +1 -1
  229. data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid.rb +66 -0
  230. data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid_error.rb +29 -0
  231. data/lib/graphql/static_validation/rules/query_root_exists.rb +17 -0
  232. data/lib/graphql/static_validation/rules/query_root_exists_error.rb +26 -0
  233. data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +7 -5
  234. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +5 -5
  235. data/lib/graphql/static_validation/rules/subscription_root_exists.rb +1 -1
  236. data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +14 -8
  237. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +18 -27
  238. data/lib/graphql/static_validation/rules/variable_names_are_unique.rb +1 -1
  239. data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +14 -8
  240. data/lib/graphql/static_validation/rules/variables_are_input_types.rb +11 -2
  241. data/lib/graphql/static_validation/validation_context.rb +32 -6
  242. data/lib/graphql/static_validation/validator.rb +11 -27
  243. data/lib/graphql/static_validation.rb +0 -3
  244. data/lib/graphql/string_encoding_error.rb +13 -3
  245. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +49 -11
  246. data/lib/graphql/subscriptions/broadcast_analyzer.rb +11 -5
  247. data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +40 -1
  248. data/lib/graphql/subscriptions/event.rb +87 -38
  249. data/lib/graphql/subscriptions/serialize.rb +27 -3
  250. data/lib/graphql/subscriptions.rb +63 -49
  251. data/lib/graphql/testing/helpers.rb +155 -0
  252. data/lib/graphql/testing.rb +2 -0
  253. data/lib/graphql/tracing/active_support_notifications_trace.rb +16 -0
  254. data/lib/graphql/tracing/active_support_notifications_tracing.rb +6 -20
  255. data/lib/graphql/tracing/appoptics_trace.rb +253 -0
  256. data/lib/graphql/tracing/appoptics_tracing.rb +4 -2
  257. data/lib/graphql/tracing/appsignal_trace.rb +79 -0
  258. data/lib/graphql/tracing/appsignal_tracing.rb +17 -0
  259. data/lib/graphql/tracing/call_legacy_tracers.rb +66 -0
  260. data/lib/graphql/tracing/data_dog_trace.rb +185 -0
  261. data/lib/graphql/tracing/data_dog_tracing.rb +27 -15
  262. data/lib/graphql/{execution/instrumentation.rb → tracing/legacy_hooks_trace.rb} +11 -28
  263. data/lib/graphql/tracing/legacy_trace.rb +12 -0
  264. data/lib/graphql/tracing/new_relic_trace.rb +77 -0
  265. data/lib/graphql/tracing/new_relic_tracing.rb +2 -0
  266. data/lib/graphql/tracing/notifications_trace.rb +45 -0
  267. data/lib/graphql/tracing/notifications_tracing.rb +61 -0
  268. data/lib/graphql/tracing/null_trace.rb +9 -0
  269. data/lib/graphql/tracing/platform_trace.rb +118 -0
  270. data/lib/graphql/tracing/platform_tracing.rb +46 -49
  271. data/lib/graphql/tracing/{prometheus_tracing → prometheus_trace}/graphql_collector.rb +6 -2
  272. data/lib/graphql/tracing/prometheus_trace.rb +94 -0
  273. data/lib/graphql/tracing/prometheus_tracing.rb +5 -3
  274. data/lib/graphql/tracing/scout_trace.rb +74 -0
  275. data/lib/graphql/tracing/scout_tracing.rb +2 -0
  276. data/lib/graphql/tracing/sentry_trace.rb +114 -0
  277. data/lib/graphql/tracing/statsd_trace.rb +58 -0
  278. data/lib/graphql/tracing/statsd_tracing.rb +2 -0
  279. data/lib/graphql/tracing/trace.rb +79 -0
  280. data/lib/graphql/tracing.rb +29 -52
  281. data/lib/graphql/type_kinds.rb +7 -4
  282. data/lib/graphql/types/big_int.rb +5 -1
  283. data/lib/graphql/types/int.rb +1 -1
  284. data/lib/graphql/types/iso_8601_date.rb +17 -6
  285. data/lib/graphql/types/iso_8601_date_time.rb +12 -1
  286. data/lib/graphql/types/iso_8601_duration.rb +77 -0
  287. data/lib/graphql/types/relay/base_connection.rb +16 -6
  288. data/lib/graphql/types/relay/connection_behaviors.rb +92 -32
  289. data/lib/graphql/types/relay/edge_behaviors.rb +46 -7
  290. data/lib/graphql/types/relay/has_node_field.rb +2 -2
  291. data/lib/graphql/types/relay/has_nodes_field.rb +2 -2
  292. data/lib/graphql/types/relay/node_behaviors.rb +12 -2
  293. data/lib/graphql/types/relay/page_info_behaviors.rb +11 -2
  294. data/lib/graphql/types/relay.rb +0 -3
  295. data/lib/graphql/types/string.rb +2 -2
  296. data/lib/graphql/types.rb +18 -10
  297. data/lib/graphql/unauthorized_enum_value_error.rb +13 -0
  298. data/lib/graphql/unauthorized_error.rb +1 -1
  299. data/lib/graphql/version.rb +1 -1
  300. data/lib/graphql.rb +82 -137
  301. data/readme.md +13 -6
  302. metadata +127 -186
  303. data/lib/graphql/analysis/analyze_query.rb +0 -98
  304. data/lib/graphql/analysis/ast/analyzer.rb +0 -84
  305. data/lib/graphql/analysis/ast/field_usage.rb +0 -28
  306. data/lib/graphql/analysis/ast/max_query_complexity.rb +0 -23
  307. data/lib/graphql/analysis/ast/max_query_depth.rb +0 -22
  308. data/lib/graphql/analysis/ast/query_complexity.rb +0 -234
  309. data/lib/graphql/analysis/ast/query_depth.rb +0 -56
  310. data/lib/graphql/analysis/ast/visitor.rb +0 -268
  311. data/lib/graphql/analysis/ast.rb +0 -91
  312. data/lib/graphql/analysis/reducer_state.rb +0 -48
  313. data/lib/graphql/argument.rb +0 -131
  314. data/lib/graphql/authorization.rb +0 -82
  315. data/lib/graphql/backtrace/legacy_tracer.rb +0 -56
  316. data/lib/graphql/backwards_compatibility.rb +0 -61
  317. data/lib/graphql/base_type.rb +0 -230
  318. data/lib/graphql/boolean_type.rb +0 -2
  319. data/lib/graphql/compatibility/execution_specification/counter_schema.rb +0 -53
  320. data/lib/graphql/compatibility/execution_specification/specification_schema.rb +0 -200
  321. data/lib/graphql/compatibility/execution_specification.rb +0 -436
  322. data/lib/graphql/compatibility/lazy_execution_specification/lazy_schema.rb +0 -111
  323. data/lib/graphql/compatibility/lazy_execution_specification.rb +0 -215
  324. data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +0 -87
  325. data/lib/graphql/compatibility/query_parser_specification/query_assertions.rb +0 -79
  326. data/lib/graphql/compatibility/query_parser_specification.rb +0 -266
  327. data/lib/graphql/compatibility/schema_parser_specification.rb +0 -682
  328. data/lib/graphql/compatibility.rb +0 -5
  329. data/lib/graphql/define/assign_argument.rb +0 -12
  330. data/lib/graphql/define/assign_connection.rb +0 -13
  331. data/lib/graphql/define/assign_enum_value.rb +0 -18
  332. data/lib/graphql/define/assign_global_id_field.rb +0 -11
  333. data/lib/graphql/define/assign_mutation_function.rb +0 -34
  334. data/lib/graphql/define/assign_object_field.rb +0 -42
  335. data/lib/graphql/define/defined_object_proxy.rb +0 -53
  336. data/lib/graphql/define/instance_definable.rb +0 -240
  337. data/lib/graphql/define/no_definition_error.rb +0 -7
  338. data/lib/graphql/define/non_null_with_bang.rb +0 -16
  339. data/lib/graphql/define/type_definer.rb +0 -31
  340. data/lib/graphql/define.rb +0 -31
  341. data/lib/graphql/deprecated_dsl.rb +0 -47
  342. data/lib/graphql/deprecation.rb +0 -13
  343. data/lib/graphql/directive/deprecated_directive.rb +0 -2
  344. data/lib/graphql/directive/include_directive.rb +0 -2
  345. data/lib/graphql/directive/skip_directive.rb +0 -2
  346. data/lib/graphql/directive.rb +0 -111
  347. data/lib/graphql/enum_type.rb +0 -129
  348. data/lib/graphql/execution/execute.rb +0 -333
  349. data/lib/graphql/execution/flatten.rb +0 -40
  350. data/lib/graphql/execution/lazy/resolve.rb +0 -91
  351. data/lib/graphql/execution/typecast.rb +0 -50
  352. data/lib/graphql/field/resolve.rb +0 -59
  353. data/lib/graphql/field.rb +0 -226
  354. data/lib/graphql/filter.rb +0 -53
  355. data/lib/graphql/float_type.rb +0 -2
  356. data/lib/graphql/function.rb +0 -128
  357. data/lib/graphql/id_type.rb +0 -2
  358. data/lib/graphql/input_object_type.rb +0 -138
  359. data/lib/graphql/int_type.rb +0 -2
  360. data/lib/graphql/interface_type.rb +0 -72
  361. data/lib/graphql/internal_representation/document.rb +0 -27
  362. data/lib/graphql/internal_representation/node.rb +0 -206
  363. data/lib/graphql/internal_representation/print.rb +0 -51
  364. data/lib/graphql/internal_representation/rewrite.rb +0 -184
  365. data/lib/graphql/internal_representation/scope.rb +0 -88
  366. data/lib/graphql/internal_representation/visit.rb +0 -36
  367. data/lib/graphql/internal_representation.rb +0 -7
  368. data/lib/graphql/language/lexer.rl +0 -262
  369. data/lib/graphql/language/parser.y +0 -543
  370. data/lib/graphql/language/token.rb +0 -38
  371. data/lib/graphql/list_type.rb +0 -80
  372. data/lib/graphql/non_null_type.rb +0 -71
  373. data/lib/graphql/object_type.rb +0 -130
  374. data/lib/graphql/query/arguments.rb +0 -189
  375. data/lib/graphql/query/arguments_cache.rb +0 -24
  376. data/lib/graphql/query/executor.rb +0 -52
  377. data/lib/graphql/query/literal_input.rb +0 -136
  378. data/lib/graphql/query/serial_execution/field_resolution.rb +0 -92
  379. data/lib/graphql/query/serial_execution/operation_resolution.rb +0 -19
  380. data/lib/graphql/query/serial_execution/selection_resolution.rb +0 -23
  381. data/lib/graphql/query/serial_execution/value_resolution.rb +0 -87
  382. data/lib/graphql/query/serial_execution.rb +0 -40
  383. data/lib/graphql/relay/array_connection.rb +0 -83
  384. data/lib/graphql/relay/base_connection.rb +0 -189
  385. data/lib/graphql/relay/connection_instrumentation.rb +0 -54
  386. data/lib/graphql/relay/connection_resolve.rb +0 -43
  387. data/lib/graphql/relay/connection_type.rb +0 -41
  388. data/lib/graphql/relay/edge.rb +0 -27
  389. data/lib/graphql/relay/edge_type.rb +0 -19
  390. data/lib/graphql/relay/edges_instrumentation.rb +0 -40
  391. data/lib/graphql/relay/global_id_resolve.rb +0 -18
  392. data/lib/graphql/relay/mongo_relation_connection.rb +0 -50
  393. data/lib/graphql/relay/mutation/instrumentation.rb +0 -23
  394. data/lib/graphql/relay/mutation/resolve.rb +0 -56
  395. data/lib/graphql/relay/mutation/result.rb +0 -38
  396. data/lib/graphql/relay/mutation.rb +0 -106
  397. data/lib/graphql/relay/node.rb +0 -39
  398. data/lib/graphql/relay/page_info.rb +0 -7
  399. data/lib/graphql/relay/relation_connection.rb +0 -188
  400. data/lib/graphql/relay/type_extensions.rb +0 -32
  401. data/lib/graphql/scalar_type.rb +0 -91
  402. data/lib/graphql/schema/base_64_bp.rb +0 -26
  403. data/lib/graphql/schema/catchall_middleware.rb +0 -35
  404. data/lib/graphql/schema/default_parse_error.rb +0 -10
  405. data/lib/graphql/schema/default_type_error.rb +0 -17
  406. data/lib/graphql/schema/invalid_type_error.rb +0 -7
  407. data/lib/graphql/schema/member/accepts_definition.rb +0 -152
  408. data/lib/graphql/schema/member/cached_graphql_definition.rb +0 -31
  409. data/lib/graphql/schema/member/instrumentation.rb +0 -131
  410. data/lib/graphql/schema/middleware_chain.rb +0 -82
  411. data/lib/graphql/schema/possible_types.rb +0 -44
  412. data/lib/graphql/schema/rescue_middleware.rb +0 -60
  413. data/lib/graphql/schema/timeout_middleware.rb +0 -88
  414. data/lib/graphql/schema/traversal.rb +0 -228
  415. data/lib/graphql/schema/validation.rb +0 -313
  416. data/lib/graphql/static_validation/default_visitor.rb +0 -15
  417. data/lib/graphql/static_validation/no_validate_visitor.rb +0 -10
  418. data/lib/graphql/static_validation/type_stack.rb +0 -216
  419. data/lib/graphql/string_type.rb +0 -2
  420. data/lib/graphql/subscriptions/instrumentation.rb +0 -79
  421. data/lib/graphql/subscriptions/subscription_root.rb +0 -76
  422. data/lib/graphql/tracing/skylight_tracing.rb +0 -70
  423. data/lib/graphql/types/relay/default_relay.rb +0 -27
  424. data/lib/graphql/types/relay/node_field.rb +0 -25
  425. data/lib/graphql/types/relay/nodes_field.rb +0 -27
  426. data/lib/graphql/union_type.rb +0 -115
  427. data/lib/graphql/upgrader/member.rb +0 -937
  428. data/lib/graphql/upgrader/schema.rb +0 -38
@@ -14,41 +14,37 @@ 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
28
  variable_type = schema.type_from_ast(ast_variable.type, context: ctx)
25
- if variable_type.nil?
29
+ if variable_type.nil? || !variable_type.unwrap.kind.input?
26
30
  # Pass -- it will get handled by a validator
27
31
  else
28
32
  variable_name = ast_variable.name
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)
36
+ max_errors = schema.validate_max_errors - @errors.count if schema.validate_max_errors
32
37
  begin
33
- validation_result = variable_type.validate_input(provided_value, ctx)
38
+ validation_result = variable_type.validate_input(provided_value, ctx, max_errors: max_errors)
34
39
  if validation_result.valid?
35
40
  if value_was_provided
36
41
  # Add the variable if a value was provided
37
- memo[variable_name] = if ctx.interpreter?
38
- provided_value
39
- elsif provided_value.nil?
42
+ memo[variable_name] = provided_value
43
+ elsif default_value != nil
44
+ memo[variable_name] = if default_value.is_a?(Language::Nodes::NullValue)
40
45
  nil
41
46
  else
42
- schema.error_handler.with_error_handling(context) do
43
- variable_type.coerce_input(provided_value, ctx)
44
- end
45
- end
46
- elsif default_value != nil
47
- memo[variable_name] = if ctx.interpreter?
48
47
  default_value
49
- else
50
- # Add the variable if it wasn't provided but it has a default value (including `null`)
51
- GraphQL::Query::LiteralInput.coerce(variable_type, default_value, self)
52
48
  end
53
49
  end
54
50
  end
@@ -57,8 +53,7 @@ module GraphQL
57
53
  # like InputValidationResults generated by validate_non_null_input but unfortunately we don't
58
54
  # have this information available in the coerce_input call chain. Note this path is the path
59
55
  # that appears under errors.extensions.problems.path and NOT the result path under errors.path.
60
- validation_result = GraphQL::Query::InputValidationResult.new
61
- validation_result.add_problem(ex.message)
56
+ validation_result = GraphQL::Query::InputValidationResult.from_problem(ex.message)
62
57
  end
63
58
 
64
59
  if !validation_result.valid?
@@ -69,6 +64,29 @@ module GraphQL
69
64
  end
70
65
 
71
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
72
90
  end
73
91
  end
74
92
  end
data/lib/graphql/query.rb CHANGED
@@ -1,24 +1,21 @@
1
1
  # frozen_string_literal: true
2
- require "graphql/query/arguments"
3
- require "graphql/query/arguments_cache"
4
- require "graphql/query/context"
5
- require "graphql/query/executor"
6
- require "graphql/query/fingerprint"
7
- require "graphql/query/literal_input"
8
- require "graphql/query/null_context"
9
- require "graphql/query/result"
10
- require "graphql/query/serial_execution"
11
- require "graphql/query/variables"
12
- require "graphql/query/input_validation_result"
13
- require "graphql/query/variable_validation_error"
14
- require "graphql/query/validation_pipeline"
15
2
 
16
3
  module GraphQL
17
4
  # A combination of query string and {Schema} instance which can be reduced to a {#result}.
18
5
  class Query
6
+ extend Autoload
19
7
  include Tracing::Traceable
20
8
  extend Forwardable
21
9
 
10
+ autoload :Context, "graphql/query/context"
11
+ autoload :Fingerprint, "graphql/query/fingerprint"
12
+ autoload :NullContext, "graphql/query/null_context"
13
+ autoload :Result, "graphql/query/result"
14
+ autoload :Variables, "graphql/query/variables"
15
+ autoload :InputValidationResult, "graphql/query/input_validation_result"
16
+ autoload :VariableValidationError, "graphql/query/variable_validation_error"
17
+ autoload :ValidationPipeline, "graphql/query/validation_pipeline"
18
+
22
19
  class OperationNameMissingError < GraphQL::ExecutionError
23
20
  def initialize(name)
24
21
  msg = if name.nil?
@@ -39,7 +36,30 @@ module GraphQL
39
36
  attr_accessor :operation_name
40
37
 
41
38
  # @return [Boolean] if false, static validation is skipped (execution behavior for invalid queries is undefined)
42
- attr_accessor :validate
39
+ attr_reader :validate
40
+
41
+ # @param new_validate [Boolean] if false, static validation is skipped. This can't be reasssigned after validation.
42
+ def validate=(new_validate)
43
+ if defined?(@validation_pipeline) && @validation_pipeline && @validation_pipeline.has_validated?
44
+ raise ArgumentError, "Can't reassign Query#validate= after validation has run, remove this assignment."
45
+ else
46
+ @validate = new_validate
47
+ end
48
+ end
49
+
50
+ # @return [GraphQL::StaticValidation::Validator] if present, the query will validate with these rules.
51
+ attr_reader :static_validator
52
+
53
+ # @param new_validate [GraphQL::StaticValidation::Validator] if present, the query will validate with these rules. This can't be reasssigned after validation.
54
+ def static_validator=(new_validator)
55
+ if defined?(@validation_pipeline) && @validation_pipeline && @validation_pipeline.has_validated?
56
+ raise ArgumentError, "Can't reassign Query#static_validator= after validation has run, remove this assignment."
57
+ elsif !new_validator.is_a?(GraphQL::StaticValidation::Validator)
58
+ raise ArgumentError, "Expected a `GraphQL::StaticValidation::Validator` instance."
59
+ else
60
+ @static_validator = new_validator
61
+ end
62
+ end
43
63
 
44
64
  attr_writer :query_string
45
65
 
@@ -77,30 +97,46 @@ module GraphQL
77
97
  # @param root_value [Object] the object used to resolve fields on the root type
78
98
  # @param max_depth [Numeric] the maximum number of nested selections allowed for this query (falls back to schema-level value)
79
99
  # @param max_complexity [Numeric] the maximum field complexity for this query (falls back to schema-level value)
80
- # @param except [<#call(schema_member, context)>] If provided, objects will be hidden from the schema when `.call(schema_member, context)` returns truthy
81
- # @param only [<#call(schema_member, context)>] If provided, objects will be hidden from the schema when `.call(schema_member, context)` returns false
82
- 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)
100
+ # @param visibility_profile [Symbol]
101
+ def initialize(schema, query_string = nil, query: nil, document: nil, context: nil, variables: nil, validate: true, static_validator: nil, visibility_profile: nil, subscription_topic: nil, operation_name: nil, root_value: nil, max_depth: schema.max_depth, max_complexity: schema.max_complexity, warden: nil, use_visibility_profile: nil)
83
102
  # Even if `variables: nil` is passed, use an empty hash for simpler logic
84
103
  variables ||= {}
104
+ @schema = schema
105
+ @context = schema.context_class.new(query: self, values: context)
85
106
 
86
- # Use the `.graphql_definition` here which will return legacy types instead of classes
87
- if schema.is_a?(Class) && !schema.interpreter?
88
- schema = schema.graphql_definition
107
+ if use_visibility_profile.nil?
108
+ use_visibility_profile = warden ? false : schema.use_visibility_profile?
89
109
  end
90
- @schema = schema
91
- @interpreter = @schema.interpreter?
92
- @filter = schema.default_filter.merge(except: except, only: only)
93
- @context = schema.context_class.new(query: self, object: root_value, values: context)
94
- @warden = warden
110
+
111
+ @visibility_profile = visibility_profile
112
+
113
+ if use_visibility_profile
114
+ @visibility_profile = @schema.visibility.profile_for(@context, visibility_profile)
115
+ @warden = Schema::Warden::NullWarden.new(context: @context, schema: @schema)
116
+ else
117
+ @visibility_profile = nil
118
+ @warden = warden
119
+ end
120
+
95
121
  @subscription_topic = subscription_topic
96
122
  @root_value = root_value
97
123
  @fragments = nil
98
124
  @operations = nil
99
125
  @validate = validate
100
- @tracers = schema.tracers + (context ? context.fetch(:tracers, []) : [])
126
+ self.static_validator = static_validator if static_validator
127
+ context_tracers = (context ? context.fetch(:tracers, []) : [])
128
+ @tracers = schema.tracers + context_tracers
129
+
101
130
  # Support `ctx[:backtrace] = true` for wrapping backtraces
102
131
  if context && context[:backtrace] && !@tracers.include?(GraphQL::Backtrace::Tracer)
103
- @tracers << GraphQL::Backtrace::Tracer
132
+ if schema.trace_class <= GraphQL::Tracing::CallLegacyTracers
133
+ context_tracers += [GraphQL::Backtrace::Tracer]
134
+ @tracers << GraphQL::Backtrace::Tracer
135
+ end
136
+ end
137
+
138
+ if !context_tracers.empty? && !(schema.trace_class <= GraphQL::Tracing::CallLegacyTracers)
139
+ raise ArgumentError, "context[:tracers] are not supported without `trace_with(GraphQL::Tracing::CallLegacyTracers)` in the schema configuration, please add it."
104
140
  end
105
141
 
106
142
  @analysis_errors = []
@@ -117,6 +153,10 @@ module GraphQL
117
153
  raise ArgumentError, "Query should only be provided a query string or a document, not both."
118
154
  end
119
155
 
156
+ if @query_string && !@query_string.is_a?(String)
157
+ raise ArgumentError, "Query string argument should be a String, got #{@query_string.class.name} instead."
158
+ end
159
+
120
160
  # A two-layer cache of type resolution:
121
161
  # { abstract_type => { value => resolved_type } }
122
162
  @resolved_types_cache = Hash.new do |h1, k1|
@@ -138,9 +178,12 @@ module GraphQL
138
178
  @result_values = nil
139
179
  @executed = false
140
180
 
141
- # TODO add a general way to define schema-level filters
142
- if @schema.respond_to?(:visible?)
143
- merge_filters(only: @schema.method(:visible?))
181
+ @logger = if context && context[:logger] == false
182
+ Logger.new(IO::NULL)
183
+ elsif context && (l = context[:logger])
184
+ l
185
+ else
186
+ schema.default_logger
144
187
  end
145
188
  end
146
189
 
@@ -149,12 +192,16 @@ module GraphQL
149
192
  @query_string ||= (document ? document.to_query_string : nil)
150
193
  end
151
194
 
152
- def interpreter?
153
- @interpreter
154
- end
195
+ # @return [Symbol, nil]
196
+ attr_reader :visibility_profile
155
197
 
156
198
  attr_accessor :multiplex
157
199
 
200
+ # @return [GraphQL::Tracing::Trace]
201
+ def current_trace
202
+ @current_trace ||= context[:trace] || (multiplex ? multiplex.current_trace : schema.new_trace(multiplex: multiplex, query: self))
203
+ end
204
+
158
205
  def subscription_update?
159
206
  @subscription_topic && subscription?
160
207
  end
@@ -164,9 +211,19 @@ module GraphQL
164
211
  def lookahead
165
212
  @lookahead ||= begin
166
213
  ast_node = selected_operation
167
- root_type = warden.root_type_for_operation(ast_node.operation_type || "query")
168
- root_type = root_type.type_class || raise("Invariant: `lookahead` only works with class-based types")
169
- GraphQL::Execution::Lookahead.new(query: self, root_type: root_type, ast_nodes: [ast_node])
214
+ if ast_node.nil?
215
+ GraphQL::Execution::Lookahead::NULL_LOOKAHEAD
216
+ else
217
+ root_type = case ast_node.operation_type
218
+ when nil, "query"
219
+ types.query_root # rubocop:disable Development/ContextIsPassedCop
220
+ when "mutation"
221
+ types.mutation_root # rubocop:disable Development/ContextIsPassedCop
222
+ when "subscription"
223
+ types.subscription_root # rubocop:disable Development/ContextIsPassedCop
224
+ end
225
+ GraphQL::Execution::Lookahead.new(query: self, root_type: root_type, ast_nodes: [ast_node])
226
+ end
170
227
  end
171
228
  end
172
229
 
@@ -192,10 +249,10 @@ module GraphQL
192
249
  end
193
250
 
194
251
  # Get the result for this query, executing it once
195
- # @return [Hash] A GraphQL response, with `"data"` and/or `"errors"` keys
252
+ # @return [GraphQL::Query::Result] A Hash-like GraphQL response, with `"data"` and/or `"errors"` keys
196
253
  def result
197
254
  if !@executed
198
- Execution::Multiplex.run_queries(@schema, [self], context: @context)
255
+ Execution::Interpreter.run_all(@schema, [self], context: @context)
199
256
  end
200
257
  @result ||= Query::Result.new(query: self, values: @result_values)
201
258
  end
@@ -233,35 +290,17 @@ module GraphQL
233
290
  end
234
291
  end
235
292
 
236
- def irep_selection
237
- @selection ||= begin
238
- if selected_operation && internal_representation
239
- internal_representation.operation_definitions[selected_operation.name]
240
- else
241
- nil
242
- end
243
- end
244
- end
245
-
246
293
  # Node-level cache for calculating arguments. Used during execution and query analysis.
247
294
  # @param ast_node [GraphQL::Language::Nodes::AbstractNode]
248
295
  # @param definition [GraphQL::Schema::Field]
249
296
  # @param parent_object [GraphQL::Schema::Object]
250
297
  # @return Hash{Symbol => Object}
251
298
  def arguments_for(ast_node, definition, parent_object: nil)
252
- if interpreter?
253
- arguments_cache.fetch(ast_node, definition, parent_object)
254
- else
255
- arguments_cache[ast_node][definition]
256
- end
299
+ arguments_cache.fetch(ast_node, definition, parent_object)
257
300
  end
258
301
 
259
302
  def arguments_cache
260
- if interpreter?
261
- @arguments_cache ||= Execution::Interpreter::ArgumentsCache.new(self)
262
- else
263
- @arguments_cache ||= ArgumentsCache.build(self)
264
- end
303
+ @arguments_cache ||= Execution::Interpreter::ArgumentsCache.new(self)
265
304
  end
266
305
 
267
306
  # A version of the given query string, with:
@@ -270,7 +309,7 @@ module GraphQL
270
309
  # @return [String, nil] Returns nil if the query is invalid.
271
310
  def sanitized_query_string(inline_variables: true)
272
311
  with_prepared_ast {
273
- GraphQL::Language::SanitizedPrinter.new(self, inline_variables: inline_variables).sanitized_query_string
312
+ schema.sanitized_printer.new(self, inline_variables: inline_variables).sanitized_query_string
274
313
  }
275
314
  end
276
315
 
@@ -292,7 +331,7 @@ module GraphQL
292
331
 
293
332
  # @return [String] An opaque hash for identifying this query's given query string and selected operation
294
333
  def operation_fingerprint
295
- @operation_fingerprint ||= "#{selected_operation_name || "anonymous"}/#{Fingerprint.generate(query_string)}"
334
+ @operation_fingerprint ||= "#{selected_operation_name || "anonymous"}/#{Fingerprint.generate(query_string || "")}"
296
335
  end
297
336
 
298
337
  # @return [String] An opaque hash for identifying this query's given a variable values (not including defaults)
@@ -304,8 +343,8 @@ module GraphQL
304
343
  with_prepared_ast { @validation_pipeline }
305
344
  end
306
345
 
307
- def_delegators :validation_pipeline, :validation_errors, :internal_representation,
308
- :analyzers, :ast_analyzers, :max_depth, :max_complexity
346
+ def_delegators :validation_pipeline, :validation_errors,
347
+ :analyzers, :ast_analyzers, :max_depth, :max_complexity, :validate_timeout_remaining
309
348
 
310
349
  attr_accessor :analysis_errors
311
350
  def valid?
@@ -316,14 +355,41 @@ module GraphQL
316
355
  with_prepared_ast { @warden }
317
356
  end
318
357
 
319
- def_delegators :warden, :get_type, :get_field, :possible_types, :root_type_for_operation
358
+ def get_type(type_name)
359
+ types.type(type_name) # rubocop:disable Development/ContextIsPassedCop
360
+ end
361
+
362
+ def get_field(owner, field_name)
363
+ types.field(owner, field_name) # rubocop:disable Development/ContextIsPassedCop
364
+ end
365
+
366
+ def possible_types(type)
367
+ types.possible_types(type) # rubocop:disable Development/ContextIsPassedCop
368
+ end
369
+
370
+ def root_type_for_operation(op_type)
371
+ case op_type
372
+ when "query"
373
+ types.query_root # rubocop:disable Development/ContextIsPassedCop
374
+ when "mutation"
375
+ types.mutation_root # rubocop:disable Development/ContextIsPassedCop
376
+ when "subscription"
377
+ types.subscription_root # rubocop:disable Development/ContextIsPassedCop
378
+ else
379
+ raise ArgumentError, "unexpected root type name: #{op_type.inspect}; expected 'query', 'mutation', or 'subscription'"
380
+ end
381
+ end
382
+
383
+ def types
384
+ @visibility_profile || warden.visibility_profile
385
+ end
320
386
 
321
387
  # @param abstract_type [GraphQL::UnionType, GraphQL::InterfaceType]
322
388
  # @param value [Object] Any runtime value
323
389
  # @return [GraphQL::ObjectType, nil] The runtime type of `value` from {Schema#resolve_type}
324
390
  # @see {#possible_types} to apply filtering from `only` / `except`
325
- def resolve_type(abstract_type, value = :__undefined__)
326
- if value.is_a?(Symbol) && value == :__undefined__
391
+ def resolve_type(abstract_type, value = NOT_CONFIGURED)
392
+ if value.is_a?(Symbol) && value == NOT_CONFIGURED
327
393
  # Old method signature
328
394
  value = abstract_type
329
395
  abstract_type = nil
@@ -342,27 +408,29 @@ module GraphQL
342
408
  with_prepared_ast { @query }
343
409
  end
344
410
 
345
- # @return [void]
346
- def merge_filters(only: nil, except: nil)
347
- if @prepared_ast
348
- raise "Can't add filters after preparing the query"
349
- else
350
- @filter = @filter.merge(only: only, except: except)
351
- end
352
- nil
353
- end
354
-
355
411
  def subscription?
356
412
  with_prepared_ast { @subscription }
357
413
  end
358
414
 
359
415
  # @api private
360
- def with_error_handling
361
- schema.error_handler.with_error_handling(context) do
362
- yield
416
+ def handle_or_reraise(err)
417
+ schema.handle_or_reraise(context, err)
418
+ end
419
+
420
+ def after_lazy(value, &block)
421
+ if !defined?(@runtime_instance)
422
+ @runtime_instance = context.namespace(:interpreter_runtime)[:runtime]
423
+ end
424
+
425
+ if @runtime_instance
426
+ @runtime_instance.minimal_after_lazy(value, &block)
427
+ else
428
+ @schema.after_lazy(value, &block)
363
429
  end
364
430
  end
365
431
 
432
+ attr_reader :logger
433
+
366
434
  private
367
435
 
368
436
  def find_operation(operations, operation_name)
@@ -377,11 +445,11 @@ module GraphQL
377
445
 
378
446
  def prepare_ast
379
447
  @prepared_ast = true
380
- @warden ||= GraphQL::Schema::Warden.new(@filter, schema: @schema, context: @context)
448
+ @warden ||= @schema.warden_class.new(schema: @schema, context: @context)
381
449
  parse_error = nil
382
450
  @document ||= begin
383
451
  if query_string
384
- GraphQL.parse(query_string, tracer: self)
452
+ GraphQL.parse(query_string, trace: self.current_trace, max_tokens: @schema.max_query_string_tokens)
385
453
  end
386
454
  rescue GraphQL::ParseError => err
387
455
  parse_error = err
@@ -413,7 +481,7 @@ module GraphQL
413
481
  @mutation = false
414
482
  @subscription = false
415
483
  operation_name_error = nil
416
- if @operations.any?
484
+ if !@operations.empty?
417
485
  @selected_operation = find_operation(@operations, @operation_name)
418
486
  if @selected_operation.nil?
419
487
  operation_name_error = GraphQL::Query::OperationNameMissingError.new(@operation_name)
@@ -430,7 +498,6 @@ module GraphQL
430
498
 
431
499
  @validation_pipeline = GraphQL::Query::ValidationPipeline.new(
432
500
  query: self,
433
- validate: @validate,
434
501
  parse_error: parse_error,
435
502
  operation_name_error: operation_name_error,
436
503
  max_depth: @max_depth,
@@ -1,116 +1,22 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GraphQL
4
+ # Support {GraphQL::Parser::Cache} and {GraphQL.eager_load!}
5
+ #
6
+ # @example Enable the parser cache with default directory
7
+ #
8
+ # config.graphql.parser_cache = true
9
+ #
4
10
  class Railtie < Rails::Railtie
5
- config.before_configuration do
6
- # Bootsnap compile cache has similar expiration properties,
7
- # so we assume that if the user has bootsnap setup it's ok
8
- # to piggy back on it.
9
- if ::Object.const_defined?("Bootsnap::CompileCache::ISeq") && Bootsnap::CompileCache::ISeq.cache_dir
10
- Language::Parser.cache ||= Language::Cache.new(Pathname.new(Bootsnap::CompileCache::ISeq.cache_dir).join('graphql'))
11
- end
12
- end
13
-
14
- rake_tasks do
15
- # Defer this so that you only need the `parser` gem when you _run_ the upgrader
16
- def load_upgraders
17
- require_relative './upgrader/member'
18
- require_relative './upgrader/schema'
19
- end
20
-
21
- namespace :graphql do
22
- task :upgrade, [:dir] do |t, args|
23
- unless (dir = args[:dir])
24
- fail 'You have to give me a directory where your GraphQL schema and types live. ' \
25
- 'For example: `bin/rake graphql:upgrade[app/graphql/**/*]`'
26
- end
27
-
28
- Dir[dir].each do |file|
29
- # Members (types, interfaces, etc.)
30
- if file =~ /.*_(type|interface|enum|union|)\.rb$/
31
- Rake::Task["graphql:upgrade:member"].execute(Struct.new(:member_file).new(file))
32
- end
33
- end
34
-
35
- puts "Upgrade complete! Note that this is a best-effort approach, and may very well contain some bugs."
36
- puts "Don't forget to create the base objects. For example, you could run:"
37
- puts "\tbin/rake graphql:upgrade:create_base_objects[app/graphql]"
38
- end
39
-
40
- namespace :upgrade do
41
- task :create_base_objects, [:base_dir] do |t, args|
42
- unless (base_dir = args[:base_dir])
43
- fail 'You have to give me a directory where your GraphQL types live. ' \
44
- 'For example: `bin/rake graphql:upgrade:create_base_objects[app/graphql]`'
45
- end
46
-
47
- destination_file = File.join(base_dir, "types", "base_scalar.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::BaseScalar < GraphQL::Schema::Scalar\nend"
52
- end
53
- end
54
-
55
- destination_file = File.join(base_dir, "types", "base_input_object.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::BaseInputObject < GraphQL::Schema::InputObject\nend"
60
- end
61
- end
62
-
63
- destination_file = File.join(base_dir, "types", "base_enum.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::BaseEnum < GraphQL::Schema::Enum\nend"
68
- end
69
- end
70
-
71
- destination_file = File.join(base_dir, "types", "base_union.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 "class Types::BaseUnion < GraphQL::Schema::Union\nend"
76
- end
77
- end
78
-
79
- destination_file = File.join(base_dir, "types", "base_interface.rb")
80
- unless File.exists?(destination_file)
81
- FileUtils.mkdir_p(File.dirname(destination_file))
82
- File.open(destination_file, 'w') do |f|
83
- f.puts "module Types::BaseInterface\n include GraphQL::Schema::Interface\nend"
84
- end
85
- end
86
-
87
- destination_file = File.join(base_dir, "types", "base_object.rb")
88
- unless File.exists?(destination_file)
89
- File.open(destination_file, 'w') do |f|
90
- f.puts "class Types::BaseObject < GraphQL::Schema::Object\nend"
91
- end
92
- end
93
- end
94
-
95
- task :schema, [:schema_file] do |t, args|
96
- schema_file = args.schema_file
97
- load_upgraders
98
- upgrader = GraphQL::Upgrader::Schema.new File.read(schema_file)
99
-
100
- puts "- Transforming schema #{schema_file}"
101
- File.open(schema_file, 'w') { |f| f.write upgrader.upgrade }
102
- end
103
-
104
- task :member, [:member_file] do |t, args|
105
- member_file = args.member_file
106
- load_upgraders
107
- upgrader = GraphQL::Upgrader::Member.new File.read(member_file)
108
- next unless upgrader.upgradeable?
109
-
110
- puts "- Transforming member #{member_file}"
111
- File.open(member_file, 'w') { |f| f.write upgrader.upgrade }
112
- end
113
- end
11
+ config.graphql = ActiveSupport::OrderedOptions.new
12
+ config.graphql.parser_cache = false
13
+ config.eager_load_namespaces << GraphQL
14
+
15
+ initializer("graphql.cache") do |app|
16
+ if config.graphql.parser_cache
17
+ Language::Parser.cache ||= Language::Cache.new(
18
+ app.root.join("tmp/cache/graphql")
19
+ )
114
20
  end
115
21
  end
116
22
  end
@@ -15,7 +15,7 @@ module GraphQL
15
15
  puts "Validating graphql-pro v#{version}"
16
16
  puts " - Checking for graphql-pro credentials..."
17
17
 
18
- 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}/]
19
19
  if creds.nil?
20
20
  puts " #{ex} failed, please set with `bundle config gems.graphql.pro $MY_CREDENTIALS`"
21
21
  exit(1)