class BookingSync::API::Serializer

Public Class Methods

new(dump_method_name = nil, load_method_name = nil) click to toggle source

Public: Wraps a serialization format for Sawyer. Nested objects are prepared for serialization (such as changing Times to ISO 8601 Strings). Any serialization format that responds to dump and load will work.

# File lib/bookingsync/api/serializer.rb, line 10
def initialize(dump_method_name = nil, load_method_name = nil)
  @format = JSON
  @dump = @format.method(dump_method_name || :dump)
  @load = @format.method(load_method_name || :load)
end

Public Instance Methods

decode(data) click to toggle source

Public: Decodes a String into an Object (usually a Hash or Array of Hashes).

data - An encoded String.

Returns a decoded Object.

# File lib/bookingsync/api/serializer.rb, line 33
def decode(data)
  return nil if data.nil? || data.empty?
  decode_object(@load.call(data))
end
Also aliased as: load
decode_hash(hash) click to toggle source
# File lib/bookingsync/api/serializer.rb, line 67
def decode_hash(hash)
  hash.keys.each do |key|
    hash[key.to_sym] = decode_hash_value(key, hash.delete(key))
  end
  hash
end
decode_hash_value(key, value) click to toggle source
# File lib/bookingsync/api/serializer.rb, line 74
def decode_hash_value(key, value)
  if time_field?(key, value)
    if value.is_a?(String)
      begin
        Time.parse(value)
      rescue ArgumentError
        value
      end
    elsif value.is_a?(Integer) || value.is_a?(Float)
      Time.at(value)
    else
      value
    end
  elsif value.is_a?(Hash)
    decode_hash(value)
  elsif value.is_a?(Array)
    value.map { |o| decode_hash_value(key, o) }
  else
    value
  end
end
decode_object(data) click to toggle source
# File lib/bookingsync/api/serializer.rb, line 59
def decode_object(data)
  case data
  when Hash then decode_hash(data)
  when Array then data.map { |o| decode_object(o) }
  else data
  end
end
dump(data)
Alias for: encode
encode(data) click to toggle source

Public: Encodes an Object (usually a Hash or Array of Hashes).

data - Object to be encoded.

Returns an encoded String.

# File lib/bookingsync/api/serializer.rb, line 21
def encode(data)
  @dump.call(encode_object(data))
end
Also aliased as: dump
encode_hash(hash) click to toggle source
# File lib/bookingsync/api/serializer.rb, line 48
def encode_hash(hash)
  hash.keys.each do |key|
    case value = hash[key]
    when Date then hash[key] = value.to_time.utc.xmlschema
    when Time then hash[key] = value.utc.xmlschema
    when Hash then hash[key] = encode_hash(value)
    end
  end
  hash
end
encode_object(data) click to toggle source
# File lib/bookingsync/api/serializer.rb, line 40
def encode_object(data)
  case data
  when Hash then encode_hash(data)
  when Array then data.map { |o| encode_object(o) }
  else data
  end
end
load(data)
Alias for: decode
time_field?(key, value) click to toggle source
# File lib/bookingsync/api/serializer.rb, line 96
def time_field?(key, value)
  value && (key =~ /_(at|on)\z/ || key =~ /(\A|_)date\z/)
end