Class: Sawyer::Serializer

Inherits:
Object
  • Object
show all
Defined in:
lib/sawyer/serializer.rb

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(format, dump_method_name = nil, load_method_name = nil) ⇒ Serializer

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.


39
40
41
42
43
# File 'lib/sawyer/serializer.rb', line 39

def initialize(format, dump_method_name = nil, load_method_name = nil)
  @format = format
  @dump = @format.method(dump_method_name || :dump)
  @load = @format.method(load_method_name || :load)
end

Class Method Details

.any_jsonObject


6
7
8
9
10
# File 'lib/sawyer/serializer.rb', line 6

def self.any_json
  yajl || multi_json || json || begin
    raise RuntimeError, "Sawyer requires a JSON gem: yajl, multi_json, or json"
  end
end

.jsonObject


18
19
20
21
22
# File 'lib/sawyer/serializer.rb', line 18

def self.json
  require 'json'
  new(JSON)
rescue LoadError
end

.message_packObject


30
31
32
33
34
# File 'lib/sawyer/serializer.rb', line 30

def self.message_pack
  require 'msgpack'
  new(MessagePack, :pack, :unpack)
rescue LoadError
end

.multi_jsonObject


24
25
26
27
28
# File 'lib/sawyer/serializer.rb', line 24

def self.multi_json
  require 'multi_json'
  new(MultiJson)
rescue LoadError
end

.yajlObject


12
13
14
15
16
# File 'lib/sawyer/serializer.rb', line 12

def self.yajl
  require 'yajl'
  new(Yajl)
rescue LoadError
end

Instance Method Details

#decode(data) ⇒ Object Also known as: load

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

data - An encoded String.

Returns a decoded Object.


62
63
64
65
# File 'lib/sawyer/serializer.rb', line 62

def decode(data)
  return nil if data.nil? || data.strip.empty?
  decode_object(@load.call(data))
end

#decode_hash(hash) ⇒ Object


96
97
98
99
100
101
# File 'lib/sawyer/serializer.rb', line 96

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) ⇒ Object


103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/sawyer/serializer.rb', line 103

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) ⇒ Object


88
89
90
91
92
93
94
# File 'lib/sawyer/serializer.rb', line 88

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

#encode(data) ⇒ Object Also known as: dump

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

data - Object to be encoded.

Returns an encoded String.


50
51
52
# File 'lib/sawyer/serializer.rb', line 50

def encode(data)
  @dump.call(encode_object(data))
end

#encode_hash(hash) ⇒ Object


77
78
79
80
81
82
83
84
85
86
# File 'lib/sawyer/serializer.rb', line 77

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) ⇒ Object


69
70
71
72
73
74
75
# File 'lib/sawyer/serializer.rb', line 69

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

#time_field?(key, value) ⇒ Boolean

Returns:

  • (Boolean)

125
126
127
# File 'lib/sawyer/serializer.rb', line 125

def time_field?(key, value)
  value && (key =~ /_(at|on)\z/ || key =~ /(\A|_)date\z/)
end