sidekiq-rate-limiter 0.1.0 → 0.1.1
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 +13 -5
- data/.gitignore +4 -0
- data/.simplecov +4 -10
- data/.travis.yml +18 -2
- data/Gemfile +1 -1
- data/README.md +5 -2
- data/gemfiles/sidekiq_2.gemfile +5 -0
- data/gemfiles/sidekiq_3.gemfile +5 -0
- data/gemfiles/sidekiq_4.gemfile +5 -0
- data/lib/sidekiq-rate-limiter/fetch.rb +4 -3
- data/lib/sidekiq-rate-limiter/version.rb +1 -1
- data/sidekiq-rate-limiter.gemspec +5 -5
- data/spec/sidekiq-rate-limiter/fetch_spec.rb +27 -17
- data/spec/sidekiq-rate-limiter/server_spec.rb +4 -4
- data/spec/spec_helper.rb +3 -6
- metadata +36 -36
checksums.yaml
CHANGED
@@ -1,7 +1,15 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
NzYyZTNjZTE0YjQzMjQzNzMzZWJlOWU3Y2VkY2ZhNmVlYzQxZTQ1Ng==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
ZjA1MjIyNzEzNzU0NWRkMzMxMzE2YWJkZWZiODM5YmY3MTM2MzY4Yg==
|
5
7
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
MzdmZTI5NThhY2VhY2MxNmFlMTg5NGUwNjFjM2ZkZjA3ZDQ5NjQ4NTY0MTA2
|
10
|
+
MTc0YTEwMDFjODA1Y2Y2MDBmNDQwNGM1MTc5OTE3ZmRiNWQzN2E2ZjBiMGEw
|
11
|
+
NDQ1MzA3NTQ1MjdmYjdkMjA4OTY5OGM0NjU4OWMwNDA4MDkzNGI=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
ZWZlNzNhOTg0MzRkZmYyYWYzM2U2ZDhlMzgwMjQ0MmJlNjQ5NzdkOTMwNWNh
|
14
|
+
NmMyOTBmNTMwNzQ4NWUwZmRmOWY3NmNhM2E5ZjMzNmZiMmQyYWNhMmE4YmQ3
|
15
|
+
YjNjYjMxNDRmZGFkZWIxOTgxNWVjYmEzOGZkOWNlYmVlZjVjNDQ=
|
data/.gitignore
CHANGED
data/.simplecov
CHANGED
@@ -1,12 +1,6 @@
|
|
1
|
-
|
2
|
-
require 'simplecov-rcov'
|
1
|
+
require 'coveralls'
|
3
2
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
SimpleCov::Formatter::RcovFormatter.new.format(result)
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
SimpleCov.formatter = SimpleCov::Formatter::MergedFormatter
|
3
|
+
Coveralls.wear! do
|
4
|
+
add_filter "vendor"
|
5
|
+
add_filter "spec"
|
12
6
|
end
|
data/.travis.yml
CHANGED
@@ -1,4 +1,20 @@
|
|
1
1
|
language: ruby
|
2
|
+
cache: bundler
|
3
|
+
sudo: false
|
2
4
|
rvm:
|
3
|
-
- 2.
|
4
|
-
-
|
5
|
+
- 2.3.0
|
6
|
+
- 2.2.4
|
7
|
+
- 2.1.8
|
8
|
+
|
9
|
+
gemfile:
|
10
|
+
- 'gemfiles/sidekiq_2.gemfile'
|
11
|
+
- 'gemfiles/sidekiq_3.gemfile'
|
12
|
+
- 'gemfiles/sidekiq_4.gemfile'
|
13
|
+
|
14
|
+
deploy:
|
15
|
+
provider: rubygems
|
16
|
+
api_key:
|
17
|
+
secure: "VX48kpd9UySMWSDMwjxaNZy14RW1usU7eFLGNeohjCzxUsCywn+mS5/IZHl56vDXWJp7JwnboDiIa74hGV86PcSEM7kr+DAZO33iCazMNTpoWDiH1iJfj0jZbO2rOvx0rGI9fGYcC9xfyKQ37hVb13Eo0bnKa0YX30HArnx7EFo="
|
18
|
+
on:
|
19
|
+
tags: true
|
20
|
+
all_branches: true
|
data/Gemfile
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
source "
|
1
|
+
source "https://rubygems.org"
|
2
2
|
gemspec
|
data/README.md
CHANGED
@@ -1,13 +1,16 @@
|
|
1
1
|
sidekiq-rate-limiter
|
2
2
|
====================
|
3
3
|
|
4
|
-
[](https://rubygems.org/gems/sidekiq-rate-limiter)
|
5
|
+
[](http://travis-ci.org/enova/sidekiq-rate-limiter)
|
6
|
+
[](https://coveralls.io/github/enova/sidekiq-rate-limiter?branch=master)
|
7
|
+
[](https://gemnasium.com/enova/sidekiq-rate-limiter)
|
5
8
|
|
6
9
|
Redis-backed, per-worker rate limits for job processing.
|
7
10
|
|
8
11
|
## Compatibility
|
9
12
|
|
10
|
-
sidekiq-rate-limiter is actively tested against MRI versions 2.
|
13
|
+
sidekiq-rate-limiter is actively tested against MRI versions 2.1, 2.2, and 2.3.
|
11
14
|
|
12
15
|
sidekiq-rate-limiter works by using a custom fetch class, the class responsible
|
13
16
|
for pulling work from the queue stored in redis. Consequently you'll want to be
|
@@ -1,4 +1,5 @@
|
|
1
|
-
require '
|
1
|
+
require 'sidekiq'
|
2
|
+
require 'celluloid' if Sidekiq::VERSION < "4"
|
2
3
|
require 'sidekiq/fetch'
|
3
4
|
require 'redis_rate_limiter'
|
4
5
|
|
@@ -12,7 +13,7 @@ module Sidekiq::RateLimiter
|
|
12
13
|
end
|
13
14
|
|
14
15
|
def limit(work)
|
15
|
-
message = JSON.parse(work.message) rescue {}
|
16
|
+
message = JSON.parse(work.respond_to?(:message) ? work.message : work.job) rescue {}
|
16
17
|
|
17
18
|
args = message['args']
|
18
19
|
klass = message['class']
|
@@ -33,7 +34,7 @@ module Sidekiq::RateLimiter
|
|
33
34
|
Sidekiq.redis do |conn|
|
34
35
|
lim = Limit.new(conn, options)
|
35
36
|
if lim.exceeded?(klass)
|
36
|
-
conn.lpush("queue:#{work.queue_name}", work.message)
|
37
|
+
conn.lpush("queue:#{work.queue_name}", work.respond_to?(:message) ? work.message : work.job)
|
37
38
|
nil
|
38
39
|
else
|
39
40
|
lim.add(klass)
|
@@ -8,7 +8,7 @@ Gem::Specification.new do |s|
|
|
8
8
|
s.license = 'MIT'
|
9
9
|
s.version = Sidekiq::RateLimiter::VERSION
|
10
10
|
s.platform = Gem::Platform::RUBY
|
11
|
-
s.authors = ["Blake Thomas", "Enova"]
|
11
|
+
s.authors = ["Docady", "Blake Thomas", "Enova"]
|
12
12
|
s.email = ["bwthomas@gmail.com"]
|
13
13
|
s.homepage = "https://github.com/enova/sidekiq-rate-limiter"
|
14
14
|
s.summary = %q{Redis-backed, per-worker rate limits for job processing}
|
@@ -21,12 +21,12 @@ Gem::Specification.new do |s|
|
|
21
21
|
s.require_paths = ["lib"]
|
22
22
|
|
23
23
|
s.add_development_dependency "pry"
|
24
|
+
s.add_development_dependency "pry-byebug"
|
24
25
|
s.add_development_dependency "rake"
|
25
|
-
s.add_development_dependency "rspec"
|
26
|
-
s.add_development_dependency "
|
27
|
-
s.add_development_dependency "simplecov-rcov"
|
26
|
+
s.add_development_dependency "rspec", '~> 3.4'
|
27
|
+
s.add_development_dependency "coveralls", '~> 0.8'
|
28
28
|
|
29
29
|
s.add_dependency "redis"
|
30
|
-
s.add_dependency "sidekiq", ">= 2.0", "<
|
30
|
+
s.add_dependency "sidekiq", ">= 2.0", "< 5.0"
|
31
31
|
s.add_dependency "redis_rate_limiter"
|
32
32
|
end
|
@@ -2,7 +2,7 @@ require 'spec_helper'
|
|
2
2
|
require 'sidekiq'
|
3
3
|
require 'sidekiq/api'
|
4
4
|
|
5
|
-
describe Sidekiq::RateLimiter::Fetch do
|
5
|
+
RSpec.describe Sidekiq::RateLimiter::Fetch do
|
6
6
|
before(:all) do
|
7
7
|
class Job
|
8
8
|
include Sidekiq::Worker
|
@@ -36,48 +36,58 @@ describe Sidekiq::RateLimiter::Fetch do
|
|
36
36
|
let(:redis_class) { Sidekiq.redis { |conn| conn.class } }
|
37
37
|
|
38
38
|
it 'should inherit from Sidekiq::BasicFetch' do
|
39
|
-
described_class.
|
39
|
+
expect(described_class).to be < Sidekiq::BasicFetch
|
40
40
|
end
|
41
41
|
|
42
42
|
it 'should retrieve work with strict setting' do
|
43
|
+
timeout =
|
44
|
+
if defined? Sidekiq::BasicFetch::TIMEOUT
|
45
|
+
Sidekiq::BasicFetch::TIMEOUT
|
46
|
+
else
|
47
|
+
Sidekiq::Fetcher::TIMEOUT
|
48
|
+
end
|
49
|
+
|
43
50
|
fetch = described_class.new options.merge(:strict => true)
|
44
|
-
fetch.queues_cmd.
|
51
|
+
expect(fetch.queues_cmd).to eql(["queue:#{queue}", "queue:#{another_queue}", timeout])
|
45
52
|
end
|
46
53
|
|
47
54
|
it 'should retrieve work', queuing: true do
|
48
55
|
worker.perform_async(*args)
|
49
|
-
fetch
|
56
|
+
fetch = described_class.new(options)
|
50
57
|
work = fetch.retrieve_work
|
51
|
-
parsed = JSON.parse(work.message)
|
58
|
+
parsed = JSON.parse(work.respond_to?(:message) ? work.message : work.job)
|
52
59
|
|
53
|
-
work.
|
54
|
-
work.queue_name.
|
55
|
-
work.acknowledge.
|
60
|
+
expect(work).not_to be_nil
|
61
|
+
expect(work.queue_name).to eql(queue)
|
62
|
+
expect(work.acknowledge).to be_nil
|
56
63
|
|
57
|
-
parsed.
|
58
|
-
parsed.
|
59
|
-
parsed.
|
64
|
+
expect(parsed).to include(worker.get_sidekiq_options)
|
65
|
+
expect(parsed).to include("class" => worker.to_s, "args" => args)
|
66
|
+
expect(parsed).to include("jid", "enqueued_at")
|
60
67
|
|
61
68
|
q = Sidekiq::Queue.new(queue)
|
62
|
-
q.size.
|
69
|
+
expect(q.size).to eq 0
|
63
70
|
end
|
64
71
|
|
65
72
|
it 'should place rate-limited work at the back of the queue', queuing: true do
|
66
73
|
worker.perform_async(*args)
|
67
|
-
Sidekiq::RateLimiter::Limit.
|
68
|
-
redis_class.
|
74
|
+
expect_any_instance_of(Sidekiq::RateLimiter::Limit).to receive(:exceeded?).and_return(true)
|
75
|
+
expect_any_instance_of(redis_class).to receive(:lpush).exactly(:once).and_call_original
|
69
76
|
|
70
77
|
fetch = described_class.new(options)
|
71
|
-
fetch.retrieve_work.
|
78
|
+
expect(fetch.retrieve_work).to be_nil
|
72
79
|
|
73
80
|
q = Sidekiq::Queue.new(queue)
|
74
|
-
q.size.
|
81
|
+
expect(q.size).to eq 1
|
75
82
|
end
|
76
83
|
|
77
84
|
it 'should accept procs for limit, name, and period config keys', queuing: true do
|
78
85
|
proc_worker.perform_async(1,2)
|
79
86
|
|
80
|
-
Sidekiq::RateLimiter::Limit
|
87
|
+
expect(Sidekiq::RateLimiter::Limit).
|
88
|
+
to receive(:new).
|
89
|
+
with(anything(), {:limit => 2, :interval => 2, :name => "2"}).
|
90
|
+
and_call_original
|
81
91
|
|
82
92
|
fetch = described_class.new(options)
|
83
93
|
work = fetch.retrieve_work
|
@@ -1,20 +1,20 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe Sidekiq::RateLimiter, 'server configuration' do
|
3
|
+
RSpec.describe Sidekiq::RateLimiter, 'server configuration' do
|
4
4
|
before do
|
5
|
-
Sidekiq.
|
5
|
+
allow(Sidekiq).to receive(:server?).and_return true
|
6
6
|
require 'sidekiq-rate-limiter/server'
|
7
7
|
end
|
8
8
|
|
9
9
|
it 'should set Sidekiq.options[:fetch] as desired' do
|
10
10
|
Sidekiq.configure_server do |config|
|
11
|
-
Sidekiq.options[:fetch].
|
11
|
+
expect(Sidekiq.options[:fetch]).to eql(Sidekiq::RateLimiter::Fetch)
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
15
|
it 'should inherit from Sidekiq::BasicFetch' do
|
16
16
|
Sidekiq.configure_server do |config|
|
17
|
-
Sidekiq.options[:fetch].
|
17
|
+
expect(Sidekiq.options[:fetch]).to be < Sidekiq::BasicFetch
|
18
18
|
end
|
19
19
|
end
|
20
20
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -45,19 +45,16 @@ Sidekiq.configure_server do |config|
|
|
45
45
|
end
|
46
46
|
##
|
47
47
|
|
48
|
-
## Configuring simplecov
|
49
48
|
require 'simplecov'
|
50
49
|
|
51
|
-
SimpleCov.start do
|
52
|
-
add_filter "vendor"
|
53
|
-
add_filter "spec"
|
54
|
-
end
|
55
|
-
|
56
50
|
require File.expand_path("../../lib/sidekiq-rate-limiter", __FILE__)
|
57
51
|
##
|
58
52
|
|
59
53
|
## Hook to set Sidekiq::Testing mode using rspec tags
|
60
54
|
RSpec.configure do |config|
|
55
|
+
config.disable_monkey_patching!
|
56
|
+
config.expose_current_running_example_as :example
|
57
|
+
|
61
58
|
config.before(:each) do
|
62
59
|
## Use metadata to determine testing behavior
|
63
60
|
## for queuing.
|
metadata
CHANGED
@@ -1,132 +1,133 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sidekiq-rate-limiter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
+
- Docady
|
7
8
|
- Blake Thomas
|
8
9
|
- Enova
|
9
10
|
autorequire:
|
10
11
|
bindir: bin
|
11
12
|
cert_chain: []
|
12
|
-
date:
|
13
|
+
date: 2016-02-15 00:00:00.000000000 Z
|
13
14
|
dependencies:
|
14
15
|
- !ruby/object:Gem::Dependency
|
15
16
|
name: pry
|
16
17
|
requirement: !ruby/object:Gem::Requirement
|
17
18
|
requirements:
|
18
|
-
- - '>='
|
19
|
+
- - ! '>='
|
19
20
|
- !ruby/object:Gem::Version
|
20
21
|
version: '0'
|
21
22
|
type: :development
|
22
23
|
prerelease: false
|
23
24
|
version_requirements: !ruby/object:Gem::Requirement
|
24
25
|
requirements:
|
25
|
-
- - '>='
|
26
|
+
- - ! '>='
|
26
27
|
- !ruby/object:Gem::Version
|
27
28
|
version: '0'
|
28
29
|
- !ruby/object:Gem::Dependency
|
29
|
-
name:
|
30
|
+
name: pry-byebug
|
30
31
|
requirement: !ruby/object:Gem::Requirement
|
31
32
|
requirements:
|
32
|
-
- - '>='
|
33
|
+
- - ! '>='
|
33
34
|
- !ruby/object:Gem::Version
|
34
35
|
version: '0'
|
35
36
|
type: :development
|
36
37
|
prerelease: false
|
37
38
|
version_requirements: !ruby/object:Gem::Requirement
|
38
39
|
requirements:
|
39
|
-
- - '>='
|
40
|
+
- - ! '>='
|
40
41
|
- !ruby/object:Gem::Version
|
41
42
|
version: '0'
|
42
43
|
- !ruby/object:Gem::Dependency
|
43
|
-
name:
|
44
|
+
name: rake
|
44
45
|
requirement: !ruby/object:Gem::Requirement
|
45
46
|
requirements:
|
46
|
-
- - '>='
|
47
|
+
- - ! '>='
|
47
48
|
- !ruby/object:Gem::Version
|
48
49
|
version: '0'
|
49
50
|
type: :development
|
50
51
|
prerelease: false
|
51
52
|
version_requirements: !ruby/object:Gem::Requirement
|
52
53
|
requirements:
|
53
|
-
- - '>='
|
54
|
+
- - ! '>='
|
54
55
|
- !ruby/object:Gem::Version
|
55
56
|
version: '0'
|
56
57
|
- !ruby/object:Gem::Dependency
|
57
|
-
name:
|
58
|
+
name: rspec
|
58
59
|
requirement: !ruby/object:Gem::Requirement
|
59
60
|
requirements:
|
60
|
-
- -
|
61
|
+
- - ~>
|
61
62
|
- !ruby/object:Gem::Version
|
62
|
-
version: '
|
63
|
+
version: '3.4'
|
63
64
|
type: :development
|
64
65
|
prerelease: false
|
65
66
|
version_requirements: !ruby/object:Gem::Requirement
|
66
67
|
requirements:
|
67
|
-
- -
|
68
|
+
- - ~>
|
68
69
|
- !ruby/object:Gem::Version
|
69
|
-
version: '
|
70
|
+
version: '3.4'
|
70
71
|
- !ruby/object:Gem::Dependency
|
71
|
-
name:
|
72
|
+
name: coveralls
|
72
73
|
requirement: !ruby/object:Gem::Requirement
|
73
74
|
requirements:
|
74
|
-
- -
|
75
|
+
- - ~>
|
75
76
|
- !ruby/object:Gem::Version
|
76
|
-
version: '0'
|
77
|
+
version: '0.8'
|
77
78
|
type: :development
|
78
79
|
prerelease: false
|
79
80
|
version_requirements: !ruby/object:Gem::Requirement
|
80
81
|
requirements:
|
81
|
-
- -
|
82
|
+
- - ~>
|
82
83
|
- !ruby/object:Gem::Version
|
83
|
-
version: '0'
|
84
|
+
version: '0.8'
|
84
85
|
- !ruby/object:Gem::Dependency
|
85
86
|
name: redis
|
86
87
|
requirement: !ruby/object:Gem::Requirement
|
87
88
|
requirements:
|
88
|
-
- - '>='
|
89
|
+
- - ! '>='
|
89
90
|
- !ruby/object:Gem::Version
|
90
91
|
version: '0'
|
91
92
|
type: :runtime
|
92
93
|
prerelease: false
|
93
94
|
version_requirements: !ruby/object:Gem::Requirement
|
94
95
|
requirements:
|
95
|
-
- - '>='
|
96
|
+
- - ! '>='
|
96
97
|
- !ruby/object:Gem::Version
|
97
98
|
version: '0'
|
98
99
|
- !ruby/object:Gem::Dependency
|
99
100
|
name: sidekiq
|
100
101
|
requirement: !ruby/object:Gem::Requirement
|
101
102
|
requirements:
|
102
|
-
- - '>='
|
103
|
+
- - ! '>='
|
103
104
|
- !ruby/object:Gem::Version
|
104
105
|
version: '2.0'
|
105
106
|
- - <
|
106
107
|
- !ruby/object:Gem::Version
|
107
|
-
version: '
|
108
|
+
version: '5.0'
|
108
109
|
type: :runtime
|
109
110
|
prerelease: false
|
110
111
|
version_requirements: !ruby/object:Gem::Requirement
|
111
112
|
requirements:
|
112
|
-
- - '>='
|
113
|
+
- - ! '>='
|
113
114
|
- !ruby/object:Gem::Version
|
114
115
|
version: '2.0'
|
115
116
|
- - <
|
116
117
|
- !ruby/object:Gem::Version
|
117
|
-
version: '
|
118
|
+
version: '5.0'
|
118
119
|
- !ruby/object:Gem::Dependency
|
119
120
|
name: redis_rate_limiter
|
120
121
|
requirement: !ruby/object:Gem::Requirement
|
121
122
|
requirements:
|
122
|
-
- - '>='
|
123
|
+
- - ! '>='
|
123
124
|
- !ruby/object:Gem::Version
|
124
125
|
version: '0'
|
125
126
|
type: :runtime
|
126
127
|
prerelease: false
|
127
128
|
version_requirements: !ruby/object:Gem::Requirement
|
128
129
|
requirements:
|
129
|
-
- - '>='
|
130
|
+
- - ! '>='
|
130
131
|
- !ruby/object:Gem::Version
|
131
132
|
version: '0'
|
132
133
|
description: Redis-backed, per-worker rate limits for job processing
|
@@ -145,6 +146,9 @@ files:
|
|
145
146
|
- LICENSE
|
146
147
|
- README.md
|
147
148
|
- Rakefile
|
149
|
+
- gemfiles/sidekiq_2.gemfile
|
150
|
+
- gemfiles/sidekiq_3.gemfile
|
151
|
+
- gemfiles/sidekiq_4.gemfile
|
148
152
|
- lib/sidekiq-rate-limiter.rb
|
149
153
|
- lib/sidekiq-rate-limiter/fetch.rb
|
150
154
|
- lib/sidekiq-rate-limiter/server.rb
|
@@ -164,22 +168,18 @@ require_paths:
|
|
164
168
|
- lib
|
165
169
|
required_ruby_version: !ruby/object:Gem::Requirement
|
166
170
|
requirements:
|
167
|
-
- - '>='
|
171
|
+
- - ! '>='
|
168
172
|
- !ruby/object:Gem::Version
|
169
173
|
version: '0'
|
170
174
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
171
175
|
requirements:
|
172
|
-
- - '>='
|
176
|
+
- - ! '>='
|
173
177
|
- !ruby/object:Gem::Version
|
174
178
|
version: '0'
|
175
179
|
requirements: []
|
176
180
|
rubyforge_project: nowarning
|
177
|
-
rubygems_version: 2.
|
181
|
+
rubygems_version: 2.4.5
|
178
182
|
signing_key:
|
179
183
|
specification_version: 4
|
180
184
|
summary: Redis-backed, per-worker rate limits for job processing
|
181
|
-
test_files:
|
182
|
-
- spec/sidekiq-rate-limiter/fetch_spec.rb
|
183
|
-
- spec/sidekiq-rate-limiter/server_spec.rb
|
184
|
-
- spec/spec_helper.rb
|
185
|
-
- spec/support/redis/.keep
|
185
|
+
test_files: []
|