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
@@ -1,15 +1,24 @@
1
1
  # frozen_string_literal: true
2
- GraphQL::Introspection::FieldType = GraphQL::ObjectType.define do
3
- name "__Field"
4
- description "Object and Interface types are described by a list of Fields, each of which has "\
5
- "a name, potentially a list of arguments, and a return type."
6
- field :name, !types.String
7
- field :description, types.String
8
- field :args, GraphQL::Introspection::ArgumentsField
9
- field :type, !GraphQL::Introspection::TypeType
10
- field :isDeprecated, !types.Boolean do
11
- resolve ->(obj, a, c) { !!obj.deprecation_reason }
2
+ module GraphQL
3
+ module Introspection
4
+ class FieldType < Introspection::BaseObject
5
+ graphql_name "__Field"
6
+ description "Object and Interface types are described by a list of Fields, each of which has "\
7
+ "a name, potentially a list of arguments, and a return type."
8
+ field :name, String, null: false
9
+ field :description, String, null: true
10
+ field :args, [GraphQL::Schema::LateBoundType.new("__InputValue")], null: false
11
+ field :type, GraphQL::Schema::LateBoundType.new("__Type"), null: false
12
+ field :is_deprecated, Boolean, null: false
13
+ field :deprecation_reason, String, null: true
14
+
15
+ def is_deprecated
16
+ !!@object.deprecation_reason
17
+ end
18
+
19
+ def args
20
+ @context.warden.arguments(@object)
21
+ end
22
+ end
12
23
  end
13
- field :deprecationReason, types.String, property: :deprecation_reason
14
- introspection true
15
24
  end
@@ -1,30 +1,33 @@
1
1
  # frozen_string_literal: true
2
- GraphQL::Introspection::InputValueType = GraphQL::ObjectType.define do
3
- name "__InputValue"
4
- description "Arguments provided to Fields or Directives and the input fields of an "\
5
- "InputObject are represented as Input Values which describe their type and "\
6
- "optionally a default value."
7
- field :name, !types.String
8
- field :description, types.String
9
- field :type, !GraphQL::Introspection::TypeType
10
- field :defaultValue, types.String, "A GraphQL-formatted string representing the default value for this input value." do
11
- resolve ->(obj, args, ctx) {
12
- if obj.default_value?
13
- value = obj.default_value
14
- if value.nil?
15
- 'null'
16
- else
17
- coerced_default_value = obj.type.coerce_result(value, ctx)
18
- if obj.type.unwrap.is_a?(GraphQL::EnumType)
19
- coerced_default_value
2
+ module GraphQL
3
+ module Introspection
4
+ class InputValueType < Introspection::BaseObject
5
+ graphql_name "__InputValue"
6
+ description "Arguments provided to Fields or Directives and the input fields of an "\
7
+ "InputObject are represented as Input Values which describe their type and "\
8
+ "optionally a default value."
9
+ field :name, String, null: false
10
+ field :description, String, null: true
11
+ field :type, GraphQL::Schema::LateBoundType.new("__Type"), null: false
12
+ field :default_value, String, "A GraphQL-formatted string representing the default value for this input value.", null: true
13
+
14
+ def default_value
15
+ if @object.default_value?
16
+ value = @object.default_value
17
+ if value.nil?
18
+ 'null'
20
19
  else
21
- GraphQL::Language.serialize(coerced_default_value)
20
+ coerced_default_value = @object.type.coerce_result(value, @context)
21
+ if @object.type.unwrap.is_a?(GraphQL::EnumType)
22
+ coerced_default_value
23
+ else
24
+ GraphQL::Language.serialize(coerced_default_value)
25
+ end
22
26
  end
27
+ else
28
+ nil
23
29
  end
24
- else
25
- nil
26
30
  end
27
- }
31
+ end
28
32
  end
29
- introspection true
30
33
  end
@@ -4,8 +4,13 @@ module GraphQL
4
4
  SchemaField = GraphQL::Field.define do
5
5
  name("__schema")
6
6
  description("This GraphQL schema")
7
- type(!GraphQL::Introspection::SchemaType)
8
- resolve ->(o, a, ctx) { ctx.query.schema }
7
+ type(GraphQL::Schema::LateBoundType.new("__Schema").to_non_null_type)
8
+ resolve ->(o, a, ctx) {
9
+ # Apply wrapping manually since this field isn't wrapped by instrumentation
10
+ schema = ctx.query.schema
11
+ schema_type = schema.introspection_system.schema_type
12
+ schema_type.metadata[:type_class].new(schema, ctx.query.context)
13
+ }
9
14
  end
