Sha256: bf4df04f5efdbbdfa81ae09064e1092a037acb8976ae2a15da4c3afcd3ea32f8

Contents?: true

Size: 1.18 KB

Versions: 1

Compression:

Stored size: 1.18 KB

Contents

# frozen_string_literal: true

module Plissken
  module Methods

    # 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_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.tr('::', '/')
              .gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2')
              .gsub(/([a-z\d])([A-Z])/, '\1_\2')
              .tr('-', '_')
              .downcase
      @__memoize_underscore[string]
    end

  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
plissken-1.2.0 lib/plissken/methods.rb