Sha256: f1f62e746f0f61e524d377e3abd88cd546f6d43029eda26d13e972b691c4c822

Contents?: true

Size: 1.08 KB

Versions: 34

Compression:

Stored size: 1.08 KB

Contents

# Hash.to_snake_keys
class Hash
  # Recursively converts CamelCase and camelBack JSON-style hash keys to
  # Rubyish snake_case, suitable for use during instantiation of Ruby
  # model attributes.
  #
  def to_snake_keys(value = self)
    case value
    when Array
      value.map { |v| to_snake_keys(v) }
    when Hash
      snake_hash(value)
    else
      value
    end
  end

  private

  def snake_hash(value)
    Hash[value.map { |k, v| [underscore_key(k).to_sym, to_snake_keys(v)] }]
  end

  def underscore_key(k)
    if k.is_a? Symbol
      underscore(k.to_s).to_sym
    elsif k.is_a? String
      underscore(k)
    else
      k # Plissken can't snakify anything except strings and symbols
    end
  end

  def underscore(string)
    @__memoize_underscore ||= {}
    return @__memoize_underscore[string] if @__memoize_underscore[string]
    @__memoize_underscore[string] =
      string.gsub(/::/, '/')
            .gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
            .gsub(/([a-z\d])([A-Z])/, '\1_\2')
            .tr('-', '_')
            .downcase
    @__memoize_underscore[string]
  end
end

Version data entries

34 entries across 34 versions & 2 rubygems

Version Path
lono-4.2.7 vendor/plissken/lib/plissken/ext/hash/to_snake_keys.rb
lono-4.2.6 vendor/plissken/lib/plissken/ext/hash/to_snake_keys.rb
lono-4.2.5 vendor/plissken/lib/plissken/ext/hash/to_snake_keys.rb
lono-4.2.4 vendor/plissken/lib/plissken/ext/hash/to_snake_keys.rb
lono-4.2.0 vendor/plissken/lib/plissken/ext/hash/to_snake_keys.rb
lono-4.1.0 vendor/plissken/lib/plissken/ext/hash/to_snake_keys.rb
lono-4.0.6 vendor/plissken/lib/plissken/ext/hash/to_snake_keys.rb
lono-4.0.5 vendor/plissken/lib/plissken/ext/hash/to_snake_keys.rb
lono-4.0.4 vendor/plissken/lib/plissken/ext/hash/to_snake_keys.rb
lono-4.0.3 vendor/plissken/lib/plissken/ext/hash/to_snake_keys.rb
lono-4.0.2 vendor/plissken/lib/plissken/ext/hash/to_snake_keys.rb
lono-4.0.1 vendor/plissken/lib/plissken/ext/hash/to_snake_keys.rb
lono-4.0.0 vendor/plissken/lib/plissken/ext/hash/to_snake_keys.rb
lono-3.5.0 vendor/plissken/lib/plissken/ext/hash/to_snake_keys.rb
lono-3.4.1 vendor/plissken/lib/plissken/ext/hash/to_snake_keys.rb
lono-3.4.0 vendor/plissken/lib/plissken/ext/hash/to_snake_keys.rb
lono-3.3.4 vendor/plissken/lib/plissken/ext/hash/to_snake_keys.rb
lono-3.3.2 vendor/plissken/lib/plissken/ext/hash/to_snake_keys.rb
lono-3.3.0 vendor/plissken/lib/plissken/ext/hash/to_snake_keys.rb
lono-3.2.1 vendor/plissken/lib/plissken/ext/hash/to_snake_keys.rb