graphql 1.8.0.pre9 → 1.8.0.pre10

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 (59) hide show
  1. checksums.yaml +4 -4
  2. data/lib/graphql/argument.rb +1 -0
  3. data/lib/graphql/base_type.rb +2 -0
  4. data/lib/graphql/compatibility/query_parser_specification.rb +110 -0
  5. data/lib/graphql/deprecated_dsl.rb +15 -3
  6. data/lib/graphql/directive.rb +1 -0
  7. data/lib/graphql/enum_type.rb +2 -0
  8. data/lib/graphql/execution/multiplex.rb +1 -1
  9. data/lib/graphql/field.rb +2 -0
  10. data/lib/graphql/introspection/entry_points.rb +2 -2
  11. data/lib/graphql/introspection/schema_field.rb +1 -1
  12. data/lib/graphql/introspection/type_by_name_field.rb +1 -1
  13. data/lib/graphql/language/parser.rb +25 -25
  14. data/lib/graphql/language/parser.y +7 -7
  15. data/lib/graphql/query/arguments.rb +12 -0
  16. data/lib/graphql/relay/mutation/instrumentation.rb +1 -1
  17. data/lib/graphql/relay/mutation/resolve.rb +5 -1
  18. data/lib/graphql/schema.rb +5 -1
  19. data/lib/graphql/schema/argument.rb +1 -0
  20. data/lib/graphql/schema/build_from_definition.rb +60 -18
  21. data/lib/graphql/schema/enum.rb +1 -0
  22. data/lib/graphql/schema/enum_value.rb +1 -0
  23. data/lib/graphql/schema/field.rb +44 -31
  24. data/lib/graphql/schema/field/dynamic_resolve.rb +4 -8
  25. data/lib/graphql/schema/input_object.rb +30 -19
  26. data/lib/graphql/schema/interface.rb +12 -5
  27. data/lib/graphql/schema/member.rb +10 -0
  28. data/lib/graphql/schema/member/build_type.rb +3 -1
  29. data/lib/graphql/schema/member/has_arguments.rb +50 -0
  30. data/lib/graphql/schema/member/has_fields.rb +1 -1
  31. data/lib/graphql/schema/member/instrumentation.rb +4 -4
  32. data/lib/graphql/schema/mutation.rb +195 -0
  33. data/lib/graphql/schema/object.rb +4 -5
  34. data/lib/graphql/schema/relay_classic_mutation.rb +85 -0
  35. data/lib/graphql/schema/scalar.rb +1 -0
  36. data/lib/graphql/schema/traversal.rb +1 -1
  37. data/lib/graphql/schema/union.rb +1 -0
  38. data/lib/graphql/subscriptions/action_cable_subscriptions.rb +1 -1
  39. data/lib/graphql/unresolved_type_error.rb +3 -2
  40. data/lib/graphql/upgrader/member.rb +194 -19
  41. data/lib/graphql/version.rb +1 -1
  42. data/spec/fixtures/upgrader/delete_project.original.rb +28 -0
  43. data/spec/fixtures/upgrader/delete_project.transformed.rb +27 -0
  44. data/spec/fixtures/upgrader/increment_count.original.rb +59 -0
  45. data/spec/fixtures/upgrader/increment_count.transformed.rb +50 -0
  46. data/spec/graphql/execution/multiplex_spec.rb +1 -1
  47. data/spec/graphql/language/parser_spec.rb +0 -74
  48. data/spec/graphql/query/serial_execution/value_resolution_spec.rb +2 -8
  49. data/spec/graphql/query_spec.rb +26 -0
  50. data/spec/graphql/relay/mutation_spec.rb +2 -2
  51. data/spec/graphql/schema/build_from_definition_spec.rb +59 -0
  52. data/spec/graphql/schema/field_spec.rb +24 -0
  53. data/spec/graphql/schema/input_object_spec.rb +1 -0
  54. data/spec/graphql/schema/interface_spec.rb +4 -1
  55. data/spec/graphql/schema/mutation_spec.rb +99 -0
  56. data/spec/graphql/schema/relay_classic_mutation_spec.rb +28 -0
  57. data/spec/support/jazz.rb +25 -1
  58. data/spec/support/star_wars/schema.rb +17 -27
  59. metadata +17 -2
