graphql 1.7.6 → 1.8.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 (289) hide show
  1. checksums.yaml +4 -4
  2. data/lib/generators/graphql/function_generator.rb +1 -1
  3. data/lib/generators/graphql/install_generator.rb +14 -8
  4. data/lib/generators/graphql/loader_generator.rb +1 -1
  5. data/lib/generators/graphql/mutation_generator.rb +6 -1
  6. data/lib/generators/graphql/templates/function.erb +2 -2
  7. data/lib/generators/graphql/templates/loader.erb +2 -2
  8. data/lib/generators/graphql/templates/schema.erb +1 -1
  9. data/lib/graphql/argument.rb +25 -19
  10. data/lib/graphql/backtrace/tracer.rb +16 -22
  11. data/lib/graphql/backtrace.rb +1 -1
  12. data/lib/graphql/backwards_compatibility.rb +2 -3
  13. data/lib/graphql/base_type.rb +31 -31
  14. data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +14 -0
  15. data/lib/graphql/compatibility/query_parser_specification.rb +117 -0
  16. data/lib/graphql/define/assign_object_field.rb +5 -12
  17. data/lib/graphql/deprecated_dsl.rb +42 -0
  18. data/lib/graphql/directive.rb +1 -0
  19. data/lib/graphql/enum_type.rb +3 -1
  20. data/lib/graphql/execution/execute.rb +21 -13
  21. data/lib/graphql/execution/instrumentation.rb +82 -0
  22. data/lib/graphql/execution/lazy/lazy_method_map.rb +1 -1
  23. data/lib/graphql/execution/lazy/resolve.rb +1 -3
  24. data/lib/graphql/execution/multiplex.rb +12 -29
  25. data/lib/graphql/execution.rb +1 -0
  26. data/lib/graphql/field.rb +21 -4
  27. data/lib/graphql/function.rb +14 -0
  28. data/lib/graphql/input_object_type.rb +3 -1
  29. data/lib/graphql/interface_type.rb +5 -3
  30. data/lib/graphql/internal_representation/node.rb +26 -14
  31. data/lib/graphql/internal_representation/visit.rb +3 -6
  32. data/lib/graphql/introspection/base_object.rb +16 -0
  33. data/lib/graphql/introspection/directive_location_enum.rb +11 -7
  34. data/lib/graphql/introspection/directive_type.rb +23 -16
  35. data/lib/graphql/introspection/dynamic_fields.rb +11 -0
  36. data/lib/graphql/introspection/entry_points.rb +29 -0
  37. data/lib/graphql/introspection/enum_value_type.rb +16 -11
  38. data/lib/graphql/introspection/field_type.rb +21 -12
  39. data/lib/graphql/introspection/input_value_type.rb +26 -23
  40. data/lib/graphql/introspection/schema_field.rb +7 -2
  41. data/lib/graphql/introspection/schema_type.rb +36 -22
  42. data/lib/graphql/introspection/type_by_name_field.rb +10 -2
  43. data/lib/graphql/introspection/type_kind_enum.rb +10 -6
  44. data/lib/graphql/introspection/type_type.rb +85 -23
  45. data/lib/graphql/introspection/typename_field.rb +1 -0
  46. data/lib/graphql/introspection.rb +3 -10
  47. data/lib/graphql/language/block_string.rb +47 -0
  48. data/lib/graphql/language/document_from_schema_definition.rb +280 -0
  49. data/lib/graphql/language/generation.rb +3 -182
  50. data/lib/graphql/language/lexer.rb +144 -69
  51. data/lib/graphql/language/lexer.rl +15 -4
  52. data/lib/graphql/language/nodes.rb +141 -78
  53. data/lib/graphql/language/parser.rb +677 -630
  54. data/lib/graphql/language/parser.y +18 -12
  55. data/lib/graphql/language/printer.rb +361 -0
  56. data/lib/graphql/language/token.rb +10 -3
  57. data/lib/graphql/language.rb +3 -0
  58. data/lib/graphql/non_null_type.rb +1 -1
  59. data/lib/graphql/object_type.rb +1 -6
  60. data/lib/graphql/query/arguments.rb +63 -32
  61. data/lib/graphql/query/context.rb +32 -2
  62. data/lib/graphql/query/literal_input.rb +4 -1
  63. data/lib/graphql/query/null_context.rb +1 -1
  64. data/lib/graphql/query/result.rb +1 -1
  65. data/lib/graphql/query/variables.rb +21 -3
  66. data/lib/graphql/query.rb +19 -6
  67. data/lib/graphql/railtie.rb +109 -0
  68. data/lib/graphql/relay/connection_resolve.rb +3 -0
  69. data/lib/graphql/relay/connection_type.rb +5 -3
  70. data/lib/graphql/relay/edge_type.rb +2 -1
  71. data/lib/graphql/relay/global_id_resolve.rb +5 -1
  72. data/lib/graphql/relay/mongo_relation_connection.rb +40 -0
  73. data/lib/graphql/relay/mutation/instrumentation.rb +1 -1
  74. data/lib/graphql/relay/mutation/resolve.rb +5 -1
  75. data/lib/graphql/relay/relation_connection.rb +14 -19
  76. data/lib/graphql/relay/type_extensions.rb +30 -0
  77. data/lib/graphql/relay.rb +2 -0
  78. data/lib/graphql/scalar_type.rb +14 -2
  79. data/lib/graphql/schema/argument.rb +92 -0
  80. data/lib/graphql/schema/build_from_definition.rb +64 -18
  81. data/lib/graphql/schema/enum.rb +85 -0
  82. data/lib/graphql/schema/enum_value.rb +74 -0
  83. data/lib/graphql/schema/field.rb +372 -0
  84. data/lib/graphql/schema/finder.rb +153 -0
  85. data/lib/graphql/schema/input_object.rb +87 -0
  86. data/lib/graphql/schema/interface.rb +105 -0
  87. data/lib/graphql/schema/introspection_system.rb +93 -0
  88. data/lib/graphql/schema/late_bound_type.rb +32 -0
  89. data/lib/graphql/schema/list.rb +32 -0
  90. data/lib/graphql/schema/loader.rb +2 -2
  91. data/lib/graphql/schema/member/accepts_definition.rb +152 -0
  92. data/lib/graphql/schema/member/base_dsl_methods.rb +100 -0
  93. data/lib/graphql/schema/member/build_type.rb +137 -0
  94. data/lib/graphql/schema/member/cached_graphql_definition.rb +26 -0
  95. data/lib/graphql/schema/member/graphql_type_names.rb +21 -0
  96. data/lib/graphql/schema/member/has_arguments.rb +50 -0
  97. data/lib/graphql/schema/member/has_fields.rb +130 -0
  98. data/lib/graphql/schema/member/instrumentation.rb +115 -0
  99. data/lib/graphql/schema/member/type_system_helpers.rb +34 -0
  100. data/lib/graphql/schema/member.rb +28 -0
  101. data/lib/graphql/schema/middleware_chain.rb +5 -1
  102. data/lib/graphql/schema/mutation.rb +138 -0
  103. data/lib/graphql/schema/non_null.rb +38 -0
  104. data/lib/graphql/schema/object.rb +81 -0
  105. data/lib/graphql/schema/printer.rb +33 -266
  106. data/lib/graphql/schema/relay_classic_mutation.rb +87 -0
  107. data/lib/graphql/schema/rescue_middleware.rb +8 -7
  108. data/lib/graphql/schema/resolver.rb +122 -0
  109. data/lib/graphql/schema/scalar.rb +35 -0
  110. data/lib/graphql/schema/traversal.rb +102 -22
  111. data/lib/graphql/schema/union.rb +36 -0
  112. data/lib/graphql/schema/validation.rb +3 -2
  113. data/lib/graphql/schema.rb +381 -12
  114. data/lib/graphql/static_validation/definition_dependencies.rb +1 -1
  115. data/lib/graphql/static_validation/literal_validator.rb +16 -4
  116. data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +6 -6
  117. data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +5 -1
  118. data/lib/graphql/static_validation/rules/fields_will_merge.rb +15 -8
  119. data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +11 -1
  120. data/lib/graphql/static_validation/validation_context.rb +1 -1
  121. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +7 -5
  122. data/lib/graphql/subscriptions/instrumentation.rb +5 -1
  123. data/lib/graphql/subscriptions/serialize.rb +2 -0
  124. data/lib/graphql/subscriptions.rb +90 -16
  125. data/lib/graphql/tracing/data_dog_tracing.rb +49 -0
  126. data/lib/graphql/tracing/new_relic_tracing.rb +26 -0
  127. data/lib/graphql/tracing/platform_tracing.rb +20 -7
  128. data/lib/graphql/tracing/scout_tracing.rb +2 -2
  129. data/lib/graphql/tracing.rb +1 -0
  130. data/lib/graphql/unresolved_type_error.rb +3 -2
  131. data/lib/graphql/upgrader/member.rb +894 -0
  132. data/lib/graphql/upgrader/schema.rb +37 -0
  133. data/lib/graphql/version.rb +1 -1
  134. data/lib/graphql.rb +5 -25
  135. data/readme.md +2 -2
  136. data/spec/dummy/app/channels/graphql_channel.rb +23 -2
  137. data/spec/dummy/log/development.log +239 -0
  138. data/spec/dummy/log/test.log +410 -0
  139. data/spec/dummy/test/system/action_cable_subscription_test.rb +4 -0
  140. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/-x/-xYZjAnuuzgR79fcznLTQtSdh6AARxu8FcQ_J6p7L3U.cache +0 -0
  141. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/13/13HiV12xyoQvT-1L39ZzLwMZxjyaGMiENmfw7f-QTIc.cache +0 -0
  142. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/3W/3Wtf5pCWdqq0AB-iB0Y9uUNrTkruRxIEf1XFn_BETU0.cache +1 -0
  143. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/5i/5iguGafb4hOn8262Kn8Q37ogNN9MxxQKGKNzHAzUcvI.cache +1 -0
  144. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/8m/8mj2T6yy847Mc2Z7k3Xzh8O91hhVJt3NrPe8ASNDlIA.cache +1 -0
  145. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/DT/DTQyMpr4ABZYQetsdRJ5A7S4jf1r3ie4FGOR7GZBNSs.cache +3 -0
  146. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Dq/DqJ5_yJPrP5iLlOQyTQsjAVI5FE5LCVDkED0f7GgsSo.cache +3 -0
  147. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/F8/F8MUNRzORGFgr329fNM0xLaoWCXdv3BIalT7dsvLfjs.cache +0 -0
  148. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/KB/KB07ZaKNC5uXJ7TjLi-WqnY6g7dq8wWp_8N3HNjBNxg.cache +0 -0
  149. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Rw/RwDuCV-XpnCtjNkvhpJfBuxXMk0b5AD3L9eR6M-wcy0.cache +3 -0
  150. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/UL/ULdjhhb0bRuqmaG7XSZlFYzGYCXTDnqZuJBTWRlzqgw.cache +0 -0
  151. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Up/UpPNgh0yYoUsyMDh5zWqe_U6qJIyTC6-dxMMAs1vvlM.cache +1 -0
  152. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/Wg/Wguh-szFGTI1gaL6npYwPekMXflugRei7F_mOyRucXg.cache +0 -0
  153. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/X-/X-khLYMA9mqFRPg3zAi86mREDxpKl4bdKYp3uF6WHos.cache +0 -0
  154. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/bi/BIkdhfxsezxM4q-HZ4oCNTq97WEJTigcq0tpX2cDvbY.cache +0 -0
  155. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/ff/FfxmA4CMHQZT7exx0G7NS1Wpcnny0vzp-Jhc2H36bp8.cache +1 -0
  156. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/gE/gEiiG4GZNy_djEjK2pHm_NgA-gyhLZhdQvo0Yt96GqE.cache +0 -0
  157. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/gn/gnA9ZSqpjccNL2m8pe_jBvY6SinXlCzXDWyop83Od8s.cache +1 -0
  158. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/lO/lOAan3cMwCE_Hli6gsDML88xFNfn0nxPmvrSkW7eEOw.cache +1 -0
  159. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/m1/M1pv8MJEPLXGLvS8QxVh3DSO9cI4mRt5FHFWdrvUj6o.cache +2 -0
  160. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/m7/m77qH7ZqH0_0SmwJbiKGDd-aLau1Dav847DC6ge46zY.cache +1 -0
  161. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/sj/sjRjnjRB37lH2vrgtkdJ8Cz84__IJ978IuKTM7HcztI.cache +0 -0
  162. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/um/um1JrirR4hJhK-1rE-HywlyCi5ibgxHVrReiujZBWJM.cache +1 -0
  163. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/v4/v4fwVytD7ITcE0_GDbslZEYud8a5Okm85fV1o7SDl6g.cache +0 -0
  164. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/v_/v_0PAQt0iipQjFP5zjgkkk9Stnpf4VzvnMv67d1Keuw.cache +1 -0
  165. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/wd/wdT9U4MKxe1PyqNjVuCKMpCl3dxGCIRJIlwUTfh2DQU.cache +1 -0
  166. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/xI/xIaxut_fEIhKBDqljTNwYaADK9kj3gG0ESrfHs-5_og.cache +3 -0
  167. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/y0/y0SJOqIx2fn1SKqOkAihsQow0trRJrSIyAswufVuoA8.cache +0 -0
  168. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/zg/zgpzeaX-KZErHyGJ1aBH3ZusweNXMneVZule88XsIJI.cache +1 -0
  169. data/spec/dummy/tmp/cache/assets/sprockets/v3.0/zy/zYFltDy-8VC-uKq2BVEiJJyYXNFvVzAKuMlR3ZIYZsk.cache +0 -0
  170. data/spec/dummy/tmp/screenshots/failures_test_it_handles_subscriptions.png +0 -0
  171. data/spec/fixtures/upgrader/account.original.rb +19 -0
  172. data/spec/fixtures/upgrader/account.transformed.rb +20 -0
  173. data/spec/fixtures/upgrader/blame_range.original.rb +43 -0
  174. data/spec/fixtures/upgrader/blame_range.transformed.rb +30 -0
  175. data/spec/fixtures/upgrader/date_time.original.rb +24 -0
  176. data/spec/fixtures/upgrader/date_time.transformed.rb +23 -0
  177. data/spec/fixtures/upgrader/delete_project.original.rb +28 -0
  178. data/spec/fixtures/upgrader/delete_project.transformed.rb +27 -0
  179. data/spec/fixtures/upgrader/gist_order_field.original.rb +14 -0
  180. data/spec/fixtures/upgrader/gist_order_field.transformed.rb +13 -0
  181. data/spec/fixtures/upgrader/increment_count.original.rb +59 -0
  182. data/spec/fixtures/upgrader/increment_count.transformed.rb +50 -0
  183. data/spec/fixtures/upgrader/photo.original.rb +10 -0
  184. data/spec/fixtures/upgrader/photo.transformed.rb +12 -0
  185. data/spec/fixtures/upgrader/release_order.original.rb +15 -0
  186. data/spec/fixtures/upgrader/release_order.transformed.rb +14 -0
  187. data/spec/fixtures/upgrader/starrable.original.rb +49 -0
  188. data/spec/fixtures/upgrader/starrable.transformed.rb +46 -0
  189. data/spec/fixtures/upgrader/subscribable.original.rb +55 -0
  190. data/spec/fixtures/upgrader/subscribable.transformed.rb +51 -0
  191. data/spec/fixtures/upgrader/type_x.original.rb +65 -0
  192. data/spec/fixtures/upgrader/type_x.transformed.rb +56 -0
  193. data/spec/generators/graphql/function_generator_spec.rb +26 -0
  194. data/spec/generators/graphql/install_generator_spec.rb +1 -1
  195. data/spec/generators/graphql/loader_generator_spec.rb +24 -0
  196. data/spec/graphql/analysis/max_query_complexity_spec.rb +3 -3
  197. data/spec/graphql/analysis/max_query_depth_spec.rb +3 -3
  198. data/spec/graphql/argument_spec.rb +21 -0
  199. data/spec/graphql/backtrace_spec.rb +10 -0
  200. data/spec/graphql/base_type_spec.rb +42 -0
  201. data/spec/graphql/boolean_type_spec.rb +3 -3
  202. data/spec/graphql/directive_spec.rb +3 -1
  203. data/spec/graphql/enum_type_spec.rb +18 -5
  204. data/spec/graphql/execution/execute_spec.rb +4 -4
  205. data/spec/graphql/execution/instrumentation_spec.rb +165 -0
  206. data/spec/graphql/execution/multiplex_spec.rb +2 -2
  207. data/spec/graphql/execution_error_spec.rb +18 -0
  208. data/spec/graphql/float_type_spec.rb +2 -2
  209. data/spec/graphql/id_type_spec.rb +1 -1
  210. data/spec/graphql/input_object_type_spec.rb +15 -2
  211. data/spec/graphql/int_type_spec.rb +2 -2
  212. data/spec/graphql/interface_type_spec.rb +12 -0
  213. data/spec/graphql/internal_representation/rewrite_spec.rb +2 -2
  214. data/spec/graphql/introspection/schema_type_spec.rb +2 -0
  215. data/spec/graphql/language/block_string_spec.rb +70 -0
  216. data/spec/graphql/language/document_from_schema_definition_spec.rb +770 -0
  217. data/spec/graphql/language/generation_spec.rb +21 -186
  218. data/spec/graphql/language/lexer_spec.rb +21 -1
  219. data/spec/graphql/language/nodes_spec.rb +21 -12
  220. data/spec/graphql/language/parser_spec.rb +1 -1
  221. data/spec/graphql/language/printer_spec.rb +203 -0
  222. data/spec/graphql/object_type_spec.rb +22 -0
  223. data/spec/graphql/query/arguments_spec.rb +25 -15
  224. data/spec/graphql/query/context_spec.rb +18 -0
  225. data/spec/graphql/query/executor_spec.rb +2 -1
  226. data/spec/graphql/query/serial_execution/value_resolution_spec.rb +2 -8
  227. data/spec/graphql/query/variables_spec.rb +42 -1
  228. data/spec/graphql/query_spec.rb +31 -5
  229. data/spec/graphql/rake_task_spec.rb +3 -1
  230. data/spec/graphql/relay/base_connection_spec.rb +1 -1
  231. data/spec/graphql/relay/connection_instrumentation_spec.rb +2 -2
  232. data/spec/graphql/relay/connection_resolve_spec.rb +1 -1
  233. data/spec/graphql/relay/connection_type_spec.rb +1 -1
  234. data/spec/graphql/relay/mongo_relation_connection_spec.rb +474 -0
  235. data/spec/graphql/relay/mutation_spec.rb +9 -7
  236. data/spec/graphql/relay/range_add_spec.rb +5 -1
  237. data/spec/graphql/relay/relation_connection_spec.rb +65 -1
  238. data/spec/graphql/schema/argument_spec.rb +87 -0
  239. data/spec/graphql/schema/build_from_definition_spec.rb +89 -5
  240. data/spec/graphql/schema/enum_spec.rb +74 -0
  241. data/spec/graphql/schema/field_spec.rb +225 -0
  242. data/spec/graphql/schema/finder_spec.rb +135 -0
  243. data/spec/graphql/schema/input_object_spec.rb +111 -0
  244. data/spec/graphql/schema/instrumentation_spec.rb +40 -0
  245. data/spec/graphql/schema/interface_spec.rb +185 -0
  246. data/spec/graphql/schema/introspection_system_spec.rb +39 -0
  247. data/spec/graphql/schema/member/accepts_definition_spec.rb +111 -0
  248. data/spec/graphql/schema/member/build_type_spec.rb +17 -0
  249. data/spec/graphql/schema/member/has_fields_spec.rb +129 -0
  250. data/spec/graphql/schema/member/type_system_helpers_spec.rb +63 -0
  251. data/spec/graphql/schema/mutation_spec.rb +148 -0
  252. data/spec/graphql/schema/object_spec.rb +175 -0
  253. data/spec/graphql/schema/printer_spec.rb +111 -15
  254. data/spec/graphql/schema/relay_classic_mutation_spec.rb +38 -0
  255. data/spec/graphql/schema/rescue_middleware_spec.rb +11 -0
  256. data/spec/graphql/schema/resolver_spec.rb +131 -0
  257. data/spec/graphql/schema/scalar_spec.rb +95 -0
  258. data/spec/graphql/schema/traversal_spec.rb +31 -0
  259. data/spec/graphql/schema/union_spec.rb +65 -0
  260. data/spec/graphql/schema/validation_spec.rb +1 -1
  261. data/spec/graphql/schema/warden_spec.rb +11 -11
  262. data/spec/graphql/schema_spec.rb +55 -12
  263. data/spec/graphql/static_validation/rules/fields_have_appropriate_selections_spec.rb +10 -2
  264. data/spec/graphql/static_validation/rules/fields_will_merge_spec.rb +2 -2
  265. data/spec/graphql/string_type_spec.rb +3 -3
  266. data/spec/graphql/subscriptions_spec.rb +273 -184
  267. data/spec/graphql/tracing/active_support_notifications_tracing_spec.rb +1 -1
  268. data/spec/graphql/tracing/new_relic_tracing_spec.rb +47 -0
  269. data/spec/graphql/tracing/platform_tracing_spec.rb +60 -1
  270. data/spec/graphql/union_type_spec.rb +1 -1
  271. data/spec/graphql/upgrader/member_spec.rb +516 -0
  272. data/spec/graphql/upgrader/schema_spec.rb +82 -0
  273. data/spec/spec_helper.rb +8 -0
  274. data/spec/support/dummy/schema.rb +53 -24
  275. data/spec/support/jazz.rb +544 -0
  276. data/spec/support/lazy_helpers.rb +21 -23
  277. data/spec/support/new_relic.rb +24 -0
  278. data/spec/support/star_trek/data.rb +109 -0
  279. data/spec/support/star_trek/schema.rb +388 -0
  280. data/spec/support/star_wars/data.rb +6 -7
  281. data/spec/support/star_wars/schema.rb +127 -171
  282. metadata +233 -11
  283. data/lib/graphql/introspection/arguments_field.rb +0 -7
  284. data/lib/graphql/introspection/enum_values_field.rb +0 -18
  285. data/lib/graphql/introspection/fields_field.rb +0 -13
  286. data/lib/graphql/introspection/input_fields_field.rb +0 -12
  287. data/lib/graphql/introspection/interfaces_field.rb +0 -11
  288. data/lib/graphql/introspection/of_type_field.rb +0 -6
  289. data/lib/graphql/introspection/possible_types_field.rb +0 -11
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4ee2881b8335c9299d2dd2b707810856bb34d956
4
- data.tar.gz: d23544e543addd64583dbcf82280fc92454a515c
3
+ metadata.gz: f5283bf51e22ac60f8d9368d9cc19b8c6d038d8b
4
+ data.tar.gz: 147ec429661a6fbc1aaef685ba94c8a81d87910e
5
5
  SHA512:
