aboutsummaryrefslogtreecommitdiffstats
path: root/railties/lib/generators
diff options
context:
space:
mode:
authorJosé Valim <jose.valim@gmail.com>2009-06-26 20:24:52 +0200
committerJosé Valim <jose.valim@gmail.com>2009-06-26 20:24:52 +0200
commit54208cbe60492d3ee8e8daf156eebc818a617181 (patch)
treeaa8ba504f257c85d1a2e01236f0bddca6515bf63 /railties/lib/generators
parente981aeb57633148b02a96db13d2c63bc84c4555f (diff)
downloadrails-54208cbe60492d3ee8e8daf156eebc818a617181.tar.gz
rails-54208cbe60492d3ee8e8daf156eebc818a617181.tar.bz2
rails-54208cbe60492d3ee8e8daf156eebc818a617181.zip
Added invoke_if and make use of it on controller generators.
Diffstat (limited to 'railties/lib/generators')
-rw-r--r--railties/lib/generators/base.rb82
-rw-r--r--railties/lib/generators/rails/controller/controller_generator.rb5
2 files changed, 74 insertions, 13 deletions
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