To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.
root / vendor / plugins / engines / Rakefile @ 442:753f1380d6bc
History | View | Annotate | Download (8.29 KB)
| 1 |
require 'rake'
|
|---|---|
| 2 |
require 'rake/rdoctask'
|
| 3 |
require 'tmpdir'
|
| 4 |
|
| 5 |
task :default => :doc |
| 6 |
|
| 7 |
desc 'Generate documentation for the engines plugin.'
|
| 8 |
Rake::RDocTask.new(:doc) do |doc| |
| 9 |
doc.rdoc_dir = 'doc'
|
| 10 |
doc.title = 'Engines'
|
| 11 |
doc.main = "README"
|
| 12 |
doc.rdoc_files.include("README", "CHANGELOG", "MIT-LICENSE") |
| 13 |
doc.rdoc_files.include('lib/**/*.rb')
|
| 14 |
doc.options << '--line-numbers' << '--inline-source' |
| 15 |
end
|
| 16 |
|
| 17 |
desc 'Run the engine plugin tests within their test harness'
|
| 18 |
task :cruise do |
| 19 |
# checkout the project into a temporary directory
|
| 20 |
version = "rails_2.0"
|
| 21 |
test_dir = "#{Dir.tmpdir}/engines_plugin_#{version}_test"
|
| 22 |
puts "Checking out test harness for #{version} into #{test_dir}"
|
| 23 |
`svn co http://svn.rails-engines.org/test/engines/#{version} #{test_dir}`
|
| 24 |
|
| 25 |
# run all the tests in this project
|
| 26 |
Dir.chdir(test_dir)
|
| 27 |
load 'Rakefile'
|
| 28 |
puts "Running all tests in test harness"
|
| 29 |
['db:migrate', 'test', 'test:plugins'].each do |t| |
| 30 |
Rake::Task[t].invoke |
| 31 |
end
|
| 32 |
end
|
| 33 |
|
| 34 |
task :clean => [:clobber_doc, "test:clean"] |
| 35 |
|
| 36 |
namespace :test do |
| 37 |
|
| 38 |
# Yields a block with STDOUT and STDERR silenced. If you *really* want
|
| 39 |
# to output something, the block is yielded with the original output
|
| 40 |
# streams, i.e.
|
| 41 |
#
|
| 42 |
# silence do |o, e|
|
| 43 |
# puts 'hello!' # no output produced
|
| 44 |
# o.puts 'hello!' # output on STDOUT
|
| 45 |
# end
|
| 46 |
#
|
| 47 |
# (based on silence_stream in ActiveSupport.)
|
| 48 |
def silence |
| 49 |
yield(STDOUT, STDERR) if ENV['VERBOSE'] |
| 50 |
streams = [STDOUT, STDERR] |
| 51 |
actual_stdout = STDOUT.dup
|
| 52 |
actual_stderr = STDERR.dup
|
| 53 |
streams.each do |s|
|
| 54 |
s.reopen(RUBY_PLATFORM =~ /mswin/ ? 'NUL:' : '/dev/null') |
| 55 |
s.sync = true
|
| 56 |
end
|
| 57 |
yield actual_stdout, actual_stderr
|
| 58 |
ensure
|
| 59 |
STDOUT.reopen(actual_stdout)
|
| 60 |
STDERR.reopen(actual_stderr)
|
| 61 |
end
|
| 62 |
|
| 63 |
def test_app_dir |
| 64 |
File.join(File.dirname(__FILE__), 'test_app') |
| 65 |
end
|
| 66 |
|
| 67 |
def run(cmd) |
| 68 |
cmd = cmd.join(" && ") if cmd.is_a?(Array) |
| 69 |
system(cmd) || raise("failed running '#{cmd}'")
|
| 70 |
end
|
| 71 |
|
| 72 |
desc 'Remove the test application'
|
| 73 |
task :clean do |
| 74 |
FileUtils.rm_r(test_app_dir) if File.exist?(test_app_dir) |
| 75 |
end
|
| 76 |
|
| 77 |
desc 'Build the test rails application (use RAILS=[edge,<directory>] to test against specific version)'
|
| 78 |
task :generate_app do |
| 79 |
silence do |out, err|
|
| 80 |
out.puts "> Creating test application at #{test_app_dir}"
|
| 81 |
|
| 82 |
if ENV['RAILS'] |
| 83 |
vendor_dir = File.join(test_app_dir, 'vendor') |
| 84 |
FileUtils.mkdir_p vendor_dir
|
| 85 |
|
| 86 |
if ENV['RAILS'] == 'edge' |
| 87 |
out.puts " Cloning Edge Rails from GitHub"
|
| 88 |
run "cd #{vendor_dir} && git clone --depth 1 git://github.com/rails/rails.git"
|
| 89 |
elsif ENV['RAILS'] =~ /\d\.\d\.\d/ |
| 90 |
if ENV['CURL'] |
| 91 |
out.puts " Cloning Rails Tag #{ENV['RAILS']} from GitHub using curl and tar"
|
| 92 |
run ["cd #{vendor_dir}",
|
| 93 |
"mkdir rails",
|
| 94 |
"cd rails",
|
| 95 |
"curl -s -L http://github.com/rails/rails/tarball/#{ENV['RAILS']} | tar xzv --strip-components 1"]
|
| 96 |
else
|
| 97 |
out.puts " Cloning Rails Tag #{ENV['RAILS']} from GitHub (can be slow - set CURL=true to use curl)"
|
| 98 |
run ["cd #{vendor_dir}",
|
| 99 |
"git clone git://github.com/rails/rails.git",
|
| 100 |
"cd rails",
|
| 101 |
"git pull",
|
| 102 |
"git checkout v#{ENV['RAILS']}"]
|
| 103 |
end
|
| 104 |
elsif File.exist?(ENV['RAILS']) |
| 105 |
out.puts " Linking rails from #{ENV['RAILS']}"
|
| 106 |
run "cd #{vendor_dir} && ln -s #{ENV['RAILS']} rails"
|
| 107 |
else
|
| 108 |
raise "Couldn't build test application from '#{ENV['RAILS']}'"
|
| 109 |
end
|
| 110 |
|
| 111 |
out.puts " generating rails default directory structure"
|
| 112 |
run "ruby #{File.join(vendor_dir, 'rails', 'railties', 'bin', 'rails')} #{test_app_dir}"
|
| 113 |
else
|
| 114 |
version = `rails --version`.chomp.split.last
|
| 115 |
out.puts " building rails using the 'rails' command (rails version: #{version})"
|
| 116 |
run "rails #{test_app_dir}"
|
| 117 |
end
|
| 118 |
|
| 119 |
# get the database config and schema in place
|
| 120 |
out.puts " writing database.yml"
|
| 121 |
require 'yaml'
|
| 122 |
File.open(File.join(test_app_dir, 'config', 'database.yml'), 'w') do |f| |
| 123 |
f.write(%w(development test).inject({}) do |h, env| |
| 124 |
h[env] = {"adapter" => "sqlite3", "database" => "engines_#{env}.sqlite3"} ; h
|
| 125 |
end.to_yaml)
|
| 126 |
end
|
| 127 |
out.puts " installing exception_notification plugin"
|
| 128 |
run "cd #{test_app_dir} && ./script/plugin install git://github.com/rails/exception_notification.git"
|
| 129 |
end
|
| 130 |
end
|
| 131 |
|
| 132 |
# We can't link the plugin, as it needs to be present for script/generate to find
|
| 133 |
# the plugin generator.
|
| 134 |
# TODO: find and +1/create issue for loading generators from symlinked plugins
|
| 135 |
desc 'Mirror the engines plugin into the test application'
|
| 136 |
task :copy_engines_plugin do |
| 137 |
puts "> Copying engines plugin into test application"
|
| 138 |
engines_plugin = File.join(test_app_dir, "vendor", "plugins", "engines") |
| 139 |
FileUtils.rm_r(engines_plugin) if File.exist?(engines_plugin) |
| 140 |
FileUtils.mkdir_p(engines_plugin)
|
| 141 |
FileList["*"].exclude("test_app").each do |file| |
| 142 |
FileUtils.cp_r(file, engines_plugin)
|
| 143 |
end
|
| 144 |
end
|
| 145 |
|
| 146 |
def insert_line(line, options) |
| 147 |
line = line + "\n"
|
| 148 |
target_file = File.join(test_app_dir, options[:into]) |
| 149 |
lines = File.readlines(target_file)
|
| 150 |
return if lines.include?(line) |
| 151 |
|
| 152 |
if options[:after] |
| 153 |
if options[:after].is_a?(String) |
| 154 |
after_line = options[:after] + "\n" |
| 155 |
else
|
| 156 |
after_line = lines.find { |l| l =~ options[:after] }
|
| 157 |
raise "couldn't find a line matching #{options[:after].inspect} in #{target_file}" unless after_line |
| 158 |
end
|
| 159 |
index = lines.index(after_line) |
| 160 |
raise "couldn't find line '#{after_line}' in #{target_file}" unless index |
| 161 |
lines.insert(index + 1, line)
|
| 162 |
else
|
| 163 |
lines << line |
| 164 |
end
|
| 165 |
File.open(target_file, 'w') { |f| f.write lines.join } |
| 166 |
end
|
| 167 |
|
| 168 |
def mirror_test_files(src, dest=nil) |
| 169 |
destination_dir = File.join(*([test_app_dir, dest].compact))
|
| 170 |
FileUtils.cp_r(File.join(File.dirname(__FILE__), 'test', src), destination_dir) |
| 171 |
end
|
| 172 |
|
| 173 |
desc 'Update the plugin and tests files in the test application from the plugin'
|
| 174 |
task :mirror_engine_files => [:test_app, :copy_engines_plugin] do |
| 175 |
puts "> Tweaking generated application to be suitable for testing"
|
| 176 |
|
| 177 |
# Replace the Rails plugin loader with the engines one.
|
| 178 |
insert_line("require File.join(File.dirname(__FILE__), '../vendor/plugins/engines/boot')",
|
| 179 |
:into => 'config/environment.rb', |
| 180 |
:after => "require File.join(File.dirname(__FILE__), 'boot')") |
| 181 |
|
| 182 |
# Add the engines test helper to handle fixtures & stuff.
|
| 183 |
insert_line("require 'engines_test_helper'", :into => 'test/test_helper.rb') |
| 184 |
|
| 185 |
# Run engine plugin tests when running the application
|
| 186 |
insert_line("task :test => ['test:engines:all']", :into => 'Rakefile') |
| 187 |
|
| 188 |
# We want exceptions to be raised
|
| 189 |
insert_line("def rescue_action(e) raise e end;",
|
| 190 |
:into => "app/controllers/application_controller.rb", |
| 191 |
:after => "class ApplicationController < ActionController::Base") |
| 192 |
|
| 193 |
# We need this method to test where actions are being rendered from.
|
| 194 |
insert_line("include RenderInformation",
|
| 195 |
:into => "app/controllers/application_controller.rb", |
| 196 |
:after => "class ApplicationController < ActionController::Base") |
| 197 |
|
| 198 |
puts "> Mirroring test application files into #{test_app_dir}"
|
| 199 |
mirror_test_files('app')
|
| 200 |
mirror_test_files('lib')
|
| 201 |
mirror_test_files('plugins', 'vendor') |
| 202 |
mirror_test_files('unit', 'test') |
| 203 |
mirror_test_files('functional', 'test') |
| 204 |
end
|
| 205 |
|
| 206 |
desc 'Prepare the engines test environment'
|
| 207 |
task :test_app do |
| 208 |
version_tag = File.join(test_app_dir, 'RAILS_VERSION') |
| 209 |
existing_version = File.read(version_tag).chomp rescue 'unknown' |
| 210 |
if existing_version == ENV['RAILS'] |
| 211 |
puts "> Reusing existing test application (#{ENV['RAILS']})"
|
| 212 |
else
|
| 213 |
puts "> Recreating test application"
|
| 214 |
Rake::Task["test:clean"].invoke |
| 215 |
Rake::Task["test:generate_app"].invoke |
| 216 |
|
| 217 |
File.open(version_tag, "w") { |f| f.write ENV['RAILS'] } |
| 218 |
end
|
| 219 |
end
|
| 220 |
end
|
| 221 |
|
| 222 |
task :test => "test:mirror_engine_files" do |
| 223 |
puts "> Loading the test application environment and running tests"
|
| 224 |
# We use exec here to replace the current running rake process
|
| 225 |
exec("cd #{test_app_dir} && rake db:migrate && rake")
|
| 226 |
end
|