@@ -11,6 +11,10 @@ describe GraphQL::Schema::Interface do
11
11
  end
12
12
 
13
13
  class NewInterface1 < Jazz::GloballyIdentifiableType
14
+ # TODO not great
15
+ module Implementation
16
+ include Jazz::GloballyIdentifiableType::Implementation
17
+ end
14
18
  end
15
19
 
16
20
  class NewInterface2 < Jazz::GloballyIdentifiableType
@@ -21,7 +25,6 @@ describe GraphQL::Schema::Interface do
21
25
  end
22
26
 
23
27
  it "can override Implementation" do
24
-
25
28
  new_object_1 = Class.new(GraphQL::Schema::Object) do
26
29
  implements NewInterface1
27
30
  end
@@ -0,0 +1,99 @@
1
+ # frozen_string_literal: true
2
+ require "spec_helper"
3
+
4
+ # Make sure that `!` has no effect
5
+ using GraphQL::DeprecatedDSL
6
+
7
+ describe GraphQL::Schema::Mutation do
8
+ let(:mutation) { Jazz::AddInstrument }
9
+ after do
10
+ Jazz::Models.reset
11
+ end
12
+
13
+ it "Doesn't override !" do
14
+ assert_equal false, !mutation
15
+ end
16
+
17
+ describe "definition" do
18
+ it "passes along description" do
19
+ assert_equal "Register a new musical instrument in the database", mutation.graphql_field.description
20
+ assert_equal "Autogenerated return type of AddInstrument", mutation.payload_type.description
21
+ end
22
+ end
23
+
24
+ describe ".field" do
25
+ it "returns a GraphQL::Field instance, for backwards compat" do
26
+ field = mutation.field
27
+ assert_instance_of GraphQL::Field, field
28
+ assert_equal "addInstrument", field.name
29
+ end
30
+
31
+ it "has a reference to the mutation" do
32
+ f = mutation.field
33
+ assert_equal mutation, f.mutation
34
+
35
+ # Make sure it's also present in the schema
36
+ f2 = Jazz::Schema.find("Mutation.addInstrument")
37
+ assert_equal mutation, f2.mutation
38
+ end
39
+ end
40
+
41
+ describe ".payload_type" do
42
+ it "has a reference to the mutation" do
43
+ assert_equal mutation, mutation.payload_type.mutation
44
+ end
45
+ end
46
+
47
+ describe ".object_class" do
48
+ it "can override & inherit the parent class" do
49
+ obj_class = Class.new(GraphQL::Schema::Object)
50
+ mutation_class = Class.new(GraphQL::Schema::Mutation) do
51
+ object_class(obj_class)
52
+ end
53
+ mutation_subclass = Class.new(mutation_class)
54
+
55
+ assert_equal(GraphQL::Schema::Object, GraphQL::Schema::Mutation.object_class)
56
+ assert_equal(obj_class, mutation_class.object_class)
57
+ assert_equal(obj_class, mutation_subclass.object_class) end
58
+ end
59
+
60
+ describe ".argument_class" do
61
+ it "can override & inherit the parent class" do
62
+ arg_class = Class.new(GraphQL::Schema::Argument)
63
+ mutation_class = Class.new(GraphQL::Schema::Mutation) do
64
+ argument_class(arg_class)
65
+ end
66
+
67
+ mutation_subclass = Class.new(mutation_class)
68
+
69
+ assert_equal(GraphQL::Schema::Argument, GraphQL::Schema::Mutation.argument_class)
70
+ assert_equal(arg_class, mutation_class.argument_class)
71
+ assert_equal(arg_class, mutation_subclass.argument_class)
72
+ end
73
+ end
74
+
75
+ describe "evaluation" do
76
+ it "runs mutations" do
77
+ query_str = <<-GRAPHQL
78
+ mutation {
79
+ addInstrument(name: "Trombone", family: BRASS) {
80
+ instrument {
81
+ name
82
+ family
83
+ }
84
+ entries {
85
+ name
86
+ }
87
+ ee
88
+ }
89
+ }
90
+ GRAPHQL
91
+
92
+ response = Jazz::Schema.execute(query_str)
93
+ assert_equal "Trombone", response["data"]["addInstrument"]["instrument"]["name"]
94
+ assert_equal "BRASS", response["data"]["addInstrument"]["instrument"]["family"]
95
+ assert_equal "GraphQL::Query::Context::ExecutionErrors", response["data"]["addInstrument"]["ee"]
96
+ assert_equal 7, response["data"]["addInstrument"]["entries"].size
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+ require "spec_helper"
3
+
4
+ describe GraphQL::Schema::RelayClassicMutation do
5
+ describe ".input_object_class" do
6
+ it "is inherited, with a default" do
7
+ custom_input = Class.new(GraphQL::Schema::InputObject)
8
+ mutation_base_class = Class.new(GraphQL::Schema::RelayClassicMutation) do
9
+ input_object_class(custom_input)
10
+ end
11
+ mutation_subclass = Class.new(mutation_base_class)
12
+
13
+ assert_equal GraphQL::Schema::InputObject, GraphQL::Schema::RelayClassicMutation.input_object_class
14
+ assert_equal custom_input, mutation_base_class.input_object_class
15
+ assert_equal custom_input, mutation_subclass.input_object_class
16
+ end
17
+ end
18
+
19
+ describe ".input_type" do
20
+ it "has a reference to the mutation" do
21
+ mutation = Class.new(GraphQL::Schema::RelayClassicMutation) do
22
+ graphql_name "Test"
23
+ end
24
+ assert_equal mutation, mutation.input_type.mutation
25
+ assert_equal mutation, mutation.input_type.graphql_definition.mutation
26
+ end
27
+ end
28
+ end
data/spec/support/jazz.rb CHANGED
@@ -328,7 +328,9 @@ module Jazz
328
328
  # Access by method
