graphql 0.10.8 → 0.10.9

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ed91d2fd1d191758d362b06dd3af5bcc53589fad
4
- data.tar.gz: a5b9d8f9ff219f4db84e24a569a6b396d034cd87
3
+ metadata.gz: f073abd68886cc4042f66cff4457c9adcae153f7
4
+ data.tar.gz: 895ea36770f92665af805b9181c8641fb5614567
5
5
  SHA512:
6
- metadata.gz: bb2d62a66e88dc88e52ff05cb00317b79ee05a9aa0a3a36280d2f6aab2f6d7df1205c32e327d743227f9a491ce9d7ea66283e147633482a6f0973ce27abbe125
7
- data.tar.gz: 31400a2541cbf1673b7b83c823d5be985daab47ec68085345b248cdbcd9373f4e1b31ef94f31da14e3468a177ab36998a5b84a37e24a99b47c73c9bd7dede970
6
+ metadata.gz: ce609e9c9523281b908378697e48344ffdc4e8c0597b69b30ddcea15f51468fa971805e4346f6aad5c36536f760bfefccd6449abcaf1825e80f925af149682c1
7
+ data.tar.gz: 78611caafff37f1b1a142aa74af6eadac62b5cfdd35c0099f5afda063a95142ed1d036004e6eb7d2904762459b2c38cb97e36944af2b636f33fe7ef8ef15e69d
@@ -31,10 +31,11 @@ class GraphQL::ObjectType < GraphQL::BaseType
31
31
 
32
32
  # Shovel this type into each interface's `possible_types` array.
33
33
  #
34
- # (There's a bug here: if you define interfaces twice, it won't remove previous definitions.)
35
34
  # @param new_interfaces [Array<GraphQL::Interface>] interfaces that this type implements
36
35
  def interfaces=(new_interfaces)
37
- new_interfaces.each {|i| i.possible_types << self }
36
+ @interfaces ||= []
37
+ (@interfaces - new_interfaces).each { |i| i.possible_types.delete(self) }
38
+ (new_interfaces - @interfaces).each { |i| i.possible_types << self }
38
39
  @interfaces = new_interfaces
39
40
  end
40
41
 
@@ -88,7 +88,7 @@ module GraphQL
88
88
  def merge_fields(field1, field2)
89
89
  field_type = query.schema.get_field(type, field2.name).type.unwrap
90
90
 
91
- if field_type.is_a?(GraphQL::ObjectType)
91
+ if field_type.kind.fields?
92
92
  # create a new ast field node merging selections from each field.
93
93
  # Because of static validation, we can assume that name, alias,
94
94
  # arguments, and directives are exactly the same for fields 1 and 2.
@@ -1,3 +1,3 @@
1
1
  module GraphQL
2
- VERSION = "0.10.8"
2
+ VERSION = "0.10.9"
3
3
  end
data/readme.md CHANGED
@@ -112,17 +112,6 @@ https://medium.com/@gauravtiwari/graphql-and-relay-on-rails-first-relay-powered-
112
112
  - Code clean-up
113
113
  - Raise if you try to configure an attribute which doesn't suit the type (ie, if you try to define `resolve` on an ObjectType, it should somehow raise)
