graphql 1.8.7 → 1.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (368) hide show
  1. checksums.yaml +4 -4
  2. data/lib/generators/graphql/install_generator.rb +2 -1
  3. data/lib/generators/graphql/scalar_generator.rb +20 -0
  4. data/lib/generators/graphql/templates/base_scalar.erb +4 -0
  5. data/lib/generators/graphql/templates/scalar.erb +13 -0
  6. data/lib/graphql/analysis/ast/analyzer.rb +62 -0
  7. data/lib/graphql/analysis/ast/field_usage.rb +28 -0
  8. data/lib/graphql/analysis/ast/max_query_complexity.rb +23 -0
  9. data/lib/graphql/analysis/ast/max_query_depth.rb +18 -0
  10. data/lib/graphql/analysis/ast/query_complexity.rb +114 -0
  11. data/lib/graphql/analysis/ast/query_depth.rb +66 -0
  12. data/lib/graphql/analysis/ast/visitor.rb +255 -0
  13. data/lib/graphql/analysis/ast.rb +82 -0
  14. data/lib/graphql/analysis.rb +1 -0
  15. data/lib/graphql/argument.rb +5 -0
  16. data/lib/graphql/authorization.rb +1 -0
  17. data/lib/graphql/backwards_compatibility.rb +1 -1
  18. data/lib/graphql/base_type.rb +1 -1
  19. data/lib/graphql/compatibility/execution_specification/specification_schema.rb +1 -2
  20. data/lib/graphql/compatibility/schema_parser_specification.rb +2 -6
  21. data/lib/graphql/dig.rb +19 -0
  22. data/lib/graphql/directive/include_directive.rb +1 -7
  23. data/lib/graphql/directive/skip_directive.rb +1 -8
  24. data/lib/graphql/directive.rb +13 -1
  25. data/lib/graphql/enum_type.rb +8 -0
  26. data/lib/graphql/execution/execute.rb +36 -17
  27. data/lib/graphql/execution/instrumentation.rb +2 -0
  28. data/lib/graphql/execution/interpreter/execution_errors.rb +29 -0
  29. data/lib/graphql/execution/interpreter/hash_response.rb +46 -0
  30. data/lib/graphql/execution/interpreter/resolve.rb +58 -0
  31. data/lib/graphql/execution/interpreter/runtime.rb +597 -0
  32. data/lib/graphql/execution/interpreter.rb +99 -0
  33. data/lib/graphql/execution/lazy.rb +8 -1
  34. data/lib/graphql/execution/lookahead.rb +351 -0
  35. data/lib/graphql/execution/multiplex.rb +37 -29
  36. data/lib/graphql/execution.rb +2 -0
  37. data/lib/graphql/execution_error.rb +1 -1
  38. data/lib/graphql/field.rb +1 -7
  39. data/lib/graphql/integer_encoding_error.rb +12 -0
  40. data/lib/graphql/internal_representation/rewrite.rb +127 -142
  41. data/lib/graphql/introspection/dynamic_fields.rb +8 -2
  42. data/lib/graphql/introspection/entry_points.rb +11 -6
  43. data/lib/graphql/introspection/enum_value_type.rb +4 -0
  44. data/lib/graphql/introspection/schema_type.rb +7 -2
  45. data/lib/graphql/introspection/type_type.rb +9 -5
  46. data/lib/graphql/invalid_null_error.rb +1 -1
  47. data/lib/graphql/language/block_string.rb +37 -0
  48. data/lib/graphql/language/document_from_schema_definition.rb +10 -7
  49. data/lib/graphql/language/lexer.rb +55 -36
  50. data/lib/graphql/language/lexer.rl +8 -3
  51. data/lib/graphql/language/nodes.rb +440 -362
  52. data/lib/graphql/language/parser.rb +56 -56
  53. data/lib/graphql/language/parser.y +12 -12
  54. data/lib/graphql/language/printer.rb +2 -2
  55. data/lib/graphql/language/visitor.rb +158 -15
  56. data/lib/graphql/language.rb +0 -1
  57. data/lib/graphql/literal_validation_error.rb +6 -0
  58. data/lib/graphql/query/arguments.rb +3 -2
  59. data/lib/graphql/query/arguments_cache.rb +1 -1
  60. data/lib/graphql/query/context.rb +14 -5
  61. data/lib/graphql/query/executor.rb +1 -1
  62. data/lib/graphql/query/result.rb +1 -1
  63. data/lib/graphql/query/validation_pipeline.rb +35 -11
  64. data/lib/graphql/query/variable_validation_error.rb +10 -1
  65. data/lib/graphql/query.rb +16 -2
  66. data/lib/graphql/relay/base_connection.rb +2 -0
  67. data/lib/graphql/relay/connection_instrumentation.rb +3 -1
  68. data/lib/graphql/relay/connection_resolve.rb +1 -1
  69. data/lib/graphql/relay/node.rb +2 -28
  70. data/lib/graphql/relay/relation_connection.rb +1 -1
  71. data/lib/graphql/schema/argument.rb +13 -5
  72. data/lib/graphql/schema/base_64_encoder.rb +4 -4
  73. data/lib/graphql/schema/build_from_definition.rb +2 -4
  74. data/lib/graphql/schema/default_type_error.rb +1 -1
  75. data/lib/graphql/schema/directive/feature.rb +66 -0
  76. data/lib/graphql/schema/directive/include.rb +25 -0
  77. data/lib/graphql/schema/directive/skip.rb +25 -0
  78. data/lib/graphql/schema/directive/transform.rb +48 -0
  79. data/lib/graphql/schema/directive.rb +103 -0
  80. data/lib/graphql/schema/enum_value.rb +3 -2
  81. data/lib/graphql/schema/field/connection_extension.rb +50 -0
  82. data/lib/graphql/schema/field/scope_extension.rb +18 -0
  83. data/lib/graphql/schema/field.rb +273 -64
  84. data/lib/graphql/schema/field_extension.rb +69 -0
  85. data/lib/graphql/schema/input_object.rb +16 -8
  86. data/lib/graphql/schema/interface.rb +1 -0
  87. data/lib/graphql/schema/loader.rb +22 -16
  88. data/lib/graphql/schema/member/base_dsl_methods.rb +8 -2
  89. data/lib/graphql/schema/member/build_type.rb +33 -1
  90. data/lib/graphql/schema/member/has_arguments.rb +6 -2
  91. data/lib/graphql/schema/member/has_fields.rb +18 -70
  92. data/lib/graphql/schema/member/has_path.rb +25 -0
  93. data/lib/graphql/schema/member/instrumentation.rb +10 -7
  94. data/lib/graphql/schema/member.rb +2 -0
  95. data/lib/graphql/schema/mutation.rb +6 -48
  96. data/lib/graphql/schema/non_null.rb +5 -1
  97. data/lib/graphql/schema/object.rb +18 -4
  98. data/lib/graphql/schema/printer.rb +1 -1
  99. data/lib/graphql/schema/relay_classic_mutation.rb +42 -9
  100. data/lib/graphql/schema/resolver/has_payload_type.rb +65 -0
  101. data/lib/graphql/schema/resolver.rb +45 -20
  102. data/lib/graphql/schema/subscription.rb +97 -0
  103. data/lib/graphql/schema/traversal.rb +11 -7
  104. data/lib/graphql/schema.rb +186 -38
  105. data/lib/graphql/static_validation/all_rules.rb +3 -2
  106. data/lib/graphql/static_validation/base_visitor.rb +199 -0
  107. data/lib/graphql/static_validation/default_visitor.rb +15 -0
  108. data/lib/graphql/static_validation/definition_dependencies.rb +62 -68
  109. data/lib/graphql/static_validation/{message.rb → error.rb} +11 -11
  110. data/lib/graphql/static_validation/interpreter_visitor.rb +14 -0
  111. data/lib/graphql/static_validation/literal_validator.rb +54 -11
  112. data/lib/graphql/static_validation/no_validate_visitor.rb +10 -0
  113. data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +87 -16
  114. data/lib/graphql/static_validation/rules/argument_literals_are_compatible_error.rb +31 -0
  115. data/lib/graphql/static_validation/rules/argument_names_are_unique.rb +11 -11
  116. data/lib/graphql/static_validation/rules/argument_names_are_unique_error.rb +30 -0
  117. data/lib/graphql/static_validation/rules/arguments_are_defined.rb +52 -8
  118. data/lib/graphql/static_validation/rules/arguments_are_defined_error.rb +35 -0
  119. data/lib/graphql/static_validation/rules/directives_are_defined.rb +12 -15
  120. data/lib/graphql/static_validation/rules/directives_are_defined_error.rb +29 -0
  121. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +19 -14
  122. data/lib/graphql/static_validation/rules/directives_are_in_valid_locations_error.rb +31 -0
  123. data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +17 -19
  124. data/lib/graphql/static_validation/rules/fields_are_defined_on_type_error.rb +32 -0
  125. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +30 -14
  126. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections_error.rb +31 -0
  127. data/lib/graphql/static_validation/rules/fields_will_merge.rb +356 -29
  128. data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +32 -0
  129. data/lib/graphql/static_validation/rules/fragment_names_are_unique.rb +20 -13
  130. data/lib/graphql/static_validation/rules/fragment_names_are_unique_error.rb +29 -0
  131. data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +37 -29
  132. data/lib/graphql/static_validation/rules/fragment_spreads_are_possible_error.rb +35 -0
  133. data/lib/graphql/static_validation/rules/fragment_types_exist.rb +25 -17
  134. data/lib/graphql/static_validation/rules/fragment_types_exist_error.rb +29 -0
  135. data/lib/graphql/static_validation/rules/fragments_are_finite.rb +12 -10
  136. data/lib/graphql/static_validation/rules/fragments_are_finite_error.rb +29 -0
  137. data/lib/graphql/static_validation/rules/fragments_are_named.rb +7 -11
  138. data/lib/graphql/static_validation/rules/fragments_are_named_error.rb +26 -0
  139. data/lib/graphql/static_validation/rules/fragments_are_on_composite_types.rb +16 -16
  140. data/lib/graphql/static_validation/rules/fragments_are_on_composite_types_error.rb +30 -0
  141. data/lib/graphql/static_validation/rules/fragments_are_used.rb +21 -14
  142. data/lib/graphql/static_validation/rules/fragments_are_used_error.rb +29 -0
  143. data/lib/graphql/static_validation/rules/mutation_root_exists.rb +10 -14
  144. data/lib/graphql/static_validation/rules/mutation_root_exists_error.rb +26 -0
  145. data/lib/graphql/static_validation/rules/no_definitions_are_present.rb +30 -30
  146. data/lib/graphql/static_validation/rules/no_definitions_are_present_error.rb +25 -0
  147. data/lib/graphql/static_validation/rules/operation_names_are_valid.rb +25 -17
  148. data/lib/graphql/static_validation/rules/operation_names_are_valid_error.rb +28 -0
  149. data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +17 -18
  150. data/lib/graphql/static_validation/rules/required_arguments_are_present_error.rb +35 -0
  151. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +47 -0
  152. data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present_error.rb +35 -0
  153. data/lib/graphql/static_validation/rules/subscription_root_exists.rb +10 -14
  154. data/lib/graphql/static_validation/rules/subscription_root_exists_error.rb +26 -0
  155. data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +28 -17
  156. data/lib/graphql/static_validation/rules/unique_directives_per_location_error.rb +29 -0
  157. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +35 -27
  158. data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed_error.rb +39 -0
  159. data/lib/graphql/static_validation/rules/variable_names_are_unique.rb +15 -14
  160. data/lib/graphql/static_validation/rules/variable_names_are_unique_error.rb +29 -0
  161. data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +41 -30
  162. data/lib/graphql/static_validation/rules/variable_usages_are_allowed_error.rb +38 -0
  163. data/lib/graphql/static_validation/rules/variables_are_input_types.rb +18 -14
  164. data/lib/graphql/static_validation/rules/variables_are_input_types_error.rb +32 -0
  165. data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +73 -65
  166. data/lib/graphql/static_validation/rules/variables_are_used_and_defined_error.rb +37 -0
  167. data/lib/graphql/static_validation/validation_context.rb +8 -51
  168. data/lib/graphql/static_validation/validator.rb +23 -15
  169. data/lib/graphql/static_validation.rb +5 -3
  170. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +21 -2
  171. data/lib/graphql/subscriptions/event.rb +28 -5
  172. data/lib/graphql/subscriptions/subscription_root.rb +66 -0
  173. data/lib/graphql/subscriptions.rb +16 -2
  174. data/lib/graphql/tracing/active_support_notifications_tracing.rb +0 -1
  175. data/lib/graphql/tracing/appsignal_tracing.rb +1 -1
  176. data/lib/graphql/tracing/data_dog_tracing.rb +1 -1
  177. data/lib/graphql/tracing/new_relic_tracing.rb +3 -3
  178. data/lib/graphql/tracing/platform_tracing.rb +17 -1
  179. data/lib/graphql/tracing/prometheus_tracing.rb +1 -1
  180. data/lib/graphql/tracing/scout_tracing.rb +1 -1
  181. data/lib/graphql/tracing/skylight_tracing.rb +3 -3
  182. data/lib/graphql/tracing.rb +8 -8
  183. data/lib/graphql/types/float.rb +1 -1
  184. data/lib/graphql/types/int.rb +11 -2
  185. data/lib/graphql/types/iso_8601_date_time.rb +15 -1
  186. data/lib/graphql/types/relay/base_connection.rb +15 -1
  187. data/lib/graphql/types/relay/node.rb +0 -1
  188. data/lib/graphql/types/relay/node_field.rb +43 -0
  189. data/lib/graphql/types/relay/nodes_field.rb +45 -0
  190. data/lib/graphql/types/relay.rb +2 -0
  191. data/lib/graphql/unauthorized_error.rb +4 -0
  192. data/lib/graphql/unauthorized_field_error.rb +23 -0
  193. data/lib/graphql/upgrader/member.rb +5 -0
  194. data/lib/graphql/version.rb +1 -1
  195. data/lib/graphql.rb +6 -1
  196. data/readme.md +7 -7
  197. data/spec/dummy/Gemfile +1 -1
  198. data/spec/dummy/Gemfile.lock +157 -0
  199. data/spec/dummy/app/channels/graphql_channel.rb +22 -11
  200. data/spec/dummy/config/locales/en.yml +1 -1
  201. data/spec/dummy/log/test.log +199 -0
  202. data/spec/dummy/test/test_helper.rb +1 -0
  203. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/4w/4wzXRZrAkwKdgYaSE0pid5eB-fer8vSfSku_NPg4rMA.cache +0 -0
  204. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/7I/7IHVBiJT06QSpgLpLoJIxboQ0B-D_tMTxsvoezBTV3Q.cache +1 -0
  205. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/8w/8wY_SKagj8wHuwGNAAf6JnQ8joMbC6cEYpHrTAI8Urc.cache +1 -0
  206. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/AK/AKzz1u6bGb4auXcrObA_g5LL-oV0ejNGa448AgAi_WQ.cache +1 -0
  207. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ET/ETW4uxvaYpruL8y6_ZptUH82ZowMaHIqvg5WexBFdEM.cache +3 -0
  208. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/F1/F1TWpjjyA56k9Z90n5B3xRn7DUdGjX73QCkYC6k07JQ.cache +0 -0
  209. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/F8/F8MUNRzORGFgr329fNM0xLaoWCXdv3BIalT7dsvLfjs.cache +2 -0
  210. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/KB/KB07ZaKNC5uXJ7TjLi-WqnY6g7dq8wWp_8N3HNjBNxg.cache +2 -0
  211. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Ms/MsKSimH_UCB-H1tLvDABDHuvGciuoW6kVqQWDrXU5FQ.cache +0 -0
  212. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Mt/Mtci-Kim50aPOmeClD4AIicKn1d1WJ0n454IjSd94sk.cache +0 -0
  213. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/QH/QHt3Tc1Y6M66Oo_pDuMyWrQNs4Pp3SMeZR5K1wJj2Ts.cache +1 -0
  214. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/XU/XU4k1OXnfMils5SrirorPvDSyDSqiOWLZNtmAH1HH8k.cache +0 -0
  215. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ZI/ZIof7mZxWWCnraIFOCuV6a8QRWzKJXJnx2Xd7C0ZyX0.cache +1 -0
  216. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/cG/cGc_puuPS5pZKgUcy1Y_i1L6jl5UtsiIrMH59rTzR6c.cache +3 -0
  217. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/df/dfro_B6bx3KP1Go-7jEOqqZ2j4hVRseXIc3es9PKQno.cache +1 -0
  218. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/jO/jO1DfbqnG0mTULsjJJANc3fefrG2zt7DIMmcptMT628.cache +1 -0
  219. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/pE/pE7gO6pQ-z187Swb4hT554wmqsq-cNzgPWLrCz-LQQQ.cache +0 -0
  220. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/r9/r9iU1l58a6rxkZSW5RSC52_tD-_UQuHxoMVnkfJ7Mhs.cache +1 -0
  221. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/xi/xitPPFfPIyDMpaznV0sBBcw8eSCV8PJcLLWin78sCgE.cache +0 -0
  222. data/spec/dummy/tmp/screenshots/failures_test_it_handles_subscriptions.png +0 -0
  223. data/spec/graphql/analysis/analyze_query_spec.rb +1 -1
  224. data/spec/graphql/analysis/ast/field_usage_spec.rb +51 -0
  225. data/spec/graphql/analysis/ast/max_query_complexity_spec.rb +120 -0
  226. data/spec/graphql/analysis/ast/max_query_depth_spec.rb +114 -0
  227. data/spec/graphql/analysis/ast/query_complexity_spec.rb +299 -0
  228. data/spec/graphql/analysis/ast/query_depth_spec.rb +108 -0
  229. data/spec/graphql/analysis/ast_spec.rb +269 -0
  230. data/spec/graphql/authorization_spec.rb +120 -23
  231. data/spec/graphql/base_type_spec.rb +6 -4
  232. data/spec/graphql/enum_type_spec.rb +6 -1
  233. data/spec/graphql/execution/execute_spec.rb +9 -9
  234. data/spec/graphql/execution/instrumentation_spec.rb +19 -0
  235. data/spec/graphql/execution/interpreter_spec.rb +485 -0
  236. data/spec/graphql/execution/lazy_spec.rb +67 -1
  237. data/spec/graphql/execution/lookahead_spec.rb +363 -0
  238. data/spec/graphql/execution/multiplex_spec.rb +31 -3
  239. data/spec/graphql/execution/typecast_spec.rb +20 -20
  240. data/spec/graphql/execution_error_spec.rb +110 -96
  241. data/spec/graphql/field_spec.rb +1 -1
  242. data/spec/graphql/input_object_type_spec.rb +13 -352
  243. data/spec/graphql/int_type_spec.rb +19 -0
  244. data/spec/graphql/interface_type_spec.rb +4 -4
  245. data/spec/graphql/internal_representation/rewrite_spec.rb +2 -0
  246. data/spec/graphql/introspection/input_value_type_spec.rb +1 -1
  247. data/spec/graphql/introspection/type_type_spec.rb +1 -2
  248. data/spec/graphql/language/document_from_schema_definition_spec.rb +2 -2
  249. data/spec/graphql/language/lexer_spec.rb +72 -3
  250. data/spec/graphql/language/nodes_spec.rb +20 -0
  251. data/spec/graphql/language/printer_spec.rb +18 -6
  252. data/spec/graphql/language/visitor_spec.rb +320 -14
  253. data/spec/graphql/non_null_type_spec.rb +1 -1
  254. data/spec/graphql/object_type_spec.rb +32 -27
  255. data/spec/graphql/query/arguments_spec.rb +21 -0
  256. data/spec/graphql/query/context_spec.rb +28 -0
  257. data/spec/graphql/query/executor_spec.rb +40 -36
  258. data/spec/graphql/query_spec.rb +12 -6
  259. data/spec/graphql/schema/argument_spec.rb +35 -1
  260. data/spec/graphql/schema/build_from_definition_spec.rb +144 -29
  261. data/spec/graphql/schema/catchall_middleware_spec.rb +16 -15
  262. data/spec/graphql/schema/directive/feature_spec.rb +81 -0
  263. data/spec/graphql/schema/directive/transform_spec.rb +39 -0
  264. data/spec/graphql/schema/enum_spec.rb +12 -3
  265. data/spec/graphql/schema/enum_value_spec.rb +11 -0
  266. data/spec/graphql/schema/field_extension_spec.rb +115 -0
  267. data/spec/graphql/schema/field_spec.rb +47 -7
  268. data/spec/graphql/schema/input_object_spec.rb +95 -0
  269. data/spec/graphql/schema/instrumentation_spec.rb +3 -0
  270. data/spec/graphql/schema/interface_spec.rb +8 -2
  271. data/spec/graphql/schema/introspection_system_spec.rb +9 -1
  272. data/spec/graphql/schema/loader_spec.rb +5 -0
  273. data/spec/graphql/schema/member/accepts_definition_spec.rb +4 -0
  274. data/spec/graphql/schema/member/build_type_spec.rb +46 -0
  275. data/spec/graphql/schema/member/scoped_spec.rb +19 -3
  276. data/spec/graphql/schema/mutation_spec.rb +5 -3
  277. data/spec/graphql/schema/object_spec.rb +9 -1
  278. data/spec/graphql/schema/printer_spec.rb +255 -93
  279. data/spec/graphql/schema/relay_classic_mutation_spec.rb +133 -0
  280. data/spec/graphql/schema/resolver_spec.rb +173 -9
  281. data/spec/graphql/schema/scalar_spec.rb +6 -0
  282. data/spec/graphql/schema/subscription_spec.rb +416 -0
  283. data/spec/graphql/schema/traversal_spec.rb +10 -10
  284. data/spec/graphql/schema/type_expression_spec.rb +2 -2
  285. data/spec/graphql/schema/union_spec.rb +7 -0
  286. data/spec/graphql/schema/validation_spec.rb +1 -1
  287. data/spec/graphql/schema/warden_spec.rb +145 -88
  288. data/spec/graphql/static_validation/rules/argument_literals_are_compatible_spec.rb +213 -73
  289. data/spec/graphql/static_validation/rules/argument_names_are_unique_spec.rb +2 -2
  290. data/spec/graphql/static_validation/rules/arguments_are_defined_spec.rb +72 -29
  291. data/spec/graphql/static_validation/rules/directives_are_defined_spec.rb +4 -2
  292. data/spec/graphql/static_validation/rules/directives_are_in_valid_locations_spec.rb +4 -2
  293. data/spec/graphql/static_validation/rules/fields_are_defined_on_type_spec.rb +10 -5
  294. data/spec/graphql/static_validation/rules/fields_have_appropriate_selections_spec.rb +10 -5
  295. data/spec/graphql/static_validation/rules/fields_will_merge_spec.rb +131 -5
  296. data/spec/graphql/static_validation/rules/fragment_names_are_unique_spec.rb +2 -1
  297. data/spec/graphql/static_validation/rules/fragment_spreads_are_possible_spec.rb +6 -3
  298. data/spec/graphql/static_validation/rules/fragment_types_exist_spec.rb +4 -2
  299. data/spec/graphql/static_validation/rules/fragments_are_finite_spec.rb +4 -2
  300. data/spec/graphql/static_validation/rules/fragments_are_named_spec.rb +2 -1
  301. data/spec/graphql/static_validation/rules/fragments_are_on_composite_types_spec.rb +6 -3
  302. data/spec/graphql/static_validation/rules/fragments_are_used_spec.rb +22 -2
  303. data/spec/graphql/static_validation/rules/mutation_root_exists_spec.rb +2 -1
  304. data/spec/graphql/static_validation/rules/operation_names_are_valid_spec.rb +6 -3
  305. data/spec/graphql/static_validation/rules/required_arguments_are_present_spec.rb +13 -4
  306. data/spec/graphql/static_validation/rules/required_input_object_attributes_are_present_spec.rb +58 -0
  307. data/spec/graphql/static_validation/rules/subscription_root_exists_spec.rb +2 -1
  308. data/spec/graphql/static_validation/rules/unique_directives_per_location_spec.rb +14 -7
  309. data/spec/graphql/static_validation/rules/variable_default_values_are_correctly_typed_spec.rb +14 -7
  310. data/spec/graphql/static_validation/rules/variable_usages_are_allowed_spec.rb +8 -4
  311. data/spec/graphql/static_validation/rules/variables_are_input_types_spec.rb +8 -4
  312. data/spec/graphql/static_validation/rules/variables_are_used_and_defined_spec.rb +23 -3
  313. data/spec/graphql/static_validation/type_stack_spec.rb +10 -19
  314. data/spec/graphql/static_validation/validator_spec.rb +50 -2
  315. data/spec/graphql/subscriptions_spec.rb +27 -16
  316. data/spec/graphql/tracing/new_relic_tracing_spec.rb +16 -0
  317. data/spec/graphql/tracing/platform_tracing_spec.rb +59 -37
  318. data/spec/graphql/tracing/prometheus_tracing_spec.rb +3 -0
  319. data/spec/graphql/tracing/skylight_tracing_spec.rb +16 -0
  320. data/spec/graphql/types/iso_8601_date_time_spec.rb +29 -2
  321. data/spec/graphql/union_type_spec.rb +2 -2
  322. data/spec/graphql/upgrader/member_spec.rb +67 -0
  323. data/spec/{graphql → integration/mongoid/graphql}/relay/mongo_relation_connection_spec.rb +11 -22
  324. data/spec/integration/mongoid/spec_helper.rb +2 -0
  325. data/spec/{support → integration/mongoid}/star_trek/data.rb +0 -0
  326. data/spec/{support → integration/mongoid}/star_trek/schema.rb +56 -34
  327. data/spec/{support/star_wars → integration/rails}/data.rb +1 -0
  328. data/spec/{support → integration/rails/generators}/base_generator_test.rb +0 -0
  329. data/spec/{generators → integration/rails/generators}/graphql/enum_generator_spec.rb +0 -0
  330. data/spec/{generators → integration/rails/generators}/graphql/install_generator_spec.rb +1 -1
  331. data/spec/{generators → integration/rails/generators}/graphql/interface_generator_spec.rb +0 -0
  332. data/spec/{generators → integration/rails/generators}/graphql/loader_generator_spec.rb +0 -0
  333. data/spec/{generators → integration/rails/generators}/graphql/mutation_generator_spec.rb +0 -0
  334. data/spec/{generators → integration/rails/generators}/graphql/object_generator_spec.rb +0 -0
  335. data/spec/integration/rails/generators/graphql/scalar_generator_spec.rb +28 -0
  336. data/spec/{generators → integration/rails/generators}/graphql/union_generator_spec.rb +0 -0
  337. data/spec/integration/rails/graphql/input_object_type_spec.rb +364 -0
  338. data/spec/{graphql → integration/rails/graphql}/query/variables_spec.rb +7 -7
  339. data/spec/{graphql → integration/rails/graphql}/relay/array_connection_spec.rb +9 -9
  340. data/spec/{graphql → integration/rails/graphql}/relay/base_connection_spec.rb +11 -3
  341. data/spec/{graphql → integration/rails/graphql}/relay/connection_instrumentation_spec.rb +19 -22
  342. data/spec/{graphql → integration/rails/graphql}/relay/connection_resolve_spec.rb +16 -0
  343. data/spec/{graphql → integration/rails/graphql}/relay/connection_type_spec.rb +0 -0
  344. data/spec/{graphql → integration/rails/graphql}/relay/edge_spec.rb +0 -0
  345. data/spec/{graphql → integration/rails/graphql}/relay/mutation_spec.rb +48 -0
  346. data/spec/{graphql → integration/rails/graphql}/relay/node_spec.rb +0 -0
  347. data/spec/{graphql → integration/rails/graphql}/relay/page_info_spec.rb +22 -22
  348. data/spec/{graphql → integration/rails/graphql}/relay/range_add_spec.rb +4 -4
  349. data/spec/{graphql → integration/rails/graphql}/relay/relation_connection_spec.rb +56 -27
  350. data/spec/{graphql → integration/rails/graphql}/schema_spec.rb +15 -11
  351. data/spec/{graphql → integration/rails/graphql}/tracing/active_support_notifications_tracing_spec.rb +16 -9
  352. data/spec/integration/rails/spec_helper.rb +25 -0
  353. data/spec/integration/tmp/app/graphql/types/family_type.rb +9 -0
  354. data/spec/spec_helper.rb +23 -39
  355. data/spec/support/dummy/data.rb +20 -17
  356. data/spec/support/dummy/schema.rb +315 -305
  357. data/spec/support/error_bubbling_helpers.rb +23 -0
  358. data/spec/support/jazz.rb +213 -46
  359. data/spec/support/lazy_helpers.rb +69 -27
  360. data/spec/support/new_relic.rb +3 -0
  361. data/spec/support/skylight.rb +3 -0
  362. data/spec/support/star_wars/schema.rb +131 -81
  363. data/spec/support/static_validation_helpers.rb +9 -5
  364. metadata +418 -261
  365. data/lib/graphql/language/comments.rb +0 -45
  366. data/lib/graphql/static_validation/arguments_validator.rb +0 -50
  367. data/spec/graphql/schema/member/has_fields_spec.rb +0 -129
  368. data/spec/rails_dependency_sanity_spec.rb +0 -14