6
- metadata.gz: db14299e06ef27b4f177980705c4f70d6b1d2a6defef6efad0a0b15db493ee1501c820c6fd298a60bc5ffdaf817d50abe4e7c2c145278da5e1ac46866e0a3648
7
- data.tar.gz: 4776fe2f611c0cb93778fbf6101dfb81a3f08244bce650dccfbc2c999886ac0aac3d26f06533c6722c2e6aceab371ef9aa419f8d9b192301f2674519d5f66848
6
+ metadata.gz: 06a2a8730fc1c13dc0a0d76a35b19e89dd40ad842e41618abb1b05a7f75b667eede56c106728e3e68bd531e36e29b28050b991319599b7952ac3285fb3f9be3c
7
+ data.tar.gz: 8231c7696681477decf92b0665f3e4249b308153338c8d7cf5102b7e95133b9ac7aa6156f3dddc026c4178ea9fcb25d7f181f752298d5cf38185141af653a471
@@ -11,7 +11,7 @@ module Graphql
11
11
  source_root File.expand_path('../templates', __FILE__)
12
12
 
13
13
  def create_function_file
14
- template "function.erb", "#{options[:directory]}/functions/#{file_name}.rb"
14
+ template "function.erb", "#{options[:directory]}/functions/#{file_path}.rb"
15
15
  end
