graphql 1.9.11 → 1.9.12

Sign up to get free protection for your applications and to get access to all the features.
Files changed (286) hide show
  1. checksums.yaml +4 -4
  2. data/lib/graphql/analysis/ast/query_complexity.rb +0 -8
  3. data/lib/graphql/analysis/ast/query_depth.rb +0 -8
  4. data/lib/graphql/analysis/ast/visitor.rb +26 -24
  5. data/lib/graphql/execution.rb +1 -0
  6. data/lib/graphql/execution/errors.rb +60 -0
  7. data/lib/graphql/execution/interpreter/runtime.rb +21 -17
  8. data/lib/graphql/static_validation/rules/fields_will_merge.rb +15 -8
  9. data/lib/graphql/version.rb +1 -1
  10. metadata +5 -556
  11. data/spec/dummy/Gemfile +0 -12
  12. data/spec/dummy/README.md +0 -24
  13. data/spec/dummy/Rakefile +0 -7
  14. data/spec/dummy/app/assets/config/manifest.js +0 -1
  15. data/spec/dummy/app/assets/javascripts/application.js +0 -66
  16. data/spec/dummy/app/channels/application_cable/channel.rb +0 -5
  17. data/spec/dummy/app/channels/application_cable/connection.rb +0 -5
  18. data/spec/dummy/app/channels/graphql_channel.rb +0 -116
  19. data/spec/dummy/app/controllers/application_controller.rb +0 -4
  20. data/spec/dummy/app/controllers/pages_controller.rb +0 -5
  21. data/spec/dummy/app/helpers/application_helper.rb +0 -3
  22. data/spec/dummy/app/jobs/application_job.rb +0 -3
  23. data/spec/dummy/app/views/layouts/application.html.erb +0 -12
  24. data/spec/dummy/app/views/pages/show.html +0 -16
  25. data/spec/dummy/bin/bundle +0 -4
  26. data/spec/dummy/bin/rails +0 -5
  27. data/spec/dummy/bin/rake +0 -5
  28. data/spec/dummy/bin/setup +0 -31
  29. data/spec/dummy/bin/update +0 -27
  30. data/spec/dummy/bin/yarn +0 -12
  31. data/spec/dummy/config.ru +0 -6
  32. data/spec/dummy/config/application.rb +0 -30
  33. data/spec/dummy/config/boot.rb +0 -4
  34. data/spec/dummy/config/cable.yml +0 -10
  35. data/spec/dummy/config/environment.rb +0 -6
  36. data/spec/dummy/config/environments/development.rb +0 -40
  37. data/spec/dummy/config/environments/production.rb +0 -76
  38. data/spec/dummy/config/environments/test.rb +0 -37
  39. data/spec/dummy/config/initializers/application_controller_renderer.rb +0 -9
  40. data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -8
  41. data/spec/dummy/config/initializers/cookies_serializer.rb +0 -6
  42. data/spec/dummy/config/initializers/filter_parameter_logging.rb +0 -5
  43. data/spec/dummy/config/initializers/inflections.rb +0 -17
  44. data/spec/dummy/config/initializers/mime_types.rb +0 -5
  45. data/spec/dummy/config/initializers/wrap_parameters.rb +0 -10
  46. data/spec/dummy/config/locales/en.yml +0 -33
  47. data/spec/dummy/config/puma.rb +0 -57
  48. data/spec/dummy/config/routes.rb +0 -4
  49. data/spec/dummy/config/secrets.yml +0 -32
  50. data/spec/dummy/package.json +0 -5
  51. data/spec/dummy/public/404.html +0 -67
  52. data/spec/dummy/public/422.html +0 -67
  53. data/spec/dummy/public/500.html +0 -66
  54. data/spec/dummy/public/apple-touch-icon-precomposed.png +0 -0
  55. data/spec/dummy/public/apple-touch-icon.png +0 -0
  56. data/spec/dummy/public/favicon.ico +0 -0
  57. data/spec/dummy/public/robots.txt +0 -1
  58. data/spec/dummy/test/application_system_test_case.rb +0 -6
  59. data/spec/dummy/test/system/action_cable_subscription_test.rb +0 -45
  60. data/spec/dummy/test/test_helper.rb +0 -4
  61. data/spec/fixtures/upgrader/account.original.rb +0 -19
  62. data/spec/fixtures/upgrader/account.transformed.rb +0 -20
  63. data/spec/fixtures/upgrader/blame_range.original.rb +0 -43
  64. data/spec/fixtures/upgrader/blame_range.transformed.rb +0 -30
  65. data/spec/fixtures/upgrader/date_time.original.rb +0 -24
  66. data/spec/fixtures/upgrader/date_time.transformed.rb +0 -23
  67. data/spec/fixtures/upgrader/delete_project.original.rb +0 -28
  68. data/spec/fixtures/upgrader/delete_project.transformed.rb +0 -27
  69. data/spec/fixtures/upgrader/gist_order_field.original.rb +0 -14
  70. data/spec/fixtures/upgrader/gist_order_field.transformed.rb +0 -13
  71. data/spec/fixtures/upgrader/increment_count.original.rb +0 -59
  72. data/spec/fixtures/upgrader/increment_count.transformed.rb +0 -50
  73. data/spec/fixtures/upgrader/mutation.original.rb +0 -28
  74. data/spec/fixtures/upgrader/mutation.transformed.rb +0 -28
  75. data/spec/fixtures/upgrader/photo.original.rb +0 -10
  76. data/spec/fixtures/upgrader/photo.transformed.rb +0 -12
  77. data/spec/fixtures/upgrader/release_order.original.rb +0 -15
  78. data/spec/fixtures/upgrader/release_order.transformed.rb +0 -14
  79. data/spec/fixtures/upgrader/starrable.original.rb +0 -49
  80. data/spec/fixtures/upgrader/starrable.transformed.rb +0 -46
  81. data/spec/fixtures/upgrader/subscribable.original.rb +0 -55
  82. data/spec/fixtures/upgrader/subscribable.transformed.rb +0 -51
  83. data/spec/fixtures/upgrader/type_x.original.rb +0 -65
  84. data/spec/fixtures/upgrader/type_x.transformed.rb +0 -56
  85. data/spec/graphql/analysis/analyze_query_spec.rb +0 -261
  86. data/spec/graphql/analysis/ast/field_usage_spec.rb +0 -51
  87. data/spec/graphql/analysis/ast/max_query_complexity_spec.rb +0 -120
  88. data/spec/graphql/analysis/ast/max_query_depth_spec.rb +0 -134
  89. data/spec/graphql/analysis/ast/query_complexity_spec.rb +0 -299
  90. data/spec/graphql/analysis/ast/query_depth_spec.rb +0 -108
  91. data/spec/graphql/analysis/ast_spec.rb +0 -296
  92. data/spec/graphql/analysis/field_usage_spec.rb +0 -62
  93. data/spec/graphql/analysis/max_query_complexity_spec.rb +0 -102
  94. data/spec/graphql/analysis/max_query_depth_spec.rb +0 -103
  95. data/spec/graphql/analysis/query_complexity_spec.rb +0 -301
  96. data/spec/graphql/analysis/query_depth_spec.rb +0 -81
  97. data/spec/graphql/argument_spec.rb +0 -159
  98. data/spec/graphql/authorization_spec.rb +0 -974
  99. data/spec/graphql/backtrace_spec.rb +0 -206
  100. data/spec/graphql/base_type_spec.rb +0 -171
  101. data/spec/graphql/boolean_type_spec.rb +0 -21
  102. data/spec/graphql/compatibility/execution_specification_spec.rb +0 -4
  103. data/spec/graphql/compatibility/lazy_execution_specification_spec.rb +0 -4
  104. data/spec/graphql/compatibility/query_parser_specification_spec.rb +0 -6
  105. data/spec/graphql/compatibility/schema_parser_specification_spec.rb +0 -6
  106. data/spec/graphql/define/assign_argument_spec.rb +0 -61
  107. data/spec/graphql/define/instance_definable_spec.rb +0 -203
  108. data/spec/graphql/directive/skip_directive_spec.rb +0 -9
  109. data/spec/graphql/directive_spec.rb +0 -295
  110. data/spec/graphql/enum_type_spec.rb +0 -158
  111. data/spec/graphql/execution/execute_spec.rb +0 -303
  112. data/spec/graphql/execution/instrumentation_spec.rb +0 -212
  113. data/spec/graphql/execution/interpreter_spec.rb +0 -485
  114. data/spec/graphql/execution/lazy/lazy_method_map_spec.rb +0 -57
  115. data/spec/graphql/execution/lazy_spec.rb +0 -247
  116. data/spec/graphql/execution/lookahead_spec.rb +0 -390
  117. data/spec/graphql/execution/multiplex_spec.rb +0 -222
  118. data/spec/graphql/execution/typecast_spec.rb +0 -47
  119. data/spec/graphql/execution_error_spec.rb +0 -329
  120. data/spec/graphql/field_spec.rb +0 -246
  121. data/spec/graphql/float_type_spec.rb +0 -16
  122. data/spec/graphql/function_spec.rb +0 -152
  123. data/spec/graphql/id_type_spec.rb +0 -33
  124. data/spec/graphql/input_object_type_spec.rb +0 -25
  125. data/spec/graphql/int_type_spec.rb +0 -35
  126. data/spec/graphql/interface_type_spec.rb +0 -196
  127. data/spec/graphql/internal_representation/print_spec.rb +0 -41
  128. data/spec/graphql/internal_representation/rewrite_spec.rb +0 -381
  129. data/spec/graphql/introspection/directive_type_spec.rb +0 -66
  130. data/spec/graphql/introspection/input_value_type_spec.rb +0 -144
  131. data/spec/graphql/introspection/introspection_query_spec.rb +0 -64
  132. data/spec/graphql/introspection/schema_type_spec.rb +0 -57
  133. data/spec/graphql/introspection/type_type_spec.rb +0 -155
  134. data/spec/graphql/language/block_string_spec.rb +0 -70
  135. data/spec/graphql/language/definition_slice_spec.rb +0 -226
  136. data/spec/graphql/language/document_from_schema_definition_spec.rb +0 -770
  137. data/spec/graphql/language/equality_spec.rb +0 -84
  138. data/spec/graphql/language/generation_spec.rb +0 -38
  139. data/spec/graphql/language/lexer_spec.rb +0 -153
  140. data/spec/graphql/language/nodes_spec.rb +0 -67
  141. data/spec/graphql/language/parser_spec.rb +0 -183
  142. data/spec/graphql/language/printer_spec.rb +0 -215
  143. data/spec/graphql/language/visitor_spec.rb +0 -419
  144. data/spec/graphql/list_type_spec.rb +0 -57
  145. data/spec/graphql/non_null_type_spec.rb +0 -48
  146. data/spec/graphql/object_type_spec.rb +0 -197
  147. data/spec/graphql/query/arguments_spec.rb +0 -346
  148. data/spec/graphql/query/context_spec.rb +0 -292
  149. data/spec/graphql/query/executor_spec.rb +0 -341
  150. data/spec/graphql/query/literal_input_spec.rb +0 -91
  151. data/spec/graphql/query/result_spec.rb +0 -29
  152. data/spec/graphql/query/serial_execution/value_resolution_spec.rb +0 -109
  153. data/spec/graphql/query_spec.rb +0 -803
  154. data/spec/graphql/rake_task_spec.rb +0 -59
  155. data/spec/graphql/scalar_type_spec.rb +0 -66
  156. data/spec/graphql/schema/argument_spec.rb +0 -186
  157. data/spec/graphql/schema/build_from_definition_spec.rb +0 -1197
  158. data/spec/graphql/schema/catchall_middleware_spec.rb +0 -32
  159. data/spec/graphql/schema/directive/feature_spec.rb +0 -81
  160. data/spec/graphql/schema/directive/transform_spec.rb +0 -39
  161. data/spec/graphql/schema/enum_spec.rb +0 -83
  162. data/spec/graphql/schema/enum_value_spec.rb +0 -24
  163. data/spec/graphql/schema/field_extension_spec.rb +0 -159
  164. data/spec/graphql/schema/field_spec.rb +0 -319
  165. data/spec/graphql/schema/finder_spec.rb +0 -135
  166. data/spec/graphql/schema/input_object_spec.rb +0 -421
  167. data/spec/graphql/schema/instrumentation_spec.rb +0 -43
  168. data/spec/graphql/schema/interface_spec.rb +0 -215
  169. data/spec/graphql/schema/introspection_system_spec.rb +0 -80
  170. data/spec/graphql/schema/list_spec.rb +0 -73
  171. data/spec/graphql/schema/loader_spec.rb +0 -350
  172. data/spec/graphql/schema/member/accepts_definition_spec.rb +0 -115
  173. data/spec/graphql/schema/member/build_type_spec.rb +0 -63
  174. data/spec/graphql/schema/member/scoped_spec.rb +0 -217
  175. data/spec/graphql/schema/member/type_system_helpers_spec.rb +0 -63
  176. data/spec/graphql/schema/middleware_chain_spec.rb +0 -57
  177. data/spec/graphql/schema/mutation_spec.rb +0 -150
  178. data/spec/graphql/schema/non_null_spec.rb +0 -46
  179. data/spec/graphql/schema/object_spec.rb +0 -355
  180. data/spec/graphql/schema/printer_spec.rb +0 -883
  181. data/spec/graphql/schema/relay_classic_mutation_spec.rb +0 -252
  182. data/spec/graphql/schema/rescue_middleware_spec.rb +0 -88
  183. data/spec/graphql/schema/resolver_spec.rb +0 -743
  184. data/spec/graphql/schema/scalar_spec.rb +0 -101
  185. data/spec/graphql/schema/subscription_spec.rb +0 -505
  186. data/spec/graphql/schema/timeout_middleware_spec.rb +0 -188
  187. data/spec/graphql/schema/timeout_spec.rb +0 -206
  188. data/spec/graphql/schema/traversal_spec.rb +0 -222
  189. data/spec/graphql/schema/type_expression_spec.rb +0 -39
  190. data/spec/graphql/schema/union_spec.rb +0 -72
  191. data/spec/graphql/schema/unique_within_type_spec.rb +0 -44
  192. data/spec/graphql/schema/validation_spec.rb +0 -355
  193. data/spec/graphql/schema/warden_spec.rb +0 -926
  194. data/spec/graphql/schema_spec.rb +0 -169
  195. data/spec/graphql/static_validation/rules/argument_literals_are_compatible_spec.rb +0 -466
  196. data/spec/graphql/static_validation/rules/argument_names_are_unique_spec.rb +0 -44
  197. data/spec/graphql/static_validation/rules/arguments_are_defined_spec.rb +0 -112
  198. data/spec/graphql/static_validation/rules/directives_are_defined_spec.rb +0 -35
  199. data/spec/graphql/static_validation/rules/directives_are_in_valid_locations_spec.rb +0 -42
  200. data/spec/graphql/static_validation/rules/fields_are_defined_on_type_spec.rb +0 -167
  201. data/spec/graphql/static_validation/rules/fields_have_appropriate_selections_spec.rb +0 -66
  202. data/spec/graphql/static_validation/rules/fields_will_merge_spec.rb +0 -740
  203. data/spec/graphql/static_validation/rules/fragment_names_are_unique_spec.rb +0 -28
  204. data/spec/graphql/static_validation/rules/fragment_spreads_are_possible_spec.rb +0 -52
  205. data/spec/graphql/static_validation/rules/fragment_types_exist_spec.rb +0 -42
  206. data/spec/graphql/static_validation/rules/fragments_are_finite_spec.rb +0 -123
  207. data/spec/graphql/static_validation/rules/fragments_are_named_spec.rb +0 -24
  208. data/spec/graphql/static_validation/rules/fragments_are_on_composite_types_spec.rb +0 -56
  209. data/spec/graphql/static_validation/rules/fragments_are_used_spec.rb +0 -61
  210. data/spec/graphql/static_validation/rules/mutation_root_exists_spec.rb +0 -39
  211. data/spec/graphql/static_validation/rules/no_definitions_are_present_spec.rb +0 -62
  212. data/spec/graphql/static_validation/rules/operation_names_are_valid_spec.rb +0 -82
  213. data/spec/graphql/static_validation/rules/required_arguments_are_present_spec.rb +0 -98
  214. data/spec/graphql/static_validation/rules/required_input_object_attributes_are_present_spec.rb +0 -86
  215. data/spec/graphql/static_validation/rules/subscription_root_exists_spec.rb +0 -34
  216. data/spec/graphql/static_validation/rules/unique_directives_per_location_spec.rb +0 -188
  217. data/spec/graphql/static_validation/rules/variable_default_values_are_correctly_typed_spec.rb +0 -196
  218. data/spec/graphql/static_validation/rules/variable_names_are_unique_spec.rb +0 -23
  219. data/spec/graphql/static_validation/rules/variable_usages_are_allowed_spec.rb +0 -236
  220. data/spec/graphql/static_validation/rules/variables_are_input_types_spec.rb +0 -78
  221. data/spec/graphql/static_validation/rules/variables_are_used_and_defined_spec.rb +0 -81
  222. data/spec/graphql/static_validation/type_stack_spec.rb +0 -29
  223. data/spec/graphql/static_validation/validator_spec.rb +0 -204
  224. data/spec/graphql/string_type_spec.rb +0 -80
  225. data/spec/graphql/subscriptions/serialize_spec.rb +0 -49
  226. data/spec/graphql/subscriptions_spec.rb +0 -540
  227. data/spec/graphql/tracing/new_relic_tracing_spec.rb +0 -84
  228. data/spec/graphql/tracing/platform_tracing_spec.rb +0 -141
  229. data/spec/graphql/tracing/prometheus_tracing_spec.rb +0 -42
  230. data/spec/graphql/tracing/scout_tracing_spec.rb +0 -17
  231. data/spec/graphql/tracing/skylight_tracing_spec.rb +0 -63
  232. data/spec/graphql/tracing_spec.rb +0 -52
  233. data/spec/graphql/types/big_int_spec.rb +0 -24
  234. data/spec/graphql/types/iso_8601_date_time_spec.rb +0 -137
  235. data/spec/graphql/types/relay/base_edge_spec.rb +0 -33
  236. data/spec/graphql/union_type_spec.rb +0 -211
  237. data/spec/graphql/upgrader/member_spec.rb +0 -583
  238. data/spec/graphql/upgrader/schema_spec.rb +0 -82
  239. data/spec/integration/mongoid/graphql/relay/mongo_relation_connection_spec.rb +0 -528
  240. data/spec/integration/mongoid/spec_helper.rb +0 -2
  241. data/spec/integration/mongoid/star_trek/data.rb +0 -126
  242. data/spec/integration/mongoid/star_trek/schema.rb +0 -424
  243. data/spec/integration/rails/data.rb +0 -110
  244. data/spec/integration/rails/generators/base_generator_test.rb +0 -7
  245. data/spec/integration/rails/generators/graphql/enum_generator_spec.rb +0 -30
  246. data/spec/integration/rails/generators/graphql/install_generator_spec.rb +0 -238
  247. data/spec/integration/rails/generators/graphql/interface_generator_spec.rb +0 -34
  248. data/spec/integration/rails/generators/graphql/loader_generator_spec.rb +0 -59
  249. data/spec/integration/rails/generators/graphql/mutation_generator_spec.rb +0 -71
  250. data/spec/integration/rails/generators/graphql/object_generator_spec.rb +0 -54
  251. data/spec/integration/rails/generators/graphql/scalar_generator_spec.rb +0 -28
  252. data/spec/integration/rails/generators/graphql/union_generator_spec.rb +0 -67
  253. data/spec/integration/rails/graphql/input_object_spec.rb +0 -19
  254. data/spec/integration/rails/graphql/input_object_type_spec.rb +0 -364
  255. data/spec/integration/rails/graphql/query/variables_spec.rb +0 -375
  256. data/spec/integration/rails/graphql/relay/array_connection_spec.rb +0 -309
  257. data/spec/integration/rails/graphql/relay/base_connection_spec.rb +0 -101
  258. data/spec/integration/rails/graphql/relay/connection_instrumentation_spec.rb +0 -80
  259. data/spec/integration/rails/graphql/relay/connection_resolve_spec.rb +0 -79
  260. data/spec/integration/rails/graphql/relay/connection_type_spec.rb +0 -106
  261. data/spec/integration/rails/graphql/relay/edge_spec.rb +0 -10
  262. data/spec/integration/rails/graphql/relay/mutation_spec.rb +0 -387
  263. data/spec/integration/rails/graphql/relay/node_spec.rb +0 -263
  264. data/spec/integration/rails/graphql/relay/page_info_spec.rb +0 -111
  265. data/spec/integration/rails/graphql/relay/range_add_spec.rb +0 -117
  266. data/spec/integration/rails/graphql/relay/relation_connection_spec.rb +0 -837
  267. data/spec/integration/rails/graphql/schema_spec.rb +0 -507
  268. data/spec/integration/rails/graphql/tracing/active_support_notifications_tracing_spec.rb +0 -62
  269. data/spec/integration/rails/spec_helper.rb +0 -25
  270. data/spec/spec_helper.rb +0 -116
  271. data/spec/support/dummy/data.rb +0 -45
  272. data/spec/support/dummy/schema.rb +0 -519
  273. data/spec/support/error_bubbling_helpers.rb +0 -23
  274. data/spec/support/global_id.rb +0 -23
  275. data/spec/support/jazz.rb +0 -778
  276. data/spec/support/lazy_helpers.rb +0 -192
  277. data/spec/support/magic_cards/schema.graphql +0 -33
  278. data/spec/support/minimum_input_object.rb +0 -21
  279. data/spec/support/new_relic.rb +0 -27
  280. data/spec/support/parser/filename_example.graphql +0 -5
  281. data/spec/support/parser/filename_example_error_1.graphql +0 -4
  282. data/spec/support/parser/filename_example_error_2.graphql +0 -5
  283. data/spec/support/parser/filename_example_invalid_utf8.graphql +0 -1
  284. data/spec/support/skylight.rb +0 -39
  285. data/spec/support/star_wars/schema.rb +0 -464
  286. data/spec/support/static_validation_helpers.rb +0 -32