@@ -1,21 +1,47 @@
1
1
  # frozen_string_literal: true
2
2
  require "spec_helper"
3
+ include ErrorBubblingHelpers
3
4
 
4
5
  module MaskHelpers
5
- PhonemeType = GraphQL::ObjectType.define do
6
- name "Phoneme"
7
- description "A building block of sound in a given language"
8
- metadata :hidden_type, true
9
- interfaces [LanguageMemberInterface]
6
+ class BaseArgument < GraphQL::Schema::Argument
7
+ accepts_definition :metadata
8
+ end
9
+
10
+ class BaseField < GraphQL::Schema::Field
11
+ accepts_definition :metadata
12
+ argument_class BaseArgument
13
+ end
14
+
15
+ class BaseObject < GraphQL::Schema::Object
16
+ accepts_definition :metadata
17
+ field_class BaseField
18
+ end
19
+
20
+ class BaseEnumValue < GraphQL::Schema::EnumValue
21
+ accepts_definition :metadata
22
+ end
23
+
24
+ class BaseEnum < GraphQL::Schema::Enum
25
+ accepts_definition :metadata
26
+ enum_value_class BaseEnumValue
27
+ end
10
28
 
11
- field :name, types.String.to_non_null_type
12
- field :symbol, types.String.to_non_null_type
13
- field :languages, LanguageType.to_list_type
14
- field :manner, MannerEnum
29
+ class BaseInputObject < GraphQL::Schema::InputObject
30
+ accepts_definition :metadata
31
+ argument_class BaseArgument
15
32
  end
