From afb1d24809c5e750e36141cfc151dbe5ee5c5bb2 Mon Sep 17 00:00:00 2001 From: Mike Perham Date: Thu, 8 Nov 2012 09:05:11 -0800 Subject: [PATCH] Add delay_until extension method --- Changes.md | 11 +++++++++++ lib/sidekiq/extensions/action_mailer.rb | 3 +++ lib/sidekiq/extensions/active_record.rb | 3 +++ lib/sidekiq/extensions/class_methods.rb | 3 +++ test/test_extensions.rb | 21 +++++++++++++++++++++ 5 files changed, 41 insertions(+) diff --git a/Changes.md b/Changes.md index f416c50c..6169a343 100644 --- a/Changes.md +++ b/Changes.md @@ -1,3 +1,14 @@ +HEAD +----------- + +- Add `delay_until` so you can delay jobs until a specific timestamp: + +```ruby +Auction.delay_until(@auction.ends_at).close(@auction.id) +``` + +This is identical to the existing Sidekiq::Worker method, `perform_at`. + 2.5.2 ----------- diff --git a/lib/sidekiq/extensions/action_mailer.rb b/lib/sidekiq/extensions/action_mailer.rb index 29e86187..c8366ecd 100644 --- a/lib/sidekiq/extensions/action_mailer.rb +++ b/lib/sidekiq/extensions/action_mailer.rb @@ -30,6 +30,9 @@ module Sidekiq def delay_for(interval, options={}) Proxy.new(DelayedMailer, self, options.merge('at' => Time.now.to_f + interval.to_f)) end + def delay_until(timestamp, options={}) + Proxy.new(DelayedMailer, self, options.merge('at' => timestamp.to_f)) + end end end diff --git a/lib/sidekiq/extensions/active_record.rb b/lib/sidekiq/extensions/active_record.rb index 00bc77b4..44d3bda9 100644 --- a/lib/sidekiq/extensions/active_record.rb +++ b/lib/sidekiq/extensions/active_record.rb @@ -27,6 +27,9 @@ module Sidekiq def delay_for(interval, options={}) Proxy.new(DelayedModel, self, options.merge('at' => Time.now.to_f + interval.to_f)) end + def delay_until(timestamp, options={}) + Proxy.new(DelayedModel, self, options.merge('at' => timestamp.to_f)) + end end end diff --git a/lib/sidekiq/extensions/class_methods.rb b/lib/sidekiq/extensions/class_methods.rb index 1a4d9e35..35fdd8c2 100644 --- a/lib/sidekiq/extensions/class_methods.rb +++ b/lib/sidekiq/extensions/class_methods.rb @@ -25,6 +25,9 @@ module Sidekiq def delay_for(interval, options={}) Proxy.new(DelayedClass, self, options.merge('at' => Time.now.to_f + interval.to_f)) end + def delay_until(timestamp, options={}) + Proxy.new(DelayedClass, self, options.merge('at' => timestamp.to_f)) + end end end diff --git a/test/test_extensions.rb b/test/test_extensions.rb index 8ecf067a..b55ae5dd 100644 --- a/test/test_extensions.rb +++ b/test/test_extensions.rb @@ -43,6 +43,12 @@ class TestExtensions < MiniTest::Unit::TestCase assert_equal 1, Sidekiq.redis {|c| c.zcard('schedule') } end + it 'allows until delayed scheduling of AR class methods' do + assert_equal 0, Sidekiq.redis {|c| c.zcard('schedule') } + MyModel.delay_until(1.day.from_now).long_class_method + assert_equal 1, Sidekiq.redis {|c| c.zcard('schedule') } + end + class UserMailer < ActionMailer::Base def greetings(a, b) raise "Should not be called!" @@ -63,13 +69,21 @@ class TestExtensions < MiniTest::Unit::TestCase assert_equal 1, Sidekiq.redis {|c| c.zcard('schedule') } end + it 'allows until delay scheduling of AM mails' do + assert_equal 0, Sidekiq.redis {|c| c.zcard('schedule') } + UserMailer.delay_until(5.days.from_now).greetings(1, 2) + assert_equal 1, Sidekiq.redis {|c| c.zcard('schedule') } + end + class SomeClass def self.doit(arg) end end it 'allows delay of any ole class method' do + assert_equal 0, queue_size SomeClass.delay.doit(Date.today) + assert_equal 1, queue_size end module SomeModule @@ -78,7 +92,14 @@ class TestExtensions < MiniTest::Unit::TestCase end it 'allows delay of any module class method' do + assert_equal 0, queue_size SomeModule.delay.doit(Date.today) + assert_equal 1, queue_size + end + + def queue_size(name='default') + Sidekiq::Queue.new(name).size end end + end