3 require 'rake/testtask'
4 require 'rake/rdoctask'
5 require 'rake/packagetask'
6 require 'rake/gempackagetask'
7 require 'rake/contrib/rubyforgepublisher'
8 require File.join(File.dirname(__FILE__), 'lib', 'active_record', 'version')
10 PKG_BUILD = ENV['PKG_BUILD'] ? '.' + ENV['PKG_BUILD'] : ''
11 PKG_NAME = 'activerecord'
12 PKG_VERSION = ActiveRecord::VERSION::STRING + PKG_BUILD
13 PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
15 RELEASE_NAME = "REL #{PKG_VERSION}"
17 RUBY_FORGE_PROJECT = "activerecord"
18 RUBY_FORGE_USER = "webster132"
21 "lib/**/*", "test/**/*", "examples/**/*", "doc/**/*", "[A-Z]*", "install.rb", "Rakefile"
22 ].exclude(/\bCVS\b|~$/)
26 task :default => [ :test_mysql, :test_sqlite, :test_sqlite3, :test_postgresql ]
30 for adapter in %w( mysql postgresql sqlite sqlite3 firebird sqlserver sqlserver_odbc db2 oracle sybase openbase frontbase )
31 Rake::TestTask.new("test_#{adapter}") { |t|
32 t.libs << "test" << "test/connections/native_#{adapter}"
33 adapter_short = adapter == 'db2' ? adapter : adapter[/^[a-z]+/]
34 t.pattern = "test/**/*_test{,_#{adapter_short}}.rb"
39 SCHEMA_PATH = File.join(File.dirname(__FILE__), *%w(test fixtures db_definitions))
41 desc 'Build the MySQL test databases'
42 task :build_mysql_databases do
43 %x( mysqladmin create activerecord_unittest )
44 %x( mysqladmin create activerecord_unittest2 )
45 %x( mysql -e "grant all on activerecord_unittest.* to rails@localhost" )
46 %x( mysql -e "grant all on activerecord_unittest2.* to rails@localhost" )
47 %x( mysql activerecord_unittest < #{File.join(SCHEMA_PATH, 'mysql.sql')} )
48 %x( mysql activerecord_unittest < #{File.join(SCHEMA_PATH, 'mysql2.sql')} )
51 desc 'Drop the MySQL test databases'
52 task :drop_mysql_databases do
53 %x( mysqladmin -f drop activerecord_unittest )
54 %x( mysqladmin -f drop activerecord_unittest2 )
57 desc 'Rebuild the MySQL test databases'
58 task :rebuild_mysql_databases => [:drop_mysql_databases, :build_mysql_databases]
60 desc 'Build the PostgreSQL test databases'
61 task :build_postgresql_databases do
62 %x( createdb -U postgres activerecord_unittest )
63 %x( createdb -U postgres activerecord_unittest2 )
64 %x( psql activerecord_unittest -f #{File.join(SCHEMA_PATH, 'postgresql.sql')} postgres )
65 %x( psql activerecord_unittest2 -f #{File.join(SCHEMA_PATH, 'postgresql2.sql')} postgres )
68 desc 'Drop the PostgreSQL test databases'
69 task :drop_postgresql_databases do
70 %x( dropdb -U postgres activerecord_unittest )
71 %x( dropdb -U postgres activerecord_unittest2 )
74 desc 'Rebuild the PostgreSQL test databases'
75 task :rebuild_postgresql_databases => [:drop_postgresql_databases, :build_postgresql_databases]
77 desc 'Build the FrontBase test databases'
78 task :build_frontbase_databases => :rebuild_frontbase_databases
80 desc 'Rebuild the FrontBase test databases'
81 task :rebuild_frontbase_databases do
82 build_frontbase_database = Proc.new do |db_name, sql_definition_file|
84 STOP DATABASE #{db_name};
85 DELETE DATABASE #{db_name};
86 CREATE DATABASE #{db_name};
88 CONNECT TO #{db_name} AS SESSION_NAME USER _SYSTEM;
92 CREATE SCHEMA RAILS AUTHORIZATION RAILS;
95 SET SESSION AUTHORIZATION RAILS;
96 SCRIPT '#{sql_definition_file}';
103 create_activerecord_unittest = build_frontbase_database['activerecord_unittest', File.join(SCHEMA_PATH, 'frontbase.sql')]
104 create_activerecord_unittest2 = build_frontbase_database['activerecord_unittest2', File.join(SCHEMA_PATH, 'frontbase2.sql')]
105 execute_frontbase_sql = Proc.new do |sql|
107 /Library/FrontBase/bin/sql92 <<-SQL
112 execute_frontbase_sql[create_activerecord_unittest]
113 execute_frontbase_sql[create_activerecord_unittest2]
116 # Generate the RDoc documentation
118 Rake::RDocTask.new { |rdoc|
119 rdoc.rdoc_dir = 'doc'
120 rdoc.title = "Active Record -- Object-relation mapping put on rails"
121 rdoc.options << '--line-numbers' << '--inline-source' << '-A cattr_accessor=object'
122 rdoc.options << '--charset' << 'utf-8'
123 rdoc.template = "#{ENV['template']}.rb" if ENV['template']
124 rdoc.rdoc_files.include('README', 'RUNNING_UNIT_TESTS', 'CHANGELOG')
125 rdoc.rdoc_files.include('lib/**/*.rb')
126 rdoc.rdoc_files.exclude('lib/active_record/vendor/*')
127 rdoc.rdoc_files.include('dev-utils/*.rb')
130 # Enhance rdoc task to copy referenced images also
132 FileUtils.mkdir_p "doc/files/examples/"
133 FileUtils.copy "examples/associations.png", "doc/files/examples/associations.png"
137 # Create compressed packages
139 dist_dirs = [ "lib", "test", "examples", "dev-utils" ]
141 spec = Gem::Specification.new do |s|
143 s.version = PKG_VERSION
144 s.summary = "Implements the ActiveRecord pattern for ORM."
145 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.}
147 s.files = [ "Rakefile", "install.rb", "README", "RUNNING_UNIT_TESTS", "CHANGELOG" ]
148 dist_dirs.each do |dir|
149 s.files = s.files + Dir.glob( "#{dir}/**/*" ).delete_if { |item| item.include?( "\.svn" ) }
152 s.add_dependency('activesupport', '= 1.4.2' + PKG_BUILD)
154 s.files.delete "test/fixtures/fixture_database.sqlite"
155 s.files.delete "test/fixtures/fixture_database_2.sqlite"
156 s.files.delete "test/fixtures/fixture_database.sqlite3"
157 s.files.delete "test/fixtures/fixture_database_2.sqlite3"
158 s.require_path = 'lib'
159 s.autorequire = 'active_record'
162 s.extra_rdoc_files = %w( README )
163 s.rdoc_options.concat ['--main', 'README']
165 s.author = "David Heinemeier Hansson"
166 s.email = "david@loudthinking.com"
167 s.homepage = "http://www.rubyonrails.org"
168 s.rubyforge_project = "activerecord"
171 Rake::GemPackageTask.new(spec) do |p|
178 lines, codelines, total_lines, total_codelines = 0, 0, 0, 0
180 for file_name in FileList["lib/active_record/**/*.rb"]
181 next if file_name =~ /vendor/
182 f = File.open(file_name)
186 next if line =~ /^\s*$/
187 next if line =~ /^\s*#/
190 puts "L: #{sprintf("%4d", lines)}, LOC #{sprintf("%4d", codelines)} | #{file_name}"
193 total_codelines += codelines
195 lines, codelines = 0, 0
198 puts "Total: Lines #{total_lines}, LOC #{total_codelines}"
202 # Publishing ------------------------------------------------------
204 desc "Publish the beta gem"
205 task :pgem => [:package] do
206 Rake::SshFilePublisher.new("davidhh@wrath.rubyonrails.org", "public_html/gems/gems", "pkg", "#{PKG_FILE_NAME}.gem").upload
207 `ssh davidhh@wrath.rubyonrails.org './gemupdate.sh'`
210 desc "Publish the API documentation"
211 task :pdoc => [:rdoc] do
212 Rake::SshDirPublisher.new("davidhh@wrath.rubyonrails.org", "public_html/ar", "doc").upload
215 desc "Publish the release files to RubyForge."
216 task :release => [ :package ] do
219 packages = %w( gem tgz zip ).collect{ |ext| "pkg/#{PKG_NAME}-#{PKG_VERSION}.#{ext}" }
221 rubyforge = RubyForge.new
223 rubyforge.add_release(PKG_NAME, PKG_NAME, "REL #{PKG_VERSION}", *packages)