module SnakyHash::Serializer

def blank?(value)

Returns:
  • (Boolean) - true if value is blank

Parameters:
  • value (Object) -- value to check
def blank?(value)
  return true if value.nil?
  return true if value.is_a?(String) && value.empty?
  false
end

def dump(obj)

Returns:
  • (String) - JSON string representation of the hash

Parameters:
  • obj (Hash) -- the hash to serialize
def dump(obj)
  hash = dump_hash(obj)
  hash.to_json
end

def dump_hash(hash)

Returns:
  • (Hash) - processed hash with transformed values

Parameters:
  • hash (Hash) -- hash to process
def dump_hash(hash)
  dump_hash_extensions.run(self[hash]).transform_values do |value|
    dump_value(value)
  end
end

def dump_value(value)

Returns:
  • (Object, nil) - processed value

Parameters:
  • value (Object) -- value to process
def dump_value(value)
  if blank?(value)
    return value
  end
  if value.is_a?(::Hash)
    return dump_hash(value)
  end
  if value.is_a?(::Array)
    return value.map { |v| dump_value(v) }.compact
  end
  dump_extensions.run(value)
end

def extended(base)

Returns:
  • (void) -

Parameters:
  • base (Class) -- the class being extended
def extended(base)
  extended_module = Modulizer.to_extended_mod
  base.extend(extended_module)
  base.include(ConvenienceInstanceMethods)
  # :nocov:
  # This will be run in CI on Ruby 2.3, but we only collect coverage from current Ruby
  unless base.instance_methods.include?(:transform_values)
    base.include(BackportedInstanceMethods)
  end
  # :nocov:
end

def load(raw_hash)

Returns:
  • (Hash) - deserialized hash object

Parameters:
  • raw_hash (String, nil) -- JSON string to deserialize
def load(raw_hash)
  hash = JSON.parse(presence(raw_hash) || "{}")
  load_hash(new(hash))
end

def load_hash(hash)

Returns:
  • (Hash) - processed hash with transformed values

Parameters:
  • hash (Hash) -- hash to process
def load_hash(hash)
  ran = load_hash_extensions.run(self[hash])
  return load_value(ran) unless ran.is_a?(::Hash)
  res = self[ran].transform_values do |value|
    load_value(value)
  end
  # TODO: Drop this hack when dropping support for Ruby 2.6
  if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new("2.7")
    res
  else
    # :nocov:
    # In Ruby <= 2.6 Hash#transform_values returned a new vanilla Hash,
    #   rather than a hash of the class being transformed.
    self[res]
    # :nocov:
  end
end

def load_value(value)

Returns:
  • (Object, nil) - processed value

Parameters:
  • value (Object) -- value to process
def load_value(value)
  if blank?(value)
    return value
  end
  if value.is_a?(::Hash)
    return load_hash(value)
  end
  if value.is_a?(::Array)
    return value.map { |v| load_value(v) }.compact
  end
  load_extensions.run(value)
end

def presence(value)

Returns:
  • (Object, nil) - the value or nil if blank

Parameters:
  • value (Object) -- value to check
def presence(value)
  blank?(value) ? nil : value
end