aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--railties/lib/rails/application.rb5
-rw-r--r--railties/lib/rails/plugin.rb10
-rw-r--r--railties/test/plugins/framework_extension_test.rb27
3 files changed, 42 insertions, 0 deletions
diff --git a/railties/lib/rails/application.rb b/railties/lib/rails/application.rb
index cd579a1c0d..4c1f36f537 100644
--- a/railties/lib/rails/application.rb
+++ b/railties/lib/rails/application.rb
@@ -72,7 +72,12 @@ module Rails
def load_tasks
require "rails/tasks"
+ # Load all extension rake tasks
+ plugins.each(&:load_tasks)
+ # Load all plugin tasks
Dir["#{root}/vendor/plugins/*/**/tasks/**/*.rake"].sort.each { |ext| load ext }
+ # Load all application tasks
+ # TODO: extract out the path to the rake tasks
Dir["#{root}/lib/tasks/**/*.rake"].sort.each { |ext| load ext }
task :environment do
$rails_rake_task = true
diff --git a/railties/lib/rails/plugin.rb b/railties/lib/rails/plugin.rb
index aa325c6f76..be6cdec3fa 100644
--- a/railties/lib/rails/plugin.rb
+++ b/railties/lib/rails/plugin.rb
@@ -25,6 +25,16 @@ module Rails
Configuration.default
end
+ def self.rake_tasks(&blk)
+ @rake_tasks ||= []
+ @rake_tasks << blk
+ end
+
+ def self.load_tasks
+ return unless @rake_tasks
+ @rake_tasks.each { |blk| blk.call }
+ end
+
# Creates an initializer which includes all given modules to the given class.
#
# module Rails
diff --git a/railties/test/plugins/framework_extension_test.rb b/railties/test/plugins/framework_extension_test.rb
index 87e19cadce..5e4ecf30dd 100644
--- a/railties/test/plugins/framework_extension_test.rb
+++ b/railties/test/plugins/framework_extension_test.rb
@@ -5,6 +5,33 @@ module PluginsTest
def setup
build_app
boot_rails
+ require "rails"
+ end
+
+ test "rake_tasks block is executed when MyApp.load_tasks is called" do
+ $ran_block = false
+
+ class MyPlugin < Rails::Plugin
+ rake_tasks do
+ $ran_block = true
+ end
+ end
+
+ require "#{app_path}/config/environment"
+
+ assert !$ran_block
+ require 'rake'
+ require 'rake/testtask'
+ require 'rake/rdoctask'
+ AppTemplate::Application.load_tasks
+ assert $ran_block
+ end
+ end
+
+ class ActiveRecordExtensionTest < Test::Unit::TestCase
+ def setup
+ build_app
+ boot_rails
end
test "active_record extensions are applied to ActiveRecord" do