@@ -1,23 +0,0 @@
1
- # frozen_string_literal: true
2
- # helpers to enable / disable error bubbling in a block scope
3
- module ErrorBubblingHelpers
4
- def without_error_bubbling(schema)
5
- original_error_bubbling = schema.error_bubbling
6
- begin
7
- schema.error_bubbling = false
8
- yield if block_given?
9
- ensure
10
- schema.error_bubbling = original_error_bubbling
11
- end
12
- end
13
-
14
- def with_error_bubbling(schema)
15
- original_error_bubbling = schema.error_bubbling
16
- begin
17
- schema.error_bubbling = true
18
- yield if block_given?
19
- ensure
20
- schema.error_bubbling = original_error_bubbling
21
- end
22
- end
23
- end
@@ -1,23 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- if defined?(GlobalID)
4
- GlobalID.app = "graphql-ruby-test"
5
-
6
- class GlobalIDUser
7
- include GlobalID::Identification
8
-
9
- attr_reader :id
10
-
11
- def initialize(id)
12
- @id = id
13
- end
14
-
15
- def self.find(id)
16
- GlobalIDUser.new(id)
17
- end
18
-
19
- def ==(that)
20
- self.id == that.id
21
- end
22
- end
23
- end
@@ -1,778 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # Here's the "application"
4
- module Jazz
5
- module Models
6
- Instrument = Struct.new(:name, :family)
7
- Ensemble = Struct.new(:name)
8
- Musician = Struct.new(:name, :favorite_key)
9
- Key = Struct.new(:root, :sharp, :flat) do
10
- def self.from_notation(key_str)
11
- key, sharp_or_flat = key_str.split("")
12
- sharp = sharp_or_flat == "♯"
13
- flat = sharp_or_flat == "♭"
14
- Models::Key.new(key, sharp, flat)
15
- end
16
-
17
- def to_notation
18
- "#{root}#{sharp ? "♯" : ""}#{flat ? "♭" : ""}"
19
- end
20
- end
21
-
22
- def self.reset
23
- @data = {
24
- "Instrument" => [
25
- Models::Instrument.new("Banjo", :str),
26
- Models::Instrument.new("Flute", "WOODWIND"),
27
- Models::Instrument.new("Trumpet", "BRASS"),
28
- Models::Instrument.new("Piano", "KEYS"),
29
- Models::Instrument.new("Organ", "KEYS"),
30
- Models::Instrument.new("Drum Kit", "PERCUSSION"),
31
- ],
32
- "Ensemble" => [
33
- Models::Ensemble.new("Bela Fleck and the Flecktones"),
34
- Models::Ensemble.new("Robert Glasper Experiment"),
35
- Models::Ensemble.new("Spinal Tap"),
36
- ],
37
- "Musician" => [
38
- Models::Musician.new("Herbie Hancock", Models::Key.from_notation("B♭")),
39
- ],
40
- }
41
- end
42
-
43
- def self.data
44
- @data || reset
45
- end
46
- end
47
-
48
- class BaseArgument < GraphQL::Schema::Argument
49
- def initialize(*args, custom: nil, **kwargs)
50
- @custom = custom
51
- super(*args, **kwargs)
52
- end
53
-
54
- def to_graphql
55
- arg_defn = super
56
- arg_defn.metadata[:custom] = @custom
57
- arg_defn
58
- end
59
- end
60
-
61
- # A custom field class that supports the `upcase:` option
62
- class BaseField < GraphQL::Schema::Field
63
- argument_class BaseArgument
64
- attr_reader :upcase
65
-
66
- def initialize(*args, **options, &block)
67
- @upcase = options.delete(:upcase)
68
- super(*args, **options, &block)
69
- end
70
-
71
- def resolve_field(*)
72
- result = super
73
- if @upcase && result
74
- result.upcase
75
- else
76
- result
77
- end
78
- end
79
-
80
- def resolve(*)
81
- result = super
82
- if @upcase && result
83
- result.upcase
84
- else
85
- result
86
- end
87
- end
88
- end
89
-
90
- class BaseObject < GraphQL::Schema::Object
91
- # Use this overridden field class
92
- field_class BaseField
93
-
94
- class << self
95
- def config(key, value)
96
- configs[key] = value
97
- end
98
-
99
- def configs
100
- @configs ||= {}
101
- end
102
-
103
- def to_graphql
104
- type_defn = super
105
- configs.each do |k, v|
106
- type_defn.metadata[k] = v
107
- end
108
- type_defn
109
- end
110
- end
111
- end
112
-
113
- module BaseInterface
114
- include GraphQL::Schema::Interface
115
- # Use this overridden field class
116
- field_class BaseField
117
-
118
- # These methods are available to child interfaces
119
- definition_methods do
120
- def upcased_field(*args, **kwargs, &block)
121
- field(*args, upcase: true, **kwargs, &block)
122
- end
123
- end
124
- end
125
-
126
- class BaseEnumValue < GraphQL::Schema::EnumValue
127
- def initialize(*args, custom_setting: nil, **kwargs, &block)
128
- @custom_setting = custom_setting
129
- super(*args, **kwargs, &block)
130
- end
131
-
132
- def to_graphql
133
- enum_value_defn = super
134
- enum_value_defn.metadata[:custom_setting] = @custom_setting
135
- enum_value_defn
136
- end
137
- end
138
-
139
- class BaseEnum < GraphQL::Schema::Enum
140
- enum_value_class BaseEnumValue
141
- end
142
-
143
- # Some arbitrary global ID scheme
144
- # *Type suffix is removed automatically
145
- module GloballyIdentifiableType
146
- include BaseInterface
147
- description "A fetchable object in the system"
148
- field(
149
- name: :id,
150
- type: ID,
151
- null: false,
152
- description: "A unique identifier for this object",
153
- )
154
- upcased_field :upcased_id, ID, null: false, resolver_method: :id # upcase: true added by helper
155
-
156
- def id
157
- GloballyIdentifiableType.to_id(@object)
158
- end
159
-
160
- def self.to_id(object)
161
- "#{object.class.name.split("::").last}/#{object.name}"
162
- end
163
-
164
- def self.find(id)
165
- class_name, object_name = id.split("/")
166
- Models.data[class_name].find { |obj| obj.name == object_name }
167
- end
168
- end
169
-
170
- module NamedEntity
171
- include BaseInterface
172
- field :name, String, null: false
173
- end
174
-
175
- # test field inheritance
176
- class ObjectWithUpcasedName < BaseObject
177
- # Test extra arguments:
178
- field :upcase_name, String, null: false, upcase: true
179
-
180
- def upcase_name
181
- object.name # upcase is applied by the superclass
182
- end
183
- end
184
-
185
- module HasMusicians
186
- include BaseInterface
187
- field :musicians, "[Jazz::Musician]", null: false
188
- end
189
-
190
- # Here's a new-style GraphQL type definition
191
- class Ensemble < ObjectWithUpcasedName
192
- # Test string type names
193
- # This method should override inherited one
194
- field :name, "String", null: false, resolver_method: :overridden_name
195
- implements GloballyIdentifiableType, NamedEntity, HasMusicians
196
- description "A group of musicians playing together"
197
- config :config, :configged
198
- field :formed_at, String, null: true, hash_key: "formedAtDate"
199
-
200
- def overridden_name
201
- @object.name.sub("Robert Glasper", "ROBERT GLASPER")
202
- end
203
-
204
- def self.authorized?(object, context)
205
- # Spinal Tap is top-secret, don't show it to anyone.
206
- obj_name = object.is_a?(Hash) ? object[:name] : object.name
207
- obj_name != "Spinal Tap"
208
- end
209
- end
210
-
211
- class Family < BaseEnum
212
- description "Groups of musical instruments"
213
- # support string and symbol
214
- value "STRING", "Makes a sound by vibrating strings", value: :str, custom_setting: 1
215
- value :WOODWIND, "Makes a sound by vibrating air in a pipe"
216
- value :BRASS, "Makes a sound by amplifying the sound of buzzing lips"
217
- value "PERCUSSION", "Makes a sound by hitting something that vibrates"
218
- value "DIDGERIDOO", "Makes a sound by amplifying the sound of buzzing lips", deprecation_reason: "Merged into BRASS"
219
- value "KEYS" do
220
- description "Neither here nor there, really"
221
- end
222
- value "SILENCE", "Makes no sound", value: false
223
- end
224
-
225
- # Lives side-by-side with an old-style definition
226
- using GraphQL::DeprecatedDSL # for ! and types[]
227
-
228
- class InstrumentType < BaseObject
229
- implements NamedEntity
230
- implements GloballyIdentifiableType
231
-
232
- field :upcased_id, ID, null: false
233
-
234
- def upcased_id
235
- GloballyIdentifiableType.to_id(object).upcase
236
- end
237
-
238
- field :family, Family, null: false
239
- end
240
-
241
- class Key < GraphQL::Schema::Scalar
242
- description "A musical key"
243
- def self.coerce_input(val, ctx)
244
- Models::Key.from_notation(val)
245
- end
246
-
247
- def self.coerce_result(val, ctx)
248
- val.to_notation
249
- end
250
- end
251
-
252
- class Musician < BaseObject
253
- implements GloballyIdentifiableType
254
- implements NamedEntity
255
- description "Someone who plays an instrument"
256
- field :instrument, InstrumentType, null: false do
257
- description "An object played in order to produce music"
258
- end
259
- field :favorite_key, Key, null: true
260
- # Test lists with nullable members:
261
- field :inspect_context, [String, null: true], null: false
262
- field :add_error, String, null: false, extras: [:execution_errors]
263
-
264
- def inspect_context
265
- [
266
- @context.custom_method,
267
- @context[:magic_key],
268
- @context[:normal_key],
269
- nil,
270
- ]
271
- end
272
-
273
- def add_error(execution_errors:)
274
- execution_errors.add("this has a path")
275
- "done"
276
- end
277
- end
278
-
279
- # Since this is not a legacy input type, this test can be removed
280
- class LegacyInputType < GraphQL::Schema::InputObject
281
- argument :int_value, Int, required: true
282
- end
283
-
284
- class InspectableInput < GraphQL::Schema::InputObject
285
- argument :ensemble_id, ID, required: false, loads: Ensemble
286
- argument :string_value, String, required: true, description: "Test description kwarg"
287
- argument :nested_input, InspectableInput, required: false
288
- argument :legacy_input, LegacyInputType, required: false
289
-
290
- def helper_method
291
- [
292
- # Context is available in the InputObject
293
- context[:message],
294
- # ~~A GraphQL::Query::Arguments instance is available~~ not anymore
295
- self[:string_value],
296
- # Legacy inputs have underscored method access too
297
- legacy_input ? legacy_input.int_value : "-",
298
- # Access by method call is available
299
- "(#{nested_input ? nested_input.helper_method : "-"})",
300
- ].join(", ")
301
- end
302
- end
303
-
304
- class InspectableKey < BaseObject
305
- field :root, String, null: false
306
- field :is_sharp, Boolean, null: false, method: :sharp
307
- field :is_flat, Boolean, null: false, method: :flat
308
- end
309
-
310
- class PerformingAct < GraphQL::Schema::Union
311
- possible_types Musician, Ensemble
312
-
313
- def self.resolve_type(object, context)
314
- GraphQL::Execution::Lazy.new do
315
- if object.is_a?(Models::Ensemble)
316
- Ensemble
317
- else
318
- Musician
319
- end
320
- end
321
- end
322
- end
323
-
324
- class HashKeyTest < BaseObject
325
- field :falsey, Boolean, null: false
326
- end
327
-
328
- # Another new-style definition, with method overrides
329
- class Query < BaseObject
330
- field :ensembles, [Ensemble], null: false
331
- field :find, GloballyIdentifiableType, null: true do
332
- argument :id, ID, required: true
333
- end
334
- field :instruments, [InstrumentType], null: false do
335
- argument :family, Family, required: false
336
- end
337
- field :inspect_input, [String], null: false do
338
- argument :input, InspectableInput, required: true, custom: :ok
339
- end
340
- field :inspect_key, InspectableKey, null: false do
341
- argument :key, Key, required: true
342
- end
343
- field :now_playing, PerformingAct, null: false
344
-
345
- def now_playing; Models.data["Ensemble"].first; end
346
-
347
- # For asserting that the object is initialized once:
348
- field :object_id, String, null: false
349
- field :inspect_context, [String], null: false
350
- field :hashyEnsemble, Ensemble, null: false
351
-
352
- field :echo_json, GraphQL::Types::JSON, null: false do
353
- argument :input, GraphQL::Types::JSON, required: true
354
- end
355
-
356
- field :echo_first_json, GraphQL::Types::JSON, null: false do
357
- argument :input, [GraphQL::Types::JSON], required: true
358
- end
359
-
360
- field :upcase_check_1, String, null: true, resolver_method: :upcase_check, extras: [:upcase]
361
- field :upcase_check_2, String, null: false, upcase: false, resolver_method: :upcase_check, extras: [:upcase]
362
- field :upcase_check_3, String, null: false, upcase: true, resolver_method: :upcase_check, extras: [:upcase]
363
- field :upcase_check_4, String, null: false, upcase: "why not?", resolver_method: :upcase_check, extras: [:upcase]
364
- def upcase_check(upcase:)
365
- upcase.inspect
366
- end
367
-
368
- def ensembles
369
- # Filter out the unauthorized one to avoid an error later
370
- Models.data["Ensemble"].select { |e| e.name != "Spinal Tap" }
371
- end
372
-
373
- def find(id:)
374
- if id == "MagicalSkipId"
375
- context.skip
376
- else
377
- GloballyIdentifiableType.find(id)
378
- end
379
- end
380
-
381
- def instruments(family: nil)
382
- objs = Models.data["Instrument"]
383
- if family
384
- objs = objs.select { |i| i.family == family }
385
- end
386
- objs
387
- end
388
-
389
- # This is for testing input object behavior
390
- def inspect_input(input:)
391
- [
392
- input.class.name,
393
- input.helper_method,
394
- # Access by method
395
- input.string_value,
396
- # Access by key:
397
- input[:string_value],
398
- input.key?(:string_value).to_s,
399
- # ~~Access by legacy key~~ # not anymore
400
- input[:string_value],
401
- input.ensemble,
402
- input.key?(:ensemble).to_s,
403
- ]
404
- end
405
-
406
- def inspect_key(key:)
407
- key
408
- end
409
-
410
- def inspect_context
411
- [
412
- context.custom_method,
413
- context[:magic_key],
414
- context[:normal_key],
415
- ]
416
- end
417
-
418
- def hashy_ensemble
419
- # Both string and symbol keys are supported:
420
-
421
- {
422
- name: "The Grateful Dead",
423
- "musicians" => [
424
- OpenStruct.new(name: "Jerry Garcia"),
425
- ],
426
- "formedAtDate" => "May 5, 1965",
427
- }
428
- end
429
-
430
- def echo_json(input:)
431
- input
432
- end
433
-
434
- def echo_first_json(input:)
435
- input.first
436
- end
437
-
438
- field :hash_by_string, HashKeyTest, null: false
439
- field :hash_by_sym, HashKeyTest, null: false
440
-
441
- def hash_by_string
442
- {"falsey" => false}
443
- end
444
-
445
- def hash_by_sym
446
- {falsey: false}
447
- end
448
-
449
- field :named_entities, [NamedEntity, null: true], null: false
450
-
451
- def named_entities
452
- [Models.data["Ensemble"].first, nil]
453
- end
454
-
455
- field :default_value_test, String, null: false do
456
- if TESTING_INTERPRETER
457
- argument :arg_with_default, InspectableInput, required: false, default_value: { string_value: "S" }
458
- else
459
- argument :arg_with_default, InspectableInput, required: false, default_value: { "stringValue" => "S" }
460
- end
461
- end
462
-
463
- def default_value_test(arg_with_default:)
464
- "#{arg_with_default.class.name} -> #{arg_with_default.to_h}"
465
- end
466
-
467
- field :complex_hash_key, String, null: false, hash_key: :'foo bar/fizz-buzz'
468
- end
469
-
470
- class EnsembleInput < GraphQL::Schema::InputObject
471
- argument :name, String, required: true
472
- end
473
-
474
- class AddInstrument < GraphQL::Schema::Mutation
475
- null true
476
- description "Register a new musical instrument in the database"
477
-
478
- argument :name, String, required: true
479
- argument :family, Family, required: true
480
-
481
- field :instrument, InstrumentType, null: false
482
- # This is meaningless, but it's to test the conflict with `Hash#entries`
483
- field :entries, [InstrumentType], null: false
484
- # Test `extras` injection
485
-
486
- field :ee, String, null: false
487
- extras [:execution_errors]
488
-
489
- def resolve(name:, family:, execution_errors:)
490
- instrument = Jazz::Models::Instrument.new(name, family)
491
- Jazz::Models.data["Instrument"] << instrument
492
- {instrument: instrument, entries: Jazz::Models.data["Instrument"], ee: execution_errors.class.name}
493
- end
494
- end
495
-
496
- class AddEnsembleRelay < GraphQL::Schema::RelayClassicMutation
497
- argument :ensemble, EnsembleInput, required: true
498
- field :ensemble, Ensemble, null: false
499
-
500
- def resolve(ensemble:)
501
- ens = Models::Ensemble.new(ensemble.name)
502
- Models.data["Ensemble"] << ens
503
- { ensemble: ens }
504
- end
505
- end
506
-
507
- class AddSitar < GraphQL::Schema::RelayClassicMutation
508
- null true
509
- description "Get Sitar to musical instrument"
510
-
511
- field :instrument, InstrumentType, null: false
512
-
513
- def resolve
514
- instrument = Models::Instrument.new("Sitar", :str)
515
- {instrument: instrument}
516
- end
517
- end
518
-
519
- class HasExtras < GraphQL::Schema::RelayClassicMutation
520
- null true
521
- description "Test extras in RelayClassicMutation"
522
-
523
- argument :int, Integer, required: false
524
- extras [:ast_node]
525
-
526
- field :node_class, String, null: false
527
- field :int, Integer, null: true
528
-
529
- def resolve(int: nil, ast_node:)
530
- {
531
- int: int,
532
- node_class: ast_node.class.name,
533
- }
534
- end
535
- end
536
-
537
- class RenameNamedEntity < GraphQL::Schema::RelayClassicMutation
538
- argument :named_entity_id, ID, required: true, loads: NamedEntity
539
- argument :new_name, String, required: true
540
-
541
- field :named_entity, NamedEntity, null: false
542
-
543
- def resolve(named_entity:, new_name:)
544
- # doesn't actually update the "database"
545
- dup_named_entity = named_entity.dup
546
- dup_named_entity.name = new_name
547
-
548
- {
549
- named_entity: dup_named_entity
550
- }
551
- end
552
- end
553
-
554
- class RenamePerformingAct < GraphQL::Schema::RelayClassicMutation
555
- argument :performing_act_id, ID, required: true, loads: PerformingAct
556
- argument :new_name, String, required: true
557
-
558
- field :performing_act, PerformingAct, null: false
559
-
560
- def resolve(performing_act:, new_name:)
561
- # doesn't actually update the "database"
562
- dup_performing_act = performing_act.dup
563
- dup_performing_act.name = new_name
564
-
565
- {
566
- performing_act: dup_performing_act
567
- }
568
- end
569
- end
570
-
571
- class RenameEnsemble < GraphQL::Schema::RelayClassicMutation
572
- argument :ensemble_id, ID, required: true, loads: Ensemble
573
- argument :new_name, String, required: true
574
-
575
- field :ensemble, Ensemble, null: false
576
-
577
- def resolve(ensemble:, new_name:)
578
- # doesn't actually update the "database"
579
- dup_ensemble = ensemble.dup
580
- dup_ensemble.name = new_name
581
- {
582
- ensemble: dup_ensemble,
583
- }
584
- end
585
- end
586
-
587
- class UpvoteEnsembles < GraphQL::Schema::RelayClassicMutation
588
- argument :ensemble_ids, [ID], required: true, loads: Ensemble
589
-
590
- field :ensembles, [Ensemble], null: false
591
-
592
- def resolve(ensembles:)
593
- {
594
- ensembles: ensembles
595
- }
596
- end
597
- end
598
-
599
- class UpvoteEnsemblesAsBands < GraphQL::Schema::RelayClassicMutation
600
- argument :ensemble_ids, [ID], required: true, loads: Ensemble, as: :bands
601
-
602
- field :ensembles, [Ensemble], null: false
603
-
604
- def resolve(bands:)
605
- {
606
- ensembles: bands
607
- }
608
- end
609
- end
610
-
611
- class UpvoteEnsemblesIds < GraphQL::Schema::RelayClassicMutation
612
- argument :ensembles_ids, [ID], required: true, loads: Ensemble
613
-
614
- field :ensembles, [Ensemble], null: false
615
-
616
- def resolve(ensembles:)
617
- {
618
- ensembles: ensembles
619
- }
620
- end
621
- end
622
-
623
- class RenameEnsembleAsBand < RenameEnsemble
624
- argument :ensemble_id, ID, required: true, loads: Ensemble, as: :band
625
-
626
- def resolve(band:, new_name:)
627
- super(ensemble: band, new_name: new_name)
628
- end
629
- end
630
-
631
- class Mutation < BaseObject
632
- field :add_ensemble, Ensemble, null: false do
633
- argument :input, EnsembleInput, required: true
634
- end
635
-
636
- field :add_instrument, mutation: AddInstrument
637
- field :add_ensemble_relay, mutation: AddEnsembleRelay
638
- field :add_sitar, mutation: AddSitar
639
- field :rename_ensemble, mutation: RenameEnsemble
640
- field :rename_named_entity, mutation: RenameNamedEntity
641
- field :rename_performing_act, mutation: RenamePerformingAct
642
- field :upvote_ensembles, mutation: UpvoteEnsembles
643
- field :upvote_ensembles_as_bands, mutation: UpvoteEnsemblesAsBands
644
- field :upvote_ensembles_ids, mutation: UpvoteEnsemblesIds
645
- field :rename_ensemble_as_band, mutation: RenameEnsembleAsBand
646
- field :has_extras, mutation: HasExtras
647
-
648
- def add_ensemble(input:)
649
- ens = Models::Ensemble.new(input.name)
650
- Models.data["Ensemble"] << ens
651
- ens
652
- end
653
-
654
- field :prepare_input, Integer, null: false do
655
- argument :input, Integer, required: true, prepare: :square, as: :squared_input
656
- end
657
-
658
- def prepare_input(squared_input:)
659
- # Test that `square` is called
660
- squared_input
661
- end
662
-
663
- def square(value)
664
- value ** 2
665
- end
666
- end
667
-
668
- class MetadataPlugin
669
- def self.use(schema_defn, value:)
670
- schema_defn.target.metadata[:plugin_key] = value
671
- end
672
- end
673
-
674
- class CustomContext < GraphQL::Query::Context
675
- def [](key)
676
- if key == :magic_key
677
- "magic_value"
678
- else
679
- super
680
- end
681
- end
682
-
683
- def custom_method
684
- "custom_method"
685
- end
686
- end
687
-
688
- module Introspection
689
- class TypeType < GraphQL::Introspection::TypeType
690
- def self.authorized?(_obj, ctx)
691
- if ctx[:cant_introspect]
692
- raise GraphQL::ExecutionError, "You're not allowed to introspect here"
693
- else
694
- super
695
- end
696
- end
697
-
698
- def name
699
- n = object.graphql_name
700
- n && n.upcase
701
- end
702
- end
703
-
704
- class NestedType < GraphQL::Introspection::TypeType
705
- def name
706
- object.name.upcase
707
- end
708
-
709
- class DeeplyNestedType < GraphQL::Introspection::TypeType
710
- def name
711
- object.name.upcase
712
- end
713
- end
714
- end
715
-
716
- class SchemaType < GraphQL::Introspection::SchemaType
717
- graphql_name "__Schema"
718
-
719
- field :is_jazzy, Boolean, null: false
720
-
721
- def is_jazzy
722
- true
723
- end
724
- end
725
-
726
- class DynamicFields < GraphQL::Introspection::DynamicFields
727
- field :__typename_length, Int, null: false, extras: [:irep_node]
728
- field :__ast_node_class, String, null: false, extras: [:ast_node]
729
-
730
- def __typename_length(irep_node: nil)
731
- __typename(irep_node: irep_node).length
732
- end
733
-
734
- def __ast_node_class(ast_node:)
735
- ast_node.class.name
736
- end
737
- end
738
-
739
- class EntryPoints < GraphQL::Introspection::EntryPoints
740
- field :__classname, String, "The Ruby class name of the root object", null: false
741
-
742
- def __classname
743
- if context.interpreter?
744
- object.object.class.name
745
- else
746
- object.class.name
747
- end
748
- end
749
- end
750
- end
751
-
752
- # New-style Schema definition
753
- class Schema < GraphQL::Schema
754
- query(Query)
755
- mutation(Mutation)
756
- context_class CustomContext
757
- introspection(Introspection)
758
- use MetadataPlugin, value: "xyz"
759
- def self.resolve_type(type, obj, ctx)
760
- class_name = obj.class.name.split("::").last
761
- ctx.schema.types[class_name] || raise("No type for #{obj.inspect}")
762
- end
763
-
764
- def self.object_from_id(id, ctx)
765
- GloballyIdentifiableType.find(id)
766
- end
767
- if TESTING_INTERPRETER
768
- use GraphQL::Execution::Interpreter
769
- use GraphQL::Analysis::AST
770
- end
771
- end
772
-
773
- class SchemaWithoutIntrospection < GraphQL::Schema
774
- query(Query)
775
-
776
- disable_introspection_entry_points
777
- end
778
- end