329
329
  input.string_value,
330
330
  # Access by key:
331
- input["stringValue"],
331
+ input[:string_value],
332
+ input.key?(:string_value).to_s,
333
+ # Access by legacy key
332
334
  input[:stringValue],
333
335
  ]
334
336
  end
@@ -362,11 +364,33 @@ module Jazz
362
364
  argument :name, String, required: true
363
365
  end
364
366
 
367
+ class AddInstrument < GraphQL::Schema::Mutation
368
+ description "Register a new musical instrument in the database"
369
+
370
+ argument :name, String, required: true
371
+ argument :family, Family, required: true
372
+
373
+ field :instrument, InstrumentType, null: false
374
+ # This is meaningless, but it's to test the conflict with `Hash#entries`
375
+ field :entries, [InstrumentType], null: false
376
+ # Test `extras` injection
377
+
378
+ field :ee, String, null: false
379
+ extras [:execution_errors]
380
+ def resolve(name:, family:, execution_errors:)
381
+ instrument = Jazz::Models::Instrument.new(name, family)
382
+ Jazz::Models.data["Instrument"] << instrument
383
+ { instrument: instrument, entries: Jazz::Models.data["Instrument"], ee: execution_errors.class.name}
384
+ end
385
+ end
386
+
365
387
  class Mutation < BaseObject
366
388
  field :add_ensemble, Ensemble, null: false do
367
389
  argument :input, EnsembleInput, required: true
368
390
  end
369
391
 
392
+ field :add_instrument, mutation: AddInstrument
393
+
370
394
  def add_ensemble(input:)
371
395
  ens = Models::Ensemble.new(input.name)
372
396
  Models.data["Ensemble"] << ens
@@ -164,34 +164,21 @@ module StarWars
164
164
  field :basesWithCustomEdge, CustomEdgeBaseConnectionType, null: true, connection: true, resolve: ->(o, a, c) { LazyNodesWrapper.new(o.bases) }
165
165
  end
166
166
 
