graphlient 0.0.9 → 0.1.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3243a1525db30d3bf16a4bc9fc699e07c829a3d5
4
- data.tar.gz: 37d6d5fc32ce427967b06d3975b80d393af333a8
3
+ metadata.gz: f73350b469913784302c46b7305cef2d8949ad32
4
+ data.tar.gz: 91e1a47a61c402174bef0f15a0568e05d26b73cc
5
5
  SHA512:
6
- metadata.gz: 29a39b7c44150ad3e9182b98e14ed407a688fffefb6a2fa1a62644130cb6c4c04bc694584d6cd6dab5b0b9321911d905b5a902a50aa11fcf75ac6747b1c15d7b
7
- data.tar.gz: d665ba561261fa682ec71888810d9767f3f9a1a6ad4d8186832454d0220fbcfc1ad9957a9ca1af8136019c6848f20cae849e94c2a57812d73cd822d97fd15f76
6
+ metadata.gz: aaadb8bf32399b399fae81c4ce62a3d73508317eb4a157f90c9bf1665a77f5d91116dc0e263a6d27a2d5dfad9eeca1ea730b3d81966d68d0519c65b2dd9cb3cc
7
+ data.tar.gz: f50b03492b2e1c82b974fd5e59952e00cd38f82e992d5a2be84efdb4afa146a4ec65cf3370b4d77054a9de3094b7fb483453aea6f48655695c73e76bbbd83d59
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-26 13:24:56 -0400 using RuboCop version 0.47.1.
3
+ # on 2017-10-27 10:35: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
@@ -13,6 +13,14 @@ Lint/UnusedMethodArgument:
13
13
  Exclude:
14
14
  - 'lib/graphlient/adapters/http/http_adapter.rb'
15
15
 
16
+ # Offense count: 1
17
+ Metrics/CyclomaticComplexity:
18
+ Max: 9
19
+
20
+ # Offense count: 1
21
+ Metrics/PerceivedComplexity:
22
+ Max: 9
23
+
16
24
  # Offense count: 1
17
25
  # Configuration parameters: EnforcedStyle, SupportedStyles.
18
26
  # SupportedStyles: nested, compact
@@ -35,7 +43,7 @@ Style/MethodMissing:
35
43
  - 'lib/graphlient/extensions/query.rb'
36
44
  - 'lib/graphlient/query.rb'
37
45
 
38
- # Offense count: 3
46
+ # Offense count: 4
39
47
  Style/MultilineBlockChain:
40
48
  Exclude:
