3 require 'rake/testtask'
4 require 'rake/rdoctask'
5 require 'rake/packagetask'
6 require 'rake/gempackagetask'
7 require 'rake/contrib/sshpublisher'
9 require File.join(File.dirname(__FILE__), 'lib', 'active_record', 'version')
10 require File.expand_path(File.dirname(__FILE__)) + "/test/config"
12 PKG_BUILD = ENV['PKG_BUILD'] ? '.' + ENV['PKG_BUILD'] : ''
13 PKG_NAME = 'activerecord'
14 PKG_VERSION = ActiveRecord::VERSION::STRING + PKG_BUILD
15 PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
17 RELEASE_NAME = "REL #{PKG_VERSION}"
19 RUBY_FORGE_PROJECT = "activerecord"
20 RUBY_FORGE_USER = "webster132"
22 MYSQL_DB_USER = 'rails'
25 "lib/**/*", "test/**/*", "examples/**/*", "doc/**/*", "[A-Z]*", "install.rb", "Rakefile"
26 ].exclude(/\bCVS\b|~$/)
29 desc 'Run mysql, sqlite, and postgresql tests by default'
30 task :default => :test
32 desc 'Run mysql, sqlite, and postgresql tests'
33 task :test => %w(test_mysql test_sqlite3 test_postgresql)
35 for adapter in %w( mysql postgresql sqlite sqlite3 firebird db2 oracle sybase openbase frontbase )
36 Rake::TestTask.new("test_#{adapter}") { |t|
37 t.libs << "test" << "test/connections/native_#{adapter}"
38 adapter_short = adapter == 'db2' ? adapter : adapter[/^[a-z]+/]
39 t.test_files=Dir.glob( "test/cases/**/*_test{,_#{adapter_short}}.rb" ).sort
44 task :test => "test_#{adapter}"
49 desc 'Build the MySQL test databases'
50 task :build_databases do
51 %x( mysqladmin --user=#{MYSQL_DB_USER} create activerecord_unittest )
52 %x( mysqladmin --user=#{MYSQL_DB_USER} create activerecord_unittest2 )
55 desc 'Drop the MySQL test databases'
56 task :drop_databases do
57 %x( mysqladmin --user=#{MYSQL_DB_USER} -f drop activerecord_unittest )
58 %x( mysqladmin --user=#{MYSQL_DB_USER} -f drop activerecord_unittest2 )
61 desc 'Rebuild the MySQL test databases'
62 task :rebuild_databases => [:drop_databases, :build_databases]
65 task :build_mysql_databases => 'mysql:build_databases'
66 task :drop_mysql_databases => 'mysql:drop_databases'
67 task :rebuild_mysql_databases => 'mysql:rebuild_databases'
70 namespace :postgresql do
71 desc 'Build the PostgreSQL test databases'
72 task :build_databases do
73 %x( createdb activerecord_unittest )
74 %x( createdb activerecord_unittest2 )
77 desc 'Drop the PostgreSQL test databases'
78 task :drop_databases do
79 %x( dropdb activerecord_unittest )
80 %x( dropdb activerecord_unittest2 )
83 desc 'Rebuild the PostgreSQL test databases'
84 task :rebuild_databases => [:drop_databases, :build_databases]
87 task :build_postgresql_databases => 'postgresql:build_databases'
88 task :drop_postgresql_databases => 'postgresql:drop_databases'
89 task :rebuild_postgresql_databases => 'postgresql:rebuild_databases'
92 namespace :frontbase do
93 desc 'Build the FrontBase test databases'
94 task :build_databases => :rebuild_frontbase_databases
96 desc 'Rebuild the FrontBase test databases'
97 task :rebuild_databases do
98 build_frontbase_database = Proc.new do |db_name, sql_definition_file|
100 STOP DATABASE #{db_name};
101 DELETE DATABASE #{db_name};
102 CREATE DATABASE #{db_name};
104 CONNECT TO #{db_name} AS SESSION_NAME USER _SYSTEM;
108 CREATE SCHEMA RAILS AUTHORIZATION RAILS;
111 SET SESSION AUTHORIZATION RAILS;
112 SCRIPT '#{sql_definition_file}';
119 create_activerecord_unittest = build_frontbase_database['activerecord_unittest', File.join(SCHEMA_ROOT, 'frontbase.sql')]
120 create_activerecord_unittest2 = build_frontbase_database['activerecord_unittest2', File.join(SCHEMA_ROOT, 'frontbase2.sql')]
121 execute_frontbase_sql = Proc.new do |sql|
123 /Library/FrontBase/bin/sql92 <<-SQL
128 execute_frontbase_sql[create_activerecord_unittest]
129 execute_frontbase_sql[create_activerecord_unittest2]
133 task :build_frontbase_databases => 'frontbase:build_databases'
134 task :rebuild_frontbase_databases => 'frontbase:rebuild_databases'
137 # Generate the RDoc documentation
139 Rake::RDocTask.new { |rdoc|
140 rdoc.rdoc_dir = 'doc'
141 rdoc.title = "Active Record -- Object-relation mapping put on rails"
142 rdoc.options << '--line-numbers' << '--inline-source' << '-A cattr_accessor=object'
143 rdoc.options << '--charset' << 'utf-8'
144 rdoc.template = ENV['template'] ? "#{ENV['template']}.rb" : '../doc/template/horo'
145 rdoc.rdoc_files.include('README', 'RUNNING_UNIT_TESTS', 'CHANGELOG')
146 rdoc.rdoc_files.include('lib/**/*.rb')
147 rdoc.rdoc_files.exclude('lib/active_record/vendor/*')
148 rdoc.rdoc_files.include('dev-utils/*.rb')
151 # Enhance rdoc task to copy referenced images also
153 FileUtils.mkdir_p "doc/files/examples/"
154 FileUtils.copy "examples/associations.png", "doc/files/examples/associations.png"
158 # Create compressed packages
160 dist_dirs = [ "lib", "test", "examples" ]
162 spec = Gem::Specification.new do |s|
163 s.platform = Gem::Platform::RUBY
165 s.version = PKG_VERSION
166 s.summary = "Implements the ActiveRecord pattern for ORM."
167 s.description = %q{Implements the ActiveRecord pattern (Fowler, PoEAA) for ORM. It ties database tables and classes together for business objects, like Customer or Subscription, that can find, save, and destroy themselves without resorting to manual SQL.}
169 s.files = [ "Rakefile", "install.rb", "README", "RUNNING_UNIT_TESTS", "CHANGELOG" ]
170 dist_dirs.each do |dir|
171 s.files = s.files + Dir.glob( "#{dir}/**/*" ).delete_if { |item| item.include?( "\.svn" ) }
174 s.add_dependency('activesupport', '= 2.2.2' + PKG_BUILD)
176 s.files.delete FIXTURES_ROOT + "/fixture_database.sqlite"
177 s.files.delete FIXTURES_ROOT + "/fixture_database_2.sqlite"
178 s.files.delete FIXTURES_ROOT + "/fixture_database.sqlite3"
179 s.files.delete FIXTURES_ROOT + "/fixture_database_2.sqlite3"
180 s.require_path = 'lib'
181 s.autorequire = 'active_record'
184 s.extra_rdoc_files = %w( README )
185 s.rdoc_options.concat ['--main', 'README']
187 s.author = "David Heinemeier Hansson"
188 s.email = "david@loudthinking.com"
189 s.homepage = "http://www.rubyonrails.org"
190 s.rubyforge_project = "activerecord"
193 Rake::GemPackageTask.new(spec) do |p|
200 lines, codelines, total_lines, total_codelines = 0, 0, 0, 0
202 for file_name in FileList["lib/active_record/**/*.rb"]
203 next if file_name =~ /vendor/
204 f = File.open(file_name)
208 next if line =~ /^\s*$/
209 next if line =~ /^\s*#/
212 puts "L: #{sprintf("%4d", lines)}, LOC #{sprintf("%4d", codelines)} | #{file_name}"
215 total_codelines += codelines
217 lines, codelines = 0, 0
220 puts "Total: Lines #{total_lines}, LOC #{total_codelines}"
224 # Publishing ------------------------------------------------------
226 desc "Publish the beta gem"
227 task :pgem => [:package] do
228 Rake::SshFilePublisher.new("gems.rubyonrails.org", "/u/sites/gems/gems", "pkg", "#{PKG_FILE_NAME}.gem").upload
229 `ssh gems.rubyonrails.org '/u/sites/gems/gemupdate.sh'`
232 desc "Publish the API documentation"
233 task :pdoc => [:rdoc] do
234 Rake::SshDirPublisher.new("wrath.rubyonrails.org", "public_html/ar", "doc").upload
237 desc "Publish the release files to RubyForge."
238 task :release => [ :package ] do
240 require 'rake/contrib/rubyforgepublisher'
242 packages = %w( gem tgz zip ).collect{ |ext| "pkg/#{PKG_NAME}-#{PKG_VERSION}.#{ext}" }
244 rubyforge = RubyForge.new
246 rubyforge.add_release(PKG_NAME, PKG_NAME, "REL #{PKG_VERSION}", *packages)