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 => defined?(JRUBY_VERSION) ?
34 %w(test_jdbcmysql test_jdbcsqlite3 test_jdbcpostgresql) :
35 %w(test_mysql test_sqlite3 test_postgresql)
37 for adapter in %w( mysql postgresql sqlite sqlite3 firebird db2 oracle sybase openbase frontbase jdbcmysql jdbcpostgresql jdbcsqlite3 jdbcderby jdbch2 jdbchsqldb )
38 Rake::TestTask.new("test_#{adapter}") { |t|
40 t.libs << "test" << "test/connections/jdbc_#{adapter}"
42 t.libs << "test" << "test/connections/native_#{adapter}"
44 adapter_short = adapter == 'db2' ? adapter : adapter[/^[a-z]+/]
45 t.test_files=Dir.glob( "test/cases/**/*_test{,_#{adapter_short}}.rb" ).sort
50 task :test => "test_#{adapter}"
55 desc 'Build the MySQL test databases'
56 task :build_databases do
57 %x( mysqladmin --user=#{MYSQL_DB_USER} create activerecord_unittest )
58 %x( mysqladmin --user=#{MYSQL_DB_USER} create activerecord_unittest2 )
61 desc 'Drop the MySQL test databases'
62 task :drop_databases do
63 %x( mysqladmin --user=#{MYSQL_DB_USER} -f drop activerecord_unittest )
64 %x( mysqladmin --user=#{MYSQL_DB_USER} -f drop activerecord_unittest2 )
67 desc 'Rebuild the MySQL test databases'
68 task :rebuild_databases => [:drop_databases, :build_databases]
71 task :build_mysql_databases => 'mysql:build_databases'
72 task :drop_mysql_databases => 'mysql:drop_databases'
73 task :rebuild_mysql_databases => 'mysql:rebuild_databases'
76 namespace :postgresql do
77 desc 'Build the PostgreSQL test databases'
78 task :build_databases do
79 %x( createdb activerecord_unittest )
80 %x( createdb activerecord_unittest2 )
83 desc 'Drop the PostgreSQL test databases'
84 task :drop_databases do
85 %x( dropdb activerecord_unittest )
86 %x( dropdb activerecord_unittest2 )
89 desc 'Rebuild the PostgreSQL test databases'
90 task :rebuild_databases => [:drop_databases, :build_databases]
93 task :build_postgresql_databases => 'postgresql:build_databases'
94 task :drop_postgresql_databases => 'postgresql:drop_databases'
95 task :rebuild_postgresql_databases => 'postgresql:rebuild_databases'
98 namespace :frontbase do
99 desc 'Build the FrontBase test databases'
100 task :build_databases => :rebuild_frontbase_databases
102 desc 'Rebuild the FrontBase test databases'
103 task :rebuild_databases do
104 build_frontbase_database = Proc.new do |db_name, sql_definition_file|
106 STOP DATABASE #{db_name};
107 DELETE DATABASE #{db_name};
108 CREATE DATABASE #{db_name};
110 CONNECT TO #{db_name} AS SESSION_NAME USER _SYSTEM;
114 CREATE SCHEMA RAILS AUTHORIZATION RAILS;
117 SET SESSION AUTHORIZATION RAILS;
118 SCRIPT '#{sql_definition_file}';
125 create_activerecord_unittest = build_frontbase_database['activerecord_unittest', File.join(SCHEMA_ROOT, 'frontbase.sql')]
126 create_activerecord_unittest2 = build_frontbase_database['activerecord_unittest2', File.join(SCHEMA_ROOT, 'frontbase2.sql')]
127 execute_frontbase_sql = Proc.new do |sql|
129 /Library/FrontBase/bin/sql92 <<-SQL
134 execute_frontbase_sql[create_activerecord_unittest]
135 execute_frontbase_sql[create_activerecord_unittest2]
139 task :build_frontbase_databases => 'frontbase:build_databases'
140 task :rebuild_frontbase_databases => 'frontbase:rebuild_databases'
143 # Generate the RDoc documentation
145 Rake::RDocTask.new { |rdoc|
146 rdoc.rdoc_dir = 'doc'
147 rdoc.title = "Active Record -- Object-relation mapping put on rails"
148 rdoc.options << '--line-numbers' << '--inline-source' << '-A cattr_accessor=object'
149 rdoc.options << '--charset' << 'utf-8'
150 rdoc.template = ENV['template'] ? "#{ENV['template']}.rb" : '../doc/template/horo'
151 rdoc.rdoc_files.include('README', 'RUNNING_UNIT_TESTS', 'CHANGELOG')
152 rdoc.rdoc_files.include('lib/**/*.rb')
153 rdoc.rdoc_files.exclude('lib/active_record/vendor/*')
154 rdoc.rdoc_files.include('dev-utils/*.rb')
157 # Enhance rdoc task to copy referenced images also
159 FileUtils.mkdir_p "doc/files/examples/"
160 FileUtils.copy "examples/associations.png", "doc/files/examples/associations.png"
164 # Create compressed packages
166 dist_dirs = [ "lib", "test", "examples" ]
168 spec = Gem::Specification.new do |s|
169 s.platform = Gem::Platform::RUBY
171 s.version = PKG_VERSION
172 s.summary = "Implements the ActiveRecord pattern for ORM."
173 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.}
175 s.files = [ "Rakefile", "install.rb", "README", "RUNNING_UNIT_TESTS", "CHANGELOG" ]
176 dist_dirs.each do |dir|
177 s.files = s.files + Dir.glob( "#{dir}/**/*" ).delete_if { |item| item.include?( "\.svn" ) }
180 s.add_dependency('activesupport', '= 2.3.2' + PKG_BUILD)
182 s.files.delete FIXTURES_ROOT + "/fixture_database.sqlite"
183 s.files.delete FIXTURES_ROOT + "/fixture_database_2.sqlite"
184 s.files.delete FIXTURES_ROOT + "/fixture_database.sqlite3"
185 s.files.delete FIXTURES_ROOT + "/fixture_database_2.sqlite3"
186 s.require_path = 'lib'
187 s.autorequire = 'active_record'
190 s.extra_rdoc_files = %w( README )
191 s.rdoc_options.concat ['--main', 'README']
193 s.author = "David Heinemeier Hansson"
194 s.email = "david@loudthinking.com"
195 s.homepage = "http://www.rubyonrails.org"
196 s.rubyforge_project = "activerecord"
199 Rake::GemPackageTask.new(spec) do |p|
206 lines, codelines, total_lines, total_codelines = 0, 0, 0, 0
208 for file_name in FileList["lib/active_record/**/*.rb"]
209 next if file_name =~ /vendor/
210 f = File.open(file_name)
214 next if line =~ /^\s*$/
215 next if line =~ /^\s*#/
218 puts "L: #{sprintf("%4d", lines)}, LOC #{sprintf("%4d", codelines)} | #{file_name}"
221 total_codelines += codelines
223 lines, codelines = 0, 0
226 puts "Total: Lines #{total_lines}, LOC #{total_codelines}"
230 # Publishing ------------------------------------------------------
232 desc "Publish the beta gem"
233 task :pgem => [:package] do
234 Rake::SshFilePublisher.new("gems.rubyonrails.org", "/u/sites/gems/gems", "pkg", "#{PKG_FILE_NAME}.gem").upload
235 `ssh gems.rubyonrails.org '/u/sites/gems/gemupdate.sh'`
238 desc "Publish the API documentation"
239 task :pdoc => [:rdoc] do
240 Rake::SshDirPublisher.new("wrath.rubyonrails.org", "public_html/ar", "doc").upload
243 desc "Publish the release files to RubyForge."
244 task :release => [ :package ] do
246 require 'rake/contrib/rubyforgepublisher'
248 packages = %w( gem tgz zip ).collect{ |ext| "pkg/#{PKG_NAME}-#{PKG_VERSION}.#{ext}" }
250 rubyforge = RubyForge.new
252 rubyforge.add_release(PKG_NAME, PKG_NAME, "REL #{PKG_VERSION}", *packages)