41
49
  - 'spec/graphlient/client_query_spec.rb'
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ ### 0.1.0 (10/27/2017)
2
+
3
+ * [#31](https://github.com/ashkan18/graphlient/issues/31): Fix: catch execution errors that don't contain field names - [@dblock](https://github.com/dblock).
4
+
1
5
  ### 0.0.9 (10/26/2017)
2
6
 
3
7
  * [#28](https://github.com/ashkan18/graphlient/pull/28): Raise errors in `execute`, not only `query` - [@dblock](https://github.com/dblock).
data/Gemfile CHANGED
@@ -12,6 +12,7 @@ end
12
12
 
13
13
  group :test do
14
14
  gem 'graphql'
15
+ gem 'graphql-errors'
15
16
  gem 'rack-parser'
16
17
  gem 'rack-test'
17
18
  gem 'rspec'
data/README.md CHANGED
@@ -111,9 +111,10 @@ response.data.create_invoice.first.id
111
111
 
112
112
  Unlike graphql-client, Graphlient will always raise an exception unless the query has succeeded.
113
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
114
+ * [Graphlient::Errors::ClientError](lib/graphlient/errors/client_error.rb): all client-side query validation failures based on current schema
115
+ * [Graphlient::Errors::GraphQLError](lib/graphlient/errors/graphql_error.rb): all GraphQL API errors, with a humanly readable collection of problems
116
+ * [Graphlient::Errors::ExecutionError](lib/graphlient/errors/execution_error.rb): all GraphQL execution errors, with a humanly readable collection of problems
117
+ * [Graphlient::Errors::ServerError](lib/graphlient/errors/server_error.rb): all transport errors raised by Faraday
117
118
 
118
119
  All errors inherit from `Graphlient::Errors::Error` if you need to handle them in bulk.
119
120
 
data/graphlient.gemspec CHANGED
@@ -13,7 +13,7 @@ Gem::Specification.new do |s|
13
13
  s.require_paths = ['lib']
14
14
  s.homepage = 'http://github.com/ashkan18/graphlient'
15
15
  s.licenses = ['MIT']
16
- s.summary = 'Ruby Gem for consuming GraphQL endpoints'
16
+ s.summary = 'A friendlier Ruby client for consuming GraphQL-based APIs.'
17
17
  s.add_dependency 'graphql-client'
18
18
  s.add_dependency 'faraday'
19
19
  s.add_dependency 'faraday_middleware'
@@ -16,7 +16,7 @@ module Graphlient
16
16
  end
17
17
  response.body
18
18
  rescue Faraday::ClientError => e
19
- raise Graphlient::Errors::Server.new(e.message, e)
19
+ raise Graphlient::Errors::ServerError.new(e.message, e)
20
20
  end
21
21
 
22
22
  def connection
@@ -20,7 +20,7 @@ module Graphlient
20
20
  request.body = JSON.generate(body)
21
21
 
22
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)
23
+ raise Graphlient::Errors::ServerError.new("the server responded with status #{response.code}", response) unless response.is_a?(Net::HTTPOK)
24
24
  JSON.parse(response.body)
25
25
  end
26
26
 
@@ -14,7 +14,7 @@ module Graphlient
14
14
  end
15
15
  client.parse(query_str.to_s)
16
16
  rescue GraphQL::Client::Error => e
17
- raise Graphlient::Errors::Client.new(e.message, e)
17
+ raise Graphlient::Errors::ClientError.new(e.message, e)
18
18
  end
19
19
 
20
20
  def execute(query, variables = nil)
@@ -23,10 +23,13 @@ module Graphlient
23
23
  query_params[:variables] = variables if variables
24
24
  query = client.parse(query) if query.is_a?(String)
25
25
  rc = client.query(query, query_params)
26
- raise Graphlient::Errors::GraphQL, rc if rc.errors.any?
26
+ raise Graphlient::Errors::GraphQLError, rc if rc.errors.any?
27
+ # see https://github.com/github/graphql-client/pull/132
28
+ # see https://github.com/exAspArk/graphql-errors/issues/2
29
+ raise Graphlient::Errors::ExecutionError, rc if rc.data && rc.data.errors && rc.data.errors.any?
27
30
  rc
28
31
  rescue GraphQL::Client::Error => e
29
- raise Graphlient::Errors::Client.new(e.message, e)
32
+ raise Graphlient::Errors::ClientError.new(e.message, e)
30
33
  end
31
34
 
32
35
  def query(query_or_variables = nil, variables = nil, &block)
@@ -1,4 +1,5 @@
1
1
  require_relative 'errors/error'
2
- require_relative 'errors/client'
3
- require_relative 'errors/server'
4
- require_relative 'errors/graphql'
2
+ require_relative 'errors/client_error'
3
+ require_relative 'errors/server_error'
4
+ require_relative 'errors/graphql_error'
5
+ require_relative 'errors/execution_error'
@@ -1,6 +1,6 @@
1
1
  module Graphlient
2
2
  module Errors
3
- class Client < Error
3
+ class ClientError < Error
4
4
  end
5
5
  end
6
6
  end
@@ -0,0 +1,29 @@
1
+ module Graphlient
2
+ module Errors
3
+ class ExecutionError < Error
4
+ attr_reader :response
5
+
6
+ def initialize(response)
7
+ @response = response
8
+ super 'the server responded with a GraphQL execution error'
9
+ end
10
+
11
+ def errors
12
+ response.data.errors
13
+ end
14
+
15
+ def to_s
16
+ errors.details.map do |key, details|
17
+ details = create_details(details).join("\n")
18
+ [key, details].compact.join(': ')
19
+ end.join("\n")
20
+ end
21
+
22
+ private
23
+
24
+ def create_details(details)
25
+ details.map { |detail| detail['message'] }
26
+ end
27
+ end
28
+ end
29
+ end
@@ -1,6 +1,6 @@
1
1
  module Graphlient
2
2
  module Errors
3
- class GraphQL < Error
3
+ class GraphQLError < Error
4
4
  attr_reader :response
5
5
 
6
6
  def initialize(response)
@@ -1,6 +1,6 @@
1
1
  module Graphlient
2
2
  module Errors
3
- class Server < Error
3
+ class ServerError < Error
4
4
  end
5
5
  end
6
6
  end
@@ -1,3 +1,3 @@
1
1
  module Graphlient
2
- VERSION = '0.0.9'.freeze
2
+ VERSION = '0.1.0'.freeze
3
3
  end
@@ -79,10 +79,19 @@ describe Graphlient::Client do
79
79
  it 'fails when wrong input type' do
80
80
  expect do
81
81
  client.execute(query, ids: ['42'])
82
- end.to raise_error Graphlient::Errors::GraphQL do |e|
82
+ end.to raise_error Graphlient::Errors::GraphQLError do |e|
83
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
84
  end
85
85
  end
86
+
87
+ it 'fails on an execution error' do
88
+ expect do
89
+ allow(OpenStruct).to receive(:new).and_raise StandardError, 'Unexpected error.'
90
+ client.execute(query, ids: [42])
91
+ end.to raise_error Graphlient::Errors::ExecutionError do |e|
92
+ expect(e.to_s).to eq 'invoices: Unexpected error.'
93
+ end
94
+ end
86
95
  end
87
96
  end
88
97
 
@@ -98,7 +107,7 @@ describe Graphlient::Client do
98
107
  end
99
108
  end
100
109
  end
101
- end.to raise_error Graphlient::Errors::Client do |e|
110
+ end.to raise_error Graphlient::Errors::ClientError do |e|
102
111
  expect(e.to_s).to eq "Field 'invoice' doesn't exist on type 'Query'"
103
112
  end
104
113
  end
@@ -160,7 +169,7 @@ describe Graphlient::Client do
160
169
  end
161
170
  end
162
171
  end
163
- end.to raise_error Graphlient::Errors::GraphQL,
172
+ end.to raise_error Graphlient::Errors::GraphQLError,
164
173
  "Variable input of type createInvoiceInput! was provided invalid value\n : Expected value to not be null"
165
174
  end
166
175
 
@@ -204,7 +213,7 @@ describe Graphlient::Client do
204
213
  end
205
214
  end
206
215
  end
207
- end.to raise_error Graphlient::Errors::GraphQL,
216
+ end.to raise_error Graphlient::Errors::GraphQLError,
208
217
  "Variable input of type createInvoiceInput! was provided invalid value\n fee_in_cents: Expected value to not be null"
209
218
  end
210
219
  end
@@ -11,7 +11,7 @@ describe Graphlient::Client do
11
11
  it 'fails with an exception' do
12
12
  expect do
13
13
  client.schema
14
- end.to raise_error Graphlient::Errors::Server do |e|
14
+ end.to raise_error Graphlient::Errors::ServerError do |e|
15
15
  expect(e.to_s).to eq 'the server responded with status 500'
16
16
  end
17
17
  end
@@ -9,17 +9,11 @@ before do
9
9
  end
10
10
 
11
11
  post '/graphql' do
12
- begin
13
- headers['Content-Type'] = 'application/json'
14
- DummySchema.execute(
15
- params[:query],
16
- variables: params[:variables] ? JSON.parse(params[:variables]) : {},
17
- context: {},
18
- operation_name: params[:operationName]
19
- ).to_json
20
- rescue StandardError => e
21
- warn e
22
- warn e.backtrace.join("\n")
23
- raise e
24
- end
12
+ headers['Content-Type'] = 'application/json'
13
+ DummySchema.execute(
14
+ params[:query],
15
+ variables: params[:variables] ? JSON.parse(params[:variables]) : {},
16
+ context: {},
17
+ operation_name: params[:operationName]
18
+ ).to_json
25
19
  end
@@ -3,7 +3,15 @@ require_relative 'types/invoice_type'
3
3
  require_relative 'queries/query'
4
4
  require_relative 'mutations/mutation'
5
5
 
6
+ require 'graphql/errors'
7
+
6
8
  DummySchema = GraphQL::Schema.define do
7
9
  query Query
8
10
  mutation Mutation
9
11
  end
12
+
13
+ GraphQL::Errors.configure(DummySchema) do
14
+ rescue_from StandardError do |e|
15
+ GraphQL::ExecutionError.new(e.message)
16
+ end
17
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: graphlient
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.9
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ashkan Nasseri
@@ -81,10 +81,11 @@ files:
81
81
  - lib/graphlient/adapters/http/http_adapter.rb
82
82
  - lib/graphlient/client.rb
83
83
  - lib/graphlient/errors.rb
84
- - lib/graphlient/errors/client.rb
84
+ - lib/graphlient/errors/client_error.rb
85
85
  - lib/graphlient/errors/error.rb
86
- - lib/graphlient/errors/graphql.rb
87
- - lib/graphlient/errors/server.rb
86
+ - lib/graphlient/errors/execution_error.rb
87
+ - lib/graphlient/errors/graphql_error.rb
88
+ - lib/graphlient/errors/server_error.rb
88
89
  - lib/graphlient/extensions.rb
89
90
  - lib/graphlient/extensions/query.rb
90
91
  - lib/graphlient/query.rb
@@ -124,8 +125,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
124
125
  version: 1.3.6
125
126
  requirements: []
126
127
  rubyforge_project:
127
- rubygems_version: 2.6.12
128
+ rubygems_version: 2.5.1
128
129
  signing_key:
129
130
  specification_version: 4
130
- summary: Ruby Gem for consuming GraphQL endpoints
131
+ summary: A friendlier Ruby client for consuming GraphQL-based APIs.
131
132
  test_files: []