diff options
18 files changed, 103 insertions, 95 deletions
diff --git a/railties/lib/generators.rb b/railties/lib/generators.rb index c97801dea8..91a0f5edca 100644 --- a/railties/lib/generators.rb +++ b/railties/lib/generators.rb @@ -12,10 +12,62 @@ require 'rails/version' unless defined?(Rails::VERSION) require 'generators/base' require 'generators/named_base' +require 'generators/active_record' # We will need ActionORM from ActiveRecord, but just it. module Rails module Generators - # Remove builtin generators. + mattr_accessor :load_path + + # Generators load paths. First search on generators in the RAILS_ROOT, then + # look for them in rails generators. + # + def self.load_path + @@load_path ||= begin + paths = [] + paths << File.expand_path(File.join(File.dirname(__FILE__), "generators")) + paths << File.join(RAILS_ROOT, "lib", "generators") if defined?(RAILS_ROOT) + paths + end + end + load_path # Cache load paths + + # Receives paths in an array and tries to find generators for it in the load + # path. + # + def self.lookup(attempts) + generators_path = [] + + # Traverse attempts into directory lookups. For example: + # + # rails:generators:model + # + # Becomes: + # + # generators/rails/model/model_generator.rb + # generators/rails/model_generator.rb + # generators/model_generator.rb + # + attempts.each do |attempt| + paths = attempt.gsub(':generators:', ':').split(':') + paths << "#{paths.last}_generator.rb" + + until paths.empty? + generators_path << File.join(*paths) + paths.delete_at(-1) unless paths.delete_at(-2) + end + end + + generators_path.uniq! + generators_path.each do |generator_path| + self.load_path.each do |path| + Dir[File.join(path, generator_path)].each do |file| + require file + end + end + end + end + + # Keep builtin generators in an Array[Array[group, name]]. # def self.builtin Dir[File.dirname(__FILE__) + '/generators/*/*'].collect do |file| @@ -53,17 +105,18 @@ module Rails def self.find_by_namespace(name, base=nil, context=nil) name, attempts = name.to_s, [] - attempts << "#{base}:generators:#{name}" if base && name.count(':') == 0 - attempts << "#{name}:generators:#{context}" if context && name.count(':') == 0 - attempts << name.sub(':', ':generators:') if name.count(':') == 1 + if name.count(':') == 0 + attempts << "#{base}:generators:#{name}" if base + attempts << "#{name}:generators:#{context}" if context + end + attempts << name.sub(':', ':generators:') if name.count(':') == 1 attempts << name - attempts.each do |namespace| - klass = Thor::Util.find_by_namespace(namespace) - return klass if klass + unless klass = find_many_by_namespace(attempts) + lookup(attempts) + klass = find_many_by_namespace(attempts) end - - nil + klass end # Show help message with available generators. @@ -87,11 +140,6 @@ module Rails # commands. # def self.invoke(namespace, args=ARGV, behavior=:invoke) - # Load everything right now ... - builtin.each do |group, name| - require "generators/#{group}/#{name}/#{name}_generator" - end - if klass = find_by_namespace(namespace, "rails") args << "--help" if klass.arguments.any? { |a| a.required? } && args.empty? klass.start args, :behavior => behavior @@ -99,6 +147,17 @@ module Rails puts "Could not find generator #{namespace}." end end + + protected + + def self.find_many_by_namespace(attempts) + attempts.each do |namespace| + klass = Thor::Util.find_by_namespace(namespace) + return klass if klass + end + nil + end + end end diff --git a/railties/lib/generators/base.rb b/railties/lib/generators/base.rb index 4b47ebc49b..f0d2b4980e 100644 --- a/railties/lib/generators/base.rb +++ b/railties/lib/generators/base.rb @@ -3,7 +3,6 @@ require 'generators/actions' module Rails module Generators DEFAULTS = { - :actions => [], :fixture => true, :force_plural => false, :helper => true, @@ -147,7 +146,7 @@ module Rails # end # class_eval <<-METHOD, __FILE__, __LINE__ - def invoke_for_#{name} + def hook_for_#{name} return unless options[#{name.inspect}] klass_name = options[#{name.inspect}] diff --git a/railties/lib/generators/rails/controller/controller_generator.rb b/railties/lib/generators/rails/controller/controller_generator.rb index 53e839d34d..3fed058c00 100644 --- a/railties/lib/generators/rails/controller/controller_generator.rb +++ b/railties/lib/generators/rails/controller/controller_generator.rb @@ -1,7 +1,7 @@ module Rails module Generators class ControllerGenerator < NamedBase - argument :actions, :type => :array, :default => DEFAULTS[:actions], :banner => "action action" + argument :actions, :type => :array, :default => [], :banner => "action action" check_class_collision :suffix => "Controller" def create_controller_files diff --git a/railties/lib/generators/rails/plugin/plugin_generator.rb b/railties/lib/generators/rails/plugin/plugin_generator.rb index ec563be805..9eaf902021 100644 --- a/railties/lib/generators/rails/plugin/plugin_generator.rb +++ b/railties/lib/generators/rails/plugin/plugin_generator.rb @@ -1,51 +1,44 @@ module Rails module Generators class PluginGenerator < NamedBase - class_option :with_tasks, :type => :boolean, :aliases => "-r", :default => false, - :desc => "When supplied creates tasks base files." + class_option :tasks, :type => :boolean, :aliases => "-t", :default => false, + :desc => "When supplied creates tasks base files." - class_option :with_generator, :type => :boolean, :aliases => "-g", :default => false, - :desc => "When supplied creates generator base files." + class_option :generator, :type => :boolean, :aliases => "-g", :default => false, + :desc => "When supplied creates generator base files." check_class_collision - def create_root - self.root = File.expand_path("vendor/plugins/#{file_name}", root) - empty_directory '.' if behavior == :invoke - FileUtils.cd(root) - end - def create_root_files - %w(README MIT-LICENSE Rakefile init.rb install.rb uninstall.rb).each do |file| - template file - end + directory '.', plugin_dir, false # non-recursive end def create_lib_files - directory 'lib' + directory 'lib', plugin_dir('lib'), false # non-recursive end hook_for :test_framework def create_tasks_files - return unless options[:with_tasks] - directory 'tasks' + return unless options[:tasks] + directory 'tasks', plugin_dir('tasks') end def create_generator_files - return unless options[:with_generator] - directory 'generators' + return unless options[:generator] + directory 'generators', plugin_dir('generators') end - # Work around for generator to work on revoke. If we remove the root - # folder at the beginning, it will raise an error since FileUtils.cd - # will move to a non-existent folder. - # - def remove_on_revoke - return unless behavior == :revoke - FileUtils.cd("../../..") - empty_directory "vendor/plugins/#{file_name}" - end + protected + + def plugin_dir(join=nil) + if join + File.join(plugin_dir, join) + else + "vendor/plugins/#{file_name}" + end + end + end end end diff --git a/railties/lib/generators/rails/resource/resource_generator.rb b/railties/lib/generators/rails/resource/resource_generator.rb index 8ff6d820f2..70babc0550 100644 --- a/railties/lib/generators/rails/resource/resource_generator.rb +++ b/railties/lib/generators/rails/resource/resource_generator.rb @@ -7,7 +7,7 @@ module Rails base.invoke controller, [ base.name.pluralize, base.options[:actions] ] end - class_option :actions, :type => :array, :banner => "ACTION ACTION", + class_option :actions, :type => :array, :banner => "ACTION ACTION", :default => [], :desc => "Actions for the resource controller" class_option :singleton, :type => :boolean, :desc => "Supply to create a singleton controller" diff --git a/railties/lib/generators/test_unit/plugin/plugin_generator.rb b/railties/lib/generators/test_unit/plugin/plugin_generator.rb index 293342c5d8..fd8c4cb413 100644 --- a/railties/lib/generators/test_unit/plugin/plugin_generator.rb +++ b/railties/lib/generators/test_unit/plugin/plugin_generator.rb @@ -6,7 +6,7 @@ module TestUnit check_class_collision :suffix => "Test" def create_test_files - directory 'test' + directory 'test', "vendor/plugins/#{file_name}/test" end end end diff --git a/railties/test/generators/controller_generator_test.rb b/railties/test/generators/controller_generator_test.rb index e3fe2594b9..29169f225b 100644 --- a/railties/test/generators/controller_generator_test.rb +++ b/railties/test/generators/controller_generator_test.rb @@ -1,12 +1,6 @@ require 'abstract_unit' require 'generators/generators_test_helper' -require 'generators/erb/controller/controller_generator' require 'generators/rails/controller/controller_generator' -require 'generators/rails/helper/helper_generator' -require 'generators/test_unit/controller/controller_generator' -require 'generators/test_unit/helper/helper_generator' - -ObjectController = Class.new class ControllerGeneratorTest < GeneratorsTestCase @@ -21,8 +15,11 @@ class ControllerGeneratorTest < GeneratorsTestCase end def test_check_class_collision + Object.send :const_set, :ObjectController, Class.new content = capture(:stderr){ run_generator ["object"] } assert_match /The name 'ObjectController' is either already used in your application or reserved/, content + ensure + Object.send :remove_const, :ObjectController end # No need to spec content since it's already spec'ed on helper generator. diff --git a/railties/test/generators/generators_test_helper.rb b/railties/test/generators/generators_test_helper.rb index 578753e070..782118aeb0 100644 --- a/railties/test/generators/generators_test_helper.rb +++ b/railties/test/generators/generators_test_helper.rb @@ -1,5 +1,6 @@ require 'test/unit' require 'fileutils' +require 'mocha' $LOAD_PATH.unshift "#{File.dirname(__FILE__)}/../../lib" require 'generators' diff --git a/railties/test/generators/helper_generator_test.rb b/railties/test/generators/helper_generator_test.rb index 41e1e1dce2..3b240a96c5 100644 --- a/railties/test/generators/helper_generator_test.rb +++ b/railties/test/generators/helper_generator_test.rb @@ -1,7 +1,6 @@ require 'abstract_unit' require 'generators/generators_test_helper' require 'generators/rails/helper/helper_generator' -require 'generators/test_unit/helper/helper_generator' ObjectHelper = Class.new AnotherObjectHelperTest = Class.new diff --git a/railties/test/generators/mailer_generator_test.rb b/railties/test/generators/mailer_generator_test.rb index 5d21da3dd1..8532667d15 100644 --- a/railties/test/generators/mailer_generator_test.rb +++ b/railties/test/generators/mailer_generator_test.rb @@ -1,8 +1,6 @@ require 'abstract_unit' require 'generators/generators_test_helper' -require 'generators/erb/mailer/mailer_generator' require 'generators/rails/mailer/mailer_generator' -require 'generators/test_unit/mailer/mailer_generator' class MailerGeneratorTest < GeneratorsTestCase diff --git a/railties/test/generators/migration_generator_test.rb b/railties/test/generators/migration_generator_test.rb index 547ca6a9e3..e756d0a9fa 100644 --- a/railties/test/generators/migration_generator_test.rb +++ b/railties/test/generators/migration_generator_test.rb @@ -1,6 +1,5 @@ require 'abstract_unit' require 'generators/generators_test_helper' -require 'generators/active_record/migration/migration_generator' require 'generators/rails/migration/migration_generator' class MigrationGeneratorTest < GeneratorsTestCase diff --git a/railties/test/generators/model_generator_test.rb b/railties/test/generators/model_generator_test.rb index c0768bba7b..d076244abd 100644 --- a/railties/test/generators/model_generator_test.rb +++ b/railties/test/generators/model_generator_test.rb @@ -1,8 +1,6 @@ require 'abstract_unit' require 'generators/generators_test_helper' -require 'generators/active_record/model/model_generator' require 'generators/rails/model/model_generator' -require 'generators/test_unit/model/model_generator' class ModelGeneratorTest < GeneratorsTestCase diff --git a/railties/test/generators/observer_generator_test.rb b/railties/test/generators/observer_generator_test.rb index 3707b70c7e..d97486d957 100644 --- a/railties/test/generators/observer_generator_test.rb +++ b/railties/test/generators/observer_generator_test.rb @@ -1,8 +1,6 @@ require 'abstract_unit' require 'generators/generators_test_helper' -require 'generators/active_record/observer/observer_generator' require 'generators/rails/observer/observer_generator' -require 'generators/test_unit/observer/observer_generator' class ObserverGeneratorTest < GeneratorsTestCase diff --git a/railties/test/generators/plugin_generator_test.rb b/railties/test/generators/plugin_generator_test.rb index f9adf6ea14..b9f09d5163 100644 --- a/railties/test/generators/plugin_generator_test.rb +++ b/railties/test/generators/plugin_generator_test.rb @@ -1,7 +1,6 @@ require 'abstract_unit' require 'generators/generators_test_helper' require 'generators/rails/plugin/plugin_generator' -require 'generators/test_unit/plugin/plugin_generator' class PluginGeneratorTest < GeneratorsTestCase @@ -32,12 +31,12 @@ class PluginGeneratorTest < GeneratorsTestCase end def test_creates_tasks_if_required - run_generator ["plugin_fu", "--with-tasks"] + run_generator ["plugin_fu", "--tasks"] assert_file "vendor/plugins/plugin_fu/tasks/plugin_fu_tasks.rake" end def test_creates_generator_if_required - run_generator ["plugin_fu", "--with-generator"] + run_generator ["plugin_fu", "--generator"] assert_file "vendor/plugins/plugin_fu/generators/plugin_fu/templates" flag = /class PluginFuGenerator < Rails::Generators::NamedBase/ diff --git a/railties/test/generators/resource_generator_test.rb b/railties/test/generators/resource_generator_test.rb index a4cbb1894e..7b03ca31ec 100644 --- a/railties/test/generators/resource_generator_test.rb +++ b/railties/test/generators/resource_generator_test.rb @@ -2,18 +2,6 @@ require 'abstract_unit' require 'generators/generators_test_helper' require 'generators/rails/resource/resource_generator' -# Model -require 'generators/active_record/model/model_generator' -require 'generators/rails/model/model_generator' -require 'generators/test_unit/model/model_generator' - -# Controller -require 'generators/erb/controller/controller_generator' -require 'generators/rails/controller/controller_generator' -require 'generators/rails/helper/helper_generator' -require 'generators/test_unit/controller/controller_generator' -require 'generators/test_unit/helper/helper_generator' - class ResourceGeneratorTest < GeneratorsTestCase def setup diff --git a/railties/test/generators/scaffold_controller_generator_test.rb b/railties/test/generators/scaffold_controller_generator_test.rb index 60c1145310..46b37d0cde 100644 --- a/railties/test/generators/scaffold_controller_generator_test.rb +++ b/railties/test/generators/scaffold_controller_generator_test.rb @@ -1,11 +1,6 @@ require 'abstract_unit' require 'generators/generators_test_helper' -require 'generators/active_record' -require 'generators/erb/scaffold/scaffold_generator' -require 'generators/rails/helper/helper_generator' require 'generators/rails/scaffold_controller/scaffold_controller_generator' -require 'generators/test_unit/scaffold/scaffold_generator' -require 'generators/test_unit/helper/helper_generator' class ScaffoldControllerGeneratorTest < GeneratorsTestCase diff --git a/railties/test/generators/scaffold_generator_test.rb b/railties/test/generators/scaffold_generator_test.rb index dfa11fd84b..2e5d4b609e 100644 --- a/railties/test/generators/scaffold_generator_test.rb +++ b/railties/test/generators/scaffold_generator_test.rb @@ -1,20 +1,6 @@ require 'abstract_unit' require 'generators/generators_test_helper' -require 'generators/active_record' require 'generators/rails/scaffold/scaffold_generator' -require 'generators/rails/stylesheets/stylesheets_generator' - -# Model -require 'generators/active_record/model/model_generator' -require 'generators/rails/model/model_generator' -require 'generators/test_unit/model/model_generator' - -# Controller -require 'generators/erb/scaffold/scaffold_generator' -require 'generators/rails/scaffold_controller/scaffold_controller_generator' -require 'generators/rails/helper/helper_generator' -require 'generators/test_unit/scaffold/scaffold_generator' -require 'generators/test_unit/helper/helper_generator' class ScaffoldGeneratorTest < GeneratorsTestCase diff --git a/railties/test/generators/session_migration_generator_test.rb b/railties/test/generators/session_migration_generator_test.rb index 05b51b1566..7eefbe51e6 100644 --- a/railties/test/generators/session_migration_generator_test.rb +++ b/railties/test/generators/session_migration_generator_test.rb @@ -1,6 +1,5 @@ require 'abstract_unit' require 'generators/generators_test_helper' -require 'generators/active_record/session_migration/session_migration_generator' require 'generators/rails/session_migration/session_migration_generator' class SessionMigrationGeneratorTest < GeneratorsTestCase |