16
16
  end
17
17
  end
@@ -81,13 +81,6 @@ module Graphql
81
81
  type: :boolean,
82
82
  desc: "Preconfigure smaller stack for API only apps"
83
83
 
84
-
85
- GRAPHIQL_ROUTE = <<-RUBY
86
- if Rails.env.development?
87
- mount GraphiQL::Rails::Engine, at: "/graphiql", graphql_path: "/graphql"
88
- end
89
- RUBY
90
-
91
84
  def create_folder_structure
92
85
  create_dir("#{options[:directory]}/types")
93
86
  template("schema.erb", schema_file_path)
@@ -115,7 +108,20 @@ RUBY
115
108
  # This is a little cheat just to get cleaner shell output:
116
109
  log :route, 'graphiql-rails'
117
110
  shell.mute do
118
- route(GRAPHIQL_ROUTE)
111
+ # Rails 5.2 has better support for `route`?
112
+ if Rails::VERSION::STRING > "5.2"
113
+ route <<-RUBY
114
+ if Rails.env.development?
115
+ mount GraphiQL::Rails::Engine, at: "/graphiql", graphql_path: "/graphql"
116
+ end
117
+ RUBY
118
+ else
119
+ route <<-RUBY
120
+ if Rails.env.development?
121
+ mount GraphiQL::Rails::Engine, at: "/graphiql", graphql_path: "/graphql"
122
+ end
123
+ RUBY
124
+ end
119
125
  end
