graphlient 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -1
- data/.rubocop_todo.yml +32 -17
- data/.travis.yml +8 -2
- data/CHANGELOG.md +11 -0
- data/Dangerfile +1 -0
- data/Gemfile +5 -0
- data/README.md +200 -26
- data/RELEASING.md +1 -1
- data/Rakefile +1 -1
- data/graphlient.gemspec +3 -0
- data/lib/graphlient.rb +0 -5
- data/lib/graphlient/adapters/faraday_adapter.rb +43 -0
- data/lib/graphlient/client.rb +35 -20
- data/lib/graphlient/errors.rb +2 -1
- data/lib/graphlient/errors/client.rb +6 -0
- data/lib/graphlient/errors/error.rb +7 -0
- data/lib/graphlient/errors/server.rb +6 -0
- data/lib/graphlient/query.rb +13 -5
- data/lib/graphlient/version.rb +1 -1
- data/spec/graphlient/adapters/faraday_adapter_spec.rb +44 -0
- data/spec/graphlient/client_query_spec.rb +158 -0
- data/spec/graphlient/client_schema_spec.rb +19 -0
- data/spec/graphlient/extensions/query_spec.rb +6 -4
- data/spec/graphlient/query_spec.rb +72 -25
- data/spec/graphlient/static_client_query_spec.rb +39 -0
- data/spec/spec_helper.rb +3 -1
- data/spec/support/context/dummy_client.rb +26 -0
- data/spec/support/dummy_app.rb +25 -0
- data/spec/support/dummy_schema.rb +9 -0
- data/spec/support/mutations/create_invoice_mutation.rb +16 -0
- data/spec/support/mutations/mutation.rb +7 -0
- data/spec/support/queries/query.rb +16 -0
- data/spec/support/types/invoice_type.rb +6 -0
- metadata +61 -8
- data/.byebug_history +0 -23
- data/lib/graphlient/config.rb +0 -21
- data/lib/graphlient/errors/http.rb +0 -12
- data/spec/graphlient/client_spec.rb +0 -42
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 70d3714ce3a596ab5742337e24610d2af3b81f36
|
4
|
+
data.tar.gz: 9098b09df8009c12031995bf79451a66d4969486
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2b3eb5c108cb8cc1a32958e9bf8524957a848ac25829aaa3f00b09ac69ca2faca56ffd35d8e533990d6e868f0f4d39b8bcbd3849c8e23a8d3270d18cbc2ff268
|
7
|
+
data.tar.gz: 782ae549c2377b76b9f3452e8086124407bd2228a6fcbe1fce2c54a20ba4663f2155d2349a139c9f2725990ce7c6a6d5ae883b3780fe12a1df74794c654a519f
|
data/.gitignore
CHANGED
data/.rubocop_todo.yml
CHANGED
@@ -1,47 +1,62 @@
|
|
1
1
|
# This configuration was generated by
|
2
2
|
# `rubocop --auto-gen-config`
|
3
|
-
# on 2017-10-
|
3
|
+
# on 2017-10-19 15:16:01 -0400 using RuboCop version 0.47.1.
|
4
4
|
# The point is for the user to remove these configuration records
|
5
5
|
# one by one as the offenses are removed from the code base.
|
6
6
|
# Note that changes in the inspected code, or installation of new
|
7
7
|
# versions of RuboCop, may require this file to be generated again.
|
8
8
|
|
9
|
-
# Offense count:
|
9
|
+
# Offense count: 11
|
10
10
|
# Configuration parameters: CountComments, ExcludedMethods.
|
11
11
|
Metrics/BlockLength:
|
12
|
-
Max:
|
12
|
+
Max: 136
|
13
13
|
|
14
|
-
# Offense count:
|
14
|
+
# Offense count: 17
|
15
15
|
# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
|
16
16
|
# URISchemes: http, https
|
17
17
|
Metrics/LineLength:
|
18
|
-
Max:
|
18
|
+
Max: 177
|
19
19
|
|
20
|
-
# Offense count:
|
20
|
+
# Offense count: 2
|
21
|
+
# Configuration parameters: CountComments.
|
22
|
+
Metrics/MethodLength:
|
23
|
+
Max: 12
|
24
|
+
|
25
|
+
# Offense count: 1
|
26
|
+
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
27
|
+
# SupportedStyles: nested, compact
|
28
|
+
Style/ClassAndModuleChildren:
|
29
|
+
Exclude:
|
30
|
+
- 'spec/graphlient/static_client_query_spec.rb'
|
31
|
+
|
32
|
+
# Offense count: 5
|
21
33
|
Style/Documentation:
|
22
34
|
Exclude:
|
23
35
|
- 'spec/**/*'
|
24
36
|
- 'test/**/*'
|
37
|
+
- 'lib/graphlient/adapters/faraday_adapter.rb'
|
25
38
|
- 'lib/graphlient/client.rb'
|
26
|
-
- 'lib/graphlient/
|
27
|
-
- 'lib/graphlient/errors/http.rb'
|
39
|
+
- 'lib/graphlient/errors/error.rb'
|
28
40
|
- 'lib/graphlient/extensions/query.rb'
|
29
41
|
- 'lib/graphlient/query.rb'
|
30
42
|
|
43
|
+
# Offense count: 2
|
44
|
+
# Cop supports --auto-correct.
|
45
|
+
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
46
|
+
# SupportedStyles: line_count_dependent, lambda, literal
|
47
|
+
Style/Lambda:
|
48
|
+
Exclude:
|
49
|
+
- 'spec/support/mutations/create_invoice_mutation.rb'
|
50
|
+
- 'spec/support/queries/query.rb'
|
51
|
+
|
31
52
|
# Offense count: 2
|
32
53
|
Style/MethodMissing:
|
33
54
|
Exclude:
|
34
55
|
- 'lib/graphlient/extensions/query.rb'
|
35
56
|
- 'lib/graphlient/query.rb'
|
36
57
|
|
37
|
-
# Offense count:
|
38
|
-
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
39
|
-
# SupportedStyles: module_function, extend_self
|
40
|
-
Style/ModuleFunction:
|
41
|
-
Exclude:
|
42
|
-
- 'lib/graphlient/config.rb'
|
43
|
-
|
44
|
-
# Offense count: 1
|
58
|
+
# Offense count: 2
|
45
59
|
Style/MultilineBlockChain:
|
46
60
|
Exclude:
|
47
|
-
- 'spec/graphlient/
|
61
|
+
- 'spec/graphlient/client_query_spec.rb'
|
62
|
+
- 'spec/graphlient/client_schema_spec.rb'
|
data/.travis.yml
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
### 0.0.6 (10/20/2017)
|
2
|
+
|
3
|
+
* [#14](https://github.com/ashkan18/graphlient/pull/14): Switch to `graphql-client` for network calls and schema validation - [@ashkan18](https://github.com/ashkan18).
|
4
|
+
* [#17](https://github.com/ashkan18/graphlient/pull/17): Specialize server errors as `Graphlient::Errors::Server` - [@dblock](https://github.com/dblock).
|
5
|
+
* [#13](https://github.com/ashkan18/graphlient/pull/13): Support named queries and make sure, this is braking change where we no longer support queries that don't start with `query` - [@ashkan18](https://github.com/ashkan18).
|
6
|
+
* [#21](https://github.com/ashkan18/graphlient/pull/21): Added danger, PR linter - [@dblock](https://github.com/dblock).
|
7
|
+
* [#17](https://github.com/ashkan18/graphlient/pull/17): Enable customizing of Faraday middleware - [@dblock](https://github.com/dblock).
|
8
|
+
* [#19](https://github.com/ashkan18/graphlient/pull/19): Expose `client.schema` - [@dblock](https://github.com/dblock).
|
9
|
+
* [#20](https://github.com/ashkan18/graphlient/pull/20): Added support for parameterized queries and mutations - [@dblock](https://github.com/dblock).
|
10
|
+
* [#25](https://github.com/ashkan18/graphlient/pull/25): Added `client.parse` and `client.execute` to parse and execute queries separately - [@dblock](https://github.com/dblock).
|
11
|
+
|
1
12
|
### 0.0.5 (10/5/2017)
|
2
13
|
|
3
14
|
* [#11](https://github.com/ashkan18/graphlient/pull/11): Fixed query argument types - [@ashkan18](https://github.com/ashkan18).
|
data/Dangerfile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
changelog.check
|
data/Gemfile
CHANGED
@@ -6,11 +6,16 @@ gem 'rake'
|
|
6
6
|
|
7
7
|
group :development do
|
8
8
|
gem 'byebug'
|
9
|
+
gem 'danger-changelog', '~> 0.2.1'
|
9
10
|
gem 'rubocop', '~> 0.47.1', require: false
|
10
11
|
end
|
11
12
|
|
12
13
|
group :test do
|
14
|
+
gem 'graphql'
|
15
|
+
gem 'rack-parser'
|
16
|
+
gem 'rack-test'
|
13
17
|
gem 'rspec'
|
14
18
|
gem 'rspec-mocks'
|
19
|
+
gem 'sinatra'
|
15
20
|
gem 'webmock'
|
16
21
|
end
|
data/README.md
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
[![Gem Version](https://badge.fury.io/rb/graphlient.svg)](https://badge.fury.io/rb/graphlient)
|
4
4
|
[![Build Status](https://travis-ci.org/ashkan18/graphlient.svg?branch=master)](https://travis-ci.org/ashkan18/graphlient)
|
5
5
|
|
6
|
-
A Ruby
|
6
|
+
A much friendlier Ruby client for consuming GraphQL-based APIs, without all the messy strings. Built on top of your usual [graphql-client](https://github.com/github/graphql-client).
|
7
7
|
|
8
8
|
## Installation
|
9
9
|
|
@@ -15,11 +15,7 @@ gem 'graphlient'
|
|
15
15
|
|
16
16
|
## Usage
|
17
17
|
|
18
|
-
|
19
|
-
|
20
|
-
### Graphlient::Client
|
21
|
-
|
22
|
-
Create a new instance of `Graphlient::Client` and pass the query into a block.
|
18
|
+
Create a new instance of `Graphlient::Client` with a URL and optional headers.
|
23
19
|
|
24
20
|
```ruby
|
25
21
|
client = Graphlient::Client.new('https://test-graphql.biz/graphql',
|
@@ -27,39 +23,172 @@ client = Graphlient::Client.new('https://test-graphql.biz/graphql',
|
|
27
23
|
'Authorization' => 'Bearer 123'
|
28
24
|
}
|
29
25
|
)
|
26
|
+
```
|
27
|
+
|
28
|
+
The schema is available automatically via `.schema`.
|
29
|
+
|
30
|
+
```ruby
|
31
|
+
client.schema # GraphQL::Schema
|
32
|
+
```
|
30
33
|
|
34
|
+
Make queries with `query`, which takes a block for the query definition.
|
35
|
+
|
36
|
+
```ruby
|
31
37
|
response = client.query do
|
32
|
-
|
38
|
+
query do
|
39
|
+
invoice(id: 10) do
|
40
|
+
id
|
41
|
+
total
|
42
|
+
line_items do
|
43
|
+
price
|
44
|
+
item_type
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
```
|
50
|
+
|
51
|
+
This will call the endpoint setup in the configuration with `POST`, the `Authorization` header and `query` as follows.
|
52
|
+
|
53
|
+
```graphql
|
54
|
+
query {
|
55
|
+
invoice(id: 10) {
|
33
56
|
id
|
34
57
|
total
|
35
|
-
line_items
|
58
|
+
line_items {
|
36
59
|
price
|
37
60
|
item_type
|
61
|
+
}
|
62
|
+
}
|
63
|
+
}
|
64
|
+
```
|
65
|
+
|
66
|
+
Graphlient validates the query based on current schema. In case of validation errors or any other connection related issues you'll get `Graphlient::Errors::Client` describing the error and in case of transport errors, `Graphlient::Errors::Server`. Both inherit from `Graphlient::Errors::Error` if you need to handle them in bulk.
|
67
|
+
|
68
|
+
A successful response object always contains data which can be iterated upon. The following example returns the first line item's price.
|
69
|
+
|
70
|
+
```ruby
|
71
|
+
response.data.invoice.line_items.first.price
|
72
|
+
```
|
73
|
+
|
74
|
+
You can also execute mutations the same way.
|
75
|
+
|
76
|
+
```ruby
|
77
|
+
response = client.query do
|
78
|
+
mutation do
|
79
|
+
createInvoice(input: { fee_in_cents: 12_345 }) do
|
80
|
+
id
|
81
|
+
fee_in_cents
|
38
82
|
end
|
39
83
|
end
|
40
84
|
end
|
41
85
|
```
|
42
86
|
|
43
|
-
|
87
|
+
The successful response contains data in `response.data`. The following example returns the newly created invoice's ID.
|
44
88
|
|
45
|
-
```
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
89
|
+
```ruby
|
90
|
+
response.data.create_invoice.first.id
|
91
|
+
```
|
92
|
+
|
93
|
+
### Executing Parameterized Queries and Mutations
|
94
|
+
|
95
|
+
Graphlient can execute parameterized queries and mutations by providing variables as query parameters.
|
96
|
+
|
97
|
+
The following query accepts an array of IDs.
|
98
|
+
|
99
|
+
```ruby
|
100
|
+
client.query(ids: [42]) do
|
101
|
+
query(:$ids => :'[Int]') do
|
102
|
+
invoices(ids: :$ids) do
|
103
|
+
id
|
104
|
+
fee_in_cents
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
54
108
|
```
|
55
109
|
|
56
|
-
|
110
|
+
The following mutation accepts a custom type that requires `fee_in_cents`.
|
57
111
|
|
58
|
-
|
112
|
+
```ruby
|
113
|
+
client.query(input: { fee_in_cents: 12_345 }) do
|
114
|
+
mutation(:$input => :createInvoiceInput!) do
|
115
|
+
createInvoice(input: :$input) do
|
116
|
+
id
|
117
|
+
fee_in_cents
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
```
|
59
122
|
|
60
|
-
###
|
123
|
+
### Parse and Execute Queries Separately
|
124
|
+
|
125
|
+
You can `parse` and `execute` queries separately with optional variables. This is highly recommended as parsing a query and validating a query on every request adds performance overhead. Parsing queries early allows validation errors to be discovered before request time and avoids many potential security issues.
|
61
126
|
|
62
|
-
|
127
|
+
|
128
|
+
```ruby
|
129
|
+
# parse a query, returns a GraphQL::Client::OperationDefinition
|
130
|
+
query = client.parse do
|
131
|
+
query(:$ids => :'[Int]') do
|
132
|
+
invoices(ids: :$ids) do
|
133
|
+
id
|
134
|
+
fee_in_cents
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
# execute a query, returns a GraphQL::Client::Response
|
140
|
+
client.execute query, ids: [42]
|
141
|
+
```
|
142
|
+
|
143
|
+
### Dynamic vs. Static Queries
|
144
|
+
|
145
|
+
Graphlient uses [graphql-client](https://github.com/github/graphql-client), which [recommends](https://github.com/github/graphql-client/blob/master/guides/dynamic-query-error.md) building queries as static module members along with dynamic variables during execution. This can be accomplished with graphlient the same way.
|
146
|
+
|
147
|
+
Create a new instance of `Graphlient::Client` with a URL and optional headers.
|
148
|
+
|
149
|
+
```ruby
|
150
|
+
module SWAPI
|
151
|
+
Client = Graphlient::Client.new('https://test-graphql.biz/graphql',
|
152
|
+
headers: {
|
153
|
+
'Authorization' => 'Bearer 123'
|
154
|
+
},
|
155
|
+
allow_dynamic_queries: false
|
156
|
+
)
|
157
|
+
end
|
158
|
+
```
|
159
|
+
|
160
|
+
The schema is available automatically via `.schema`.
|
161
|
+
|
162
|
+
```ruby
|
163
|
+
SWAPI::Client.schema # GraphQL::Schema
|
164
|
+
```
|
165
|
+
|
166
|
+
Define a query.
|
167
|
+
|
168
|
+
```ruby
|
169
|
+
module SWAPI
|
170
|
+
InvoiceQuery = Client.parse do
|
171
|
+
query(:$id => :Int) do
|
172
|
+
invoice(id: :$id) do
|
173
|
+
id
|
174
|
+
fee_in_cents
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
179
|
+
```
|
180
|
+
|
181
|
+
Execute the query.
|
182
|
+
|
183
|
+
```ruby
|
184
|
+
response = SWAPI::Client.execute(SWAPI::InvoiceQuery, id: 42)
|
185
|
+
```
|
186
|
+
|
187
|
+
Note that in the example above the client is created with `allow_dynamic_queries: false` (only allow static queries), while graphlient defaults to `allow_dynamic_queries: true` (allow dynamic queries). This option is marked deprecated, but we're proposing to remove it and default it to `true` in [graphql-client#128](https://github.com/github/graphql-client/issues/128).
|
188
|
+
|
189
|
+
### Generate Queries with Graphlient::Query
|
190
|
+
|
191
|
+
You can directly use `Graphlient::Query` to generate raw GraphQL queries.
|
63
192
|
|
64
193
|
```ruby
|
65
194
|
query = Graphlient::Query.new do
|
@@ -71,24 +200,69 @@ query = Graphlient::Query.new do
|
|
71
200
|
end
|
72
201
|
|
73
202
|
query.to_s
|
74
|
-
# "\nquery{\n invoice(id: 10){\n line_items\n }\n }\n"
|
203
|
+
# "\nquery {\n invoice(id: 10){\n line_items\n }\n }\n"
|
75
204
|
```
|
76
205
|
|
77
|
-
###
|
206
|
+
### Create API Client Classes with Graphlient::Extension::Query
|
78
207
|
|
79
208
|
You can include `Graphlient::Extensions::Query` in your class. This will add a new `method_missing` method to your context which will be used to generate GraphQL queries.
|
80
209
|
|
81
210
|
```ruby
|
82
211
|
include Graphlient::Extensions::Query
|
83
212
|
|
84
|
-
query =
|
85
|
-
|
213
|
+
query = query do
|
214
|
+
invoice(id: 10) do
|
215
|
+
line_items
|
216
|
+
end
|
86
217
|
end
|
87
218
|
|
88
219
|
query.to_s
|
89
220
|
# "\nquery{\n invoice(id: 10){\n line_items\n }\n }\n"
|
90
221
|
```
|
91
222
|
|
223
|
+
### Testing with Graphlient and RSpec
|
224
|
+
|
225
|
+
Use Graphlient inside your RSpec tests in a Rails application or with `Rack::Test`, no more messy HTTP POSTs.
|
226
|
+
|
227
|
+
```ruby
|
228
|
+
require 'spec_helper'
|
229
|
+
|
230
|
+
describe App do
|
231
|
+
include Rack::Test::Methods
|
232
|
+
|
233
|
+
def app
|
234
|
+
# ...
|
235
|
+
end
|
236
|
+
|
237
|
+
let(:client) do
|
238
|
+
Graphlient::Client.new('http://test-graphql.biz/graphql') do |client|
|
239
|
+
client.http do |h|
|
240
|
+
h.connection do |c|
|
241
|
+
c.use Faraday::Adapter::Rack, app
|
242
|
+
end
|
243
|
+
end
|
244
|
+
end
|
245
|
+
end
|
246
|
+
|
247
|
+
context 'an invoice' do
|
248
|
+
let(:result) do
|
249
|
+
client.query do
|
250
|
+
query do
|
251
|
+
invoice(id: 10) do
|
252
|
+
id
|
253
|
+
end
|
254
|
+
end
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
258
|
+
it 'can be retrieved' do
|
259
|
+
expect(result.data.invoice.id).to eq 10
|
260
|
+
end
|
261
|
+
end
|
262
|
+
end
|
263
|
+
```
|
264
|
+
|
92
265
|
## License
|
93
266
|
|
94
267
|
MIT License, see [LICENSE](LICENSE)
|
268
|
+
|
data/RELEASING.md
CHANGED
data/Rakefile
CHANGED