require 'rubygems' require 'rake' require 'rake/testtask' require 'rake/rdoctask' require 'rake/packagetask' require 'rake/gempackagetask' require File.expand_path(File.dirname(__FILE__)) + "/test/config" MYSQL_DB_USER = 'rails' 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, sqlite, and postgresql tests by default' task :default => :test desc 'Run mysql, sqlite, and postgresql tests' task :test do tasks = defined?(JRUBY_VERSION) ? %w(test_jdbcmysql test_jdbcsqlite3 test_jdbcpostgresql) : %w(test_mysql 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_sqlite3 isolated_test_postgresql) run_without_aborting(*tasks) end end %w( mysql postgresql sqlite3 firebird db2 oracle sybase openbase frontbase jdbcmysql jdbcpostgresql jdbcsqlite3 jdbcderby jdbch2 jdbchsqldb ).each do |adapter| Rake::TestTask.new("test_#{adapter}") { |t| connection_path = "test/connections/#{adapter =~ /jdbc/ ? 'jdbc' : 'native'}_#{adapter}" adapter_short = adapter == 'db2' ? adapter : adapter[/^[a-z]+/] t.libs << "test" << connection_path t.test_files=Dir.glob( "test/cases/**/*_test{,_#{adapter_short}}.rb" ).sort t.verbose = true t.warning = true } task "isolated_test_#{adapter}" do connection_path = "test/connections/#{adapter =~ /jdbc/ ? 'jdbc' : 'native'}_#{adapter}" adapter_short = adapter == 'db2' ? adapter : adapter[/^[a-z]+/] puts [adapter, adapter_short, connection_path].inspect ruby = File.join(*RbConfig::CONFIG.values_at('bindir', 'RUBY_INSTALL_NAME')) Dir["test/cases/**/*_test{,_#{adapter_short}}.rb"].all? do |file| system(ruby, "-Ilib:test:#{connection_path}", file) end or raise "Failures" end namespace adapter do task :test => "test_#{adapter}" task :isolated_test => "isolated_test_#{adapter}" end end namespace :mysql do desc 'Build the MySQL test databases' task :build_databases do %x( echo "create DATABASE activerecord_unittest DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_unicode_ci " | mysql --user=#{MYSQL_DB_USER}) %x( echo "create DATABASE activerecord_unittest2 DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_unicode_ci " | mysql --user=#{MYSQL_DB_USER}) end desc 'Drop the MySQL test databases' task :drop_databases do %x( mysqladmin --user=#{MYSQL_DB_USER} -f drop activerecord_unittest ) %x( mysqladmin --user=#{MYSQL_DB_USER} -f drop activerecord_unittest2 ) end desc 'Rebuild the MySQL test databases' task :rebuild_databases => [:drop_databases, :build_databases] end task :build_mysql_databases => 'mysql:build_databases' task :drop_mysql_databases => 'mysql:drop_databases' task :rebuild_mysql_databases => 'mysql:rebuild_databases' namespace :postgresql do desc 'Build the PostgreSQL test databases' task :build_databases do %x( createdb -E UTF8 activerecord_unittest ) %x( createdb -E UTF8 activerecord_unittest2 ) end desc 'Drop the PostgreSQL test databases' task :drop_databases do %x( dropdb activerecord_unittest ) %x( dropdb activerecord_unittest2 ) end desc 'Rebuild the PostgreSQL test databases' task :rebuild_databases => [:drop_databases, :build_databases] end task :build_postgresql_databases => 'postgresql:build_databases' task :drop_postgresql_databases => 'postgresql:drop_databases' task :rebuild_postgresql_databases => 'postgresql:rebuild_databases' namespace :frontbase do desc 'Build the FrontBase test databases' task :build_databases => :rebuild_frontbase_databases desc 'Rebuild the FrontBase test databases' task :rebuild_databases do build_frontbase_database = Proc.new do |db_name, sql_definition_file| %( STOP DATABASE #{db_name}; DELETE DATABASE #{db_name}; CREATE DATABASE #{db_name}; CONNECT TO #{db_name} AS SESSION_NAME USER _SYSTEM; SET COMMIT FALSE; CREATE USER RAILS; CREATE SCHEMA RAILS AUTHORIZATION RAILS; COMMIT; SET SESSION AUTHORIZATION RAILS; SCRIPT '#{sql_definition_file}'; COMMIT; DISCONNECT ALL; ) end create_activerecord_unittest = build_frontbase_database['activerecord_unittest', File.join(SCHEMA_ROOT, 'frontbase.sql')] create_activerecord_unittest2 = build_frontbase_database['activerecord_unittest2', File.join(SCHEMA_ROOT, 'frontbase2.sql')] execute_frontbase_sql = Proc.new do |sql| system(<<-SHELL) /Library/FrontBase/bin/sql92 <<-SQL #{sql} SQL SHELL end execute_frontbase_sql[create_activerecord_unittest] execute_frontbase_sql[create_activerecord_unittest2] end end task :build_frontbase_databases => 'frontbase:build_databases' task :rebuild_frontbase_databases => 'frontbase:rebuild_databases' # Generate the RDoc documentation Rake::RDocTask.new { |rdoc| rdoc.rdoc_dir = 'doc' rdoc.title = "Active Record -- Object-relation mapping put on rails" rdoc.options << '--line-numbers' << '--inline-source' << '-A cattr_accessor=object' rdoc.options << '--charset' << 'utf-8' rdoc.template = ENV['template'] ? "#{ENV['template']}.rb" : '../doc/template/horo' rdoc.rdoc_files.include('README', 'RUNNING_UNIT_TESTS', 'CHANGELOG') rdoc.rdoc_files.include('lib/**/*.rb') rdoc.rdoc_files.exclude('lib/active_record/vendor/*') rdoc.rdoc_files.include('dev-utils/*.rb') } # Enhance rdoc task to copy referenced images also task :rdoc do FileUtils.mkdir_p "doc/files/examples/" FileUtils.copy "examples/associations.png", "doc/files/examples/associations.png" end spec = eval(File.read('activerecord.gemspec')) Rake::GemPackageTask.new(spec) do |p| p.gem_spec = spec end task :lines do lines, codelines, total_lines, total_codelines = 0, 0, 0, 0 for file_name in FileList["lib/active_record/**/*.rb"] next if file_name =~ /vendor/ f = File.open(file_name) while line = f.gets lines += 1 next if line =~ /^\s*$/ next if line =~ /^\s*#/ codelines += 1 end puts "L: #{sprintf("%4d", lines)}, LOC #{sprintf("%4d", codelines)} | #{file_name}" total_lines += lines total_codelines += codelines lines, codelines = 0, 0 end puts "Total: Lines #{total_lines}, LOC #{total_codelines}" end # Publishing ------------------------------------------------------ desc "Release to gemcutter" task :release => :package do require 'rake/gemcutter' Rake::Gemcutter::Tasks.new(spec).define Rake::Task['gem:push'].invoke end desc "Publish the API documentation" task :pdoc => [:rdoc] do require 'rake/contrib/sshpublisher' Rake::SshDirPublisher.new("wrath.rubyonrails.org", "public_html/ar", "doc").upload end