class Postmaster::PostmasterObject

Public Class Methods

construct_from(values) click to toggle source
# File lib/postmaster/postmaster_object.rb, line 19
def self.construct_from(values)
  obj = self.new(values[:id])
  obj.refresh_from(values)
  obj
end
new(id=nil) click to toggle source
# File lib/postmaster/postmaster_object.rb, line 10
def initialize(id=nil)
  @values = {}
  # This really belongs in APIResource, but not putting it there allows us
  # to have a unified inspect method
  @unsaved_values = Set.new
  @transient_values = Set.new
  self.id = id if id
end

Public Instance Methods

[](k) click to toggle source
# File lib/postmaster/postmaster_object.rb, line 87
def [](k)
  k = k.to_sym if k.kind_of?(String)
  @values[k]
end
[]=(k, v) click to toggle source
# File lib/postmaster/postmaster_object.rb, line 92
def []=(k, v)
  k = k.to_sym if k.kind_of?(String)
  send(:"#{k}=", v)
end
delete(k) click to toggle source
# File lib/postmaster/postmaster_object.rb, line 102
def delete(k)
  k = k.to_sym if k.kind_of?(String)
  @values.delete(k)
  remove_accessors([k])
end
each(&blk) click to toggle source
# File lib/postmaster/postmaster_object.rb, line 132
def each(&blk)
  @values.each(&blk)
end
has_key?(k) click to toggle source
# File lib/postmaster/postmaster_object.rb, line 97
def has_key?(k)
  k = k.to_sym if k.kind_of?(String)
  @values.has_key?(k)
end
inspect() click to toggle source
# File lib/postmaster/postmaster_object.rb, line 29
def inspect()
  id_string = (self.respond_to?(:id) && !self.id.nil?) ? " id=#{self.id}" : ""
  "#<#{self.class}:0x#{self.object_id.to_s(16)}#{id_string}> JSON: " + Postmaster::JSON.dump(@values, :pretty => true)
end
keys() click to toggle source
# File lib/postmaster/postmaster_object.rb, line 108
def keys
  @values.keys
end
refresh_from(values) click to toggle source
# File lib/postmaster/postmaster_object.rb, line 34
def refresh_from(values)
  # which keys should be converted to Postmaster_Objects
  obj_keys = {
    'Postmaster::Shipment.to' => Postmaster::Address,
    'Postmaster::Shipment.from' => Postmaster::Address,
    'Postmaster::Shipment.package' => Postmaster::Package,
    'Postmaster::AddressProposal.address' => Postmaster::Address,
    'Postmaster::Tracking.last_update' => 'DateTime',
    'Postmaster::TrackingHistory.timestamp' => 'DateTime',
    'Postmaster::TransitTime.delivery_timestamp' => 'DateTime'
  }
  
  # which keys should be converted to list of Postmaster_Objects
  obj_list_keys = {
    'Postmaster::AddressValidation.addresses' => Postmaster::Address,
    'Postmaster::Shipment.packages' => Postmaster::Package,
    'Postmaster::Tracking.history' => Postmaster::TrackingHistory
  }
    
  removed = Set.new(@values.keys - values.keys)
  added = Set.new(values.keys - @values.keys)
  # Wipe old state before setting new.  This is useful for e.g. updating a
  # customer, where there is no persistent card parameter.  Mark those values
  # which don't persist as transient

  instance_eval do
    remove_accessors(removed)
    add_accessors(added)
  end
  removed.each do |k|
    @values.delete(k)
  end
  values.each do |k, v|
    full_key = self.class.name + "." + k.to_s
    if obj_keys.has_key?(full_key)
      klass = obj_keys[full_key]
      if klass == 'DateTime'
        @values[k] = DateTime.strptime(v.to_s, '%s')
      else
        @values[k] = klass.construct_from(v)
      end
    elsif obj_list_keys.has_key?(full_key)
      klass = obj_list_keys[full_key]
      @values[k] = []
      v.each do |i|
        @values[k].push(klass.construct_from(i))
      end
    else
      @values[k] = v
    end
  end
end
to_hash() click to toggle source
# File lib/postmaster/postmaster_object.rb, line 120
def to_hash
  result = @values.clone
  result.each do |k, v|
    if v.kind_of? Postmaster::PostmasterObject
      result[k] = v.to_hash
    elsif v.kind_of? Array and v[0].kind_of? Postmaster::PostmasterObject
      result[k] = v.map { |i| i.to_hash }
    end
  end
  result
end
to_json(*a) click to toggle source
# File lib/postmaster/postmaster_object.rb, line 116
def to_json(*a)
  Postmaster::JSON.dump(@values)
end
to_s(*args) click to toggle source
# File lib/postmaster/postmaster_object.rb, line 25
def to_s(*args)
  Postmaster::JSON.dump(@values, :pretty => true)
end
values() click to toggle source
# File lib/postmaster/postmaster_object.rb, line 112
def values
  @values.values
end

Protected Instance Methods

add_accessors(keys) click to toggle source
# File lib/postmaster/postmaster_object.rb, line 152
def add_accessors(keys)
  metaclass.instance_eval do
    keys.each do |k|
      k_eq = :"#{k}="
      define_method(k) { @values[k] }
      define_method(k_eq) do |v|
        @values[k] = v
      end
    end
  end
end
metaclass() click to toggle source
# File lib/postmaster/postmaster_object.rb, line 138
def metaclass
  class << self; self; end
end
method_missing(name, *args) click to toggle source
Calls superclass method
# File lib/postmaster/postmaster_object.rb, line 164
def method_missing(name, *args)
  if name.to_s.end_with?('=')
    attr = name.to_s[0...-1].to_sym
    @values[attr] = args[0]
    add_accessors([attr])
    return
  else
    return @values[name] if @values.has_key?(name)
  end

  super
end
remove_accessors(keys) click to toggle source
# File lib/postmaster/postmaster_object.rb, line 142
def remove_accessors(keys)
  metaclass.instance_eval do
    keys.each do |k|
      k_eq = :"#{k}="
      remove_method(k) if method_defined?(k)
      remove_method(k_eq) if method_defined?(k_eq)
    end
  end
end