167
- # Define a mutation. It will also:
168
- # - define a derived InputObjectType
169
- # - define a derived ObjectType (for return)
170
- # - define a field, accessible from {Mutation#field}
171
- #
172
- # The resolve proc takes `inputs, ctx`, where:
173
- # - `inputs` has the keys defined with `input_field`
174
- # - `ctx` is the Query context (like normal fields)
175
- #
176
- # Notice that you leave out clientMutationId.
177
- IntroduceShipMutation = GraphQL::Relay::Mutation.define do
178
- # Used as the root for derived types:
179
- name "IntroduceShip"
167
+ class IntroduceShipMutation < GraphQL::Schema::RelayClassicMutation
180
168
  description "Add a ship to this faction"
181
169
 
182
170
  # Nested under `input` in the query:
183
- input_field :shipName, types.String
184
- input_field :factionId, !types.ID
171
+ argument :ship_name, String, required: false
172
+ argument :faction_id, ID, required: true
185
173
 
186
174
  # Result may have access to these fields:
187
- return_field :shipEdge, Ship.edge_type
188
- return_field :faction, Faction
189
- return_field :aliasedFaction, Faction, property: :aliased_faction
175
+ field :ship_edge, Ship.edge_type, null: true
176
+ field :faction, Faction, null: true
177
+ field :aliased_faction, Faction, hash_key: :aliased_faction, null: true
190
178
 
191
- # Here's the mutation operation:
192
- resolve ->(root_obj, inputs, ctx) {
193
- IntroduceShipFunction.new.call(root_obj, inputs, ctx)
194
- }
179
+ def resolve(ship_name: nil, faction_id:)
180
+ IntroduceShipFunction.new.call(object, {ship_name: ship_name, faction_id: faction_id}, context)
181
+ end
195
182
  end
196
183
 
197
184
  class IntroduceShipFunction < GraphQL::Function
@@ -207,21 +194,24 @@ module StarWars
207
194
  end)
208
195
 
209
196
  def call(obj, args, ctx)
210
- faction_id = args["factionId"]
211
- if args["shipName"] == 'Millennium Falcon'
197
+ # support old and new args
198
+ ship_name = args["shipName"] || args[:ship_name]
199
+ faction_id = args["factionId"] || args[:faction_id]
200
+ if ship_name == 'Millennium Falcon'
212
201
  GraphQL::ExecutionError.new("Sorry, Millennium Falcon ship is reserved")
213
- elsif args["shipName"] == 'Leviathan'
202
+ elsif ship_name == 'Leviathan'
214
203
  raise GraphQL::ExecutionError.new("🔥")
215
- elsif args["shipName"] == "Ebon Hawk"
204
+ elsif ship_name == "Ebon Hawk"
216
205
  LazyWrapper.new { raise GraphQL::ExecutionError.new("💥")}
217
206
  else
218
- ship = DATA.create_ship(args["shipName"], faction_id)
207
+ ship = DATA.create_ship(ship_name, faction_id)
219
208
  faction = DATA["Faction"][faction_id]
220
209
  connection_class = GraphQL::Relay::BaseConnection.connection_for_nodes(faction.ships)
221
210
  ships_connection = connection_class.new(faction.ships, args)
222
211
  ship_edge = GraphQL::Relay::Edge.new(ship, ships_connection)
223
212
  result = {
224
213
  shipEdge: ship_edge,
214
+ ship_edge: ship_edge, # support new-style, too
225
215
  faction: faction,
226
216
  aliased_faction: faction,
227
217
  }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: graphql
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.8.0.pre9
4
+ version: 1.8.0.pre10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robert Mosolgo
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-03-19 00:00:00.000000000 Z
11
+ date: 2018-04-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: benchmark-ips
@@ -525,15 +525,18 @@ files:
525
525
  - lib/graphql/schema/member.rb
526
526
  - lib/graphql/schema/member/accepts_definition.rb
527
527
  - lib/graphql/schema/member/build_type.rb
528
+ - lib/graphql/schema/member/has_arguments.rb
528
529
  - lib/graphql/schema/member/has_fields.rb
529
530
  - lib/graphql/schema/member/instrumentation.rb
530
531
  - lib/graphql/schema/member/list_type_proxy.rb
531
532
  - lib/graphql/schema/member/non_null_type_proxy.rb
532
533
  - lib/graphql/schema/middleware_chain.rb
