graphql 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/graph_ql/directive.rb +9 -5
- data/lib/graph_ql/directives/include_directive.rb +2 -2
- data/lib/graph_ql/directives/skip_directive.rb +2 -2
- data/lib/graph_ql/enum.rb +5 -8
- data/lib/graph_ql/field.rb +50 -0
- data/lib/graph_ql/interface.rb +4 -0
- data/lib/graph_ql/introspection/arguments_field.rb +2 -2
- data/lib/graph_ql/introspection/directive_type.rb +10 -10
- data/lib/graph_ql/introspection/enum_value_type.rb +11 -8
- data/lib/graph_ql/introspection/enum_values_field.rb +5 -5
- data/lib/graph_ql/introspection/field_type.rb +14 -10
- data/lib/graph_ql/introspection/fields_field.rb +4 -4
- data/lib/graph_ql/introspection/input_fields_field.rb +3 -3
- data/lib/graph_ql/introspection/input_value_type.rb +8 -8
- data/lib/graph_ql/introspection/interfaces_field.rb +5 -0
- data/lib/graph_ql/introspection/of_type_field.rb +3 -9
- data/lib/graph_ql/introspection/possible_types_field.rb +3 -10
- data/lib/graph_ql/introspection/schema_type.rb +8 -14
- data/lib/graph_ql/introspection/type_kind_enum.rb +1 -1
- data/lib/graph_ql/introspection/type_type.rb +17 -19
- data/lib/graph_ql/introspection/typename_field.rb +15 -0
- data/lib/graph_ql/parser.rb +9 -0
- data/lib/graph_ql/parser/nodes.rb +17 -7
- data/lib/graph_ql/parser/parser.rb +7 -7
- data/lib/graph_ql/parser/transform.rb +23 -20
- data/lib/graph_ql/parser/visitor.rb +29 -13
- data/lib/graph_ql/query.rb +39 -16
- data/lib/graph_ql/query/field_resolution_strategy.rb +15 -11
- data/lib/graph_ql/query/type_resolver.rb +4 -2
- data/lib/graph_ql/repl.rb +1 -1
- data/lib/graph_ql/schema.rb +19 -7
- data/lib/graph_ql/schema/each_item_validator.rb +12 -0
- data/lib/graph_ql/schema/field_validator.rb +13 -0
- data/lib/graph_ql/schema/implementation_validator.rb +21 -0
- data/lib/graph_ql/schema/schema_validator.rb +10 -0
- data/lib/graph_ql/schema/type_reducer.rb +6 -6
- data/lib/graph_ql/schema/type_validator.rb +47 -0
- data/lib/graph_ql/static_validation.rb +18 -0
- data/lib/graph_ql/static_validation/argument_literals_are_compatible.rb +13 -0
- data/lib/graph_ql/static_validation/arguments_are_defined.rb +10 -0
- data/lib/graph_ql/static_validation/arguments_validator.rb +16 -0
- data/lib/graph_ql/static_validation/directives_are_defined.rb +18 -0
- data/lib/graph_ql/static_validation/fields_are_defined_on_type.rb +29 -0
- data/lib/graph_ql/static_validation/fields_have_appropriate_selections.rb +31 -0
- data/lib/graph_ql/static_validation/fields_will_merge.rb +93 -0
- data/lib/graph_ql/static_validation/fragment_types_exist.rb +24 -0
- data/lib/graph_ql/static_validation/fragments_are_used.rb +30 -0
- data/lib/graph_ql/static_validation/literal_validator.rb +27 -0
- data/lib/graph_ql/static_validation/message.rb +29 -0
- data/lib/graph_ql/static_validation/required_arguments_are_present.rb +13 -0
- data/lib/graph_ql/static_validation/type_stack.rb +87 -0
- data/lib/graph_ql/static_validation/validator.rb +48 -0
- data/lib/graph_ql/type_kinds.rb +50 -12
- data/lib/graph_ql/types/argument_definer.rb +7 -0
- data/lib/graph_ql/types/boolean_type.rb +3 -3
- data/lib/graph_ql/types/field_definer.rb +19 -0
- data/lib/graph_ql/types/float_type.rb +3 -3
- data/lib/graph_ql/types/input_object_type.rb +4 -0
- data/lib/graph_ql/types/input_value.rb +1 -1
- data/lib/graph_ql/types/int_type.rb +4 -4
- data/lib/graph_ql/types/list_type.rb +5 -1
- data/lib/graph_ql/types/non_null_type.rb +4 -0
- data/lib/graph_ql/types/object_type.rb +9 -20
- data/lib/graph_ql/types/scalar_type.rb +4 -0
- data/lib/graph_ql/types/string_type.rb +3 -3
- data/lib/graph_ql/types/type_definer.rb +5 -9
- data/lib/graph_ql/union.rb +6 -17
- data/lib/graph_ql/version.rb +1 -1
- data/lib/graphql.rb +58 -78
- data/readme.md +80 -7
- data/spec/graph_ql/interface_spec.rb +15 -1
- data/spec/graph_ql/introspection/directive_type_spec.rb +2 -2
- data/spec/graph_ql/introspection/schema_type_spec.rb +2 -1
- data/spec/graph_ql/introspection/type_type_spec.rb +16 -1
- data/spec/graph_ql/parser/parser_spec.rb +3 -1
- data/spec/graph_ql/parser/transform_spec.rb +12 -2
- data/spec/graph_ql/parser/visitor_spec.rb +13 -5
- data/spec/graph_ql/query_spec.rb +25 -13
- data/spec/graph_ql/schema/field_validator_spec.rb +21 -0
- data/spec/graph_ql/schema/type_reducer_spec.rb +2 -2
- data/spec/graph_ql/schema/type_validator_spec.rb +54 -0
- data/spec/graph_ql/static_validation/argument_literals_are_compatible_spec.rb +41 -0
- data/spec/graph_ql/static_validation/arguments_are_defined_spec.rb +40 -0
- data/spec/graph_ql/static_validation/directives_are_defined_spec.rb +33 -0
- data/spec/graph_ql/static_validation/fields_are_defined_on_type_spec.rb +59 -0
- data/spec/graph_ql/static_validation/fields_have_appropriate_selections_spec.rb +30 -0
- data/spec/graph_ql/{validations → static_validation}/fields_will_merge_spec.rb +24 -17
- data/spec/graph_ql/static_validation/fragment_types_exist_spec.rb +38 -0
- data/spec/graph_ql/static_validation/fragments_are_used_spec.rb +24 -0
- data/spec/graph_ql/static_validation/required_arguments_are_present_spec.rb +41 -0
- data/spec/graph_ql/static_validation/type_stack_spec.rb +35 -0
- data/spec/graph_ql/static_validation/validator_spec.rb +28 -0
- data/spec/graph_ql/types/object_type_spec.rb +1 -1
- data/spec/graph_ql/union_spec.rb +1 -14
- data/spec/support/dummy_app.rb +75 -53
- metadata +53 -31
- data/lib/graph_ql/fields/abstract_field.rb +0 -37
- data/lib/graph_ql/fields/access_field.rb +0 -24
- data/lib/graph_ql/fields/field.rb +0 -34
- data/lib/graph_ql/types/abstract_type.rb +0 -14
- data/lib/graph_ql/validations/fields_are_defined_on_type.rb +0 -44
- data/lib/graph_ql/validations/fields_will_merge.rb +0 -80
- data/lib/graph_ql/validations/fragments_are_used.rb +0 -24
- data/lib/graph_ql/validator.rb +0 -29
- data/spec/graph_ql/validations/fields_are_defined_on_type_spec.rb +0 -28
- data/spec/graph_ql/validations/fragments_are_used_spec.rb +0 -28
- data/spec/graph_ql/validator_spec.rb +0 -24
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe GraphQL::StaticValidation::FragmentTypesExist do
|
4
|
+
let(:document) { GraphQL.parse("
|
5
|
+
query getCheese {
|
6
|
+
cheeese(id: 1) {
|
7
|
+
... on Cheese { source }
|
8
|
+
... on Nothing { whatever }
|
9
|
+
... somethingFields
|
10
|
+
... cheeseFields
|
11
|
+
}
|
12
|
+
}
|
13
|
+
|
14
|
+
fragment somethingFields on Something {
|
15
|
+
something
|
16
|
+
}
|
17
|
+
fragment cheeseFields on Cheese {
|
18
|
+
fatContent
|
19
|
+
}
|
20
|
+
")}
|
21
|
+
|
22
|
+
let(:validator) { GraphQL::StaticValidation::Validator.new(schema: DummySchema, validators: [GraphQL::StaticValidation::FragmentTypesExist]) }
|
23
|
+
let(:errors) { validator.validate(document) }
|
24
|
+
|
25
|
+
it 'finds non-existent types on fragments' do
|
26
|
+
assert_equal(2, errors.length)
|
27
|
+
inline_fragment_error = {
|
28
|
+
"message"=>"No such type Something, so it can't be a fragment condition",
|
29
|
+
"locations"=>[{"line"=>11, "column"=>5}]
|
30
|
+
}
|
31
|
+
assert_includes(errors, inline_fragment_error, "on inline fragments")
|
32
|
+
fragment_def_error = {
|
33
|
+
"message"=>"No such type Nothing, so it can't be a fragment condition",
|
34
|
+
"locations"=>[{"line"=>5, "column"=>9}]
|
35
|
+
}
|
36
|
+
assert_includes(errors, fragment_def_error, "on fragment definitions")
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe GraphQL::StaticValidation::FragmentsAreUsed do
|
4
|
+
let(:document) { GraphQL.parse("
|
5
|
+
query getCheese {
|
6
|
+
name,
|
7
|
+
...cheeseFields
|
8
|
+
...undefinedFields
|
9
|
+
}
|
10
|
+
fragment cheeseFields on Cheese { fatContent }
|
11
|
+
fragment unusedFields on Cheese { is, not, used }
|
12
|
+
")}
|
13
|
+
|
14
|
+
let(:validator) { GraphQL::StaticValidation::Validator.new(schema: DummySchema, validators: [GraphQL::StaticValidation::FragmentsAreUsed]) }
|
15
|
+
let(:errors) { validator.validate(document) }
|
16
|
+
|
17
|
+
it 'adds errors for unused fragment definitions' do
|
18
|
+
assert_includes(errors, {"message"=>"Fragment unusedFields was defined, but not used", "locations"=>[{"line"=>8, "column"=>5}]})
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'adds errors for undefined fragment spreads' do
|
22
|
+
assert_includes(errors, {"message"=>"Fragment undefinedFields was used, but not defined", "locations"=>[{"line"=>5, "column"=>7}]})
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe GraphQL::StaticValidation::RequiredArgumentsArePresent do
|
4
|
+
let(:document) { GraphQL.parse("
|
5
|
+
query getCheese {
|
6
|
+
cheese(id: 1) { source }
|
7
|
+
cheese { source }
|
8
|
+
}
|
9
|
+
|
10
|
+
fragment cheeseFields on Cheese {
|
11
|
+
similarCheeses(id: 1)
|
12
|
+
flavor @include(if: true)
|
13
|
+
id @skip
|
14
|
+
}
|
15
|
+
")}
|
16
|
+
|
17
|
+
let(:validator) { GraphQL::StaticValidation::Validator.new(schema: DummySchema, validators: [GraphQL::StaticValidation::RequiredArgumentsArePresent]) }
|
18
|
+
let(:errors) { validator.validate(document) }
|
19
|
+
|
20
|
+
it 'finds undefined arguments to fields and directives' do
|
21
|
+
assert_equal(3, errors.length)
|
22
|
+
|
23
|
+
query_root_error = {
|
24
|
+
"message"=>"Field 'cheese' is missing required arguments: id",
|
25
|
+
"locations"=>[{"line"=>4, "column"=>7}]
|
26
|
+
}
|
27
|
+
assert_includes(errors, query_root_error)
|
28
|
+
|
29
|
+
fragment_error = {
|
30
|
+
"message"=>"Field 'similarCheeses' is missing required arguments: source",
|
31
|
+
"locations"=>[{"line"=>8, "column"=>7}]
|
32
|
+
}
|
33
|
+
assert_includes(errors, fragment_error)
|
34
|
+
|
35
|
+
directive_error = {
|
36
|
+
"message"=>"Directive 'skip' is missing required arguments: if",
|
37
|
+
"locations"=>[{"line"=>10, "column"=>11}]
|
38
|
+
}
|
39
|
+
assert_includes(errors, directive_error)
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class TypeCheckValidator
|
4
|
+
def self.checks
|
5
|
+
@checks ||= []
|
6
|
+
end
|
7
|
+
|
8
|
+
def validate(context)
|
9
|
+
self.class.checks.clear
|
10
|
+
context.visitor[GraphQL::Nodes::Field] << -> (node, parent) {
|
11
|
+
self.class.checks << context.object_types.map(&:name)
|
12
|
+
}
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe GraphQL::StaticValidation::TypeStack do
|
17
|
+
let(:query_string) {%|
|
18
|
+
query getCheese {
|
19
|
+
cheese(id: 1) { id, ... edibleFields }
|
20
|
+
}
|
21
|
+
fragment edibleFields on Edible { fatContent }
|
22
|
+
|}
|
23
|
+
let(:document) { GraphQL.parse(query_string) }
|
24
|
+
let(:validator) { GraphQL::StaticValidation::Validator.new(schema: DummySchema, validators: [TypeCheckValidator]) }
|
25
|
+
|
26
|
+
it 'stores up types' do
|
27
|
+
validator.validate(document)
|
28
|
+
expected = [
|
29
|
+
["Query", "Cheese"],
|
30
|
+
["Query", "Cheese", "Non-Null"],
|
31
|
+
["Edible", "Non-Null"]
|
32
|
+
]
|
33
|
+
assert_equal(expected, TypeCheckValidator.checks)
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class SchemaErrorValidator
|
4
|
+
def validate(context)
|
5
|
+
context.errors << GraphQL::StaticValidation::Message.new("Something is wrong: #{context.schema}", line: 100, col: 4)
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
class DocumentErrorValidator
|
10
|
+
include
|
11
|
+
def validate(context)
|
12
|
+
context.errors << GraphQL::StaticValidation::Message.new("Something is wrong: #{context.document.name}", line: 1, col: 1)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
describe GraphQL::StaticValidation::Validator do
|
17
|
+
let(:document) { OpenStruct.new(name: "This is not a document", children: []) }
|
18
|
+
let(:validator) { GraphQL::StaticValidation::Validator.new(schema: "This is not a schema", validators: [SchemaErrorValidator, DocumentErrorValidator]) }
|
19
|
+
|
20
|
+
it 'uses validators' do
|
21
|
+
errors = validator.validate(document)
|
22
|
+
expected_errors = [
|
23
|
+
{"message" => "Something is wrong: This is not a schema", "locations" => [{"line" => 100, "column" => 4}]},
|
24
|
+
{"message" => "Something is wrong: This is not a document", "locations" => [{"line" => 1, "column" => 1}]}
|
25
|
+
]
|
26
|
+
assert_equal(expected_errors, errors)
|
27
|
+
end
|
28
|
+
end
|
data/spec/graph_ql/union_spec.rb
CHANGED
@@ -3,24 +3,11 @@ require 'spec_helper'
|
|
3
3
|
describe GraphQL::Union do
|
4
4
|
let(:type_1) { OpenStruct.new(kind: GraphQL::TypeKinds::OBJECT)}
|
5
5
|
let(:type_2) { OpenStruct.new(kind: GraphQL::TypeKinds::OBJECT)}
|
6
|
-
let(:union) { GraphQL::Union.new("MyUnion", [type_1, type_2]) }
|
6
|
+
let(:union) { GraphQL::Union.new("MyUnion", "Some items", [type_1, type_2]) }
|
7
7
|
it 'has a name' do
|
8
8
|
assert_equal("MyUnion", union.name)
|
9
9
|
end
|
10
10
|
|
11
|
-
it 'identifies members' do
|
12
|
-
assert(union.include?(type_1))
|
13
|
-
assert(!union.include?(:type_3))
|
14
|
-
end
|
15
|
-
|
16
|
-
it 'must be 2+ types' do
|
17
|
-
assert_raises(ArgumentError) { GraphQL::Union.new("Something", [type_1])}
|
18
|
-
end
|
19
|
-
|
20
|
-
it 'must be all object types' do
|
21
|
-
assert_raises(ArgumentError) { GraphQL::Union.new("Something", [type_1, type_2, union])}
|
22
|
-
end
|
23
|
-
|
24
11
|
it 'infers type from an object' do
|
25
12
|
assert_equal(CheeseType, DairyProductUnion.resolve_type(CHEESES[1]))
|
26
13
|
end
|
data/spec/support/dummy_app.rb
CHANGED
@@ -1,18 +1,21 @@
|
|
1
1
|
require_relative './dummy_data'
|
2
2
|
|
3
|
-
|
4
|
-
name "Edible"
|
5
|
-
description "Something you can eat, yum"
|
6
|
-
fields({
|
7
|
-
fatContent: field(
|
3
|
+
EdibleInterface = GraphQL::Interface.new do |i, type, field|
|
4
|
+
i.name "Edible"
|
5
|
+
i.description "Something you can eat, yum"
|
6
|
+
i.fields({
|
7
|
+
fatContent: field.build(
|
8
|
+
type: !type.Float,
|
9
|
+
property: :non_existent_field_that_should_never_be_called,
|
10
|
+
desc: "Percentage which is fat"),
|
8
11
|
})
|
9
12
|
end
|
10
13
|
|
11
|
-
|
12
|
-
name "AnimalProduct"
|
13
|
-
description "Comes from an animal, no joke"
|
14
|
-
fields({
|
15
|
-
source: field(type: !type.String, desc: "Animal which produced this product"),
|
14
|
+
AnimalProductInterface = GraphQL::Interface.new do |i, type, field|
|
15
|
+
i.name "AnimalProduct"
|
16
|
+
i.description "Comes from an animal, no joke"
|
17
|
+
i.fields({
|
18
|
+
source: field.build(type: !type.String, desc: "Animal which produced this product"),
|
16
19
|
})
|
17
20
|
end
|
18
21
|
|
@@ -25,52 +28,64 @@ DairyAnimalEnum = GraphQL::Enum.new do |e|
|
|
25
28
|
e.value("YAK", "Animal with long hair", deprecation_reason: "Out of fashion")
|
26
29
|
end
|
27
30
|
|
28
|
-
CheeseType = GraphQL::ObjectType.new do
|
29
|
-
name "Cheese"
|
30
|
-
description "Cultured dairy product"
|
31
|
-
interfaces [
|
32
|
-
|
33
|
-
id: field(type: !type.Int, desc: "Unique identifier"),
|
34
|
-
flavor: field(type: !type.String, desc: "Kind of cheese"),
|
35
|
-
source: field(type: !DairyAnimalEnum, desc: "Animal which produced the milk for this cheese"),
|
36
|
-
|
31
|
+
CheeseType = GraphQL::ObjectType.new do |t, type, field, arg|
|
32
|
+
t.name "Cheese"
|
33
|
+
t.description "Cultured dairy product"
|
34
|
+
t.interfaces [EdibleInterface, AnimalProductInterface]
|
35
|
+
t.fields = {
|
36
|
+
id: field.build(type: !type.Int, desc: "Unique identifier"),
|
37
|
+
flavor: field.build(type: !type.String, desc: "Kind of cheese"),
|
38
|
+
source: field.build(type: !DairyAnimalEnum, desc: "Animal which produced the milk for this cheese"),
|
39
|
+
similarCheeses: GraphQL::Field.new do |f|
|
40
|
+
f.description "Cheeses like this one"
|
41
|
+
f.type(t)
|
42
|
+
f.arguments({source: arg.build(type: !type[!DairyAnimalEnum])})
|
43
|
+
f.resolve -> (t, a, c) { CHEESES.values.find { |c| c.source == a["source"] } }
|
44
|
+
end,
|
45
|
+
fatContent: field.build(type: !type.Float, desc: "Percentage which is milkfat", deprecation_reason: "Diet fashion has changed"),
|
37
46
|
}
|
38
47
|
end
|
39
48
|
|
40
|
-
MilkType = GraphQL::ObjectType.new do
|
41
|
-
name 'Milk'
|
42
|
-
description "Dairy beverage"
|
43
|
-
interfaces [
|
44
|
-
|
45
|
-
id: field(type: !type.Int, desc: "Unique identifier"),
|
46
|
-
source: field(type: DairyAnimalEnum, desc: "Animal which produced this milk"),
|
47
|
-
fatContent: field(type: !type.Float, desc: "Percentage which is milkfat"),
|
48
|
-
flavors: field(
|
49
|
+
MilkType = GraphQL::ObjectType.new do |t, type, field, arg|
|
50
|
+
t.name 'Milk'
|
51
|
+
t.description "Dairy beverage"
|
52
|
+
t.interfaces [EdibleInterface, AnimalProductInterface]
|
53
|
+
t.fields = {
|
54
|
+
id: field.build(type: !type.Int, desc: "Unique identifier"),
|
55
|
+
source: field.build(type: DairyAnimalEnum, desc: "Animal which produced this milk"),
|
56
|
+
fatContent: field.build(type: !type.Float, desc: "Percentage which is milkfat"),
|
57
|
+
flavors: field.build(
|
49
58
|
type: type[type.String],
|
50
59
|
desc: "Chocolate, Strawberry, etc",
|
51
|
-
args: {limit: {type: type.Int}}
|
60
|
+
args: {limit: arg.build({type: type.Int})}
|
52
61
|
),
|
53
62
|
}
|
54
63
|
end
|
55
64
|
|
56
|
-
DairyProductUnion = GraphQL::Union.new(
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
65
|
+
DairyProductUnion = GraphQL::Union.new(
|
66
|
+
"DairyProduct",
|
67
|
+
"Kinds of food made from milk",
|
68
|
+
[MilkType, CheeseType]
|
69
|
+
)
|
70
|
+
|
71
|
+
DairyProductInputType = GraphQL::InputObjectType.new {|t, type, field, arg|
|
72
|
+
t.name "DairyProductInput"
|
73
|
+
t.description "Properties for finding a dairy product"
|
74
|
+
t.input_fields({
|
75
|
+
source: arg.build({type: DairyAnimalEnum}),
|
76
|
+
fatContent: arg.build({type: type.Float}),
|
64
77
|
})
|
65
78
|
}
|
66
79
|
|
67
80
|
|
68
|
-
class FetchField
|
69
|
-
attr_reader :type
|
81
|
+
class FetchField
|
82
|
+
attr_reader :type, :arguments, :deprecation_reason
|
70
83
|
attr_accessor :name
|
71
84
|
def initialize(type:, data:)
|
72
85
|
@type = type
|
73
86
|
@data = data
|
87
|
+
@arguments = {"id" => GraphQL::InputValue.new(type: !GraphQL::INT_TYPE, name: "id")}
|
88
|
+
@deprecation_reason = nil
|
74
89
|
end
|
75
90
|
|
76
91
|
def description
|
@@ -82,9 +97,10 @@ class FetchField < GraphQL::AbstractField
|
|
82
97
|
end
|
83
98
|
end
|
84
99
|
|
85
|
-
SourceField = GraphQL::Field.new do |f|
|
100
|
+
SourceField = GraphQL::Field.new do |f, type, field, arg|
|
86
101
|
f.type GraphQL::ListType.new(of_type: CheeseType)
|
87
102
|
f.description "Cheese from source"
|
103
|
+
f.arguments(source: arg.build(type: !DairyAnimalEnum))
|
88
104
|
f.resolve -> (target, arguments, context) {
|
89
105
|
CHEESES.values.select{ |c| c.source == arguments["source"] }
|
90
106
|
}
|
@@ -92,23 +108,23 @@ end
|
|
92
108
|
|
93
109
|
FavoriteField = GraphQL::Field.new do |f|
|
94
110
|
f.description "My favorite food"
|
95
|
-
f.type
|
111
|
+
f.type EdibleInterface
|
96
112
|
f.resolve -> (t, a, c) { MILKS[1] }
|
97
113
|
end
|
98
114
|
|
99
115
|
|
100
|
-
QueryType = GraphQL::ObjectType.new do
|
101
|
-
name "Query"
|
102
|
-
description "Query root of the system"
|
103
|
-
fields({
|
116
|
+
QueryType = GraphQL::ObjectType.new do |t, types, field, arg|
|
117
|
+
t.name "Query"
|
118
|
+
t.description "Query root of the system"
|
119
|
+
t.fields({
|
104
120
|
cheese: FetchField.new(type: CheeseType, data: CHEESES),
|
105
121
|
fromSource: SourceField,
|
106
122
|
favoriteEdible: FavoriteField,
|
107
123
|
searchDairy: GraphQL::Field.new { |f|
|
108
124
|
f.name "searchDairy"
|
109
125
|
f.description "Find dairy products matching a description"
|
110
|
-
f.type DairyProductUnion
|
111
|
-
f.arguments({product: {type: DairyProductInputType}})
|
126
|
+
f.type !DairyProductUnion
|
127
|
+
f.arguments({product: arg.build({type: DairyProductInputType})})
|
112
128
|
f.resolve -> (t, a, c) {
|
113
129
|
products = CHEESES.values + MILKS.values
|
114
130
|
source = a["product"]["source"]
|
@@ -117,20 +133,25 @@ QueryType = GraphQL::ObjectType.new do
|
|
117
133
|
end
|
118
134
|
products.first
|
119
135
|
}
|
120
|
-
}
|
136
|
+
},
|
137
|
+
error: GraphQL::Field.new { |f|
|
138
|
+
f.description "Raise an error"
|
139
|
+
f.type GraphQL::STRING_TYPE
|
140
|
+
f.resolve -> (t, a, c) { raise("This error was raised on purpose") }
|
141
|
+
},
|
121
142
|
})
|
122
143
|
end
|
123
144
|
|
124
145
|
GLOBAL_VALUES = []
|
125
146
|
|
126
|
-
MutationType = GraphQL::ObjectType.new do
|
127
|
-
name "Mutation"
|
128
|
-
description "The root for mutations in this schema"
|
129
|
-
fields({
|
147
|
+
MutationType = GraphQL::ObjectType.new do |t, type, field, arg|
|
148
|
+
t.name "Mutation"
|
149
|
+
t.description "The root for mutations in this schema"
|
150
|
+
t.fields({
|
130
151
|
pushValue: GraphQL::Field.new { |f|
|
131
152
|
f.description("Push a value onto a global array :D")
|
132
153
|
f.type(!type[!type.Int])
|
133
|
-
f.arguments(value: arg(type: !type.Int))
|
154
|
+
f.arguments(value: arg.build(type: !type.Int))
|
134
155
|
f.resolve -> (o, args, ctx) {
|
135
156
|
GLOBAL_VALUES << args["value"]
|
136
157
|
GLOBAL_VALUES
|
@@ -138,4 +159,5 @@ MutationType = GraphQL::ObjectType.new do
|
|
138
159
|
}
|
139
160
|
})
|
140
161
|
end
|
162
|
+
|
141
163
|
DummySchema = GraphQL::Schema.new(query: QueryType, mutation: MutationType)
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: graphql
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robert Mosolgo
|
@@ -10,20 +10,6 @@ bindir: bin
|
|
10
10
|
cert_chain: []
|
11
11
|
date: 2015-03-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: activesupport
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '4'
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - "~>"
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '4'
|
27
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: parslet
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
@@ -177,9 +163,7 @@ files:
|
|
177
163
|
- lib/graph_ql/directives/include_directive.rb
|
178
164
|
- lib/graph_ql/directives/skip_directive.rb
|
179
165
|
- lib/graph_ql/enum.rb
|
180
|
-
- lib/graph_ql/
|
181
|
-
- lib/graph_ql/fields/access_field.rb
|
182
|
-
- lib/graph_ql/fields/field.rb
|
166
|
+
- lib/graph_ql/field.rb
|
183
167
|
- lib/graph_ql/interface.rb
|
184
168
|
- lib/graph_ql/introspection/arguments_field.rb
|
185
169
|
- lib/graph_ql/introspection/directive_type.rb
|
@@ -189,11 +173,14 @@ files:
|
|
189
173
|
- lib/graph_ql/introspection/fields_field.rb
|
190
174
|
- lib/graph_ql/introspection/input_fields_field.rb
|
191
175
|
- lib/graph_ql/introspection/input_value_type.rb
|
176
|
+
- lib/graph_ql/introspection/interfaces_field.rb
|
192
177
|
- lib/graph_ql/introspection/of_type_field.rb
|
193
178
|
- lib/graph_ql/introspection/possible_types_field.rb
|
194
179
|
- lib/graph_ql/introspection/schema_type.rb
|
195
180
|
- lib/graph_ql/introspection/type_kind_enum.rb
|
196
181
|
- lib/graph_ql/introspection/type_type.rb
|
182
|
+
- lib/graph_ql/introspection/typename_field.rb
|
183
|
+
- lib/graph_ql/parser.rb
|
197
184
|
- lib/graph_ql/parser/nodes.rb
|
198
185
|
- lib/graph_ql/parser/parser.rb
|
199
186
|
- lib/graph_ql/parser/transform.rb
|
@@ -208,10 +195,31 @@ files:
|
|
208
195
|
- lib/graph_ql/query/type_resolver.rb
|
209
196
|
- lib/graph_ql/repl.rb
|
210
197
|
- lib/graph_ql/schema.rb
|
198
|
+
- lib/graph_ql/schema/each_item_validator.rb
|
199
|
+
- lib/graph_ql/schema/field_validator.rb
|
200
|
+
- lib/graph_ql/schema/implementation_validator.rb
|
201
|
+
- lib/graph_ql/schema/schema_validator.rb
|
211
202
|
- lib/graph_ql/schema/type_reducer.rb
|
203
|
+
- lib/graph_ql/schema/type_validator.rb
|
204
|
+
- lib/graph_ql/static_validation.rb
|
205
|
+
- lib/graph_ql/static_validation/argument_literals_are_compatible.rb
|
206
|
+
- lib/graph_ql/static_validation/arguments_are_defined.rb
|
207
|
+
- lib/graph_ql/static_validation/arguments_validator.rb
|
208
|
+
- lib/graph_ql/static_validation/directives_are_defined.rb
|
209
|
+
- lib/graph_ql/static_validation/fields_are_defined_on_type.rb
|
210
|
+
- lib/graph_ql/static_validation/fields_have_appropriate_selections.rb
|
211
|
+
- lib/graph_ql/static_validation/fields_will_merge.rb
|
212
|
+
- lib/graph_ql/static_validation/fragment_types_exist.rb
|
213
|
+
- lib/graph_ql/static_validation/fragments_are_used.rb
|
214
|
+
- lib/graph_ql/static_validation/literal_validator.rb
|
215
|
+
- lib/graph_ql/static_validation/message.rb
|
216
|
+
- lib/graph_ql/static_validation/required_arguments_are_present.rb
|
217
|
+
- lib/graph_ql/static_validation/type_stack.rb
|
218
|
+
- lib/graph_ql/static_validation/validator.rb
|
212
219
|
- lib/graph_ql/type_kinds.rb
|
213
|
-
- lib/graph_ql/types/
|
220
|
+
- lib/graph_ql/types/argument_definer.rb
|
214
221
|
- lib/graph_ql/types/boolean_type.rb
|
222
|
+
- lib/graph_ql/types/field_definer.rb
|
215
223
|
- lib/graph_ql/types/float_type.rb
|
216
224
|
- lib/graph_ql/types/input_object_type.rb
|
217
225
|
- lib/graph_ql/types/input_value.rb
|
@@ -224,10 +232,6 @@ files:
|
|
224
232
|
- lib/graph_ql/types/string_type.rb
|
225
233
|
- lib/graph_ql/types/type_definer.rb
|
226
234
|
- lib/graph_ql/union.rb
|
227
|
-
- lib/graph_ql/validations/fields_are_defined_on_type.rb
|
228
|
-
- lib/graph_ql/validations/fields_will_merge.rb
|
229
|
-
- lib/graph_ql/validations/fragments_are_used.rb
|
230
|
-
- lib/graph_ql/validator.rb
|
231
235
|
- lib/graph_ql/version.rb
|
232
236
|
- lib/graphql.rb
|
233
237
|
- readme.md
|
@@ -243,14 +247,23 @@ files:
|
|
243
247
|
- spec/graph_ql/parser/visitor_spec.rb
|
244
248
|
- spec/graph_ql/query/operation_resolver_spec.rb
|
245
249
|
- spec/graph_ql/query_spec.rb
|
250
|
+
- spec/graph_ql/schema/field_validator_spec.rb
|
246
251
|
- spec/graph_ql/schema/type_reducer_spec.rb
|
252
|
+
- spec/graph_ql/schema/type_validator_spec.rb
|
253
|
+
- spec/graph_ql/static_validation/argument_literals_are_compatible_spec.rb
|
254
|
+
- spec/graph_ql/static_validation/arguments_are_defined_spec.rb
|
255
|
+
- spec/graph_ql/static_validation/directives_are_defined_spec.rb
|
256
|
+
- spec/graph_ql/static_validation/fields_are_defined_on_type_spec.rb
|
257
|
+
- spec/graph_ql/static_validation/fields_have_appropriate_selections_spec.rb
|
258
|
+
- spec/graph_ql/static_validation/fields_will_merge_spec.rb
|
259
|
+
- spec/graph_ql/static_validation/fragment_types_exist_spec.rb
|
260
|
+
- spec/graph_ql/static_validation/fragments_are_used_spec.rb
|
261
|
+
- spec/graph_ql/static_validation/required_arguments_are_present_spec.rb
|
262
|
+
- spec/graph_ql/static_validation/type_stack_spec.rb
|
263
|
+
- spec/graph_ql/static_validation/validator_spec.rb
|
247
264
|
- spec/graph_ql/types/input_object_type_spec.rb
|
248
265
|
- spec/graph_ql/types/object_type_spec.rb
|
249
266
|
- spec/graph_ql/union_spec.rb
|
250
|
-
- spec/graph_ql/validations/fields_are_defined_on_type_spec.rb
|
251
|
-
- spec/graph_ql/validations/fields_will_merge_spec.rb
|
252
|
-
- spec/graph_ql/validations/fragments_are_used_spec.rb
|
253
|
-
- spec/graph_ql/validator_spec.rb
|
254
267
|
- spec/spec_helper.rb
|
255
268
|
- spec/support/dummy_app.rb
|
256
269
|
- spec/support/dummy_data.rb
|
@@ -291,14 +304,23 @@ test_files:
|
|
291
304
|
- spec/graph_ql/parser/visitor_spec.rb
|
292
305
|
- spec/graph_ql/query/operation_resolver_spec.rb
|
293
306
|
- spec/graph_ql/query_spec.rb
|
307
|
+
- spec/graph_ql/schema/field_validator_spec.rb
|
294
308
|
- spec/graph_ql/schema/type_reducer_spec.rb
|
309
|
+
- spec/graph_ql/schema/type_validator_spec.rb
|
310
|
+
- spec/graph_ql/static_validation/argument_literals_are_compatible_spec.rb
|
311
|
+
- spec/graph_ql/static_validation/arguments_are_defined_spec.rb
|
312
|
+
- spec/graph_ql/static_validation/directives_are_defined_spec.rb
|
313
|
+
- spec/graph_ql/static_validation/fields_are_defined_on_type_spec.rb
|
314
|
+
- spec/graph_ql/static_validation/fields_have_appropriate_selections_spec.rb
|
315
|
+
- spec/graph_ql/static_validation/fields_will_merge_spec.rb
|
316
|
+
- spec/graph_ql/static_validation/fragment_types_exist_spec.rb
|
317
|
+
- spec/graph_ql/static_validation/fragments_are_used_spec.rb
|
318
|
+
- spec/graph_ql/static_validation/required_arguments_are_present_spec.rb
|
319
|
+
- spec/graph_ql/static_validation/type_stack_spec.rb
|
320
|
+
- spec/graph_ql/static_validation/validator_spec.rb
|
295
321
|
- spec/graph_ql/types/input_object_type_spec.rb
|
296
322
|
- spec/graph_ql/types/object_type_spec.rb
|
297
323
|
- spec/graph_ql/union_spec.rb
|
298
|
-
- spec/graph_ql/validations/fields_are_defined_on_type_spec.rb
|
299
|
-
- spec/graph_ql/validations/fields_will_merge_spec.rb
|
300
|
-
- spec/graph_ql/validations/fragments_are_used_spec.rb
|
301
|
-
- spec/graph_ql/validator_spec.rb
|
302
324
|
- spec/spec_helper.rb
|
303
325
|
- spec/support/dummy_app.rb
|
304
326
|
- spec/support/dummy_data.rb
|