graphlient 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1328f248da112cdd69028ad82f37ec75ef69d707
4
- data.tar.gz: e33c4cc31d7566a38cf8e0b2cb8dcf2abc001abb
3
+ metadata.gz: 0da18e4b9370c65fb4e6add0b644c89b55149b32
4
+ data.tar.gz: 39a55d067517d0be0f609ea3fcea3836cc0c4e9c
5
5
  SHA512:
6
- metadata.gz: df9ab753adb46c62d6ad8b69efad0c2a73dc41c5ce703eb47c60bbf129ae1b2eac204184bc1966d36660690261cc9467da44147652624780edf39a9b5675027c
7
- data.tar.gz: c5e38abf851c13e336d84aa85d4c6726869bf37692bf7cd632ffc6bc78666197af0b95abb58d52ce452fee25ef9edadfb67a308382827c943cde6bdc88d5b04b
6
+ metadata.gz: d443d7ca4023923bce79d474e59bab4e7f85fb2b4f270fd8466435997c89dfb8bb763821728b428d7e8dde0f196b4f2e4ae8e9747c805e11dbae301707b7326f
7
+ data.tar.gz: 3bf4e9568f17b0a26566a1d79f422395ce545a6273ca37c8d177a858734e78dcee1d3a5706678e0613998a67d63d7b309dec0be14b9edef0342759b9943d5917
@@ -1,17 +1,25 @@
1
1
  # This configuration was generated by
2
2
  # `rubocop --auto-gen-config`
3
- # on 2017-10-23 15:14:47 -0400 using RuboCop version 0.47.1.
3
+ # on 2017-10-25 13:18:43 -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: 1
10
+ # Cop supports --auto-correct.
11
+ # Configuration parameters: EnforcedStyleAlignWith, SupportedStylesAlignWith, AutoCorrect.
12
+ # SupportedStylesAlignWith: keyword, variable, start_of_line
13
+ Lint/EndAlignment:
14
+ Exclude:
15
+ - 'lib/graphlient/client.rb'
16
+
9
17
  # Offense count: 11
10
18
  # Configuration parameters: CountComments, ExcludedMethods.
11
19
  Metrics/BlockLength:
12
- Max: 167
20
+ Max: 178
13
21
 
14
- # Offense count: 17
22
+ # Offense count: 19
15
23
  # Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
16
24
  # URISchemes: http, https
17
25
  Metrics/LineLength:
@@ -29,7 +37,7 @@ Style/ClassAndModuleChildren:
29
37
  Exclude:
30
38
  - 'spec/graphlient/static_client_query_spec.rb'
31
39
 
32
- # Offense count: 5
40
+ # Offense count: 6
33
41
  Style/Documentation:
34
42
  Exclude:
35
43
  - 'spec/**/*'
@@ -37,6 +45,7 @@ Style/Documentation:
37
45
  - 'lib/graphlient/adapters/faraday_adapter.rb'
38
46
  - 'lib/graphlient/client.rb'
39
47
  - 'lib/graphlient/errors/error.rb'
48
+ - 'lib/graphlient/errors/graphql.rb'
40
49
  - 'lib/graphlient/extensions/query.rb'
41
50
  - 'lib/graphlient/query.rb'
42
51
 