16
33
 
17
- MannerEnum = GraphQL::EnumType.define do
18
- name "Manner"
34
+ class BaseUnion < GraphQL::Schema::Union
35
+ accepts_definition :metadata
36
+ end
37
+
38
+ module BaseInterface
39
+ include GraphQL::Schema::Interface
40
+ accepts_definition :metadata
41
+ field_class BaseField
42
+ end
43
+
44
+ class MannerType < BaseEnum
19
45
  description "Manner of articulation for this sound"
20
46
  metadata :hidden_input_type, true
21
47
  value "STOP"
@@ -28,105 +54,108 @@ module MaskHelpers
28
54
  end
29
55
  end
30
56
 
31
- LanguageType = GraphQL::ObjectType.define do
32
- name "Language"
33
- field :name, types.String.to_non_null_type
34
- field :families, types.String.to_list_type
35
- field :phonemes, PhonemeType.to_list_type
36
- field :graphemes, GraphemeType.to_list_type
57
+ class LanguageType < BaseObject
58
+ field :name, String, null: false
59
+ field :families, [String], null: false
60
+ field :phonemes, "[MaskHelpers::PhonemeType]", null: false
61
+ field :graphemes, "[MaskHelpers::GraphemeType]", null: false
62
+ end
63
+
64
+ module LanguageMemberType
65
+ include BaseInterface
66
+ metadata :hidden_abstract_type, true
67
+ description "Something that belongs to one or more languages"
68
+ field :languages, [LanguageType], null: false
37
69
  end