534
+ - lib/graphql/schema/mutation.rb
533
535
  - lib/graphql/schema/null_mask.rb
534
536
  - lib/graphql/schema/object.rb
535
537
  - lib/graphql/schema/possible_types.rb
536
538
  - lib/graphql/schema/printer.rb
539
+ - lib/graphql/schema/relay_classic_mutation.rb
537
540
  - lib/graphql/schema/rescue_middleware.rb
538
541
  - lib/graphql/schema/scalar.rb
539
542
  - lib/graphql/schema/timeout_middleware.rb
@@ -907,8 +910,12 @@ files:
907
910
  - spec/fixtures/upgrader/blame_range.transformed.rb
908
911
  - spec/fixtures/upgrader/date_time.original.rb
909
912
  - spec/fixtures/upgrader/date_time.transformed.rb
913
+ - spec/fixtures/upgrader/delete_project.original.rb
914
+ - spec/fixtures/upgrader/delete_project.transformed.rb
910
915
  - spec/fixtures/upgrader/gist_order_field.original.rb
911
916
  - spec/fixtures/upgrader/gist_order_field.transformed.rb
917
+ - spec/fixtures/upgrader/increment_count.original.rb
918
+ - spec/fixtures/upgrader/increment_count.transformed.rb
912
919
  - spec/fixtures/upgrader/release_order.original.rb
913
920
  - spec/fixtures/upgrader/release_order.transformed.rb
914
921
  - spec/fixtures/upgrader/starrable.original.rb
@@ -1013,8 +1020,10 @@ files:
1013
1020
  - spec/graphql/schema/loader_spec.rb
1014
1021
  - spec/graphql/schema/member/accepts_definition_spec.rb
1015
1022
  - spec/graphql/schema/middleware_chain_spec.rb
1023
+ - spec/graphql/schema/mutation_spec.rb
1016
1024
  - spec/graphql/schema/object_spec.rb
1017
1025
  - spec/graphql/schema/printer_spec.rb
1026
+ - spec/graphql/schema/relay_classic_mutation_spec.rb
1018
1027
  - spec/graphql/schema/rescue_middleware_spec.rb
1019
1028
  - spec/graphql/schema/scalar_spec.rb
1020
1029
  - spec/graphql/schema/timeout_middleware_spec.rb
@@ -1410,8 +1419,12 @@ test_files:
1410
1419
  - spec/fixtures/upgrader/blame_range.transformed.rb
1411
1420
  - spec/fixtures/upgrader/date_time.original.rb
1412
1421
  - spec/fixtures/upgrader/date_time.transformed.rb
1422
+ - spec/fixtures/upgrader/delete_project.original.rb
1423
+ - spec/fixtures/upgrader/delete_project.transformed.rb
1413
1424
  - spec/fixtures/upgrader/gist_order_field.original.rb
1414
1425
  - spec/fixtures/upgrader/gist_order_field.transformed.rb
1426
+ - spec/fixtures/upgrader/increment_count.original.rb
1427
+ - spec/fixtures/upgrader/increment_count.transformed.rb
1415
1428
  - spec/fixtures/upgrader/release_order.original.rb
1416
1429
  - spec/fixtures/upgrader/release_order.transformed.rb
1417
1430
  - spec/fixtures/upgrader/starrable.original.rb
@@ -1516,8 +1529,10 @@ test_files:
1516
1529
  - spec/graphql/schema/loader_spec.rb
1517
1530
  - spec/graphql/schema/member/accepts_definition_spec.rb
1518
1531
  - spec/graphql/schema/middleware_chain_spec.rb
1532
+ - spec/graphql/schema/mutation_spec.rb
1519
1533
  - spec/graphql/schema/object_spec.rb
1520
1534
  - spec/graphql/schema/printer_spec.rb
1535
+ - spec/graphql/schema/relay_classic_mutation_spec.rb
1521
1536
  - spec/graphql/schema/rescue_middleware_spec.rb
1522
1537
  - spec/graphql/schema/scalar_spec.rb
1523
1538
  - spec/graphql/schema/timeout_middleware_spec.rb