120
126
  end
121
127
 
@@ -13,7 +13,7 @@ module Graphql
13
13
  source_root File.expand_path('../templates', __FILE__)
14
14
 
15
15
  def create_loader_file
16
- template "loader.erb", "#{options[:directory]}/loaders/#{file_name}.rb"
16
+ template "loader.erb", "#{options[:directory]}/loaders/#{file_path}.rb"
17
17
  end
18
18
  end
19
19
  end
@@ -27,7 +27,12 @@ module Graphql
27
27
  attr_reader :file_name, :mutation_name, :field_name
28
28
 
29
29
  def create_mutation_file
30
- create_mutation_root_type
30
+ unless @behavior == :revoke
31
+ create_mutation_root_type
32
+ else
33
+ log :gsub, "#{options[:directory]}/types/mutation_type.rb"
34
+ end
35
+
31
36
  template "mutation.erb", "#{options[:directory]}/mutations/#{file_name}.rb"
32
37
 
33
38
  sentinel = /name "Mutation"\s*\n/m
@@ -1,7 +1,7 @@
1
- class Functions::<%= name %> < GraphQL::Function
1
+ class Functions::<%= class_name %> < GraphQL::Function
2
2
  # Define `initialize` to store field-level options, eg
3
3
  #
4
- # field :myField, function: Functions::<%= name %>.new(type: MyType)
4
+ # field :myField, function: Functions::<%= class_name %>.new(type: MyType)
5
5
  #
