collectiveidea / delayed_job

Database based asynchronous priority queue system -- Extracted from Shopify
http://groups.google.com/group/delayed_job
MIT License
4.82k stars 956 forks source link

Missing method Array#sum (unintentional dependency upon ActiveSupport) #499

Open kenkeiter opened 11 years ago

kenkeiter commented 11 years ago

It appears that there's an unintentional dependency upon ActiveSupport's Array#sum method in delayed_job. See the following backtrace:

[Worker(host:Kenneths-MacBook-Pro.local pid:59891)] Starting job worker
rake aborted!
undefined method `sum' for [0, 0]:Array
/Users/kenkeiter/.rvm/gems/ruby-1.9.3-p392/gems/delayed_job-2.1.4/lib/delayed/worker.rb:81:in `block in start'
/Users/kenkeiter/.rvm/gems/ruby-1.9.3-p392/gems/delayed_job-2.1.4/lib/delayed/worker.rb:74:in `loop'
/Users/kenkeiter/.rvm/gems/ruby-1.9.3-p392/gems/delayed_job-2.1.4/lib/delayed/worker.rb:74:in `start'
/Users/kenkeiter/.rvm/gems/ruby-1.9.3-p392/gems/delayed_job-2.1.4/lib/delayed/tasks.rb:9:in `block (2 levels) in <top (required)>'
/Users/kenkeiter/.rvm/gems/ruby-1.9.3-p392/bin/ruby_noexec_wrapper:14:in `eval'
/Users/kenkeiter/.rvm/gems/ruby-1.9.3-p392/bin/ruby_noexec_wrapper:14:in `<main>'

This can easily be patched for Ruby >= 1.9 using:

[].inject(0, :+) # will account for zero-length arrays, too

or, 1.8.x inclusive:

[].inject{|sum,x| sum + x }
synth commented 11 years ago

not only that, but this doesn't protect against @result being nil which can happen if an exception is raised(but handled by a lifecycle callback)