graphql-remote_loader 1.0.4 → 1.0.5
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/.travis.yml +3 -0
- data/Gemfile.lock +7 -7
- data/README.md +11 -19
- data/graphql-remote_loader.gemspec +2 -2
- data/lib/graphql/remote_loader/query_merger.rb +6 -4
- data/lib/graphql/remote_loader/version.rb +1 -1
- metadata +7 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d72d37be4701ca0a4dd4bad71e989241b8557f01
|
4
|
+
data.tar.gz: 0e4c7d0613383cd441d2dc887cc7c5647296a780
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 53941e0b529fcf5c9f89809de804faf1f52e162c3fa8cccbb2f2c6a0b1f44c8d713a4bf291055504ae75c2fa001f926aa6e15a5bed1acfa949e4ec2d2f3553b1
|
7
|
+
data.tar.gz: 017da570ea18310a6b3eb4801ffa24ff1e22d087cca6daf2b4d1370813c419443b809dfbdc6337b6f9c0690742b540bb2e0e89b1f3342cf32d12406684f9354e
|
data/.travis.yml
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
graphql-remote_loader (1.0.
|
5
|
-
graphql (~> 1.
|
4
|
+
graphql-remote_loader (1.0.5)
|
5
|
+
graphql (~> 1.9)
|
6
6
|
graphql-batch (~> 0.3)
|
7
7
|
|
8
8
|
GEM
|
@@ -11,9 +11,9 @@ GEM
|
|
11
11
|
byebug (10.0.2)
|
12
12
|
coderay (1.1.2)
|
13
13
|
diff-lcs (1.3)
|
14
|
-
graphql (1.
|
15
|
-
graphql-batch (0.
|
16
|
-
graphql (>=
|
14
|
+
graphql (1.9.12)
|
15
|
+
graphql-batch (0.4.1)
|
16
|
+
graphql (>= 1.3, < 2)
|
17
17
|
promise.rb (~> 0.7.2)
|
18
18
|
method_source (0.9.1)
|
19
19
|
promise.rb (0.7.4)
|
@@ -42,11 +42,11 @@ PLATFORMS
|
|
42
42
|
ruby
|
43
43
|
|
44
44
|
DEPENDENCIES
|
45
|
-
bundler (~>
|
45
|
+
bundler (~> 2.0)
|
46
46
|
graphql-remote_loader!
|
47
47
|
pry-byebug (~> 3.4)
|
48
48
|
rake (~> 10.0)
|
49
49
|
rspec (~> 3.6)
|
50
50
|
|
51
51
|
BUNDLED WITH
|
52
|
-
|
52
|
+
2.0.2
|
data/README.md
CHANGED
@@ -6,18 +6,6 @@ Performant, batched GraphQL queries from within the resolvers of a [`graphql-rub
|
|
6
6
|
|
7
7
|
## Snippet
|
8
8
|
|
9
|
-
For default error handling(null if errors) and no post-processing:
|
10
|
-
|
11
|
-
```ruby
|
12
|
-
field :login, String, null: true, description: "The currently authenticated GitHub user's login."
|
13
|
-
|
14
|
-
def login
|
15
|
-
GitHubLoader.load_value("viewer", "login")
|
16
|
-
end
|
17
|
-
```
|
18
|
-
|
19
|
-
If you need error handling, post-processing, or complex queries:
|
20
|
-
|
21
9
|
```ruby
|
22
10
|
field :login, String, null: false, description: "The currently authenticated GitHub user's login."
|
23
11
|
|
@@ -32,12 +20,8 @@ def login
|
|
32
20
|
end
|
33
21
|
```
|
34
22
|
|
35
|
-
## Full example
|
36
|
-
|
37
|
-
To see a working example of how `graphql-remote_loader` works, see the [complete, working example application](https://github.com/d12/graphql-remote_loader_example).
|
38
|
-
|
39
23
|
## Description
|
40
|
-
`graphql-remote_loader` allows for querying GraphQL APIs from within resolvers of a [`graphql-ruby`](https://github.com/rmosolgo/graphql-ruby) API.
|
24
|
+
`graphql-remote_loader` allows for querying GraphQL APIs from within resolvers of a [`graphql-ruby`](https://github.com/rmosolgo/graphql-ruby) API.
|
41
25
|
|
42
26
|
This can be used to create GraphQL APIs that depend on data from other GraphQL APIs, either remote or local.
|
43
27
|
|
@@ -45,6 +29,10 @@ A promise-based resolution strategy from Shopify's [`graphql-batch`](https://git
|
|
45
29
|
|
46
30
|
You can think of it as a lightweight version of schema-stitching.
|
47
31
|
|
32
|
+
## Performance
|
33
|
+
|
34
|
+
Each `Loader#load` invocation does not send a GraphQL query to the remote. The Gem uses graphql-batch to collect all GraphQL queries together, then combines them and sends a single query to the upstream. The gem splits the response JSON up so that each promise is only resolved with data that it asked for.
|
35
|
+
|
48
36
|
## How to use
|
49
37
|
First, you'll need to install the gem. Either do `gem install graphql-remote_loader` or add this to your Gemfile:
|
50
38
|
|
@@ -52,9 +40,9 @@ First, you'll need to install the gem. Either do `gem install graphql-remote_loa
|
|
52
40
|
gem "graphql-remote_loader"
|
53
41
|
```
|
54
42
|
|
55
|
-
The gem provides a base loader `GraphQL::RemoteLoader::Loader` which does most of the heavy lifting. In order to remain client-agnostic, there's an unimplemented no-op that queries the
|
43
|
+
The gem provides a base loader `GraphQL::RemoteLoader::Loader` which does most of the heavy lifting. In order to remain client-agnostic, there's an unimplemented no-op that takes a query string and queries the remote GraphQL API.
|
56
44
|
|
57
|
-
To use, create a new class that inherits from `GraphQL::RemoteLoader::Loader` and define `def query(query_string)`. The method takes a query String as input. The expected output is a response `Hash`, or
|
45
|
+
To use, create a new class that inherits from `GraphQL::RemoteLoader::Loader` and define `def query(query_string)`. The method takes a query String as input. The expected output is a response `Hash`, or an object that responds to `#to_h`.
|
58
46
|
|
59
47
|
Example:
|
60
48
|
|
@@ -75,6 +63,10 @@ This example uses [`graphql-client`](https://github.com/github/graphql-client).
|
|
75
63
|
|
76
64
|
With your loader setup, you can begin using `#load` or `#load_value` in your `graphql-ruby` resolvers.
|
77
65
|
|
66
|
+
## Full example
|
67
|
+
|
68
|
+
To see a working example of how `graphql-remote_loader` works, see the [complete, working example application](https://github.com/d12/graphql-remote_loader_example).
|
69
|
+
|
78
70
|
## Running tests
|
79
71
|
|
80
72
|
```
|
@@ -21,10 +21,10 @@ Gem::Specification.new do |spec|
|
|
21
21
|
# spec.executables = [""]
|
22
22
|
spec.require_paths = ["lib"]
|
23
23
|
|
24
|
-
spec.add_dependency "graphql", "~> 1.
|
24
|
+
spec.add_dependency "graphql", "~> 1.9"
|
25
25
|
spec.add_dependency "graphql-batch", "~> 0.3"
|
26
26
|
|
27
|
-
spec.add_development_dependency "bundler", "~>
|
27
|
+
spec.add_development_dependency "bundler", "~> 2.0"
|
28
28
|
spec.add_development_dependency "rake", "~> 10.0"
|
29
29
|
spec.add_development_dependency "rspec", "~> 3.6"
|
30
30
|
spec.add_development_dependency "pry-byebug", "~> 3.4"
|
@@ -45,7 +45,9 @@ module GraphQL
|
|
45
45
|
if matching_fragment_definition
|
46
46
|
merge_query_recursive(a_definition, matching_fragment_definition)
|
47
47
|
else
|
48
|
-
|
48
|
+
# graphql-ruby Nodes aren't meant to be mutated, but I'd rather slightly abuse graphql-ruby vs
|
49
|
+
# maintain my own Ruby data and parsing library implementing the GraphQL spec.
|
50
|
+
b_query.instance_variable_set(:@definitions, [b_query.definitions, a_definition].flatten)
|
49
51
|
end
|
50
52
|
end
|
51
53
|
end
|
@@ -79,7 +81,7 @@ module GraphQL
|
|
79
81
|
matching_field.instance_variable_set(:@prime, new_prime)
|
80
82
|
merge_query_recursive(a_query_selection, matching_field) unless exempt_node_types.any? { |type| matching_field.is_a?(type) }
|
81
83
|
else
|
82
|
-
b_query.selections
|
84
|
+
b_query.instance_variable_set(:@selections, [b_query.selections, a_query_selection].flatten)
|
83
85
|
end
|
84
86
|
end
|
85
87
|
end
|
@@ -112,11 +114,11 @@ module GraphQL
|
|
112
114
|
unless exempt_node_types.any? { |type| selection.is_a? type }
|
113
115
|
prime_factor = selection.instance_variable_get(:@prime)
|
114
116
|
|
115
|
-
selection.alias
|
117
|
+
selection.instance_variable_set(:@alias, if selection.alias
|
116
118
|
"p#{prime_factor}#{selection.alias}"
|
117
119
|
else
|
118
120
|
"p#{prime_factor}#{selection.name}"
|
119
|
-
end
|
121
|
+
end)
|
120
122
|
end
|
121
123
|
|
122
124
|
# Some nodes don't have selections (e.g. fragment spreads)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: graphql-remote_loader
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nathaniel Woodthorpe
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-09-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: graphql
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '1.
|
19
|
+
version: '1.9'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '1.
|
26
|
+
version: '1.9'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: graphql-batch
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -44,14 +44,14 @@ dependencies:
|
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
47
|
+
version: '2.0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
54
|
+
version: '2.0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rake
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -133,7 +133,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
133
133
|
version: '0'
|
134
134
|
requirements: []
|
135
135
|
rubyforge_project:
|
136
|
-
rubygems_version: 2.
|
136
|
+
rubygems_version: 2.6.13
|
137
137
|
signing_key:
|
138
138
|
specification_version: 4
|
139
139
|
summary: Performant remote GraphQL queries from within a Ruby GraphQL API.
|