38
70
 
39
- GraphemeType = GraphQL::ObjectType.define do
40
- name "Grapheme"
71
+ class GraphemeType < BaseObject
41
72
  description "A building block of spelling in a given language"
42
- interfaces [LanguageMemberInterface]
73
+ implements LanguageMemberType
43
74
 
44
- field :name, types.String.to_non_null_type
45
- field :glyph, types.String.to_non_null_type
46
- field :languages, LanguageType.to_list_type
75
+ field :name, String, null: false
76
+ field :glyph, String, null: false
77
+ field :languages, [LanguageType], null: false
47
78
  end
48
79
 
49
- LanguageMemberInterface = GraphQL::InterfaceType.define do
50
- name "LanguageMember"
51
- metadata :hidden_abstract_type, true
52
- description "Something that belongs to one or more languages"
53
- field :languages, LanguageType.to_list_type
80
+ class PhonemeType < BaseObject
81
+ description "A building block of sound in a given language"
82
+ metadata :hidden_type, true
83
+ implements LanguageMemberType
84
+
85
+ field :name, String, null: false
86
+ field :symbol, String, null: false
87
+ field :languages, [LanguageType], null: false
88
+ field :manner, MannerType, null: false
54
89
  end
55
90
 
56
- EmicUnitUnion = GraphQL::UnionType.define do
57
- name "EmicUnit"
91
+ class EmicUnitType < BaseUnion
58
92
  description "A building block of a word in a given language"
