graphlient 0.0.5 → 0.0.6
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/.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
|
[](https://badge.fury.io/rb/graphlient)
|
4
4
|
[](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