Skip to content

Commit 61f5ba9

Browse files
authored
Merge pull request rmosolgo#355 from jamesmacaulay/nameless-type-modifiers
nameless LIST and NON_NULL
2 parents 3d50397 + d4b3481 commit 61f5ba9

File tree

6 files changed

+36
-41
lines changed

6 files changed

+36
-41
lines changed

lib/graphql/list_type.rb

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,8 @@ module GraphQL
2525
#
2626
class ListType < GraphQL::BaseType
2727
include GraphQL::BaseType::ModifiesAnotherType
28-
attr_reader :of_type, :name
28+
attr_reader :of_type
2929
def initialize(of_type:)
30-
@name = "List"
3130
@of_type = of_type
3231
end
3332

lib/graphql/non_null_type.rb

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,6 @@ def initialize(of_type:)
3535
@of_type = of_type
3636
end
3737

38-
def name
39-
"Non-Null"
40-
end
41-
4238
def valid_input?(value)
4339
validate_input(value).valid?
4440
end

spec/graphql/introspection/directive_type_spec.rb

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
__schema {
77
directives {
88
name,
9-
args { name, type { name, ofType { name } } },
9+
args { name, type { kind, name, ofType { name } } },
1010
locations
1111
# Deprecated fields:
1212
onField
@@ -25,7 +25,7 @@
2525
{
2626
"name" => "include",
2727
"args" => [
28-
{"name"=>"if", "type"=>{"name"=>"Non-Null", "ofType"=>{"name"=>"Boolean"}}}
28+
{"name"=>"if", "type"=>{"kind"=>"NON_NULL", "name"=>nil, "ofType"=>{"name"=>"Boolean"}}}
2929
],
3030
"locations"=>["FIELD", "FRAGMENT_SPREAD", "INLINE_FRAGMENT"],
3131
"onField" => true,
@@ -35,7 +35,7 @@
3535
{
3636
"name" => "skip",
3737
"args" => [
38-
{"name"=>"if", "type"=>{"name"=>"Non-Null", "ofType"=>{"name"=>"Boolean"}}}
38+
{"name"=>"if", "type"=>{"kind"=>"NON_NULL", "name"=>nil, "ofType"=>{"name"=>"Boolean"}}}
3939
],
4040
"locations"=>["FIELD", "FRAGMENT_SPREAD", "INLINE_FRAGMENT"],
4141
"onField" => true,
@@ -45,7 +45,7 @@
4545
{
4646
"name" => "deprecated",
4747
"args" => [
48-
{"name"=>"reason", "type"=>{"name"=>"String", "ofType"=>nil}}
48+
{"name"=>"reason", "type"=>{"kind"=>"SCALAR", "name"=>"String", "ofType"=>nil}}
4949
],
5050
"locations"=>["FIELD_DEFINITION", "ENUM_VALUE"],
5151
"onField" => false,

spec/graphql/introspection/input_value_type_spec.rb

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
kind,
1111
inputFields {
1212
name,
13-
type { name },
13+
type { kind, name },
1414
defaultValue
1515
description
1616
}
@@ -26,13 +26,13 @@
2626
"description"=>"Properties for finding a dairy product",
2727
"kind"=>"INPUT_OBJECT",
2828
"inputFields"=>[
29-
{"name"=>"source", "type"=>{ "name" => "Non-Null"}, "defaultValue"=>nil,
29+
{"name"=>"source", "type"=>{"kind"=>"NON_NULL", "name" => nil}, "defaultValue"=>nil,
3030
"description" => "Where it came from"},
31-
{"name"=>"originDairy", "type"=>{ "name" => "String"}, "defaultValue"=>"\"Sugar Hollow Dairy\"",
31+
{"name"=>"originDairy", "type"=>{"kind"=>"SCALAR", "name" => "String"}, "defaultValue"=>"\"Sugar Hollow Dairy\"",
3232
"description" => "Dairy which produced it"},
33-
{"name"=>"fatContent", "type"=>{ "name" => "Float"}, "defaultValue"=>"0.3",
33+
{"name"=>"fatContent", "type"=>{"kind"=>"SCALAR", "name" => "Float"}, "defaultValue"=>"0.3",
3434
"description" => "How much fat it has"},
35-
{"name"=>"organic", "type"=>{ "name" => "Boolean"}, "defaultValue"=>"false",
35+
{"name"=>"organic", "type"=>{"kind"=>"SCALAR", "name" => "Boolean"}, "defaultValue"=>"false",
3636
"description" => nil}
3737
]
3838
}

spec/graphql/introspection/type_type_spec.rb

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
describe GraphQL::Introspection::TypeType do
44
let(:query_string) {%|
55
query introspectionQuery {
6-
cheeseType: __type(name: "Cheese") { name, kind, fields { name, isDeprecated, type { name, ofType { name } } } }
7-
milkType: __type(name: "Milk") { interfaces { name }, fields { type { name, ofType { name } } } }
6+
cheeseType: __type(name: "Cheese") { name, kind, fields { name, isDeprecated, type { kind, name, ofType { name } } } }
7+
milkType: __type(name: "Milk") { interfaces { name }, fields { type { kind, name, ofType { name } } } }
88
dairyAnimal: __type(name: "DairyAnimal") { name, kind, enumValues(includeDeprecated: false) { name, isDeprecated } }
99
dairyProduct: __type(name: "DairyProduct") { name, kind, possibleTypes { name } }
1010
animalProduct: __type(name: "AnimalProduct") { name, kind, possibleTypes { name }, fields { name } }
@@ -13,13 +13,13 @@
1313
|}
1414
let(:result) { DummySchema.execute(query_string, context: {}, variables: {"cheeseId" => 2}) }
1515
let(:cheese_fields) {[
16-
{"name"=>"deeplyNullableCheese", "isDeprecated"=>false, "type"=>{"name"=>"Cheese", "ofType"=>nil}},
17-
{"name"=>"flavor", "isDeprecated" => false, "type" => { "name" => "Non-Null", "ofType" => { "name" => "String"}}},
18-
{"name"=>"id", "isDeprecated" => false, "type" => { "name" => "Non-Null", "ofType" => { "name" => "Int"}}},
19-
{"name"=>"nullableCheese", "isDeprecated"=>false, "type"=>{"name"=>"Cheese", "ofType"=>nil}},
20-
{"name"=>"origin", "isDeprecated" => false, "type" => { "name" => "Non-Null", "ofType" => { "name" => "String"}}},
21-
{"name"=>"similarCheese", "isDeprecated"=>false, "type"=>{"name"=>"Cheese", "ofType"=>nil}},
22-
{"name"=>"source", "isDeprecated" => false, "type" => { "name" => "Non-Null", "ofType" => { "name" => "DairyAnimal"}}},
16+
{"name"=>"deeplyNullableCheese", "isDeprecated" => false, "type"=>{ "kind" => "OBJECT", "name" => "Cheese", "ofType" => nil}},
17+
{"name"=>"flavor", "isDeprecated" => false, "type" => { "kind" => "NON_NULL", "name" => nil, "ofType" => { "name" => "String"}}},
18+
{"name"=>"id", "isDeprecated" => false, "type" => { "kind" => "NON_NULL", "name" => nil, "ofType" => { "name" => "Int"}}},
19+
{"name"=>"nullableCheese", "isDeprecated"=>false, "type"=>{ "kind" => "OBJECT", "name" => "Cheese", "ofType"=>nil}},
20+
{"name"=>"origin", "isDeprecated" => false, "type" => { "kind" => "NON_NULL", "name" => nil, "ofType" => { "name" => "String"}}},
21+
{"name"=>"similarCheese", "isDeprecated"=>false, "type"=>{ "kind" => "OBJECT", "name"=>"Cheese", "ofType"=>nil}},
22+
{"name"=>"source", "isDeprecated" => false, "type" => { "kind" => "NON_NULL", "name" => nil, "ofType" => { "name" => "DairyAnimal"}}},
2323
]}
2424

2525
let(:dairy_animals) {[
@@ -41,13 +41,13 @@
4141
{"name"=>"LocalProduct"},
4242
],
4343
"fields"=>[
44-
{"type"=>{"name"=>"List", "ofType"=>{"name"=>"DairyProduct"}}},
45-
{"type"=>{"name"=>"String", "ofType"=>nil}},
46-
{"type"=>{"name"=>"Non-Null", "ofType"=>{"name"=>"Float"}}},
47-
{"type"=>{"name"=>"List", "ofType"=>{"name"=>"String"}}},
48-
{"type"=>{"name"=>"Non-Null", "ofType"=>{"name"=>"ID"}}},
49-
{"type"=>{"name"=>"Non-Null", "ofType"=>{"name"=>"String"}}},
50-
{"type"=>{"name"=>"DairyAnimal", "ofType"=>nil}},
44+
{"type"=>{"kind"=>"LIST","name"=>nil, "ofType"=>{"name"=>"DairyProduct"}}},
45+
{"type"=>{"kind"=>"SCALAR","name"=>"String", "ofType"=>nil}},
46+
{"type"=>{"kind"=>"NON_NULL","name"=>nil, "ofType"=>{"name"=>"Float"}}},
47+
{"type"=>{"kind"=>"LIST","name"=>nil, "ofType"=>{"name"=>"String"}}},
48+
{"type"=>{"kind"=>"NON_NULL","name"=>nil, "ofType"=>{"name"=>"ID"}}},
49+
{"type"=>{"kind"=>"NON_NULL","name"=>nil, "ofType"=>{"name"=>"String"}}},
50+
{"type"=>{"kind"=>"ENUM","name"=>"DairyAnimal", "ofType"=>nil}},
5151
]
5252
},
5353
"dairyAnimal"=>{
@@ -76,11 +76,11 @@
7676
describe "deprecated fields" do
7777
let(:query_string) {%|
7878
query introspectionQuery {
79-
cheeseType: __type(name: "Cheese") { name, kind, fields(includeDeprecated: true) { name, isDeprecated, type { name, ofType { name } } } }
79+
cheeseType: __type(name: "Cheese") { name, kind, fields(includeDeprecated: true) { name, isDeprecated, type { kind, name, ofType { name } } } }
8080
dairyAnimal: __type(name: "DairyAnimal") { name, kind, enumValues(includeDeprecated: true) { name, isDeprecated } }
8181
}
8282
|}
83-
let(:deprecated_fields) { {"name"=>"fatContent", "isDeprecated"=>true, "type"=>{"name"=>"Non-Null", "ofType"=>{"name"=>"Float"}}} }
83+
let(:deprecated_fields) { {"name"=>"fatContent", "isDeprecated"=>true, "type"=>{"kind"=>"NON_NULL","name"=>nil, "ofType"=>{"name"=>"Float"}}} }
8484

8585
it "can expose deprecated fields" do
8686
new_cheese_fields = ([deprecated_fields] + cheese_fields).sort_by { |f| f["name"] }
@@ -102,7 +102,7 @@
102102
describe "input objects" do
103103
let(:query_string) {%|
104104
query introspectionQuery {
105-
__type(name: "DairyProductInput") { name, description, kind, inputFields { name, type { name }, defaultValue } }
105+
__type(name: "DairyProductInput") { name, description, kind, inputFields { name, type { kind, name }, defaultValue } }
106106
}
107107
|}
108108

@@ -113,10 +113,10 @@
113113
"description"=>"Properties for finding a dairy product",
114114
"kind"=>"INPUT_OBJECT",
115115
"inputFields"=>[
116-
{"name"=>"source", "type"=>{ "name" => "Non-Null"}, "defaultValue"=>nil},
117-
{"name"=>"originDairy", "type"=>{"name"=>"String"}, "defaultValue"=>"\"Sugar Hollow Dairy\""},
118-
{"name"=>"fatContent", "type"=>{ "name" => "Float"}, "defaultValue"=>"0.3"},
119-
{"name"=>"organic", "type"=>{ "name" => "Boolean"}, "defaultValue"=>"false"},
116+
{"name"=>"source", "type"=>{"kind"=>"NON_NULL","name"=>nil, }, "defaultValue"=>nil},
117+
{"name"=>"originDairy", "type"=>{"kind"=>"SCALAR","name"=>"String"}, "defaultValue"=>"\"Sugar Hollow Dairy\""},
118+
{"name"=>"fatContent", "type"=>{"kind"=>"SCALAR","name" => "Float"}, "defaultValue"=>"0.3"},
119+
{"name"=>"organic", "type"=>{"kind"=>"SCALAR","name" => "Boolean"}, "defaultValue"=>"false"},
120120
]
121121
}
122122
}}

spec/graphql/static_validation/type_stack_spec.rb

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ def self.checks
88
def validate(context)
99
self.class.checks.clear
1010
context.visitor[GraphQL::Language::Nodes::Field] << ->(node, parent) {
11-
self.class.checks << context.object_types.map(&:name)
11+
self.class.checks << context.object_types.map {|t| t.name || t.kind.name }
1212
}
1313
end
1414
end
@@ -29,8 +29,8 @@ def validate(context)
2929
validator.validate(query)
3030
expected = [
3131
["Query", "Cheese"],
32-
["Query", "Cheese", "Non-Null"],
33-
["Edible", "Non-Null"]
32+
["Query", "Cheese", "NON_NULL"],
33+
["Edible", "NON_NULL"]
3434
]
3535
assert_equal(expected, TypeCheckValidator.checks)
3636
end

0 commit comments

Comments
 (0)