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 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
@@ -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
- desc "Run the test suite"
23
- task :test do
24
- rg = command?(:rg)
25
- Dir['test/**/*_test.rb'].each do |f|
26
- rg ? sh("rg #{f}") : ruby(f)
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
@@ -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
@@ -62,5 +62,9 @@ module Resque
62
62
  def self.requeue(index)
63
63
  backend.requeue(index)
64
64
  end
65
+
66
+ def self.remove(index)
67
+ backend.remove(index)
68
+ end
65
69
  end
66
70
  end
@@ -52,6 +52,9 @@ module Resque
52
52
  def self.requeue(index)
53
53
  end
54
54
 
55
+ def self.remove(index)
56
+ end
57
+
55
58
  # Logging!
56
59
  def log(message)
57
60
  @worker.log(message)
@@ -109,6 +109,7 @@ module Resque
109
109
  end
110
110
  x.tag!("server-environment") do
111
111
  x.tag!("environment-name",server_environment)
112
+ x.tag!("project-root", "RAILS_ROOT")
112
113
  end
113
114
 
114
115
  end
@@ -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
@@ -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
@@ -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
- if !queue
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
- ret = Resque.push(queue, :class => klass.to_s, :args => args)
52
- Plugin.after_enqueue_hooks(klass).each do |hook|
53
- klass.send(hook, *args)
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
@@ -16,17 +16,17 @@ module Resque
16
16
  alias_method :h, :escape_html
17
17
 
18
18
  def current_section
19
- url request.path_info.sub('/','').split('/')[0].downcase
19
+ url_path request.path_info.sub('/','').split('/')[0].downcase
20
20
  end
21
21
 
22
22
  def current_page
23
- url request.path_info.sub('/','')
23
+ url_path request.path_info.sub('/','')
24
24
  end
25
25
 
26
- def url(*path_parts)
26
+ def url_path(*path_parts)
27
27
  [ path_prefix, path_parts ].join("/").squeeze('/')
28
28
  end
29
- alias_method :u, :url
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 = url(dname)
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 url(:overview)
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 url("/stats/resque")
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 .retry { float: right; }
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="<%= url(: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>
22
- <div class='retry'>
23
- <% if job['retried_at'] %>
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
- <% else %>
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
- <% end %>
28
- </div>
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</td>
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="<%= url "queues/#{queue}" %>"><%= queue %></a></td>
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="<%= url :failed %>">failed</a></td>
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="<%= url "workers/#{hostname}" %>"><%= hostname %></a></td>
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="<%= url "workers/all" %>">all workers</a></td>
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>
@@ -19,7 +19,7 @@ namespace :resque do
19
19
  end
20
20
 
21
21
  if ENV['PIDFILE']
22
- File.open(ENV['PIDFILE'], 'w') { |f| f << Process.pid.to_s }
22
+ File.open(ENV['PIDFILE'], 'w') { |f| f << worker.pid }
23
23
  end
24
24
 
25
25
  worker.log "Starting worker #{worker}"
@@ -1,3 +1,3 @@
1
1
  module Resque
2
- Version = VERSION = '1.13.0'
2
+ Version = VERSION = '1.14.0'
3
3
  end
@@ -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 an integer representing the polling frequency.
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.to_i == 0
137
- log! "Sleeping for #{interval.to_i}"
137
+ break if interval.zero?
138
+ log! "Sleeping for #{interval} seconds"
138
139
  procline @paused ? "Paused" : "Waiting for #{@queues.join(',')}"
139
- sleep interval.to_i
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 ||= Process.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('%I:%M:%S %Y-%m-%d')
492
+ time = Time.now.strftime('%H:%M:%S %Y-%m-%d')
492
493
  puts "** [#{time}] #$$: #{message}"
493
494
  end
494
495
  end
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/test_helper'
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::Job.create(:jobs, AfterEnqueueJob, history)
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
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/test_helper'
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 ::BeforePerformJob
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(BeforePerformJob, history=[])
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 ::AfterPerformJob
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(AfterPerformJob, history=[])
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 ::AroundPerformJob
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(AroundPerformJob, history=[])
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
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/test_helper'
1
+ require 'test_helper'
2
2
 
3
3
  context "Resque::Plugin finding hooks" do
4
4
  module SimplePlugin
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/test_helper'
1
+ require 'test_helper'
2
2
  require 'resque/server/test_helper'
3
3
 
4
4
  # Root path test
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/test_helper'
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
- assert_nil Resque.decode("{\"error\":\"Module not found \\u002\"}")
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
@@ -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
@@ -1,4 +1,4 @@
1
- require File.dirname(__FILE__) + '/test_helper'
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 Process.pid, @worker.pid
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: 35
4
+ hash: 47
5
5
  prerelease: false
6
6
  segments:
7
7
  - 1
8
- - 13
8
+ - 14
9
9
  - 0
10
- version: 1.13.0
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-02-07 00:00:00 -08:00
18
+ date: 2011-03-17 00:00:00 -07:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency