resque-waiting-room 0.1.3 → 0.2.2
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 +7 -0
- data/.gitignore +2 -0
- data/.rspec +0 -2
- data/.ruby-version +1 -0
- data/.travis.yml +7 -0
- data/Gemfile +10 -1
- data/README.markdown +53 -6
- data/lib/resque/plugins/job.rb +2 -3
- data/lib/resque/plugins/version.rb +1 -1
- data/lib/resque/plugins/waiting_room.rb +10 -14
- data/resque-waiting-room.gemspec +2 -9
- data/spec/resque/plugins/job_spec.rb +27 -23
- data/spec/resque/plugins/waiting_room_spec.rb +94 -61
- data/spec/spec_helper.rb +11 -12
- data/spec/support/dummy_job.rb +1 -1
- data/spec/support/matchers.rb +27 -0
- metadata +26 -98
- data/.rbenv-version +0 -1
- data/Guardfile +0 -8
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: 9058938da957ee322a1422f2564ada3b40c9b8cd
|
|
4
|
+
data.tar.gz: c12c80cb78497fe63b84adb9c4763a693d12299c
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: f0bb708ab5a6dc14381f3d77aa9c0023cd86d3485212fb6df8fa01fb02e896ee2b919b40cd03e4cec9a6e01b3c3715045a7eb79584db0a7e000dd7db2a33de92
|
|
7
|
+
data.tar.gz: 373883a28538dfc7141000109bb3fb9453cce8907aafac166ccd723b095d84390620d5b2bc7cb5209558c9ba87b9f443356bfcdbd5e7289f05f7e4982826b2f8
|
data/.rspec
CHANGED
data/.ruby-version
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
2.1.3
|
data/.travis.yml
ADDED
data/Gemfile
CHANGED
|
@@ -1,4 +1,13 @@
|
|
|
1
|
-
source "
|
|
1
|
+
source "https://rubygems.org"
|
|
2
2
|
|
|
3
3
|
# Specify your gem's dependencies in resque-waiting-room.gemspec
|
|
4
4
|
gemspec
|
|
5
|
+
|
|
6
|
+
group :development do
|
|
7
|
+
gem 'resque', '~>1.24.1'
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
group :test do
|
|
11
|
+
gem 'rspec'
|
|
12
|
+
gem 'mock_redis'
|
|
13
|
+
end
|
data/README.markdown
CHANGED
|
@@ -1,12 +1,28 @@
|
|
|
1
1
|
Resque Waiting Room
|
|
2
2
|
===================
|
|
3
3
|
|
|
4
|
-
A [Resque][rq] plugin. Requires Resque 1.19.
|
|
4
|
+
A [Resque][rq] plugin. Requires Resque >= 1.19 and a >= 1.9 Ruby (MRI, JRuby or Rubinius).
|
|
5
5
|
|
|
6
6
|
If you want to limit the number of performs of a job for a given period, extend it
|
|
7
7
|
with this module.
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
## Installation
|
|
10
|
+
|
|
11
|
+
Add this line to your application's Gemfile:
|
|
12
|
+
|
|
13
|
+
gem 'resque-waiting-room'
|
|
14
|
+
|
|
15
|
+
And then execute:
|
|
16
|
+
|
|
17
|
+
$ bundle
|
|
18
|
+
|
|
19
|
+
Or install it yourself as:
|
|
20
|
+
|
|
21
|
+
$ gem install resque-waiting-room
|
|
22
|
+
|
|
23
|
+
## Usage
|
|
24
|
+
|
|
25
|
+
#### Example -- 10 jobs processed every 30 seconds max
|
|
10
26
|
|
|
11
27
|
require 'resque/plugins/waiting_room'
|
|
12
28
|
|
|
@@ -21,8 +37,39 @@ For example:
|
|
|
21
37
|
end
|
|
22
38
|
end
|
|
23
39
|
|
|
24
|
-
If 10 UpdateDataFromExternalAPI jobs have been performed in
|
|
25
|
-
|
|
26
|
-
and processed when possible.
|
|
40
|
+
If 10 UpdateDataFromExternalAPI jobs have been performed in 20
|
|
41
|
+
seconds, for the next 10 seconds UpdateDataFromExternalAPI jobs
|
|
42
|
+
will be placed in the waiting_room queue and processed when possible.
|
|
43
|
+
When the first 30 seconds are elapsed, the counter is set back to 0
|
|
44
|
+
and 10 jobs can be performed again.
|
|
45
|
+
You got to manually tweak the queue names in your workers though.
|
|
46
|
+
|
|
47
|
+
## Testing
|
|
48
|
+
|
|
49
|
+
We include a matcher
|
|
50
|
+
|
|
51
|
+
require 'spec/support/matchers'
|
|
52
|
+
|
|
53
|
+
describe MyJob do
|
|
54
|
+
it 'is rate limited' do
|
|
55
|
+
MyJob.should be_only_performed(times: 100, period: 300)
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
## Contributing
|
|
60
|
+
|
|
61
|
+
1. Fork it
|
|
62
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
|
63
|
+
3. Commit your changes (`git commit -am 'Added some feature'`)
|
|
64
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
|
65
|
+
5. Create new Pull Request
|
|
66
|
+
|
|
67
|
+
## Thanks to the following people for helping out ##
|
|
68
|
+
|
|
69
|
+
- Thomas Devol [@socialchorus](https://github.com/socialchorus) for adding the RSpec matcher
|
|
70
|
+
- Max Dunn [@maxdunn210](https://github.com/maxdunn210) for making me switch Resque 2 specific code in it's own branch
|
|
71
|
+
- Jeff Durand [@johnnyiller](https://github.com/johnnyiller) for the update of has_remaining_performs_key using the latest form set
|
|
72
|
+
|
|
73
|
+
[rq]: http://github.com/resque/resque
|
|
27
74
|
|
|
28
|
-
[
|
|
75
|
+
[](https://travis-ci.org/julienXX/resque-waiting-room) [](https://codeclimate.com/github/julienXX/resque-waiting-room)
|
data/lib/resque/plugins/job.rb
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
module Resque
|
|
2
2
|
class Job
|
|
3
|
-
class <<self
|
|
3
|
+
class << self
|
|
4
4
|
alias_method :origin_reserve, :reserve
|
|
5
5
|
|
|
6
6
|
def reserve(queue)
|
|
7
7
|
if queue =~ /^waiting_room/ && Resque.size(queue) > 0
|
|
8
8
|
payload = Resque.pop(queue)
|
|
9
9
|
if payload
|
|
10
|
-
klass =
|
|
10
|
+
klass = Kernel.const_get(payload['class'])
|
|
11
11
|
repushed_in_waiting_room = klass.repush(*payload['args'])
|
|
12
12
|
|
|
13
13
|
return new(queue, payload) unless repushed_in_waiting_room
|
|
@@ -17,7 +17,6 @@ module Resque
|
|
|
17
17
|
origin_reserve(queue)
|
|
18
18
|
end
|
|
19
19
|
end
|
|
20
|
-
|
|
21
20
|
end
|
|
22
21
|
end
|
|
23
22
|
end
|
|
@@ -11,27 +11,24 @@ module Resque
|
|
|
11
11
|
end
|
|
12
12
|
|
|
13
13
|
def waiting_room_redis_key
|
|
14
|
-
[self.to_s,
|
|
14
|
+
[self.to_s, 'remaining_performs'].compact.join(':')
|
|
15
15
|
end
|
|
16
16
|
|
|
17
17
|
def before_perform_waiting_room(*args)
|
|
18
18
|
key = waiting_room_redis_key
|
|
19
|
+
return unless remaining_performs_key?(key)
|
|
19
20
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
Resque.push 'waiting_room', :class => self.to_s, :args => args
|
|
25
|
-
raise Resque::Job::DontPerform
|
|
26
|
-
end
|
|
21
|
+
performs_left = Resque.redis.decrby(key, 1).to_i
|
|
22
|
+
if performs_left < 1
|
|
23
|
+
Resque.push 'waiting_room', class: self.to_s, args: args
|
|
24
|
+
raise Resque::Job::DontPerform
|
|
27
25
|
end
|
|
28
26
|
end
|
|
29
27
|
|
|
30
|
-
def
|
|
31
|
-
# Redis
|
|
32
|
-
|
|
33
|
-
Resque.redis.
|
|
34
|
-
|
|
28
|
+
def remaining_performs_key?(key)
|
|
29
|
+
# Redis SET: with the ex and nx option sets the keys if it doesn't exist,
|
|
30
|
+
# returns true if key was created redis => 2.6 required
|
|
31
|
+
new_key = Resque.redis.set(key, @max_performs - 1, ex: @period, nx: true)
|
|
35
32
|
return !new_key
|
|
36
33
|
end
|
|
37
34
|
|
|
@@ -46,4 +43,3 @@ module Resque
|
|
|
46
43
|
end
|
|
47
44
|
end
|
|
48
45
|
end
|
|
49
|
-
|
data/resque-waiting-room.gemspec
CHANGED
|
@@ -19,13 +19,6 @@ Gem::Specification.new do |s|
|
|
|
19
19
|
s.files += Dir.glob("lib/**/*")
|
|
20
20
|
s.files += Dir.glob("spec/**/*")
|
|
21
21
|
|
|
22
|
-
s.add_development_dependency 'rake'
|
|
23
|
-
s.add_development_dependency 'resque'
|
|
24
|
-
s.add_development_dependency 'rspec', '~>2.8.0'
|
|
25
|
-
s.add_development_dependency 'fuubar', '~>1.0.0'
|
|
26
|
-
s.add_development_dependency 'spork', '~>0.9.0'
|
|
27
|
-
s.add_development_dependency 'guard', '~>0.10.0'
|
|
28
|
-
s.add_development_dependency 'guard-rspec', '~>0.6.0'
|
|
29
|
-
s.add_development_dependency 'guard-spork', '~>0.3.0'
|
|
30
|
-
s.add_development_dependency 'rb-fsevent', '~>0.4.3.1'
|
|
22
|
+
s.add_development_dependency 'rake'
|
|
23
|
+
s.add_development_dependency 'resque'
|
|
31
24
|
end
|
|
@@ -1,41 +1,45 @@
|
|
|
1
1
|
require File.join(File.dirname(__FILE__) + '/../../spec_helper')
|
|
2
2
|
|
|
3
3
|
describe Resque::Job do
|
|
4
|
+
|
|
4
5
|
before(:each) do
|
|
5
6
|
Resque.redis.flushall
|
|
6
7
|
end
|
|
7
8
|
|
|
8
|
-
context
|
|
9
|
-
it
|
|
10
|
-
Resque.push('normal', :
|
|
11
|
-
Resque::Job.reserve('normal')
|
|
12
|
-
|
|
9
|
+
context 'normal job' do
|
|
10
|
+
it 'should trigger original reserve' do
|
|
11
|
+
Resque.push('normal', class: 'DummyJob', args: ['any args'])
|
|
12
|
+
expect(Resque::Job.reserve('normal'))
|
|
13
|
+
.to eq(Resque::Job.new('normal', 'class' => 'DummyJob', 'args' => ['any args']))
|
|
14
|
+
expect(Resque::Job.reserve('waiting_room')).to eq(nil)
|
|
13
15
|
end
|
|
14
16
|
end
|
|
15
17
|
|
|
16
|
-
context
|
|
17
|
-
it
|
|
18
|
-
Resque.push('waiting_room', :
|
|
19
|
-
Resque::Job.reserve('waiting_room')
|
|
20
|
-
|
|
18
|
+
context 'waiting_room job' do
|
|
19
|
+
it 'should push in the waiting_room queue when reserve from waiting_room queue' do
|
|
20
|
+
Resque.push('waiting_room', class: 'DummyJob', args: ['any args'])
|
|
21
|
+
expect(Resque::Job.reserve('waiting_room'))
|
|
22
|
+
.to eq(Resque::Job.new('waiting_room', 'class' => 'DummyJob', 'args' => ['any args']))
|
|
23
|
+
expect(Resque::Job.reserve('normal')).to eq(nil)
|
|
21
24
|
end
|
|
22
25
|
|
|
23
|
-
it
|
|
24
|
-
Resque.push('waiting_room', :
|
|
25
|
-
DummyJob.
|
|
26
|
-
Resque::Job.reserve('waiting_room')
|
|
27
|
-
|
|
28
|
-
Resque::Job.reserve('
|
|
26
|
+
it 'should push back to waiting_room queue when still restricted' do
|
|
27
|
+
Resque.push('waiting_room', class: 'DummyJob', args: ['any args'])
|
|
28
|
+
expect(DummyJob).to receive(:repush).with('any args')
|
|
29
|
+
expect(Resque::Job.reserve('waiting_room'))
|
|
30
|
+
.to eq(Resque::Job.new('waiting_room', 'class' => 'DummyJob', 'args' => ['any args']))
|
|
31
|
+
expect(Resque::Job.reserve('waiting_room')).to eq(nil)
|
|
32
|
+
expect(Resque::Job.reserve('normal')).to eq(nil)
|
|
29
33
|
end
|
|
30
34
|
|
|
31
|
-
it
|
|
32
|
-
Resque.push('normal', :
|
|
33
|
-
DummyJob.
|
|
34
|
-
Resque::Job.reserve('normal')
|
|
35
|
-
|
|
36
|
-
Resque::Job.reserve('
|
|
35
|
+
it 'should not repush when reserve normal queue' do
|
|
36
|
+
Resque.push('normal', class: 'DummyJob', args: ['any args'])
|
|
37
|
+
expect(DummyJob).not_to receive(:repush).with('any args')
|
|
38
|
+
expect(Resque::Job.reserve('normal'))
|
|
39
|
+
.to eq(Resque::Job.new('normal', 'class' => 'DummyJob', 'args' => ['any args']))
|
|
40
|
+
expect(Resque::Job.reserve('normal')).to eq(nil)
|
|
41
|
+
expect(Resque::Job.reserve('waiting_room')).to eq(nil)
|
|
37
42
|
end
|
|
38
43
|
end
|
|
39
44
|
|
|
40
45
|
end
|
|
41
|
-
|
|
@@ -5,114 +5,147 @@ describe Resque::Plugins::WaitingRoom do
|
|
|
5
5
|
Resque.redis.flushall
|
|
6
6
|
end
|
|
7
7
|
|
|
8
|
-
it
|
|
8
|
+
it 'should validate the Resque linter' do
|
|
9
9
|
Resque::Plugin.lint(Resque::Plugins::WaitingRoom)
|
|
10
10
|
end
|
|
11
11
|
|
|
12
|
-
context
|
|
13
|
-
it
|
|
14
|
-
expect {DummyJob.can_be_performed('lol')}
|
|
12
|
+
context 'can_be_performed' do
|
|
13
|
+
it 'should raise InvalidParams' do
|
|
14
|
+
expect { DummyJob.can_be_performed('lol') }
|
|
15
|
+
.to raise_error(Resque::Plugins::WaitingRoom::MissingParams)
|
|
15
16
|
end
|
|
16
17
|
|
|
17
|
-
it
|
|
18
|
-
DummyJob.instance_variable_get(
|
|
19
|
-
DummyJob.instance_variable_get(
|
|
18
|
+
it 'should assign @period and @max_performs' do
|
|
19
|
+
expect(DummyJob.instance_variable_get('@period')).to eq(30)
|
|
20
|
+
expect(DummyJob.instance_variable_get('@max_performs')).to eq(10)
|
|
20
21
|
end
|
|
21
22
|
end
|
|
22
23
|
|
|
23
|
-
context
|
|
24
|
-
it
|
|
25
|
-
DummyJob.waiting_room_redis_key
|
|
24
|
+
context 'waiting_room_redis_key' do
|
|
25
|
+
it 'should generate a redis key name based on the class' do
|
|
26
|
+
expect(DummyJob.waiting_room_redis_key)
|
|
27
|
+
.to eq('DummyJob:remaining_performs')
|
|
26
28
|
end
|
|
27
29
|
end
|
|
28
30
|
|
|
29
|
-
context
|
|
30
|
-
it
|
|
31
|
-
DummyJob
|
|
31
|
+
context 'custom matcher' do
|
|
32
|
+
it 'should match positive' do
|
|
33
|
+
expect(DummyJob).to be_only_performed(times: 10, period: 30)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
context 'before_perform_waiting_room' do
|
|
38
|
+
it 'should call waiting_room_redis_key' do
|
|
39
|
+
expect(DummyJob).to receive(:waiting_room_redis_key)
|
|
40
|
+
.and_return('DummyJob:remaining_performs')
|
|
32
41
|
DummyJob.before_perform_waiting_room('args')
|
|
33
42
|
end
|
|
34
43
|
|
|
35
|
-
it
|
|
36
|
-
DummyJob.
|
|
44
|
+
it 'should call remaining_performs_key?' do
|
|
45
|
+
expect(DummyJob).to receive(:remaining_performs_key?).and_return(false)
|
|
37
46
|
DummyJob.before_perform_waiting_room('args')
|
|
38
47
|
end
|
|
39
48
|
|
|
40
|
-
it
|
|
49
|
+
it 'should decrement performs' do
|
|
41
50
|
DummyJob.before_perform_waiting_room('args')
|
|
42
|
-
Resque.redis.get(
|
|
51
|
+
expect(Resque.redis.get('DummyJob:remaining_performs')).to eq('9')
|
|
43
52
|
DummyJob.before_perform_waiting_room('args')
|
|
44
|
-
Resque.redis.get(
|
|
53
|
+
expect(Resque.redis.get('DummyJob:remaining_performs')).to eq('8')
|
|
45
54
|
DummyJob.before_perform_waiting_room('args')
|
|
46
|
-
Resque.redis.get(
|
|
55
|
+
expect(Resque.redis.get('DummyJob:remaining_performs')).to eq('7')
|
|
47
56
|
end
|
|
48
57
|
|
|
49
|
-
it
|
|
50
|
-
9.times {DummyJob.before_perform_waiting_room('args')}
|
|
51
|
-
Resque.redis.get(
|
|
52
|
-
expect { DummyJob.before_perform_waiting_room('args') }
|
|
58
|
+
it 'should prevent perform once there are no performs left' do
|
|
59
|
+
9.times { DummyJob.before_perform_waiting_room('args') }
|
|
60
|
+
expect(Resque.redis.get('DummyJob:remaining_performs')).to eq('1')
|
|
61
|
+
expect { DummyJob.before_perform_waiting_room('args') }
|
|
62
|
+
.to raise_exception(Resque::Job::DontPerform)
|
|
53
63
|
end
|
|
54
64
|
end
|
|
55
65
|
|
|
56
|
-
context
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
DummyJob.
|
|
66
|
+
context 'remaining_performs_key?' do
|
|
67
|
+
before do
|
|
68
|
+
@key = DummyJob.waiting_room_redis_key
|
|
69
|
+
@max = DummyJob.instance_variable_get('@max_performs') - 1
|
|
70
|
+
@period = DummyJob.instance_variable_get('@period')
|
|
60
71
|
end
|
|
61
72
|
|
|
62
|
-
it
|
|
63
|
-
Resque.redis.
|
|
64
|
-
|
|
65
|
-
DummyJob.
|
|
73
|
+
it 'should set a redis key' do
|
|
74
|
+
expect(Resque.redis).to receive(:set)
|
|
75
|
+
.with(@key, @max, ex: @period, nx: true)
|
|
76
|
+
DummyJob.remaining_performs_key?(DummyJob.waiting_room_redis_key)
|
|
66
77
|
end
|
|
67
78
|
|
|
68
|
-
it
|
|
69
|
-
Resque.redis.
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
Resque.redis.should_not_receive(:expire)
|
|
74
|
-
DummyJob.has_remaining_performs_key?(DummyJob.waiting_room_redis_key)
|
|
79
|
+
it 'should expire the redis key' do
|
|
80
|
+
expect(Resque.redis).to receive(:set)
|
|
81
|
+
.with(@key, @max, ex: @period, nx: true)
|
|
82
|
+
.and_return(true)
|
|
83
|
+
DummyJob.remaining_performs_key?(DummyJob.waiting_room_redis_key)
|
|
75
84
|
end
|
|
76
85
|
|
|
77
|
-
it
|
|
78
|
-
Resque.redis.
|
|
79
|
-
|
|
80
|
-
|
|
86
|
+
it 'should not re-expire the redis key if it is already created' do
|
|
87
|
+
expect(Resque.redis).to receive(:set)
|
|
88
|
+
.with(@key, @max, ex: @period, nx: true)
|
|
89
|
+
.and_return(true)
|
|
90
|
+
DummyJob.remaining_performs_key?(DummyJob.waiting_room_redis_key)
|
|
91
|
+
expect(Resque.redis).to receive(:set)
|
|
92
|
+
.with(@key, @max, ex: @period, nx: true)
|
|
93
|
+
.and_return(false)
|
|
94
|
+
DummyJob.remaining_performs_key?(DummyJob.waiting_room_redis_key)
|
|
81
95
|
end
|
|
82
96
|
|
|
83
|
-
it
|
|
84
|
-
Resque.redis.
|
|
85
|
-
|
|
97
|
+
it 'should return false if the key is new' do
|
|
98
|
+
expect(Resque.redis).to receive(:set)
|
|
99
|
+
.with(@key, @max, ex: @period, nx: true)
|
|
100
|
+
.and_return(true)
|
|
101
|
+
expect(DummyJob.remaining_performs_key?(DummyJob.waiting_room_redis_key))
|
|
102
|
+
.to eq(false)
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
it 'should return true if the key was already created' do
|
|
106
|
+
expect(Resque.redis).to receive(:set)
|
|
107
|
+
.with(@key, @max, ex: @period, nx: true)
|
|
108
|
+
.and_return(false)
|
|
109
|
+
expect(DummyJob.remaining_performs_key?(DummyJob.waiting_room_redis_key))
|
|
110
|
+
.to eq(true)
|
|
86
111
|
end
|
|
87
112
|
end
|
|
88
113
|
|
|
89
|
-
context
|
|
90
|
-
it
|
|
91
|
-
DummyJob.
|
|
114
|
+
context 'repush' do
|
|
115
|
+
it 'should call waiting_room_redis_key' do
|
|
116
|
+
expect(DummyJob).to receive(:waiting_room_redis_key)
|
|
117
|
+
.and_return('DummyJob:remaining_performs')
|
|
92
118
|
DummyJob.repush('args')
|
|
93
119
|
end
|
|
94
120
|
|
|
95
|
-
it
|
|
96
|
-
Resque.redis.
|
|
121
|
+
it 'should get the key' do
|
|
122
|
+
expect(Resque.redis).to receive(:get)
|
|
123
|
+
.with(DummyJob.waiting_room_redis_key)
|
|
97
124
|
DummyJob.repush('args')
|
|
98
125
|
end
|
|
99
126
|
|
|
100
|
-
it
|
|
101
|
-
Resque.redis.
|
|
102
|
-
|
|
127
|
+
it 'should push in the waiting_room if there are no performs left' do
|
|
128
|
+
expect(Resque.redis).to receive(:get)
|
|
129
|
+
.with(DummyJob.waiting_room_redis_key)
|
|
130
|
+
.and_return('0')
|
|
131
|
+
expect(Resque).to receive(:push)
|
|
132
|
+
.with('waiting_room', class: 'DummyJob', args: ['args'])
|
|
133
|
+
.and_return(true)
|
|
103
134
|
DummyJob.repush('args')
|
|
104
135
|
end
|
|
105
136
|
|
|
106
|
-
it
|
|
107
|
-
Resque.redis.
|
|
108
|
-
|
|
137
|
+
it 'should return true if there were no performs left' do
|
|
138
|
+
expect(Resque.redis).to receive(:get)
|
|
139
|
+
.with(DummyJob.waiting_room_redis_key)
|
|
140
|
+
.and_return('0')
|
|
141
|
+
expect(DummyJob.repush('args')).to eq(true)
|
|
109
142
|
end
|
|
110
143
|
|
|
111
|
-
it
|
|
112
|
-
Resque.redis.
|
|
113
|
-
|
|
144
|
+
it 'should return false if there were performs left' do
|
|
145
|
+
expect(Resque.redis).to receive(:get)
|
|
146
|
+
.with(DummyJob.waiting_room_redis_key)
|
|
147
|
+
.and_return('1')
|
|
148
|
+
expect(DummyJob.repush('args')).to eq(false)
|
|
114
149
|
end
|
|
115
150
|
end
|
|
116
|
-
|
|
117
151
|
end
|
|
118
|
-
|
data/spec/spec_helper.rb
CHANGED
|
@@ -1,16 +1,15 @@
|
|
|
1
|
-
require 'spork'
|
|
2
1
|
require 'resque'
|
|
2
|
+
require 'mock_redis'
|
|
3
3
|
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib', 'resque-waiting-room'))
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
lib_dir = File.expand_path(File.join(spec_dir, '..', 'lib'))
|
|
8
|
-
$:.unshift(lib_dir)
|
|
9
|
-
$:.uniq!
|
|
10
|
-
RSpec.configure do |config|
|
|
11
|
-
config.mock_framework = :rspec
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
# Require ruby files in support dir.
|
|
15
|
-
Dir[File.expand_path('spec/support/*.rb')].each { |file| require file }
|
|
5
|
+
RSpec.configure do |config|
|
|
6
|
+
config.mock_framework = :rspec
|
|
16
7
|
end
|
|
8
|
+
|
|
9
|
+
puts 'Using a mock Redis'
|
|
10
|
+
r = MockRedis.new host: "localhost", port: 9736, db: 0
|
|
11
|
+
$mock_redis = Redis::Namespace.new :resque, redis: r
|
|
12
|
+
Resque.redis = $mock_redis
|
|
13
|
+
|
|
14
|
+
# Require ruby files in support dir.
|
|
15
|
+
Dir[File.expand_path('spec/support/*.rb')].each { |file| require file }
|
data/spec/support/dummy_job.rb
CHANGED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
RSpec::Matchers.define :be_only_performed do |expected_options|
|
|
2
|
+
match do |actual_job_class|
|
|
3
|
+
raise ArgumentError, 'Need :times, and :period' unless [:times, :period].all? { |k| expected_options.keys.include? k }
|
|
4
|
+
expected_period = expected_options[:period]
|
|
5
|
+
expected_times = expected_options[:times]
|
|
6
|
+
actual_job_class = actual_job_class.class unless actual_job_class.kind_of?(Class)
|
|
7
|
+
unless actual_job_class.singleton_class.ancestors.include?(Resque::Plugins::WaitingRoom)
|
|
8
|
+
raise ArgumentError, 'waiting room matcher used on non resque-job'
|
|
9
|
+
end
|
|
10
|
+
[actual_job_class.instance_variable_get(:@period) == expected_period,
|
|
11
|
+
actual_job_class.instance_variable_get(:@max_performs) == expected_times].all?
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
failure_message do |actual_job_class|
|
|
15
|
+
actual_times = actual_job_class.instance_variable_get(:@max_performs)
|
|
16
|
+
actual_period = actual_job_class.instance_variable_get(:@period)
|
|
17
|
+
"expected #{actual_job_class} to have defined can_be_performed times: #{expected_options[:times]} period: #{expected_options[:period]}, got can_be_performed times: #{actual_times} period: #{actual_times}"
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
failure_message_when_negated do |actual|
|
|
21
|
+
"expected #{actual_job_class} to have NOT defined can_be_performed times: #{expected_options[:times]} period: #{expected_options[:period]}"
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
description do
|
|
25
|
+
"be performed at most #{expected_options[:times]} in #{expected_options[:period]} seconds"
|
|
26
|
+
end
|
|
27
|
+
end
|
metadata
CHANGED
|
@@ -1,115 +1,43 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: resque-waiting-room
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
5
|
-
prerelease:
|
|
4
|
+
version: 0.2.2
|
|
6
5
|
platform: ruby
|
|
7
6
|
authors:
|
|
8
7
|
- Julien Blanchard
|
|
9
8
|
autorequire:
|
|
10
9
|
bindir: bin
|
|
11
10
|
cert_chain: []
|
|
12
|
-
date:
|
|
11
|
+
date: 2014-10-29 00:00:00.000000000 Z
|
|
13
12
|
dependencies:
|
|
14
13
|
- !ruby/object:Gem::Dependency
|
|
15
14
|
name: rake
|
|
16
|
-
requirement:
|
|
17
|
-
none: false
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
18
16
|
requirements:
|
|
19
|
-
- -
|
|
17
|
+
- - ">="
|
|
20
18
|
- !ruby/object:Gem::Version
|
|
21
|
-
version: 0
|
|
19
|
+
version: '0'
|
|
22
20
|
type: :development
|
|
23
21
|
prerelease: false
|
|
24
|
-
version_requirements:
|
|
25
|
-
- !ruby/object:Gem::Dependency
|
|
26
|
-
name: resque
|
|
27
|
-
requirement: &70112971735960 !ruby/object:Gem::Requirement
|
|
28
|
-
none: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
29
23
|
requirements:
|
|
30
|
-
- -
|
|
24
|
+
- - ">="
|
|
31
25
|
- !ruby/object:Gem::Version
|
|
32
|
-
version:
|
|
33
|
-
type: :development
|
|
34
|
-
prerelease: false
|
|
35
|
-
version_requirements: *70112971735960
|
|
36
|
-
- !ruby/object:Gem::Dependency
|
|
37
|
-
name: rspec
|
|
38
|
-
requirement: &70112971735380 !ruby/object:Gem::Requirement
|
|
39
|
-
none: false
|
|
40
|
-
requirements:
|
|
41
|
-
- - ~>
|
|
42
|
-
- !ruby/object:Gem::Version
|
|
43
|
-
version: 2.8.0
|
|
44
|
-
type: :development
|
|
45
|
-
prerelease: false
|
|
46
|
-
version_requirements: *70112971735380
|
|
26
|
+
version: '0'
|
|
47
27
|
- !ruby/object:Gem::Dependency
|
|
48
|
-
name:
|
|
49
|
-
requirement:
|
|
50
|
-
none: false
|
|
51
|
-
requirements:
|
|
52
|
-
- - ~>
|
|
53
|
-
- !ruby/object:Gem::Version
|
|
54
|
-
version: 1.0.0
|
|
55
|
-
type: :development
|
|
56
|
-
prerelease: false
|
|
57
|
-
version_requirements: *70112971734900
|
|
58
|
-
- !ruby/object:Gem::Dependency
|
|
59
|
-
name: spork
|
|
60
|
-
requirement: &70112971734380 !ruby/object:Gem::Requirement
|
|
61
|
-
none: false
|
|
62
|
-
requirements:
|
|
63
|
-
- - ~>
|
|
64
|
-
- !ruby/object:Gem::Version
|
|
65
|
-
version: 0.9.0
|
|
66
|
-
type: :development
|
|
67
|
-
prerelease: false
|
|
68
|
-
version_requirements: *70112971734380
|
|
69
|
-
- !ruby/object:Gem::Dependency
|
|
70
|
-
name: guard
|
|
71
|
-
requirement: &70112971733860 !ruby/object:Gem::Requirement
|
|
72
|
-
none: false
|
|
73
|
-
requirements:
|
|
74
|
-
- - ~>
|
|
75
|
-
- !ruby/object:Gem::Version
|
|
76
|
-
version: 0.10.0
|
|
77
|
-
type: :development
|
|
78
|
-
prerelease: false
|
|
79
|
-
version_requirements: *70112971733860
|
|
80
|
-
- !ruby/object:Gem::Dependency
|
|
81
|
-
name: guard-rspec
|
|
82
|
-
requirement: &70112971733260 !ruby/object:Gem::Requirement
|
|
83
|
-
none: false
|
|
84
|
-
requirements:
|
|
85
|
-
- - ~>
|
|
86
|
-
- !ruby/object:Gem::Version
|
|
87
|
-
version: 0.6.0
|
|
88
|
-
type: :development
|
|
89
|
-
prerelease: false
|
|
90
|
-
version_requirements: *70112971733260
|
|
91
|
-
- !ruby/object:Gem::Dependency
|
|
92
|
-
name: guard-spork
|
|
93
|
-
requirement: &70112971732640 !ruby/object:Gem::Requirement
|
|
94
|
-
none: false
|
|
28
|
+
name: resque
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
95
30
|
requirements:
|
|
96
|
-
- -
|
|
31
|
+
- - ">="
|
|
97
32
|
- !ruby/object:Gem::Version
|
|
98
|
-
version: 0
|
|
33
|
+
version: '0'
|
|
99
34
|
type: :development
|
|
100
35
|
prerelease: false
|
|
101
|
-
version_requirements:
|
|
102
|
-
- !ruby/object:Gem::Dependency
|
|
103
|
-
name: rb-fsevent
|
|
104
|
-
requirement: &70112971731760 !ruby/object:Gem::Requirement
|
|
105
|
-
none: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
106
37
|
requirements:
|
|
107
|
-
- -
|
|
38
|
+
- - ">="
|
|
108
39
|
- !ruby/object:Gem::Version
|
|
109
|
-
version: 0
|
|
110
|
-
type: :development
|
|
111
|
-
prerelease: false
|
|
112
|
-
version_requirements: *70112971731760
|
|
40
|
+
version: '0'
|
|
113
41
|
description: Throttle your Resque jobs
|
|
114
42
|
email:
|
|
115
43
|
- julien@sideburns.eu
|
|
@@ -117,11 +45,11 @@ executables: []
|
|
|
117
45
|
extensions: []
|
|
118
46
|
extra_rdoc_files: []
|
|
119
47
|
files:
|
|
120
|
-
- .gitignore
|
|
121
|
-
- .
|
|
122
|
-
- .
|
|
48
|
+
- ".gitignore"
|
|
49
|
+
- ".rspec"
|
|
50
|
+
- ".ruby-version"
|
|
51
|
+
- ".travis.yml"
|
|
123
52
|
- Gemfile
|
|
124
|
-
- Guardfile
|
|
125
53
|
- LICENSE
|
|
126
54
|
- README.markdown
|
|
127
55
|
- Rakefile
|
|
@@ -134,33 +62,33 @@ files:
|
|
|
134
62
|
- spec/resque/plugins/waiting_room_spec.rb
|
|
135
63
|
- spec/spec_helper.rb
|
|
136
64
|
- spec/support/dummy_job.rb
|
|
65
|
+
- spec/support/matchers.rb
|
|
137
66
|
homepage: https://www.github.com/julienXX/resque-waiting-room
|
|
138
67
|
licenses: []
|
|
68
|
+
metadata: {}
|
|
139
69
|
post_install_message:
|
|
140
70
|
rdoc_options: []
|
|
141
71
|
require_paths:
|
|
142
72
|
- lib
|
|
143
73
|
required_ruby_version: !ruby/object:Gem::Requirement
|
|
144
|
-
none: false
|
|
145
74
|
requirements:
|
|
146
|
-
- -
|
|
75
|
+
- - ">="
|
|
147
76
|
- !ruby/object:Gem::Version
|
|
148
77
|
version: '0'
|
|
149
78
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
150
|
-
none: false
|
|
151
79
|
requirements:
|
|
152
|
-
- -
|
|
80
|
+
- - ">="
|
|
153
81
|
- !ruby/object:Gem::Version
|
|
154
82
|
version: '0'
|
|
155
83
|
requirements: []
|
|
156
84
|
rubyforge_project: resque-waiting-room
|
|
157
|
-
rubygems_version:
|
|
85
|
+
rubygems_version: 2.2.2
|
|
158
86
|
signing_key:
|
|
159
|
-
specification_version:
|
|
87
|
+
specification_version: 4
|
|
160
88
|
summary: Put your Resque jobs in a waiting room
|
|
161
89
|
test_files:
|
|
162
90
|
- spec/resque/plugins/job_spec.rb
|
|
163
91
|
- spec/resque/plugins/waiting_room_spec.rb
|
|
164
92
|
- spec/spec_helper.rb
|
|
165
93
|
- spec/support/dummy_job.rb
|
|
166
|
-
|
|
94
|
+
- spec/support/matchers.rb
|
data/.rbenv-version
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
1.9.3-p0
|
data/Guardfile
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
guard 'rspec', :version => 2, :cli => "--drb --format Fuubar --color" do
|
|
2
|
-
watch('lib/resque/plugins/job.rb')
|
|
3
|
-
watch('lib/resque/plugins/waiting_room.rb')
|
|
4
|
-
watch('spec/resque/plugins/job_spec.rb')
|
|
5
|
-
watch('spec/resque/plugins/waiting_room_spec.rb')
|
|
6
|
-
watch('spec/spec_helper.rb')
|
|
7
|
-
end
|
|
8
|
-
|