resque_solo 0.0.4 → 0.1.0
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 +4 -4
- data/.ruby-version +1 -1
- data/.travis.yml +2 -1
- data/Gemfile +3 -6
- data/README.md +19 -4
- data/lib/resque_solo/version.rb +1 -1
- data/resque_solo.gemspec +4 -2
- data/test/job_test.rb +15 -15
- data/test/queue_test.rb +15 -15
- data/test/resque_test.rb +9 -13
- data/test/test_helper.rb +1 -4
- data/test/unique_job_test.rb +2 -2
- metadata +47 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dc87df1fa353f94c1d75b20c2dc6ef9f5978637b
|
4
|
+
data.tar.gz: 51df2fed96c31280f6ed8fb64851529fc75fcda4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 927e45014a436a39aba1017cbd153d43218f3d82bee878f88f1efbc0e0d0d86e854eb03b46a626df9ad377c77b73e2e76286e7c73fb314cd9466fa8ef4e1ccf6
|
7
|
+
data.tar.gz: ab499a6bb2587de31fd05a37d4092a59a79572d67e1349ff86d836066b85249be8d7505883935e187b81e25f5f2d3fa19055f4658f3e05b5a680bc45e90fde3c
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
ruby-2.
|
1
|
+
ruby-2.1.1
|
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
@@ -1,12 +1,9 @@
|
|
1
1
|
source 'https://rubygems.org'
|
2
2
|
|
3
3
|
group :test do
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
gem 'pry'
|
8
|
-
gem 'pry-byebug', platform: :mri_20
|
9
|
-
gem 'fakeredis'
|
4
|
+
unless ENV['TRAVIS']
|
5
|
+
gem 'pry-byebug', platform: :mri_21
|
6
|
+
end
|
10
7
|
gem 'simplecov', require: false
|
11
8
|
end
|
12
9
|
|
data/README.md
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
# ResqueSolo
|
2
2
|
|
3
|
-
[][gem]
|
4
|
+
[][build]
|
5
5
|
|
6
|
-
[gem]: http://
|
6
|
+
[gem]: http://rubygems.org/gems/resque_solo
|
7
7
|
[build]: https://travis-ci.org/neighborland/resque_solo
|
8
8
|
|
9
9
|
ResqueSolo is a resque plugin to add unique jobs to resque.
|
@@ -18,7 +18,9 @@ It removes the dependency on `Resque::Helpers`, which is deprecated for resque 2
|
|
18
18
|
|
19
19
|
Add the gem to your Gemfile:
|
20
20
|
|
21
|
-
|
21
|
+
```ruby
|
22
|
+
gem 'resque_solo'
|
23
|
+
```
|
22
24
|
|
23
25
|
## Usage
|
24
26
|
|
@@ -49,3 +51,16 @@ Resque.enqueued? UpdateCat, 1
|
|
49
51
|
Resque.enqueued_in? :dogs, UpdateCat, 1
|
50
52
|
=> false
|
51
53
|
```
|
54
|
+
|
55
|
+
### Options
|
56
|
+
|
57
|
+
#### `lock_after_execution_period`
|
58
|
+
|
59
|
+
By default, lock_after_execution_period is 0 and `enqueued?` becomes false as soon as the job
|
60
|
+
is being worked on.
|
61
|
+
|
62
|
+
The `lock_after_execution_period` setting can be used to delay when the unique job key is deleted
|
63
|
+
(i.e. when `enqueued?` becomes `false`). For example, if you have a long-running unique job that
|
64
|
+
takes around 10 seconds, and you don't want to requeue another job until you are sure it is done,
|
65
|
+
you could set `lock_after_execution_period = 20`. Or if you never want to run a long running
|
66
|
+
job more than once per minute, set `lock_after_execution_period = 60`.
|
data/lib/resque_solo/version.rb
CHANGED
data/resque_solo.gemspec
CHANGED
@@ -22,6 +22,8 @@ Gem::Specification.new do |spec|
|
|
22
22
|
|
23
23
|
spec.add_dependency "resque", "~> 1.25.1"
|
24
24
|
|
25
|
-
spec.add_development_dependency "bundler", "~> 1.
|
26
|
-
spec.add_development_dependency "
|
25
|
+
spec.add_development_dependency "bundler", "~> 1.5"
|
26
|
+
spec.add_development_dependency "fakeredis", "~> 0.4"
|
27
|
+
spec.add_development_dependency "minitest", "~> 5.3"
|
28
|
+
spec.add_development_dependency "rake", "~> 10.1"
|
27
29
|
end
|
data/test/job_test.rb
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
|
-
class JobTest <
|
4
|
-
|
3
|
+
class JobTest < MiniTest::Spec
|
4
|
+
before do
|
5
5
|
Resque.redis.flushall
|
6
6
|
end
|
7
7
|
|
8
|
-
|
8
|
+
it "enqueue identical jobs once" do
|
9
9
|
Resque.enqueue FakeUniqueJob, "x"
|
10
10
|
Resque.enqueue FakeUniqueJob, "x"
|
11
11
|
assert_equal 1, Resque.size(:unique)
|
12
12
|
end
|
13
13
|
|
14
|
-
|
14
|
+
it "allow the same jobs to be executed one after the other" do
|
15
15
|
Resque.enqueue FakeUniqueJob, "foo"
|
16
16
|
Resque.enqueue FakeUniqueJob, "foo"
|
17
17
|
assert_equal 1, Resque.size(:unique)
|
@@ -22,19 +22,19 @@ class JobTest < Test::Unit::TestCase
|
|
22
22
|
assert_equal 1, Resque.size(:unique)
|
23
23
|
end
|
24
24
|
|
25
|
-
|
25
|
+
it "consider equivalent hashes regardless of key order" do
|
26
26
|
Resque.enqueue FakeUniqueJob, bar: 1, foo: 2
|
27
27
|
Resque.enqueue FakeUniqueJob, foo: 2, bar: 1
|
28
28
|
assert_equal 1, Resque.size(:unique)
|
29
29
|
end
|
30
30
|
|
31
|
-
|
31
|
+
it "treat string and symbol keys equally" do
|
32
32
|
Resque.enqueue FakeUniqueJob, bar: 1, foo: 1
|
33
33
|
Resque.enqueue FakeUniqueJob, bar: 1, "foo" => 1
|
34
34
|
assert_equal 1, Resque.size(:unique)
|
35
35
|
end
|
36
36
|
|
37
|
-
|
37
|
+
it "mark jobs as unqueued, when Job.destroy is killing them" do
|
38
38
|
Resque.enqueue FakeUniqueJob, "foo"
|
39
39
|
Resque.enqueue FakeUniqueJob, "foo"
|
40
40
|
assert_equal 1, Resque.size(:unique)
|
@@ -45,7 +45,7 @@ class JobTest < Test::Unit::TestCase
|
|
45
45
|
assert_equal 1, Resque.size(:unique)
|
46
46
|
end
|
47
47
|
|
48
|
-
|
48
|
+
it "mark jobs as unqueued when they raise an exception" do
|
49
49
|
2.times { Resque.enqueue( FailingUniqueJob, "foo" ) }
|
50
50
|
assert_equal 1, Resque.size(:unique)
|
51
51
|
worker = Resque::Worker.new(:unique)
|
@@ -55,13 +55,13 @@ class JobTest < Test::Unit::TestCase
|
|
55
55
|
assert_equal 1, Resque.size(:unique)
|
56
56
|
end
|
57
57
|
|
58
|
-
|
58
|
+
it "report if a unique job is enqueued" do
|
59
59
|
Resque.enqueue FakeUniqueJob, "foo"
|
60
60
|
assert Resque.enqueued?(FakeUniqueJob, "foo")
|
61
61
|
refute Resque.enqueued?(FakeUniqueJob, "bar")
|
62
62
|
end
|
63
63
|
|
64
|
-
|
64
|
+
it "report if a unique job is enqueued in another queue" do
|
65
65
|
default_queue = FakeUniqueJob.instance_variable_get(:@queue)
|
66
66
|
FakeUniqueJob.instance_variable_set(:@queue, :other)
|
67
67
|
Resque.enqueue FakeUniqueJob, "foo"
|
@@ -70,7 +70,7 @@ class JobTest < Test::Unit::TestCase
|
|
70
70
|
refute Resque.enqueued?(FakeUniqueJob, "foo")
|
71
71
|
end
|
72
72
|
|
73
|
-
|
73
|
+
it "cleanup when a queue is destroyed" do
|
74
74
|
Resque.enqueue FakeUniqueJob, "foo"
|
75
75
|
Resque.enqueue FailingUniqueJob, "foo"
|
76
76
|
Resque.remove_queue(:unique)
|
@@ -78,7 +78,7 @@ class JobTest < Test::Unit::TestCase
|
|
78
78
|
assert_equal 1, Resque.size(:unique)
|
79
79
|
end
|
80
80
|
|
81
|
-
|
81
|
+
it "honor ttl in the redis key" do
|
82
82
|
Resque.enqueue UniqueJobWithTtl
|
83
83
|
assert Resque.enqueued?(UniqueJobWithTtl)
|
84
84
|
keys = Resque.redis.keys "solo:queue:unique_with_ttl:job:*"
|
@@ -86,7 +86,7 @@ class JobTest < Test::Unit::TestCase
|
|
86
86
|
assert_in_delta UniqueJobWithTtl.ttl, Resque.redis.ttl(keys.first), 2
|
87
87
|
end
|
88
88
|
|
89
|
-
|
89
|
+
it "not allow the same job to be enqueued after execution if lock_after_execution_period is set" do
|
90
90
|
Resque.enqueue UniqueJobWithLock, "foo"
|
91
91
|
Resque.enqueue UniqueJobWithLock, "foo"
|
92
92
|
assert_equal 1, Resque.size(:unique_with_lock)
|
@@ -96,7 +96,7 @@ class JobTest < Test::Unit::TestCase
|
|
96
96
|
assert_equal 0, Resque.size(:unique_with_lock)
|
97
97
|
end
|
98
98
|
|
99
|
-
|
99
|
+
it "honor lock_after_execution_period in the redis key" do
|
100
100
|
Resque.enqueue UniqueJobWithLock
|
101
101
|
Resque.reserve(:unique_with_lock)
|
102
102
|
keys = Resque.redis.keys "solo:queue:unique_with_lock:job:*"
|
@@ -104,4 +104,4 @@ class JobTest < Test::Unit::TestCase
|
|
104
104
|
assert_in_delta UniqueJobWithLock.lock_after_execution_period, Resque.redis.ttl(keys.first), 2
|
105
105
|
end
|
106
106
|
|
107
|
-
end
|
107
|
+
end
|
data/test/queue_test.rb
CHANGED
@@ -1,54 +1,54 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
3
|
module ResqueSolo
|
4
|
-
class QueueTest <
|
5
|
-
|
6
|
-
|
4
|
+
class QueueTest < MiniTest::Spec
|
5
|
+
describe ".is_unique?" do
|
6
|
+
it "is false for non-unique job" do
|
7
7
|
refute Queue.is_unique?(class: 'FakeJob')
|
8
8
|
end
|
9
9
|
|
10
|
-
|
10
|
+
it "is false for invalid job class" do
|
11
11
|
refute Queue.is_unique?(class: 'InvalidJob')
|
12
12
|
end
|
13
13
|
|
14
|
-
|
14
|
+
it "is true for unique job" do
|
15
15
|
assert Queue.is_unique?(class: 'FakeUniqueJob')
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
|
-
|
20
|
-
|
19
|
+
describe ".item_ttl" do
|
20
|
+
it "is -1 for non-unique job" do
|
21
21
|
assert_equal -1, Queue.item_ttl(class: 'FakeJob')
|
22
22
|
end
|
23
23
|
|
24
|
-
|
24
|
+
it "is -1 for invalid job class" do
|
25
25
|
assert_equal -1, Queue.item_ttl(class: 'InvalidJob')
|
26
26
|
end
|
27
27
|
|
28
|
-
|
28
|
+
it "is -1 for unique job" do
|
29
29
|
assert_equal -1, Queue.item_ttl(class: 'FakeUniqueJob')
|
30
30
|
end
|
31
31
|
|
32
|
-
|
32
|
+
it "is job TTL" do
|
33
33
|
assert_equal 300, UniqueJobWithTtl.ttl
|
34
34
|
assert_equal 300, Queue.item_ttl(class: 'UniqueJobWithTtl')
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
38
|
-
|
39
|
-
|
38
|
+
describe ".lock_after_execution_period" do
|
39
|
+
it "is 0 for non-unique job" do
|
40
40
|
assert_equal 0, Queue.lock_after_execution_period(class: 'FakeJob')
|
41
41
|
end
|
42
42
|
|
43
|
-
|
43
|
+
it "is 0 for invalid job class" do
|
44
44
|
assert_equal 0, Queue.lock_after_execution_period(class: 'InvalidJob')
|
45
45
|
end
|
46
46
|
|
47
|
-
|
47
|
+
it "is 0 for unique job" do
|
48
48
|
assert_equal 0, Queue.lock_after_execution_period(class: 'FakeUniqueJob')
|
49
49
|
end
|
50
50
|
|
51
|
-
|
51
|
+
it "is job lock period" do
|
52
52
|
assert_equal 150, UniqueJobWithLock.lock_after_execution_period
|
53
53
|
assert_equal 150, Queue.lock_after_execution_period(class: 'UniqueJobWithLock')
|
54
54
|
end
|
data/test/resque_test.rb
CHANGED
@@ -1,30 +1,26 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
|
-
class ResqueTest <
|
4
|
-
|
3
|
+
class ResqueTest < MiniTest::Spec
|
4
|
+
before do
|
5
5
|
Resque.redis.flushall
|
6
6
|
end
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
Resque::Plugin.lint(Resque::Plugins::UniqueJob)
|
11
|
-
end
|
8
|
+
it "is a valid plugin" do
|
9
|
+
Resque::Plugin.lint(Resque::Plugins::UniqueJob)
|
12
10
|
end
|
13
11
|
|
14
|
-
|
12
|
+
it "enqueues normal jobs" do
|
15
13
|
Resque.enqueue FakeJob, "x"
|
16
14
|
Resque.enqueue FakeJob, "x"
|
17
15
|
assert_equal 2, Resque.size(:normal)
|
18
16
|
end
|
19
17
|
|
20
|
-
|
18
|
+
it "is not able to report if a non-unique job was enqueued" do
|
21
19
|
assert_nil Resque.enqueued?(FakeJob)
|
22
20
|
end
|
23
21
|
|
24
|
-
|
25
|
-
|
26
|
-
Resque.remove_queue(:unique)
|
27
|
-
end
|
22
|
+
it "does not raise when deleting an empty queue" do
|
23
|
+
Resque.remove_queue(:unique)
|
28
24
|
end
|
29
25
|
|
30
|
-
end
|
26
|
+
end
|
data/test/test_helper.rb
CHANGED
@@ -3,13 +3,10 @@ if ENV['SIMPLE_COV']
|
|
3
3
|
SimpleCov.start
|
4
4
|
end
|
5
5
|
|
6
|
-
require '
|
7
|
-
require 'shoulda-context'
|
8
|
-
require 'mocha/setup'
|
6
|
+
require 'minitest/autorun'
|
9
7
|
require 'resque_solo'
|
10
8
|
require 'fake_jobs'
|
11
9
|
require 'fakeredis'
|
12
|
-
require 'pry'
|
13
10
|
begin
|
14
11
|
require 'pry-byebug'
|
15
12
|
rescue LoadError
|
data/test/unique_job_test.rb
CHANGED
metadata
CHANGED
@@ -1,57 +1,85 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: resque_solo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tee Parham
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-03-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: resque
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - ~>
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: 1.25.1
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - ~>
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 1.25.1
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - ~>
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '1.
|
33
|
+
version: '1.5'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - ~>
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '1.
|
40
|
+
version: '1.5'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: fakeredis
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0.4'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0.4'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: minitest
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '5.3'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '5.3'
|
41
69
|
- !ruby/object:Gem::Dependency
|
42
70
|
name: rake
|
43
71
|
requirement: !ruby/object:Gem::Requirement
|
44
72
|
requirements:
|
45
|
-
- -
|
73
|
+
- - "~>"
|
46
74
|
- !ruby/object:Gem::Version
|
47
|
-
version: '
|
75
|
+
version: '10.1'
|
48
76
|
type: :development
|
49
77
|
prerelease: false
|
50
78
|
version_requirements: !ruby/object:Gem::Requirement
|
51
79
|
requirements:
|
52
|
-
- -
|
80
|
+
- - "~>"
|
53
81
|
- !ruby/object:Gem::Version
|
54
|
-
version: '
|
82
|
+
version: '10.1'
|
55
83
|
description: Resque plugin to add unique jobs
|
56
84
|
email:
|
57
85
|
- tee@neighborland.com
|
@@ -59,9 +87,9 @@ executables: []
|
|
59
87
|
extensions: []
|
60
88
|
extra_rdoc_files: []
|
61
89
|
files:
|
62
|
-
- .gitignore
|
63
|
-
- .ruby-version
|
64
|
-
- .travis.yml
|
90
|
+
- ".gitignore"
|
91
|
+
- ".ruby-version"
|
92
|
+
- ".travis.yml"
|
65
93
|
- Gemfile
|
66
94
|
- LICENSE.txt
|
67
95
|
- README.md
|
@@ -89,17 +117,17 @@ require_paths:
|
|
89
117
|
- lib
|
90
118
|
required_ruby_version: !ruby/object:Gem::Requirement
|
91
119
|
requirements:
|
92
|
-
- -
|
120
|
+
- - ">="
|
93
121
|
- !ruby/object:Gem::Version
|
94
122
|
version: 1.9.3
|
95
123
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
96
124
|
requirements:
|
97
|
-
- -
|
125
|
+
- - ">="
|
98
126
|
- !ruby/object:Gem::Version
|
99
127
|
version: '0'
|
100
128
|
requirements: []
|
101
129
|
rubyforge_project:
|
102
|
-
rubygems_version: 2.
|
130
|
+
rubygems_version: 2.2.2
|
103
131
|
signing_key:
|
104
132
|
specification_version: 4
|
105
133
|
summary: Resque plugin to add unique jobs
|
@@ -110,3 +138,4 @@ test_files:
|
|
110
138
|
- test/resque_test.rb
|
111
139
|
- test/test_helper.rb
|
112
140
|
- test/unique_job_test.rb
|
141
|
+
has_rdoc:
|