diff options
| author | José Valim <jose.valim@gmail.com> | 2009-06-26 20:24:52 +0200 | 
|---|---|---|
| committer | José Valim <jose.valim@gmail.com> | 2009-06-26 20:24:52 +0200 | 
| commit | 54208cbe60492d3ee8e8daf156eebc818a617181 (patch) | |
| tree | aa8ba504f257c85d1a2e01236f0bddca6515bf63 | |
| parent | e981aeb57633148b02a96db13d2c63bc84c4555f (diff) | |
| download | rails-54208cbe60492d3ee8e8daf156eebc818a617181.tar.gz rails-54208cbe60492d3ee8e8daf156eebc818a617181.tar.bz2 rails-54208cbe60492d3ee8e8daf156eebc818a617181.zip  | |
Added invoke_if and make use of it on controller generators.
| -rw-r--r-- | railties/lib/generators.rb | 3 | ||||
| -rw-r--r-- | railties/lib/generators/base.rb | 82 | ||||
| -rw-r--r-- | railties/lib/generators/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  | 
