class Object

Public Class Methods

convert_keys(hash, method = :underscore) click to toggle source
# File lib/hash_pipe/key_conversion.rb, line 3
def self.convert_keys(hash, method = :underscore)
  if method.is_a? Proc
    converter = method
  else
    converter = -> (str) { str.to_s.send method }
  end

  if hash.is_a?(Array)
    hash.collect {|h| convert_keys(h, converter) }
  elsif hash.is_a?(Hash)
    hash_array = hash.collect do |key,value|
      [ converter.call(key), convert_keys(value, converter) ]
    end

    Hash[hash_array]
  else
    hash
  end
end

Public Instance Methods

convert_keys(method = :underscore) click to toggle source
# File lib/hash_pipe/key_conversion.rb, line 23
def convert_keys(method = :underscore)
  Hash.convert_keys self, method
end
except(*keys) click to toggle source
# File lib/hash_pipe/value_checks.rb, line 7
def except(*keys)
  keys.collect! &:to_s
  self.reject {|k,v| keys.include? k.to_s }
end
flatten_keys(prefix: "", postfix: "", delimiter: "") click to toggle source

Flattens a hash with delimiters and key prefix/postfix.

hash = {
        "errors" => {
                "something" => {
                        "somethingElse" => {
                                "password" => ["VALIDATION_STATE_PASSWORD"]
                        }
                }
        }
}

Could be turned into a flattened hash using this:

hash.string_from_hash prefix: "registration[", delimiter: "][", postfix: "]"

And the end result would look like this:

{ "registration[errors][something][somethingElse][password]" => ["VALIDATION_STATE_PASSWORD"] }
# File lib/hash_pipe/flattening.rb, line 21
def flatten_keys(prefix: "", postfix: "", delimiter: "")
        each_with_object({}) do |(k, v), ret|
                key = k.to_s
                if v.is_a? Hash
                        ret.merge! v.flatten_keys(prefix: prefix + key + delimiter, postfix: postfix, delimiter: delimiter) if v.present?
                else
                        ret[prefix + key + postfix] = v
                end
        end
end
nested_delete(path) click to toggle source
# File lib/hash_pipe/nested_values.rb, line 7
def nested_delete(path)
  path = Array(path).dup
  last_path_element = path.pop

  nested_fetch(path).delete last_path_element
end
nested_fetch(path) click to toggle source
# File lib/hash_pipe/nested_values.rb, line 3
def nested_fetch(path)
  Array(path).dup.reduce(self) { |current, key| current[key] }
end
no_blank_values() click to toggle source
# File lib/hash_pipe/value_checks.rb, line 3
def no_blank_values
  self.reject { |k,v| v.blank? }
end
only(*keys) click to toggle source
# File lib/hash_pipe/value_checks.rb, line 12
def only(*keys)
  keys.collect! &:to_s
  self.select {|k,v| keys.include? k.to_s }
end
to_nested_hash() click to toggle source

Creates a deep object out of an array

hash = [“errors”, “something”, “somethingElse”, “password”, [“VALIDATION_STATE_PASSWORD”]]

Could be turned into an object usign this

hash.nest

And the end result would look like this:

“errors” => {

"something" => {
  "somethingElse" => {
    "password" => ["VALIDATION_STATE_PASSWORD"]
  }
}

}

# File lib/hash_pipe/array_conversion.rb, line 20
def to_nested_hash
  raise ArgumentError, "Values in array can't be nil" if any? &:nil?
  reverse.inject { |hash, key| {key => hash} }
end