#!/usr/bin/env ruby require 'optparse' require 'ostruct' require 'shellwords' require 'tempfile' RUBY_VERSIONS = %W[1.9.2 1.9.3] RAILS_VERSIONS = %W[3.2] o = OpenStruct.new o.ruby_versions = RUBY_VERSIONS o.rails_versions = RAILS_VERSIONS OptionParser.new do |opts| opts.banner = "Usage: #{$0} [options]" opts.on("-n", "--dry-run", "Do a dry run without executing actions") do |v| o.dry_run = true end opts.on("--update", "Update gem dependencies") do |v| o.update = v end opts.on("--install", "Install gem dependencies") do |v| o.install = v end opts.on("--ruby version", String, "Choose which version(s) of ruby to run. Default is: #{o.ruby_versions.join(' ')}") do |ruby| o.ruby_versions = ruby.split(' ') end opts.on("--rails version", String, "Choose which version(s) of rails to run. Default is: #{o.rails_versions.join(' ')}") do |rails| o.rails_versions = rails.split(' ') end opts.on("--quick", "quick run ruby #{RUBY_VERSIONS.last} and rails #{RAILS_VERSIONS.last}") do o.ruby_versions = [RUBY_VERSIONS.last] o.rails_versions = [RAILS_VERSIONS.last] end opts.on("--rspec", "run rspec rather than rake") do |v| o.rspec = v end end.parse! Combo = Struct.new(:ruby, :rails) combos = o.ruby_versions.product(o.rails_versions).map{|product| Combo.new(*product)}.select {|combo| case when combo.rails >= "3.2" && combo.ruby <= "1.8.7" then false else true end } GEMFILES_DIR = File.expand_path('../gemfiles', __FILE__) errs = [] combos.each_with_index do |combo, n| ruby = combo.ruby rails = combo.rails cmd = case when o.update "bundle update" when o.install "bundle install" when o.rspec "bundle exec rspec" else "bundle exec rake spec" end command = %Q{BUNDLE_GEMFILE="#{File.join(GEMFILES_DIR, "Gemfile.rails-#{rails}")}" rvm #{ruby} do #{cmd} #{Shellwords.join(ARGV)}} puts "\n\n*** ruby version #{ruby} - rails version #{rails} [#{n+1} of #{combos.size}]\n\n#{command}" next if o.dry_run Tempfile.open('runspecs') do |file| system("(#{command}) 2>&1 | tee #{file.path}") file.rewind errs << "ruby #{ruby}, rails #{rails}" if file.readlines.grep(/^Failed examples/).any? end end puts errs.any? ? "\n*** #{errs.size} failures:\n\t#{errs.join("\n\t")}" : "\n*** #{combos.size > 1 ? 'all versions' : 'spec'} succeeded ***" unless o.dry_run exit !errs.any?