Module: Promiscuous::Publisher::Model::Base::PromiscuousMethodsBase

Included in:
PromiscuousMethods, Ephemeral::PromiscuousMethods, Mock::PromiscuousMethods, Mongoid::PromiscuousMethods
Defined in:
lib/promiscuous/publisher/model/base.rb

Instance Method Summary collapse

Instance Method Details

#attribute(attr) ⇒ Object



35
36
37
38
39
# File 'lib/promiscuous/publisher/model/base.rb', line 35

def attribute(attr)
  value = @instance.__send__(attr)
  value = value.promiscuous.payload if value.respond_to?(:promiscuous)
  value
end

#attributesObject



31
32
33
# File 'lib/promiscuous/publisher/model/base.rb', line 31

def attributes
  Hash[@instance.class.published_attrs.map { |attr| [attr, self.attribute(attr)] }]
end

#get_dependency(attr, value) ⇒ Object



41
42
43
44
45
# File 'lib/promiscuous/publisher/model/base.rb', line 41

def get_dependency(attr, value)
  return nil unless value
  @collection ||= @instance.class.promiscuous_collection_name
  Promiscuous::Dependency.new(@collection, attr, value)
end

#initialize(instance) ⇒ Object



15
16
17
# File 'lib/promiscuous/publisher/model/base.rb', line 15

def initialize(instance)
  @instance = instance
end

#payload(options = {}) ⇒ Object



19
20
21
22
23
24
25
26
27
28
29
# File 'lib/promiscuous/publisher/model/base.rb', line 19

def payload(options={})
  msg = {}
  msg[:types] = @instance.class.ancestors.select { |a| a < Promiscuous::Publisher::Model::Base }.map(&:publish_as)
  msg[:id]    = @instance.id.to_s
  unless options[:with_attributes] == false
    # promiscuous_payload is useful to implement relays
    msg[:attributes] = @instance.respond_to?(:promiscuous_payload) ? @instance.promiscuous_payload :
                                                                     self.attributes
  end
  msg
end

#tracked_dependencies(options = {}) ⇒ Object



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/promiscuous/publisher/model/base.rb', line 47

def tracked_dependencies(options={})
  # FIXME This is not sufficient, we need to consider the previous and next
  # values in case of an update.
  # Note that the caller expect the id dependency to come first
  @instance.class.tracked_attrs.map do |attr|
    begin
      [attr, @instance.__send__(attr)]
    rescue Exception => e
      # Don't care about missing attributes for read dependencies.
      raise e unless options[:allow_missing_attributes] && e.is_a?(ActiveModel::MissingAttributeError)
    end
  end
  .map { |attr, value| get_dependency(attr, value) }
  .compact
end