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
@@ -13,127 +13,29 @@ module GraphQL
13
13
  #
14
14
  # The rewritten query tree serves as the basis for the `FieldsWillMerge` validation.
15
15
  #
16
- class Rewrite
16
+ module Rewrite
17
17
  include GraphQL::Language
18
18
 
19
19
  NO_DIRECTIVES = [].freeze
20
20
 
21
21
  # @return InternalRepresentation::Document
22
- attr_reader :document
22
+ attr_reader :rewrite_document
23
23
 
24
- def initialize
25
- @document = InternalRepresentation::Document.new
26
- end
27
-
28
- # @return [Hash<String, Node>] Roots of this query
29
- def operations
30
- warn "#{self.class}#operations is deprecated; use `document.operation_definitions` instead"
31
- document.operation_definitions
32
- end
33
-
34
- def validate(context)
35
- visitor = context.visitor
36
- query = context.query
24
+ def initialize(*)
25
+ super
26
+ @query = context.query
27
+ @rewrite_document = InternalRepresentation::Document.new
37
28
  # Hash<Nodes::FragmentSpread => Set<InternalRepresentation::Node>>
38
29
  # A record of fragment spreads and the irep nodes that used them
39
- spread_parents = Hash.new { |h, k| h[k] = Set.new }
30
+ @rewrite_spread_parents = Hash.new { |h, k| h[k] = Set.new }
40
31
  # Hash<Nodes::FragmentSpread => Scope>
41
- spread_scopes = {}
32
+ @rewrite_spread_scopes = {}
42
33
  # Array<Set<InternalRepresentation::Node>>
43
34
  # The current point of the irep_tree during visitation
44
- nodes_stack = []
35
+ @rewrite_nodes_stack = []
45
36
  # Array<Scope>
46
- scopes_stack = []
47
-
48
- skip_nodes = Set.new
49
-
50
- visit_op = VisitDefinition.new(context, @document.operation_definitions, nodes_stack, scopes_stack)
51
- visitor[Nodes::OperationDefinition].enter << visit_op.method(:enter)
52
- visitor[Nodes::OperationDefinition].leave << visit_op.method(:leave)
53
-
54
- visit_frag = VisitDefinition.new(context, @document.fragment_definitions, nodes_stack, scopes_stack)
55
- visitor[Nodes::FragmentDefinition].enter << visit_frag.method(:enter)
56
- visitor[Nodes::FragmentDefinition].leave << visit_frag.method(:leave)
57
-
58
- visitor[Nodes::InlineFragment].enter << ->(ast_node, ast_parent) {
59
- # Inline fragments provide two things to the rewritten tree:
60
- # - They _may_ narrow the scope by their type condition
61
- # - They _may_ apply their directives to their children
62
- if skip?(ast_node, query)
63
- skip_nodes.add(ast_node)
64
- end
65
-
66
- if skip_nodes.none?
67
- scopes_stack.push(scopes_stack.last.enter(context.type_definition))
68
- end
69
- }
70
-
71
- visitor[Nodes::InlineFragment].leave << ->(ast_node, ast_parent) {
72
- if skip_nodes.none?
73
- scopes_stack.pop
74
- end
75
-
76
- if skip_nodes.include?(ast_node)
77
- skip_nodes.delete(ast_node)
78
- end
79
- }
80
-
81
- visitor[Nodes::Field].enter << ->(ast_node, ast_parent) {
82
- if skip?(ast_node, query)
83
- skip_nodes.add(ast_node)
84
- end
85
-
86
- if skip_nodes.none?
87
- node_name = ast_node.alias || ast_node.name
88
- parent_nodes = nodes_stack.last
89
- next_nodes = []
90
-
91
- field_defn = context.field_definition
92
- if field_defn.nil?
93
- # It's a non-existent field
94
- new_scope = nil
95
- else
96
- field_return_type = field_defn.type
97
- scopes_stack.last.each do |scope_type|
98
- parent_nodes.each do |parent_node|
99
- node = parent_node.scoped_children[scope_type][node_name] ||= Node.new(
100
- parent: parent_node,
101
- name: node_name,
102
- owner_type: scope_type,
103
- query: query,
104
- return_type: field_return_type,
105
- )
106
- node.ast_nodes << ast_node
107
- node.definitions << field_defn
108
- next_nodes << node
109
- end
110
- end
111
- new_scope = Scope.new(query, field_return_type.unwrap)
112
- end
113
-
114
- nodes_stack.push(next_nodes)
115
- scopes_stack.push(new_scope)
116
- end
117
- }
118
-
119
- visitor[Nodes::Field].leave << ->(ast_node, ast_parent) {
120
- if skip_nodes.none?
121
- nodes_stack.pop
122
- scopes_stack.pop
123
- end
124
-
125
- if skip_nodes.include?(ast_node)
126
- skip_nodes.delete(ast_node)
127
- end
128
- }
129
-
130
- visitor[Nodes::FragmentSpread].enter << ->(ast_node, ast_parent) {
131
- if skip_nodes.none? && !skip?(ast_node, query)
132
- # Register the irep nodes that depend on this AST node:
133
- spread_parents[ast_node].merge(nodes_stack.last)
134
- spread_scopes[ast_node] = scopes_stack.last
135
- end
136
- }
37
+ @rewrite_scopes_stack = []
38
+ @rewrite_skip_nodes = Set.new
137
39
 
