Class: Sawyer::Serializer
- Inherits:
-
Object
- Object
- Sawyer::Serializer
- Defined in:
- lib/sawyer/serializer.rb
Class Method Summary collapse
Instance Method Summary collapse
-
#decode(data) ⇒ Object
(also: #load)
Public: Decodes a String into an Object (usually a Hash or Array of Hashes).
- #decode_hash(hash) ⇒ Object
- #decode_hash_value(key, value) ⇒ Object
- #decode_object(data) ⇒ Object
-
#encode(data) ⇒ Object
(also: #dump)
Public: Encodes an Object (usually a Hash or Array of Hashes).
- #encode_hash(hash) ⇒ Object
- #encode_object(data) ⇒ Object
-
#initialize(format, dump_method_name = nil, load_method_name = nil) ⇒ Serializer
constructor
Public: Wraps a serialization format for Sawyer.
- #time_field?(key, value) ⇒ Boolean
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_json ⇒ Object
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 |
.json ⇒ Object
18 19 20 21 22 |
# File 'lib/sawyer/serializer.rb', line 18 def self.json require 'json' new(JSON) rescue LoadError end |
.message_pack ⇒ Object
30 31 32 33 34 |
# File 'lib/sawyer/serializer.rb', line 30 def self. require 'msgpack' new(MessagePack, :pack, :unpack) rescue LoadError end |
.multi_json ⇒ Object
24 25 26 27 28 |
# File 'lib/sawyer/serializer.rb', line 24 def self.multi_json require 'multi_json' new(MultiJson) rescue LoadError end |
.yajl ⇒ Object
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
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 |