gqli 1.0.0 → 1.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
  SHA256:
3
- metadata.gz: 4c9f840730460f908984a50b340a0ee135402b23e97ea75050bcf6b2a43a09d1
4
- data.tar.gz: 721fb95788b07a4982993b7068852c450061fb038156f5bca92665ae5b9e93bb
3
+ metadata.gz: b4315f21be8d0b00907f0310acc1a17f300dd9157874bf09c75e577ef3b7fb95
4
+ data.tar.gz: e51cda712da56a947079aa807610bf0979352d3b2e3c2ed28eba337051df85d3
5
5
  SHA512:
6
- metadata.gz: 2b25dc59880d1f0be794b5dad8ef7c437a6385c07bd14fe2b2a37f90ac43f1517fb56cb5fe53874e38075fe5decc17516be9ec55e09dd5cd1ad5dccd8bece681
7
- data.tar.gz: 69f52628ea77db04ecc4e5f20fbe62bfe6cfd9df5c3efd2eac1ab6abd1e87927e1d120ed3b5094d1180d3d379570d639782a299e7a04ae7f7b58cd62aa1ff3f2
6
+ metadata.gz: 71560b1443fc3487f6de643950683b1a5b635cc35f3431d4af36379a29bee58308f20a19037e484065fc43790071574d62068c38c960268b2a55eb37232b8617
7
+ data.tar.gz: 2d94bff9408e828967ee3b7e20f980a59dc536f4a579675fa8d909149fd908fa8a55d2f2b7022552afc3e3ac644c5472003bedcb21249b6b959add3b2257269f
data/CHANGELOG.md CHANGED
@@ -2,6 +2,10 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## v1.1.0
6
+ * Added support for timeout management. [#11](https://github.com/contentful-labs/gqli.rb/pull/11)
7
+ * Added support for error response handling. [#13](https://github.com/contentful-labs/gqli.rb/pull/13)
8
+
5
9
  ## v1.0.0
6
10
  ### Added
7
11
  * Added support for Mutations.
data/lib/gqli/client.rb CHANGED
@@ -9,13 +9,17 @@ require_relative './version'
9
9
  module GQLi
10
10
  # GraphQL HTTP Client
11
11
  class Client
12
- attr_reader :url, :params, :headers, :validate_query, :schema
12
+ attr_reader :url, :params, :headers, :validate_query, :schema, :options
13
13
 
14
- def initialize(url, params: {}, headers: {}, validate_query: true)
14
+ def initialize(url, params: {}, headers: {}, validate_query: true, options: {})
15
15
  @url = url
16
16
  @params = params
17
17
  @headers = headers
18
18
  @validate_query = validate_query
19
+ @options = options
20
+ @options[:read_timeout] ||= 60
21
+ @options[:write_timeout] ||= 60
22
+ @options[:connect_timeout] ||= 60
19
23
 
20
24
  @schema = Introspection.new(self) if validate_query
21
25
  end
@@ -34,13 +38,15 @@ module GQLi
34
38
  # Executres a query
35
39
  # Ignores validations
36
40
  def execute!(query)
37
- http_response = HTTP.headers(request_headers).post(@url, params: @params, json: { query: query.to_gql })
41
+ http_response = request.post(@url, params: @params, json: { query: query.to_gql })
38
42
 
39
43
  fail "Error: #{http_response.reason}\nBody: #{http_response.body}" if http_response.status >= 300
40
44
 
41
- data = JSON.parse(http_response.to_s)['data']
45
+ parsed_response = JSON.parse(http_response.to_s)
46
+ data = parsed_response['data']
47
+ errors = parsed_response['errors']
42
48
 
43
- Response.new(data, query)
49
+ Response.new(data, errors, query)
44
50
  end
45
51
 
46
52
  # Validates a query against the schema
@@ -50,6 +56,10 @@ module GQLi
50
56
  schema.valid?(query)
51
57
  end
52
58
 
59
+ def request
60
+ HTTP.headers(request_headers).timeout(timeout_options)
61
+ end
62
+
53
63
  protected
54
64
 
55
65
  def validation_error_message(validation)
@@ -67,5 +77,13 @@ module GQLi
67
77
  user_agent: "gqli.rb/#{VERSION}; http.rb/#{HTTP::VERSION}"
68
78
  }.merge(@headers)
69
79
  end
80
+
81
+ def timeout_options
82
+ {
83
+ write: options[:write_timeout],
84
+ connect: options[:connect_timeout],
85
+ read: options[:read_timeout]
86
+ }
87
+ end
70
88
  end
71
89
  end
@@ -4,7 +4,7 @@ module GQLi
4
4
  # Module for creating a Contentful GraphQL client
5
5
  module Contentful
6
6
  # Creates a Contentful GraphQL client
7
- def self.create(space, access_token, environment: nil, validate_query: true)
7
+ def self.create(space, access_token, environment: nil, validate_query: true, options: {})
8
8
  api_url = "https://graphql.contentful.com/content/v1/spaces/#{space}"
9
9
  api_url += "/environments/#{environment}" unless environment.nil?
10
10
 
@@ -13,7 +13,8 @@ module GQLi
13
13
  headers: {
14
14
  'Authorization' => "Bearer #{access_token}"
15
15
  },
16
- validate_query: validate_query
16
+ validate_query: validate_query,
17
+ options: options
17
18
  )
