From dd665ff9679514e354336bb183a9b40ad17145fb Mon Sep 17 00:00:00 2001 From: David Heinemeier Hansson Date: Thu, 13 Mar 2008 02:47:26 +0000 Subject: Fixed that script/generate would not look for plugin generators in plugin_paths (closes #11000) [glv] git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@9017 5ecf4fe2-1ee6-0310-87b1-e25e094e27de --- railties/CHANGELOG | 2 ++ railties/lib/initializer.rb | 11 ++++++ railties/lib/rails_generator/lookup.rb | 8 +++-- railties/lib/rails_generator/scripts.rb | 11 +++--- .../a/generators/a_generator/a_generator.rb | 4 +++ .../stubby_generator/stubby_generator.rb | 4 +++ railties/test/generator_lookup_test.rb | 40 ++++++++++++++++++++++ 7 files changed, 74 insertions(+), 6 deletions(-) create mode 100644 railties/test/fixtures/plugins/alternate/a/generators/a_generator/a_generator.rb create mode 100644 railties/test/fixtures/plugins/default/stubby/generators/stubby_generator/stubby_generator.rb create mode 100644 railties/test/generator_lookup_test.rb diff --git a/railties/CHANGELOG b/railties/CHANGELOG index bfc066e6f1..96e9d629ae 100644 --- a/railties/CHANGELOG +++ b/railties/CHANGELOG @@ -1,5 +1,7 @@ *SVN* +* Fixed that script/generate would not look for plugin generators in plugin_paths #11000 [glv] + * Fix database rake tasks to work with charset/collation and show proper error messages on failure. Closes #11301 [matt] * add a -e/--export to script/plugin install, uses svn export. #10847 [jon@blankpad.net)] diff --git a/railties/lib/initializer.rb b/railties/lib/initializer.rb index 01acc50763..32e6c5251b 100644 --- a/railties/lib/initializer.rb +++ b/railties/lib/initializer.rb @@ -12,6 +12,15 @@ require 'rails/plugin/loader' RAILS_ENV = (ENV['RAILS_ENV'] || 'development').dup unless defined?(RAILS_ENV) module Rails + # The Configuration instance used to configure the Rails environment + def self.configuration + @@configuration + end + + def self.configuration=(configuration) + @@configuration = configuration + end + # The Initializer is responsible for processing the Rails configuration, such # as setting the $LOAD_PATH, requiring the right frameworks, initializing # logging, and more. It can be run either as a single command that'll just @@ -60,6 +69,8 @@ module Rails # Sequentially step through all of the available initialization routines, # in order (view execution order in source). def process + Rails.configuration = configuration + check_ruby_version set_load_path diff --git a/railties/lib/rails_generator/lookup.rb b/railties/lib/rails_generator/lookup.rb index d88a1948a4..1f28c39d55 100644 --- a/railties/lib/rails_generator/lookup.rb +++ b/railties/lib/rails_generator/lookup.rb @@ -1,3 +1,5 @@ +require 'pathname' + require File.dirname(__FILE__) + '/spec' class Object @@ -104,8 +106,10 @@ module Rails if defined? ::RAILS_ROOT sources << PathSource.new(:lib, "#{::RAILS_ROOT}/lib/generators") sources << PathSource.new(:vendor, "#{::RAILS_ROOT}/vendor/generators") - sources << PathSource.new(:plugins, "#{::RAILS_ROOT}/vendor/plugins/*/**/generators") - sources << PathSource.new(:plugins, "#{::RAILS_ROOT}/vendor/plugins/*/**/rails_generators") + Rails.configuration.plugin_paths.each do |path| + 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 end sources << PathSource.new(:user, "#{Dir.user_home}/.rails/generators") if Object.const_defined?(:Gem) diff --git a/railties/lib/rails_generator/scripts.rb b/railties/lib/rails_generator/scripts.rb index 75167da995..f857f68de4 100644 --- a/railties/lib/rails_generator/scripts.rb +++ b/railties/lib/rails_generator/scripts.rb @@ -43,12 +43,15 @@ module Rails def usage_message usage = "\nInstalled Generators\n" - Rails::Generator::Base.sources.inject({}) do |mem, source| + Rails::Generator::Base.sources.inject([]) do |mem, source| + # Using an association list instead of a hash to preserve order, + # for esthetic reasons more than anything else. label = source.label.to_s.capitalize - mem[label] ||= [] - mem[label] |= source.names + pair = mem.assoc(label) + mem << (pair = [label, []]) if pair.nil? + pair[1] |= source.names mem - end.each_pair do |label, names| + end.each do |label, names| usage << " #{label}: #{names.join(', ')}\n" unless names.empty? end diff --git a/railties/test/fixtures/plugins/alternate/a/generators/a_generator/a_generator.rb b/railties/test/fixtures/plugins/alternate/a/generators/a_generator/a_generator.rb new file mode 100644 index 0000000000..b33f2dad18 --- /dev/null +++ b/railties/test/fixtures/plugins/alternate/a/generators/a_generator/a_generator.rb @@ -0,0 +1,4 @@ +class AGenerator < Rails::Generator::Base + def manifest + end +end diff --git a/railties/test/fixtures/plugins/default/stubby/generators/stubby_generator/stubby_generator.rb b/railties/test/fixtures/plugins/default/stubby/generators/stubby_generator/stubby_generator.rb new file mode 100644 index 0000000000..8fda8197d1 --- /dev/null +++ b/railties/test/fixtures/plugins/default/stubby/generators/stubby_generator/stubby_generator.rb @@ -0,0 +1,4 @@ +class StubbyGenerator < Rails::Generator::Base + def manifest + end +end diff --git a/railties/test/generator_lookup_test.rb b/railties/test/generator_lookup_test.rb new file mode 100644 index 0000000000..b650f304ed --- /dev/null +++ b/railties/test/generator_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 -- cgit v1.2.3