namely 0.2.3 → 0.2.4

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: 555f85e223a6cb8657f5c9fda719c37124f5cc52
4
- data.tar.gz: 1a42b8f292cc9301217898da0f7345e4dba49b2a
3
+ metadata.gz: e43ba1385890f1253066c41a14eae2213145d660
4
+ data.tar.gz: f334b88109df6428c2e900755e56b6f3f9dc0435
5
5
  SHA512:
6
- metadata.gz: f30766bb3ecc9e527790e55ac71a58f74d4010dc7ce81d39b2e642bf1178b97d9b5d6254a21179a162f536829884b369c404131a2b3dc21293e3452763d854f0
7
- data.tar.gz: 788d44d719b70ae72b657f8558d9ba1838ea53ca7632644e675aaf430f184be6919aa6fdd89eb8fb7ef9618f5ebaed85acd2734323acdbd54eee5c2c7f52aa01
6
+ metadata.gz: c73def2dc1ee53081c84a174c19a21c2085cb921bcdb20a8ce0eeaf69d336448da68f8a935bb8f77e9ba0d0e4c6d5f42f4b12b8a813d7a89a9d3c2e797ed3fde
7
+ data.tar.gz: 5e98f5d8e6cdb893c84d7a0100886915d398158e48bb392729f8d4de0b456392921dc140168aae242703c962f9642146585d58de929f736de337c0ab9c0a7142
data/README.md CHANGED
@@ -41,6 +41,22 @@ Namely associates a subdomain with your organization. For example, if
41
41
  your account is at `http://your-organization.namely.com/`, your
42
42
  subdomain would be `"your-organization"`.
43
43
 
44
+ ## Configuration
45
+
46
+ You can override default configuration using `Namely.configuration` like:
47
+
48
+ ```Ruby
49
+ Namely.configuration do |config|
50
+
51
+ # While returning paged results, which http codes should be rescued and
52
+ # retried? Defaults to none.
53
+ config.http_codes_to_retry = [504] # gateway timeout
54
+
55
+ # The number of times to retry the requests rescued above. Default is 0
56
+ config.retries = 2
57
+ end
58
+ ```
59
+
44
60
  ## Usage Examples
45
61
 
46
62
  Once you've created a connection you can use it to access your data.
@@ -118,7 +134,7 @@ page of the site.
118
134
  5. Create a new pull request. We'll review it and leave feedback for
119
135
  you ASAP.
120
136
 
