From 54208cbe60492d3ee8e8daf156eebc818a617181 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Fri, 26 Jun 2009 20:24:52 +0200 Subject: [PATCH] Added invoke_if and make use of it on controller generators. --- railties/lib/generators.rb | 3 +- railties/lib/generators/base.rb | 82 +++++++++++++++++-- .../rails/controller/controller_generator.rb | 5 +- 3 files changed, 76 insertions(+), 14 deletions(-) diff --git a/railties/lib/generators.rb b/railties/lib/generators.rb index 4cc18e26cf..f094a1f062 100644 --- a/railties/lib/generators.rb +++ b/railties/lib/generators.rb @@ -45,7 +45,8 @@ module Rails # "test_unit:generators:model", "test_unit:model" # def self.find_by_namespace(name, base=nil, context=nil) - attempts = [ ] + 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 diff --git a/railties/lib/generators/base.rb b/railties/lib/generators/base.rb index 0eca5ec008..cfb7e0481c 100644 --- a/railties/lib/generators/base.rb +++ b/railties/lib/generators/base.rb @@ -4,7 +4,8 @@ module Rails module Generators DEFAULTS = { :test_framework => 'test_unit', - :template_engine => 'erb' + :template_engine => 'erb', + :helper => true } class Error < Thor::Error @@ -117,13 +118,15 @@ module Rails end end - # Invoke a generator based on the given name. If a class option does not - # exist for the current name, one created. + # Invoke a generator based on the value supplied by the user to the + # given option named "name". A class option is created when this method + # is invoked and you can set a hash to customize it, although type and + # default values cannot be given. # # ==== Examples # # class ControllerGenerator < Rails::Generators::Base - # invoke_for :test_framework + # invoke_for :test_framework, :aliases => "-t" # end # # The example above will create a test framework option and will invoke @@ -139,13 +142,24 @@ module Rails # This allows any test framework to hook into Rails as long as it # provides a "test_framework:generators:controller" generator. # + # Finally, if the user don't want to use any test framework, he can do: + # + # ruby script/generate controller Account --skip-test-framework + # + # Or similarly: + # + # ruby script/generate controller Account --no-test-framework + # def self.invoke_for(*names) + default_options = names.extract_options! + names.each do |name| - unless class_options[name] - aliases = "-" + name.to_s.gsub(/_framework$/, '').split('_').last[0,1] - class_option name, :type => :default, :default => DEFAULTS[name], :banner => "NAME", :aliases => aliases, - :desc => "#{name.to_s.humanize} to be used" - end + options = default_options.dup + options[:desc] ||= "#{name.to_s.humanize} to be used" + options[:banner] ||= "NAME" + options[:aliases] ||= "-" + name.to_s.gsub(/_framework$/, '').split('_').last[0,1] + + class_option name, options.merge!(:type => :default, :default => DEFAULTS[name]) class_eval <<-METHOD, __FILE__, __LINE__ def invoke_#{name} @@ -165,6 +179,56 @@ module Rails end end + # Invoke a generator with the given name if the user requires it. The + # difference to invoke_for is that the class option here is boolean + # and the generator invoked is not based on user input. + # + # A class option is created when this method is invoked and you can set + # a hash to customize it, although type and default values cannot be + # given. + # + # ==== Examples + # + # class ControllerGenerator < Rails::Generators::Base + # invoke_if :webrat, :aliases => "-w" + # end + # + # The example above will create a helper option and will be invoked + # when the user requires so: + # + # ruby script/generate controller Account --webrat + # + # The controller generator will then try to invoke the following generators: + # + # "rails:generators:webrat", "webrat:generators:controller", "webrat" + # + def self.invoke_if(*names) + default_options = names.extract_options! + + names.each do |name| + options = default_options.dup + options[:desc] ||= "Indicates when to use #{name.to_s.humanize}" + options[:aliases] ||= "-" + name.to_s.last[0,1] + + class_option name, options.merge!(:type => :boolean, :default => DEFAULTS[name] || false) + + class_eval <<-METHOD, __FILE__, __LINE__ + def invoke_#{name} + return unless options[#{name.inspect}] + + klass = Rails::Generators.find_by_namespace(#{name.inspect}, + self.class.base_name, self.class.generator_name) + + if klass + invoke klass + else + say "Could not find and invoke '#{name.inspect}'." + end + end + METHOD + end + end + end end end diff --git a/railties/lib/generators/rails/controller/controller_generator.rb b/railties/lib/generators/rails/controller/controller_generator.rb index b5d875eb38..ea406c96e7 100644 --- a/railties/lib/generators/rails/controller/controller_generator.rb +++ b/railties/lib/generators/rails/controller/controller_generator.rb @@ -9,10 +9,7 @@ module Rails end invoke_for :template_engine, :test_framework - - def invoke_helper - invoke "rails:generators:helper" - end + invoke_if :helper, :aliases => "-v" end end end