dotpromo/nexmos

View on GitHub
lib/hashie/mash/rash.rb

Summary

Maintainability
A
0 mins
Test Coverage
require 'hashie/mash'

module Hashie
  class Mash::Rash < Mash
    protected

    def convert_key(key) #:nodoc:
      underscore_string(key.to_s)
    end

    # Unlike its parent Mash, a Rash will convert other Hashie::Hash values to a Rash when assigning
    # instead of respecting the existing subclass
    def convert_value(val, duping = false) #:nodoc:
      case val
      when self.class
        val.dup
      when ::Hash
        val = val.dup if duping
        self.class.new(val)
      when Array
        val.collect { |e| convert_value(e) }
      else
        val
      end
    end

    # converts a camel_cased string to a underscore string
    # subs spaces with underscores, strips whitespace
    # Same way ActiveSupport does string.underscore
    def underscore_string(str)
      str.to_s.strip
        .gsub(' ', '_')
        .gsub(/::/, '/')
        .gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
        .gsub(/([a-z\d])([A-Z])/, '\1_\2')
        .tr('-', '_')
        .squeeze('_')
        .downcase
    end
  end
end