Skip to content

Commit 89c3a0b

Browse files
author
David Heinemeier Hansson
committed
Added eval jobs as a low ceremony way of declaring jobs without an explicit class (poor man's block marshalling)
1 parent 4fd41a9 commit 89c3a0b

2 files changed

Lines changed: 40 additions & 6 deletions

File tree

lib/delayed/job.rb

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -76,12 +76,23 @@ def reschedule(message, backtrace = [], time = nil)
7676
end
7777
end
7878

79-
def self.enqueue(object, priority = 0, run_at = nil)
80-
unless object.respond_to?(:perform)
81-
raise ArgumentError, 'Cannot enqueue items which do not respond to perform'
82-
end
79+
def self.enqueue(*args, &block)
80+
if block_given?
81+
priority = args.first || 0
82+
run_at = args.second
83+
84+
Job.create(:payload_object => EvaledJob.new(&block), :priority => priority.to_i, :run_at => run_at)
85+
else
86+
object = args.first
87+
priority = args.second || 0
88+
run_at = args.third
89+
90+
unless object.respond_to?(:perform)
91+
raise ArgumentError, 'Cannot enqueue items which do not respond to perform'
92+
end
8393

84-
Job.create(:payload_object => object, :priority => priority.to_i, :run_at => run_at)
94+
Job.create(:payload_object => object, :priority => priority.to_i, :run_at => run_at)
95+
end
8596
end
8697

8798
def self.find_available(limit = 5, max_run_time = MAX_RUN_TIME)
@@ -254,4 +265,14 @@ def before_save
254265
end
255266

256267
end
257-
end
268+
269+
class EvaledJob
270+
def initialize
271+
@job = yield
272+
end
273+
274+
def perform
275+
eval(@job)
276+
end
277+
end
278+
end

spec/job_spec.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,19 @@ def perform; @@runs += 1; end
7171
end
7272

7373

74+
it "should work with eval jobs" do
75+
$eval_job_ran = false
76+
77+
Delayed::Job.enqueue do <<-JOB
78+
$eval_job_ran = true
79+
JOB
80+
end
81+
82+
Delayed::Job.work_off
83+
84+
$eval_job_ran.should == true
85+
end
86+
7487
it "should work with jobs in modules" do
7588
M::ModuleJob.runs.should == 0
7689

0 commit comments

Comments
 (0)