lib/middleman-core/vendor/padrino-core-0.10.6/lib/padrino-core/support_lite.rb



##
# This file loads certain extensions required by Padrino from ActiveSupport.
#
require 'active_support/core_ext/module/aliasing'           # alias_method_chain
require 'active_support/core_ext/hash/keys'                 # symbolize_keys
require 'active_support/core_ext/hash/reverse_merge'        # reverse_merge
require 'active_support/core_ext/hash/slice'                # slice
require 'active_support/core_ext/object/blank'              # present?
require 'active_support/core_ext/array/extract_options'     # extract_options
require 'active_support/inflector/methods'                  # constantize
require 'active_support/inflector/inflections'              # pluralize
require 'active_support/inflections'                        # load default inflections
require 'yaml' unless defined?(YAML)                        # load yaml for i18n
require 'win32console' if RUBY_PLATFORM =~ /(win|m)32/      # ruby color support for win

##
# This is an adapted version of active_support/core_ext/string/inflections.rb
# to prevent loading several dependencies including I18n gem.
#
# Issue: https://github.com/rails/rails/issues/1526
#
class String
  ##
  # Returns the plural form of the word in the string.
  #
  #   "post".pluralize             # => "posts"
  #   "octopus".pluralize          # => "octopi"
  #   "sheep".pluralize            # => "sheep"
  #   "words".pluralize            # => "words"
  #   "the blue mailman".pluralize # => "the blue mailmen"
  #   "CamelOctopus".pluralize     # => "CamelOctopi"
  #
  def pluralize
    ActiveSupport::Inflector.pluralize(self)
  end

  ##
  # Returns the singular form of the word in the string.
  #
  #   "posts".singularize            # => "post"
  #   "octopi".singularize           # => "octopus"
  #   "sheep".singularize            # => "sheep"
  #   "words".singularize            # => "word"
  #   "the blue mailmen".singularize # => "the blue mailman"
  #   "CamelOctopi".singularize      # => "CamelOctopus"
  #
  def singularize
    ActiveSupport::Inflector.singularize(self)
  end

  ##
  # +constantize+ tries to find a declared constant with the name specified
  # in the string. It raises a NameError when the name is not in CamelCase
  # or is not initialized.
  #
  #   "Module".constantize # => Module
  #   "Class".constantize  # => Class
  #
  def constantize
    ActiveSupport::Inflector.constantize(self)
  end

  ##
  # The reverse of +camelize+. Makes an underscored, lowercase form from the expression in the string.
  #
  # +underscore+ will also change '::' to '/' to convert namespaces to paths.
  #
  #   "ActiveRecord".underscore         # => "active_record"
  #   "ActiveRecord::Errors".underscore # => active_record/errors
  #
  def underscore
    ActiveSupport::Inflector.underscore(self)
  end

  ##
  # By default, +camelize+ converts strings to UpperCamelCase. If the argument to camelize
  # is set to <tt>:lower</tt> then camelize produces lowerCamelCase.
  #
  # +camelize+ will also convert '/' to '::' which is useful for converting paths to namespaces.
  #
  #   "active_record".camelize                # => "ActiveRecord"
  #   "active_record".camelize(:lower)        # => "activeRecord"
  #   "active_record/errors".camelize         # => "ActiveRecord::Errors"
  #   "active_record/errors".camelize(:lower) # => "activeRecord::Errors"
  #
  def camelize(first_letter = :upper)
    case first_letter
      when :upper then ActiveSupport::Inflector.camelize(self, true)
      when :lower then ActiveSupport::Inflector.camelize(self, false)
    end
  end
  alias_method :camelcase, :camelize

  ##
  # Create a class name from a plural table name like Rails does for table names to models.
  # Note that this returns a string and not a class. (To convert to an actual class
  # follow +classify+ with +constantize+.)
  #
  #   "egg_and_hams".classify # => "EggAndHam"
  #   "posts".classify        # => "Post"
  #
  # Singular names are not handled correctly.
  #
  #   "business".classify # => "Busines"
  #
  def classify
    ActiveSupport::Inflector.classify(self)
  end
end

module ObjectSpace
  class << self
    # Returns all the classes in the object space.
    def classes
      ObjectSpace.each_object(Module).select do |klass|
        # Why? Ruby, when you remove a costant dosen't remove it from
        # rb_tables, this mean that here we can find classes that was
        # removed.
        klass.name rescue false
      end
    end
  end
end

##
# FileSet helper method for iterating and interacting with files inside a directory
#
module FileSet
  extend self
  ##
  # Iterates over every file in the glob pattern and yields to a block
  # Returns the list of files matching the glob pattern
  # FileSet.glob('padrino-core/application/*.rb', __FILE__) { |file| load file }
  #
  def glob(glob_pattern, file_path=nil, &block)
    glob_pattern = File.join(File.dirname(file_path), glob_pattern) if file_path
    file_list = Dir.glob(glob_pattern).sort
    file_list.each { |file| block.call(file) }
    file_list
  end

  ##
  # Requires each file matched in the glob pattern into the application
  # FileSet.glob_require('padrino-core/application/*.rb', __FILE__)
  #
  def glob_require(glob_pattern, file_path=nil)
    glob(glob_pattern, file_path) { |f| require f }
  end
end

##
# Removes indentation
# Add colors
#
# @example
#   help <<-EOS.undent
#     Here my help usage
#      sample_code
#
#     Fix
#   EOS
#   puts help.red.bold
#
class String
  def self.colors
    @_colors ||= {
      :clear   => 0,
      :bold    => 1,
      :black   => 30,
      :red     => 31,
      :green   => 32,
      :yellow  => 33,
      :blue    => 34,
      :magenta => 35,
      :cyan    => 36,
      :white   => 37
    }
  end

  colors.each do |color, value|
    define_method(color) do
      ["\e[", value.to_s, "m", self, "\e[", self.class.colors[:clear], "m"] * ''
    end
  end

  def undent
    gsub(/^.{#{slice(/^ +/).size}}/, '')
  end
end

##
# Loads our locale configuration files
#
### I18n.load_path += Dir["#{File.dirname(__FILE__)}/locale/*.yml"] if defined?(I18n) ### !!! FIXME middleman ###

##
# Used to determine if this file has already been required
#
module SupportLite; end