From 822ba1ade8af2c25a352735653122c5c9c6c1efa Mon Sep 17 00:00:00 2001 From: Brian Landau Date: Tue, 17 Jun 2008 16:13:43 -0400 Subject: [PATCH] Allow for Gems installed in the vendor directory to supply generators and rake tasks. --- railties/lib/rails_generator/lookup.rb | 9 ++++-- railties/lib/tasks/rails.rb | 1 + railties/test/generator_gem_lookup_test.rb | 45 ++++++++++++++++++++++++++++ railties/test/rails_generator_test.rb | 2 +- 4 files changed, 53 insertions(+), 4 deletions(-) create mode 100644 railties/test/generator_gem_lookup_test.rb diff --git a/railties/lib/rails_generator/lookup.rb b/railties/lib/rails_generator/lookup.rb index 1f28c39..e625330 100644 --- a/railties/lib/rails_generator/lookup.rb +++ b/railties/lib/rails_generator/lookup.rb @@ -96,11 +96,13 @@ module Rails # RAILS_ROOT/generators. # 2. Look in plugins, either for generators/ or rails_generators/ # directories within each plugin - # 3. User home directory. Search ~/.rails/generators. - # 4. RubyGems. Search for gems named *_generator, and look for + # 3. Look at frozen gems in the vendor directory, for a + # rails/generators directory + # 4. User home directory. Search ~/.rails/generators. + # 5. RubyGems. Search for gems named *_generator, and look for # generators within any RubyGem's # /rails_generators/_generator.rb file. - # 5. Builtins. Model, controller, mailer, scaffold, and so on. + # 6. Builtins. Model, controller, mailer, scaffold, and so on. def use_component_sources! reset_sources if defined? ::RAILS_ROOT @@ -110,6 +112,7 @@ module Rails relative_path = Pathname.new(File.expand_path(path)).relative_path_from(Pathname.new(::RAILS_ROOT)) sources << PathSource.new(:"plugins (#{relative_path})", "#{path}/**/{,rails_}generators") end + sources << PathSource.new(:frozen_gems, "#{::RAILS_ROOT}/vendor/gems/*/rails/generators") end sources << PathSource.new(:user, "#{Dir.user_home}/.rails/generators") if Object.const_defined?(:Gem) diff --git a/railties/lib/tasks/rails.rb b/railties/lib/tasks/rails.rb index 8c2b7f9..95dedbe 100644 --- a/railties/lib/tasks/rails.rb +++ b/railties/lib/tasks/rails.rb @@ -6,3 +6,4 @@ Dir["#{File.dirname(__FILE__)}/*.rake"].each { |ext| load ext } # Load any custom rakefile extensions Dir["#{RAILS_ROOT}/vendor/plugins/*/**/tasks/**/*.rake"].sort.each { |ext| load ext } Dir["#{RAILS_ROOT}/lib/tasks/**/*.rake"].sort.each { |ext| load ext } +Dir["#{RAILS_ROOT}/vendor/gems/*/rails/tasks/**/*.rake"].sort.each { |ext| load ext } diff --git a/railties/test/generator_gem_lookup_test.rb b/railties/test/generator_gem_lookup_test.rb new file mode 100644 index 0000000..7a7b885 --- /dev/null +++ b/railties/test/generator_gem_lookup_test.rb @@ -0,0 +1,45 @@ +require File.join(File.dirname(__FILE__), 'abstract_unit') +require 'initializer' + +# The directory where all test fixtures can be found +FIXTURES_DIR = "#{File.dirname(__FILE__)}/fixtures" + +# Set RAILS_ROOT appropriately fixture generation +tmp_dir = "#{FIXTURES_DIR}/tmp" + +if defined? RAILS_ROOT + RAILS_ROOT.replace tmp_dir +else + RAILS_ROOT = tmp_dir +end +FileUtils.mkdir_p RAILS_ROOT + +# Mocks out the configuration +module Rails + def self.configuration + Rails::Configuration.new + end +end + +require 'rails_generator' + +class GeneratorGemLookupTest < Test::Unit::TestCase + include FileUtils + + def setup + mkdir_p "#{RAILS_ROOT}/config" + mkdir_p "#{RAILS_ROOT}/vendor/gems/some_rails_gem-1.0.2/rails/generators/working" + cp "#{FIXTURES_DIR}/lib/generators/working/working_generator.rb", + "#{RAILS_ROOT}/vendor/gems/some_rails_gem-1.0.2/rails/generators/working/working_generator.rb" + end + + def teardown + rm_rf "#{RAILS_ROOT}/config" + rm_rf "#{RAILS_ROOT}/vendor" + end + + def test_should_load_from_vendor_gems_path + assert Rails::Generator::Base.lookup('working') + end + +end diff --git a/railties/test/rails_generator_test.rb b/railties/test/rails_generator_test.rb index b2fc2f5..b6c1198 100644 --- a/railties/test/rails_generator_test.rb +++ b/railties/test/rails_generator_test.rb @@ -55,7 +55,7 @@ class RailsGeneratorTest < Test::Unit::TestCase def test_sources expected = [:lib, :vendor, "plugins (vendor/plugins)".to_sym, # /generators and /rails_generators - :user, + :frozen_gems, :user, :RubyGems, :RubyGems, # gems named _generator, gems containing /rails_generator/ folder :builtin] expected.delete(:RubyGems) unless Object.const_defined?(:Gem) -- 1.5.5.3 From bbda562b4c9ad38a2a0c09a22c46a9131a4e2cac Mon Sep 17 00:00:00 2001 From: Brian Landau Date: Tue, 17 Jun 2008 16:15:14 -0400 Subject: [PATCH] Rename generator_lookup_test.rb -> generator_plugin_lookup_test.rb --- railties/test/generator_plugin_lookup_test.rb | 40 +++++++++++++++++++++++++ 1 files changed, 40 insertions(+), 0 deletions(-) create mode 100644 railties/test/generator_plugin_lookup_test.rb diff --git a/railties/test/generator_plugin_lookup_test.rb b/railties/test/generator_plugin_lookup_test.rb new file mode 100644 index 0000000..b650f30 --- /dev/null +++ b/railties/test/generator_plugin_lookup_test.rb @@ -0,0 +1,40 @@ +require 'plugin_test_helper' + +class GeneratorLookupTest < Test::Unit::TestCase + def setup + @fixture_dirs = %w{alternate default} + @configuration = Rails.configuration = Rails::Configuration.new + # We need to add our testing plugin directory to the plugin paths so + # the locator knows where to look for our plugins + @configuration.plugin_paths += @fixture_dirs.map{|fd| plugin_fixture_path(fd)} + @initializer = Rails::Initializer.new(@configuration) + @initializer.add_plugin_load_paths + @initializer.load_plugins + load 'rails_generator.rb' + require 'rails_generator/scripts' + end + + def test_should_load_from_all_plugin_paths + assert Rails::Generator::Base.lookup('a_generator') + assert Rails::Generator::Base.lookup('stubby_generator') + end + + def test_should_create_generator_source_for_each_directory_in_plugin_paths + sources = Rails::Generator::Base.sources + @fixture_dirs.each do |gen_dir| + expected_label = "plugins (fixtures/plugins/#{gen_dir})".to_sym + assert sources.any? {|source| source.label == expected_label } + end + end + + def test_should_preserve_order_in_usage_message + msg = Rails::Generator::Scripts::Base.new.send(:usage_message) + positions = @fixture_dirs.map do |gen_dir| + pos = msg.index("Plugins (fixtures/plugins/#{gen_dir})") + assert_not_nil pos + pos + end + assert_equal positions.sort, positions + end + +end -- 1.5.5.3 From 6e55d3242dcbfbd0c351ece6126ab4281875142d Mon Sep 17 00:00:00 2001 From: Brian Landau Date: Tue, 17 Jun 2008 16:15:43 -0400 Subject: [PATCH] Rename generator_lookup_test.rb -> generator_plugin_lookup_test.rb --- railties/test/generator_lookup_test.rb | 40 -------------------------------- 1 files changed, 0 insertions(+), 40 deletions(-) delete mode 100644 railties/test/generator_lookup_test.rb diff --git a/railties/test/generator_lookup_test.rb b/railties/test/generator_lookup_test.rb deleted file mode 100644 index b650f30..0000000 --- a/railties/test/generator_lookup_test.rb +++ /dev/null @@ -1,40 +0,0 @@ -require 'plugin_test_helper' - -class GeneratorLookupTest < Test::Unit::TestCase - def setup - @fixture_dirs = %w{alternate default} - @configuration = Rails.configuration = Rails::Configuration.new - # We need to add our testing plugin directory to the plugin paths so - # the locator knows where to look for our plugins - @configuration.plugin_paths += @fixture_dirs.map{|fd| plugin_fixture_path(fd)} - @initializer = Rails::Initializer.new(@configuration) - @initializer.add_plugin_load_paths - @initializer.load_plugins - load 'rails_generator.rb' - require 'rails_generator/scripts' - end - - def test_should_load_from_all_plugin_paths - assert Rails::Generator::Base.lookup('a_generator') - assert Rails::Generator::Base.lookup('stubby_generator') - end - - def test_should_create_generator_source_for_each_directory_in_plugin_paths - sources = Rails::Generator::Base.sources - @fixture_dirs.each do |gen_dir| - expected_label = "plugins (fixtures/plugins/#{gen_dir})".to_sym - assert sources.any? {|source| source.label == expected_label } - end - end - - def test_should_preserve_order_in_usage_message - msg = Rails::Generator::Scripts::Base.new.send(:usage_message) - positions = @fixture_dirs.map do |gen_dir| - pos = msg.index("Plugins (fixtures/plugins/#{gen_dir})") - assert_not_nil pos - pos - end - assert_equal positions.sort, positions - end - -end -- 1.5.5.3 From c276c7fbedb8286e77ab673192c308d0b443153c Mon Sep 17 00:00:00 2001 From: Brian Landau Date: Tue, 17 Jun 2008 16:16:48 -0400 Subject: [PATCH] Rename class GeneratorLookupTest -> GeneratorPluginLookupTest --- railties/test/generator_plugin_lookup_test.rb | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/railties/test/generator_plugin_lookup_test.rb b/railties/test/generator_plugin_lookup_test.rb index b650f30..68379cd 100644 --- a/railties/test/generator_plugin_lookup_test.rb +++ b/railties/test/generator_plugin_lookup_test.rb @@ -1,6 +1,6 @@ require 'plugin_test_helper' -class GeneratorLookupTest < Test::Unit::TestCase +class GeneratorPluginLookupTest < Test::Unit::TestCase def setup @fixture_dirs = %w{alternate default} @configuration = Rails.configuration = Rails::Configuration.new -- 1.5.5.3