in lib/twitter_cldr/utils/yaml.rb [148:231]
def emit(obj, level)
case obj
when Array
if (obj.length == 0)
'[]'
else
indent = "\n#{s_indent(level - 1)}"
obj.collect do |o|
"#{indent}- #{emit(o, level + 1)}"
end.join('')
end
when Hash
if (obj.length == 0)
'{}'
else
indent = "\n#{s_indent(level - 1)}"
hash_order = @options[:hash_order]
if (hash_order && level == 1)
hash_keys = obj.keys.sort do |x, y|
x_order = hash_order.index(x) ? hash_order.index(x) : Float::MAX
y_order = hash_order.index(y) ? hash_order.index(y) : Float::MAX
o = (x_order <=> y_order)
(o != 0) ? o : (x.to_s <=> y.to_s)
end
elsif @options[:preserve_order]
hash_keys = obj.keys
else
hash_keys = obj.keys.sort { |x, y| x.to_s <=> y.to_s }
end
hash_keys.collect do |k|
key = emit(k, level + 1)
if (
is_one_plain_line?(key) ||
key =~ /\A(
)
"#{indent}#{key}: #{emit(obj[k], level + 1)}"
else
"#{indent}? #{key}#{indent}: #{emit(obj[k], level + 1)}"
end
end.join('')
end
when NilClass
'~'
when String
emit_string(obj, level)
when TrueClass, FalseClass
obj.to_s
when Integer, Float
obj.to_s
when Date
obj.to_s
when Time
offset = obj.gmtoff
off_hm = sprintf(
'%+.2d:%.2d',
(offset / 3600.0).to_i,
(offset % 3600.0) / 60
)
u_sec = (obj.usec != 0) ? sprintf(".%.6d", obj.usec) : ''
obj.strftime("%Y-%m-%d %H:%M:%S#{u_sec} #{off_hm}")
when Symbol
prefix = @options[:use_natural_symbols] && is_one_plain_line?(obj.to_s) ? ":" : "!ruby/symbol "
"#{prefix}#{emit_string(obj, level)}"
when Range
'!ruby/range ' + obj.to_s
when Regexp
'!ruby/regexp ' + obj.inspect
else
case
when obj.is_a?(Struct)
struct_members = {}
obj.each_pair { |k, v| struct_members[k.to_s] = v }
"!ruby/struct:#{obj.class.to_s.sub(/^(Struct::(.+)|.*)$/, '\2')} #{emit(struct_members, level + 1)}"
else
object_members = {}
obj.instance_variables.each do |k, v|
object_members[k.to_s.sub(/^@/, '')] = obj.instance_variable_get(k)
end
"!ruby/object:#{obj.class.to_s} #{emit(object_members, level + 1)}"
end
end
end