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
@@ -1,14 +1,10 @@
|
|
1
1
|
class GraphQL::TypeDefiner
|
2
|
-
|
3
|
-
Int: GraphQL::INT_TYPE,
|
4
|
-
String: GraphQL::STRING_TYPE,
|
5
|
-
Float: GraphQL::FLOAT_TYPE,
|
6
|
-
Boolean: GraphQL::BOOLEAN_TYPE,
|
7
|
-
}
|
2
|
+
include Singleton
|
8
3
|
|
9
|
-
|
10
|
-
|
11
|
-
end
|
4
|
+
def Int; GraphQL::INT_TYPE; end
|
5
|
+
def String; GraphQL::STRING_TYPE; end
|
6
|
+
def Float; GraphQL::FLOAT_TYPE; end
|
7
|
+
def Boolean; GraphQL::BOOLEAN_TYPE; end
|
12
8
|
|
13
9
|
def [](type)
|
14
10
|
GraphQL::ListType.new(of_type: type)
|
data/lib/graph_ql/union.rb
CHANGED
@@ -1,25 +1,14 @@
|
|
1
1
|
class GraphQL::Union
|
2
2
|
include GraphQL::NonNullWithBang
|
3
|
-
attr_reader :name, :possible_types
|
4
|
-
def initialize(name, types)
|
5
|
-
if types.length < 2
|
6
|
-
raise ArgumentError, "Union #{name} must be defined with 2 or more types, not #{types.length}"
|
7
|
-
end
|
8
|
-
|
9
|
-
non_object_types = types.select {|t| t.kind != GraphQL::TypeKinds::OBJECT}
|
10
|
-
if non_object_types.any?
|
11
|
-
types_string = non_object_types.map{|t| "#{t.name} #{t.kind}"}.join(", ")
|
12
|
-
raise ArgumentError, "Unions can only consist of Object types, but #{name} has non-object types: #{types_string}"
|
13
|
-
end
|
14
|
-
|
3
|
+
attr_reader :name, :description, :possible_types
|
4
|
+
def initialize(name, desc, types)
|
15
5
|
@name = name
|
6
|
+
@description = desc
|
16
7
|
@possible_types = types
|
17
8
|
end
|
18
9
|
|
19
|
-
def kind
|
20
|
-
|
21
|
-
def include?(type)
|
22
|
-
possible_types.include?(type)
|
10
|
+
def kind
|
11
|
+
GraphQL::TypeKinds::UNION
|
23
12
|
end
|
24
13
|
|
25
14
|
# Find a type in this union for a given object.
|
@@ -30,6 +19,6 @@ class GraphQL::Union
|
|
30
19
|
end
|
31
20
|
|
32
21
|
def to_s
|
33
|
-
"<GraphQL::Union #{name}
|
22
|
+
"<GraphQL::Union #{name}>"
|
34
23
|
end
|
35
24
|
end
|
data/lib/graph_ql/version.rb
CHANGED
data/lib/graphql.rb
CHANGED
@@ -1,84 +1,8 @@
|
|
1
|
-
require "active_support/core_ext/object/blank"
|
2
|
-
require "active_support/core_ext/string/inflections"
|
3
|
-
require "active_support/dependencies/autoload"
|
4
1
|
require "json"
|
5
2
|
require "parslet"
|
3
|
+
require "singleton"
|
6
4
|
|
7
5
|
module GraphQL
|
8
|
-
extend ActiveSupport::Autoload
|
9
|
-
autoload(:Directive)
|
10
|
-
autoload(:Enum)
|
11
|
-
autoload(:Interface)
|
12
|
-
autoload(:Parser)
|
13
|
-
autoload(:Query)
|
14
|
-
autoload(:Repl)
|
15
|
-
autoload(:Schema)
|
16
|
-
autoload(:TypeKinds)
|
17
|
-
autoload(:Union)
|
18
|
-
autoload(:Validator)
|
19
|
-
autoload(:VERSION)
|
20
|
-
|
21
|
-
autoload_under "directives" do
|
22
|
-
autoload(:DirectiveChain)
|
23
|
-
autoload(:IncludeDirective)
|
24
|
-
autoload(:SkipDirective)
|
25
|
-
end
|
26
|
-
|
27
|
-
autoload_under "fields" do
|
28
|
-
autoload(:AbstractField)
|
29
|
-
autoload(:AccessField)
|
30
|
-
autoload(:Field)
|
31
|
-
end
|
32
|
-
|
33
|
-
autoload_under "introspection" do
|
34
|
-
autoload(:ArgumentsField)
|
35
|
-
autoload(:DirectiveType)
|
36
|
-
autoload(:EnumValuesField)
|
37
|
-
autoload(:EnumValueType)
|
38
|
-
autoload(:FieldType)
|
39
|
-
autoload(:FieldsField)
|
40
|
-
autoload(:InputValueType)
|
41
|
-
autoload(:InputFieldsField)
|
42
|
-
autoload(:OfTypeField)
|
43
|
-
autoload(:PossibleTypesField)
|
44
|
-
autoload(:SchemaType)
|
45
|
-
autoload(:TypeKindEnum)
|
46
|
-
autoload(:TypeType)
|
47
|
-
end
|
48
|
-
|
49
|
-
autoload_under "parser" do
|
50
|
-
autoload(:Nodes)
|
51
|
-
autoload(:Parser)
|
52
|
-
autoload(:Transform)
|
53
|
-
autoload(:Visitor)
|
54
|
-
end
|
55
|
-
|
56
|
-
autoload_under "types" do
|
57
|
-
autoload(:AbstractType)
|
58
|
-
autoload(:BOOLEAN_TYPE)
|
59
|
-
autoload(:ScalarType)
|
60
|
-
autoload(:FLOAT_TYPE)
|
61
|
-
autoload(:InputObjectType)
|
62
|
-
autoload(:InputValue)
|
63
|
-
autoload(:INT_TYPE)
|
64
|
-
autoload(:ListType)
|
65
|
-
autoload(:NonNullType)
|
66
|
-
autoload(:NonNullWithBang)
|
67
|
-
autoload(:ObjectType)
|
68
|
-
autoload(:STRING_TYPE)
|
69
|
-
autoload(:TypeDefiner)
|
70
|
-
end
|
71
|
-
|
72
|
-
module Validations
|
73
|
-
extend ActiveSupport::Autoload
|
74
|
-
autoload(:FieldsWillMerge)
|
75
|
-
autoload(:FragmentsAreUsed)
|
76
|
-
autoload(:FieldsAreDefinedOnType)
|
77
|
-
end
|
78
|
-
|
79
|
-
PARSER = Parser.new
|
80
|
-
TRANSFORM = Transform.new
|
81
|
-
|
82
6
|
def self.parse(string, as: nil)
|
83
7
|
parser = as ? GraphQL::PARSER.send(as) : GraphQL::PARSER
|
84
8
|
tree = parser.parse(string)
|
@@ -88,7 +12,6 @@ module GraphQL
|
|
88
12
|
raise [line, col, string].join(", ")
|
89
13
|
end
|
90
14
|
|
91
|
-
|
92
15
|
module Definable
|
93
16
|
def attr_definable(*names)
|
94
17
|
attr_accessor(*names)
|
@@ -111,4 +34,61 @@ module GraphQL
|
|
111
34
|
end
|
112
35
|
end
|
113
36
|
end
|
37
|
+
|
38
|
+
module Introspection; end
|
114
39
|
end
|
40
|
+
|
41
|
+
# Order matters for these:
|
42
|
+
|
43
|
+
require 'graph_ql/types/non_null_with_bang'
|
44
|
+
require 'graph_ql/types/object_type'
|
45
|
+
require 'graph_ql/types/list_type'
|
46
|
+
require 'graph_ql/types/scalar_type'
|
47
|
+
require 'graph_ql/types/non_null_type'
|
48
|
+
require 'graph_ql/types/input_value'
|
49
|
+
require 'graph_ql/types/input_object_type'
|
50
|
+
|
51
|
+
require 'graph_ql/types/type_definer'
|
52
|
+
require 'graph_ql/types/field_definer'
|
53
|
+
require 'graph_ql/types/argument_definer'
|
54
|
+
|
55
|
+
require 'graph_ql/enum'
|
56
|
+
require 'graph_ql/field'
|
57
|
+
require 'graph_ql/union'
|
58
|
+
require 'graph_ql/type_kinds'
|
59
|
+
require 'graph_ql/introspection/typename_field'
|
60
|
+
|
61
|
+
require 'graph_ql/types/int_type'
|
62
|
+
require 'graph_ql/types/string_type'
|
63
|
+
require 'graph_ql/types/float_type'
|
64
|
+
require 'graph_ql/types/boolean_type'
|
65
|
+
|
66
|
+
require 'graph_ql/introspection/input_value_type'
|
67
|
+
require 'graph_ql/introspection/enum_value_type'
|
68
|
+
require 'graph_ql/introspection/type_kind_enum'
|
69
|
+
|
70
|
+
require 'graph_ql/introspection/fields_field'
|
71
|
+
require 'graph_ql/introspection/of_type_field'
|
72
|
+
require 'graph_ql/introspection/input_fields_field'
|
73
|
+
require 'graph_ql/introspection/possible_types_field'
|
74
|
+
require 'graph_ql/introspection/enum_values_field'
|
75
|
+
require 'graph_ql/introspection/interfaces_field'
|
76
|
+
|
77
|
+
require 'graph_ql/introspection/type_type'
|
78
|
+
require 'graph_ql/introspection/field_type'
|
79
|
+
|
80
|
+
require 'graph_ql/introspection/arguments_field'
|
81
|
+
require 'graph_ql/introspection/directive_type'
|
82
|
+
require 'graph_ql/introspection/schema_type'
|
83
|
+
|
84
|
+
require 'graph_ql/parser'
|
85
|
+
require 'graph_ql/directive'
|
86
|
+
require 'graph_ql/schema'
|
87
|
+
|
88
|
+
# Order does not matter for these:
|
89
|
+
|
90
|
+
require 'graph_ql/interface'
|
91
|
+
require 'graph_ql/query'
|
92
|
+
require 'graph_ql/repl'
|
93
|
+
require 'graph_ql/static_validation'
|
94
|
+
require 'graph_ql/version'
|
data/readme.md
CHANGED
@@ -6,23 +6,96 @@
|
|
6
6
|
[![Test Coverage](https://codeclimate.com/github/rmosolgo/graphql-ruby/badges/coverage.svg)](https://codeclimate.com/github/rmosolgo/graphql-ruby)
|
7
7
|
[![built with love](https://cloud.githubusercontent.com/assets/2231765/6766607/d07992c6-cfc9-11e4-813f-d9240714dd50.png)](http://rmosolgo.github.io/react-badges/)
|
8
8
|
|
9
|
-
__Current status__: rewriting according to spec, see also the previous [prototype implementation](https://github.com/rmosolgo/graphql-ruby/tree/74ad3c30a6d8db010ec3856f5871f8a02fcfba42)!
|
10
|
-
|
11
9
|
## Overview
|
12
10
|
|
13
|
-
-
|
14
|
-
|
11
|
+
- __Install the gem__:
|
12
|
+
|
13
|
+
```ruby
|
14
|
+
# Gemfile
|
15
|
+
gem 'graphql'
|
16
|
+
```
|
17
|
+
|
18
|
+
```
|
19
|
+
$ bundle install
|
20
|
+
```
|
21
|
+
|
22
|
+
- __Declare types & build a schema__:
|
23
|
+
|
24
|
+
```ruby
|
25
|
+
# Declare a type...
|
26
|
+
PostType = GraphQL::ObjectType.new do |t, types, field|
|
27
|
+
t.name "Post"
|
28
|
+
t.description "A blog post"
|
29
|
+
t.fields({
|
30
|
+
id: field.build(type: !types.Int)
|
31
|
+
title: field.build(type: !types.String),
|
32
|
+
body: field.build(type: !types.String),
|
33
|
+
comments: field.build(type: types[!CommentType])
|
34
|
+
})
|
35
|
+
end
|
36
|
+
|
37
|
+
# ...and a query root
|
38
|
+
QueryType = GraphQL::ObjectType.new do |t, types, field, arg|
|
39
|
+
t.name "Query"
|
40
|
+
t.description "The query root of this schema"
|
41
|
+
t.fields({
|
42
|
+
post: GraphQL::Field.new do |f|
|
43
|
+
f.arguments(id: arg.build(type: !types.Int))
|
44
|
+
f.resolve -> (object, args, context) {
|
45
|
+
Post.find(args["id"])
|
46
|
+
}
|
47
|
+
end
|
48
|
+
})
|
49
|
+
end
|
50
|
+
|
51
|
+
# Then create your schema
|
52
|
+
Schema = GraphQL::Schema.new(query: QueryType, mutation: nil)
|
53
|
+
```
|
54
|
+
|
55
|
+
See also:
|
56
|
+
- the [test schema](https://github.com/rmosolgo/graphql-ruby/blob/master/spec/support/dummy_app.rb)
|
57
|
+
- [`graphql-ruby-demo`](https://github.com/rmosolgo/graphql-ruby-demo) for an example schema on Rails
|
58
|
+
|
59
|
+
- __Execute queries__:
|
60
|
+
|
61
|
+
```ruby
|
62
|
+
query = GraphQL::Query.new(Schema, query_string)
|
63
|
+
result_hash = query.result
|
64
|
+
# {
|
65
|
+
# "data" => {
|
66
|
+
# "post" => {
|
67
|
+
# "id" => 1,
|
68
|
+
# "title" => "GraphQL is nice"
|
69
|
+
# }
|
70
|
+
# }
|
71
|
+
# }
|
72
|
+
```
|
73
|
+
|
74
|
+
See also:
|
75
|
+
- [query_spec.rb](https://github.com/rmosolgo/graphql-ruby/blob/master/spec/graph_ql/query_spec.rb) for an example of query execution.
|
76
|
+
- [`queries_controller.rb`](https://github.com/rmosolgo/graphql-ruby-demo/blob/master/app/controllers/queries_controller.rb) for a Rails example
|
77
|
+
- Try it on [heroku](http://graphql-ruby-demo.herokuapp.com)
|
15
78
|
|
16
79
|
## To Do:
|
17
80
|
|
18
81
|
- Validations:
|
19
|
-
-
|
20
|
-
|
21
|
-
|
82
|
+
- Implement validations:
|
83
|
+
- [Fragment spreads are on Object/Union/Interface](http://facebook.github.io/graphql/#sec-Fragments-On-Composite-Types)
|
84
|
+
- [Fragments don't go infinite](http://facebook.github.io/graphql/#sec-Fragment-spreads-must-not-form-cycles)
|
85
|
+
- [Fragment spreads are possible](http://facebook.github.io/graphql/#sec-Fragment-spread-is-possible)
|
86
|
+
- [In object scope, object-typed fragments are the same type](http://facebook.github.io/graphql/#sec-Object-Spreads-In-Object-Scope)
|
87
|
+
- [In object scope, abstract-typed fragments fit that object](http://facebook.github.io/graphql/#sec-Abstract-Spreads-in-Object-Scope)
|
88
|
+
- [In abstract scope, object-typed fragments fit that type](http://facebook.github.io/graphql/#sec-Object-Spreads-In-Abstract-Scope)
|
89
|
+
- [In abstract scope, abstract-typed fragments must share a type](http://facebook.github.io/graphql/#sec-Abstract-Spreads-in-Abstract-Scope)
|
90
|
+
- everything in [Variables](http://facebook.github.io/graphql/#sec-Validation.Operations.Variables)
|
22
91
|
- directives:
|
23
92
|
- `@skip` has precedence over `@include`
|
24
93
|
- directives on fragments: http://facebook.github.io/graphql/#sec-Fragment-Directives
|
94
|
+
- Support any "real" value for enum, not just stringified name (see `Character::EPISODES` in demo)
|
25
95
|
- field merging (https://github.com/graphql/graphql-js/issues/19#issuecomment-118515077)
|
96
|
+
- Code clean-up
|
97
|
+
- Unify unwrapping types (It's on `TypeKind` but it's still not right)
|
98
|
+
- de-dup stringify keys logic in `Field` and `ObjectType` and `Directive`
|
26
99
|
|
27
100
|
## Goals:
|
28
101
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe GraphQL::Interface do
|
4
|
-
let(:interface) {
|
4
|
+
let(:interface) { EdibleInterface }
|
5
5
|
it 'has possible types' do
|
6
6
|
assert_equal([CheeseType, MilkType], interface.possible_types)
|
7
7
|
end
|
@@ -10,4 +10,18 @@ describe GraphQL::Interface do
|
|
10
10
|
assert_equal(CheeseType, interface.resolve_type(CHEESES.values.first))
|
11
11
|
assert_equal(MilkType, interface.resolve_type(MILKS.values.first))
|
12
12
|
end
|
13
|
+
|
14
|
+
describe 'query evaluation' do
|
15
|
+
let(:query) { GraphQL::Query.new(DummySchema, query_string, context: {}, params: {"cheeseId" => 2})}
|
16
|
+
let(:result) { query.result }
|
17
|
+
let(:query_string) {%|
|
18
|
+
query fav {
|
19
|
+
favoriteEdible { fatContent }
|
20
|
+
}
|
21
|
+
|}
|
22
|
+
it 'gets fields from the type for the given object' do
|
23
|
+
expected = {"data"=>{"fav"=>{"favoriteEdible"=>{"fatContent"=>0.04}}}}
|
24
|
+
assert_equal(expected, result)
|
25
|
+
end
|
26
|
+
end
|
13
27
|
end
|
@@ -1,10 +1,10 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe GraphQL::DirectiveType do
|
3
|
+
describe GraphQL::Introspection::DirectiveType do
|
4
4
|
let(:query_string) {%|
|
5
5
|
query getDirectives {
|
6
6
|
__schema {
|
7
|
-
directives { name, args { name, type { name, ofType { name }} }, onField, onFragment, onOperation }
|
7
|
+
directives { name, args { name, type { name, ofType { name } } }, onField, onFragment, onOperation }
|
8
8
|
}
|
9
9
|
}
|
10
10
|
|}
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe GraphQL::SchemaType do
|
3
|
+
describe GraphQL::Introspection::SchemaType do
|
4
4
|
let(:query_string) {%|
|
5
5
|
query getSchema {
|
6
6
|
__schema {
|
@@ -21,6 +21,7 @@ describe GraphQL::SchemaType do
|
|
21
21
|
{"name"=>"fromSource"},
|
22
22
|
{"name"=>"favoriteEdible"},
|
23
23
|
{"name"=>"searchDairy"},
|
24
|
+
{"name"=>"error"},
|
24
25
|
{"name"=>"__typename"},
|
25
26
|
{"name"=>"__type"},
|
26
27
|
{"name"=>"__schema"},
|
@@ -1,9 +1,10 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe GraphQL::TypeType do
|
3
|
+
describe GraphQL::Introspection::TypeType do
|
4
4
|
let(:query_string) {%|
|
5
5
|
query introspectionQuery {
|
6
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 } } } }
|
7
8
|
dairyAnimal: __type(name: "DairyAnimal") { name, kind, enumValues(includeDeprecated: false) { name, isDeprecated } }
|
8
9
|
dairyProduct: __type(name: "DairyProduct") { name, kind, possibleTypes { name } }
|
9
10
|
animalProduct: __type(name: "AnimalProduct") { name, kind, possibleTypes { name }, fields { name } }
|
@@ -14,6 +15,7 @@ describe GraphQL::TypeType do
|
|
14
15
|
{"name"=>"id", "isDeprecated" => false, "type" => { "name" => "Non-Null", "ofType" => { "name" => "Int"}}},
|
15
16
|
{"name"=>"flavor", "isDeprecated" => false, "type" => { "name" => "Non-Null", "ofType" => { "name" => "String"}}},
|
16
17
|
{"name"=>"source", "isDeprecated" => false, "type" => { "name" => "Non-Null", "ofType" => { "name" => "DairyAnimal"}}},
|
18
|
+
{"name"=>"similarCheeses", "isDeprecated"=>false, "type"=>{"name"=>"Cheese", "ofType"=>nil}},
|
17
19
|
{"name"=>"__typename", "isDeprecated"=>false, "type"=> { "name" => "Non-Null", "ofType" => { "name" => "String"}}},
|
18
20
|
]}
|
19
21
|
|
@@ -29,6 +31,19 @@ describe GraphQL::TypeType do
|
|
29
31
|
"kind" => "OBJECT",
|
30
32
|
"fields"=> cheese_fields
|
31
33
|
},
|
34
|
+
"milkType"=>{
|
35
|
+
"interfaces"=>[
|
36
|
+
{"name"=>"Edible"},
|
37
|
+
{"name"=>"AnimalProduct"}
|
38
|
+
],
|
39
|
+
"fields"=>[
|
40
|
+
{"type"=>{"name"=>"Non-Null", "ofType"=>{"name"=>"Int"}}},
|
41
|
+
{"type"=>{"name"=>"DairyAnimal", "ofType"=>nil}},
|
42
|
+
{"type"=>{"name"=>"Non-Null", "ofType"=>{"name"=>"Float"}}},
|
43
|
+
{"type"=>{"name"=>"List", "ofType"=>{"name"=>"String"}}},
|
44
|
+
{"type"=>{"name"=>"Non-Null", "ofType"=>{"name"=>"String"}}}
|
45
|
+
]
|
46
|
+
},
|
32
47
|
"dairyAnimal"=>{
|
33
48
|
"name"=>"DairyAnimal",
|
34
49
|
"kind"=>"ENUM",
|
@@ -38,7 +38,7 @@ describe GraphQL::Parser do
|
|
38
38
|
assert(parser.operation_definition.parse_with_debug(%|{id, name, ...people}|), "just a selection")
|
39
39
|
assert(parser.operation_definition.parse_with_debug(%|query personStuff {id, name, ...people, ... stuff}|), "named fetch")
|
40
40
|
assert(parser.operation_definition.parse_with_debug(%|query personStuff @flagDirective {id, name, ...people}|), "with a directive")
|
41
|
-
assert(parser.operation_definition.parse_with_debug(%|mutation changeStuff($stuff: Int = 1, $things: [
|
41
|
+
assert(parser.operation_definition.parse_with_debug(%|mutation changeStuff($stuff: Int = 1, $things: [SomeType]!) {id, name, ...people}|), "mutation with arguments")
|
42
42
|
end
|
43
43
|
|
44
44
|
it 'parses fragment definitions' do
|
@@ -85,7 +85,9 @@ describe GraphQL::Parser do
|
|
85
85
|
it 'gets floats' do
|
86
86
|
assert(parser.value.parse_with_debug("1.14"), 'no exponent')
|
87
87
|
assert(parser.value.parse_with_debug("6.7e-9"), 'negative exponent')
|
88
|
+
assert(parser.value.parse_with_debug("6.7e+9"), 'positive exponent')
|
88
89
|
assert(parser.value.parse_with_debug("0.4e12"), 'exponent')
|
90
|
+
assert(parser.value.parse_with_debug("6.7E+9"), 'big e')
|
89
91
|
end
|
90
92
|
|
91
93
|
it 'gets booleans' do
|