Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Now performable method handles block given #1

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions lib/delayed/message_sending.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ def initialize(payload_class, target, options)
end

# rubocop:disable MethodMissing
def method_missing(method, *args)
Job.enqueue({:payload_object => @payload_class.new(@target, method.to_sym, args)}.merge(@options))
def method_missing(method, *args, &block)
Job.enqueue({:payload_object => @payload_class.new(@target, method.to_sym, args, &block)}.merge(@options))
end
# rubocop:enable MethodMissing
end
Expand Down
2 changes: 1 addition & 1 deletion lib/delayed/performable_mailer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
module Delayed
class PerformableMailer < PerformableMethod
def perform
mailer = object.send(method_name, *args)
mailer = object.send(method_name, *args, &block)
mailer.respond_to?(:deliver_now) ? mailer.deliver_now : mailer.deliver
end
end
Expand Down
11 changes: 6 additions & 5 deletions lib/delayed/performable_method.rb
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
module Delayed
class PerformableMethod
attr_accessor :object, :method_name, :args
attr_accessor :object, :method_name, :args, :block

def initialize(object, method_name, args)
def initialize(object, method_name, args, &block)
raise NoMethodError, "undefined method `#{method_name}' for #{object.inspect}" unless object.respond_to?(method_name, true)

if object.respond_to?(:persisted?) && !object.persisted?
Expand All @@ -12,6 +12,7 @@ def initialize(object, method_name, args)
self.object = object
self.args = args
self.method_name = method_name.to_sym
self.block = block
end

def display_name
Expand All @@ -23,16 +24,16 @@ def display_name
end

def perform
object.send(method_name, *args) if object
object.send(method_name, *args, &block) if object
end

def method(sym)
object.method(sym)
end

# rubocop:disable MethodMissing
def method_missing(symbol, *args)
object.send(symbol, *args)
def method_missing(symbol, *args, &block)
object.send(symbol, *args, &block)
end
# rubocop:enable MethodMissing

Expand Down
2 changes: 2 additions & 0 deletions spec/helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -78,10 +78,12 @@ def self.root
class Story < ActiveRecord::Base
self.primary_key = 'story_id'
def tell
yield text if block_given?
text
end

def whatever(n, _)
yield tell * n if block_given?
tell * n
end
default_scope { where(:scoped => true) }
Expand Down
9 changes: 7 additions & 2 deletions spec/message_sending_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,13 @@ def tell!(_arg); end
it 'creates a PerformableMethod' do
story = Story.create
expect do
job = story.tell!(1)
job = story.tell!(1) do |text|
puts text
end
expect(job.payload_object.class).to eq(Delayed::PerformableMethod)
expect(job.payload_object.method_name).to eq(:tell_without_delay!)
expect(job.payload_object.args).to eq([1])
expect(job.payload_object.block).not_to be_nil
end.to(change { Delayed::Job.count })
end

Expand Down Expand Up @@ -78,10 +81,12 @@ def tell

it 'creates a new PerformableMethod job' do
expect do
job = 'hello'.delay.count('l')
proc = Proc.new {}
job = 'hello'.delay.count('l', &proc)
expect(job.payload_object.class).to eq(Delayed::PerformableMethod)
expect(job.payload_object.method_name).to eq(:count)
expect(job.payload_object.args).to eq(['l'])
expect(job.payload_object.block).to eq(proc)
end.to change { Delayed::Job.count }.by(1)
end

Expand Down
7 changes: 5 additions & 2 deletions spec/performable_method_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
describe Delayed::PerformableMethod do
describe 'perform' do
before do
@method = Delayed::PerformableMethod.new('foo', :count, ['o'])
@proc = Proc.new{}
@method = Delayed::PerformableMethod.new('foo', :count, ['o'], &@proc)
end

context 'with the persisted record cannot be found' do
Expand All @@ -17,7 +18,9 @@
end

it 'calls the method on the object' do
expect(@method.object).to receive(:count).with('o')
expect(@method.object).to receive(:count).with('o') do |*args, &block|
expect(@proc).to eq(block)
end
@method.perform
end
end
Expand Down