graphql 1.8.7 → 1.9.0

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.
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