From d9fd031b472f963530eca2d094a0b191759a8e17 Mon Sep 17 00:00:00 2001 From: Karl Freeman Date: Thu, 15 Nov 2012 20:58:58 +0000 Subject: [PATCH] Allow Sidekiq::Client to push / push_bulk job with class as a String --- lib/sidekiq/client.rb | 13 ++++++++++--- test/test_client.rb | 22 ++++++++++++++++++++++ 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/lib/sidekiq/client.rb b/lib/sidekiq/client.rb index fd1fd318..1bcdec2a 100644 --- a/lib/sidekiq/client.rb +++ b/lib/sidekiq/client.rb @@ -122,10 +122,17 @@ module Sidekiq def self.normalize_item(item) raise(ArgumentError, "Message must be a Hash of the form: { 'class' => SomeWorker, 'args' => ['bob', 1, :foo => 'bar'] }") unless item.is_a?(Hash) raise(ArgumentError, "Message must include a class and set of arguments: #{item.inspect}") if !item['class'] || !item['args'] - raise(ArgumentError, "Message must include a Sidekiq::Worker class, not class name: #{item['class'].ancestors.inspect}") if !item['class'].is_a?(Class) || !item['class'].respond_to?('get_sidekiq_options') + raise(ArgumentError, "Message class must be either a Class or String representation of the class name") unless item['class'].is_a?(Class) || item['class'].is_a?(String) + + if item['class'].is_a?(Class) + raise(ArgumentError, "Message must include a Sidekiq::Worker class, not class name: #{item['class'].ancestors.inspect}") if !item['class'].is_a?(Class) || !item['class'].respond_to?('get_sidekiq_options') + normalized_item = item['class'].get_sidekiq_options.merge(item.dup) + normalized_item['class'] = normalized_item['class'].to_s + else + normalized_item = item.dup + normalized_item['queue'] = 'default' unless normalized_item['queue'] + end - normalized_item = item['class'].get_sidekiq_options.merge(item.dup) - normalized_item['class'] = normalized_item['class'].to_s normalized_item['retry'] = !!normalized_item['retry'] unless normalized_item['retry'].is_a?(Fixnum) normalized_item['jid'] = SecureRandom.hex(12) diff --git a/test/test_client.rb b/test/test_client.rb index d11628a7..9ba8d232 100644 --- a/test/test_client.rb +++ b/test/test_client.rb @@ -30,6 +30,15 @@ class TestClient < MiniTest::Unit::TestCase assert_raises ArgumentError do Sidekiq::Client.push('foo', :class => 'Foo', :noargs => [1, 2]) end + + assert_raises ArgumentError do + Sidekiq::Client.push('queue' => 'foo', 'class' => MyWorker, 'noargs' => [1, 2]) + end + + assert_raises ArgumentError do + Sidekiq::Client.push('queue' => 'foo', 'class' => 42, 'args' => [1, 2]) + end + end it 'pushes messages to redis' do @@ -40,6 +49,14 @@ class TestClient < MiniTest::Unit::TestCase @redis.verify end + it 'pushes messages to redis using a String class' do + @redis.expect :rpush, 1, ['queue:foo', String] + pushed = Sidekiq::Client.push('queue' => 'foo', 'class' => 'MyWorker', 'args' => [1, 2]) + assert pushed + assert_equal 24, pushed.size + @redis.verify + end + class MyWorker include Sidekiq::Worker end @@ -105,6 +122,11 @@ class TestClient < MiniTest::Unit::TestCase count = Sidekiq::Client.push_bulk('class' => QueuedWorker, 'args' => (1..1_000).to_a.map { |x| Array(x) }) assert_equal 1_000, count end + it 'can push a large set of jobs at once using a String class' do + a = Time.now + count = Sidekiq::Client.push_bulk('class' => 'QueuedWorker', 'args' => (1..1_000).to_a.map { |x| Array(x) }) + assert_equal 1_000, count + end end class BaseWorker