aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/Rakefile
blob: 22a17a62af4b58f27df5b25bcdf64fda069a16db (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
gem 'rdoc', '= 2.2'
require 'rdoc'
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.rb" ).reject {
      |x| x =~ /\/adapters\//
    } + Dir.glob("test/cases/adapters/#{adapter_short}/**/*_test.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("rails@api.rubyonrails.org", "public_html/ar", "doc").upload
end