Rakefile 8.4 KB
Newer Older
D
Initial  
David Heinemeier Hansson 已提交
1 2 3
require 'rubygems'
require 'rake'
require 'rake/testtask'
4
require 'rake/rdoctask'
D
Initial  
David Heinemeier Hansson 已提交
5
require 'rake/packagetask'
6
require 'rake/gempackagetask'
7

8
require File.join(File.dirname(__FILE__), 'lib', 'active_record', 'version')
9
require File.expand_path(File.dirname(__FILE__)) + "/test/config"
D
Initial  
David Heinemeier Hansson 已提交
10 11 12

PKG_BUILD     = ENV['PKG_BUILD'] ? '.' + ENV['PKG_BUILD'] : ''
PKG_NAME      = 'activerecord'
13
PKG_VERSION   = ActiveRecord::VERSION::STRING + PKG_BUILD
D
Initial  
David Heinemeier Hansson 已提交
14 15
PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"

16 17 18 19 20
RELEASE_NAME  = "REL #{PKG_VERSION}"

RUBY_FORGE_PROJECT = "activerecord"
RUBY_FORGE_USER    = "webster132"

21 22
MYSQL_DB_USER = 'rails'

D
Initial  
David Heinemeier Hansson 已提交
23
PKG_FILES = FileList[
24
    "lib/**/*", "test/**/*", "examples/**/*", "doc/**/*", "[A-Z]*", "install.rb", "Rakefile"
D
Initial  
David Heinemeier Hansson 已提交
25 26
].exclude(/\bCVS\b|~$/)

27 28 29 30 31 32 33 34 35 36 37 38 39
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
D
Initial  
David Heinemeier Hansson 已提交
40

J
Jeremy Kemper 已提交
41 42
desc 'Run mysql, sqlite, and postgresql tests by default'
task :default => :test
D
Initial  
David Heinemeier Hansson 已提交
43

J
Jeremy Kemper 已提交
44
desc 'Run mysql, sqlite, and postgresql tests'
45 46 47 48 49 50
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
D
Initial  
David Heinemeier Hansson 已提交
51

52
for adapter in %w( mysql postgresql sqlite sqlite3 firebird db2 oracle sybase openbase frontbase jdbcmysql jdbcpostgresql jdbcsqlite3 jdbcderby jdbch2 jdbchsqldb )
53
  Rake::TestTask.new("test_#{adapter}") { |t|
54 55 56 57 58
    if adapter =~ /jdbc/
      t.libs << "test" << "test/connections/jdbc_#{adapter}"
    else
      t.libs << "test" << "test/connections/native_#{adapter}"
    end
59
    adapter_short = adapter == 'db2' ? adapter : adapter[/^[a-z]+/]
60
    t.test_files=Dir.glob( "test/cases/**/*_test{,_#{adapter_short}}.rb" ).sort
61 62
    t.verbose = true
  }
63 64 65 66

  namespace adapter do
    task :test => "test_#{adapter}"
  end
67
end
68

69 70 71
namespace :mysql do
  desc 'Build the MySQL test databases'
  task :build_databases do
72 73
    %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})
74 75 76 77
  end

  desc 'Drop the MySQL test databases'
  task :drop_databases do
78 79
    %x( mysqladmin --user=#{MYSQL_DB_USER} -f drop activerecord_unittest )
    %x( mysqladmin --user=#{MYSQL_DB_USER} -f drop activerecord_unittest2 )
80
  end
81

82 83
  desc 'Rebuild the MySQL test databases'
  task :rebuild_databases => [:drop_databases, :build_databases]
84 85
end

86 87
task :build_mysql_databases => 'mysql:build_databases'
task :drop_mysql_databases => 'mysql:drop_databases'
88
task :rebuild_mysql_databases => 'mysql:rebuild_databases'
89 90


91 92 93
namespace :postgresql do
  desc 'Build the PostgreSQL test databases'
  task :build_databases do
94 95
    %x( createdb -E UTF8 activerecord_unittest )
    %x( createdb -E UTF8 activerecord_unittest2 )
96 97 98 99
  end

  desc 'Drop the PostgreSQL test databases'
  task :drop_databases do
100 101
    %x( dropdb activerecord_unittest )
    %x( dropdb activerecord_unittest2 )
102 103 104 105
  end

  desc 'Rebuild the PostgreSQL test databases'
  task :rebuild_databases => [:drop_databases, :build_databases]
106 107
end

108 109
task :build_postgresql_databases => 'postgresql:build_databases'
task :drop_postgresql_databases => 'postgresql:drop_databases'
110
task :rebuild_postgresql_databases => 'postgresql:rebuild_databases'
111

112

113 114 115
namespace :frontbase do
  desc 'Build the FrontBase test databases'
  task :build_databases => :rebuild_frontbase_databases
116

117 118 119 120 121 122 123
  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};
124

125 126
        CONNECT TO #{db_name} AS SESSION_NAME USER _SYSTEM;
        SET COMMIT FALSE;
127

128 129 130
        CREATE USER RAILS;
        CREATE SCHEMA RAILS AUTHORIZATION RAILS;
        COMMIT;
131

132 133
        SET SESSION AUTHORIZATION RAILS;
        SCRIPT '#{sql_definition_file}';
134

135 136 137 138 139
        COMMIT;

        DISCONNECT ALL;
      )
    end
