From c02f2782631a1893e2e880e3ccc65fb9a734567a Mon Sep 17 00:00:00 2001 From: Carl Lerche Date: Mon, 28 Dec 2009 16:21:48 -0800 Subject: [PATCH] Add the ability to have plugins load rake tasks. --- railties/lib/rails/application.rb | 5 ++++ railties/lib/rails/plugin.rb | 10 +++++++ .../test/plugins/framework_extension_test.rb | 27 +++++++++++++++++++ 3 files changed, 42 insertions(+) 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 @@ -2,6 +2,33 @@ require "isolation/abstract_unit" module PluginsTest class FrameworkExtensionTest < Test::Unit::TestCase + 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