expectations/raketask.rb

すんなり rake/testtask.rb と一緒には使えないですね。

require 'rake'
require 'rake/tasklib'
require 'tempfile'

module Expectations
  class RakeTask < Rake::TaskLib
    DEFAULT_NAME = :test
    
    def initialize(name = DEFAULT_NAME)
      self.name = name
      @libs = ['lib']
      @test_files = []
      self.verbose = false
      self.warning = false
      yield(self) if block_given?
      self.pattern ||= 'test/test_*.rb'
      define
    end
    
    attr_accessor :name
    attr_accessor :pattern
    attr_reader   :libs
    attr_reader   :test_files
    attr_accessor :verbose
    attr_accessor :warning
    
    def description
      buf = "do testing on Expectations"
      buf << ", for #{name}" unless name == DEFAULT_NAME
      buf
    end
    
    def define
      desc description
      task name do
        RakeFileUtils.verbose(verbose) do
          LOADER.open{|f| ruby ruby_argument(f.path, *file_list()) }
        end
      end
      self
    end
    
    LOADER = <<-EOS
      require 'expectations'
      ARGV.each{|file| load file }
    EOS
    
    def LOADER.open(name = 'expectations-raketask')
      Tempfile.open(name) do |f|
        f.puts self
        f.rewind
        yield(f)
      end
    end
    
    def ruby_argument(*files)
      args = ['-rubygems']
      args.push(*libs.map{|d| %Q`-I"#{File.expand_path(d)}"` })
      args.push('-w') if warning
      args.push(*files.map{|file| %Q`"#{file}"` })
      args.join(' ')
    end
    
    def file_list
      list = [*test_files]
      list.push(*FileList[pattern]) if pattern
      FileList[list]
    end
  end
end