114
114
  - Clean up file structure in `lib/query` (don't need serial_execution namespace anymore)
115
- - Overriding `!` on types breaks ActiveSupport `.blank?`
116
-
117
- ```ruby
118
- my_type = GraphQL::ObjectType.define { name("MyType") }
119
- # => MyType
120
- my_type.present?
121
- # => MyType!!
122
- my_type.blank?
123
- # => MyType!
124
- ```
125
-
126
115
  - Accept strings for circular type references
127
116
  - Interface's possible types should be a property of the schema, not the interface
128
117
  - Statically validate type of variables (see early return in LiteralValidator)
@@ -132,7 +121,6 @@ https://medium.com/@gauravtiwari/graphql-and-relay-on-rails-first-relay-powered-
132
121
  - __Subscriptions__
133
122
  - This is a good chance to make an `Operation` abstraction of which `query`, `mutation` and `subscription` are members
134
123
  - For a subscription, `graphql` would send an outbound message to the system (allow the host application to manage its own subscriptions via Pusher, ActionCable, whatever)
135
- - Documentation
136
124
 
137
125
  ## Goals
138
126
 
@@ -11,6 +11,24 @@ describe GraphQL::InterfaceType do
11
11
  assert_equal(MilkType, interface.resolve_type(MILKS.values.first))
12
12
  end
13
13
 
14
+ it 'handles when interfaces are re-assigned' do
15
+ iface = GraphQL::InterfaceType.define do
16
+ end
17
+ type = GraphQL::ObjectType.define do
18
+ interfaces [iface]
19
+ end
20
+ assert_equal([type], iface.possible_types)
21
+
22
+ type.interfaces = []
23
+ assert_equal([], iface.possible_types)
24
+
25
+ type.interfaces = [iface]
26
+ assert_equal([type], iface.possible_types)
27
+
28
+ type.interfaces = [iface]
29
+ assert_equal([type], iface.possible_types)
30
+ end
31
+
14
32
  describe 'query evaluation' do
15
33
  let(:result) { DummySchema.execute(query_string, context: {}, variables: {"cheeseId" => 2})}
16
34
  let(:query_string) {%|
@@ -24,6 +42,20 @@ describe GraphQL::InterfaceType do
24
42
  end
25
43
  end
26
44
 
45
+ describe 'mergable query evaluation' do
46
+ let(:result) { DummySchema.execute(query_string, context: {}, variables: {"cheeseId" => 2})}
47
+ let(:query_string) {%|
48
+ query fav {
49
+ favoriteEdible { fatContent }
50
+ favoriteEdible { origin }
51
+ }
52
+ |}
53
+ it 'gets fields from the type for the given object' do
54
+ expected = {"data"=>{"favoriteEdible"=>{"fatContent"=>0.04, "origin"=>"Antiquity"}}}
55
+ assert_equal(expected, result)
56
+ end
57
+ end
58
+
27
59
  describe '#resolve_type' do
28
60
  let(:interface) {
29
61
  GraphQL::InterfaceType.define do
@@ -14,6 +14,7 @@ describe GraphQL::Introspection::TypeType do
14
14
  let(:cheese_fields) {[
15
15
  {"name"=>"id", "isDeprecated" => false, "type" => { "name" => "Non-Null", "ofType" => { "name" => "Int"}}},
16
16
  {"name"=>"flavor", "isDeprecated" => false, "type" => { "name" => "Non-Null", "ofType" => { "name" => "String"}}},
17
+ {"name"=>"origin", "isDeprecated" => false, "type" => { "name" => "Non-Null", "ofType" => { "name" => "String"}}},
17
18
  {"name"=>"source", "isDeprecated" => false, "type" => { "name" => "Non-Null", "ofType" => { "name" => "DairyAnimal"}}},
18
19
  {"name"=>"similarCheese", "isDeprecated"=>false, "type"=>{"name"=>"Cheese", "ofType"=>nil}},
19
20
  ]}
@@ -38,6 +39,7 @@ describe GraphQL::Introspection::TypeType do
38
39
  "fields"=>[
39
40
  {"type"=>{"name"=>"Non-Null", "ofType"=>{"name"=>"ID"}}},
40
41
  {"type"=>{"name"=>"DairyAnimal", "ofType"=>nil}},
42
+ {"type"=>{"name"=>"Non-Null", "ofType"=>{"name"=>"String"}}},
41
43
  {"type"=>{"name"=>"Non-Null", "ofType"=>{"name"=>"Float"}}},
42
44
  {"type"=>{"name"=>"List", "ofType"=>{"name"=>"String"}}},
43
45
  ]
data/spec/spec_helper.rb CHANGED
@@ -8,6 +8,8 @@ require "minitest/reporters"
8
8
  require 'pry'
9
9
  Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new
10
10
 
11
+ Minitest::Spec.make_my_diffs_pretty!
12
+
11
13
  # Filter out Minitest backtrace while allowing backtrace from other libraries
12
14
  # to be shown.
13
15
  Minitest.backtrace_filter = Minitest::BacktraceFilter.new
@@ -6,6 +6,7 @@ EdibleInterface = GraphQL::InterfaceType.define do
6
6
  name "Edible"
7
7
  description "Something you can eat, yum"
8
8
  field :fatContent, !types.Float, "Percentage which is fat", property: :bogus_property
9
+ field :origin, !types.String, "Place the edible comes from"
9
10
  end
10
11
 
11
12
  AnimalProductInterface = GraphQL::InterfaceType.define do
@@ -31,6 +32,7 @@ CheeseType = GraphQL::ObjectType.define do
31
32
  # Can have (name, type, desc)
32
33
  field :id, !types.Int, "Unique identifier"
33
34
  field :flavor, !types.String, "Kind of Cheese"
35
+ field :origin, !types.String, "Place the cheese comes from"
34
36
 
35
37
  field :source, !DairyAnimalEnum,
36
38
  "Animal which produced the milk for this cheese"
@@ -62,6 +64,7 @@ MilkType = GraphQL::ObjectType.define do
62
64
  interfaces [EdibleInterface, AnimalProductInterface]
63
65
  field :id, !types.ID
64
66
  field :source, DairyAnimalEnum, "Animal which produced this milk"
67
+ field :origin, !types.String, "Place the milk comes from"
65
68
  field :fatContent, !types.Float, "Percentage which is milkfat"
66
69
  field :flavors, types[types.String], "Chocolate, Strawberry, etc" do
67
70
  argument :limit, types.Int
@@ -1,13 +1,13 @@
1
- Cheese = Struct.new(:id, :flavor, :fat_content, :source)
1
+ Cheese = Struct.new(:id, :flavor, :origin, :fat_content, :source)
2
2
  CHEESES = {
3
- 1 => Cheese.new(1, "Brie", 0.19, 1),
4
- 2 => Cheese.new(2, "Gouda", 0.3, 1),
5
- 3 => Cheese.new(3, "Manchego", 0.065, "SHEEP")
3
+ 1 => Cheese.new(1, "Brie", "France", 0.19, 1),
4
+ 2 => Cheese.new(2, "Gouda", "Netherlands", 0.3, 1),
5
+ 3 => Cheese.new(3, "Manchego", "Spain", 0.065, "SHEEP")
6
6
  }
7
7
 
8
- Milk = Struct.new(:id, :fatContent, :source, :flavors)
8
+ Milk = Struct.new(:id, :fatContent, :origin, :source, :flavors)
9
9
  MILKS = {
10
- 1 => Milk.new(1, 0.04, 1, ["Natural", "Chocolate", "Strawberry"]),
10
+ 1 => Milk.new(1, 0.04, "Antiquity", 1, ["Natural", "Chocolate", "Strawberry"]),
11
11
  }
12
12
 
13
13
  DAIRY = OpenStruct.new(
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: 0.10.8
4
+ version: 0.10.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robert Mosolgo
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-14 00:00:00.000000000 Z
11
+ date: 2016-01-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: parslet