6
6
  # attr_reader :type
7
7
  # def initialize(type:)
@@ -1,7 +1,7 @@
1
- class Loaders::<%= name %> < GraphQL::Batch::Loader
1
+ class Loaders::<%= class_name %> < GraphQL::Batch::Loader
2
2
  # Define `initialize` to store grouping arguments, eg
3
3
  #
4
- # Loaders::<%= name %>.for(group).load(value)
4
+ # Loaders::<%= class_name %>.for(group).load(value)
5
5
  #
6
6
  # def initialize()
7
7
  # end
@@ -21,7 +21,7 @@
21
21
  }
22
22
 
23
23
  # Object Resolution
24
- resolve_type -> (obj, ctx) {
24
+ resolve_type -> (type, obj, ctx) {
25
25
  # TODO: Implement this function
26
26
  # to return the correct type for `obj`
27
27
  raise(NotImplementedError)
@@ -37,6 +37,7 @@ module GraphQL
37
37
  include GraphQL::Define::InstanceDefinable
38
38
  accepts_definitions :name, :type, :description, :default_value, :as, :prepare
39
39
  attr_accessor :type, :description, :default_value, :name, :as
40
+ attr_accessor :ast_node
40
41
 
41
42
  ensure_defined(:name, :description, :default_value, :type=, :type, :as, :expose_as, :prepare)
42
43
 
@@ -58,8 +59,13 @@ module GraphQL
58
59
  end
59
60
 
60
61
  def default_value=(new_default_value)
61
- @has_default_value = true
62
- @default_value = new_default_value
62
+ if new_default_value == NO_DEFAULT_VALUE
63
+ @has_default_value = false
64
+ @default_value = nil
65
+ else
66
+ @has_default_value = true
67
+ @default_value = new_default_value
68
+ end
63
69
  end
64
70
 
65
71
  # @!attribute name
@@ -97,28 +103,28 @@ module GraphQL
97
103
  NO_DEFAULT_VALUE = Object.new
98
104
  # @api private
99
105
  def self.from_dsl(name, type_or_argument = nil, description = nil, default_value: NO_DEFAULT_VALUE, as: nil, prepare: DefaultPrepare, **kwargs, &block)
100
- if type_or_argument.is_a?(GraphQL::Argument)
101
- return type_or_argument.redefine(name: name.to_s)
102
- end
106
+ name_s = name.to_s
103
107
 
104
- argument = if block_given?
105
- GraphQL::Argument.define(&block)
106
- else
107
- GraphQL::Argument.define(**kwargs)
108
- end
108
+ # Move some positional args into keywords if they're present
109
+ description && kwargs[:description] ||= description
110
+ kwargs[:name] ||= name_s
111
+ kwargs[:default_value] ||= default_value
112
+ kwargs[:as] ||= as
109
113
 
110
- argument.name = name.to_s
111
- type_or_argument && argument.type = type_or_argument
112
- description && argument.description = description
113
- if default_value != NO_DEFAULT_VALUE
114
- argument.default_value = default_value
114
+ unless prepare == DefaultPrepare
115
+ kwargs[:prepare] ||= prepare
115
116
  end
116
- as && argument.as = as
117
- if prepare != DefaultPrepare
118
- argument.prepare = prepare
117
+
118
+ if !type_or_argument.nil? && !type_or_argument.is_a?(GraphQL::Argument)
119
+ # Maybe a string, proc or BaseType
120
+ kwargs[:type] = type_or_argument
119
121
  end
120
122
 
121
- argument
123
+ if type_or_argument.is_a?(GraphQL::Argument)
124
+ type_or_argument.redefine(kwargs, &block)
125
+ else
126
+ GraphQL::Argument.define(kwargs, &block)
127
+ end
122
128
  end
123
129
  end
124
130
  end
@@ -22,30 +22,24 @@ module GraphQL
22
22
  end
23
23
 
24
24
  if push_data
25
- execution_context = Thread.current[:graphql_execution_context] ||= []
26
- if key == "execute_multiplex"
27
- execution_context.clear
28
- execution_context.push(push_data)
29
- begin
30
- yield
31
- rescue StandardError => err
32
- # This is an unhandled error from execution,
33
- # Re-raise it with a GraphQL trace.
34
- potential_context = execution_context.last
25
+ Thread.current[:last_graphql_backtrace_context] = push_data
26
+ end
27
+
28
+ if key == "execute_multiplex"
29
+ begin
30
+ yield
31
+ rescue StandardError => err
32
+ # This is an unhandled error from execution,
33
+ # Re-raise it with a GraphQL trace.
34
+ potential_context = Thread.current[:last_graphql_backtrace_context]
35
35
 
36
- if potential_context.is_a?(GraphQL::Query::Context) || potential_context.is_a?(GraphQL::Query::Context::FieldResolutionContext)
37
- raise TracedError.new(err, potential_context)
38
- else
39
- raise
40
- end
41
- ensure
42
- execution_context.clear
36
+ if potential_context.is_a?(GraphQL::Query::Context) || potential_context.is_a?(GraphQL::Query::Context::FieldResolutionContext)
37
+ raise TracedError.new(err, potential_context)
38
+ else
39
+ raise
43
40
  end
44
- else
45
- execution_context.push(push_data)
46
- res = yield
47
- execution_context.pop
48
- res
41
+ ensure
42
+ Thread.current[:last_graphql_backtrace_context] = nil
49
43
  end
50
44
  else
51
45
  yield
@@ -19,7 +19,7 @@ module GraphQL
19
19
  #
20
20
  class Backtrace
21
21
  include Enumerable
22
- extend GraphQL::Delegate
22
+ extend Forwardable
23
23
 
24
24
  def_delegators :to_a, :each, :[]
25
25
 
@@ -12,11 +12,10 @@ module GraphQL
12
12
  # If `last`, then use the last arguments to call the function.
13
13
  def wrap_arity(callable, from:, to:, name:, last: false)
14
14
  arity = get_arity(callable)
15
- case arity
16
- when to
15
+ if arity == to || arity < 0
17
16
  # It already matches, return it as is
18
17
  callable
19
- when from
18
+ elsif arity == from
20
19
  # It has the old arity, so wrap it with an arity converter
21
20
  message ="#{name} with #{from} arguments is deprecated, it now accepts #{to} arguments, see:"
22
21
  backtrace = caller(0, 20)
@@ -1,9 +1,13 @@
1
1
  # frozen_string_literal: true
2
+ require "graphql/relay/type_extensions"
3
+
2
4
  module GraphQL
3
5
  # The parent for all type classes.
4
6
  class BaseType
5
7
  include GraphQL::Define::NonNullWithBang
6
8
  include GraphQL::Define::InstanceDefinable
9
+ include GraphQL::Relay::TypeExtensions
10
+
7
11
  accepts_definitions :name, :description,
8
12
  :introspection,
9
13
  :default_scalar,
@@ -13,7 +17,9 @@ module GraphQL
13
17
  global_id_field: GraphQL::Define::AssignGlobalIdField,
14
18
  }
15
19
 
16
- ensure_defined(:name, :description, :introspection?, :default_scalar?)
20
+ ensure_defined(:graphql_name, :name, :description, :introspection?, :default_scalar?)
21
+
22
+ attr_accessor :ast_node
17
23
 
18
24
  def initialize
19
25
  @introspection = false
@@ -30,6 +36,17 @@ module GraphQL
30
36
 
31
37
  # @return [String] the name of this type, must be unique within a Schema
32
38
  attr_accessor :name
39
+ # Future-compatible alias
40
+ # @see {GraphQL::SchemaMember}
41
+ alias :graphql_name :name
42
+ # Future-compatible alias
43
+ # @see {GraphQL::SchemaMember}
44
+ alias :graphql_definition :itself
45
+
46
+ def name=(name)
47
+ GraphQL::NameValidator.validate!(name)
48
+ @name = name
49
+ end
33
50
 
34
51
  # @return [String, nil] a description for this type
35
52
  attr_accessor :description
@@ -54,12 +71,9 @@ module GraphQL
54
71
 
55
72
  # @param other [GraphQL::BaseType] compare to this object
56
73
  # @return [Boolean] are these types equivalent? (incl. non-null, list)
74
+ # @see {ModifiesAnotherType#==} for override on List & NonNull types
57
75
  def ==(other)
58
- if other.is_a?(GraphQL::BaseType)
59
- self.to_s == other.to_s
60
- else
61
- super
62
- end
76
+ other.is_a?(GraphQL::BaseType) && self.name == other.name
63
77
  end
64
78
 
65
79
  # If this type is modifying an underlying type,
@@ -82,6 +96,10 @@ module GraphQL
82
96
  def unwrap
83
97
  self.of_type.unwrap
84
98
  end
99
+
100
+ def ==(other)
101
+ other.is_a?(ModifiesAnotherType) && other.of_type == of_type
102
+ end
85
103
  end
86
104
 
87
105
  # Find out which possible type to use for `value`.
@@ -164,38 +182,20 @@ module GraphQL
164
182
  def self.resolve_related_type(type_arg)
165
183
  case type_arg
166
184
  when Proc
167
- # lazy-eval it
168
- type_arg.call
185
+ # lazy-eval it, then try again
186
+ resolve_related_type(type_arg.call)
169
187
  when String
170
188
  # Get a constant by this name
171
189
  Object.const_get(type_arg)
172
190
  else
173
- type_arg
191
+ if type_arg.respond_to?(:graphql_definition)
192
+ type_arg.graphql_definition
193
+ else
194
+ type_arg
195
+ end
174
196
  end
175
197
  end
176
198
 
177
- # @return [GraphQL::ObjectType] The default connection type for this object type
178
- def connection_type
179
- @connection_type ||= define_connection
180
- end
181
-
182
- # Define a custom connection type for this object type
183
- # @return [GraphQL::ObjectType]
184
- def define_connection(**kwargs, &block)
185
- GraphQL::Relay::ConnectionType.create_type(self, **kwargs, &block)
186
- end
187
-
188
- # @return [GraphQL::ObjectType] The default edge type for this object type
189
- def edge_type
190
- @edge_type ||= define_edge
191
- end
192
-
193
- # Define a custom edge type for this object type
194
- # @return [GraphQL::ObjectType]
195
- def define_edge(**kwargs, &block)
196
- GraphQL::Relay::EdgeType.create_type(self, **kwargs, &block)
197
- end
198
-
199
199
  # Return a GraphQL string for the type definition
200
200
  # @param schema [GraphQL::Schema]
201
201
  # @param printer [GraphQL::Schema::Printer]
@@ -56,6 +56,20 @@ module GraphQL
56
56
  assert_raises_parse_error(%|{ field(arg:"\\uXXXF") }|)
57
57
  end
58
58
 
59
+ def test_it_rejects_empty_inline_fragments
60
+ assert_raises_parse_error("
61
+ query {
62
+ viewer {
63
+ login {
64
+ ... on String {
65
+
66
+ }
67
+ }
68
+ }
69
+ }
70
+ ")
71
+ end
72
+
59
73
  def assert_empty_document(query_string)
60
74
  doc = parse(query_string)
61
75
  assert_equal 0, doc.definitions.length
@@ -67,6 +67,10 @@ module GraphQL
67
67
  nullValue: null
68
68
  nullValueInObject: {a: null, b: "b"}
69
69
  nullValueInArray: ["a", null, "b"]
70
+ blockString: """
71
+ Hello,
72
+ World
73
+ """
70
74
  )
71
75
  }