59
- possible_types [GraphemeType, PhonemeType]
93
+ possible_types GraphemeType, PhonemeType
60
94
  end
61
95
 
62
- WithinInputType = GraphQL::InputObjectType.define do
63
- name "WithinInput"
96
+ class WithinInputType < BaseInputObject
64
97
  metadata :hidden_input_object_type, true
65
- argument :latitude, !types.Float
66
- argument :longitude, !types.Float
67
- argument :miles, !types.Float do
98
+ argument :latitude, Float, required: true
99
+ argument :longitude, Float, required: true
100
+ argument :miles, Float, required: true do
68
101
  metadata :hidden_input_field, true
69
102
  end
70
103
  end
71
104
 
72
- CheremeInput = GraphQL::InputObjectType.define do
73
- name "CheremeInput"
74
- input_field :name, types.String
105
+ class CheremeInput < BaseInputObject
106
+ argument :name, String, required: false
75
107
  end
76
108
 
77
- Chereme = GraphQL::ObjectType.define do
78
- name "Chereme"
109
+ class Chereme < BaseObject
79
110
  description "A basic unit of signed communication"
80
- field :name, types.String.to_non_null_type
111
+ field :name, String, null: false
81
112
  end
82
113
 
83
- Character = GraphQL::ObjectType.define do
84
- name "Character"
85
- interfaces [LanguageMemberInterface]
86
- field :code, types.Int
114
+ class Character < BaseObject
115
+ implements LanguageMemberType
116
+ field :code, Int, null: false
87
117
  end