10
15
  end
11
16
  end
@@ -1,29 +1,43 @@
1
1
  # frozen_string_literal: true
2
- GraphQL::Introspection::SchemaType = GraphQL::ObjectType.define do
3
- name "__Schema"
4
- description "A GraphQL Schema defines the capabilities of a GraphQL server. It exposes all "\
5
- "available types and directives on the server, as well as the entry points for "\
6
- "query, mutation, and subscription operations."
7
-
8
- field :types, !types[!GraphQL::Introspection::TypeType], "A list of all types supported by this server." do
9
- resolve ->(obj, arg, ctx) { ctx.warden.types }
10
- end
2
+ module GraphQL
3
+ module Introspection
4
+ class SchemaType < Introspection::BaseObject
5
+ graphql_name "__Schema"
6
+ description "A GraphQL Schema defines the capabilities of a GraphQL server. It exposes all "\
7
+ "available types and directives on the server, as well as the entry points for "\
8
+ "query, mutation, and subscription operations."
11
9
 
12
- field :queryType, !GraphQL::Introspection::TypeType, "The type that query operations will be rooted at." do
13
- resolve ->(obj, arg, ctx) { ctx.warden.root_type_for_operation("query") }
14
- end
10
+ field :types, [GraphQL::Schema::LateBoundType.new("__Type")], "A list of all types supported by this server.", null: false
11
+ field :queryType, GraphQL::Schema::LateBoundType.new("__Type"), "The type that query operations will be rooted at.", null: false
12
+ field :mutationType, GraphQL::Schema::LateBoundType.new("__Type"), "If this server supports mutation, the type that mutation operations will be rooted at.", null: true
13
+ field :subscriptionType, GraphQL::Schema::LateBoundType.new("__Type"), "If this server support subscription, the type that subscription operations will be rooted at.", null: true
14
+ field :directives, [GraphQL::Schema::LateBoundType.new("__Directive")], "A list of all directives supported by this server.", null: false
15
15
 
16
- field :mutationType, GraphQL::Introspection::TypeType, "If this server supports mutation, the type that mutation operations will be rooted at." do
17
- resolve ->(obj, arg, ctx) { ctx.warden.root_type_for_operation("mutation") }
18
- end
16
+ def types
17
+ @context.warden.types
18
+ end
19
19
 
20
- field :subscriptionType, GraphQL::Introspection::TypeType, "If this server support subscription, the type that subscription operations will be rooted at." do
21
- resolve ->(obj, arg, ctx) { ctx.warden.root_type_for_operation("subscription") }
22
- end
20
+ def query_type
21
+ permitted_root_type("query")
22
+ end
23
23
 
24
- field :directives, !types[!GraphQL::Introspection::DirectiveType], "A list of all directives supported by this server." do
25
- resolve ->(obj, arg, ctx) { obj.directives.values }
26
- end
24
+ def mutation_type
25
+ permitted_root_type("mutation")
26
+ end
27
27
 
28
- introspection true
28
+ def subscription_type
29
+ permitted_root_type("subscription")
30
+ end
31
+
32
+ def directives
33
+ @object.directives.values
34
+ end
35
+
36
+ private
37
+
38
+ def permitted_root_type(op_type)
39
+ @context.warden.root_type_for_operation(op_type)
40
+ end
41
+ end
42
+ end
29
43
  end
@@ -4,10 +4,18 @@ module GraphQL
4
4
  TypeByNameField = GraphQL::Field.define do
5
5
  name("__type")
6
6
  description("A type in the GraphQL system")
7
- type(GraphQL::Introspection::TypeType)
7
+ introspection true
8
+ type(GraphQL::Schema::LateBoundType.new("__Type"))
8
9
  argument :name, !types.String
9
10
  resolve ->(o, args, ctx) {
10
- ctx.warden.get_type(args["name"])
11
+ type = ctx.warden.get_type(args["name"])
12
+ if type
13
+ # Apply wrapping manually since this field isn't wrapped by instrumentation
14
+ type_type = ctx.schema.introspection_system.type_type
15
+ type_type.metadata[:type_class].new(type, ctx)
16
+ else
17
+ nil
18
+ end
11
19
  }