18
19
  end
19
20
  end
data/lib/gqli/response.rb CHANGED
@@ -5,11 +5,24 @@ require 'hashie/mash'
5
5
  module GQLi
6
6
  # Response object wrapper
7
7
  class Response
8
- attr_reader :data, :query
8
+ attr_reader :data, :errors, :query
9
9
 
10
- def initialize(data, query)
10
+ def initialize(data, errors, query)
11
11
  @data = Hashie::Mash.new(data)
12
+ @errors = parse_errors(errors)
12
13
  @query = query
13
14
  end
15
+
16
+ private
17
+
18
+ # Accepts Hash or Array of errors and converts them to Hashie::Mash instances.
19
+ # Recursively calls #parse_errors with items if array.
20
+ # Returns nil if nil is passed.
21
+ def parse_errors(errors)
22
+ return unless errors
23
+ return errors.map { |e| parse_errors(e) } if errors.is_a?(Array)
24
+
25
+ Hashie::Mash.new(errors)
26
+ end
14
27
  end
15
28
  end
data/lib/gqli/version.rb CHANGED
@@ -3,5 +3,5 @@
3
3
  # GraphQL Client and DSL library
4
4
  module GQLi
5
5
  # Gem version
6
- VERSION = '1.0.0'
6
+ VERSION = '1.1.0'
7
7
  end
@@ -3,6 +3,8 @@ require 'spec_helper'
3
3
  describe GQLi::Client do
4
4
  let(:space_id) { 'cfexampleapi' }
5
5
  let(:token) { 'b4c0n73n7fu1' }
6
+ let(:default_timeout) { 60 }
7
+ let(:timeout) { 10 }
6
8
 
7
9
  let(:client) do
8
10
  vcr('client') {
@@ -20,6 +22,21 @@ describe GQLi::Client do
20
22
  }
21
23
  end
22
24
 
25
+ let(:client_with_timeout) do
26
+ vcr('client') {
27
+ GQLi::Contentful.create(
28
+ space_id,
29
+ token,
30
+ validate_query: false,
31
+ options: {
32
+ connect_timeout: timeout,
33
+ read_timeout: timeout,
34
+ write_timeout: timeout
35
+ }
36
+ )
37
+ }
38
+ end
39
+
23
40
  let(:dsl) { GQLi::DSL }
24
41
 
25
42
  describe 'default clients' do
@@ -118,4 +135,40 @@ describe GQLi::Client do
118
135
  }
119
136
  end
120
137
  end
