class ReactiveObservers::Observable::Notification

Public Class Methods

new(observed_object, observers, action, options) click to toggle source
# File lib/reactive_observers/observable/notification.rb, line 8
def initialize(observed_object, observers, action, options)
  @observed_object = observed_object
  @observers = observers
  @action = action
  @options = options
end

Public Instance Methods

perform() click to toggle source
# File lib/reactive_observers/observable/notification.rb, line 15
def perform
  filter_observers.each do |observer|
    process observer, @observed_object
    if @action == :update && observer.trigger_with_previous_values
      process observer, @observed_object.clone.assign_attributes(@options[:diff])
    end
  end
end

Private Instance Methods

build_proc_for(variable, object) click to toggle source
# File lib/reactive_observers/observable/notification.rb, line 71
def build_proc_for(variable, object)
  return variable unless variable.is_a? Symbol

  object.method variable
end
filter_observers() click to toggle source
# File lib/reactive_observers/observable/notification.rb, line 26
def filter_observers
  @filtered_observers ||= Filtering.new(@observed_object.id, @observers, @action, @options).perform
end
observer_objects_for(observer, record) click to toggle source
# File lib/reactive_observers/observable/notification.rb, line 58
def observer_objects_for(observer, record)
  return observer_objects_from_klass observer, record if observer.klass_observer?
  return build_proc_for(observer.notify, observer.observer).call(observer.observer, record) if observer.notify.present?

  observer.observer
end
observer_objects_from_klass(observer, record) click to toggle source
# File lib/reactive_observers/observable/notification.rb, line 65
def observer_objects_from_klass(observer, record)
  return build_proc_for(observer.notify, observer.observer).call(record) if observer.notify.present?

  observer.observer.new
end
observer_simplification?(observer, record, observer_object) click to toggle source
# File lib/reactive_observers/observable/notification.rb, line 77
def observer_simplification?(observer, record, observer_object)
  (observer_object == record) || (observer.klass_observer? && observer_object.is_a?(record.class))
end
process(observer, observed_object) click to toggle source
# File lib/reactive_observers/observable/notification.rb, line 30
def process(observer, observed_object)
  return if observer.only.present? && !observer.only.call(observed_object)

  trigger_actions_for observer, Array.wrap(refine_observer_records_for(observer, observed_object))
end
refine_observer_records_for(observer, observed_object) click to toggle source
# File lib/reactive_observers/observable/notification.rb, line 52
def refine_observer_records_for(observer, observed_object)
  return observed_object if observer.refine.blank?

  observer.refine.call observed_object
end
trigger_actions_for(observer, records) click to toggle source
# File lib/reactive_observers/observable/notification.rb, line 36
def trigger_actions_for(observer, records)
  records.each do |record|
    Array.wrap(observer_objects_for(observer, record)).each do |observer_object|
      observer_object = observer_simplification?(observer, observer_object, record) ? record : observer_object
      trigger_observer_action_for observer, observer_object, record
    end
  end
end
trigger_observer_action_for(observer, observer_object, record) click to toggle source
# File lib/reactive_observers/observable/notification.rb, line 45
def trigger_observer_action_for(observer, observer_object, record)
  trigger = build_proc_for observer.trigger, observer_object
  return trigger.call observer.to_h if observer_object == record

  trigger.call record, observer.to_h
end