12
20
  end
13
21
  end
@@ -1,9 +1,13 @@
1
1
  # frozen_string_literal: true
2
- GraphQL::Introspection::TypeKindEnum = GraphQL::EnumType.define do
3
- name "__TypeKind"
4
- description "An enum describing what kind of type a given `__Type` is."
5
- GraphQL::TypeKinds::TYPE_KINDS.each do |type_kind|
6
- value(type_kind.name, type_kind.description)
2
+ module GraphQL
3
+ module Introspection
4
+ class TypeKindEnum < GraphQL::Schema::Enum
5
+ graphql_name "__TypeKind"
6
+ description "An enum describing what kind of type a given `__Type` is."
7
+ GraphQL::TypeKinds::TYPE_KINDS.each do |type_kind|
8
+ value(type_kind.name, type_kind.description)
9
+ end
10
+ introspection true
11
+ end
7
12
  end
8
- introspection true
9
13
  end
@@ -1,26 +1,88 @@
1
1
  # frozen_string_literal: true
2
- GraphQL::Introspection::TypeType = GraphQL::ObjectType.define do
3
- name "__Type"
4
- description "The fundamental unit of any GraphQL Schema is the type. There are many kinds of types in "\
5
- "GraphQL as represented by the `__TypeKind` enum.\n\n"\
6
- "Depending on the kind of a type, certain fields describe information about that type. "\
7
- "Scalar types provide no information beyond a name and description, while "\
8
- "Enum types provide their values. Object and Interface types provide the fields "\
9
- "they describe. Abstract types, Union and Interface, provide the Object types "\
10
- "possible at runtime. List and NonNull types compose other types."
11
-
12
- field :kind do
13
- type !GraphQL::Introspection::TypeKindEnum
14
- resolve ->(target, a, c) { target.kind.name }
15
- end
2
+ module GraphQL
3
+ module Introspection
4
+ class TypeType < GraphQL::Schema::Object
5
+ graphql_name "__Type"
6
+ description "The fundamental unit of any GraphQL Schema is the type. There are many kinds of types in "\
7
+ "GraphQL as represented by the `__TypeKind` enum.\n\n"\
8
+ "Depending on the kind of a type, certain fields describe information about that type. "\
9
+ "Scalar types provide no information beyond a name and description, while "\
10
+ "Enum types provide their values. Object and Interface types provide the fields "\
11
+ "they describe. Abstract types, Union and Interface, provide the Object types "\
12
+ "possible at runtime. List and NonNull types compose other types."
13
+
14
+ field :kind, GraphQL::Schema::LateBoundType.new("__TypeKind"), null: false
15
+ field :name, String, null: true
16
+ field :description, String, null: true
17
+ field :fields, [GraphQL::Schema::LateBoundType.new("__Field")], null: true do
18
+ argument :include_deprecated, Boolean, required: false, default_value: false
19
+ end
20
+ field :interfaces, [GraphQL::Schema::LateBoundType.new("__Type")], null: true
21
+ field :possible_types, [GraphQL::Schema::LateBoundType.new("__Type")], null: true
22
+ field :enum_values, [GraphQL::Schema::LateBoundType.new("__EnumValue")], null: true do
23
+ argument :include_deprecated, Boolean, required: false, default_value: false
24
+ end
25
+ field :input_fields, [GraphQL::Schema::LateBoundType.new("__InputValue")], null: true
26
+ field :of_type, GraphQL::Schema::LateBoundType.new("__Type"), null: true
27
+ introspection true
28
+
29
+ def kind
30
+ @object.kind.name
31
+ end
32
+
33
+ def enum_values(include_deprecated:)
34
+ if !@object.kind.enum?
35
+ nil
36
+ else
37
+ enum_values = @context.warden.enum_values(@object)
38
+
39
+ if !include_deprecated
40
+ enum_values = enum_values.select {|f| !f.deprecation_reason }
41
+ end
42
+
43
+ enum_values
44
+ end
45
+ end
16
46
 
