From 54c43f76ec6a13064f4f013a8f7f5d22cae20912 Mon Sep 17 00:00:00 2001 From: Luca Guidi Date: Tue, 24 Feb 2009 15:26:56 +0100 Subject: [PATCH] Database Rake tasks for engine migrations --- railties/lib/initializer.rb | 4 +++ railties/lib/rails/plugin/loader.rb | 1 + railties/lib/tasks/databases.rake | 36 +++++++++++++++++++++++++++++++++++ railties/test/initializer_test.rb | 12 +++++++++++ 4 files changed, 53 insertions(+), 0 deletions(-) diff --git a/railties/lib/initializer.rb b/railties/lib/initializer.rb index a31ae94..7a7c332 100644 --- a/railties/lib/initializer.rb +++ b/railties/lib/initializer.rb @@ -71,6 +71,10 @@ module Rails def public_path=(path) @@public_path = path end + + def plugins + @@plugins ||= ActiveSupport::OrderedHash.new + end end # The Initializer is responsible for processing the Rails configuration, such diff --git a/railties/lib/rails/plugin/loader.rb b/railties/lib/rails/plugin/loader.rb index 7f85bb8..30a5f93 100644 --- a/railties/lib/rails/plugin/loader.rb +++ b/railties/lib/rails/plugin/loader.rb @@ -103,6 +103,7 @@ module Rails def register_plugin_as_loaded(plugin) initializer.loaded_plugins << plugin + Rails.plugins[plugin.name] = plugin end def configuration diff --git a/railties/lib/tasks/databases.rake b/railties/lib/tasks/databases.rake index 9588fab..e4e736c 100644 --- a/railties/lib/tasks/databases.rake +++ b/railties/lib/tasks/databases.rake @@ -147,6 +147,42 @@ namespace :db do ActiveRecord::Migrator.run(:down, "db/migrate/", version) Rake::Task["db:schema:dump"].invoke if ActiveRecord::Base.schema_format == :ruby end + + desc 'Runs migrations from engines.' + task :engines => :environment do + engines = if ENV["ENGINE"] + raise "Unknown engine: #{ENV["ENGINE"]}" unless Rails.plugins.key?(ENV["ENGINE"]) + Hash[ENV["ENGINE"], Rails.plugins[ENV["ENGINE"]]] + else + Rails.plugins + end + + engines.each do |name, engine| + engine_migrations_path = "#{engine.directory}/db/migrate" + next unless File.exist?(engine_migrations_path) + ActiveRecord::Migrator.migrate(engine_migrations_path) + Rake::Task["db:schema:dump"].invoke if ActiveRecord::Base.schema_format == :ruby + end + end + + namespace :engines do + desc 'Runs the "down" for migrations from engines.' + task :down => :environment do + engines = if ENV["ENGINE"] + raise "Unknown engine: #{ENV["ENGINE"]}" unless Rails.plugins.key?(ENV["ENGINE"]) + Hash[ENV["ENGINE"], Rails.plugins[ENV["ENGINE"]]] + else + Rails.plugins + end + + engines.each do |name, engine| + engine_migrations_path = "#{engine.directory}/db/migrate" + next unless File.exist?(engine_migrations_path) + ActiveRecord::Migrator.down(engine_migrations_path) + Rake::Task["db:schema:dump"].invoke if ActiveRecord::Base.schema_format == :ruby + end + end + end end desc 'Rolls the schema back to the previous version. Specify the number of steps with STEP=n' diff --git a/railties/test/initializer_test.rb b/railties/test/initializer_test.rb index eb9ec75..1d70033 100644 --- a/railties/test/initializer_test.rb +++ b/railties/test/initializer_test.rb @@ -187,6 +187,7 @@ class InitializerPluginLoadingTests < Test::Unit::TestCase @initializer = Rails::Initializer.new(@configuration) @valid_plugin_path = plugin_fixture_path('default/stubby') @empty_plugin_path = plugin_fixture_path('default/empty') + Rails.plugins.clear end def test_no_plugins_are_loaded_if_the_configuration_has_an_empty_plugin_list @@ -268,6 +269,17 @@ class InitializerPluginLoadingTests < Test::Unit::TestCase assert $LOAD_PATH.include?(File.join(plugin_fixture_path('default/acts/acts_as_chunky_bacon'), 'lib')) end + def test_should_store_loaded_plugins_in_rails_module + load_plugins! + assert_plugins [:a, :acts_as_chunky_bacon, :engine, :gemlike, :plugin_with_no_lib_dir, :stubby], Rails.plugins.values + end + + def test_should_store_only_specified_plugins_in_rails_module + plugin_names = [:plugin_with_no_lib_dir, :acts_as_chunky_bacon] + only_load_the_following_plugins! plugin_names + load_plugins! + assert_plugins plugin_names, Rails.plugins.values + end private -- 1.5.4.5