88
118
 
89
- QueryType = GraphQL::ObjectType.define do
90
- name "Query"
91
- field :languages, LanguageType.to_list_type do
92
- argument :within, WithinInputType, "Find languages nearby a point" do
119
+ class QueryType < BaseObject
120
+ field :languages, [LanguageType], null: false do
121
+ argument :within, WithinInputType, required: false, description: "Find languages nearby a point" do
93
122
  metadata :hidden_argument_with_input_object, true
94
123
  end
95
124
  end
96
- field :language, LanguageType do
125
+
126
+ field :language, LanguageType, null: true do
97
127
  metadata :hidden_field, true
98
- argument :name, !types.String do
128
+ argument :name, String, required: true do
99
129
  metadata :hidden_argument, true
100
130
  end
101
131
  end
102
132
 
103
- field :chereme, Chereme do
133
+ field :chereme, Chereme, null: false do
104
134
  metadata :hidden_field, true
105
135
  end
106
136
 
107
- field :phonemes, PhonemeType.to_list_type do
108
- argument :manners, MannerEnum.to_list_type, "Filter phonemes by manner of articulation"
137
+ field :phonemes, [PhonemeType], null: false do
138
+ argument :manners, [MannerType], required: false, description: "Filter phonemes by manner of articulation"
109
139
  end
