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 +4 -4
- data/Gemfile +1 -0
- data/lib/zendesk2/client/real.rb +18 -8
- data/lib/zendesk2/rate_limit.rb +36 -0
- data/lib/zendesk2/version.rb +1 -1
- data/lib/zendesk2.rb +1 -0
- data/spec/lib/rate_limit_spec.rb +33 -0
- metadata +4 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2704a7e73413c045698c7d7c28204609d114bcf6
|
4
|
+
data.tar.gz: 875403304d611be75c6d2e33ee0611e6d2e026c5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0ec9a8b932f31698c6b09a81e197ae80593302f1444fa12b2f5f83d440d827eb4d3c125d5c74160d1a6b7593e2c6c2e0d5958bea893f1c64d53780e108550a1e
|
7
|
+
data.tar.gz: 7bd85661df9a778aecd039da44763b0fc0c2d616b23a46b4d6462946bc5b5fd49a5b1eeda71dcd7c6b9e99ae59858ab9eb573d7b48d835f9c20bf9209918313d
|
data/Gemfile
CHANGED
data/lib/zendesk2/client/real.rb
CHANGED
@@ -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 |
|
27
|
+
@service = Faraday.new({url: @url}.merge(service_options)) do |connection|
|
28
28
|
# response
|
29
|
-
|
30
|
-
|
31
|
-
|
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
|
-
|
35
|
-
|
34
|
+
connection.request :multipart
|
35
|
+
connection.request :json
|
36
36
|
|
37
|
-
|
38
|
-
|
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
|
data/lib/zendesk2/version.rb
CHANGED
data/lib/zendesk2.rb
CHANGED
@@ -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.
|
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
|