138
+
139
+ context 'without timeout options' do
140
+ subject { client }
141
+
142
+ it 'upon instantiation sets default timeout value' do
143
+ expect(subject.options[:read_timeout]).to eq(default_timeout)
144
+ expect(subject.options[:connect_timeout]).to eq(default_timeout)
145
+ expect(subject.options[:write_timeout]).to eq(default_timeout)
146
+ end
147
+
148
+ it 'when executing a request sets default timeout value' do
149
+ expect(subject.request.default_options.timeout_options[:read_timeout]).to eq(default_timeout)
150
+ expect(subject.request.default_options.timeout_options[:connect_timeout]).to eq(default_timeout)
151
+ expect(subject.request.default_options.timeout_options[:write_timeout]).to eq(default_timeout)
152
+ end
153
+ end
154
+
155
+ context 'with timeout options' do
156
+ subject { client_with_timeout }
157
+
158
+ it 'contentful client' do
159
+ expect(subject).to be_a(GQLi::Client)
160
+ end
161
+
162
+ it 'upon instantiation sets provided timeout value' do
163
+ expect(subject.options[:read_timeout]).to eq(timeout)
164
+ expect(subject.options[:connect_timeout]).to eq(timeout)
165
+ expect(subject.options[:write_timeout]).to eq(timeout)
166
+ end
167
+
168
+ it 'when executing a request sets provided timeout value' do
169
+ expect(subject.request.default_options.timeout_options[:read_timeout]).to eq(timeout)
170
+ expect(subject.request.default_options.timeout_options[:connect_timeout]).to eq(timeout)
171
+ expect(subject.request.default_options.timeout_options[:write_timeout]).to eq(timeout)
172
+ end
173
+ end
121
174
  end
@@ -0,0 +1,51 @@
1
+ require 'spec_helper'
2
+
3
+ describe GQLi::Response do
4
+ let(:errors) { nil }
5
+ let(:data) { {"testkey" => "test val"} }
6
+ let(:query) { double(:query) }
7
+ subject { described_class.new(data, errors, query) }
8
+
9
+ describe "#data" do
10
+ it "returns correct data Hashie" do
11
+ expect(subject.data).to be_kind_of(Hashie::Mash)
12
+ expect(subject.data.testkey).to eq(data["testkey"])
13
+ end
14
+ end
15
+
16
+ describe "#query" do
17
+ it "returns correct query" do
18
+ expect(subject.query).to eq(query)
19
+ end
20
+ end
21
+
22
+ describe "#errors" do
23
+ context "array errors" do
24
+ let(:errors) { [{"message" => "this is an error"}] }
25
+
26
+ it "converts errors to correct Hashie instances" do
27
+ expect(subject.errors).to be_kind_of(Array)
28
+ expect(subject.errors.length).to eq(1)
29
+ expect(subject.errors.first).to be_kind_of(Hashie::Mash)
30
+ expect(subject.errors.first.message).to eq(errors.first["message"])
31
+ end
32
+ end
33
+
34
+ context "hash errors" do
35
+ let(:errors) { {"message" => "this is an error"} }
36
+
37
+ it "converts errors to correct Hashie instances" do
38
+ expect(subject.errors).to be_kind_of(Hashie::Mash)
39
+ expect(subject.errors.message).to eq(errors["message"])
40
+ end
41
+ end
42
+
43
+ context "nil errors" do
44
+ it "does not raise error and returns nil" do
45
+ expect(subject.errors).to be(nil)
46
+ end
47
+ end
48
+
49
+ end
50
+
51
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gqli
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Contentful GmbH (David Litvak Bruno)
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-05-03 00:00:00.000000000 Z
11
+ date: 2021-06-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: http
@@ -349,6 +349,7 @@ files:
349
349
  - spec/lib/gqli/client_spec.rb
350
350
  - spec/lib/gqli/dsl_spec.rb
351
351
  - spec/lib/gqli/introspection_spec.rb
352
+ - spec/lib/gqli/response_spec.rb
352
353
  - spec/spec_helper.rb
353
354
  - usage.rb
354
355
  - usage_introspection.rb
@@ -357,7 +358,7 @@ homepage: https://github.com/contentful-labs/gqli.rb
357
358
  licenses:
358
359
  - MIT
359
360
  metadata: {}
360
- post_install_message:
361
+ post_install_message:
361
362
  rdoc_options: []
362
363
  require_paths:
363
364
  - lib
@@ -373,7 +374,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
373
374
  version: '0'
374
375
  requirements: []
375
376
  rubygems_version: 3.0.3
376
- signing_key:
377
+ signing_key:
377
378
  specification_version: 4
378
379
  summary: GraphQL client for humans
379
380
  test_files:
@@ -384,4 +385,5 @@ test_files:
384
385
  - spec/lib/gqli/client_spec.rb
385
386
  - spec/lib/gqli/dsl_spec.rb
386
387
  - spec/lib/gqli/introspection_spec.rb
388
+ - spec/lib/gqli/response_spec.rb
387
389
  - spec/spec_helper.rb