121
- [Namely's HTTP API]: http://namely.readme.io/v1/docs
137
+ [Namely's HTTP API]: https://developers.namely.com
122
138
  [thoughtbot's style guide]: https://github.com/thoughtbot/guides/tree/master/style
123
139
  [JSON API standard]: http://jsonapi.org/
124
140
  [dotenv]: https://github.com/bkeepers/dotenv
@@ -2,6 +2,7 @@ require "json"
2
2
  require "ostruct"
3
3
  require "rest_client"
4
4
 
5
+ require "namely/configuration"
5
6
  require "namely/authenticator"
6
7
  require "namely/exceptions"
7
8
  require "namely/resource_gateway"
@@ -0,0 +1,56 @@
1
+ module Namely
2
+ class Configuration
3
+
4
+ # The http codes that should be retried if a request fails while returning
5
+ # a page in paged results. Number of times to retry specified in {#retries}.
6
+ # Defaults to an empty Array.
7
+ #
8
+ # @see #retries
9
+ # @return [Array<Integer>] the http codes to retry for a failed request
10
+ attr_reader :http_codes_to_retry
11
+
12
+ # Specifies the http codes of failed GET requests encountered while paging
13
+ # that should be retried.
14
+ #
15
+ # @param codes [Array<Integer>, Integer] http codes to retry
16
+ def http_codes_to_retry=(codes)
17
+ @http_codes_to_retry = Array(codes).map(&:to_int)
18
+ end
19
+
20
+ # Controls the number of times that a request for a page that failed while
21
+ # returning paged results with one of the http codes listed in
22
+ # {#http_codes_to_retry} will be retried before raising
23
+ # an exception. 0 by default.
24
+ #
25
+ # @return [Integer] number of times to retry request.
26
+ attr_accessor :retries
27
+
28
+ def initialize
29
+ @http_codes_to_retry = []
30
+ @retries = 0
31
+ end
32
+ end
33
+
34
+ # @return [Namely::Configuration] Namely's current configuration
35
+ def self.configuration
36
+ @configuration ||= Configuration.new
37
+ end
38
+
39
+ # Set Namely's configuration
40
+ # @param config [Namely::Configuration]
41
+ def self.configuration=(config)
42
+ @configuration = config
43
+ end
44
+
45
+ # Modify Namely's current configuration
46
+ # @yieldparam [Namely::Configuration] config current Namely config
47
+ # ```
48
+ # Namely.configure do |config|
49
+ # config.retries = 3
50
+ # end
51
+ # ```
52
+ def self.configure
53
+ yield configuration
54
+ end
55
+ end
56
+
@@ -44,7 +44,7 @@ module Namely
44
44
  params = {}
45
45
 
46
46
  loop do
47
- objects = get("/#{endpoint}", params)[resource_name]
47
+ objects = with_retry { get("/#{endpoint}", params)[resource_name] }
48
48
  break if objects.empty?
49
49
 
50
50
  objects.each { |o| y << o }
@@ -73,6 +73,15 @@ module Namely
73
73
  )
74
74
  end
75
75
 
76
+ def with_retry
77
+ retries ||= 0
78
+ yield
79
+ rescue RestClient::Exception => e
80
+ raise unless Namely.configuration.http_codes_to_retry.include?(e.http_code)
81
+ retry if (retries += 1) < Namely.configuration.retries
82
+ raise
83
+ end
84
+
76
85
  def get(path, params = {})
77
86
  params.merge!(access_token: access_token)
78
87
  JSON.parse(RestClient.get(url(path), accept: :json, params: params))
@@ -1,3 +1,3 @@
1
1
  module Namely
2
- VERSION = "0.2.3"
2
+ VERSION = "0.2.4"
3
3
  end
@@ -6,7 +6,7 @@ require "namely/version"
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = "namely"
8
8
  spec.version = Namely::VERSION
9
- spec.authors = ["Namely Integrations Team"]
9
+ spec.authors = ["Namely"]
10
10
  spec.email = ["integrations-dev@namely.com"]
11
11
  spec.summary = "Wraps the Namely HTTP API in lovely Ruby."
12
12
  spec.homepage = "https://github.com/namely/ruby-client"
@@ -0,0 +1,41 @@
1
+ require "spec_helper"
2
+
3
+ describe Namely::Configuration do
4
+
5
+ describe "#http_codes_to_retry" do
6
+ it "is empty array by default" do
7
+ expect(Namely.configuration.http_codes_to_retry).to eq []
8
+ end
9
+
10
+ it "accepts an array of intergers" do
11
+ expected_result = http_codes = [504, 502]
12
+
13
+ Namely.configure { |config| config.http_codes_to_retry = http_codes }
14
+
15
+ expect(Namely.configuration.http_codes_to_retry).to eq expected_result
16
+ end
17
+
18
+ it "accepts a single integer" do
19
+ http_code = 504
20
+ expected_return = [http_code]
21
+
22
+ Namely.configure { |config| config.http_codes_to_retry = http_code }
23
+
24
+ expect(Namely.configuration.http_codes_to_retry).to eq expected_return
25
+ end
26
+ end
27
+
28
+ describe "#retries" do
29
+ it "is 0 by default" do
30
+ expect(Namely.configuration.retries).to eq 0
31
+ end
32
+
33
+ it "accepts an interger representing the number of retries" do
34
+ expected_result = number_of_retries = 3
35
+
36
+ Namely.configure { |config| config.retries = number_of_retries }
37
+
38
+ expect(Namely.configuration.retries).to eq expected_result
39
+ end
40
+ end
41
+ end
@@ -73,6 +73,38 @@ describe Namely::ResourceGateway do
73
73
 
74
74
  expect(ids).to eq(['123-456', '456-789'])
75
75
  end
76
+
77
+ it "retries http failures given the configured codes and number of retries" do
78
+ Namely.configuration.retries = 3
79
+ Namely.configuration.http_codes_to_retry = [504]
80
+
81
+ stub_request(:get, "https://#{subdomain}.namely.com/api/v1/widgets").
82
+ with(query: { access_token: access_token }).to_return(status:504).times(2).
83
+ then.to_return(body: { widgets: [ id: "123-456" ] }.to_json)
84
+
85
+ stub_request(:get, "https://#{subdomain}.namely.com/api/v1/widgets").
86
+ with(query: { access_token: access_token, after: "123-456" }).
87
+ to_return(body: { widgets: [ id: "456-789" ] }.to_json)
88
+
89
+ stub_request(:get, "https://#{subdomain}.namely.com/api/v1/widgets").
90
+ with(query: { access_token: access_token, after: "456-789" }).
91
+ to_return(body: { widgets: [ ] }.to_json)
92
+
93
+ ids = gateway.json_index.map { |h| h['id'] }
94
+
95
+ expect(ids).to eq(['123-456', '456-789'])
96
+ end
97
+
98
+ it "raises an exception if exceeds configured retry number" do
99
+ Namely.configuration.retries = 3
100
+ Namely.configuration.http_codes_to_retry = [504]
101
+
102
+ stub_request(:get, "https://#{subdomain}.namely.com/api/v1/widgets").
103
+ with(query: { access_token: access_token }).to_return(status: 504)
104
+
105
+ expect { gateway.json_index.map { |h| h['id'] } }.
106
+ to raise_error(RestClient::GatewayTimeout)
107
+ end
76
108
  end
77
109
  end
78
110
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: namely
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.2.4
5
5
  platform: ruby
6
6
  authors:
7
- - Namely Integrations Team
7
+ - Namely
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-01-13 00:00:00.000000000 Z
11
+ date: 2018-01-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rest-client
@@ -143,6 +143,7 @@ files:
143
143
  - lib/namely.rb
144
144
  - lib/namely/authenticator.rb
145
145
  - lib/namely/collection.rb
146
+ - lib/namely/configuration.rb
146
147
  - lib/namely/connection.rb
147
148
  - lib/namely/exceptions.rb
148
149
  - lib/namely/model.rb
@@ -182,6 +183,7 @@ files:
182
183
  - spec/fixtures/vcr_cassettes/token.yml
183
184
  - spec/fixtures/vcr_cassettes/token_refresh.yml
184
185
  - spec/namely/authenticator_spec.rb
186
+ - spec/namely/configuration_spec.rb
185
187
  - spec/namely/connection_spec.rb
186
188
  - spec/namely/integration_spec.rb
187
189
  - spec/namely/resource_gateway_spec.rb
@@ -210,7 +212,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
210
212
  version: '0'
211
213
  requirements: []
212
214
  rubyforge_project:
213
- rubygems_version: 2.6.8
215
+ rubygems_version: 2.6.13
214
216
  signing_key:
215
217
  specification_version: 4
216
218
  summary: Wraps the Namely HTTP API in lovely Ruby.
@@ -248,6 +250,7 @@ test_files:
248
250
  - spec/fixtures/vcr_cassettes/token.yml
249
251
  - spec/fixtures/vcr_cassettes/token_refresh.yml
250
252
  - spec/namely/authenticator_spec.rb
253
+ - spec/namely/configuration_spec.rb
251
254
  - spec/namely/connection_spec.rb
252
255
  - spec/namely/integration_spec.rb
253
256
  - spec/namely/resource_gateway_spec.rb