17
- field :name, types.String
18
- field :description, types.String
19
- field :fields, GraphQL::Introspection::FieldsField
20
- field :interfaces, GraphQL::Introspection::InterfacesField
21
- field :possibleTypes, GraphQL::Introspection::PossibleTypesField
22
- field :enumValues, GraphQL::Introspection::EnumValuesField
23
- field :inputFields, GraphQL::Introspection::InputFieldsField
24
- field :ofType, GraphQL::Introspection::OfTypeField
25
- introspection true
47
+ def interfaces
48
+ if @object.kind == GraphQL::TypeKinds::OBJECT
49
+ @context.warden.interfaces(@object)
50
+ else
51
+ nil
52
+ end
53
+ end
54
+
55
+ def input_fields
56
+ if @object.kind.input_object?
57
+ @context.warden.arguments(@object)
58
+ else
59
+ nil
60
+ end
61
+ end
62
+
63
+ def possible_types
64
+ if @object.kind.resolves?
65
+ @context.warden.possible_types(@object)
66
+ else
67
+ nil
68
+ end
69
+ end
70
+
71
+ def fields(include_deprecated:)
72
+ if !@object.kind.fields?
73
+ nil
74
+ else
75
+ fields = @context.warden.fields(@object)
76
+ if !include_deprecated
77
+ fields = fields.select {|f| !f.deprecation_reason }
78
+ end
79
+ fields.sort_by(&:name)
80
+ end
81
+ end
82
+
83
+ def of_type
84
+ @object.kind.wraps? ? @object.of_type : nil
85
+ end
86
+ end
87
+ end
26
88
  end
@@ -5,6 +5,7 @@ module GraphQL
5
5
  name "__typename"
6
6
  description "The name of this type"
7
7
  type -> { !GraphQL::STRING_TYPE }
8
+ introspection true
8
9
  resolve ->(obj, a, ctx) { ctx.irep_node.owner_type }
9
10
  end
10
11
  end
@@ -4,25 +4,18 @@ module GraphQL
4
4
  end
5
5
  end
6
6
 
7
+ require "graphql/introspection/base_object"
7
8
  require "graphql/introspection/typename_field"
8
9
  require "graphql/introspection/input_value_type"
9
10
  require "graphql/introspection/enum_value_type"
10
11
  require "graphql/introspection/type_kind_enum"
11
-
12
- require "graphql/introspection/fields_field"
13
- require "graphql/introspection/of_type_field"
14
- require "graphql/introspection/input_fields_field"
15
- require "graphql/introspection/possible_types_field"
16
- require "graphql/introspection/enum_values_field"
17
- require "graphql/introspection/interfaces_field"
18
-
19
12
  require "graphql/introspection/type_type"
20
- require "graphql/introspection/arguments_field"
21
13
  require "graphql/introspection/field_type"
22
-
23
14
  require "graphql/introspection/directive_location_enum"
24
15
  require "graphql/introspection/directive_type"
25
16
  require "graphql/introspection/schema_type"
26
17
  require "graphql/introspection/schema_field"
27
18
  require "graphql/introspection/type_by_name_field"
28
19
  require "graphql/introspection/introspection_query"
20
+ require "graphql/introspection/dynamic_fields"
21
+ require "graphql/introspection/entry_points"
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+ module GraphQL
3
+ module Language
4
+ module BlockString
5
+ # Remove leading and trailing whitespace from a block string.
6
+ # See "Block Strings" in https://github.com/facebook/graphql/blob/master/spec/Section%202%20--%20Language.md
7
+ def self.trim_whitespace(str)
8
+ lines = str.split("\n")
9
+ common_indent = nil
10
+
11
+ # find the common whitespace
12
+ lines.each_with_index do |line, idx|
13
+ if idx == 0
14
+ next
15
+ end
16
+ line_length = line.size
17
+ line_indent = line[/\A */].size
18
+ if line_indent < line_length && (common_indent.nil? || line_indent < common_indent)
19
+ common_indent = line_indent
20
+ end
21
+ end
22
+
23
+ # Remove the common whitespace
24
+ if common_indent
25
+ lines.each_with_index do |line, idx|
26
+ if idx == 0
27
+ next
28
+ else
29
+ line[0, common_indent] = ""
30
+ end
31
+ end
32
+ end
33
+
34
+ # Remove leading & trailing blank lines
35
+ while lines.first.empty?
36
+ lines.shift
37
+ end
38
+ while lines.last.empty?
39
+ lines.pop
40
+ end
41
+
42
+ # Rebuild the string
43
+ lines.join("\n")
44
+ end
45
+ end
46
+ end
47
+ end