From 89c3a0b77470c0f8510d3c7a51a36cd07747d9a9 Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Fri, 28 Nov 2008 14:02:09 +0100 Subject: [PATCH] Added eval jobs as a low ceremony way of declaring jobs without an explicit class (poor man's block marshalling) --- lib/delayed/job.rb | 33 +++++++++++++++++++++++++++------ spec/job_spec.rb | 13 +++++++++++++ 2 files changed, 40 insertions(+), 6 deletions(-) diff --git a/lib/delayed/job.rb b/lib/delayed/job.rb index 49d6139f4..ac7298fd3 100644 --- a/lib/delayed/job.rb +++ b/lib/delayed/job.rb @@ -76,12 +76,23 @@ def reschedule(message, backtrace = [], time = nil) end end - def self.enqueue(object, priority = 0, run_at = nil) - unless object.respond_to?(:perform) - raise ArgumentError, 'Cannot enqueue items which do not respond to perform' - end + def self.enqueue(*args, &block) + if block_given? + priority = args.first || 0 + run_at = args.second + + Job.create(:payload_object => EvaledJob.new(&block), :priority => priority.to_i, :run_at => run_at) + else + object = args.first + priority = args.second || 0 + run_at = args.third + + unless object.respond_to?(:perform) + raise ArgumentError, 'Cannot enqueue items which do not respond to perform' + end - Job.create(:payload_object => object, :priority => priority.to_i, :run_at => run_at) + Job.create(:payload_object => object, :priority => priority.to_i, :run_at => run_at) + end end def self.find_available(limit = 5, max_run_time = MAX_RUN_TIME) @@ -254,4 +265,14 @@ def before_save end end -end + + class EvaledJob + def initialize + @job = yield + end + + def perform + eval(@job) + end + end +end \ No newline at end of file diff --git a/spec/job_spec.rb b/spec/job_spec.rb index 91179d275..a19a565e2 100644 --- a/spec/job_spec.rb +++ b/spec/job_spec.rb @@ -71,6 +71,19 @@ def perform; @@runs += 1; end end + it "should work with eval jobs" do + $eval_job_ran = false + + Delayed::Job.enqueue do <<-JOB + $eval_job_ran = true + JOB + end + + Delayed::Job.work_off + + $eval_job_ran.should == true + end + it "should work with jobs in modules" do M::ModuleJob.runs.should == 0