middleman/middleman-core/lib/middleman-core/util/hash_with_indifferent_access.rb

87 lines
1.9 KiB
Ruby
Raw Normal View History

2014-07-14 22:19:34 +02:00
require 'middleman-core/contracts'
2014-07-14 18:50:44 +02:00
module Middleman
module Util
# A hash with indifferent access and magic predicates.
# Copied from Thor
#
# hash = Middleman::Util::HashWithIndifferentAccess.new 'foo' => 'bar', 'baz' => 'bee', 'force' => true
#
# hash[:foo] #=> 'bar'
# hash['foo'] #=> 'bar'
# hash.foo? #=> true
#
class HashWithIndifferentAccess < ::Hash #:nodoc:
2014-07-14 22:19:34 +02:00
include Contracts
Contract Hash => Any
2014-07-14 18:50:44 +02:00
def initialize(hash={})
super()
2014-07-14 22:19:34 +02:00
hash.each do |key, val|
self[key] = Util.recursively_enhance(val)
2014-07-14 18:50:44 +02:00
end
2014-07-14 22:19:34 +02:00
freeze
2014-07-14 18:50:44 +02:00
end
def [](key)
super(convert_key(key))
end
def []=(key, value)
super(convert_key(key), value)
end
def delete(key)
super(convert_key(key))
end
def values_at(*indices)
indices.map { |key| self[convert_key(key)] }
end
def merge(other)
dup.merge!(other)
end
def merge!(other)
other.each do |key, value|
self[convert_key(key)] = value
end
self
end
# Convert to a Hash with String keys.
def to_hash
Hash.new(default).merge!(self)
end
protected
def convert_key(key)
key.is_a?(Symbol) ? key.to_s : key
end
# Magic predicates. For instance:
#
# options.force? # => !!options['force']
# options.shebang # => "/usr/lib/local/ruby"
# options.test_framework?(:rspec) # => options[:test_framework] == :rspec
# rubocop:disable DoubleNegation
def method_missing(method, *args)
method = method.to_s
if method =~ /^(\w+)\?$/
if args.empty?
!!self[$1]
else
self[$1] == args.first
end
else
self[method]
end
end
end
end
end