require 'rake/testtask' require 'rubygems/package_task' require File.expand_path(File.dirname(__FILE__)) + "/test/config" require File.expand_path(File.dirname(__FILE__)) + "/test/support/config" def run_without_aborting(*tasks) errors = [] tasks.each do |task| begin Rake::Task[task].invoke rescue Exception errors << task end end abort "Errors running #{errors.join(', ')}" if errors.any? end desc 'Run mysql, mysql2, sqlite, and postgresql tests by default' task :default => :test desc 'Run mysql, mysql2, sqlite, and postgresql tests' task :test do tasks = defined?(JRUBY_VERSION) ? %w(test_jdbcmysql test_jdbcsqlite3 test_jdbcpostgresql) : %w(test_mysql test_mysql2 test_sqlite3 test_postgresql) run_without_aborting(*tasks) end namespace :test do task :isolated do tasks = defined?(JRUBY_VERSION) ? %w(isolated_test_jdbcmysql isolated_test_jdbcsqlite3 isolated_test_jdbcpostgresql) : %w(isolated_test_mysql isolated_test_mysql2 isolated_test_sqlite3 isolated_test_postgresql) run_without_aborting(*tasks) end end desc 'Build MySQL and PostgreSQL test databases' namespace :db do task :create => ['db:mysql:build', 'db:postgresql:build'] task :drop => ['db:mysql:drop', 'db:postgresql:drop'] end %w( mysql mysql2 postgresql sqlite3 sqlite3_mem db2 oracle jdbcmysql jdbcpostgresql jdbcsqlite3 jdbcderby jdbch2 jdbchsqldb ).each do |adapter| namespace :test do Rake::TestTask.new(adapter => "#{adapter}:env") { |t| adapter_short = adapter == 'db2' ? adapter : adapter[/^[a-z0-9]+/] t.libs << 'test' t.test_files = (Dir.glob( "test/cases/**/*_test.rb" ).reject { |x| x =~ /\/adapters\// } + Dir.glob("test/cases/adapters/#{adapter_short}/**/*_test.rb")) t.warning = true t.verbose = true } namespace :isolated do task adapter => "#{adapter}:env" do adapter_short = adapter == 'db2' ? adapter : adapter[/^[a-z0-9]+/] puts [adapter, adapter_short].inspect (Dir["test/cases/**/*_test.rb"].reject { |x| x =~ /\/adapters\// } + Dir["test/cases/adapters/#{adapter_short}/**/*_test.rb"]).all? do |file| sh(Gem.ruby, '-w' ,"-Itest", file) end or raise "Failures" end end end namespace adapter do task :test => "test_#{adapter}" task :isolated_test => "isolated_test_#{adapter}" # Set the connection environment for the adapter task(:env) { ENV['ARCONN'] = adapter } end # Make sure the adapter test evaluates the env setting task task "test_#{adapter}" => ["#{adapter}:env", "test:#{adapter}"] task "isolated_test_#{adapter}" => ["#{adapter}:env", "test:isolated:#{adapter}"] end rule '.sqlite3' do |t| sh %Q{sqlite3 "#{t.name}" "create table a (a integer); drop table a;"} end task :test_sqlite3 => [ 'test/fixtures/fixture_database.sqlite3', 'test/fixtures/fixture_database_2.sqlite3' ] namespace :db do namespace :mysql do desc 'Build the MySQL test databases' task :build do config = ARTest.config['connections']['mysql'] %x( mysql --user=#{config['arunit']['username']} -e "create DATABASE #{config['arunit']['database']} DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_unicode_ci ") %x( mysql --user=#{config['arunit2']['username']} -e "create DATABASE #{config['arunit2']['database']} DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_unicode_ci ") end desc 'Drop the MySQL test databases' task :drop do config = ARTest.config['connections']['mysql'] %x( mysqladmin --user=#{config['arunit']['username']} -f drop #{config['arunit']['database']} ) %x( mysqladmin --user=#{config['arunit2']['username']} -f drop #{config['arunit2']['database']} ) end desc 'Rebuild the MySQL test databases' task :rebuild => [:drop, :build] end namespace :postgresql do desc 'Build the PostgreSQL test databases' task :build do config = ARTest.config['connections']['postgresql'] %x( createdb -E UTF8 -T template0 #{config['arunit']['database']} ) %x( createdb -E UTF8 -T template0 #{config['arunit2']['database']} ) # prepare hstore if %x( createdb --version ).strip.gsub(/(.*)(\d\.\d\.\d)$/, "\\2") < "9.1.0" puts "Please prepare hstore data type. See http://www.postgresql.org/docs/9.0/static/hstore.html" end end desc 'Drop the PostgreSQL test databases' task :drop do config = ARTest.config['connections']['postgresql'] %x( dropdb #{config['arunit']['database']} ) %x( dropdb #{config['arunit2']['database']} ) end desc 'Rebuild the PostgreSQL test databases' task :rebuild => [:drop, :build] end end task :build_mysql_databases => 'db:mysql:build' task :drop_mysql_databases => 'db:mysql:drop' task :rebuild_mysql_databases => 'db:mysql:rebuild' task :build_postgresql_databases => 'db:postgresql:build' task :drop_postgresql_databases => 'db:postgresql:drop' task :rebuild_postgresql_databases => 'db:postgresql:rebuild' task :lines do load File.expand_path('..', File.dirname(__FILE__)) + '/tools/line_statistics' files = FileList["lib/active_record/**/*.rb"] CodeTools::LineStatistics.new(files).print_loc end spec = eval(File.read('activerecord.gemspec')) Gem::PackageTask.new(spec) do |p| p.gem_spec = spec end # Publishing ------------------------------------------------------ desc "Release to rubygems" task :release => :package do require 'rake/gemcutter' Rake::Gemcutter::Tasks.new(spec).define Rake::Task['gem:push'].invoke end