@@ -1,3 +1,7 @@
1
+ ### 0.0.8 (10/26/2017)
2
+
3
+ * [#27](https://github.com/ashkan18/graphlient/pull/27): Always raise an exception unless a query has succeeded - [@dblock](https://github.com/dblock).
4
+
1
5
  ### 0.0.7 (10/24/2017)
2
6
 
3
7
  * [#26](https://github.com/ashkan18/graphlient/pull/26): Support String queries - [@dblock](https://github.com/dblock).
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 friendlier Ruby client for consuming GraphQL-based APIs. Built on top of your usual [graphql-client](https://github.com/github/graphql-client), but with better defaults, and using the [faraday](https://github.com/lostisland/faraday) HTTP client.
6
+ A friendlier Ruby client for consuming GraphQL-based APIs. Built on top of your usual [graphql-client](https://github.com/github/graphql-client), but with better defaults, more consistent error handling, and using the [faraday](https://github.com/lostisland/faraday) HTTP client.
7
7
 
8
8
  ## Installation
9
9
 
@@ -82,8 +82,6 @@ query {
82
82
  }
83
83
  ```
84
84
 
85
- 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.
86
-
87
85
  A successful response object always contains data which can be iterated upon. The following example returns the first line item's price.
88
86
 
89
87
  ```ruby
@@ -109,6 +107,16 @@ The successful response contains data in `response.data`. The following example
109
107
  response.data.create_invoice.first.id
110
108
  ```
111
109
 
110
+ ### Error Handling
111
+
112
+ Unlike graphql-client, Graphlient will always raise an exception unless the query has succeeded.
113
+
114
+ * [Graphlient::Errors::Client](lib/graphlient/errors/client.rb): all client-side query validation failures based on current schema
115
+ * [Graphlient::Errors::GraphQL](lib/graphlient/errors/graphql.rb): all GraphQL API errors, with a humanly readable collection of problems
116
+ * [Graphlient::Errors::Server](lib/graphlient/errors/server.rb): all transport errors raised by Faraday
117
+
118
+ All errors inherit from `Graphlient::Errors::Error` if you need to handle them in bulk.
119
+
112
120
  ### Executing Parameterized Queries and Mutations
113
121
 
114
122
  Graphlient can execute parameterized queries and mutations by providing variables as query parameters.
@@ -29,11 +29,13 @@ module Graphlient
29
29
  end
30
30
 
31
31
  def query(query_or_variables = nil, variables = nil, &block)
32
- if block_given?
33
- execute(parse(&block), query_or_variables)
34
- else
35
- execute(query_or_variables, variables)
32
+ rc = if block_given?
33
+ execute(parse(&block), query_or_variables)
34
+ else
35
+ execute(query_or_variables, variables)
36
36
  end
37
+ raise Graphlient::Errors::GraphQL, rc if rc.errors.any?
38
+ rc
37
39
  rescue GraphQL::Client::Error => e
38
40
  raise Graphlient::Errors::Client.new(e.message, e)
39
41
  end
@@ -1,3 +1,4 @@
1
1
  require_relative 'errors/error'
2
2
  require_relative 'errors/client'
3
3
  require_relative 'errors/server'
4
+ require_relative 'errors/graphql'
@@ -0,0 +1,44 @@
1
+ module Graphlient
2
+ module Errors
3
+ class GraphQL < Error
4
+ attr_reader :response
5
+
6
+ def initialize(response)
7
+ @response = response
8
+ super 'the server responded with a GraphQL error'
9
+ end
10
+
11
+ def errors
12
+ response.errors
13
+ end
14
+
15
+ def to_s
16
+ errors.details.map do |key, details|
17
+ details = create_details(details).join("\n")
18
+ [key == 'data' ? nil : key, details].compact.join(': ')
19
+ end.join("\n")
20
+ end
21
+
22
+ private
23
+
24
+ def create_details(details)
25
+ details.map { |detail| create_detail(detail) }
26
+ end
27
+
28
+ def create_detail(detail)
29
+ message = detail['message']
30
+ [message, create_problems(detail['problems']).compact.join("\n ")].join("\n ")
31
+ end
32
+
33
+ def create_problems(problems)
34
+ problems.map { |problem| create_problem(problem) }
35
+ end
36
+
37
+ def create_problem(problem)
38
+ paths = problem['path'].join(', ')
39
+ explanation = problem['explanation']
40
+ [paths, explanation].join(': ')
41
+ end
42
+ end
43
+ end
44
+ end
@@ -1,3 +1,3 @@
1
1
  module Graphlient
2
- VERSION = '0.0.7'.freeze
2
+ VERSION = '0.0.8'.freeze
3
3
  end
@@ -143,20 +143,17 @@ describe Graphlient::Client do
143
143
 
144
144
  context 'parameterized query' do
145
145
  it 'fails when missing input' do
146
- response = client.query do
147
- mutation('$input' => :createInvoiceInput!) do
148
- createInvoice(input: :$input) do
149
- id
150
- fee_in_cents
146
+ expect do
147
+ client.query do
148
+ mutation('$input' => :createInvoiceInput!) do
149
+ createInvoice(input: :$input) do
150
+ id
151
+ fee_in_cents
152
+ end
151
153
  end
152
154
  end
153
- end
154
-
155
- expect(response.errors.messages['data']).to eq(
156
- [
157
- 'Variable input of type createInvoiceInput! was provided invalid value'
158
- ]
159
- )
155
+ end.to raise_error Graphlient::Errors::GraphQL,
156
+ "Variable input of type createInvoiceInput! was provided invalid value\n : Expected value to not be null"
160
157
  end
161
158
 
162
159
  it 'returns a response from a query' do
@@ -188,6 +185,20 @@ describe Graphlient::Client do
188
185
  expect(invoice.id).to eq 1231
189
186
  expect(invoice.fee_in_cents).to eq 12_345
190
187
  end
188
+
189
+ it 'fails when mutation missing a field' do
190
+ expect do
191
+ client.query(input: {}) do
192
+ mutation(:$input => :createInvoiceInput!) do
193
+ createInvoice(input: :$input) do
194
+ id
195
+ fee_in_cents
196
+ end
197
+ end
198
+ end
199
+ end.to raise_error Graphlient::Errors::GraphQL,
200
+ "Variable input of type createInvoiceInput! was provided invalid value\n fee_in_cents: Expected value to not be null"
201
+ end
191
202
  end
192
203
  end
193
204
  end
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.7
4
+ version: 0.0.8
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-24 00:00:00.000000000 Z
11
+ date: 2017-10-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: graphql-client
@@ -79,6 +79,7 @@ files:
79
79
  - lib/graphlient/errors.rb
80
80
  - lib/graphlient/errors/client.rb
81
81
  - lib/graphlient/errors/error.rb
82
+ - lib/graphlient/errors/graphql.rb
82
83
  - lib/graphlient/errors/server.rb
83
84
  - lib/graphlient/extensions.rb
84
85
  - lib/graphlient/extensions/query.rb