class Philotic::Message

Constants

NotInstantiableError

Attributes

connection[RW]
delivery_info[RW]
publish_error[RW]
published[W]

Public Class Methods

attr_payload(*names) click to toggle source
# File lib/philotic/message.rb, line 26
def attr_payload(*names)
  attr_payload_accessors.merge(names)
  attr_accessor(*names)
end
attr_payload_accessors() click to toggle source
# File lib/philotic/message.rb, line 17
def attr_payload_accessors
  @attr_payload_accessors ||= Set.new
end
attr_routable(*names) click to toggle source
# File lib/philotic/message.rb, line 21
def attr_routable(*names)
  attr_routable_accessors.merge(names)
  attr_accessor(*names)
end
attr_routable_accessors() click to toggle source
# File lib/philotic/message.rb, line 13
def attr_routable_accessors
  @attr_routable_accessors ||= Set.new
end
inherited(sub_class) click to toggle source
# File lib/philotic/message.rb, line 49
def self.inherited(sub_class)
  sub_class.attr_routable(*Philotic::PHILOTIC_HEADERS)
  sub_class.attr_routable(*self.attr_routable_accessors.dup)
  sub_class.attr_payload(*self.attr_payload_accessors.dup)
end
new(routables={}, payloads={}, connection=nil) click to toggle source
# File lib/philotic/message.rb, line 32
def initialize(routables={}, payloads={}, connection=nil)
  raise NotInstantiableError if self.class == Philotic::Message
  self.timestamp               = Time.now.to_i
  self.philotic_firehose       = true
  self.connection              = connection
  self.philotic_serializations = self.connection.config.serializations

  # dynamically insert any passed in routables into both attr_routable
  # and attr_payload
  # result:  ability to arbitrarily send a easily routable hash
  # over into the bus
  _set_routables_or_payloads(:routable, routables)
  _set_routables_or_payloads(:payload, payloads)

  @published = false
end
publish(*args) click to toggle source
# File lib/philotic/message.rb, line 77
def self.publish(*args)
  message_class = self == Philotic::Message ? Class.new(self) : self
  message_class.new(*args).publish
end

Public Instance Methods

attributes() click to toggle source
# File lib/philotic/message.rb, line 94
def attributes
  payload.merge headers
end
delivery_tag() click to toggle source
# File lib/philotic/message.rb, line 82
def delivery_tag
  delivery_info && delivery_info.delivery_tag
end
headers() click to toggle source
# File lib/philotic/message.rb, line 90
def headers
  _payload_or_headers(:routable)
end
metadata() click to toggle source
# File lib/philotic/message.rb, line 98
def metadata
  @metadata ||= {}
end
metadata=(options) click to toggle source
# File lib/philotic/message.rb, line 102
def metadata=(options)
  @metadata ||= {}
  @metadata.merge! options
end
payload() click to toggle source
# File lib/philotic/message.rb, line 86
def payload
  _payload_or_headers(:payload)
end
publish() click to toggle source
# File lib/philotic/message.rb, line 73
def publish
  connection.publish self
end
published?() click to toggle source
# File lib/philotic/message.rb, line 69
def published?
  !!@published
end

Private Instance Methods

_is_anonymous_message?() click to toggle source
# File lib/philotic/message.rb, line 109
def _is_anonymous_message?
  self.is_a?(Philotic::Message) && self.class.name.nil?
end
_normalize_attr_name(attr) click to toggle source
# File lib/philotic/message.rb, line 159
def _normalize_attr_name(attr)
  %i[_underscore_attr_name].reduce(attr) do |attr, normalizer|
    send(normalizer, attr)
  end.to_sym
end
_payload_or_headers(payload_or_headers) click to toggle source
# File lib/philotic/message.rb, line 113
def _payload_or_headers(payload_or_headers)
  attribute_hash = {}
  self.class.send("attr_#{payload_or_headers}_accessors").each do |attr|
    attr                 = attr.to_sym
    attribute_hash[attr] = send(attr)
  end
  attribute_hash
end
_set_message_attribute(type, key, value) click to toggle source
# File lib/philotic/message.rb, line 133
def _set_message_attribute(type, key, value)
  self.class.send("attr_#{type}_accessors").merge([key])
  _set_message_attribute_accessor(key, value)
end
_set_message_attribute_accessor(attr, value) click to toggle source
# File lib/philotic/message.rb, line 138
def _set_message_attribute_accessor(attr, value)
  attr = _normalize_attr_name(attr)
  _set_message_attribute_getter(attr)
  _set_message_attribute_setter(attr)
  self.send(:"#{attr}=", value)
end
_set_message_attribute_getter(attr) click to toggle source
# File lib/philotic/message.rb, line 145
def _set_message_attribute_getter(attr)
  attr = _normalize_attr_name(attr)
  self.define_singleton_method :"#{attr}" do
    instance_variable_get(:"@#{attr}")
  end
end
_set_message_attribute_setter(attr) click to toggle source
# File lib/philotic/message.rb, line 152
def _set_message_attribute_setter(attr)
  attr = _normalize_attr_name(attr)
  self.define_singleton_method :"#{attr}=" do |v|
    instance_variable_set(:"@#{attr}", v)
  end
end
_set_routables_or_payloads(type, attrs) click to toggle source
# File lib/philotic/message.rb, line 122
def _set_routables_or_payloads(type, attrs)
  attrs.each do |key, value|
    key = _normalize_attr_name(key)
    if self.respond_to?(:"#{key}=")
      send(:"#{key}=", value)
    elsif _is_anonymous_message?
      _set_message_attribute(type, key, value)
    end
  end
end
_underscore_attr_name(attr) click to toggle source
# File lib/philotic/message.rb, line 164
def _underscore_attr_name(attr)
  attr.to_s.tr('-', '_')

end