72
76
  |
@@ -100,6 +104,9 @@ module GraphQL
100
104
  assert_equal 'a', values[0]
101
105
  assert_instance_of GraphQL::Language::Nodes::NullValue, values[1]
102
106
  assert_equal 'b', values[2]
107
+
108
+ block_str_value = inputs[12].value
109
+ assert_equal "Hello,\n World", block_str_value
103
110
  end
104
111
 
105
112
  def test_it_doesnt_parse_nonsense_variables
@@ -116,6 +123,116 @@ module GraphQL
116
123
  end
117
124
  assert_equal [1,26], [err_2.line, err_2.col]
118
125
  end
126
+
127
+ def test_enum_value_definitions_have_a_position
128
+ document = parse("""
129
+ enum Enum {
130
+ VALUE
131
+ }
132
+ """)
133
+
134
+ assert_equal [3, 17], document.definitions[0].values[0].position
135
+ end
136
+
137
+ def test_field_definitions_have_a_position
138
+ document = parse("""
139
+ type A {
140
+ field: String
141
+ }
142
+ """)
143
+
144
+ assert_equal [3, 17], document.definitions[0].fields[0].position
145
+ end
146
+
147
+ def test_input_value_definitions_have_a_position
148
+ document = parse("""
149
+ input A {
150
+ field: String
151
+ }
152
+ """)
153
+
154
+ assert_equal [3, 17], document.definitions[0].fields[0].position
155
+ end
156
+
157
+ def test_parses_when_there_are_no_interfaces
158
+ schema = "
159
+ type A {
160
+ a: String
161
+ }
162
+ "
163
+
164
+ document = parse(schema)
165
+
166
+ assert_equal [], document.definitions[0].interfaces.map(&:name)
167
+ end
168
+
169
+ def test_parses_implements_with_leading_ampersand
170
+ schema = "
171
+ type A implements & B {
172
+ a: String
173
+ }
174
+ "
175
+
176
+ document = parse(schema)
177
+
178
+ assert_equal ["B"], document.definitions[0].interfaces.map(&:name)
179
+ assert_equal [2, 35], document.definitions[0].interfaces[0].position
180
+ end
181
+
182
+ def test_parses_implements_with_leading_ampersand_and_multiple_interfaces
183
+ schema = "
184
+ type A implements & B & C {
185
+ a: String
186
+ }
187
+ "
188
+
189
+ document = parse(schema)
190
+
191
+ assert_equal ["B", "C"], document.definitions[0].interfaces.map(&:name)
192
+ assert_equal [2, 35], document.definitions[0].interfaces[0].position
193
+ assert_equal [2, 39], document.definitions[0].interfaces[1].position
194
+ end
195
+
196
+ def test_parses_implements_without_leading_ampersand
197
+ schema = "
198
+ type A implements B {
199
+ a: String
200
+ }
201
+ "
202
+
203
+ document = parse(schema)
204
+
205
+ assert_equal ["B"], document.definitions[0].interfaces.map(&:name)
206
+ assert_equal [2, 33], document.definitions[0].interfaces[0].position
207
+ end
208
+
209
+ def test_parses_implements_without_leading_ampersand_and_multiple_interfaces
210
+ schema = "
211
+ type A implements B & C {
212
+ a: String
213
+ }
214
+ "
215
+
216
+ document = parse(schema)
217
+
218
+ assert_equal ["B", "C"], document.definitions[0].interfaces.map(&:name)
219
+ assert_equal [2, 33], document.definitions[0].interfaces[0].position
220
+ assert_equal [2, 37], document.definitions[0].interfaces[1].position
221
+ end
222
+
223
+ def test_supports_old_syntax_for_parsing_multiple_interfaces
224
+ schema = "
225
+ type A implements B, C {
226
+ a: String
227
+ }
228
+ "
229
+
230
+ document = parse(schema)
231
+
232
+ assert_equal ["B", "C"], document.definitions[0].interfaces.map(&:name)
233
+ assert_equal [2, 33], document.definitions[0].interfaces[0].position
234
+ assert_equal [2, 36], document.definitions[0].interfaces[1].position
235
+ end
119
236
  end
