resque 1.13.0 → 1.14.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of resque might be problematic. Click here for more details.
- data/HISTORY.md +13 -0
- data/README.markdown +5 -0
- data/Rakefile +13 -6
- data/lib/resque.rb +32 -0
- data/lib/resque/failure.rb +4 -0
- data/lib/resque/failure/base.rb +3 -0
- data/lib/resque/failure/hoptoad.rb +1 -0
- data/lib/resque/failure/redis.rb +6 -0
- data/lib/resque/helpers.rb +6 -2
- data/lib/resque/job.rb +5 -11
- data/lib/resque/server.rb +12 -7
- data/lib/resque/server/public/ranger.js +6 -0
- data/lib/resque/server/public/style.css +5 -1
- data/lib/resque/server/views/failed.erb +17 -7
- data/lib/resque/server/views/queues.erb +2 -2
- data/lib/resque/server/views/workers.erb +2 -2
- data/lib/resque/tasks.rb +1 -1
- data/lib/resque/version.rb +1 -1
- data/lib/resque/worker.rb +10 -9
- data/test/job_hooks_test.rb +3 -2
- data/test/job_plugins_test.rb +7 -7
- data/test/plugin_test.rb +1 -1
- data/test/resque-web_test.rb +1 -1
- data/test/resque_test.rb +22 -4
- data/test/test_helper.rb +15 -0
- data/test/worker_test.rb +15 -2
- metadata +4 -4
data/HISTORY.md
CHANGED
@@ -1,3 +1,16 @@
|
|
1
|
+
## 1.14.0 (2011-03-17)
|
2
|
+
|
3
|
+
* Sleep interval can now be a float
|
4
|
+
* Added Resque.inline to allow in-process performing of jobs (for testing)
|
5
|
+
* Fixed tests for Ruby 1.9.2
|
6
|
+
* Added Resque.validate(klass) to validate a Job
|
7
|
+
* Decode errors are no longer ignored to help debugging
|
8
|
+
* Web: Sinatra 1.2 compatibility
|
9
|
+
* Fixed after_enqueue hook to actually run in `Resque.enqueue`
|
10
|
+
* Fixed very_verbose timestamps to use 24 hour time (AM/PM wasn't included)
|
11
|
+
* Fixed monit example
|
12
|
+
* Fixed Worker#pid
|
13
|
+
|
1
14
|
## 1.13.0 (2011-02-07)
|
2
15
|
|
3
16
|
* Depend on redis-namespace >= 0.10
|
data/README.markdown
CHANGED
@@ -662,6 +662,11 @@ this way we can tell our Sinatra app about the config file:
|
|
662
662
|
|
663
663
|
Now everyone is on the same page.
|
664
664
|
|
665
|
+
Also, you could disable jobs queueing by setting 'inline' attribute.
|
666
|
+
For example, if you want to run all jobs in the same process for cucumber, try:
|
667
|
+
|
668
|
+
Resque.inline = ENV['RAILS_ENV'] == "cucumber"
|
669
|
+
|
665
670
|
|
666
671
|
Plugins and Hooks
|
667
672
|
-----------------
|
data/Rakefile
CHANGED
@@ -3,7 +3,6 @@
|
|
3
3
|
#
|
4
4
|
|
5
5
|
load 'tasks/redis.rake'
|
6
|
-
require 'rake/testtask'
|
7
6
|
|
8
7
|
$LOAD_PATH.unshift 'lib'
|
9
8
|
require 'resque/tasks'
|
@@ -17,14 +16,22 @@ end
|
|
17
16
|
# Tests
|
18
17
|
#
|
19
18
|
|
19
|
+
require 'rake/testtask'
|
20
|
+
|
20
21
|
task :default => :test
|
21
22
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
23
|
+
if command?(:rg)
|
24
|
+
desc "Run the test suite with rg"
|
25
|
+
task :test do
|
26
|
+
Dir['test/**/*_test.rb'].each do |f|
|
27
|
+
sh("rg #{f}")
|
28
|
+
end
|
27
29
|
end
|
30
|
+
else
|
31
|
+
Rake::TestTask.new do |test|
|
32
|
+
test.libs << "test"
|
33
|
+
test.test_files = FileList['test/**/*_test.rb']
|
34
|
+
end
|
28
35
|
end
|
29
36
|
|
30
37
|
if command? :kicker
|
data/lib/resque.rb
CHANGED
@@ -118,6 +118,17 @@ module Resque
|
|
118
118
|
"Resque Client connected to #{redis_id}"
|
119
119
|
end
|
120
120
|
|
121
|
+
# If 'inline' is true Resque will call #perform method inline
|
122
|
+
# without queuing it into Redis and without any Resque callbacks.
|
123
|
+
# The 'inline' is false Resque jobs will be put in queue regularly.
|
124
|
+
def inline?
|
125
|
+
@inline
|
126
|
+
end
|
127
|
+
alias_method :inline, :inline?
|
128
|
+
|
129
|
+
def inline=(inline)
|
130
|
+
@inline = inline
|
131
|
+
end
|
121
132
|
|
122
133
|
#
|
123
134
|
# queue manipulation
|
@@ -204,6 +215,10 @@ module Resque
|
|
204
215
|
# This method is considered part of the `stable` API.
|
205
216
|
def enqueue(klass, *args)
|
206
217
|
Job.create(queue_from_class(klass), klass, *args)
|
218
|
+
|
219
|
+
Plugin.after_enqueue_hooks(klass).each do |hook|
|
220
|
+
klass.send(hook, *args)
|
221
|
+
end
|
207
222
|
end
|
208
223
|
|
209
224
|
# This method can be used to conveniently remove a job from a queue.
|
@@ -253,6 +268,23 @@ module Resque
|
|
253
268
|
Job.reserve(queue)
|
254
269
|
end
|
255
270
|
|
271
|
+
# Validates if the given klass could be a valid Resque job
|
272
|
+
#
|
273
|
+
# If no queue can be inferred this method will raise a `Resque::NoQueueError`
|
274
|
+
#
|
275
|
+
# If given klass is nil this method will raise a `Resque::NoClassError`
|
276
|
+
def validate(klass, queue = nil)
|
277
|
+
queue ||= queue_from_class(klass)
|
278
|
+
|
279
|
+
if !queue
|
280
|
+
raise NoQueueError.new("Jobs must be placed onto a queue.")
|
281
|
+
end
|
282
|
+
|
283
|
+
if klass.to_s.empty?
|
284
|
+
raise NoClassError.new("Jobs must be given a class.")
|
285
|
+
end
|
286
|
+
end
|
287
|
+
|
256
288
|
|
257
289
|
#
|
258
290
|
# worker shortcuts
|
data/lib/resque/failure.rb
CHANGED
data/lib/resque/failure/base.rb
CHANGED
data/lib/resque/failure/redis.rb
CHANGED
@@ -35,6 +35,12 @@ module Resque
|
|
35
35
|
Resque.redis.lset(:failed, index, Resque.encode(item))
|
36
36
|
Job.create(item['queue'], item['payload']['class'], *item['payload']['args'])
|
37
37
|
end
|
38
|
+
|
39
|
+
def self.remove(index)
|
40
|
+
id = rand(0xffffff)
|
41
|
+
Resque.redis.lset(:failed, index, id)
|
42
|
+
Resque.redis.lrem(:failed, 1, id)
|
43
|
+
end
|
38
44
|
end
|
39
45
|
end
|
40
46
|
end
|
data/lib/resque/helpers.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
module Resque
|
2
2
|
# Methods used by various classes in Resque.
|
3
3
|
module Helpers
|
4
|
+
class DecodeException < StandardError; end
|
5
|
+
|
4
6
|
# Direct access to the Redis instance.
|
5
7
|
def redis
|
6
8
|
Resque.redis
|
@@ -23,12 +25,14 @@ module Resque
|
|
23
25
|
if defined? Yajl
|
24
26
|
begin
|
25
27
|
Yajl::Parser.parse(object, :check_utf8 => false)
|
26
|
-
rescue Yajl::ParseError
|
28
|
+
rescue Yajl::ParseError => e
|
29
|
+
raise DecodeException, e
|
27
30
|
end
|
28
31
|
else
|
29
32
|
begin
|
30
33
|
JSON.parse(object)
|
31
|
-
rescue JSON::ParserError
|
34
|
+
rescue JSON::ParserError => e
|
35
|
+
raise DecodeException, e
|
32
36
|
end
|
33
37
|
end
|
34
38
|
end
|
data/lib/resque/job.rb
CHANGED
@@ -40,19 +40,13 @@ module Resque
|
|
40
40
|
#
|
41
41
|
# Raises an exception if no queue or class is given.
|
42
42
|
def self.create(queue, klass, *args)
|
43
|
-
|
44
|
-
raise NoQueueError.new("Jobs must be placed onto a queue.")
|
45
|
-
end
|
46
|
-
|
47
|
-
if klass.to_s.empty?
|
48
|
-
raise NoClassError.new("Jobs must be given a class.")
|
49
|
-
end
|
43
|
+
Resque.validate(klass, queue)
|
50
44
|
|
51
|
-
|
52
|
-
|
53
|
-
|
45
|
+
if Resque.inline?
|
46
|
+
constantize(klass).perform(*decode(encode(args)))
|
47
|
+
else
|
48
|
+
Resque.push(queue, :class => klass.to_s, :args => args)
|
54
49
|
end
|
55
|
-
ret
|
56
50
|
end
|
57
51
|
|
58
52
|
# Removes a job from a queue. Expects a string queue name, a
|
data/lib/resque/server.rb
CHANGED
@@ -16,17 +16,17 @@ module Resque
|
|
16
16
|
alias_method :h, :escape_html
|
17
17
|
|
18
18
|
def current_section
|
19
|
-
|
19
|
+
url_path request.path_info.sub('/','').split('/')[0].downcase
|
20
20
|
end
|
21
21
|
|
22
22
|
def current_page
|
23
|
-
|
23
|
+
url_path request.path_info.sub('/','')
|
24
24
|
end
|
25
25
|
|
26
|
-
def
|
26
|
+
def url_path(*path_parts)
|
27
27
|
[ path_prefix, path_parts ].join("/").squeeze('/')
|
28
28
|
end
|
29
|
-
alias_method :u, :
|
29
|
+
alias_method :u, :url_path
|
30
30
|
|
31
31
|
def path_prefix
|
32
32
|
request.env['SCRIPT_NAME']
|
@@ -38,7 +38,7 @@ module Resque
|
|
38
38
|
|
39
39
|
def tab(name)
|
40
40
|
dname = name.to_s.downcase
|
41
|
-
path =
|
41
|
+
path = url_path(dname)
|
42
42
|
"<li #{class_if_current(path)}><a href='#{path}'>#{name}</a></li>"
|
43
43
|
end
|
44
44
|
|
@@ -127,7 +127,7 @@ module Resque
|
|
127
127
|
|
128
128
|
# to make things easier on ourselves
|
129
129
|
get "/?" do
|
130
|
-
redirect
|
130
|
+
redirect url_path(:overview)
|
131
131
|
end
|
132
132
|
|
133
133
|
%w( overview queues working workers key ).each do |page|
|
@@ -175,8 +175,13 @@ module Resque
|
|
175
175
|
end
|
176
176
|
end
|
177
177
|
|
178
|
+
get "/failed/remove/:index" do
|
179
|
+
Resque::Failure.remove(params[:index])
|
180
|
+
redirect u('failed')
|
181
|
+
end
|
182
|
+
|
178
183
|
get "/stats" do
|
179
|
-
redirect
|
184
|
+
redirect url_path("/stats/resque")
|
180
185
|
end
|
181
186
|
|
182
187
|
get "/stats/:id" do
|
@@ -50,6 +50,12 @@ $(function() {
|
|
50
50
|
return false
|
51
51
|
})
|
52
52
|
|
53
|
+
$('ul.failed li').hover(function() {
|
54
|
+
$(this).addClass('hover');
|
55
|
+
}, function() {
|
56
|
+
$(this).removeClass('hover');
|
57
|
+
})
|
58
|
+
|
53
59
|
$('ul.failed a[rel=retry]').click(function() {
|
54
60
|
var href = $(this).attr('href');
|
55
61
|
$(this).text('Retrying...');
|
@@ -67,7 +67,11 @@ body { padding:0; margin:0; }
|
|
67
67
|
#main ul.failed li {background:-webkit-gradient(linear, left top, left bottom, from(#efefef), to(#fff)) #efefef; margin-top:10px; padding:10px; overflow:hidden; -webkit-border-radius:5px; border:1px solid #ccc; }
|
68
68
|
#main ul.failed li dl dt {font-size:80%; color:#999; width:60px; float:left; padding-top:1px; text-align:right;}
|
69
69
|
#main ul.failed li dl dd {margin-bottom:10px; margin-left:70px;}
|
70
|
-
#main ul.failed li dl dd .
|
70
|
+
#main ul.failed li dl dd .retried { float:right; text-align: right; }
|
71
|
+
#main ul.failed li dl dd .retried .remove { display:none; margin-top: 8px; }
|
72
|
+
#main ul.failed li.hover dl dd .retried .remove { display:block; }
|
73
|
+
#main ul.failed li dl dd .controls { display:none; float:right; }
|
74
|
+
#main ul.failed li.hover dl dd .controls { display:block; }
|
71
75
|
#main ul.failed li dl dd code, #main ul.failed li dl dd pre { font-family:Monaco, "Courier New", monospace; font-size:90%;}
|
72
76
|
#main ul.failed li dl dd.error a {font-family:Monaco, "Courier New", monospace; font-size:90%; }
|
73
77
|
#main ul.failed li dl dd.error pre { margin-top:3px; line-height:1.3;}
|
@@ -16,22 +16,31 @@
|
|
16
16
|
<% index += 1 %>
|
17
17
|
<li>
|
18
18
|
<dl>
|
19
|
+
<% if job.nil? %>
|
20
|
+
<dt>Error</dt>
|
21
|
+
<dd>Job <%= index%> could not be parsed; perhaps it contains invalid JSON?</dd>
|
22
|
+
<% else %>
|
19
23
|
<dt>Worker</dt>
|
20
24
|
<dd>
|
21
|
-
<a href="<%=
|
22
|
-
|
23
|
-
|
25
|
+
<a href="<%= u(:workers, job['worker']) %>"><%= job['worker'].split(':')[0...2].join(':') %></a> on <b class='queue-tag'><%= job['queue'] %></b > at <b><span class="time"><%= job['failed_at'] %></span></b>
|
26
|
+
<% if job['retried_at'] %>
|
27
|
+
<div class='retried'>
|
24
28
|
Retried <b><span class="time"><%= job['retried_at'] %></span></b>
|
25
|
-
|
29
|
+
<a href="<%= u "failed/remove/#{start + index - 1}" %>" class="remove" rel="remove">Remove</a>
|
30
|
+
</div>
|
31
|
+
<% else %>
|
32
|
+
<div class='controls'>
|
26
33
|
<a href="<%= u "failed/requeue/#{start + index - 1}" %>" rel="retry">Retry</a>
|
27
|
-
|
28
|
-
|
34
|
+
or
|
35
|
+
<a href="<%= u "failed/remove/#{start + index - 1}" %>" rel="remove">Remove</a>
|
36
|
+
</div>
|
37
|
+
<% end %>
|
29
38
|
</dd>
|
30
39
|
<dt>Class</dt>
|
31
40
|
<dd><code><%= job['payload'] ? job['payload']['class'] : 'nil' %></code></dd>
|
32
41
|
<dt>Arguments</dt>
|
33
42
|
<dd><pre><%=h job['payload'] ? show_args(job['payload']['args']) : 'nil' %></pre></dd>
|
34
|
-
<dt>Exception</
|
43
|
+
<dt>Exception</dt>
|
35
44
|
<dd><code><%= job['exception'] %></code></dd>
|
36
45
|
<dt>Error</dt>
|
37
46
|
<dd class='error'>
|
@@ -42,6 +51,7 @@
|
|
42
51
|
<%=h job['error'] %>
|
43
52
|
<% end %>
|
44
53
|
</dd>
|
54
|
+
<% end %>
|
45
55
|
</dl>
|
46
56
|
<div class='r'>
|
47
57
|
</div>
|
@@ -36,12 +36,12 @@
|
|
36
36
|
</tr>
|
37
37
|
<% for queue in resque.queues.sort_by { |q| q.to_s } %>
|
38
38
|
<tr>
|
39
|
-
<td class='queue'><a class="queue" href="<%=
|
39
|
+
<td class='queue'><a class="queue" href="<%= u "queues/#{queue}" %>"><%= queue %></a></td>
|
40
40
|
<td class='size'><%= resque.size queue %></td>
|
41
41
|
</tr>
|
42
42
|
<% end %>
|
43
43
|
<tr class="<%= Resque::Failure.count.zero? ? "failed" : "failure" %>">
|
44
|
-
<td class='queue failed'><a class="queue" href="<%=
|
44
|
+
<td class='queue failed'><a class="queue" href="<%= u :failed %>">failed</a></td>
|
45
45
|
<td class='size'><%= Resque::Failure.count %></td>
|
46
46
|
</tr>
|
47
47
|
</table>
|
@@ -95,12 +95,12 @@
|
|
95
95
|
</tr>
|
96
96
|
<% for hostname, workers in worker_hosts.sort_by { |h,w| h } %>
|
97
97
|
<tr>
|
98
|
-
<td class='queue'><a class="queue" href="<%=
|
98
|
+
<td class='queue'><a class="queue" href="<%= u "workers/#{hostname}" %>"><%= hostname %></a></td>
|
99
99
|
<td class='size'><%= workers.size %></td>
|
100
100
|
</tr>
|
101
101
|
<% end %>
|
102
102
|
<tr class="failed">
|
103
|
-
<td class='queue failed'><a class="queue" href="<%=
|
103
|
+
<td class='queue failed'><a class="queue" href="<%= u "workers/all" %>">all workers</a></td>
|
104
104
|
<td class='size'><%= Resque.workers.size %></td>
|
105
105
|
</tr>
|
106
106
|
</table>
|
data/lib/resque/tasks.rb
CHANGED
data/lib/resque/version.rb
CHANGED
data/lib/resque/worker.rb
CHANGED
@@ -102,13 +102,14 @@ module Resque
|
|
102
102
|
# 2. Work loop: Jobs are pulled from a queue and processed.
|
103
103
|
# 3. Teardown: This worker is unregistered.
|
104
104
|
#
|
105
|
-
# Can be passed
|
105
|
+
# Can be passed a float representing the polling frequency.
|
106
106
|
# The default is 5 seconds, but for a semi-active site you may
|
107
107
|
# want to use a smaller value.
|
108
108
|
#
|
109
109
|
# Also accepts a block which will be passed the job as soon as it
|
110
110
|
# has completed processing. Useful for testing.
|
111
|
-
def work(interval = 5, &block)
|
111
|
+
def work(interval = 5.0, &block)
|
112
|
+
interval = Float(interval)
|
112
113
|
$0 = "resque: Starting"
|
113
114
|
startup
|
114
115
|
|
@@ -133,10 +134,10 @@ module Resque
|
|
133
134
|
done_working
|
134
135
|
@child = nil
|
135
136
|
else
|
136
|
-
break if interval.
|
137
|
-
log! "Sleeping for #{interval
|
137
|
+
break if interval.zero?
|
138
|
+
log! "Sleeping for #{interval} seconds"
|
138
139
|
procline @paused ? "Paused" : "Waiting for #{@queues.join(',')}"
|
139
|
-
sleep interval
|
140
|
+
sleep interval
|
140
141
|
end
|
141
142
|
end
|
142
143
|
|
@@ -453,7 +454,7 @@ module Resque
|
|
453
454
|
# The string representation is the same as the id for this worker
|
454
455
|
# instance. Can be used with `Worker.find`.
|
455
456
|
def to_s
|
456
|
-
@to_s ||= "#{hostname}:#{pid}:#{@queues.join(',')}"
|
457
|
+
@to_s ||= "#{hostname}:#{Process.pid}:#{@queues.join(',')}"
|
457
458
|
end
|
458
459
|
alias_method :id, :to_s
|
459
460
|
|
@@ -462,9 +463,9 @@ module Resque
|
|
462
463
|
@hostname ||= `hostname`.chomp
|
463
464
|
end
|
464
465
|
|
465
|
-
# Returns PID of running worker
|
466
|
+
# Returns Integer PID of running worker
|
466
467
|
def pid
|
467
|
-
@pid ||=
|
468
|
+
@pid ||= to_s.split(":")[1].to_i
|
468
469
|
end
|
469
470
|
|
470
471
|
# Returns an array of string pids of all the other workers on this
|
@@ -488,7 +489,7 @@ module Resque
|
|
488
489
|
if verbose
|
489
490
|
puts "*** #{message}"
|
490
491
|
elsif very_verbose
|
491
|
-
time = Time.now.strftime('%
|
492
|
+
time = Time.now.strftime('%H:%M:%S %Y-%m-%d')
|
492
493
|
puts "** [#{time}] #$$: #{message}"
|
493
494
|
end
|
494
495
|
end
|
data/test/job_hooks_test.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require 'test_helper'
|
2
2
|
|
3
3
|
context "Resque::Job before_perform" do
|
4
4
|
include PerformJob
|
@@ -232,6 +232,7 @@ context "Resque::Job after_enqueue" do
|
|
232
232
|
include PerformJob
|
233
233
|
|
234
234
|
class ::AfterEnqueueJob
|
235
|
+
@queue = :jobs
|
235
236
|
def self.after_enqueue_record_history(history)
|
236
237
|
history << :after_enqueue
|
237
238
|
end
|
@@ -243,7 +244,7 @@ context "Resque::Job after_enqueue" do
|
|
243
244
|
test "the after enqueue hook should run" do
|
244
245
|
history = []
|
245
246
|
@worker = Resque::Worker.new(:jobs)
|
246
|
-
Resque
|
247
|
+
Resque.enqueue(AfterEnqueueJob, history)
|
247
248
|
@worker.work(0)
|
248
249
|
assert_equal history, [:after_enqueue], "after_enqueue was not run"
|
249
250
|
end
|
data/test/job_plugins_test.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require 'test_helper'
|
2
2
|
|
3
3
|
context "Multiple plugins with multiple hooks" do
|
4
4
|
include PerformJob
|
@@ -45,7 +45,7 @@ context "Resque::Plugin ordering before_perform" do
|
|
45
45
|
end
|
46
46
|
end
|
47
47
|
|
48
|
-
class ::
|
48
|
+
class ::JobPluginsTestBeforePerformJob
|
49
49
|
extend BeforePerformPlugin
|
50
50
|
def self.perform(history)
|
51
51
|
history << :perform
|
@@ -56,7 +56,7 @@ context "Resque::Plugin ordering before_perform" do
|
|
56
56
|
end
|
57
57
|
|
58
58
|
test "before_perform hooks are executed in order" do
|
59
|
-
result = perform_job(
|
59
|
+
result = perform_job(JobPluginsTestBeforePerformJob, history=[])
|
60
60
|
assert_equal true, result, "perform returned true"
|
61
61
|
assert_equal [:before_perform, :before_perform1, :perform], history
|
62
62
|
end
|
@@ -71,7 +71,7 @@ context "Resque::Plugin ordering after_perform" do
|
|
71
71
|
end
|
72
72
|
end
|
73
73
|
|
74
|
-
class ::
|
74
|
+
class ::JobPluginsTestAfterPerformJob
|
75
75
|
extend AfterPerformPlugin
|
76
76
|
def self.perform(history)
|
77
77
|
history << :perform
|
@@ -82,7 +82,7 @@ context "Resque::Plugin ordering after_perform" do
|
|
82
82
|
end
|
83
83
|
|
84
84
|
test "after_perform hooks are executed in order" do
|
85
|
-
result = perform_job(
|
85
|
+
result = perform_job(JobPluginsTestAfterPerformJob, history=[])
|
86
86
|
assert_equal true, result, "perform returned true"
|
87
87
|
assert_equal [:perform, :after_perform, :after_perform1], history
|
88
88
|
end
|
@@ -111,7 +111,7 @@ context "Resque::Plugin ordering around_perform" do
|
|
111
111
|
assert_equal [:around_perform_plugin1, :perform], history
|
112
112
|
end
|
113
113
|
|
114
|
-
class ::
|
114
|
+
class ::JobPluginsTestAroundPerformJob
|
115
115
|
extend AroundPerformPlugin1
|
116
116
|
def self.perform(history)
|
117
117
|
history << :perform
|
@@ -123,7 +123,7 @@ context "Resque::Plugin ordering around_perform" do
|
|
123
123
|
end
|
124
124
|
|
125
125
|
test "around_perform hooks are executed in order" do
|
126
|
-
result = perform_job(
|
126
|
+
result = perform_job(JobPluginsTestAroundPerformJob, history=[])
|
127
127
|
assert_equal true, result, "perform returned true"
|
128
128
|
assert_equal [:around_perform, :around_perform_plugin1, :perform], history
|
129
129
|
end
|
data/test/plugin_test.rb
CHANGED
data/test/resque-web_test.rb
CHANGED
data/test/resque_test.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require 'test_helper'
|
2
2
|
|
3
3
|
context "Resque" do
|
4
4
|
setup do
|
@@ -8,7 +8,7 @@ context "Resque" do
|
|
8
8
|
Resque.push(:people, { 'name' => 'bob' })
|
9
9
|
Resque.push(:people, { 'name' => 'mark' })
|
10
10
|
end
|
11
|
-
|
11
|
+
|
12
12
|
test "can set a namespace through a url-like string" do
|
13
13
|
assert Resque.redis
|
14
14
|
assert_equal :resque, Resque.redis.namespace
|
@@ -128,6 +128,12 @@ context "Resque" do
|
|
128
128
|
end
|
129
129
|
end
|
130
130
|
|
131
|
+
test "validates job for queue presence" do
|
132
|
+
assert_raises Resque::NoQueueError do
|
133
|
+
Resque.validate(SomeJob)
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
131
137
|
test "can put items on a queue" do
|
132
138
|
assert Resque.push(:people, { 'name' => 'jon' })
|
133
139
|
end
|
@@ -227,6 +233,18 @@ context "Resque" do
|
|
227
233
|
end
|
228
234
|
|
229
235
|
test "decode bad json" do
|
230
|
-
|
236
|
+
assert_raises Resque::Helpers::DecodeException do
|
237
|
+
Resque.decode("{\"error\":\"Module not found \\u002\"}")
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
241
|
+
test "inlining jobs" do
|
242
|
+
begin
|
243
|
+
Resque.inline = true
|
244
|
+
Resque.enqueue(SomeIvarJob, 20, '/tmp')
|
245
|
+
assert_equal 0, Resque.size(:ivar)
|
246
|
+
ensure
|
247
|
+
Resque.inline = false
|
248
|
+
end
|
231
249
|
end
|
232
|
-
end
|
250
|
+
end
|
data/test/test_helper.rb
CHANGED
@@ -66,6 +66,8 @@ def context(*args, &block)
|
|
66
66
|
end
|
67
67
|
(class << klass; self end).send(:define_method, :name) { name.gsub(/\W/,'_') }
|
68
68
|
klass.class_eval &block
|
69
|
+
# XXX: In 1.8.x, not all tests will run unless anonymous classes are kept in scope.
|
70
|
+
($test_classes ||= []) << klass
|
69
71
|
end
|
70
72
|
|
71
73
|
##
|
@@ -128,3 +130,16 @@ def with_failure_backend(failure_backend, &block)
|
|
128
130
|
ensure
|
129
131
|
Resque::Failure.backend = previous_backend
|
130
132
|
end
|
133
|
+
|
134
|
+
class Time
|
135
|
+
# Thanks, Timecop
|
136
|
+
class << self
|
137
|
+
alias_method :now_without_mock_time, :now
|
138
|
+
|
139
|
+
def now_with_mock_time
|
140
|
+
$fake_time || now_without_mock_time
|
141
|
+
end
|
142
|
+
|
143
|
+
alias_method :now, :now_with_mock_time
|
144
|
+
end
|
145
|
+
end
|
data/test/worker_test.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require 'test_helper'
|
2
2
|
|
3
3
|
context "Resque::Worker" do
|
4
4
|
setup do
|
@@ -301,6 +301,19 @@ context "Resque::Worker" do
|
|
301
301
|
assert $BEFORE_FORK_CALLED
|
302
302
|
end
|
303
303
|
|
304
|
+
test "very verbose works in the afternoon" do
|
305
|
+
require 'time'
|
306
|
+
$last_puts = ""
|
307
|
+
$fake_time = Time.parse("15:44:33 2011-03-02")
|
308
|
+
singleton = class << @worker; self end
|
309
|
+
singleton.send :define_method, :puts, lambda { |thing| $last_puts = thing }
|
310
|
+
|
311
|
+
@worker.very_verbose = true
|
312
|
+
@worker.log("some log text")
|
313
|
+
|
314
|
+
assert_match /\*\* \[15:44:33 2011-03-02\] \d+: some log text/, $last_puts
|
315
|
+
end
|
316
|
+
|
304
317
|
test "Will call an after_fork hook after forking" do
|
305
318
|
Resque.redis.flushall
|
306
319
|
$AFTER_FORK_CALLED = false
|
@@ -314,6 +327,6 @@ context "Resque::Worker" do
|
|
314
327
|
end
|
315
328
|
|
316
329
|
test "returns PID of running process" do
|
317
|
-
assert_equal
|
330
|
+
assert_equal @worker.to_s.split(":")[1].to_i, @worker.pid
|
318
331
|
end
|
319
332
|
end
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: resque
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 47
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 1
|
8
|
-
-
|
8
|
+
- 14
|
9
9
|
- 0
|
10
|
-
version: 1.
|
10
|
+
version: 1.14.0
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Chris Wanstrath
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-03-17 00:00:00 -07:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|