multi_worker 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/.rspec +4 -0
  4. data/.travis.yml +10 -0
  5. data/Gemfile +6 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +110 -0
  8. data/Rakefile +22 -0
  9. data/lib/multi_worker/adapters/backburner.rb +32 -0
  10. data/lib/multi_worker/adapters/delayed_job.rb +30 -0
  11. data/lib/multi_worker/adapters/inline.rb +21 -0
  12. data/lib/multi_worker/adapters/qu.rb +30 -0
  13. data/lib/multi_worker/adapters/que.rb +47 -0
  14. data/lib/multi_worker/adapters/queue_classic.rb +29 -0
  15. data/lib/multi_worker/adapters/resque.rb +59 -0
  16. data/lib/multi_worker/adapters/sidekiq.rb +56 -0
  17. data/lib/multi_worker/adapters/sneakers.rb +32 -0
  18. data/lib/multi_worker/adapters/sucker_punch.rb +25 -0
  19. data/lib/multi_worker/adapters/threaded_in_memory_queue.rb +27 -0
  20. data/lib/multi_worker/adapters/torquebox_backgroundable.rb +25 -0
  21. data/lib/multi_worker/interface.rb +24 -0
  22. data/lib/multi_worker/tasks.rb +13 -0
  23. data/lib/multi_worker/version.rb +3 -0
  24. data/lib/multi_worker.rb +79 -0
  25. data/multi_worker.gemspec +56 -0
  26. data/spec/adapters/backburner_spec.rb +32 -0
  27. data/spec/adapters/delayed_job_spec.rb +32 -0
  28. data/spec/adapters/inline_spec.rb +18 -0
  29. data/spec/adapters/qu_spec.rb +29 -0
  30. data/spec/adapters/que_spec.rb +44 -0
  31. data/spec/adapters/queue_classic_spec.rb +41 -0
  32. data/spec/adapters/resque_spec.rb +74 -0
  33. data/spec/adapters/sidekiq_spec.rb +91 -0
  34. data/spec/adapters/sneakers_spec.rb +36 -0
  35. data/spec/adapters/sucker_punch_spec.rb +36 -0
  36. data/spec/adapters/threaded_in_memory_queue_spec.rb +25 -0
  37. data/spec/adapters/torquebox_backgroundable_spec.rb +31 -0
  38. data/spec/configuration_spec.rb +59 -0
  39. data/spec/delayed/backend/test.rb +113 -0
  40. data/spec/delayed/serialization/test.rb +0 -0
  41. data/spec/shared/worker_spec.rb +18 -0
  42. data/spec/spec_helper.rb +22 -0
  43. data/spec/test_workers.rb +7 -0
  44. metadata +427 -0
