bumbleworks/bumbleworks

View on GitHub
lib/bumbleworks/support.rb

Summary

Maintainability
A
35 mins
Test Coverage
module Bumbleworks
  # Support methods for utility functionality such as string modification -
  # could also be accomplished by monkey-patching String class.
  module Support
    module_function
    class WaitTimeout < StandardError; end

    def camelize(string)
      string = string.sub(/^[a-z\d]*/) { $&.capitalize }
      string = string.gsub(/(?:_|(\/))([a-z\d]*)/) { "#{$1}#{$2.capitalize}" }.gsub('/', '::')
    end

    def all_files(directory, options = {})
      Dir["#{directory}/**/*.rb"].inject({}) do |memo, path|
        name = File.basename(path, '.rb')
        name = camelize(name) if options[:camelize] == true
        memo[path] = name
        memo
      end
    end

    def constantize(name)
      name_parts = name.split('::')
      name_parts.shift if name_parts.first.empty?
      constant = Object

      name_parts.each do |name_part|
        const_defined_args = [name_part]
        const_defined_args << false unless Module.method(:const_defined?).arity == 1
        constant_defined = constant.const_defined?(*const_defined_args)
        constant = constant_defined ? constant.const_get(name_part) : constant.const_missing(name_part)
      end
      constant
    end

    def tokenize(string)
      return nil if string.nil?
      string = string.to_s.gsub(/&/, ' and ').
        gsub(/[ \/]+/, '_').
        gsub(/([a-z\d])([A-Z])/,'\1_\2').
        downcase
    end

    def humanize(string)
      return nil if string.nil?
      tokenize(string).gsub(/_/, ' ').
        gsub(/^\w/) { $&.upcase }
    end

    def titleize(string)
      return nil if string.nil?
      humanize(string).gsub(/\b('?[a-z])/) { $1.capitalize }
    end

    def wait_until(options = {}, &block)
      options[:timeout] ||= Bumbleworks.timeout
      start_time = Time.now
      until block.call
        if (Time.now - start_time) > options[:timeout]
          raise WaitTimeout
        end
        sleep 0.1
      end
    end
  end
end