resque-status 0.3.3 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +0 -2
- data/Gemfile.lock +9 -19
- data/README.rdoc +1 -1
- data/lib/resque/plugins/status.rb +34 -14
- data/lib/resque/plugins/status/hash.rb +24 -18
- data/lib/resque/server/views/status_styles.erb +2 -2
- data/lib/resque/server/views/statuses.erb +4 -1
- data/lib/resque/status_server.rb +5 -0
- data/resque-status.gemspec +3 -9
- data/test/test_helper.rb +1 -3
- data/test/test_resque_plugins_status.rb +62 -24
- data/test/test_resque_plugins_status_hash.rb +47 -32
- metadata +13 -25
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -2,42 +2,34 @@ GEM
|
|
2
2
|
remote: http://rubygems.org/
|
3
3
|
specs:
|
4
4
|
git (1.2.5)
|
5
|
-
jeweler (1.8.
|
5
|
+
jeweler (1.8.4)
|
6
6
|
bundler (~> 1.0)
|
7
7
|
git (>= 1.2.5)
|
8
8
|
rake
|
9
9
|
rdoc
|
10
|
-
json (1.
|
11
|
-
macaddr (1.5.0)
|
12
|
-
systemu (>= 2.4.0)
|
10
|
+
json (1.7.5)
|
13
11
|
mocha (0.9.12)
|
14
|
-
multi_json (1.
|
12
|
+
multi_json (1.3.6)
|
15
13
|
rack (1.4.1)
|
16
14
|
rack-protection (1.2.0)
|
17
15
|
rack
|
18
16
|
rake (0.9.2.2)
|
19
17
|
rdoc (3.12)
|
20
18
|
json (~> 1.4)
|
21
|
-
redis (
|
22
|
-
redis-namespace (1.
|
23
|
-
redis (
|
24
|
-
|
25
|
-
redis (>= 0.1.1)
|
26
|
-
redis-namespace (>= 0.1.0)
|
27
|
-
resque (1.19.0)
|
19
|
+
redis (3.0.2)
|
20
|
+
redis-namespace (1.2.1)
|
21
|
+
redis (~> 3.0.0)
|
22
|
+
resque (1.23.0)
|
28
23
|
multi_json (~> 1.0)
|
29
|
-
redis-namespace (~> 1.0
|
24
|
+
redis-namespace (~> 1.0)
|
30
25
|
sinatra (>= 0.9.2)
|
31
26
|
vegas (~> 0.1.2)
|
32
27
|
shoulda (2.10.3)
|
33
|
-
sinatra (1.3.
|
28
|
+
sinatra (1.3.3)
|
34
29
|
rack (~> 1.3, >= 1.3.6)
|
35
30
|
rack-protection (~> 1.2)
|
36
31
|
tilt (~> 1.3, >= 1.3.3)
|
37
|
-
systemu (2.4.2)
|
38
32
|
tilt (1.3.3)
|
39
|
-
uuid (2.3.5)
|
40
|
-
macaddr (~> 1.0)
|
41
33
|
vegas (0.1.11)
|
42
34
|
rack (>= 1.0.0)
|
43
35
|
|
@@ -47,7 +39,5 @@ PLATFORMS
|
|
47
39
|
DEPENDENCIES
|
48
40
|
jeweler
|
49
41
|
mocha (~> 0.9.8)
|
50
|
-
redisk (>= 0.2.1)
|
51
42
|
resque (~> 1.19)
|
52
43
|
shoulda (~> 2.10.2)
|
53
|
-
uuid (~> 2.3)
|
data/README.rdoc
CHANGED
@@ -119,7 +119,7 @@ A Status is actually just a hash, so inside a job you can do:
|
|
119
119
|
|
120
120
|
Also, all the status setting methods take any number of hash arguments. So you could do:
|
121
121
|
|
122
|
-
|
122
|
+
completed('filename' => '/myfilename')
|
123
123
|
|
124
124
|
=== Kill! Kill! Kill!
|
125
125
|
|
@@ -28,7 +28,7 @@ module Resque
|
|
28
28
|
# This job would iterate num times updating the status as it goes. At the end
|
29
29
|
# we update the status telling anyone listening to this job that its complete.
|
30
30
|
module Status
|
31
|
-
VERSION = '0.
|
31
|
+
VERSION = '0.4.0'
|
32
32
|
|
33
33
|
autoload :Hash, 'resque/plugins/status/hash'
|
34
34
|
|
@@ -76,7 +76,11 @@ module Resque
|
|
76
76
|
# job_id = ExampleJob.create(:num => 100)
|
77
77
|
#
|
78
78
|
def create(options = {})
|
79
|
-
|
79
|
+
if Resque.inline?
|
80
|
+
self.perform(nil, options)
|
81
|
+
else
|
82
|
+
self.enqueue(self, options)
|
83
|
+
end
|
80
84
|
end
|
81
85
|
|
82
86
|
# Adds a job of type <tt>klass<tt> to the queue with <tt>options<tt>.
|
@@ -84,15 +88,34 @@ module Resque
|
|
84
88
|
# Returns the UUID of the job if the job was queued, or nil if the job was
|
85
89
|
# rejected by a before_enqueue hook.
|
86
90
|
def enqueue(klass, options = {})
|
91
|
+
self.enqueue_to(Resque.queue_from_class(klass) || queue, klass, options)
|
92
|
+
end
|
93
|
+
|
94
|
+
# Adds a job of type <tt>klass<tt> to a specified queue with <tt>options<tt>.
|
95
|
+
#
|
96
|
+
# Returns the UUID of the job if the job was queued, or nil if the job was
|
97
|
+
# rejected by a before_enqueue hook.
|
98
|
+
def enqueue_to(queue, klass, options = {})
|
87
99
|
uuid = Resque::Plugins::Status::Hash.generate_uuid
|
88
|
-
|
89
|
-
|
100
|
+
Resque::Plugins::Status::Hash.create uuid, :options => options
|
101
|
+
|
102
|
+
if Resque.enqueue_to(queue, klass, uuid, options)
|
90
103
|
uuid
|
91
104
|
else
|
105
|
+
Resque::Plugins::Status::Hash.remove(uuid)
|
92
106
|
nil
|
93
107
|
end
|
94
108
|
end
|
95
109
|
|
110
|
+
# Removes a job of type <tt>klass<tt> from the queue.
|
111
|
+
#
|
112
|
+
# The initially given options are retrieved from the status hash.
|
113
|
+
# (Resque needs the options to find the correct queue entry)
|
114
|
+
def dequeue(klass, uuid)
|
115
|
+
status = Resque::Plugins::Status::Hash.get(uuid)
|
116
|
+
Resque.dequeue(klass, uuid, status.options)
|
117
|
+
end
|
118
|
+
|
96
119
|
# This is the method called by Resque::Worker when processing jobs. It
|
97
120
|
# creates a new instance of the job class and populates it with the uuid and
|
98
121
|
# options.
|
@@ -101,7 +124,11 @@ module Resque
|
|
101
124
|
def perform(uuid=nil, options = {})
|
102
125
|
uuid ||= Resque::Plugins::Status::Hash.generate_uuid
|
103
126
|
instance = new(uuid, options)
|
104
|
-
|
127
|
+
if Resque.inline?
|
128
|
+
instance.perform
|
129
|
+
else
|
130
|
+
instance.safe_perform!
|
131
|
+
end
|
105
132
|
instance
|
106
133
|
end
|
107
134
|
|
@@ -109,7 +136,7 @@ module Resque
|
|
109
136
|
# This is needed to be used with resque scheduler
|
110
137
|
# http://github.com/bvandenbos/resque-scheduler
|
111
138
|
def scheduled(queue, klass, *args)
|
112
|
-
|
139
|
+
self.enqueue_to(queue, self, *args)
|
113
140
|
end
|
114
141
|
end
|
115
142
|
|
@@ -126,7 +153,7 @@ module Resque
|
|
126
153
|
def safe_perform!
|
127
154
|
set_status({'status' => 'working'})
|
128
155
|
perform
|
129
|
-
if status.failed?
|
156
|
+
if status && status.failed?
|
130
157
|
on_failure(status.message) if respond_to?(:on_failure)
|
131
158
|
return
|
132
159
|
elsif status && !status.completed?
|
@@ -134,11 +161,9 @@ module Resque
|
|
134
161
|
end
|
135
162
|
on_success if respond_to?(:on_success)
|
136
163
|
rescue Killed
|
137
|
-
logger.info "Job #{self} Killed at #{Time.now}"
|
138
164
|
Resque::Plugins::Status::Hash.killed(uuid)
|
139
165
|
on_killed if respond_to?(:on_killed)
|
140
166
|
rescue => e
|
141
|
-
logger.error e
|
142
167
|
failed("The task failed because of an error: #{e}")
|
143
168
|
if respond_to?(:on_failure)
|
144
169
|
on_failure(e)
|
@@ -147,11 +172,6 @@ module Resque
|
|
147
172
|
end
|
148
173
|
end
|
149
174
|
|
150
|
-
# Returns a Redisk::Logger object scoped to this paticular job/uuid
|
151
|
-
def logger
|
152
|
-
@logger ||= Resque::Plugins::Status::Hash.logger(uuid)
|
153
|
-
end
|
154
|
-
|
155
175
|
# Set the jobs status. Can take an array of strings or hashes that are merged
|
156
176
|
# (in order) into a final status hash.
|
157
177
|
def status=(new_status)
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'securerandom'
|
2
|
+
|
1
3
|
module Resque
|
2
4
|
module Plugins
|
3
5
|
module Status
|
@@ -24,7 +26,17 @@ module Resque
|
|
24
26
|
val ? Resque::Plugins::Status::Hash.new(uuid, decode(val)) : nil
|
25
27
|
end
|
26
28
|
|
27
|
-
#
|
29
|
+
# Get multiple statuses by UUID. Returns array of Resque::Plugins::Status::Hash
|
30
|
+
def self.mget(uuids)
|
31
|
+
status_keys = uuids.map{|u| status_key(u)}
|
32
|
+
vals = redis.mget(*status_keys)
|
33
|
+
|
34
|
+
uuids.zip(vals).map do |uuid, val|
|
35
|
+
val ? Resque::Plugins::Status::Hash.new(uuid, decode(val)) : nil
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
# set a status by UUID. <tt>messages</tt> can be any number of strings or hashes
|
28
40
|
# that are merged in order to create a single status.
|
29
41
|
def self.set(uuid, *messages)
|
30
42
|
val = Resque::Plugins::Status::Hash.new(uuid, *messages)
|
@@ -42,7 +54,7 @@ module Resque
|
|
42
54
|
remove(id)
|
43
55
|
end
|
44
56
|
end
|
45
|
-
|
57
|
+
|
46
58
|
def self.clear_completed(range_start = nil, range_end = nil)
|
47
59
|
status_ids(range_start, range_end).select do |id|
|
48
60
|
get(id).completed?
|
@@ -50,20 +62,19 @@ module Resque
|
|
50
62
|
remove(id)
|
51
63
|
end
|
52
64
|
end
|
53
|
-
|
65
|
+
|
66
|
+
def self.clear_failed(range_start = nil, range_end = nil)
|
67
|
+
status_ids(range_start, range_end).select do |id|
|
68
|
+
get(id).failed?
|
69
|
+
end.each do |id|
|
70
|
+
remove(id)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
54
74
|
def self.remove(uuid)
|
55
75
|
redis.del(status_key(uuid))
|
56
76
|
redis.zrem(set_key, uuid)
|
57
77
|
end
|
58
|
-
# returns a Redisk::Logger scoped to the UUID. Any options passed are passed
|
59
|
-
# to the logger initialization.
|
60
|
-
#
|
61
|
-
# Ensures that Redisk is logging to the same Redis connection as Resque.
|
62
|
-
def self.logger(uuid, options = {})
|
63
|
-
require 'redisk' unless defined?(Redisk)
|
64
|
-
Redisk.redis = redis
|
65
|
-
Redisk::Logger.new(logger_key(uuid), options)
|
66
|
-
end
|
67
78
|
|
68
79
|
def self.count
|
69
80
|
redis.zcard(set_key)
|
@@ -155,13 +166,8 @@ module Resque
|
|
155
166
|
"_kill"
|
156
167
|
end
|
157
168
|
|
158
|
-
def self.logger_key(uuid)
|
159
|
-
"_log:#{uuid}"
|
160
|
-
end
|
161
|
-
|
162
169
|
def self.generate_uuid
|
163
|
-
|
164
|
-
UUID.generate(:compact)
|
170
|
+
SecureRandom.hex.to_s
|
165
171
|
end
|
166
172
|
|
167
173
|
def self.hash_accessor(name, options = {})
|
@@ -8,6 +8,9 @@
|
|
8
8
|
<form method="POST" action="<%= u(:statuses) %>/clear/completed" class='clear-failed'>
|
9
9
|
<input type='submit' name='' value='Clear Completed Statuses' onclick='return confirm("Are you absolutely sure? This cannot be undone.");' />
|
10
10
|
</form>
|
11
|
+
<form method="POST" action="<%= u(:statuses) %>/clear/failed" class='clear-failed'>
|
12
|
+
<input type='submit' name='' value='Clear Failed Statuses' onclick='return confirm("Are you absolutely sure? This cannot be undone.");' />
|
13
|
+
</form>
|
11
14
|
<%end%>
|
12
15
|
<p class='intro'>These are recent jobs created with the Resque::Plugins::Status class</p>
|
13
16
|
<table>
|
@@ -26,7 +29,7 @@
|
|
26
29
|
<td><a href="<%= u(:statuses) %>/<%= status.uuid %>"><%= status.uuid %></a></td>
|
27
30
|
<td><%= status.name %></td>
|
28
31
|
<td class="status status-<%= status.status %>"><%= status.status %></td>
|
29
|
-
<td class="time"><%= status.time %></td>
|
32
|
+
<td class="time"><%= status.time.strftime("%Y/%m/%d %H:%M:%S %z") %></td>
|
30
33
|
<td class="progress">
|
31
34
|
<div class="progress-bar" style="width:<%= status.pct_complete %>%"> </div>
|
32
35
|
<div class="progress-pct"><%= status.pct_complete ? "#{status.pct_complete}%" : '' %></div>
|
data/lib/resque/status_server.rb
CHANGED
data/resque-status.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = "resque-status"
|
8
|
-
s.version = "0.
|
8
|
+
s.version = "0.4.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Aaron Quint"]
|
12
|
-
s.date = "2012-
|
12
|
+
s.date = "2012-10-21"
|
13
13
|
s.description = "resque-status is an extension to the resque queue system that provides simple trackable jobs. It provides a Resque::Plugins::Status::Hash class which can set/get the statuses of jobs and a Resque::Plugins::Status class that when included provides easily trackable/killable jobs."
|
14
14
|
s.email = "aaron@quirkey.com"
|
15
15
|
s.extra_rdoc_files = [
|
@@ -43,27 +43,21 @@ Gem::Specification.new do |s|
|
|
43
43
|
s.homepage = "http://github.com/quirkey/resque-status"
|
44
44
|
s.require_paths = ["lib"]
|
45
45
|
s.rubyforge_project = "quirkey"
|
46
|
-
s.rubygems_version = "1.8.
|
46
|
+
s.rubygems_version = "1.8.23"
|
47
47
|
s.summary = "resque-status is an extension to the resque queue system that provides simple trackable jobs."
|
48
48
|
|
49
49
|
if s.respond_to? :specification_version then
|
50
50
|
s.specification_version = 3
|
51
51
|
|
52
52
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
53
|
-
s.add_runtime_dependency(%q<redisk>, [">= 0.2.1"])
|
54
53
|
s.add_runtime_dependency(%q<resque>, ["~> 1.19"])
|
55
|
-
s.add_runtime_dependency(%q<uuid>, ["~> 2.3"])
|
56
54
|
s.add_development_dependency(%q<jeweler>, [">= 0"])
|
57
55
|
else
|
58
|
-
s.add_dependency(%q<redisk>, [">= 0.2.1"])
|
59
56
|
s.add_dependency(%q<resque>, ["~> 1.19"])
|
60
|
-
s.add_dependency(%q<uuid>, ["~> 2.3"])
|
61
57
|
s.add_dependency(%q<jeweler>, [">= 0"])
|
62
58
|
end
|
63
59
|
else
|
64
|
-
s.add_dependency(%q<redisk>, [">= 0.2.1"])
|
65
60
|
s.add_dependency(%q<resque>, ["~> 1.19"])
|
66
|
-
s.add_dependency(%q<uuid>, ["~> 2.3"])
|
67
61
|
s.add_dependency(%q<jeweler>, [">= 0"])
|
68
62
|
end
|
69
63
|
end
|
data/test/test_helper.rb
CHANGED
@@ -4,7 +4,6 @@ $TESTING = true
|
|
4
4
|
require 'test/unit'
|
5
5
|
require 'rubygems'
|
6
6
|
require 'shoulda'
|
7
|
-
require 'redisk'
|
8
7
|
require 'mocha'
|
9
8
|
|
10
9
|
require 'resque-status'
|
@@ -38,15 +37,14 @@ at_exit do
|
|
38
37
|
|
39
38
|
pid = `ps -e -o pid,command | grep [r]edis-test`.split(" ")[0]
|
40
39
|
puts "Killing test redis server..."
|
41
|
-
`rm -f #{dir}/dump.rdb`
|
42
40
|
Process.kill("KILL", pid.to_i)
|
41
|
+
`rm -f #{dir}/dump.rdb`
|
43
42
|
exit exit_code
|
44
43
|
end
|
45
44
|
|
46
45
|
puts "Starting redis for testing at localhost:9736..."
|
47
46
|
`redis-server #{dir}/redis-test.conf`
|
48
47
|
Resque.redis = 'localhost:9736/1'
|
49
|
-
Redisk.redis = 'localhost:9736/1'
|
50
48
|
|
51
49
|
#### Fixtures
|
52
50
|
|
@@ -8,28 +8,45 @@ class TestResquePluginsStatus < Test::Unit::TestCase
|
|
8
8
|
end
|
9
9
|
|
10
10
|
context ".create" do
|
11
|
-
|
12
|
-
|
13
|
-
|
11
|
+
context "not inline" do
|
12
|
+
setup do
|
13
|
+
@uuid = WorkingJob.create('num' => 100)
|
14
|
+
end
|
14
15
|
|
15
|
-
|
16
|
-
|
17
|
-
|
16
|
+
should "add the job to the queue" do
|
17
|
+
assert_equal 1, Resque.size(:statused)
|
18
|
+
end
|
18
19
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
20
|
+
should "set the queued object to the current class" do
|
21
|
+
job = Resque.pop(:statused)
|
22
|
+
assert_equal @uuid, job['args'].first
|
23
|
+
assert_equal "WorkingJob", job['class']
|
24
|
+
end
|
24
25
|
|
25
|
-
|
26
|
-
|
27
|
-
|
26
|
+
should "add the uuid to the statuses" do
|
27
|
+
assert_contains Resque::Plugins::Status::Hash.status_ids, @uuid
|
28
|
+
end
|
28
29
|
|
29
|
-
|
30
|
-
|
30
|
+
should "return a UUID" do
|
31
|
+
assert_match(/^\w{32}$/, @uuid)
|
32
|
+
end
|
31
33
|
end
|
32
34
|
|
35
|
+
context "inline" do
|
36
|
+
setup do
|
37
|
+
Resque.stubs(:inline?).returns(true)
|
38
|
+
end
|
39
|
+
|
40
|
+
should "not queue a job" do
|
41
|
+
@uuid = WorkingJob.create('num' => 100)
|
42
|
+
assert_equal 0, Resque.size(:statused)
|
43
|
+
end
|
44
|
+
|
45
|
+
should "call perform" do
|
46
|
+
WorkingJob.any_instance.expects(:perform).once
|
47
|
+
@uuid = WorkingJob.create('num' => 100)
|
48
|
+
end
|
49
|
+
end
|
33
50
|
end
|
34
51
|
|
35
52
|
context ".create with a failing before_enqueue hook" do
|
@@ -59,17 +76,23 @@ class TestResquePluginsStatus < Test::Unit::TestCase
|
|
59
76
|
end
|
60
77
|
|
61
78
|
should "create the job with the provided arguments" do
|
62
|
-
|
63
|
-
job = Resque.pop(:statused)
|
64
|
-
|
79
|
+
job = Resque.pop(:queue_name)
|
65
80
|
assert_equal @job_args, job['args'].last
|
66
81
|
end
|
67
82
|
end
|
68
83
|
|
69
84
|
context ".enqueue" do
|
70
|
-
|
85
|
+
should "delegate to enqueue_to, filling in the queue from the class" do
|
71
86
|
@uuid = BasicJob.enqueue(WorkingJob, :num => 100)
|
72
87
|
@payload = Resque.pop(:statused)
|
88
|
+
assert_equal "WorkingJob", @payload['class']
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
context ".enqueue_to" do
|
93
|
+
setup do
|
94
|
+
@uuid = BasicJob.enqueue_to(:new_queue, WorkingJob, :num => 100)
|
95
|
+
@payload = Resque.pop(:new_queue)
|
73
96
|
end
|
74
97
|
|
75
98
|
should "add the job with the specific class to the queue" do
|
@@ -90,6 +113,23 @@ class TestResquePluginsStatus < Test::Unit::TestCase
|
|
90
113
|
|
91
114
|
end
|
92
115
|
|
116
|
+
context ".dequeue" do
|
117
|
+
setup do
|
118
|
+
@uuid1 = BasicJob.enqueue(WorkingJob, :num => 100)
|
119
|
+
@uuid2 = BasicJob.enqueue(WorkingJob, :num => 100)
|
120
|
+
end
|
121
|
+
|
122
|
+
should "dequeue the job with the uuid from the correct queue" do
|
123
|
+
size = Resque.size(:statused)
|
124
|
+
BasicJob.dequeue(WorkingJob, @uuid2)
|
125
|
+
assert_equal size-1, Resque.size(:statused)
|
126
|
+
end
|
127
|
+
should "not dequeue any jobs with different uuids for same class name" do
|
128
|
+
BasicJob.dequeue(WorkingJob, @uuid2)
|
129
|
+
assert_equal @uuid1, Resque.pop(:statused)['args'].first
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
93
133
|
context ".perform" do
|
94
134
|
setup do
|
95
135
|
@uuid = WorkingJob.create(:num => 100)
|
@@ -183,8 +223,7 @@ class TestResquePluginsStatus < Test::Unit::TestCase
|
|
183
223
|
@performed = KillableJob.perform(*@payload1['args'])
|
184
224
|
@performed = KillableJob.perform(*@payload2['args'])
|
185
225
|
|
186
|
-
@status1 = Resque::Plugins::Status::Hash.
|
187
|
-
@status2 = Resque::Plugins::Status::Hash.get(@uuid2)
|
226
|
+
@status1, @status2 = Resque::Plugins::Status::Hash.mget([@uuid1, @uuid2])
|
188
227
|
end
|
189
228
|
|
190
229
|
should "set the status to killed" do
|
@@ -225,8 +264,7 @@ class TestResquePluginsStatus < Test::Unit::TestCase
|
|
225
264
|
@performed = KillableJob.perform(*@payload1['args'])
|
226
265
|
@performed = KillableJob.perform(*@payload2['args'])
|
227
266
|
|
228
|
-
@status1 = Resque::Plugins::Status::Hash.
|
229
|
-
@status2 = Resque::Plugins::Status::Hash.get(@uuid2)
|
267
|
+
@status1, @status2 = Resque::Plugins::Status::Hash.mget([@uuid1, @uuid2])
|
230
268
|
end
|
231
269
|
|
232
270
|
should "set the status to killed" do
|
@@ -18,8 +18,8 @@ class TestResquePluginsStatusHash < Test::Unit::TestCase
|
|
18
18
|
assert_equal 'my status', status.message
|
19
19
|
end
|
20
20
|
|
21
|
-
should "return
|
22
|
-
|
21
|
+
should "return nil if the status is not set" do
|
22
|
+
assert_nil Resque::Plugins::Status::Hash.get('invalid_uuid')
|
23
23
|
end
|
24
24
|
|
25
25
|
should "decode encoded json" do
|
@@ -27,6 +27,30 @@ class TestResquePluginsStatusHash < Test::Unit::TestCase
|
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
|
+
context ".mget" do
|
31
|
+
should "return statuses as array of Resque::Plugins::Status::Hash for the uuids" do
|
32
|
+
uuid2 = Resque::Plugins::Status::Hash.create(Resque::Plugins::Status::Hash.generate_uuid)
|
33
|
+
Resque::Plugins::Status::Hash.set(uuid2, "my status2")
|
34
|
+
statuses = Resque::Plugins::Status::Hash.mget([@uuid, uuid2])
|
35
|
+
assert_equal 2, statuses.size
|
36
|
+
assert statuses.all?{|s| s.is_a?(Resque::Plugins::Status::Hash) }
|
37
|
+
assert_equal ['my status', 'my status2'], statuses.map(&:message)
|
38
|
+
end
|
39
|
+
|
40
|
+
should "return nil if a status is not set" do
|
41
|
+
statuses = Resque::Plugins::Status::Hash.mget(['invalid_uuid', @uuid])
|
42
|
+
assert_equal 2, statuses.size
|
43
|
+
assert_nil statuses[0]
|
44
|
+
assert statuses[1].is_a?(Resque::Plugins::Status::Hash)
|
45
|
+
assert_equal 'my status', statuses[1].message
|
46
|
+
end
|
47
|
+
|
48
|
+
should "decode encoded json" do
|
49
|
+
assert_equal ['json'],
|
50
|
+
Resque::Plugins::Status::Hash.mget([@uuid_with_json]).map{|h| h['im']}
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
30
54
|
context ".set" do
|
31
55
|
|
32
56
|
should "set the status for the uuid" do
|
@@ -100,22 +124,39 @@ class TestResquePluginsStatusHash < Test::Unit::TestCase
|
|
100
124
|
@not_completed_status_id = Resque::Plugins::Status::Hash.create(Resque::Plugins::Status::Hash.generate_uuid)
|
101
125
|
Resque::Plugins::Status::Hash.clear_completed
|
102
126
|
end
|
103
|
-
|
127
|
+
|
104
128
|
should "clear completed status" do
|
105
129
|
assert_nil Resque::Plugins::Status::Hash.get(@completed_status_id)
|
106
130
|
end
|
107
|
-
|
131
|
+
|
108
132
|
should "not clear not-completed status" do
|
109
133
|
status = Resque::Plugins::Status::Hash.get(@not_completed_status_id)
|
110
134
|
assert status.is_a?(Resque::Plugins::Status::Hash)
|
111
135
|
end
|
112
136
|
end
|
113
|
-
|
137
|
+
|
138
|
+
context ".clear_failed" do
|
139
|
+
setup do
|
140
|
+
@failed_status_id = Resque::Plugins::Status::Hash.create(Resque::Plugins::Status::Hash.generate_uuid, {'status' => "failed"})
|
141
|
+
@not_failed_status_id = Resque::Plugins::Status::Hash.create(Resque::Plugins::Status::Hash.generate_uuid)
|
142
|
+
Resque::Plugins::Status::Hash.clear_failed
|
143
|
+
end
|
144
|
+
|
145
|
+
should "clear failed status" do
|
146
|
+
assert_nil Resque::Plugins::Status::Hash.get(@failed_status_id)
|
147
|
+
end
|
148
|
+
|
149
|
+
should "not clear not-failed status" do
|
150
|
+
status = Resque::Plugins::Status::Hash.get(@not_failed_status_id)
|
151
|
+
assert status.is_a?(Resque::Plugins::Status::Hash)
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
114
155
|
context ".remove" do
|
115
156
|
setup do
|
116
157
|
Resque::Plugins::Status::Hash.remove(@uuid)
|
117
158
|
end
|
118
|
-
|
159
|
+
|
119
160
|
should "clear specify status" do
|
120
161
|
assert_nil Resque::Plugins::Status::Hash.get(@uuid)
|
121
162
|
end
|
@@ -149,32 +190,6 @@ class TestResquePluginsStatusHash < Test::Unit::TestCase
|
|
149
190
|
end
|
150
191
|
|
151
192
|
end
|
152
|
-
|
153
|
-
# context ".count" do
|
154
|
-
#
|
155
|
-
# should "return a count of statuses" do
|
156
|
-
# statuses = Resque::Plugins::Status::Hash.statuses
|
157
|
-
# assert_equal 2, statuses.size
|
158
|
-
# assert_equal statuses.size, Resque::Plugins::Status::Hash.count
|
159
|
-
# end
|
160
|
-
#
|
161
|
-
# end
|
162
|
-
|
163
|
-
context ".logger" do
|
164
|
-
setup do
|
165
|
-
@logger = Resque::Plugins::Status::Hash.logger(@uuid)
|
166
|
-
end
|
167
|
-
|
168
|
-
should "return a redisk logger" do
|
169
|
-
assert @logger.is_a?(Redisk::Logger)
|
170
|
-
end
|
171
|
-
|
172
|
-
should "scope the logger to a key" do
|
173
|
-
assert_match(/#{@uuid}/, @logger.name)
|
174
|
-
end
|
175
|
-
|
176
|
-
end
|
177
|
-
|
178
193
|
end
|
179
194
|
|
180
195
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: resque-status
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,22 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-10-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
|
-
- !ruby/object:Gem::Dependency
|
15
|
-
name: redisk
|
16
|
-
requirement: &70186170509920 !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
|
-
requirements:
|
19
|
-
- - ! '>='
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
version: 0.2.1
|
22
|
-
type: :runtime
|
23
|
-
prerelease: false
|
24
|
-
version_requirements: *70186170509920
|
25
14
|
- !ruby/object:Gem::Dependency
|
26
15
|
name: resque
|
27
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
28
17
|
none: false
|
29
18
|
requirements:
|
30
19
|
- - ~>
|
@@ -32,21 +21,15 @@ dependencies:
|
|
32
21
|
version: '1.19'
|
33
22
|
type: :runtime
|
34
23
|
prerelease: false
|
35
|
-
version_requirements:
|
36
|
-
- !ruby/object:Gem::Dependency
|
37
|
-
name: uuid
|
38
|
-
requirement: &70186170508780 !ruby/object:Gem::Requirement
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
39
25
|
none: false
|
40
26
|
requirements:
|
41
27
|
- - ~>
|
42
28
|
- !ruby/object:Gem::Version
|
43
|
-
version: '
|
44
|
-
type: :runtime
|
45
|
-
prerelease: false
|
46
|
-
version_requirements: *70186170508780
|
29
|
+
version: '1.19'
|
47
30
|
- !ruby/object:Gem::Dependency
|
48
31
|
name: jeweler
|
49
|
-
requirement:
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
50
33
|
none: false
|
51
34
|
requirements:
|
52
35
|
- - ! '>='
|
@@ -54,7 +37,12 @@ dependencies:
|
|
54
37
|
version: '0'
|
55
38
|
type: :development
|
56
39
|
prerelease: false
|
57
|
-
version_requirements:
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
58
46
|
description: resque-status is an extension to the resque queue system that provides
|
59
47
|
simple trackable jobs. It provides a Resque::Plugins::Status::Hash class which can
|
60
48
|
set/get the statuses of jobs and a Resque::Plugins::Status class that when included
|
@@ -108,7 +96,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
108
96
|
version: '0'
|
109
97
|
requirements: []
|
110
98
|
rubyforge_project: quirkey
|
111
|
-
rubygems_version: 1.8.
|
99
|
+
rubygems_version: 1.8.23
|
112
100
|
signing_key:
|
113
101
|
specification_version: 3
|
114
102
|
summary: resque-status is an extension to the resque queue system that provides simple
|