graphql 0.19.4 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.yardopts +5 -0
- data/lib/graphql/define/assign_enum_value.rb +4 -3
- data/lib/graphql/enum_type.rb +3 -10
- data/lib/graphql/language/generation.rb +6 -2
- data/lib/graphql/language/parser.rb +270 -270
- data/lib/graphql/language/parser.y +2 -2
- data/lib/graphql/language/parser_tests.rb +2 -2
- data/lib/graphql/query.rb +33 -38
- data/lib/graphql/query/serial_execution/field_resolution.rb +29 -33
- data/lib/graphql/query/serial_execution/value_resolution.rb +5 -2
- data/lib/graphql/query/variables.rb +5 -1
- data/lib/graphql/relay/base_connection.rb +5 -16
- data/lib/graphql/relay/mutation.rb +0 -17
- data/lib/graphql/schema.rb +2 -10
- data/lib/graphql/schema/loader.rb +1 -1
- data/lib/graphql/schema/printer.rb +1 -1
- data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +1 -1
- data/lib/graphql/static_validation/rules/fragment_types_exist.rb +3 -2
- data/lib/graphql/static_validation/rules/fragments_are_on_composite_types.rb +10 -6
- data/lib/graphql/static_validation/type_stack.rb +2 -2
- data/lib/graphql/static_validation/validator.rb +1 -1
- data/lib/graphql/unresolved_type_error.rb +0 -5
- data/lib/graphql/version.rb +1 -1
- data/readme.md +3 -79
- data/spec/graphql/language/parser_spec.rb +1 -1
- data/spec/graphql/query/serial_execution/value_resolution_spec.rb +4 -6
- data/spec/graphql/relay/base_connection_spec.rb +19 -0
- data/spec/graphql/relay/mutation_spec.rb +1 -1
- data/spec/graphql/relay/relation_connection_spec.rb +7 -0
- data/spec/graphql/schema/printer_spec.rb +6 -2
- data/spec/graphql/schema/timeout_middleware_spec.rb +3 -2
- data/spec/graphql/static_validation/validator_spec.rb +1 -1
- data/spec/spec_helper.rb +1 -3
- data/spec/support/static_validation_helpers.rb +1 -1
- metadata +5 -44
@@ -57,7 +57,7 @@ module GraphQL
|
|
57
57
|
module FragmentWithTypeStrategy
|
58
58
|
def push(stack, node)
|
59
59
|
object_type = if node.type
|
60
|
-
stack.schema.types.fetch(node.type, nil)
|
60
|
+
stack.schema.types.fetch(node.type.name, nil)
|
61
61
|
else
|
62
62
|
stack.object_types.last
|
63
63
|
end
|
@@ -86,7 +86,7 @@ module GraphQL
|
|
86
86
|
extend FragmentWithTypeStrategy
|
87
87
|
module_function
|
88
88
|
def push_path_member(stack, node)
|
89
|
-
stack.path.push("...#{node.type ? " on #{node.type}" : ""}")
|
89
|
+
stack.path.push("...#{node.type ? " on #{node.type.to_query_string}" : ""}")
|
90
90
|
end
|
91
91
|
end
|
92
92
|
|
data/lib/graphql/version.rb
CHANGED
data/readme.md
CHANGED
@@ -24,63 +24,9 @@ gem 'graphql'
|
|
24
24
|
$ bundle install
|
25
25
|
```
|
26
26
|
|
27
|
-
##
|
27
|
+
## Getting Started
|
28
28
|
|
29
|
-
|
30
|
-
|
31
|
-
```ruby
|
32
|
-
# Declare a type...
|
33
|
-
PostType = GraphQL::ObjectType.define do
|
34
|
-
name "Post"
|
35
|
-
description "A blog post"
|
36
|
-
|
37
|
-
field :id, !types.ID
|
38
|
-
field :title, !types.String
|
39
|
-
field :body, !types.String
|
40
|
-
field :comments, types[!CommentType]
|
41
|
-
end
|
42
|
-
|
43
|
-
# ...and a query root
|
44
|
-
QueryType = GraphQL::ObjectType.define do
|
45
|
-
name "Query"
|
46
|
-
description "The query root of this schema"
|
47
|
-
|
48
|
-
field :post do
|
49
|
-
type PostType
|
50
|
-
argument :id, !types.ID
|
51
|
-
resolve ->(obj, args, ctx) { Post.find(args["id"]) }
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
# Then create your schema
|
56
|
-
Schema = GraphQL::Schema.define do
|
57
|
-
query QueryType
|
58
|
-
max_depth 8
|
59
|
-
end
|
60
|
-
```
|
61
|
-
|
62
|
-
#### Execute queries
|
63
|
-
|
64
|
-
Execute GraphQL queries on a given schema, from a query string.
|
65
|
-
|
66
|
-
```ruby
|
67
|
-
result_hash = Schema.execute(query_string)
|
68
|
-
# {
|
69
|
-
# "data" => {
|
70
|
-
# "post" => {
|
71
|
-
# "id" => 1,
|
72
|
-
# "title" => "GraphQL is nice"
|
73
|
-
# }
|
74
|
-
# }
|
75
|
-
# }
|
76
|
-
```
|
77
|
-
|
78
|
-
#### Use with Relay
|
79
|
-
|
80
|
-
If you're building a backend for [Relay](http://facebook.github.io/relay/), you'll need:
|
81
|
-
|
82
|
-
- A JSON dump of the schema, which you can get by sending [`GraphQL::Introspection::INTROSPECTION_QUERY`](https://github.com/rmosolgo/graphql-ruby/blob/master/lib/graphql/introspection/introspection_query.rb)
|
83
|
-
- Relay-specific helpers for GraphQL, see [`GraphQL::Relay`](http://www.rubydoc.info/github/rmosolgo/graphql-ruby/file/guides/relay.md)
|
29
|
+
See "Getting Started" on the [website](https://rmosolgo.github.io/graphql-ruby/) or on [GitHub](https://github.com/rmosolgo/graphql-ruby/blob/master/guides/index.md)
|
84
30
|
|
85
31
|
## Goals
|
86
32
|
|
@@ -94,23 +40,7 @@ If you're building a backend for [Relay](http://facebook.github.io/relay/), you'
|
|
94
40
|
- __Report bugs__ by posting a description, full stack trace, and all relevant code in a [GitHub issue](https://github.com/rmosolgo/graphql-ruby/issues).
|
95
41
|
- __Features & patches__ are welcome! Consider discussing it in an [issue](https://github.com/rmosolgo/graphql-ruby/issues) or in the [#ruby channel on Slack](https://graphql-slack.herokuapp.com/) to make sure we're on the same page.
|
96
42
|
- __Run the tests__ with `rake test` or start up guard with `bundle exec guard`.
|
97
|
-
- __Build the site__ with `rake site:serve`, then visit `localhost:4000
|
98
|
-
|
99
|
-
## Related Projects
|
100
|
-
|
101
|
-
### Code
|
102
|
-
|
103
|
-
- `graphql-ruby` + Rails demo ([src](https://github.com/rmosolgo/graphql-ruby-demo) / [heroku](http://graphql-ruby-demo.herokuapp.com))
|
104
|
-
- [`graphql-batch`](https://github.com/shopify/graphql-batch), a batched query execution strategy
|
105
|
-
- [`graphql-libgraphqlparser`](https://github.com/rmosolgo/graphql-libgraphqlparser-ruby), bindings to [libgraphqlparser](https://github.com/graphql/libgraphqlparser), a C-level parser.
|
106
|
-
|
107
|
-
### Blog Posts
|
108
|
-
|
109
|
-
- Building a blog in GraphQL and Relay on Rails [Introduction](https://medium.com/@gauravtiwari/graphql-and-relay-on-rails-getting-started-955a49d251de), [Part 1]( https://medium.com/@gauravtiwari/graphql-and-relay-on-rails-creating-types-and-schema-b3f9b232ccfc), [Part 2](https://medium.com/@gauravtiwari/graphql-and-relay-on-rails-first-relay-powered-react-component-cb3f9ee95eca)
|
110
|
-
- https://medium.com/@khor/relay-facebook-on-rails-8b4af2057152
|
111
|
-
- https://blog.jacobwgillespie.com/from-rest-to-graphql-b4e95e94c26b#.4cjtklrwt
|
112
|
-
- http://mgiroux.me/2015/getting-started-with-rails-graphql-relay/
|
113
|
-
- http://mgiroux.me/2015/uploading-files-using-relay-with-rails/
|
43
|
+
- __Build the site__ with `rake site:serve`, then visit `http://localhost:4000/graphql-ruby/`.
|
114
44
|
|
115
45
|
## To Do
|
116
46
|
|
@@ -141,10 +71,4 @@ If you're building a backend for [Relay](http://facebook.github.io/relay/), you'
|
|
141
71
|
- Renaming fragments from local names to unique names
|
142
72
|
- Support AST subclasses? This would be hard, I think classes are used as hash keys in many places.
|
143
73
|
- Support object deep-copy (schema, type, field, argument)? To support multiple schemas based on the same types. ([discussion](https://github.com/rmosolgo/graphql-ruby/issues/269))
|
144
|
-
- Improve the website
|
145
|
-
- Feature the logo in the header
|
146
|
-
- Split `readme.md` into `index.md` (a homepage with code samples) and a technical readme (how to install, link to homepage)
|
147
|
-
- Move "Related projects" to a guide
|
148
|
-
- Revisit guides, maybe split them into smaller, more specific pages
|
149
|
-
- Put guide titles into the `<title />`
|
150
74
|
- Document encrypted & versioned cursors
|
@@ -25,7 +25,7 @@ describe GraphQL::Language::Parser do
|
|
25
25
|
assert fragment.is_a?(GraphQL::Language::Nodes::FragmentDefinition)
|
26
26
|
assert_equal nil, fragment.name
|
27
27
|
assert_equal 1, fragment.selections.length
|
28
|
-
assert_equal "NestedType", fragment.type
|
28
|
+
assert_equal "NestedType", fragment.type.name
|
29
29
|
assert_equal 1, fragment.directives.length
|
30
30
|
assert_equal [2, 7], fragment.position
|
31
31
|
end
|
@@ -27,8 +27,6 @@ describe GraphQL::Query::SerialExecution::ValueResolution do
|
|
27
27
|
name "OtherObject"
|
28
28
|
end
|
29
29
|
|
30
|
-
OtherObject = Class.new
|
31
|
-
|
32
30
|
query_root = GraphQL::ObjectType.define do
|
33
31
|
name "Query"
|
34
32
|
field :tomorrow, day_of_week_enum do
|
@@ -39,7 +37,7 @@ describe GraphQL::Query::SerialExecution::ValueResolution do
|
|
39
37
|
resolve ->(obj, args, ctx) { Object.new }
|
40
38
|
end
|
41
39
|
field :resolvesToWrongTypeInterface, interface do
|
42
|
-
resolve ->(obj, args, ctx) {
|
40
|
+
resolve ->(obj, args, ctx) { :something }
|
43
41
|
end
|
44
42
|
end
|
45
43
|
|
@@ -47,7 +45,7 @@ describe GraphQL::Query::SerialExecution::ValueResolution do
|
|
47
45
|
query(query_root)
|
48
46
|
orphan_types [some_object]
|
49
47
|
resolve_type ->(obj, ctx) do
|
50
|
-
if obj.is_a?(
|
48
|
+
if obj.is_a?(Symbol)
|
51
49
|
other_object
|
52
50
|
else
|
53
51
|
nil
|
@@ -86,7 +84,7 @@ describe GraphQL::Query::SerialExecution::ValueResolution do
|
|
86
84
|
|}
|
87
85
|
|
88
86
|
it "raises an error" do
|
89
|
-
err = assert_raises(GraphQL::
|
87
|
+
err = assert_raises(GraphQL::UnresolvedTypeError) { result }
|
90
88
|
expected_message = %|The value from "resolvesToNilInterface" on "Query" could not be resolved to "SomeInterface". (Received: nil, Expected: [SomeObject])|
|
91
89
|
assert_equal expected_message, err.message
|
92
90
|
end
|
@@ -100,7 +98,7 @@ describe GraphQL::Query::SerialExecution::ValueResolution do
|
|
100
98
|
|}
|
101
99
|
|
102
100
|
it "raises an error" do
|
103
|
-
err = assert_raises(GraphQL::
|
101
|
+
err = assert_raises(GraphQL::UnresolvedTypeError) { result }
|
104
102
|
expected_message = %|The value from "resolvesToWrongTypeInterface" on "Query" could not be resolved to "SomeInterface". (Received: OtherObject, Expected: [SomeObject])|
|
105
103
|
assert_equal expected_message, err.message
|
106
104
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe GraphQL::Relay::BaseConnection do
|
4
|
+
|
5
|
+
describe ".connection_for_nodes" do
|
6
|
+
|
7
|
+
it "resolves most specific connection type" do
|
8
|
+
class SpecialArray < Array; end
|
9
|
+
class SpecialArrayConnection < GraphQL::Relay::BaseConnection; end
|
10
|
+
GraphQL::Relay::BaseConnection.register_connection_implementation(SpecialArray, SpecialArrayConnection)
|
11
|
+
|
12
|
+
nodes = SpecialArray.new
|
13
|
+
|
14
|
+
GraphQL::Relay::BaseConnection.connection_for_nodes(nodes)
|
15
|
+
.must_equal SpecialArrayConnection
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
@@ -361,4 +361,11 @@ describe GraphQL::Relay::RelationConnection do
|
|
361
361
|
assert_includes err.message, "item not found"
|
362
362
|
end
|
363
363
|
end
|
364
|
+
|
365
|
+
it "is chosen for a relation" do
|
366
|
+
relation = Base.where(faction_id: 1)
|
367
|
+
assert relation.is_a?(ActiveRecord::Relation)
|
368
|
+
connection = GraphQL::Relay::BaseConnection.connection_for_nodes(relation)
|
369
|
+
assert_equal GraphQL::Relay::RelationConnection, connection
|
370
|
+
end
|
364
371
|
end
|
@@ -83,7 +83,7 @@ describe GraphQL::Schema::Printer do
|
|
83
83
|
|
84
84
|
field :post do
|
85
85
|
type post_type
|
86
|
-
argument :id, !types.ID
|
86
|
+
argument :id, !types.ID, 'Post ID'
|
87
87
|
argument :varied, variant_input_type, default_value: { id: "123", int: 234, float: 2.3, enum: :foo, sub: [{ string: "str" }] }
|
88
88
|
resolve ->(obj, args, ctx) { Post.find(args["id"]) }
|
89
89
|
end
|
@@ -440,7 +440,11 @@ type Post {
|
|
440
440
|
|
441
441
|
# The query root of this schema
|
442
442
|
type Query {
|
443
|
-
post(
|
443
|
+
post(
|
444
|
+
# Post ID
|
445
|
+
id: ID!
|
446
|
+
varied: Varied = {id: \"123\", int: 234, float: 2.3, enum: FOO, sub: [{string: \"str\"}]}
|
447
|
+
): Post
|
444
448
|
}
|
445
449
|
|
446
450
|
# Test
|
@@ -166,7 +166,7 @@ describe GraphQL::Schema::TimeoutMiddleware do
|
|
166
166
|
describe "with a custom block" do
|
167
167
|
let(:timeout_middleware) {
|
168
168
|
GraphQL::Schema::TimeoutMiddleware.new(max_seconds: max_seconds) do |err, query|
|
169
|
-
raise("Query timed out after 2s: #{query.class.name}")
|
169
|
+
raise("Query timed out after 2s: #{query.class.name} on #{query.context.ast_node.alias}")
|
170
170
|
end
|
171
171
|
}
|
172
172
|
let(:query_string) {%|
|
@@ -180,7 +180,8 @@ describe GraphQL::Schema::TimeoutMiddleware do
|
|
180
180
|
|}
|
181
181
|
|
182
182
|
it "calls the block" do
|
183
|
-
assert_raises(RuntimeError) { result }
|
183
|
+
err = assert_raises(RuntimeError) { result }
|
184
|
+
assert_equal "Query timed out after 2s: GraphQL::Query on d", err.message
|
184
185
|
end
|
185
186
|
end
|
186
187
|
end
|
@@ -3,7 +3,7 @@ require "spec_helper"
|
|
3
3
|
describe GraphQL::StaticValidation::Validator do
|
4
4
|
let(:validator) { GraphQL::StaticValidation::Validator.new(schema: DummySchema) }
|
5
5
|
let(:query) { GraphQL::Query.new(DummySchema, query_string) }
|
6
|
-
let(:errors) { validator.validate(query)[:errors] }
|
6
|
+
let(:errors) { validator.validate(query)[:errors].map(&:to_h) }
|
7
7
|
|
8
8
|
|
9
9
|
describe "validation order" do
|
data/spec/spec_helper.rb
CHANGED
@@ -8,9 +8,7 @@ require "benchmark"
|
|
8
8
|
require "minitest/autorun"
|
9
9
|
require "minitest/focus"
|
10
10
|
require "minitest/reporters"
|
11
|
-
|
12
|
-
require 'pry-stack_explorer'
|
13
|
-
Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new
|
11
|
+
Minitest::Reporters.use! Minitest::Reporters::DefaultReporter.new(color: true)
|
14
12
|
|
15
13
|
Minitest::Spec.make_my_diffs_pretty!
|
16
14
|
|
@@ -14,7 +14,7 @@ module StaticValidationHelpers
|
|
14
14
|
target_schema = schema
|
15
15
|
validator = GraphQL::StaticValidation::Validator.new(schema: target_schema)
|
16
16
|
query = GraphQL::Query.new(target_schema, query_string)
|
17
|
-
validator.validate(query)[:errors]
|
17
|
+
validator.validate(query)[:errors].map(&:to_h)
|
18
18
|
end
|
19
19
|
|
20
20
|
def error_messages
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: graphql
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Robert Mosolgo
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-10-
|
11
|
+
date: 2016-10-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: codeclimate-test-reporter
|
@@ -24,34 +24,6 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0.4'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: pry
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - "~>"
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '0.10'
|
34
|
-
type: :development
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - "~>"
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: '0.10'
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: pry-stack_explorer
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - ">="
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '0'
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - ">="
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '0'
|
55
27
|
- !ruby/object:Gem::Dependency
|
56
28
|
name: guard
|
57
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -276,20 +248,6 @@ dependencies:
|
|
276
248
|
- - ">="
|
277
249
|
- !ruby/object:Gem::Version
|
278
250
|
version: '0'
|
279
|
-
- !ruby/object:Gem::Dependency
|
280
|
-
name: html-proofer
|
281
|
-
requirement: !ruby/object:Gem::Requirement
|
282
|
-
requirements:
|
283
|
-
- - ">="
|
284
|
-
- !ruby/object:Gem::Version
|
285
|
-
version: '0'
|
286
|
-
type: :development
|
287
|
-
prerelease: false
|
288
|
-
version_requirements: !ruby/object:Gem::Requirement
|
289
|
-
requirements:
|
290
|
-
- - ">="
|
291
|
-
- !ruby/object:Gem::Version
|
292
|
-
version: '0'
|
293
251
|
description: A GraphQL server implementation for Ruby. Includes schema definition,
|
294
252
|
query parsing, static validation, type definition, and query execution.
|
295
253
|
email:
|
@@ -298,6 +256,7 @@ executables: []
|
|
298
256
|
extensions: []
|
299
257
|
extra_rdoc_files: []
|
300
258
|
files:
|
259
|
+
- ".yardopts"
|
301
260
|
- MIT-LICENSE
|
302
261
|
- lib/graphql.rb
|
303
262
|
- lib/graphql/analysis.rb
|
@@ -497,6 +456,7 @@ files:
|
|
497
456
|
- spec/graphql/query/variables_spec.rb
|
498
457
|
- spec/graphql/query_spec.rb
|
499
458
|
- spec/graphql/relay/array_connection_spec.rb
|
459
|
+
- spec/graphql/relay/base_connection_spec.rb
|
500
460
|
- spec/graphql/relay/connection_field_spec.rb
|
501
461
|
- spec/graphql/relay/connection_type_spec.rb
|
502
462
|
- spec/graphql/relay/mutation_spec.rb
|
@@ -615,6 +575,7 @@ test_files:
|
|
615
575
|
- spec/graphql/query/variables_spec.rb
|
616
576
|
- spec/graphql/query_spec.rb
|
617
577
|
- spec/graphql/relay/array_connection_spec.rb
|
578
|
+
- spec/graphql/relay/base_connection_spec.rb
|
618
579
|
- spec/graphql/relay/connection_field_spec.rb
|
619
580
|
- spec/graphql/relay/connection_type_spec.rb
|
620
581
|
- spec/graphql/relay/mutation_spec.rb
|