resque_solo 0.1.0 → 0.2.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/lib/resque_ext/job.rb +1 -1
- data/lib/resque_ext/resque.rb +2 -2
- data/lib/resque_solo.rb +6 -6
- data/lib/resque_solo/queue.rb +4 -4
- data/lib/resque_solo/unique_job.rb +3 -3
- data/lib/resque_solo/version.rb +1 -1
- metadata +6 -24
- data/.gitignore +0 -6
- data/.ruby-version +0 -1
- data/.travis.yml +0 -5
- data/Gemfile +0 -10
- data/Rakefile +0 -12
- data/resque_solo.gemspec +0 -29
- data/test/fake_jobs.rb +0 -38
- data/test/job_test.rb +0 -107
- data/test/queue_test.rb +0 -57
- data/test/resque_test.rb +0 -26
- data/test/test_helper.rb +0 -14
- data/test/unique_job_test.rb +0 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9e954b4d2492942672efaf828eda9cef99bae229
|
4
|
+
data.tar.gz: 4527347e8170f87fb2a16463eec8bda7bfaed3c6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0714a8209c9eddfef035591ccb049bf3d308827d015893067b2928ccf038c7b79a281ccb1f88ed60396446d7528a4270dd8ac87d9d152c9afb3887d61839157b
|
7
|
+
data.tar.gz: eadf6059eb2c9c59baefcb7d5c73d0caf11dfb911bd55514909bf2d86436f4e3609fc35f1e14a73f5f0953426f2e3a5b2785e46cd72a8470746c638924b18875
|
data/lib/resque_ext/job.rb
CHANGED
@@ -3,7 +3,7 @@ module Resque
|
|
3
3
|
class << self
|
4
4
|
# Mark an item as queued
|
5
5
|
def create_solo(queue, klass, *args)
|
6
|
-
item = {class: klass.to_s, args: args}
|
6
|
+
item = { class: klass.to_s, args: args }
|
7
7
|
return create_without_solo(queue, klass, *args) if Resque.inline? || !ResqueSolo::Queue.is_unique?(item)
|
8
8
|
return "EXISTED" if ResqueSolo::Queue.queued?(queue, item)
|
9
9
|
create_return_value = false
|
data/lib/resque_ext/resque.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
module Resque
|
2
2
|
class << self
|
3
3
|
def enqueued?(klass, *args)
|
4
|
-
enqueued_in?(queue_from_class(klass), klass, *args
|
4
|
+
enqueued_in?(queue_from_class(klass), klass, *args)
|
5
5
|
end
|
6
6
|
|
7
7
|
def enqueued_in?(queue, klass, *args)
|
8
|
-
item = {class: klass.to_s, args: args}
|
8
|
+
item = { class: klass.to_s, args: args }
|
9
9
|
return nil unless ResqueSolo::Queue.is_unique?(item)
|
10
10
|
ResqueSolo::Queue.queued?(queue, item)
|
11
11
|
end
|
data/lib/resque_solo.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
1
|
+
require "resque"
|
2
|
+
require "resque_ext/job"
|
3
|
+
require "resque_ext/resque"
|
4
|
+
require "resque_solo/version"
|
5
|
+
require "resque_solo/queue"
|
6
|
+
require "resque_solo/unique_job"
|
data/lib/resque_solo/queue.rb
CHANGED
@@ -53,8 +53,8 @@ module ResqueSolo
|
|
53
53
|
|
54
54
|
redis.lrange(redis_queue, 0, -1).each do |string|
|
55
55
|
json = Resque.decode(string)
|
56
|
-
next unless json[
|
57
|
-
next
|
56
|
+
next unless json["class"] == klass
|
57
|
+
next if args.any? && json["args"] != args
|
58
58
|
ResqueSolo::Queue.mark_unqueued(queue, json)
|
59
59
|
end
|
60
60
|
end
|
@@ -64,14 +64,14 @@ module ResqueSolo
|
|
64
64
|
redis.del(*keys) if keys.any?
|
65
65
|
end
|
66
66
|
|
67
|
-
|
67
|
+
private
|
68
68
|
|
69
69
|
def redis
|
70
70
|
Resque.redis
|
71
71
|
end
|
72
72
|
|
73
73
|
def item_class(item)
|
74
|
-
item[:class] || item[
|
74
|
+
item[:class] || item["class"]
|
75
75
|
end
|
76
76
|
|
77
77
|
def const_for(item)
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "digest/md5"
|
2
2
|
|
3
3
|
module Resque
|
4
4
|
module Plugins
|
@@ -31,7 +31,7 @@ module Resque
|
|
31
31
|
# end
|
32
32
|
# end
|
33
33
|
def ttl
|
34
|
-
@ttl
|
34
|
+
@ttl ||= -1
|
35
35
|
end
|
36
36
|
|
37
37
|
# The default ttl of a persisting key is 0, i.e. immediately deleted.
|
@@ -45,7 +45,7 @@ module Resque
|
|
45
45
|
# end
|
46
46
|
# end
|
47
47
|
def lock_after_execution_period
|
48
|
-
@lock_after_execution_period
|
48
|
+
@lock_after_execution_period ||= 0
|
49
49
|
end
|
50
50
|
end
|
51
51
|
end
|
data/lib/resque_solo/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: resque_solo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.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: 2016-04-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: resque
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 1.25
|
19
|
+
version: '1.25'
|
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
|
-
version: 1.25
|
26
|
+
version: '1.25'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -87,26 +87,14 @@ executables: []
|
|
87
87
|
extensions: []
|
88
88
|
extra_rdoc_files: []
|
89
89
|
files:
|
90
|
-
- ".gitignore"
|
91
|
-
- ".ruby-version"
|
92
|
-
- ".travis.yml"
|
93
|
-
- Gemfile
|
94
90
|
- LICENSE.txt
|
95
91
|
- README.md
|
96
|
-
- Rakefile
|
97
92
|
- lib/resque_ext/job.rb
|
98
93
|
- lib/resque_ext/resque.rb
|
99
94
|
- lib/resque_solo.rb
|
100
95
|
- lib/resque_solo/queue.rb
|
101
96
|
- lib/resque_solo/unique_job.rb
|
102
97
|
- lib/resque_solo/version.rb
|
103
|
-
- resque_solo.gemspec
|
104
|
-
- test/fake_jobs.rb
|
105
|
-
- test/job_test.rb
|
106
|
-
- test/queue_test.rb
|
107
|
-
- test/resque_test.rb
|
108
|
-
- test/test_helper.rb
|
109
|
-
- test/unique_job_test.rb
|
110
98
|
homepage: https://github.com/neighborland/resque_solo
|
111
99
|
licenses:
|
112
100
|
- MIT
|
@@ -127,15 +115,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
127
115
|
version: '0'
|
128
116
|
requirements: []
|
129
117
|
rubyforge_project:
|
130
|
-
rubygems_version: 2.
|
118
|
+
rubygems_version: 2.6.2
|
131
119
|
signing_key:
|
132
120
|
specification_version: 4
|
133
121
|
summary: Resque plugin to add unique jobs
|
134
|
-
test_files:
|
135
|
-
- test/fake_jobs.rb
|
136
|
-
- test/job_test.rb
|
137
|
-
- test/queue_test.rb
|
138
|
-
- test/resque_test.rb
|
139
|
-
- test/test_helper.rb
|
140
|
-
- test/unique_job_test.rb
|
122
|
+
test_files: []
|
141
123
|
has_rdoc:
|
data/.gitignore
DELETED
data/.ruby-version
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
ruby-2.1.1
|
data/.travis.yml
DELETED
data/Gemfile
DELETED
data/Rakefile
DELETED
data/resque_solo.gemspec
DELETED
@@ -1,29 +0,0 @@
|
|
1
|
-
# coding: utf-8
|
2
|
-
lib = File.expand_path('../lib', __FILE__)
|
3
|
-
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require 'resque_solo/version'
|
5
|
-
|
6
|
-
Gem::Specification.new do |spec|
|
7
|
-
spec.name = "resque_solo"
|
8
|
-
spec.version = ResqueSolo::VERSION
|
9
|
-
spec.authors = ["Tee Parham"]
|
10
|
-
spec.email = %w(tee@neighborland.com)
|
11
|
-
spec.description = %q{Resque plugin to add unique jobs}
|
12
|
-
spec.summary = %q{Resque plugin to add unique jobs}
|
13
|
-
spec.homepage = "https://github.com/neighborland/resque_solo"
|
14
|
-
spec.license = "MIT"
|
15
|
-
|
16
|
-
spec.files = `git ls-files`.split($/)
|
17
|
-
spec.executables = []
|
18
|
-
spec.test_files = spec.files.grep(%r{^(test|features)/})
|
19
|
-
spec.require_paths = %w(lib)
|
20
|
-
|
21
|
-
spec.required_ruby_version = ">= 1.9.3"
|
22
|
-
|
23
|
-
spec.add_dependency "resque", "~> 1.25.1"
|
24
|
-
|
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"
|
29
|
-
end
|
data/test/fake_jobs.rb
DELETED
@@ -1,38 +0,0 @@
|
|
1
|
-
class FakeJob
|
2
|
-
@queue = :normal
|
3
|
-
end
|
4
|
-
|
5
|
-
class FakeUniqueJob
|
6
|
-
include Resque::Plugins::UniqueJob
|
7
|
-
@queue = :unique
|
8
|
-
|
9
|
-
def self.perform(_)
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
class FailingUniqueJob
|
14
|
-
include Resque::Plugins::UniqueJob
|
15
|
-
@queue = :unique
|
16
|
-
|
17
|
-
def self.perform(_)
|
18
|
-
raise "Fail"
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
class UniqueJobWithTtl
|
23
|
-
include Resque::Plugins::UniqueJob
|
24
|
-
@queue = :unique_with_ttl
|
25
|
-
@ttl = 300
|
26
|
-
|
27
|
-
def self.perform(*_)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
class UniqueJobWithLock
|
32
|
-
include Resque::Plugins::UniqueJob
|
33
|
-
@queue = :unique_with_lock
|
34
|
-
@lock_after_execution_period = 150
|
35
|
-
|
36
|
-
def self.perform(*_)
|
37
|
-
end
|
38
|
-
end
|
data/test/job_test.rb
DELETED
@@ -1,107 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class JobTest < MiniTest::Spec
|
4
|
-
before do
|
5
|
-
Resque.redis.flushall
|
6
|
-
end
|
7
|
-
|
8
|
-
it "enqueue identical jobs once" do
|
9
|
-
Resque.enqueue FakeUniqueJob, "x"
|
10
|
-
Resque.enqueue FakeUniqueJob, "x"
|
11
|
-
assert_equal 1, Resque.size(:unique)
|
12
|
-
end
|
13
|
-
|
14
|
-
it "allow the same jobs to be executed one after the other" do
|
15
|
-
Resque.enqueue FakeUniqueJob, "foo"
|
16
|
-
Resque.enqueue FakeUniqueJob, "foo"
|
17
|
-
assert_equal 1, Resque.size(:unique)
|
18
|
-
Resque.reserve(:unique)
|
19
|
-
assert_equal 0, Resque.size(:unique)
|
20
|
-
Resque.enqueue FakeUniqueJob, "foo"
|
21
|
-
Resque.enqueue FakeUniqueJob, "foo"
|
22
|
-
assert_equal 1, Resque.size(:unique)
|
23
|
-
end
|
24
|
-
|
25
|
-
it "consider equivalent hashes regardless of key order" do
|
26
|
-
Resque.enqueue FakeUniqueJob, bar: 1, foo: 2
|
27
|
-
Resque.enqueue FakeUniqueJob, foo: 2, bar: 1
|
28
|
-
assert_equal 1, Resque.size(:unique)
|
29
|
-
end
|
30
|
-
|
31
|
-
it "treat string and symbol keys equally" do
|
32
|
-
Resque.enqueue FakeUniqueJob, bar: 1, foo: 1
|
33
|
-
Resque.enqueue FakeUniqueJob, bar: 1, "foo" => 1
|
34
|
-
assert_equal 1, Resque.size(:unique)
|
35
|
-
end
|
36
|
-
|
37
|
-
it "mark jobs as unqueued, when Job.destroy is killing them" do
|
38
|
-
Resque.enqueue FakeUniqueJob, "foo"
|
39
|
-
Resque.enqueue FakeUniqueJob, "foo"
|
40
|
-
assert_equal 1, Resque.size(:unique)
|
41
|
-
Resque::Job.destroy(:unique, FakeUniqueJob)
|
42
|
-
assert_equal 0, Resque.size(:unique)
|
43
|
-
Resque.enqueue FakeUniqueJob, "foo"
|
44
|
-
Resque.enqueue FakeUniqueJob, "foo"
|
45
|
-
assert_equal 1, Resque.size(:unique)
|
46
|
-
end
|
47
|
-
|
48
|
-
it "mark jobs as unqueued when they raise an exception" do
|
49
|
-
2.times { Resque.enqueue( FailingUniqueJob, "foo" ) }
|
50
|
-
assert_equal 1, Resque.size(:unique)
|
51
|
-
worker = Resque::Worker.new(:unique)
|
52
|
-
worker.work 0
|
53
|
-
assert_equal 0, Resque.size(:unique)
|
54
|
-
2.times { Resque.enqueue( FailingUniqueJob, "foo" ) }
|
55
|
-
assert_equal 1, Resque.size(:unique)
|
56
|
-
end
|
57
|
-
|
58
|
-
it "report if a unique job is enqueued" do
|
59
|
-
Resque.enqueue FakeUniqueJob, "foo"
|
60
|
-
assert Resque.enqueued?(FakeUniqueJob, "foo")
|
61
|
-
refute Resque.enqueued?(FakeUniqueJob, "bar")
|
62
|
-
end
|
63
|
-
|
64
|
-
it "report if a unique job is enqueued in another queue" do
|
65
|
-
default_queue = FakeUniqueJob.instance_variable_get(:@queue)
|
66
|
-
FakeUniqueJob.instance_variable_set(:@queue, :other)
|
67
|
-
Resque.enqueue FakeUniqueJob, "foo"
|
68
|
-
assert Resque.enqueued_in?(:other, FakeUniqueJob, "foo")
|
69
|
-
FakeUniqueJob.instance_variable_set(:@queue, default_queue)
|
70
|
-
refute Resque.enqueued?(FakeUniqueJob, "foo")
|
71
|
-
end
|
72
|
-
|
73
|
-
it "cleanup when a queue is destroyed" do
|
74
|
-
Resque.enqueue FakeUniqueJob, "foo"
|
75
|
-
Resque.enqueue FailingUniqueJob, "foo"
|
76
|
-
Resque.remove_queue(:unique)
|
77
|
-
Resque.enqueue(FakeUniqueJob, "foo")
|
78
|
-
assert_equal 1, Resque.size(:unique)
|
79
|
-
end
|
80
|
-
|
81
|
-
it "honor ttl in the redis key" do
|
82
|
-
Resque.enqueue UniqueJobWithTtl
|
83
|
-
assert Resque.enqueued?(UniqueJobWithTtl)
|
84
|
-
keys = Resque.redis.keys "solo:queue:unique_with_ttl:job:*"
|
85
|
-
assert_equal 1, keys.length
|
86
|
-
assert_in_delta UniqueJobWithTtl.ttl, Resque.redis.ttl(keys.first), 2
|
87
|
-
end
|
88
|
-
|
89
|
-
it "not allow the same job to be enqueued after execution if lock_after_execution_period is set" do
|
90
|
-
Resque.enqueue UniqueJobWithLock, "foo"
|
91
|
-
Resque.enqueue UniqueJobWithLock, "foo"
|
92
|
-
assert_equal 1, Resque.size(:unique_with_lock)
|
93
|
-
Resque.reserve(:unique_with_lock)
|
94
|
-
assert_equal 0, Resque.size(:unique_with_lock)
|
95
|
-
Resque.enqueue UniqueJobWithLock, "foo"
|
96
|
-
assert_equal 0, Resque.size(:unique_with_lock)
|
97
|
-
end
|
98
|
-
|
99
|
-
it "honor lock_after_execution_period in the redis key" do
|
100
|
-
Resque.enqueue UniqueJobWithLock
|
101
|
-
Resque.reserve(:unique_with_lock)
|
102
|
-
keys = Resque.redis.keys "solo:queue:unique_with_lock:job:*"
|
103
|
-
assert_equal 1, keys.length
|
104
|
-
assert_in_delta UniqueJobWithLock.lock_after_execution_period, Resque.redis.ttl(keys.first), 2
|
105
|
-
end
|
106
|
-
|
107
|
-
end
|
data/test/queue_test.rb
DELETED
@@ -1,57 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
module ResqueSolo
|
4
|
-
class QueueTest < MiniTest::Spec
|
5
|
-
describe ".is_unique?" do
|
6
|
-
it "is false for non-unique job" do
|
7
|
-
refute Queue.is_unique?(class: 'FakeJob')
|
8
|
-
end
|
9
|
-
|
10
|
-
it "is false for invalid job class" do
|
11
|
-
refute Queue.is_unique?(class: 'InvalidJob')
|
12
|
-
end
|
13
|
-
|
14
|
-
it "is true for unique job" do
|
15
|
-
assert Queue.is_unique?(class: 'FakeUniqueJob')
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
describe ".item_ttl" do
|
20
|
-
it "is -1 for non-unique job" do
|
21
|
-
assert_equal -1, Queue.item_ttl(class: 'FakeJob')
|
22
|
-
end
|
23
|
-
|
24
|
-
it "is -1 for invalid job class" do
|
25
|
-
assert_equal -1, Queue.item_ttl(class: 'InvalidJob')
|
26
|
-
end
|
27
|
-
|
28
|
-
it "is -1 for unique job" do
|
29
|
-
assert_equal -1, Queue.item_ttl(class: 'FakeUniqueJob')
|
30
|
-
end
|
31
|
-
|
32
|
-
it "is job TTL" do
|
33
|
-
assert_equal 300, UniqueJobWithTtl.ttl
|
34
|
-
assert_equal 300, Queue.item_ttl(class: 'UniqueJobWithTtl')
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
describe ".lock_after_execution_period" do
|
39
|
-
it "is 0 for non-unique job" do
|
40
|
-
assert_equal 0, Queue.lock_after_execution_period(class: 'FakeJob')
|
41
|
-
end
|
42
|
-
|
43
|
-
it "is 0 for invalid job class" do
|
44
|
-
assert_equal 0, Queue.lock_after_execution_period(class: 'InvalidJob')
|
45
|
-
end
|
46
|
-
|
47
|
-
it "is 0 for unique job" do
|
48
|
-
assert_equal 0, Queue.lock_after_execution_period(class: 'FakeUniqueJob')
|
49
|
-
end
|
50
|
-
|
51
|
-
it "is job lock period" do
|
52
|
-
assert_equal 150, UniqueJobWithLock.lock_after_execution_period
|
53
|
-
assert_equal 150, Queue.lock_after_execution_period(class: 'UniqueJobWithLock')
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
data/test/resque_test.rb
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class ResqueTest < MiniTest::Spec
|
4
|
-
before do
|
5
|
-
Resque.redis.flushall
|
6
|
-
end
|
7
|
-
|
8
|
-
it "is a valid plugin" do
|
9
|
-
Resque::Plugin.lint(Resque::Plugins::UniqueJob)
|
10
|
-
end
|
11
|
-
|
12
|
-
it "enqueues normal jobs" do
|
13
|
-
Resque.enqueue FakeJob, "x"
|
14
|
-
Resque.enqueue FakeJob, "x"
|
15
|
-
assert_equal 2, Resque.size(:normal)
|
16
|
-
end
|
17
|
-
|
18
|
-
it "is not able to report if a non-unique job was enqueued" do
|
19
|
-
assert_nil Resque.enqueued?(FakeJob)
|
20
|
-
end
|
21
|
-
|
22
|
-
it "does not raise when deleting an empty queue" do
|
23
|
-
Resque.remove_queue(:unique)
|
24
|
-
end
|
25
|
-
|
26
|
-
end
|
data/test/test_helper.rb
DELETED