1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

More code refactoring.

This commit is contained in:
José Valim 2009-06-25 15:45:15 +02:00
parent d5bdf31d89
commit 0bb95968db
7 changed files with 53 additions and 35 deletions

View file

@ -2,6 +2,11 @@ require 'generators/actions'
module Rails
module Generators
DEFAULTS = {
:test_framework => 'test_unit',
:template_engine => 'erb'
}
class Error < Thor::Error
end
@ -113,39 +118,29 @@ module Rails
end
end
# Small macro to add test_framework option and invoke it.
# Invoke a generator based on the given name. If a class option does not
# exist for the current name, it's created.
#
def self.add_and_invoke_test_framework_option!
class_option :test_framework, :type => :string, :aliases => "-t", :default => "test_unit",
:desc => "Test framework to be invoked by this generator", :banner => "NAME"
define_method :invoke_test_framework do
return unless options[:test_framework]
name = "#{options[:test_framework]}:generators:#{self.class.generator_name}"
begin
invoke name
rescue Thor::UndefinedTaskError
say "Could not find and invoke '#{name}'."
def self.invoke_for(*names)
names.each do |name|
unless class_options[name]
aliases = "-" + name.to_s.gsub(/_framework$/, '').split('_').last[0,1]
class_option name, :type => :string, :default => DEFAULTS[name], :banner => "NAME", :aliases => aliases,
:desc => "#{name.to_s.humanize} to be used"
end
end
end
# Small macro to add template engine option and invoke it.
#
def self.add_and_invoke_template_engine_option!
class_option :template_engine, :type => :string, :aliases => "-e", :default => "erb",
:desc => "Template engine to be invoked by this generator", :banner => "NAME"
class_eval <<-METHOD, __FILE__, __LINE__
def invoke_#{name}
return unless options[#{name.inspect}]
task = "\#{options[#{name.inspect}]}:generators:\#{self.class.generator_name}"
define_method :invoke_template_engine do
return unless options[:template_engine]
name = "#{options[:template_engine]}:generators:#{self.class.generator_name}"
begin
invoke name
rescue Thor::UndefinedTaskError
say "Could not find and invoke '#{name}'."
end
begin
invoke task
rescue Thor::UndefinedTaskError
say "Could not find and invoke '\#{task}'."
end
end
METHOD
end
end

View file

@ -1,3 +1,3 @@
<%= class_name %>#<%= @action %>
Find me in <%= @path %>
Find me in app/views/<%= @path %>

View file

@ -11,8 +11,7 @@ module Rails
template "mailer.rb", File.join('app/models', class_path, "#{file_name}.rb")
end
add_and_invoke_template_engine_option!
add_and_invoke_test_framework_option!
invoke_for :template_engine, :test_framework
end
end
end

View file

@ -9,7 +9,7 @@ module Rails
template 'observer.rb', File.join('app/models', class_path, "#{file_name}_observer.rb")
end
add_and_invoke_test_framework_option!
invoke_for :test_framework
end
end
end

View file

@ -27,7 +27,7 @@ module Rails
directory 'lib'
end
add_and_invoke_test_framework_option!
invoke_for :test_framework
def create_tasks_files
return unless options[:with_tasks]

View file

@ -1,3 +1,3 @@
<%= class_name %>#<%= @action %>
Find me in <%= @path %>
Find me in app/views/<%= @path %>

View file

@ -4,6 +4,16 @@ require 'generators/rails/app/app_generator'
class AppGeneratorTest < GeneratorsTestCase
def setup
super
Rails::Generators::AppGenerator.instance_variable_set('@desc', nil)
end
def teardown
super
Rails::Generators::AppGenerator.instance_variable_set('@desc', nil)
end
def test_application_skeleton_is_created
run_generator
@ -120,6 +130,20 @@ class AppGeneratorTest < GeneratorsTestCase
assert_match /It works!/, silence(:stdout){ generator.invoke(:all) }
end
def test_usage_read_from_file
File.expects(:read).returns("USAGE FROM FILE")
assert_equal "USAGE FROM FILE", Rails::Generators::AppGenerator.desc
end
def test_default_usage
File.expects(:exist?).returns(false)
assert_match /Create rails files for app generator/, Rails::Generators::AppGenerator.desc
end
def test_default_namespace
assert_match "rails:generators:app", Rails::Generators::AppGenerator.namespace
end
protected
def run_generator(args=[])