138
40
  # Resolve fragment spreads.
139
41
  # Fragment definitions got their own irep trees during visitation.
@@ -142,12 +44,12 @@ module GraphQL
142
44
  # can be shared between its usages.
143
45
  context.on_dependency_resolve do |defn_ast_node, spread_ast_nodes, frag_ast_node|
144
46
  frag_name = frag_ast_node.name
145
- fragment_node = @document.fragment_definitions[frag_name]
47
+ fragment_node = @rewrite_document.fragment_definitions[frag_name]
146
48
 
147
49
  if fragment_node
148
50
  spread_ast_nodes.each do |spread_ast_node|
149
- parent_nodes = spread_parents[spread_ast_node]
150
- parent_scope = spread_scopes[spread_ast_node]
51
+ parent_nodes = @rewrite_spread_parents[spread_ast_node]
52
+ parent_scope = @rewrite_spread_scopes[spread_ast_node]
151
53
  parent_nodes.each do |parent_node|
152
54
  parent_node.deep_merge_node(fragment_node, scope: parent_scope, merge_self: false)
153
55
  end
@@ -156,43 +58,126 @@ module GraphQL
156
58
  end
157
59
  end
158
60
 
159
- def skip?(ast_node, query)
160
- dir = ast_node.directives
161
- dir.any? && !GraphQL::Execution::DirectiveChecks.include?(dir, query)
61
+ # @return [Hash<String, Node>] Roots of this query
62
+ def operations
63
+ warn "#{self.class}#operations is deprecated; use `document.operation_definitions` instead"
64
+ @document.operation_definitions
65
+ end
66
+
67
+ def on_operation_definition(ast_node, parent)
68
+ push_root_node(ast_node, @rewrite_document.operation_definitions) { super }
69
+ end
70
+
71
+ def on_fragment_definition(ast_node, parent)
72
+ push_root_node(ast_node, @rewrite_document.fragment_definitions) { super }
73
+ end
74
+
75
+ def push_root_node(ast_node, definitions)
76
+ # Either QueryType or the fragment type condition
77
+ owner_type = context.type_definition
78
+ defn_name = ast_node.name
79
+
80
+ node = Node.new(
81
+ parent: nil,
82
+ name: defn_name,
83
+ owner_type: owner_type,
84
+ query: @query,
85
+ ast_nodes: [ast_node],
86
+ return_type: owner_type,
87
+ )
88
+
89
+ definitions[defn_name] = node
90
+ @rewrite_scopes_stack.push(Scope.new(@query, owner_type))
91
+ @rewrite_nodes_stack.push([node])
92
+ yield
93
+ @rewrite_nodes_stack.pop
94
+ @rewrite_scopes_stack.pop
95
+ end
96
+
97
+ def on_inline_fragment(node, parent)
98
+ # Inline fragments provide two things to the rewritten tree:
99
+ # - They _may_ narrow the scope by their type condition
100
+ # - They _may_ apply their directives to their children
101
+ if skip?(node)
102
+ @rewrite_skip_nodes.add(node)
103
+ end
104
+
105
+ if @rewrite_skip_nodes.empty?
106
+ @rewrite_scopes_stack.push(@rewrite_scopes_stack.last.enter(context.type_definition))
107
+ end
108
+
109
+ super
110
+
111
+ if @rewrite_skip_nodes.empty?
112
+ @rewrite_scopes_stack.pop
113
+ end
114
+
115
+ if @rewrite_skip_nodes.include?(node)
116
+ @rewrite_skip_nodes.delete(node)
117
+ end
162
118
  end
