graphql 0.1.0 → 0.2.0
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 +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
|