@@ -0,0 +1,79 @@
1
+ require "multi_worker/version"
2
+ require "multi_worker/interface"
3
+
4
+ module MultiWorker
5
+ @adapters = {}
6
+ @default_queue = :default
7
+
8
+ AdapterNames = [
9
+ :resque,
10
+ :sidekiq,
11
+ :delayed_job,
12
+ :qu,
13
+ :queue_classic,
14
+ :que,
15
+ :sneakers,
16
+ :torquebox_backgroundable,
17
+ :threaded_in_memory_queue,
18
+ :sucker_punch,
19
+ :backburner,
20
+ :inline
21
+ ]
22
+
23
+ class << self
24
+ def enqueue(worker_klass, *args)
25
+ worker_klass.perform_async(*args)
26
+ end
27
+
28
+ def configure(&block)
29
+ instance_eval &block
30
+ end
31
+
32
+ def default_options(opts={})
33
+ @default_options ||= {
34
+ :adapter => default_adapter,
35
+ :queue => default_queue,
36
+ :status => false,
37
+ :retry => false,
38
+ :lock => false,
39
+ :unique => false
40
+ }
41
+
42
+ if opts && !opts.empty?
43
+ @default_options.merge!(opts)
44
+ end
45
+
46
+ @default_options
47
+ end
48
+
49
+ attr_accessor :default_queue
50
+
51
+ def default_adapter(adapter_name=nil)
52
+ return (@default_adapter = adapter_name) if (adapter_name && !adapter_name.empty?)
53
+
54
+ @default_adapter ||= case
55
+ when defined?(::Resque) then :resque
56
+ when defined?(::Sidekiq) then :sidekiq
57
+ when defined?(::Delayed::Worker) then :delayed_job
58
+ when defined?(::Qu) then :qu
59
+ when defined?(::QC::Queue) then :queue_classic
60
+ when defined?(::Que) then :que
61
+ when defined?(::Sneakers::Worker) then :sneakers
62
+ when defined?(::TorqueBox::Messaging::Backgroundable) then :torquebox_backgroundable
63
+ when defined?(::ThreadedInMemoryQueue) then :threaded_in_memory_queue
64
+ when defined?(::SuckerPunch::Job) then :sucker_punch
65
+ when defined?(::Backburner) then :backburner
66
+ else :inline
67
+ end
68
+ end
69
+
70
+ def adapter(adapter_name=nil)
71
+ adapter_name ||= default_adapter
72
+ @adapters[adapter_name] ||= begin
73
+ require "multi_worker/adapters/#{adapter_name}"
74
+ klass_name = adapter_name.to_s.split('_').map(&:capitalize) * ''
75
+ MultiWorker::Adapters.const_get(klass_name)
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,56 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'multi_worker/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "multi_worker"
8
+ spec.version = MultiWorker::VERSION
9
+ spec.authors = ["David Butler"]
10
+ spec.email = ["dwbutler@ucla.edu"]
11
+ spec.summary = %q{Provides a common interface to Ruby worker/queue libraries.}
12
+ spec.description = %q{Provides a common interface to Ruby worker/queue libraries.}
13
+ spec.homepage = "https://github.com/dwbutler/multi_worker"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.5"
22
+ spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "rspec"
24
+
25
+ spec.add_development_dependency "resque"
26
+ spec.add_development_dependency "resque-retry"
27
+ spec.add_development_dependency "resque-status"
28
+ spec.add_development_dependency "resque-loner"
29
+ spec.add_development_dependency "resque-lock-timeout"
30
+ spec.add_development_dependency "resque-delay"
31
+
32
+ spec.add_development_dependency "sidekiq"
33
+ spec.add_development_dependency "sidekiq-lock"
34
+ spec.add_development_dependency "sidekiq_status"
35
+ spec.add_development_dependency "sidekiq-unique-jobs"
36
+ spec.add_development_dependency "sidekiq-delay"
37
+
38
+ spec.add_development_dependency "delayed_job"
39
+ spec.add_development_dependency "delayed_job_active_record"
40
+
41
+ spec.add_development_dependency "qu", "0.2.0"
42
+
43
+ spec.add_development_dependency "queue_classic" unless (RUBY_ENGINE == "jruby")
44
+
45
+ spec.add_development_dependency "que"
46
+
47
+ spec.add_development_dependency "sneakers"
48
+
49
+ spec.add_development_dependency "threaded_in_memory_queue"
50
+
51
+ spec.add_development_dependency "sucker_punch"
52
+
53
+ spec.add_development_dependency "backburner"
54
+
55
+ spec.add_development_dependency "torquebox-messaging" if (RUBY_ENGINE == "jruby")
56
+ end
@@ -0,0 +1,32 @@
1
+ require 'backburner'
2
+ require 'test_workers'
3
+
4
+ describe TestWorker do
5
+ it_behaves_like "a worker"
6
+
7
+ it { should be_a ::Backburner::Queue }
8
+ end
9
+
10
+ describe MultiWorker do
11
+ context "when Backburner is loaded" do
12
+ it "defaults to the :backburner adapter" do
13
+ MultiWorker.default_adapter.should == :backburner
14
+ end
15
+ end
16
+
17
+ context "when using the :backburner adapter" do
18
+ it "::perform_async uses Backburner" do
19
+ Backburner.should_receive(:enqueue).once.with(TestWorker, "foo")
20
+ TestWorker.perform_async("foo")
21
+ end
22
+
23
+ it "MultiWorker.enqueue uses Backburner" do
24
+ Backburner.should_receive(:enqueue).once.with(TestWorker, "foo")
25
+ MultiWorker.enqueue(TestWorker, "foo")
26
+ end
27
+
28
+ it "exposes the Backburner rake task" do
29
+ MultiWorker.adapter.rake_task.name.should == "backburner:work"
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,32 @@
1
+ require 'delayed_job'
2
+ require 'delayed/backend/test'
3
+ Delayed::Worker.backend = :test
4
+ #require 'delayed_job_active_record'
5
+ Delayed::Worker.delay_jobs = false
6
+
7
+ require 'test_workers'
8
+
9
+ describe TestWorker do
10
+ it_behaves_like "a worker"
11
+ end
12
+
13
+ describe MultiWorker do
14
+ context "when Delayed::Job is loaded" do
15
+ it "defaults to the :delayed_job adapter" do
16
+ MultiWorker.default_adapter.should == :delayed_job
17
+ end
18
+ end
19
+
20
+ context "when using the :delayed_job adapter" do
21
+ it "performs the work using Delayed::Job" do
22
+ expect(TestWorker).to receive(:perform).exactly(3).times.with("foo")
23
+ TestWorker.perform_async("foo")
24
+ MultiWorker.enqueue(TestWorker, "foo")
25
+ TestWorker.perform("foo")
26
+ end
27
+
28
+ it "exposes the Delayed Job rake task" do
29
+ MultiWorker.adapter.rake_task.name.should == "jobs:work"
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,18 @@
1
+ require 'test_workers'
2
+
3
+ describe MultiWorker do
4
+ context "when no other adapter is available" do
5
+ it "defaults to the :inline adapter" do
6
+ MultiWorker.default_adapter.should == :inline
7
+ end
8
+ end
9
+
10
+ context "when using the :inline adapter" do
11
+ it "performs the work immediately" do
12
+ expect(TestWorker).to receive(:perform).exactly(3).times.with("foo")
13
+ TestWorker.perform_async("foo")
14
+ MultiWorker.enqueue(TestWorker, "foo")
15
+ TestWorker.perform("foo")
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,29 @@
1
+ require 'qu'
2
+ require 'qu-immediate'
3
+
4
+ require 'test_workers'
5
+
6
+ describe TestWorker do
7
+ it_behaves_like "a worker"
8
+ end
9
+
10
+ describe MultiWorker do
11
+ context "when Qu is loaded" do
12
+ it "defaults to the :qu adapter" do
13
+ MultiWorker.default_adapter.should == :qu
14
+ end
15
+ end
16
+
17
+ context "when using the :qu adapter" do
18
+ it "performs the work using Qu's backend" do
19
+ expect(TestWorker).to receive(:perform).exactly(3).times.with("foo")
20
+ TestWorker.perform_async("foo")
21
+ MultiWorker.enqueue(TestWorker, "foo")
22
+ TestWorker.perform("foo")
23
+ end
24
+
25
+ it "exposes the Qu rake task" do
26
+ MultiWorker.adapter.rake_task.name.should == "qu:work"
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,44 @@
1
+ require 'que'
2
+ require 'active_record'
3
+ ::Que.mode = :sync
4
+
5
+ require 'test_workers'
6
+
7
+ describe TestWorker do
8
+ it_behaves_like "a worker"
9
+
10
+ it { TestWorker::Job.should be < ::Que::Job }
11
+ end
12
+
13
+ describe MultiWorker do
14
+ context "when Que is loaded" do
15
+ it "defaults to the :que adapter" do
16
+ MultiWorker.default_adapter.should == :que
17
+ end
18
+ end
19
+
20
+ context "when using the :que adapter" do
21
+ before(:each) do
22
+ Que::Job.any_instance.stub(:destroy => true)
23
+ end
24
+
25
+ it "forwards ::perform to #perform" do
26
+ expect_any_instance_of(TestWorker).to receive(:perform).once.with("foo")
27
+ TestWorker.perform("foo")
28
+ end
29
+
30
+ it "::perform_async performs the work using Que" do
31
+ expect_any_instance_of(TestWorker).to receive(:perform).once
32
+ TestWorker.perform_async("foo")
33
+ end
34
+
35
+ it "MultiWorker.enqueue performs the work using Que" do
36
+ expect_any_instance_of(TestWorker).to receive(:perform).once
37
+ MultiWorker.enqueue(TestWorker, "foo")
38
+ end
39
+
40
+ it "exposes the Que rake task" do
41
+ MultiWorker.adapter.rake_task.name.should == "que:work"
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,41 @@
1
+ exit if jruby?
2
+
3
+ ENV["DATABASE_URL"] ||= "postgres:///queue_classic_test"
4
+ require 'queue_classic'
5
+
6
+ module QC
7
+ class Queue
8
+ def enqueue(method, *args)
9
+ klass = eval(method.split(".").first)
10
+ message = method.split(".").last
11
+ klass.send(message, *args)
12
+ end
13
+ end
14
+ end
15
+
16
+ require 'test_workers'
17
+
18
+ describe TestWorker do
19
+ it_behaves_like "a worker"
20
+ end
21
+
22
+ describe MultiWorker do
23
+ context "when Queue Classic is loaded" do
24
+ it "defaults to the :queue_classic adapter" do
25
+ MultiWorker.default_adapter.should == :queue_classic
26
+ end
27
+ end
28
+
29
+ context "when using the :queue_classic adapter" do
30
+ it "performs the work using Queue Classic" do
31
+ expect(TestWorker).to receive(:perform).exactly(3).times.with("foo")
32
+ TestWorker.perform_async("foo")
33
+ MultiWorker.enqueue(TestWorker, "foo")
34
+ TestWorker.perform("foo")
35
+ end
36
+
37
+ it "exposes the Queue Classic rake task" do
38
+ MultiWorker.adapter.rake_task.name.should == "qc:work"
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,74 @@
1
+ require 'resque'
2
+ Resque.inline = true
3
+
4
+ require 'test_workers'
5
+
6
+ describe TestWorker do
7
+ it_behaves_like "a worker"
8
+ end
9
+
10
+ describe MultiWorker do
11
+ context "when Resque is loaded" do
12
+ it "defaults to the :resque adapter" do
13
+ MultiWorker.default_adapter.should == :resque
14
+ end
15
+ end
16
+
17
+ context "when using the :resque adapter" do
18
+ it "performs the work using Resque" do
19
+ expect(TestWorker).to receive(:perform).exactly(3).times.with("foo")
20
+ TestWorker.perform_async("foo")
21
+ MultiWorker.enqueue(TestWorker, "foo")
22
+ TestWorker.perform("foo")
23
+ end
24
+
25
+ context "with advanced options" do
26
+ it "configures :retry option" do
27
+ retry_worker = Class.new do
28
+ worker :retry => {:limit => 10, :delay => 5 }
29
+ end
30
+
31
+ retry_worker.should be_a ::Resque::Plugins::Retry
32
+ retry_worker.instance_variable_get(:@retry_limit).should == 10
33
+ retry_worker.instance_variable_get(:@retry_delay).should == 5
34
+ end
35
+
36
+ it "configures :lock option" do
37
+ locking_worker = Class.new do
38
+ worker :lock => {:timeout => 5}
39
+ end
40
+
41
+ locking_worker.should be_a ::Resque::Plugins::LockTimeout
42
+ locking_worker.instance_variable_get(:@lock_timeout).should == 5
43
+ end
44
+
45
+ it "configures :unique option with :lock" do
46
+ unique_worker = Class.new do
47
+ worker :lock => true, :unique => true
48
+ end
49
+
50
+ unique_worker.instance_variable_get(:@loner).should be_true
51
+ end
52
+
53
+ it "configures :unique option without :lock" do
54
+ unique_worker = Class.new do
55
+ worker :unique => true
56
+ end
57
+
58
+ unique_worker.should include ::Resque::Plugins::UniqueJob
59
+ end
60
+
61
+ it "configures :status option" do
62
+ status_worker = Class.new do
63
+ worker :status => true
64
+ end
65
+
66
+ status_worker.should include ::Resque::Plugins::Status
67
+ end
68
+ end
69
+
70
+ it "exposes the Resque rake task" do
71
+ MultiWorker.adapter.rake_task.name.should == "resque:work"
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,91 @@
1
+ require 'sidekiq'
2
+ require 'sidekiq/testing'
3
+ ::Sidekiq::Testing.fake!
4
+
5
+ require 'test_workers'
6
+
7
+ describe TestWorker do
8
+ it_behaves_like "a worker"
9
+
10
+ it { should be_a ::Sidekiq::Worker }
11
+ end
12
+
13
+ describe MultiWorker do
14
+ context "when Sidekiq is loaded" do
15
+ it "defaults to the :sidekiq adapter" do
16
+ MultiWorker.default_adapter.should == :sidekiq
17
+ end
18
+ end
19
+
20
+ context "when using the :sidekiq adapter" do
21
+ it "performs the work using Sidekiq" do
22
+ TestWorker.perform_async("foo")
23
+ MultiWorker.enqueue(TestWorker, "foo")
24
+ TestWorker.jobs.size.should == 2
25
+ end
26
+
27
+ it "forwards ::perform to #perform" do
28
+ expect(TestWorker).to receive(:perform).once.with("foo")
29
+ TestWorker.perform("foo")
30
+ end
31
+
32
+ context "with advanced options" do
33
+ context "when configuring the :retry option" do
34
+ context "with a hash" do
35
+ it "configures limit and delay" do
36
+ retry_worker = Class.new do
37
+ worker :retry => {:limit => 10, :delay => lambda {|count| count*5} }
38
+ end
39
+
40
+ retry_worker.get_sidekiq_options['retry'].should == 10
41
+ retry_worker.sidekiq_retry_in_block.call(3).should == 15
42
+ end
43
+ end
44
+
45
+ context "with a number" do
46
+ it "configures limit" do
47
+ retry_worker = Class.new do
48
+ worker :retry => 15
49
+ end
50
+
51
+ retry_worker.get_sidekiq_options['retry'].should == 15
52
+ end
53
+ end
54
+
55
+ context "with a boolean" do
56
+ it "configures retry" do
57
+ retry_worker = Class.new do
58
+ worker :retry => true
59
+ end
60
+
61
+ retry_worker.get_sidekiq_options['retry'].should == true
62
+ end
63
+ end
64
+ end
65
+
66
+ it "configures :lock option" do
67
+ locking_worker = Class.new do
68
+ worker :lock => true
69
+ end
70
+
71
+ locking_worker.get_sidekiq_options['lock'].should == true
72
+ end
73
+
74
+ it "configures :unique option" do
75
+ unique_worker = Class.new do
76
+ worker :unique => true
77
+ end
78
+
79
+ unique_worker.get_sidekiq_options['unique'].should == true
80
+ end
81
+
82
+ it "configures :status option" do
83
+ status_worker = Class.new do
84
+ worker :status => true
85
+ end
86
+
87
+ status_worker.new.should be_a ::SidekiqStatus::Worker
88
+ end
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,36 @@
1
+ require 'sneakers'
2
+ Sneakers.configure(:env => 'test')
3
+
4
+ require 'test_workers'
5
+
6
+ describe TestWorker do
7
+ it_behaves_like "a worker"
8
+
9
+ it { should be_a ::Sneakers::Worker }
10
+ end
11
+
12
+ describe MultiWorker do
13
+ context "when Sneakers is loaded" do
14
+ it "defaults to the :qu adapter" do
15
+ MultiWorker.default_adapter.should == :sneakers
16
+ end
17
+ end
18
+
19
+ context "when using the :sneakers adapter" do
20
+ let(:worker) { TestWorker.new }
21
+
22
+ context "when calling #perform_async" do
23
+ it "publishes a message to the queue" do
24
+ expect(::Sneakers).to receive(:publish).once
25
+ worker.perform_async("foo")
26
+ end
27
+ end
28
+
29
+ context "when Sneakers calls #work" do
30
+ it "calls #perform" do
31
+ expect(worker).to receive(:perform).once.with("foo")
32
+ worker.work(["foo"].to_json)
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,36 @@
1
+ require 'sucker_punch'
2
+ require 'sucker_punch/testing/inline'
3
+
4
+ require 'test_workers'
5
+
6
+ describe TestWorker do
7
+ it_behaves_like "a worker"
8
+
9
+ it { should be_a ::SuckerPunch::Job }
10
+ end
11
+
12
+ describe MultiWorker do
13
+ context "when Sucker Punch is loaded" do
14
+ it "defaults to the :sucker_punch adapter" do
15
+ MultiWorker.default_adapter.should == :sucker_punch
16
+ end
17
+ end
18
+
19
+ context "when using the :sucker_punch adapter" do
20
+ before(:each) do
21
+ TestWorker.any_instance.should_receive(:perform).once.with("foo")
22
+ end
23
+
24
+ it "::perform_async uses Sucker Punch" do
25
+ TestWorker.perform_async("foo")
26
+ end
27
+
28
+ it "MultiWorker.enqueue uses Sucker Punch" do
29
+ MultiWorker.enqueue(TestWorker, "foo")
30
+ end
31
+
32
+ it "::perform delegates to #perform" do
33
+ TestWorker.perform("foo")
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,25 @@
1
+ require 'threaded_in_memory_queue'
2
+ ThreadedInMemoryQueue.inline = true
3
+
4
+ require 'test_workers'
5
+
6
+ describe TestWorker do
7
+ it_behaves_like "a worker"
8
+ end
9
+
10
+ describe MultiWorker do
11
+ context "when ThreadedInMemoryQueue is loaded" do
12
+ it "defaults to the :threaded_in_memory_queue adapter" do
13
+ MultiWorker.default_adapter.should == :threaded_in_memory_queue
14
+ end
15
+ end
16
+
17
+ context "when using the :threaded_in_memory_queue adapter" do
18
+ it "performs the work using ThreadedInMemoryQueue" do
19
+ expect(TestWorker).to receive(:perform).exactly(3).times.with("foo")
20
+ TestWorker.perform_async("foo")
21
+ MultiWorker.enqueue(TestWorker, "foo")
22
+ TestWorker.perform("foo")
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,31 @@
1
+ exit unless jruby?
2
+
3
+ require 'torquebox/messaging'
4
+ require 'torquebox/messaging/backgroundable'
5
+ require 'torquebox/core'
6
+ #java_import 'org.torquebox.core.util.StringUtils'
7
+
8
+ require 'test_workers'
9
+
10
+ describe TestWorker do
11
+ it_behaves_like "a worker"
12
+
13
+ it { should be_a ::TorqueBox::Messaging::Backgroundable}
14
+ end
15
+
16
+ describe MultiWorker do
17
+ context "when TorqueBox::Messaging::Backgroundable is loaded" do
18
+ it "defaults to the :sidekiq adapter" do
19
+ MultiWorker.default_adapter.should == :torquebox_backgroundable
20
+ end
21
+ end
22
+
23
+ context "when using the :torquebox_backgroundable adapter" do
24
+ it "puts a message on the queue" do
25
+ #@queue.should_receive(:publish).exactly(2).times
26
+ TorqueBox::Messaging::Backgroundable::Util.should_receive(:publish_message).exactly(2).times
27
+ TestWorker.perform_async("foo")
28
+ MultiWorker.enqueue(TestWorker, "foo")
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,59 @@
1
+ describe MultiWorker do
2
+ context 'configuration' do
3
+ it 'yields itself in a configuration block' do
4
+ MultiWorker.configure do
5
+ self.should == MultiWorker
6
+ end
7
+ end
8
+
9
+ it 'allows the default adapter to be set' do
10
+ MultiWorker.configure do
11
+ default_adapter :foo
12
+ end
13
+
14
+ MultiWorker.default_adapter.should == :foo
15
+
16
+ MultiWorker.instance_variable_set(:@default_adapter, nil)
17
+ end
18
+
19
+ it 'picks a default adapter automatically' do
20
+ MultiWorker.default_adapter.should_not be_nil
21
+ end
22
+
23
+ it 'provides default options' do
24
+ MultiWorker.default_options[:queue].should == :default
25
+ MultiWorker.default_options[:retry].should == false
26
+ MultiWorker.default_options[:lock].should == false
27
+ MultiWorker.default_options[:unique].should == false
28
+ MultiWorker.default_options[:status].should == false
29
+ end
30
+
31
+ it 'allows default options to be customized' do
32
+ MultiWorker.configure do
33
+ default_options :retry => true, :unique => true
34
+ end
35
+
36
+ MultiWorker.default_options[:retry].should == true
37
+ MultiWorker.default_options[:lock].should == false
38
+ MultiWorker.default_options[:unique].should == true
39
+ MultiWorker.default_options[:status].should == false
40
+
41
+ MultiWorker.instance_variable_set(:@default_options, nil)
42
+ end
43
+
44
+ it 'allows default options to be overriden on the worker' do
45
+ MultiWorker.configure do
46
+ default_adapter :foo
47
+ end
48
+
49
+ require 'multi_worker/adapters/inline'
50
+ MultiWorker::Adapters::Inline.should_receive(:configure) do |klass, opts|
51
+ opts[:queue].should == :background
52
+ end
53
+
54
+ custom_worker = Class.new do
55
+ worker :adapter => :inline, :queue => :background
56
+ end
57
+ end
58
+ end
59
+ end