120
237
  end
121
238
 
@@ -18,23 +18,16 @@ module GraphQL
18
18
  base_field = if type_or_field.is_a?(GraphQL::Field)
19
19
  type_or_field.redefine(name: name_s)
20
20
  elsif function
21
- GraphQL::Field.define(
22
- arguments: function.arguments,
23
- complexity: function.complexity,
24
- name: name_s,
25
- type: function.type,
26
- resolve: function,
27
- description: function.description,
28
- function: function,
29
- deprecation_reason: function.deprecation_reason,
30
- )
21
+ func_field = GraphQL::Function.build_field(function)
22
+ func_field.name = name_s
23
+ func_field
31
24
  elsif field.is_a?(GraphQL::Field)
32
25
  field.redefine(name: name_s)
33
26
  else
34
27
  nil
35
28
  end
36
29
 
37
- field = if base_field
30
+ obj_field = if base_field
38
31
  base_field.redefine(kwargs, &block)
39
32
  else
40
33
  GraphQL::Field.define(kwargs, &block)
@@ -42,7 +35,7 @@ module GraphQL
42
35
 
43
36
 
44
37
  # Attach the field to the type
45
- owner_type.fields[name_s] = field
38
+ owner_type.fields[name_s] = obj_field
46
39
  end
47
40
  end
