* Ran the Rails upgrade * Upgraded to Rails Engines 2.3.2 * Added a plugin to let Engines override application views. * Converted tests to use the new classes: ** ActionController::TestCase for functional ** ActiveSupport::TestCase for units * Converted ActiveRecord::Error message to a string. * ActiveRecord grouping returns an ordered hash which doesn't have #sort! * Updated the I18n storage_units format. * Added some default initializers from a fresh rails app * Changed the order of check_box_tags and hidden_field_tags. The hidden tag needs to appear first in Rails 2.3, otherwise it will override any value in the check_box_tag. * Removed the custom handler for when the cookie store is tampered with. Rails 2.3 removed the TamperedWithCookie exception and instead Rails will not load the data from it when it's been tampered with (e.g. no user login). * Fixed mail layouts, 2.3 has problems with implicit multipart emails that use layouts. Also removed some custom Redmine mailer code. * Fixed a bug that occurred in tests where the "required" span tag would be added to the :field_status translation. This resulted in an email string of: <li>Status<span class="required"> *</span><span class="required"> *</span> Instead of: <li>Status: New</li> git-svn-id: svn+ssh://rubyforge.org/var/svn/redmine/trunk@2887 e93f8b46-1217-0410-a6f0-8f06a7374b81
281 lines
11 KiB
Ruby
281 lines
11 KiB
Ruby
# This code lets us redefine existing Rake tasks, which is extremely
|
|
# handy for modifying existing Rails rake tasks.
|
|
# Credit for the original snippet of code goes to Jeremy Kemper
|
|
# http://pastie.caboo.se/9620
|
|
unless Rake::TaskManager.methods.include?('redefine_task')
|
|
module Rake
|
|
module TaskManager
|
|
def redefine_task(task_class, args, &block)
|
|
task_name, arg_names, deps = resolve_args([args])
|
|
task_name = task_class.scope_name(@scope, task_name)
|
|
deps = [deps] unless deps.respond_to?(:to_ary)
|
|
deps = deps.collect {|d| d.to_s }
|
|
task = @tasks[task_name.to_s] = task_class.new(task_name, self)
|
|
task.application = self
|
|
task.add_description(@last_description)
|
|
@last_description = nil
|
|
task.enhance(deps, &block)
|
|
task
|
|
end
|
|
|
|
end
|
|
class Task
|
|
class << self
|
|
def redefine_task(args, &block)
|
|
Rake.application.redefine_task(self, [args], &block)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
namespace :db do
|
|
namespace :migrate do
|
|
desc 'Migrate database and plugins to current status.'
|
|
task :all => [ 'db:migrate', 'db:migrate:plugins' ]
|
|
|
|
desc 'Migrate plugins to current status.'
|
|
task :plugins => :environment do
|
|
Engines.plugins.each do |plugin|
|
|
next unless File.exists? plugin.migration_directory
|
|
puts "Migrating plugin #{plugin.name} ..."
|
|
plugin.migrate
|
|
end
|
|
end
|
|
|
|
desc 'For engines coming from Rails version < 2.0 or for those previously updated to work with Sven Fuch\'s fork of engines, you need to upgrade the schema info table'
|
|
task :upgrade_plugin_migrations => :environment do
|
|
svens_fork_table_name = 'plugin_schema_migrations'
|
|
|
|
# Check if app was previously using Sven's fork
|
|
if ActiveRecord::Base.connection.table_exists?(svens_fork_table_name)
|
|
old_sm_table = svens_fork_table_name
|
|
else
|
|
old_sm_table = ActiveRecord::Migrator.proper_table_name(Engines.schema_info_table)
|
|
end
|
|
|
|
unless ActiveRecord::Base.connection.table_exists?(old_sm_table)
|
|
abort "Cannot find old migration table - assuming nothing needs to be done"
|
|
end
|
|
|
|
# There are two forms of the engines schema info - pre-fix_plugin_migrations and post
|
|
# We need to figure this out before we continue.
|
|
|
|
results = ActiveRecord::Base.connection.select_rows(
|
|
"SELECT version, plugin_name FROM #{old_sm_table}"
|
|
).uniq
|
|
|
|
def insert_new_version(plugin_name, version)
|
|
version_string = "#{version}-#{plugin_name}"
|
|
new_sm_table = ActiveRecord::Migrator.schema_migrations_table_name
|
|
|
|
# Check if the row already exists for some reason - maybe run this task more than once.
|
|
return if ActiveRecord::Base.connection.select_rows("SELECT * FROM #{new_sm_table} WHERE version = #{version_string.dump.gsub("\"", "'")}").size > 0
|
|
|
|
puts "Inserting new version #{version} for plugin #{plugin_name}.."
|
|
ActiveRecord::Base.connection.insert("INSERT INTO #{new_sm_table} (version) VALUES (#{version_string.dump.gsub("\"", "'")})")
|
|
end
|
|
|
|
# We need to figure out if they already used "fix_plugin_migrations"
|
|
versions = {}
|
|
results.each do |r|
|
|
versions[r[1]] ||= []
|
|
versions[r[1]] << r[0].to_i
|
|
end
|
|
|
|
if versions.values.find{ |v| v.size > 1 } == nil
|
|
puts "Fixing migration info"
|
|
# We only have one listed migration per plugin - this is pre-fix_plugin_migrations,
|
|
# so we build all versions required. In this case, all migrations should
|
|
versions.each do |plugin_name, version|
|
|
version = version[0] # There is only one version
|
|
|
|
# We have to make an assumption that numeric migrations won't get this long..
|
|
# I'm not sure if there is a better assumption, it should work in all
|
|
# current cases.. (touch wood..)
|
|
if version.to_s.size < "YYYYMMDDHHMMSS".size
|
|
# Insert version records for each migration
|
|
(1..version).each do |v|
|
|
insert_new_version(plugin_name, v)
|
|
end
|
|
else
|
|
# If the plugin is new-format "YYYYMMDDHHMMSS", we just copy it across...
|
|
# The case in which this occurs is very rare..
|
|
insert_new_version(plugin_name, version)
|
|
end
|
|
end
|
|
else
|
|
puts "Moving migration info"
|
|
# We have multiple migrations listed per plugin - thus we can assume they have
|
|
# already applied fix_plugin_migrations - we just copy it across verbatim
|
|
versions.each do |plugin_name, version|
|
|
version.each { |v| insert_new_version(plugin_name, v) }
|
|
end
|
|
end
|
|
|
|
puts "Migration info successfully migrated - removing old schema info table"
|
|
ActiveRecord::Base.connection.drop_table(old_sm_table)
|
|
end
|
|
|
|
desc 'Migrate a specified plugin.'
|
|
task(:plugin => :environment) do
|
|
name = ENV['NAME']
|
|
if plugin = Engines.plugins[name]
|
|
version = ENV['VERSION']
|
|
puts "Migrating #{plugin.name} to " + (version ? "version #{version}" : 'latest version') + " ..."
|
|
plugin.migrate(version ? version.to_i : nil)
|
|
else
|
|
puts "Plugin #{name} does not exist."
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
namespace :db do
|
|
namespace :fixtures do
|
|
namespace :plugins do
|
|
|
|
desc "Load plugin fixtures into the current environment's database."
|
|
task :load => :environment do
|
|
require 'active_record/fixtures'
|
|
ActiveRecord::Base.establish_connection(RAILS_ENV.to_sym)
|
|
Dir.glob(File.join(RAILS_ROOT, 'vendor', 'plugins', ENV['PLUGIN'] || '**',
|
|
'test', 'fixtures', '*.yml')).each do |fixture_file|
|
|
Fixtures.create_fixtures(File.dirname(fixture_file), File.basename(fixture_file, '.*'))
|
|
end
|
|
end
|
|
|
|
end
|
|
end
|
|
end
|
|
|
|
# this is just a modification of the original task in railties/lib/tasks/documentation.rake,
|
|
# because the default task doesn't support subdirectories like <plugin>/app or
|
|
# <plugin>/component. These tasks now include every file under a plugin's load paths (see
|
|
# Plugin#load_paths).
|
|
namespace :doc do
|
|
|
|
plugins = FileList['vendor/plugins/**'].collect { |plugin| File.basename(plugin) }
|
|
|
|
namespace :plugins do
|
|
|
|
# Define doc tasks for each plugin
|
|
plugins.each do |plugin|
|
|
desc "Create plugin documentation for '#{plugin}'"
|
|
Rake::Task.redefine_task(plugin => :environment) do
|
|
plugin_base = RAILS_ROOT + "/vendor/plugins/#{plugin}"
|
|
options = []
|
|
files = Rake::FileList.new
|
|
options << "-o doc/plugins/#{plugin}"
|
|
options << "--title '#{plugin.titlecase} Plugin Documentation'"
|
|
options << '--line-numbers' << '--inline-source'
|
|
options << '-T html'
|
|
|
|
# Include every file in the plugin's load_paths (see Plugin#load_paths)
|
|
if Engines.plugins[plugin]
|
|
files.include("#{plugin_base}/{#{Engines.plugins[plugin].load_paths.join(",")}}/**/*.rb")
|
|
end
|
|
if File.exists?("#{plugin_base}/README")
|
|
files.include("#{plugin_base}/README")
|
|
options << "--main '#{plugin_base}/README'"
|
|
end
|
|
files.include("#{plugin_base}/CHANGELOG") if File.exists?("#{plugin_base}/CHANGELOG")
|
|
|
|
if files.empty?
|
|
puts "No source files found in #{plugin_base}. No documentation will be generated."
|
|
else
|
|
options << files.to_s
|
|
sh %(rdoc #{options * ' '})
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
|
|
namespace :test do
|
|
task :warn_about_multiple_plugin_testing_with_engines do
|
|
puts %{-~============== A Moste Polite Warninge ===========================~-
|
|
|
|
You may experience issues testing multiple plugins at once when using
|
|
the code-mixing features that the engines plugin provides. If you do
|
|
experience any problems, please test plugins individually, i.e.
|
|
|
|
$ rake test:plugins PLUGIN=my_plugin
|
|
|
|
or use the per-type plugin test tasks:
|
|
|
|
$ rake test:plugins:units
|
|
$ rake test:plugins:functionals
|
|
$ rake test:plugins:integration
|
|
$ rake test:plugins:all
|
|
|
|
Report any issues on http://dev.rails-engines.org. Thanks!
|
|
|
|
-~===============( ... as you were ... )============================~-}
|
|
end
|
|
|
|
namespace :engines do
|
|
|
|
def engine_plugins
|
|
Dir["vendor/plugins/*"].select { |f| File.directory?(File.join(f, "app")) }.map { |f| File.basename(f) }.join(",")
|
|
end
|
|
|
|
desc "Run tests from within engines plugins (plugins with an 'app' directory)"
|
|
task :all => [:units, :functionals, :integration]
|
|
|
|
desc "Run unit tests from within engines plugins (plugins with an 'app' directory)"
|
|
Rake::TestTask.new(:units => "test:plugins:setup_plugin_fixtures") do |t|
|
|
t.pattern = "vendor/plugins/{#{ENV['PLUGIN'] || engine_plugins}}/test/unit/**/*_test.rb"
|
|
t.verbose = true
|
|
end
|
|
|
|
desc "Run functional tests from within engines plugins (plugins with an 'app' directory)"
|
|
Rake::TestTask.new(:functionals => "test:plugins:setup_plugin_fixtures") do |t|
|
|
t.pattern = "vendor/plugins/{#{ENV['PLUGIN'] || engine_plugins}}/test/functional/**/*_test.rb"
|
|
t.verbose = true
|
|
end
|
|
|
|
desc "Run integration tests from within engines plugins (plugins with an 'app' directory)"
|
|
Rake::TestTask.new(:integration => "test:plugins:setup_plugin_fixtures") do |t|
|
|
t.pattern = "vendor/plugins/{#{ENV['PLUGIN'] || engine_plugins}}/test/integration/**/*_test.rb"
|
|
t.verbose = true
|
|
end
|
|
end
|
|
|
|
namespace :plugins do
|
|
|
|
desc "Run the plugin tests in vendor/plugins/**/test (or specify with PLUGIN=name)"
|
|
task :all => [:warn_about_multiple_plugin_testing_with_engines,
|
|
:units, :functionals, :integration]
|
|
|
|
desc "Run all plugin unit tests"
|
|
Rake::TestTask.new(:units => :setup_plugin_fixtures) do |t|
|
|
t.pattern = "vendor/plugins/#{ENV['PLUGIN'] || "**"}/test/unit/**/*_test.rb"
|
|
t.verbose = true
|
|
end
|
|
|
|
desc "Run all plugin functional tests"
|
|
Rake::TestTask.new(:functionals => :setup_plugin_fixtures) do |t|
|
|
t.pattern = "vendor/plugins/#{ENV['PLUGIN'] || "**"}/test/functional/**/*_test.rb"
|
|
t.verbose = true
|
|
end
|
|
|
|
desc "Integration test engines"
|
|
Rake::TestTask.new(:integration => :setup_plugin_fixtures) do |t|
|
|
t.pattern = "vendor/plugins/#{ENV['PLUGIN'] || "**"}/test/integration/**/*_test.rb"
|
|
t.verbose = true
|
|
end
|
|
|
|
desc "Mirrors plugin fixtures into a single location to help plugin tests"
|
|
task :setup_plugin_fixtures => :environment do
|
|
Engines::Testing.setup_plugin_fixtures
|
|
end
|
|
|
|
# Patch the default plugin testing task to have setup_plugin_fixtures as a prerequisite
|
|
Rake::Task["test:plugins"].prerequisites << "test:plugins:setup_plugin_fixtures"
|
|
end
|
|
end
|