163
119
 
164
- class VisitDefinition
165
- def initialize(context, definitions, nodes_stack, scopes_stack)
166
- @context = context
167
- @query = context.query
168
- @definitions = definitions
169
- @nodes_stack = nodes_stack
170
- @scopes_stack = scopes_stack
120
+ def on_field(ast_node, ast_parent)
121
+ if skip?(ast_node)
122
+ @rewrite_skip_nodes.add(ast_node)
123
+ end
124
+
125
+ if @rewrite_skip_nodes.empty?
126
+ node_name = ast_node.alias || ast_node.name
127
+ parent_nodes = @rewrite_nodes_stack.last
128
+ next_nodes = []
129
+
130
+ field_defn = context.field_definition
131
+ if field_defn.nil?
132
+ # It's a non-existent field
133
+ new_scope = nil
134
+ else
135
+ field_return_type = field_defn.type
136
+ @rewrite_scopes_stack.last.each do |scope_type|
137
+ parent_nodes.each do |parent_node|
138
+ node = parent_node.scoped_children[scope_type][node_name] ||= Node.new(
139
+ parent: parent_node,
140
+ name: node_name,
141
+ owner_type: scope_type,
142
+ query: @query,
143
+ return_type: field_return_type,
144
+ )
145
+ node.ast_nodes << ast_node
146
+ node.definitions << field_defn
147
+ next_nodes << node
148
+ end
149
+ end
150
+ new_scope = Scope.new(@query, field_return_type.unwrap)
151
+ end
152
+
153
+ @rewrite_nodes_stack.push(next_nodes)
154
+ @rewrite_scopes_stack.push(new_scope)
155
+ end
156
+
157
+ super
158
+
159
+ if @rewrite_skip_nodes.empty?
160
+ @rewrite_nodes_stack.pop
161
+ @rewrite_scopes_stack.pop
171
162
  end
172
163
 
173
- def enter(ast_node, ast_parent)
174
- # Either QueryType or the fragment type condition
175
- owner_type = @context.type_definition && @context.type_definition.unwrap
176
- defn_name = ast_node.name
177
-
178
- node = Node.new(
179
- parent: nil,
180
- name: defn_name,
181
- owner_type: owner_type,
182
- query: @query,
183
- ast_nodes: [ast_node],
184
- return_type: @context.type_definition,
185
- )
186
-
187
- @definitions[defn_name] = node
188
- @scopes_stack.push(Scope.new(@query, owner_type))
189
- @nodes_stack.push([node])
164
+ if @rewrite_skip_nodes.include?(ast_node)
165
+ @rewrite_skip_nodes.delete(ast_node)
190
166
  end
167
+ end
191
168
 
192
- def leave(ast_node, ast_parent)
193
- @nodes_stack.pop
194
- @scopes_stack.pop
169
+ def on_fragment_spread(ast_node, ast_parent)
170
+ if @rewrite_skip_nodes.empty? && !skip?(ast_node)
171
+ # Register the irep nodes that depend on this AST node:
172
+ @rewrite_spread_parents[ast_node].merge(@rewrite_nodes_stack.last)
173
+ @rewrite_spread_scopes[ast_node] = @rewrite_scopes_stack.last
195
174
  end
175
+ super
176
+ end
177
+
178
+ def skip?(ast_node)
179
+ dir = ast_node.directives
180
+ dir.any? && !GraphQL::Execution::DirectiveChecks.include?(dir, @query)
196
181
  end
197
182
  end
198
183
  end
@@ -3,8 +3,14 @@ module GraphQL
3
3
  module Introspection
4
4
  class DynamicFields < Introspection::BaseObject
5
5
  field :__typename, String, "The name of this type", null: false, extras: [:irep_node]
6
- def __typename(irep_node:)
7
- irep_node.owner_type.name
6
+
7
+ # `irep_node:` will be nil for the interpreter, since there is no such thing
8
+ def __typename(irep_node: nil)
9
+ if context.interpreter?
10
+ object.class.graphql_name
11
+ else
12
+ irep_node.owner_type.name
13
+ end
8
14
  end