48
41
  end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ # There are two ways to apply the deprecated `!` DSL to class-style schema definitions:
4
+ #
5
+ # 1. Scoped by file (CRuby only), add to the top of the file:
6
+ #
7
+ # using GraphQL::DeprecatedDSL
8
+ #
9
+ # (This is a "refinement", there are also other ways to scope it.)
10
+ #
11
+ # 2. Global application, add before schema definition:
12
+ #
13
+ # GraphQL::DeprecatedDSL.activate
14
+ #
15
+ module DeprecatedDSL
16
+ TYPE_CLASSES = [
17
+ GraphQL::Schema::Scalar,
18
+ GraphQL::Schema::Enum,
19
+ GraphQL::Schema::InputObject,
20
+ GraphQL::Schema::Union,
21
+ GraphQL::Schema::Interface,
22
+ GraphQL::Schema::Object,
23
+ ]
24
+
25
+ def self.activate
26
+ TYPE_CLASSES.each { |c| c.extend(Methods) }
27
+ GraphQL::Schema::List.include(Methods)
28
+ GraphQL::Schema::NonNull.include(Methods)
29
+ end
30
+ module Methods
31
+ def !
32
+ to_non_null_type
33
+ end
34
+ end
35
+
36
+ TYPE_CLASSES.each do |type_class|
37
+ refine type_class.singleton_class do
38
+ include Methods
39
+ end
40
+ end
41
+ end
42
+ end
@@ -11,6 +11,7 @@ module GraphQL
11
11
  accepts_definitions :locations, :name, :description, :arguments, :default_directive, argument: GraphQL::Define::AssignArgument
12
12
 
13
13
  attr_accessor :locations, :arguments, :name, :description, :arguments_class
14
+ attr_accessor :ast_node
14
15
  # @api private
15
16
  attr_writer :default_directive
16
17
  ensure_defined(:locations, :arguments, :name, :description, :default_directive?)
@@ -74,6 +74,7 @@ module GraphQL
74
74
  class EnumType < GraphQL::BaseType
75
75
  accepts_definitions :values, value: GraphQL::Define::AssignEnumValue
76
76
  ensure_defined(:values, :validate_non_null_input, :coerce_non_null_input, :coerce_result)
77
+ attr_accessor :ast_node
77
78
 
78
79
  def initialize
79
80
  super
@@ -121,7 +122,7 @@ module GraphQL
121
122
  if enum_value
122
123
  enum_value.name
123
124
  else
124
- raise(UnresolvedValueError, "Can't resolve enum #{name} for #{value}")
125
+ raise(UnresolvedValueError, "Can't resolve enum #{name} for #{value.inspect}")
125
126
  end
126
127
  end
127
128
 
@@ -137,6 +138,7 @@ module GraphQL
137
138
  ATTRIBUTES = [:name, :description, :deprecation_reason, :value]
138
139
  accepts_definitions(*ATTRIBUTES)
139
140
  attr_accessor(*ATTRIBUTES)
141
+ attr_accessor :ast_node
140
142
  ensure_defined(*ATTRIBUTES)
141
143
 
142
144
  def name=(new_name)