graphlient 0.0.8 → 0.0.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +15 -0
- data/.rubocop_todo.yml +5 -34
- data/CHANGELOG.md +5 -0
- data/README.md +31 -1
- data/lib/graphlient.rb +2 -0
- data/lib/graphlient/adapters.rb +1 -0
- data/lib/graphlient/adapters/http.rb +3 -0
- data/lib/graphlient/adapters/http/adapter.rb +23 -0
- data/lib/graphlient/adapters/http/faraday_adapter.rb +37 -0
- data/lib/graphlient/adapters/http/http_adapter.rb +39 -0
- data/lib/graphlient/client.rb +14 -13
- data/lib/graphlient/version.rb +1 -1
- data/spec/graphlient/adapters/{faraday_adapter_spec.rb → http/faraday_adapter_spec.rb} +17 -1
- data/spec/graphlient/adapters/http/http_adapter_spec.rb +41 -0
- data/spec/graphlient/client_query_spec.rb +8 -0
- metadata +10 -5
- data/lib/graphlient/adapters/faraday_adapter.rb +0 -43
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3243a1525db30d3bf16a4bc9fc699e07c829a3d5
|
4
|
+
data.tar.gz: 37d6d5fc32ce427967b06d3975b80d393af333a8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 29a39b7c44150ad3e9182b98e14ed407a688fffefb6a2fa1a62644130cb6c4c04bc694584d6cd6dab5b0b9321911d905b5a902a50aa11fcf75ac6747b1c15d7b
|
7
|
+
data.tar.gz: d665ba561261fa682ec71888810d9767f3f9a1a6ad4d8186832454d0220fbcfc1ad9957a9ca1af8136019c6848f20cae849e94c2a57812d73cd822d97fd15f76
|
data/.rubocop.yml
CHANGED
@@ -1,4 +1,19 @@
|
|
1
1
|
Style/FrozenStringLiteralComment:
|
2
2
|
Enabled: false
|
3
3
|
|
4
|
+
Style/Documentation:
|
5
|
+
Enabled: false
|
6
|
+
|
7
|
+
Metrics/LineLength:
|
8
|
+
Enabled: false
|
9
|
+
|
10
|
+
Metrics/MethodLength:
|
11
|
+
Enabled: false
|
12
|
+
|
13
|
+
Metrics/BlockLength:
|
14
|
+
Enabled: false
|
15
|
+
|
16
|
+
Metrics/AbcSize:
|
17
|
+
Enabled: false
|
18
|
+
|
4
19
|
inherit_from: .rubocop_todo.yml
|
data/.rubocop_todo.yml
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# This configuration was generated by
|
2
2
|
# `rubocop --auto-gen-config`
|
3
|
-
# on 2017-10-
|
3
|
+
# on 2017-10-26 13:24:56 -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
|
@@ -8,27 +8,10 @@
|
|
8
8
|
|
9
9
|
# Offense count: 1
|
10
10
|
# Cop supports --auto-correct.
|
11
|
-
# Configuration parameters:
|
12
|
-
|
13
|
-
Lint/EndAlignment:
|
11
|
+
# Configuration parameters: AllowUnusedKeywordArguments, IgnoreEmptyMethods.
|
12
|
+
Lint/UnusedMethodArgument:
|
14
13
|
Exclude:
|
15
|
-
- 'lib/graphlient/
|
16
|
-
|
17
|
-
# Offense count: 11
|
18
|
-
# Configuration parameters: CountComments, ExcludedMethods.
|
19
|
-
Metrics/BlockLength:
|
20
|
-
Max: 178
|
21
|
-
|
22
|
-
# Offense count: 19
|
23
|
-
# Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
|
24
|
-
# URISchemes: http, https
|
25
|
-
Metrics/LineLength:
|
26
|
-
Max: 177
|
27
|
-
|
28
|
-
# Offense count: 2
|
29
|
-
# Configuration parameters: CountComments.
|
30
|
-
Metrics/MethodLength:
|
31
|
-
Max: 12
|
14
|
+
- 'lib/graphlient/adapters/http/http_adapter.rb'
|
32
15
|
|
33
16
|
# Offense count: 1
|
34
17
|
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
@@ -37,18 +20,6 @@ Style/ClassAndModuleChildren:
|
|
37
20
|
Exclude:
|
38
21
|
- 'spec/graphlient/static_client_query_spec.rb'
|
39
22
|
|
40
|
-
# Offense count: 6
|
41
|
-
Style/Documentation:
|
42
|
-
Exclude:
|
43
|
-
- 'spec/**/*'
|
44
|
-
- 'test/**/*'
|
45
|
-
- 'lib/graphlient/adapters/faraday_adapter.rb'
|
46
|
-
- 'lib/graphlient/client.rb'
|
47
|
-
- 'lib/graphlient/errors/error.rb'
|
48
|
-
- 'lib/graphlient/errors/graphql.rb'
|
49
|
-
- 'lib/graphlient/extensions/query.rb'
|
50
|
-
- 'lib/graphlient/query.rb'
|
51
|
-
|
52
23
|
# Offense count: 2
|
53
24
|
# Cop supports --auto-correct.
|
54
25
|
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
@@ -64,7 +35,7 @@ Style/MethodMissing:
|
|
64
35
|
- 'lib/graphlient/extensions/query.rb'
|
65
36
|
- 'lib/graphlient/query.rb'
|
66
37
|
|
67
|
-
# Offense count:
|
38
|
+
# Offense count: 3
|
68
39
|
Style/MultilineBlockChain:
|
69
40
|
Exclude:
|
70
41
|
- 'spec/graphlient/client_query_spec.rb'
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
### 0.0.9 (10/26/2017)
|
2
|
+
|
3
|
+
* [#28](https://github.com/ashkan18/graphlient/pull/28): Raise errors in `execute`, not only `query` - [@dblock](https://github.com/dblock).
|
4
|
+
* [#29](https://github.com/ashkan18/graphlient/pull/29): Added `Graphlient::Adapters::HTTP::HTTPAdapter` that replaces Faraday with `Net::HTTP` - [@dblock](https://github.com/dblock).
|
5
|
+
|
1
6
|
### 0.0.8 (10/26/2017)
|
2
7
|
|
3
8
|
* [#27](https://github.com/ashkan18/graphlient/pull/27): Always raise an exception unless a query has succeeded - [@dblock](https://github.com/dblock).
|
data/README.md
CHANGED
@@ -265,9 +265,19 @@ query.to_s
|
|
265
265
|
# "\nquery{\n invoice(id: 10){\n line_items\n }\n }\n"
|
266
266
|
```
|
267
267
|
|
268
|
+
### Swapping the HTTP Stack
|
269
|
+
|
270
|
+
You can swap the default Faraday adapter for `Net::HTTP`.
|
271
|
+
|
272
|
+
```ruby
|
273
|
+
client = Graphlient::Client.new('https://test-graphql.biz/graphql',
|
274
|
+
http: Graphlient::Adapters::HTTP::HTTPAdapter
|
275
|
+
)
|
276
|
+
```
|
277
|
+
|
268
278
|
### Testing with Graphlient and RSpec
|
269
279
|
|
270
|
-
Use Graphlient inside your RSpec tests in a Rails application or with `Rack::Test
|
280
|
+
Use Graphlient inside your RSpec tests in a Rails application or with `Rack::Test` against your actual application.
|
271
281
|
|
272
282
|
```ruby
|
273
283
|
require 'spec_helper'
|
@@ -307,6 +317,26 @@ describe App do
|
|
307
317
|
end
|
308
318
|
```
|
309
319
|
|
320
|
+
Alternately you can `stub_request` with Webmock.
|
321
|
+
|
322
|
+
```ruby
|
323
|
+
describe App do
|
324
|
+
let(:url) { 'http://example.com/graphql' }
|
325
|
+
let(:client) { Graphlient::Client.new(url) }
|
326
|
+
|
327
|
+
before do
|
328
|
+
stub_request(:post, url).to_return(
|
329
|
+
status: 200,
|
330
|
+
body: DummySchema.execute(GraphQL::Introspection::INTROSPECTION_QUERY).to_json
|
331
|
+
)
|
332
|
+
end
|
333
|
+
|
334
|
+
it 'retrieves schema' do
|
335
|
+
expect(client.schema).to be_a GraphQL::Schema
|
336
|
+
end
|
337
|
+
end
|
338
|
+
```
|
339
|
+
|
310
340
|
## License
|
311
341
|
|
312
342
|
MIT License, see [LICENSE](LICENSE)
|
data/lib/graphlient.rb
CHANGED
@@ -0,0 +1 @@
|
|
1
|
+
require_relative 'adapters/http'
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Graphlient
|
2
|
+
module Adapters
|
3
|
+
module HTTP
|
4
|
+
class Adapter
|
5
|
+
attr_accessor :url, :options
|
6
|
+
|
7
|
+
def initialize(url, options = {}, &_block)
|
8
|
+
@url = url
|
9
|
+
@options = options.dup if options
|
10
|
+
yield self if block_given?
|
11
|
+
end
|
12
|
+
|
13
|
+
def headers
|
14
|
+
options[:headers] if options
|
15
|
+
end
|
16
|
+
|
17
|
+
def execute(*)
|
18
|
+
raise NotImplementedError
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
require 'faraday_middleware'
|
3
|
+
|
4
|
+
module Graphlient
|
5
|
+
module Adapters
|
6
|
+
module HTTP
|
7
|
+
class FaradayAdapter < Adapter
|
8
|
+
def execute(document:, operation_name:, variables:, context:)
|
9
|
+
response = connection.post do |req|
|
10
|
+
req.headers.merge!(context[:headers] || {})
|
11
|
+
req.body = {
|
12
|
+
query: document.to_query_string,
|
13
|
+
operationName: operation_name,
|
14
|
+
variables: variables.to_json
|
15
|
+
}.to_json
|
16
|
+
end
|
17
|
+
response.body
|
18
|
+
rescue Faraday::ClientError => e
|
19
|
+
raise Graphlient::Errors::Server.new(e.message, e)
|
20
|
+
end
|
21
|
+
|
22
|
+
def connection
|
23
|
+
@connection ||= Faraday.new(url: url, headers: headers) do |c|
|
24
|
+
c.use Faraday::Response::RaiseError
|
25
|
+
c.request :json
|
26
|
+
c.response :json
|
27
|
+
if block_given?
|
28
|
+
yield c
|
29
|
+
else
|
30
|
+
c.use Faraday::Adapter::NetHttp
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'graphql/client/http'
|
2
|
+
|
3
|
+
module Graphlient
|
4
|
+
module Adapters
|
5
|
+
module HTTP
|
6
|
+
class HTTPAdapter < Adapter
|
7
|
+
attr_reader :uri
|
8
|
+
|
9
|
+
def execute(document:, operation_name: nil, variables: {}, context: {})
|
10
|
+
request = Net::HTTP::Post.new(url)
|
11
|
+
|
12
|
+
request['Accept'] = 'application/json'
|
13
|
+
request['Content-Type'] = 'application/json'
|
14
|
+
headers&.each { |name, value| request[name] = value }
|
15
|
+
|
16
|
+
body = {}
|
17
|
+
body['query'] = document.to_query_string
|
18
|
+
body['variables'] = variables if variables.any?
|
19
|
+
body['operationName'] = operation_name if operation_name
|
20
|
+
request.body = JSON.generate(body)
|
21
|
+
|
22
|
+
response = connection.request(request)
|
23
|
+
raise Graphlient::Errors::Server.new("the server responded with status #{response.code}", response) unless response.is_a?(Net::HTTPOK)
|
24
|
+
JSON.parse(response.body)
|
25
|
+
end
|
26
|
+
|
27
|
+
def uri
|
28
|
+
@uri ||= URI(url)
|
29
|
+
end
|
30
|
+
|
31
|
+
def connection
|
32
|
+
Net::HTTP.new(uri.host, uri.port).tap do |client|
|
33
|
+
client.use_ssl = uri.scheme == 'https'
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/lib/graphlient/client.rb
CHANGED
@@ -1,6 +1,3 @@
|
|
1
|
-
require 'graphql/client'
|
2
|
-
require 'graphlient/adapters/faraday_adapter'
|
3
|
-
|
4
1
|
module Graphlient
|
5
2
|
class Client
|
6
3
|
attr_accessor :uri, :options
|
@@ -16,6 +13,8 @@ module Graphlient
|
|
16
13
|
instance_eval(&block)
|
17
14
|
end
|
18
15
|
client.parse(query_str.to_s)
|
16
|
+
rescue GraphQL::Client::Error => e
|
17
|
+
raise Graphlient::Errors::Client.new(e.message, e)
|
19
18
|
end
|
20
19
|
|
21
20
|
def execute(query, variables = nil)
|
@@ -23,25 +22,27 @@ module Graphlient
|
|
23
22
|
query_params[:context] = @options if @options
|
24
23
|
query_params[:variables] = variables if variables
|
25
24
|
query = client.parse(query) if query.is_a?(String)
|
26
|
-
client.query(query, query_params)
|
25
|
+
rc = client.query(query, query_params)
|
26
|
+
raise Graphlient::Errors::GraphQL, rc if rc.errors.any?
|
27
|
+
rc
|
27
28
|
rescue GraphQL::Client::Error => e
|
28
29
|
raise Graphlient::Errors::Client.new(e.message, e)
|
29
30
|
end
|
30
31
|
|
31
32
|
def query(query_or_variables = nil, variables = nil, &block)
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
33
|
+
if block_given?
|
34
|
+
execute(parse(&block), query_or_variables)
|
35
|
+
else
|
36
|
+
execute(query_or_variables, variables)
|
36
37
|
end
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
38
|
+
end
|
39
|
+
|
40
|
+
def http_adapter_class
|
41
|
+
options[:http] || Adapters::HTTP::FaradayAdapter
|
41
42
|
end
|
42
43
|
|
43
44
|
def http(&block)
|
44
|
-
@http ||=
|
45
|
+
@http ||= http_adapter_class.new(@url, headers: @options[:headers], &block)
|
45
46
|
end
|
46
47
|
|
47
48
|
def schema
|
data/lib/graphlient/version.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe Graphlient::Adapters::FaradayAdapter do
|
3
|
+
describe Graphlient::Adapters::HTTP::FaradayAdapter do
|
4
4
|
let(:app) { Object.new }
|
5
5
|
|
6
6
|
context 'with a custom middleware' do
|
@@ -41,4 +41,20 @@ describe Graphlient::Adapters::FaradayAdapter do
|
|
41
41
|
expect(client.http.headers).to eq headers
|
42
42
|
end
|
43
43
|
end
|
44
|
+
|
45
|
+
context 'default' do
|
46
|
+
let(:url) { 'http://example.com/graphql' }
|
47
|
+
let(:client) { Graphlient::Client.new(url) }
|
48
|
+
|
49
|
+
before do
|
50
|
+
stub_request(:post, url).to_return(
|
51
|
+
status: 200,
|
52
|
+
body: DummySchema.execute(GraphQL::Introspection::INTROSPECTION_QUERY).to_json
|
53
|
+
)
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'retrieves schema' do
|
57
|
+
expect(client.schema).to be_a GraphQL::Schema
|
58
|
+
end
|
59
|
+
end
|
44
60
|
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Graphlient::Adapters::HTTP::HTTPAdapter do
|
4
|
+
let(:app) { Object.new }
|
5
|
+
|
6
|
+
context 'with custom url and headers' do
|
7
|
+
let(:url) { 'http://example.com/graphql' }
|
8
|
+
let(:headers) { { 'Foo' => 'bar' } }
|
9
|
+
let(:client) do
|
10
|
+
Graphlient::Client.new(url, headers: headers, http: Graphlient::Adapters::HTTP::HTTPAdapter)
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'sets adapter' do
|
14
|
+
expect(client.http).to be_a Graphlient::Adapters::HTTP::HTTPAdapter
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'sets url' do
|
18
|
+
expect(client.http.url).to eq url
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'sets headers' do
|
22
|
+
expect(client.http.headers).to eq headers
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
context 'default' do
|
27
|
+
let(:url) { 'http://example.com/graphql' }
|
28
|
+
let(:client) { Graphlient::Client.new(url, http: Graphlient::Adapters::HTTP::HTTPAdapter) }
|
29
|
+
|
30
|
+
before do
|
31
|
+
stub_request(:post, url).to_return(
|
32
|
+
status: 200,
|
33
|
+
body: DummySchema.execute(GraphQL::Introspection::INTROSPECTION_QUERY).to_json
|
34
|
+
)
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'retrieves schema' do
|
38
|
+
expect(client.schema).to be_a GraphQL::Schema
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -75,6 +75,14 @@ describe Graphlient::Client do
|
|
75
75
|
expect(invoices.first.id).to eq 42
|
76
76
|
expect(invoices.first.fee_in_cents).to eq 20_000
|
77
77
|
end
|
78
|
+
|
79
|
+
it 'fails when wrong input type' do
|
80
|
+
expect do
|
81
|
+
client.execute(query, ids: ['42'])
|
82
|
+
end.to raise_error Graphlient::Errors::GraphQL do |e|
|
83
|
+
expect(e.to_s).to eq "Variable ids of type [Int] was provided invalid value\n 0: Could not coerce value \"42\" to Int"
|
84
|
+
end
|
85
|
+
end
|
78
86
|
end
|
79
87
|
end
|
80
88
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: graphlient
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ashkan Nasseri
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-10-
|
11
|
+
date: 2017-10-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: graphql-client
|
@@ -74,7 +74,11 @@ files:
|
|
74
74
|
- Rakefile
|
75
75
|
- graphlient.gemspec
|
76
76
|
- lib/graphlient.rb
|
77
|
-
- lib/graphlient/adapters
|
77
|
+
- lib/graphlient/adapters.rb
|
78
|
+
- lib/graphlient/adapters/http.rb
|
79
|
+
- lib/graphlient/adapters/http/adapter.rb
|
80
|
+
- lib/graphlient/adapters/http/faraday_adapter.rb
|
81
|
+
- lib/graphlient/adapters/http/http_adapter.rb
|
78
82
|
- lib/graphlient/client.rb
|
79
83
|
- lib/graphlient/errors.rb
|
80
84
|
- lib/graphlient/errors/client.rb
|
@@ -85,7 +89,8 @@ files:
|
|
85
89
|
- lib/graphlient/extensions/query.rb
|
86
90
|
- lib/graphlient/query.rb
|
87
91
|
- lib/graphlient/version.rb
|
88
|
-
- spec/graphlient/adapters/faraday_adapter_spec.rb
|
92
|
+
- spec/graphlient/adapters/http/faraday_adapter_spec.rb
|
93
|
+
- spec/graphlient/adapters/http/http_adapter_spec.rb
|
89
94
|
- spec/graphlient/client_query_spec.rb
|
90
95
|
- spec/graphlient/client_schema_spec.rb
|
91
96
|
- spec/graphlient/extensions/query_spec.rb
|
@@ -119,7 +124,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
119
124
|
version: 1.3.6
|
120
125
|
requirements: []
|
121
126
|
rubyforge_project:
|
122
|
-
rubygems_version: 2.
|
127
|
+
rubygems_version: 2.6.12
|
123
128
|
signing_key:
|
124
129
|
specification_version: 4
|
125
130
|
summary: Ruby Gem for consuming GraphQL endpoints
|
@@ -1,43 +0,0 @@
|
|
1
|
-
require 'faraday'
|
2
|
-
require 'faraday_middleware'
|
3
|
-
|
4
|
-
module Graphlient
|
5
|
-
module Adapters
|
6
|
-
class FaradayAdapter
|
7
|
-
attr_accessor :url, :headers
|
8
|
-
|
9
|
-
def initialize(url, headers:, &_block)
|
10
|
-
@url = url
|
11
|
-
@headers = headers.dup if headers
|
12
|
-
yield self if block_given?
|
13
|
-
end
|
14
|
-
|
15
|
-
def execute(document:, operation_name:, variables:, context:)
|
16
|
-
response = connection.post do |req|
|
17
|
-
req.headers.merge!(context[:headers] || {})
|
18
|
-
req.body = {
|
19
|
-
query: document.to_query_string,
|
20
|
-
operationName: operation_name,
|
21
|
-
variables: variables.to_json
|
22
|
-
}.to_json
|
23
|
-
end
|
24
|
-
response.body
|
25
|
-
rescue Faraday::ClientError => e
|
26
|
-
raise Graphlient::Errors::Server.new(e.message, e)
|
27
|
-
end
|
28
|
-
|
29
|
-
def connection
|
30
|
-
@connection ||= Faraday.new(url: url, headers: headers) do |c|
|
31
|
-
c.use Faraday::Response::RaiseError
|
32
|
-
c.request :json
|
33
|
-
c.response :json
|
34
|
-
if block_given?
|
35
|
-
yield c
|
36
|
-
else
|
37
|
-
c.use Faraday::Adapter::NetHttp
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|