1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
require 'active_support/basic_object'
module Delayed
class DelayProxy < ActiveSupport::BasicObject
def initialize(target, options)
@target = target
@options = options
end
def method_missing(method, *args)
if (Rails.env == "test" or Rails.env == "cucumber" and !$DISABLE_DELAYED_JOB_TEST_ENV_RUN)
@target.send method, *args
return
end
Job.create({
:payload_object => PerformableMethod.new(@target, method.to_sym, args),
:priority => ::Delayed::Worker.default_priority
}.merge(@options))
end
end
module MessageSending
def delay(options = {})
DelayProxy.new(self, options)
end
alias __delay__ delay
def send_later(method, *args)
warn "[DEPRECATION] `object.send_later(:method)` is deprecated. Use `object.delay.method"
__delay__.__send__(method, *args)
end
def send_at(time, method, *args)
warn "[DEPRECATION] `object.send_at(time, :method)` is deprecated. Use `object.delay(:run_at => time).method"
__delay__(:run_at => time).__send__(method, *args)
end
module ClassMethods
def handle_asynchronously(method)
return if (Rails.env == "test" or Rails.env == "cucumber")
aliased_method, punctuation = method.to_s.sub(/([?!=])$/, ''), $1
with_method, without_method = "#{aliased_method}_with_delay#{punctuation}", "#{aliased_method}_without_delay#{punctuation}"
define_method(with_method) do |*args|
delay.__send__(without_method, *args)
end
alias_method_chain method, :delay
end
end
end
end