9
15
  end
10
16
  end
@@ -15,14 +15,19 @@ module GraphQL
15
15
  end
16
16
 
17
17
  def __type(name:)
18
- type = @context.warden.get_type(name)
19
- if type
18
+ type = context.warden.get_type(name)
19
+
20
+ if type && context.interpreter?
21
+ type = type.metadata[:type_class] || raise("Invariant: interpreter requires class-based type for #{name}")
22
+ end
23
+
24
+ # The interpreter provides this wrapping, other execution doesnt, so support both.
25
+ if type && !context.interpreter?
20
26
  # Apply wrapping manually since this field isn't wrapped by instrumentation
21
- type_type = @context.schema.introspection_system.type_type
22
- type_type.metadata[:type_class].authorized_new(type, @context)
23
- else
24
- nil
27
+ type_type = context.schema.introspection_system.type_type
28
+ type = type_type.metadata[:type_class].authorized_new(type, context)
25
29
  end
30
+ type
26
31
  end
27
32
  end
28
33
  end
@@ -11,6 +11,10 @@ module GraphQL
11
11
  field :is_deprecated, Boolean, null: false
12
12
  field :deprecation_reason, String, null: true
13
13
 
14
+ def name
15
+ object.graphql_name
16
+ end
17
+
14
18
  def is_deprecated
15
19
  !!@object.deprecation_reason
16
20
  end
@@ -14,7 +14,12 @@ module GraphQL
14
14
  field :directives, [GraphQL::Schema::LateBoundType.new("__Directive")], "A list of all directives supported by this server.", null: false
15
15
 
16
16
  def types
17
- @context.warden.types
17
+ types = @context.warden.types
18
+ if context.interpreter?
19
+ types.map { |t| t.metadata[:type_class] || raise("Invariant: can't introspect non-class-based type: #{t}") }
20
+ else
21
+ types
22
+ end
18
23
  end
19
24
 
20
25
  def query_type
@@ -30,7 +35,7 @@ module GraphQL
30
35
  end
31
36
 
32
37
  def directives
33
- @object.directives.values
38
+ context.schema.directives.values
34
39
  end
35
40
 
36
41
  private
@@ -25,6 +25,10 @@ module GraphQL
25
25
  field :input_fields, [GraphQL::Schema::LateBoundType.new("__InputValue")], null: true
26
26
  field :of_type, GraphQL::Schema::LateBoundType.new("__Type"), null: true
27
27
 
28
+ def name
29
+ object.graphql_name
30
+ end
31
+
28
32
  def kind
29
33
  @object.kind.name
30
34
  end
@@ -33,7 +37,7 @@ module GraphQL
33
37
  if !@object.kind.enum?
34
38
  nil
35
39
  else
36
- enum_values = @context.warden.enum_values(@object)
40
+ enum_values = @context.warden.enum_values(@object.graphql_definition)
37
41
 
38
42
  if !include_deprecated
39
43
  enum_values = enum_values.select {|f| !f.deprecation_reason }
@@ -45,7 +49,7 @@ module GraphQL
45
49
 
46
50
  def interfaces
47
51
  if @object.kind == GraphQL::TypeKinds::OBJECT
48
- @context.warden.interfaces(@object)
52
+ @context.warden.interfaces(@object.graphql_definition)
49
53
  else
50
54
  nil
51
55
  end
@@ -53,7 +57,7 @@ module GraphQL
53
57
 
54
58
  def input_fields
55
59
  if @object.kind.input_object?
56
- @context.warden.arguments(@object)
60
+ @context.warden.arguments(@object.graphql_definition)
57
61
  else
58
62
  nil
59
63
  end
@@ -61,7 +65,7 @@ module GraphQL
61
65
 
62
66
  def possible_types
63
67
  if @object.kind.abstract?
64
- @context.warden.possible_types(@object)
68
+ @context.warden.possible_types(@object.graphql_definition)
65
69
  else
66
70
  nil
67
71
  end
@@ -71,7 +75,7 @@ module GraphQL
71
75
  if !@object.kind.fields?
72
76
  nil
73
77
  else
74
- fields = @context.warden.fields(@object)
78
+ fields = @context.warden.fields(@object.graphql_definition)
75
79
  if !include_deprecated
