/
class_methods.rb
43 lines (36 loc) · 1.25 KB
/
class_methods.rb
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
# frozen_string_literal: true
require "sidekiq/extensions/generic_proxy"
module Sidekiq
module Extensions
##
# Adds `delay`, `delay_for` and `delay_until` methods to all Classes to offload class method
# execution to Sidekiq.
#
# @example
# User.delay.delete_inactive
# Wikipedia.delay.download_changes_for(Date.today)
#
class DelayedClass
include Sidekiq::Worker
def perform(yml)
(target, method_name, args, kwargs) = YAML.load(yml)
kwargs.empty? ? target.__send__(method_name, *args) : target.__send__(method_name, *args, **kwargs)
end
end
module Klass
def sidekiq_delay(options = {})
Proxy.new(DelayedClass, self, options)
end
def sidekiq_delay_for(interval, options = {})
Proxy.new(DelayedClass, self, options.merge("at" => Time.now.to_f + interval.to_f))
end
def sidekiq_delay_until(timestamp, options = {})
Proxy.new(DelayedClass, self, options.merge("at" => timestamp.to_f))
end
alias_method :delay, :sidekiq_delay
alias_method :delay_for, :sidekiq_delay_for
alias_method :delay_until, :sidekiq_delay_until
end
end
end
Module.__send__(:include, Sidekiq::Extensions::Klass) unless defined?(::Rails)