140 141
    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')]
142 143 144 145 146 147 148 149 150
    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]
151 152 153
  end
end

154 155 156 157
task :build_frontbase_databases => 'frontbase:build_databases'
task :rebuild_frontbase_databases => 'frontbase:rebuild_databases'


D
Initial  
David Heinemeier Hansson 已提交
158 159
# Generate the RDoc documentation

160
Rake::RDocTask.new { |rdoc|
D
Initial  
David Heinemeier Hansson 已提交
161 162
  rdoc.rdoc_dir = 'doc'
  rdoc.title    = "Active Record -- Object-relation mapping put on rails"
163
  rdoc.options << '--line-numbers' << '--inline-source' << '-A cattr_accessor=object'
164
  rdoc.options << '--charset' << 'utf-8'
J
Jeremy Kemper 已提交
165
  rdoc.template = ENV['template'] ? "#{ENV['template']}.rb" : '../doc/template/horo'
D
Initial  
David Heinemeier Hansson 已提交
166 167 168 169 170 171
  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')
}

172 173 174 175 176 177
# 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

D
Initial  
David Heinemeier Hansson 已提交
178 179 180

# Create compressed packages

181
dist_dirs = [ "lib", "test", "examples" ]
D
Initial  
David Heinemeier Hansson 已提交
182 183

spec = Gem::Specification.new do |s|
184
  s.platform = Gem::Platform::RUBY
D
Initial  
David Heinemeier Hansson 已提交
185 186 187 188 189
  s.name = PKG_NAME
  s.version = PKG_VERSION
  s.summary = "Implements the ActiveRecord pattern for ORM."
  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.}

190
  s.files = [ "Rakefile", "install.rb", "README", "RUNNING_UNIT_TESTS", "CHANGELOG" ]
D
Initial  
David Heinemeier Hansson 已提交
191
  dist_dirs.each do |dir|
192
    s.files = s.files + Dir.glob( "#{dir}/**/*" ).delete_if { |item| item.include?( "\.svn" ) }
D
Initial  
David Heinemeier Hansson 已提交
193
  end
194

A
Aaron Patterson 已提交
195
  s.add_dependency('activesupport', '= 2.3.18' + PKG_BUILD)
196

197 198 199 200
  s.files.delete FIXTURES_ROOT + "/fixture_database.sqlite"
  s.files.delete FIXTURES_ROOT + "/fixture_database_2.sqlite"
  s.files.delete FIXTURES_ROOT + "/fixture_database.sqlite3"
  s.files.delete FIXTURES_ROOT + "/fixture_database_2.sqlite3"
D
Initial  
David Heinemeier Hansson 已提交
201
  s.require_path = 'lib'
202
  s.autorequire = 'active_record'
D
Initial  
David Heinemeier Hansson 已提交
203

204
  s.has_rdoc = true
D
Initial  
David Heinemeier Hansson 已提交
205 206
  s.extra_rdoc_files = %w( README )
  s.rdoc_options.concat ['--main',  'README']
207

D
Initial  
David Heinemeier Hansson 已提交
208 209
  s.author = "David Heinemeier Hansson"
  s.email = "david@loudthinking.com"
210
  s.homepage = "http://www.rubyonrails.org"
D
Initial  
David Heinemeier Hansson 已提交
211 212
  s.rubyforge_project = "activerecord"
end
213

214
Rake::GemPackageTask.new(spec) do |p|
D
Initial  
David Heinemeier Hansson 已提交
215 216 217 218 219
  p.gem_spec = spec
  p.need_tar = true
  p.need_zip = true
end

220 221 222 223 224 225 226 227 228 229 230 231 232 233
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}"
234

235 236
    total_lines     += lines
    total_codelines += codelines
237

238 239 240 241 242 243
    lines, codelines = 0, 0
  end

  puts "Total: Lines #{total_lines}, LOC #{total_codelines}"
end

D
Initial  
David Heinemeier Hansson 已提交
244

245
# Publishing ------------------------------------------------------
D
Initial  
David Heinemeier Hansson 已提交
246

247
desc "Publish the beta gem"
248
task :pgem => [:package] do
249
  require 'rake/contrib/sshpublisher'
D
David Heinemeier Hansson 已提交
250
  Rake::SshFilePublisher.new("gems.rubyonrails.org", "/u/sites/gems/gems", "pkg", "#{PKG_FILE_NAME}.gem").upload
251
  `ssh gems.rubyonrails.org '/u/sites/gems/gemupdate.sh'`
252 253 254
end

desc "Publish the API documentation"
255
task :pdoc => [:rdoc] do
256
  require 'rake/contrib/sshpublisher'
257
  Rake::SshDirPublisher.new("wrath.rubyonrails.org", "public_html/ar", "doc").upload
D
Initial  
David Heinemeier Hansson 已提交
258
end
259 260

desc "Publish the release files to RubyForge."
261
task :release => [ :package ] do
262
  require 'rubyforge'
263
  require 'rake/contrib/rubyforgepublisher'
264

265 266 267 268 269
  packages = %w( gem tgz zip ).collect{ |ext| "pkg/#{PKG_NAME}-#{PKG_VERSION}.#{ext}" }

  rubyforge = RubyForge.new
  rubyforge.login
  rubyforge.add_release(PKG_NAME, PKG_NAME, "REL #{PKG_VERSION}", *packages)
270
end