lib/middleman-core/util.rb



# Using Thor's indifferent hash access
require "thor"

module Middleman
  module Util
    # Recursively convert a normal Hash into a HashWithIndifferentAccess
    #
    # @private
    # @param [Hash] data Normal hash
    # @return [Thor::CoreExt::HashWithIndifferentAccess]
    def self.recursively_enhance(data)
      if data.is_a? Hash
        data = ::Thor::CoreExt::HashWithIndifferentAccess.new(data)
        data.each do |key, val|
          data[key] = recursively_enhance(val)
        end
        data
      elsif data.is_a? Array
        data.each_with_index do |val, i|
          data[i] = recursively_enhance(val)
        end
        data
      else
        data
      end
    end
    
    # Normalize a path to not include a leading slash
    # @param [String] path
    # @return [String]
    def self.normalize_path(path)
      path.sub(/^\//, "").gsub("%20", " ")
    end
    
    # Simple shared cache implementation
    class Cache
      # Initialize
      def initialize
        self.clear
      end

      # Either get the cached key or save the contents of the block
      #
      # @param Anything Hash can use as a key
      # @return Cached value
      def fetch(*key)
        @cache[key] ||= yield
      end

      # Whether the key is in the cache
      # 
      # @param Anything Hash can use as a key
      # @return [Boolean]
      def has_key?(key)
        @cache.has_key?(key)
      end

      # Get a specific key
      #
      # @param Anything Hash can use as a key
      # @return Cached value
      def get(key)
        @cache[key]
      end

      def keys
        @cache.keys
      end

      # Clear the entire cache
      def clear
        @cache = {}
      end

      # Set a specific key
      #
      # @param Anything Hash can use as a key
      # @param Cached value
      def set(key, value)
        @cache[key] = value
      end

      # Remove a specific key
      # @param Anything Hash can use as a key
      def remove(*key)
        @cache.delete(key)
      end
    end
  end
end