class Reactor::Subscription

Attributes

action[R]
delay[R]
deprecated[R]
event_name[R]
handler_name[R]
sidekiq_options[R]
source[R]
worker_class[R]

Public Class Methods

build_handler_name(event_name, handler_name_option = nil) click to toggle source
# File lib/reactor/subscription.rb, line 7
def self.build_handler_name(event_name, handler_name_option = nil)
  if handler_name_option
    handler_name_option.to_s.camelize
  elsif event_name == '*'
    'WildcardHandler'
  else
    "#{event_name.to_s.camelize}Handler"
  end
end
new(options = {}, &block) click to toggle source
# File lib/reactor/subscription.rb, line 17
def initialize(options = {}, &block)
  @source = options[:source]
  @handler_name = self.class.build_handler_name(
    options[:event_name], options[:handler_name]
  )

  @event_name = options[:event_name]
  @action = options[:action] || block

  @delay = options[:delay].to_i
  @deprecated = !!options[:deprecated]
  @sidekiq_options = options[:sidekiq_options] || {}
  build_worker_class
end

Public Instance Methods

event_handler_names() click to toggle source
# File lib/reactor/subscription.rb, line 37
def event_handler_names
  @event_handler_names ||= []
end
generate_namespace() click to toggle source
# File lib/reactor/subscription.rb, line 46
def generate_namespace
  module_chain.reduce(Reactor.subscriber_namespace) do |mod, name|
    unless mod.const_defined?(name, false)
      mod.const_set(name, Module.new)
    end
    mod.const_get(name)
  end
end
handler_defined?() click to toggle source
# File lib/reactor/subscription.rb, line 32
def handler_defined?
  namespace.const_defined?(handler_name) &&
    namespace.const_get(handler_name).parents.include?(Reactor.subscriber_namespace)
end
mailer_subscriber?() click to toggle source
# File lib/reactor/subscription.rb, line 55
def mailer_subscriber?
  !!(source < ActionMailer::Base)
end
namespace() click to toggle source
# File lib/reactor/subscription.rb, line 41
def namespace
  return @namespace if @namespace
  @namespace = generate_namespace
end

Private Instance Methods

build_event_worker() click to toggle source
# File lib/reactor/subscription.rb, line 73
def build_event_worker
  subscription = self
  Class.new(Reactor::Workers::EventWorker) do
    self.source = subscription.source
    self.action = subscription.action
    self.delay  = subscription.delay
    self.deprecated  = subscription.deprecated
    self.sidekiq_options subscription.sidekiq_options
  end
end
build_mailer_worker() click to toggle source
# File lib/reactor/subscription.rb, line 84
def build_mailer_worker
  subscription = self
  Class.new(Reactor::Workers::MailerWorker) do
    self.source = subscription.source
    self.action = subscription.action
    self.delay  = subscription.delay
    self.deprecated  = subscription.deprecated
    self.sidekiq_options subscription.sidekiq_options
  end
end
build_worker_class() click to toggle source
# File lib/reactor/subscription.rb, line 65
def build_worker_class

  worker_class = mailer_subscriber? ? build_mailer_worker : build_event_worker
  namespace.send(:remove_const, handler_name) if handler_defined?
  namespace.const_set(handler_name, worker_class)
  @worker_class = namespace.const_get(handler_name)
end
module_chain() click to toggle source
# File lib/reactor/subscription.rb, line 61
def module_chain
  source.name.split('::')
end