110
140
 
111
- field :phoneme, PhonemeType do
141
+ field :phoneme, PhonemeType, null: true do
112
142
  description "Lookup a phoneme by symbol"
113
- argument :symbol, !types.String
143
+ argument :symbol, String, required: true
114
144
  end
115
145
 
116
- field :unit, EmicUnitUnion do
146
+ field :unit, EmicUnitType, null: true do
117
147
  description "Find an emic unit by its name"
118
- argument :name, types.String.to_non_null_type
148
+ argument :name, String, required: true
119
149
  end
120
150
  end
121
151
 
122
- MutationType = GraphQL::ObjectType.define do
123
- name "Mutation"
124
- field :add_phoneme, PhonemeType do
125
- argument :symbol, types.String
152
+ class MutationType < BaseObject
153
+ field :add_phoneme, PhonemeType, null: true do
154
+ argument :symbol, String, required: false
126
155
  end
127
156
 
128
- field :add_chereme, types.String do
129
- argument :chereme, CheremeInput do
157
+ field :add_chereme, String, null: true do
158
+ argument :chereme, CheremeInput, required: false do
130
159
  metadata :hidden_argument, true
131
160
  end
132
161
  end
@@ -145,18 +174,25 @@ module MaskHelpers
145
174
  def self.after_query(q); end
146
175
  end
147
176
 
148
- Schema = GraphQL::Schema.define do
177
+ class Schema < GraphQL::Schema
149
178
  query QueryType
150
179
  mutation MutationType
151
180
  subscription MutationType
152
181
  orphan_types [Character]
153
- resolve_type ->(type, obj, ctx) { PhonemeType }
182
+ def self.resolve_type(type, obj, ctx)
183
+ PhonemeType
184
+ end
185
+
154
186
  instrument :query, FilterInstrumentation
187
+ if TESTING_INTERPRETER
188
+ use GraphQL::Execution::Interpreter
189
+ use GraphQL::Analysis::AST
190
+ end
155
191
  end
156
192
 
157
193
  module Data
158
194
  UVULAR_TRILL = OpenStruct.new({name: "Uvular Trill", symbol: "ʀ", manner: "TRILL"})
159
- def self.unit
195
+ def self.unit(name:)
160
196
  UVULAR_TRILL
161
197
  end
162
198
  end
@@ -205,16 +241,16 @@ describe GraphQL::Schema::Warden do
205
241
  end
206
242
 
207
243
  describe "hiding root types" do