76
80
  fields = fields.select {|f| !f.deprecation_reason }
77
81
  end
@@ -16,7 +16,7 @@ module GraphQL
16
16
  @parent_type = parent_type
17
17
  @field = field
18
18
  @value = value
19
- super("Cannot return null for non-nullable field #{@parent_type.name}.#{@field.name}")
19
+ super("Cannot return null for non-nullable field #{@parent_type.graphql_name}.#{@field.graphql_name}")
20
20
  end
21
21
 
22
22
  # @return [Hash] An entry for the response's "errors" key
@@ -42,6 +42,43 @@ module GraphQL
42
42
  # Rebuild the string
43
43
  lines.join("\n")
44
44
  end
45
+
46
+ def self.print(str, indent: '')
47
+ lines = str.split("\n")
48
+
49
+ block_str = "#{indent}\"\"\"\n".dup
50
+
51
+ lines.each do |line|
52
+ if line == ''
53
+ block_str << "\n"
54
+ else
55
+ sublines = break_line(line, 120 - indent.length)
56
+ sublines.each do |subline|
57
+ block_str << "#{indent}#{subline}\n"
58
+ end
59
+ end
60
+ end
61
+
62
+ block_str << "#{indent}\"\"\"\n".dup
63
+ end
64
+
65
+ private
66
+
67
+ def self.break_line(line, length)
68
+ return [line] if line.length < length + 5
69
+
70
+ parts = line.split(Regexp.new("((?: |^).{15,#{length - 40}}(?= |$))"))
71
+ return [line] if parts.length < 4
72
+
73
+ sublines = [parts.slice!(0, 3).join]
74
+
75
+ parts.each_with_index do |part, i|
76
+ next if i % 2 == 1
77
+ sublines << "#{part[1..-1]}#{parts[i + 1]}"
78
+ end
79
+
80
+ sublines
81
+ end
45
82
  end
46
83
  end
47
84
  end
@@ -11,7 +11,7 @@ module GraphQL
11
11
  # @param except [<#call(member, ctx)>]
12
12
  # @param include_introspection_types [Boolean] Whether or not to include introspection types in the AST
13
13
  # @param include_built_in_scalars [Boolean] Whether or not to include built in scalars in the AST
14
- # @param include_built_in_directives [Boolean] Whether or not to include built in diirectives in the AST
14
+ # @param include_built_in_directives [Boolean] Whether or not to include built in directives in the AST
15
15
  class DocumentFromSchemaDefinition
16
16
  def initialize(
17
17
  schema, context: nil, only: nil, except: nil, include_introspection_types: false,
@@ -65,7 +65,7 @@ module GraphQL
65
65
  )
66
66
 
67
67
  if field.deprecation_reason
68
- field_node.directives << GraphQL::Language::Nodes::Directive.new(
68
+ field_node = field_node.merge_directive(
69
69
  name: GraphQL::Directive::DeprecatedDirective.name,
70
70
  arguments: [GraphQL::Language::Nodes::Argument.new(name: "reason", value: field.deprecation_reason)]
71
71
  )
@@ -107,7 +107,7 @@ module GraphQL
107
107
  )
108
108
 
109
109
  if enum_value.deprecation_reason
110
- enum_value_node.directives << GraphQL::Language::Nodes::Directive.new(
110
+ enum_value_node = enum_value_node.merge_directive(
111
111
  name: GraphQL::Directive::DeprecatedDirective.name,
112
112
  arguments: [GraphQL::Language::Nodes::Argument.new(name: "reason", value: enum_value.deprecation_reason)]
113
113
  )
@@ -124,16 +124,19 @@ module GraphQL
124
124
  end
125
125
 
126
126
  def build_argument_node(argument)
127
+ if argument.default_value?
128
+ default_value = build_default_value(argument.default_value, argument.type)
129
+ else
130
+ default_value = nil
131
+ end
132
+
127
133
  argument_node = GraphQL::Language::Nodes::InputValueDefinition.new(
128
134
  name: argument.name,
129
135
  description: argument.description,
130
136
  type: build_type_name_node(argument.type),
137
+ default_value: default_value,
131
138
  )
132
139
 
133
- if argument.default_value?
134
- argument_node.default_value = build_default_value(argument.default_value, argument.type)
135
- end
136
-
137
140
  argument_node
138
141
  end
139
142