dalexhd/SteamSpeak

View on GitHub
scripts/util/core_ext/hash.rb

Summary

Maintainability
A
1 hr
Test Coverage
require 'ostruct'

class Hash
  def delete!(key)
    delete(key) { |key| raise("Key does not exist: #{key.inspect}") }
  end

  def flatten
    each_with_object({}) do |(k, v), h|
      if v.is_a? Hash
        v.flatten.map do |h_k, h_v|
          h["#{k}.#{h_k}"] = h_v
        end
      else
        h[k] = v
      end
    end
  end

  def to_query(*args)
    to_param(*args).gsub("[]", "").gsub("%5B%5D", "")
  end

  def to_struct(should_have_keys: [], &block)
    new_hash = {}

    each do |key, val|
      new_hash[key] =
        if val.is_a?(Hash) && (should_have_keys.empty? || (should_have_keys - val.keys).empty?)
          if block_given?
            yield(key, val)
          else
            val.to_struct(should_have_keys: should_have_keys)
          end
        elsif val.is_a?(Array)
          val.collect do |item|
            if item.is_a?(Hash)
              item.to_struct
            else
              item
            end
          end
        else
          val
        end
    end

    AccessibleHash.new(new_hash)
  end

  def to_struct_with_name(constructor: nil, ensure_keys: [], should_have_keys: [])
    to_struct(should_have_keys: should_have_keys) do |key, hash|
      new_hash = {}

      ensure_keys.each do |key|
        new_hash[key] = nil
      end

      new_hash.merge!(hash)
      new_hash["name"] = key

      if constructor
        constructor.new(new_hash)
      else
        new_hash.to_struct
      end
    end
  end


  def validate_schema
    schema_path = self["$schema"]

    if schema_path
      JSONSchema.validate(schema_path, self)
    else
      []
    end
  end
end