208
- let(:mask) { ->(m, ctx) { m == MaskHelpers::MutationType } }
244
+ let(:mask) { ->(m, ctx) { m == MaskHelpers::MutationType.graphql_definition } }
209
245
 
210
246
  it "acts as if the root doesn't exist" do
211
- query_string = %|mutation { add_phoneme(symbol: "ϕ") { name } }|
247
+ query_string = %|mutation { addPhoneme(symbol: "ϕ") { name } }|
212
248
  res = MaskHelpers.query_with_mask(query_string, mask)
213
249
  assert MaskHelpers::Schema.mutation # it _does_ exist
214
250
  assert_equal 1, res["errors"].length
215
251
  assert_equal "Schema is not configured for mutations", res["errors"][0]["message"]
216
252
 
217
- query_string = %|subscription { add_phoneme(symbol: "ϕ") { name } }|
253
+ query_string = %|subscription { addPhoneme(symbol: "ϕ") { name } }|
218
254
  res = MaskHelpers.query_with_mask(query_string, mask)
219
255
  assert MaskHelpers::Schema.subscription # it _does_ exist
220
256
  assert_equal 1, res["errors"].length
@@ -557,7 +593,6 @@ describe GraphQL::Schema::Warden do
557
593
  end
558
594
  end
559
595
 
560
-
561
596
  describe "hiding arguments" do
562
597
  let(:mask) {
563
598
  ->(member, ctx) { member.metadata[:hidden_argument] || member.metadata[:hidden_input_type] }
@@ -630,17 +665,39 @@ describe GraphQL::Schema::Warden do
630
665
  assert_equal expected_errors, error_messages(res)
631
666
  end
632
667
 
633
- it "isn't a valid literal input" do
634
- query_string = %|
635
- {
636
- languages(within: {latitude: 1.0, longitude: 2.2, miles: 3.3}) { name }
637
- }|
638
- res = MaskHelpers.query_with_mask(query_string, mask)
639
- expected_errors = [
640
- "Argument 'within' on Field 'languages' has an invalid value. Expected type 'WithinInput'.",
641
- "InputObject 'WithinInput' doesn't accept argument 'miles'"
642
- ]
643
- assert_equal expected_errors, error_messages(res)
668
+ describe "with error bubbling disabled" do
669
+ it "isn't a valid literal input" do
670
+ without_error_bubbling(MaskHelpers::Schema) do
671
+ query_string = %|
672
+ {
673
+ languages(within: {latitude: 1.0, longitude: 2.2, miles: 3.3}) { name }
674
+ }|
675
+ res = MaskHelpers.query_with_mask(query_string, mask)
676
+ expected_errors =
677
+ [
678
+ "InputObject 'WithinInput' doesn't accept argument 'miles'"
679
+ ]
680
+ assert_equal expected_errors, error_messages(res)
681
+ end
682
+ end
683
+ end
684
+
685
+ describe "with error bubbling enabled" do
686
+ it "isn't a valid literal input" do
687
+ with_error_bubbling(MaskHelpers::Schema) do
688
+ query_string = %|
689
+ {
690
+ languages(within: {latitude: 1.0, longitude: 2.2, miles: 3.3}) { name }
691
+ }|
692
+ res = MaskHelpers.query_with_mask(query_string, mask)
693
+ expected_errors =
694
+ [
695
+ "Argument 'within' on Field 'languages' has an invalid value. Expected type 'WithinInput'.",
696
+ "InputObject 'WithinInput' doesn't accept argument 'miles'"
697
+ ]
698
+ assert_equal expected_errors, error_messages(res)
699
+ end
700
+ end
644
701
  end
645
702
 
646
703
  it "isn't a valid variable input" do
@@ -737,30 +794,30 @@ describe GraphQL::Schema::Warden do
737
794
  res = MaskHelpers.query_with_mask(query_string, mask)
738
795
  # It's not a good error message ... but it's something!
739
796
  expected_errors = [
740
- "Argument 'manners' on Field 'phonemes' has an invalid value. Expected type '[Manner]'.",
797
+ "Argument 'manners' on Field 'phonemes' has an invalid value. Expected type '[Manner!]'.",
741
798
  ]
742
799
  assert_equal expected_errors, error_messages(res)
743
800
  end
744
801
 
745
802
  it "isn't a valid default value" do
746
803
  query_string = %|
747
- query getPhonemes($manners: [Manner] = [STOP, TRILL]){ phonemes(manners: $manners) { symbol } }
804
+ query getPhonemes($manners: [Manner!] = [STOP, TRILL]){ phonemes(manners: $manners) { symbol } }
748
805
  |
749
806
  res = MaskHelpers.query_with_mask(query_string, mask)
750
- expected_errors = ["Default value for $manners doesn't match type [Manner]"]
807
+ expected_errors = ["Default value for $manners doesn't match type [Manner!]"]
751
808
  assert_equal expected_errors, error_messages(res)
752
809
  end
753
810
 
754
811
  it "isn't a valid variable input" do
755
812
  query_string = %|
756
- query getPhonemes($manners: [Manner]!) {
813
+ query getPhonemes($manners: [Manner!]!) {
757
814
  phonemes(manners: $manners) { symbol }
758
815
  }
759
816
  |
760
817
  res = MaskHelpers.query_with_mask(query_string, mask, variables: { "manners" => ["STOP", "TRILL"] })
761
818
  # It's not a good error message ... but it's something!
762
819
  expected_errors = [
763
- "Variable manners of type [Manner]! was provided invalid value",
820
+ "Variable manners of type [Manner!]! was provided invalid value",
764
821
  ]
765
822
  assert_equal expected_errors, error_messages(res)
766
823
  end