zendesk2 1.5.11 → 1.5.12

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: 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