zendesk2 1.5.11 → 1.5.12

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: d3fcbdbdb4b58bb78f1860e9674718eca73bb298
4
- data.tar.gz: 6b69e843cb4cafd7dd347ee2e1158c40c5f27548
3
+ metadata.gz: 2704a7e73413c045698c7d7c28204609d114bcf6
4
+ data.tar.gz: 875403304d611be75c6d2e33ee0611e6d2e026c5
5
5
  SHA512:
6
- metadata.gz: f4c24ea86731f7cdd3e02d50d784fdb33da1977c89d4d823a7e3c3044d649b376e8829e385489e5cb84e4324c09759b7d8539f647fed14b7e5aa92737e3e0614
7
- data.tar.gz: 27b45d88a7854e86f1999ace2a1b01b9d54d4a9ae1df5374611284fbdbd3d6e8cf8c8cd00ae784b4709becdb99b531378674b519dd97aac1737e89b3ece5b09d
6
+ metadata.gz: 0ec9a8b932f31698c6b09a81e197ae80593302f1444fa12b2f5f83d440d827eb4d3c125d5c74160d1a6b7593e2c6c2e0d5958bea893f1c64d53780e108550a1e
7
+ data.tar.gz: 7bd85661df9a778aecd039da44763b0fc0c2d616b23a46b4d6462946bc5b5fd49a5b1eeda71dcd7c6b9e99ae59858ab9eb573d7b48d835f9c20bf9209918313d
data/Gemfile CHANGED
@@ -16,4 +16,5 @@ group :test do
16
16
  gem 'guard-bundler', require: false
17
17
  gem 'guard-rspec', '~> 4.3', require: false
18
18
  gem 'rspec', '~> 3.2'
19
+ gem 'rack-test'
19
20
  end
@@ -24,18 +24,28 @@ class Zendesk2::Client < Cistern::Service
24
24
  raise "Missing required options: :username" unless @username
25
25
  raise "Missing required options: :password or :token" unless password || @token
26
26
 
27
- @service = Faraday.new({url: @url}.merge(service_options)) do |builder|
27
+ @service = Faraday.new({url: @url}.merge(service_options)) do |connection|
28
28
  # response
29
- builder.use Faraday::Request::BasicAuthentication, @username, @auth_token
30
- builder.use Faraday::Response::RaiseError
31
- builder.response :json, content_type: /\bjson/
29
+ connection.use Faraday::Request::BasicAuthentication, @username, @auth_token
30
+ connection.use Faraday::Response::RaiseError
31
+ connection.response :json, content_type: /\bjson/
32
32
 
33
33
  # request
34
- builder.request :multipart
35
- builder.request :json
34
+ connection.request :multipart
35
+ connection.request :json
36
36
 
37
- builder.use Zendesk2::Logger, @logger
38
- builder.adapter adapter
37
+ # idempotency
38
+ connection.request :retry,
39
+ :max => 30,
40
+ :interval => 1,
41
+ :interval_randomness => 0.2,
42
+ :backoff_factor => 2
43
+
44
+ # rate limit
45
+ connection.use Zendesk2::RateLimit, logger: @logger
46
+
47
+ connection.use Zendesk2::Logger, @logger
48
+ connection.adapter(*adapter)
39
49
  end
40
50
  end
41
51
 
@@ -0,0 +1,36 @@
1
+ require "logger"
2
+
3
+ module Zendesk2
4
+ class RateLimit
5
+
6
+ attr_reader :logger
7
+
8
+ def initialize(app, options={})
9
+ @app = app
10
+ @logger = options[:logger] || ::Logger.new(nil)
11
+ end
12
+
13
+ def call(env)
14
+ original_env = env.dup
15
+ response = @app.call(env)
16
+
17
+ if response.env[:status] == 429
18
+ delay = (response.env[:response_headers][:retry_after]).to_f
19
+ logger.warn "Rate limited! Retrying after #{delay} seconds."
20
+
21
+ sleep(delay)
22
+
23
+ call(original_env).tap { |r| increment(r, delay) }
24
+ else
25
+ response
26
+ end
27
+ end
28
+
29
+ private
30
+
31
+ def increment(response, delay)
32
+ existing_delay = response.headers[:rate_limits] || 0.0
33
+ response.headers[:rate_limits] = existing_delay.to_f + delay.to_f
34
+ end
35
+ end
36
+ end
@@ -1,3 +1,3 @@
1
1
  module Zendesk2
2
- VERSION = "1.5.11"
2
+ VERSION = "1.5.12"
3
3
  end
data/lib/zendesk2.rb CHANGED
@@ -38,5 +38,6 @@ require 'zendesk2/error'
38
38
  require 'zendesk2/searchable'
39
39
  require 'zendesk2/logger'
40
40
  require 'zendesk2/paged_collection'
41
+ require 'zendesk2/rate_limit'
41
42
 
42
43
  require 'zendesk2/client'
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe Zendesk2::RateLimit do
4
+ class Puppet
5
+ def self.add_response(response)
6
+ self.responses.unshift(response)
7
+ end
8
+
9
+ def self.responses
10
+ @responses ||= []
11
+ end
12
+
13
+ def self.call(env)
14
+ self.responses.shift || raise("not response set")
15
+ end
16
+ end
17
+
18
+ it "should delay requests for the specified time" do
19
+ client = Faraday.new do |connection|
20
+ connection.use Zendesk2::RateLimit
21
+ connection.adapter :rack, Puppet
22
+ end
23
+
24
+ Puppet.responses << [429, {"Retry-After" => 0.1}, []]
25
+ Puppet.responses << [429, {"Retry-After" => 0.2}, []]
26
+ Puppet.responses << [200, {}, ["something"]]
27
+
28
+ response = client.get("/")
29
+
30
+ expect(response.status).to eq(200)
31
+ expect(response.headers[:rate_limits].to_s).to match(/^0\.3/) # ugh float math
32
+ end
33
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zendesk2
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.11
4
+ version: 1.5.12
5
5
  platform: ruby
6
6
  authors:
7
7
  - Josh Lane
@@ -231,6 +231,7 @@ files:
231
231
  - lib/zendesk2/error.rb
232
232
  - lib/zendesk2/logger.rb
233
233
  - lib/zendesk2/paged_collection.rb
234
+ - lib/zendesk2/rate_limit.rb
234
235
  - lib/zendesk2/searchable.rb
235
236
  - lib/zendesk2/version.rb
236
237
  - spec/categories_spec.rb
@@ -240,6 +241,7 @@ files:
240
241
  - spec/help_center/categories_spec.rb
241
242
  - spec/help_center/sections_spec.rb
242
243
  - spec/lib/paged_collection_spec.rb
244
+ - spec/lib/rate_limit_spec.rb
243
245
  - spec/memberships_spec.rb
244
246
  - spec/organizations_spec.rb
245
247
  - spec/shared/zendesk_resource.rb
@@ -286,6 +288,7 @@ test_files:
286
288
  - spec/help_center/categories_spec.rb
287
289
  - spec/help_center/sections_spec.rb
288
290
  - spec/lib/paged_collection_spec.rb
291
+ - spec/lib/rate_limit_spec.rb
289
292
  - spec/memberships_spec.rb
290
293
  - spec/organizations_spec.rb
291
294
  - spec/shared/zendesk_resource.rb