class Reactor::Event
Constants
- CONSOLE_CONFIRMATION_MESSAGE
Attributes
__data__[RW]
Public Class Methods
new(data = {})
click to toggle source
# File lib/reactor/event.rb, line 14 def initialize(data = {}) self.__data__ = {}.with_indifferent_access data.each do |key, value| value = value.encode('UTF-8', invalid: :replace, undef: :replace, replace: '') if value.is_a?(String) self.send("#{key}=", value) end end
perform(name, data)
click to toggle source
# File lib/reactor/event.rb, line 59 def perform(name, data) new.perform(name, data) end
publish(name, data = {})
click to toggle source
# File lib/reactor/event.rb, line 63 def publish(name, data = {}) if defined?(Rails::Console) && ENV['RACK_ENV'] == 'production' && data[:srsly].blank? && !ENV['REACTOR_CONSOLE_ENABLED'] raise ArgumentError.new(CONSOLE_CONFIRMATION_MESSAGE) end message = new(data.merge(event: name, uuid: SecureRandom.uuid)) Reactor.validator.call(message) if message.at perform_at message.at, name, message.__data__ else perform_async name, message.__data__ end end
reschedule(name, data = {})
click to toggle source
# File lib/reactor/event.rb, line 80 def reschedule(name, data = {}) scheduled_jobs = Sidekiq::ScheduledSet.new # Note that scheduled_jobs#fetch returns only jobs matching the data[:was] # timestamp - down to fractions of a second job = scheduled_jobs.fetch(data[:was].to_f).detect do |job| next if job['class'] != self.name.to_s same_event_name = job['args'].first == name.to_s if data[:actor] same_actor = job['args'].second['actor_type'] == data[:actor].class.name && job['args'].second['actor_id'] == data[:actor].id same_event_name && same_actor else same_event_name end end job.delete if job publish(name, data.except([:was, :if])) if data[:at].try(:future?) end
Public Instance Methods
method_missing(method, *args)
click to toggle source
# File lib/reactor/event.rb, line 46 def method_missing(method, *args) if method.to_s.include?('=') try_setter(method, *args) else try_getter(method) end end
perform(name, data)
click to toggle source
# File lib/reactor/event.rb, line 22 def perform(name, data) data = data.with_indifferent_access if data['actor_type'] actor = data["actor_type"].constantize.unscoped.find(data["actor_id"]) publishable_event = actor.class.events[name.to_sym] ifarg = publishable_event[:if] if publishable_event end need_to_fire = case ifarg when Proc actor.instance_exec(&ifarg) when Symbol actor.send(ifarg) when NilClass true end if need_to_fire data.merge!(fired_at: Time.current, name: name) fire_block_subscribers(data, name) end end
to_s()
click to toggle source
# File lib/reactor/event.rb, line 54 def to_s name end
Private Instance Methods
fire_block_subscribers(data, name)
click to toggle source
# File lib/reactor/event.rb, line 132 def fire_block_subscribers(data, name) ((Reactor::SUBSCRIBERS[name.to_s] || []) | (Reactor::SUBSCRIBERS['*'] || [])).each do |s| s.perform_where_needed(data) end end
initialize_polymorphic_association(method)
click to toggle source
# File lib/reactor/event.rb, line 128 def initialize_polymorphic_association(method) __data__["#{method}_type"].constantize.find(__data__["#{method}_id"]) end
polymorphic_association?(method)
click to toggle source
# File lib/reactor/event.rb, line 124 def polymorphic_association?(method) __data__.has_key?("#{method}_type") end
try_getter(method)
click to toggle source
# File lib/reactor/event.rb, line 116 def try_getter(method) if polymorphic_association? method initialize_polymorphic_association method elsif __data__.has_key?(method) __data__[method] end end
try_setter(method, object, *args)
click to toggle source
# File lib/reactor/event.rb, line 107 def try_setter(method, object, *args) if object.is_a? ActiveRecord::Base send("#{method}_id", object.id) send("#{method}_type", object.class.to_s) else __data__[method.to_s.gsub('=','')] = object end end