From 95a5cc6167ce8ff57d90190d3e21f49abb1eb060 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Valim?= Date: Fri, 26 Jun 2009 20:26:10 +0200 Subject: [PATCH] Add invoke_iff and invoke_for to the public interface. --- railties/lib/generators/base.rb | 222 ++++++++++++++++---------------- 1 file changed, 111 insertions(+), 111 deletions(-) diff --git a/railties/lib/generators/base.rb b/railties/lib/generators/base.rb index cfb7e0481c..10bd1ea4af 100644 --- a/railties/lib/generators/base.rb +++ b/railties/lib/generators/base.rb @@ -44,6 +44,117 @@ def self.namespace(name=nil) @namespace ||= "#{base_name}:generators:#{generator_name}" end + # 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, :aliases => "-t" + # end + # + # The example above will create a test framework option and will invoke + # a generator based on the user supplied value. + # + # For example, if the user invoke the controller generator as: + # + # ruby script/generate controller Account --test-framework=test_unit + # + # The controller generator will then invoke "test_unit:generators:controller". + # If it can't be found it then tries to invoke only "test_unit". + # + # 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| + 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} + return unless options[#{name.inspect}] + + klass = Rails::Generators.find_by_namespace(options[#{name.inspect}], + nil, self.class.generator_name) + + if klass + invoke klass + else + task = "\#{options[#{name.inspect}]}:generators:\#{self.class.generator_name}" + say "Could not find and invoke '\#{task}'." + end + end + METHOD + 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 + protected # Check whether the given class names are already taken by user @@ -118,117 +229,6 @@ def self.add_shebang_option! end end - # 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, :aliases => "-t" - # end - # - # The example above will create a test framework option and will invoke - # a generator based on the user supplied value. - # - # For example, if the user invoke the controller generator as: - # - # ruby script/generate controller Account --test-framework=test_unit - # - # The controller generator will then invoke "test_unit:generators:controller". - # If it can't be found it then tries to invoke only "test_unit". - # - # 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| - 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} - return unless options[#{name.inspect}] - - klass = Rails::Generators.find_by_namespace(options[#{name.inspect}], - nil, self.class.generator_name) - - if klass - invoke klass - else - task = "\#{options[#{name.inspect}]}:generators:\#{self.class.generator_name}" - say "Could not find and invoke '\#{task}'." - end - end - METHOD - 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 -- GitLab