aboutsummaryrefslogtreecommitdiffstats
path: root/railties
diff options
context:
space:
mode:
Diffstat (limited to 'railties')
-rw-r--r--railties/lib/generators/base.rb1
-rw-r--r--railties/lib/generators/erb/scaffold/scaffold_generator.rb5
-rw-r--r--railties/lib/generators/erb/scaffold/templates/show.html.erb4
-rw-r--r--railties/lib/generators/rails/scaffold/scaffold_generator.rb2
-rw-r--r--railties/lib/generators/rails/scaffold_controller/scaffold_controller_generator.rb16
-rw-r--r--railties/lib/generators/test_unit/scaffold/scaffold_generator.rb2
-rw-r--r--railties/lib/generators/test_unit/scaffold/templates/functional_test.rb2
-rw-r--r--railties/test/generators/generators_test_helper.rb4
-rw-r--r--railties/test/generators/scaffold_controller_generator_test.rb117
9 files changed, 141 insertions, 12 deletions
diff --git a/railties/lib/generators/base.rb b/railties/lib/generators/base.rb
index 769311b6c1..81f6c7b343 100644
--- a/railties/lib/generators/base.rb
+++ b/railties/lib/generators/base.rb
@@ -7,6 +7,7 @@ module Rails
:fixture => true,
:force_plural => false,
:helper => true,
+ :layout => true,
:migration => true,
:orm => 'active_record',
:resource_controller => 'controller',
diff --git a/railties/lib/generators/erb/scaffold/scaffold_generator.rb b/railties/lib/generators/erb/scaffold/scaffold_generator.rb
index c8723785f4..ad40fe47ae 100644
--- a/railties/lib/generators/erb/scaffold/scaffold_generator.rb
+++ b/railties/lib/generators/erb/scaffold/scaffold_generator.rb
@@ -6,9 +6,10 @@ module Erb
include Rails::Generators::ControllerNamedBase
argument :attributes, :type => :hash, :default => {}, :banner => "field:type field:type"
+
class_option :singleton, :type => :boolean, :desc => "Supply to skip index action"
+ class_option :layout, :type => :boolean
- # TODO Spec me
def copy_index_file
return if options[:singleton]
copy_view :index
@@ -26,8 +27,8 @@ module Erb
copy_view :new
end
- # TODO invoke_if?
def copy_layout_file
+ return unless options[:layout]
template "layout.html.erb",
File.join("app/views/layouts", controller_class_path, "#{controller_file_name}.html.erb")
end
diff --git a/railties/lib/generators/erb/scaffold/templates/show.html.erb b/railties/lib/generators/erb/scaffold/templates/show.html.erb
index adecaf70c6..25567957be 100644
--- a/railties/lib/generators/erb/scaffold/templates/show.html.erb
+++ b/railties/lib/generators/erb/scaffold/templates/show.html.erb
@@ -1,10 +1,10 @@
<% for attribute in attributes -%>
<p>
- <b><%= attribute.column.human_name %>:</b>
+ <b><%= attribute.human_name %>:</b>
<%%=h @<%= singular_name %>.<%= attribute.name %> %>
</p>
<% end -%>
<%%= link_to 'Edit', edit_<%= singular_name %>_path(@<%= singular_name %>) %> |
-<%%= link_to 'Back', <%= plural_name %>_path %> \ No newline at end of file
+<%%= link_to 'Back', <%= plural_name %>_path %>
diff --git a/railties/lib/generators/rails/scaffold/scaffold_generator.rb b/railties/lib/generators/rails/scaffold/scaffold_generator.rb
index be86de7572..0bfbed42a0 100644
--- a/railties/lib/generators/rails/scaffold/scaffold_generator.rb
+++ b/railties/lib/generators/rails/scaffold/scaffold_generator.rb
@@ -3,8 +3,6 @@ require 'generators/rails/resource/resource_generator'
module Rails
module Generators
class ScaffoldGenerator < ResourceGenerator #metagenerator
- class_option :test_framework, :banner => "NAME", :desc => "Test framework to be invoked"
-
remove_hook_for :actions, :resource_controller
hook_for :scaffold_controller, :required => true
diff --git a/railties/lib/generators/rails/scaffold_controller/scaffold_controller_generator.rb b/railties/lib/generators/rails/scaffold_controller/scaffold_controller_generator.rb
index 7fbbf90105..e73c139e96 100644
--- a/railties/lib/generators/rails/scaffold_controller/scaffold_controller_generator.rb
+++ b/railties/lib/generators/rails/scaffold_controller/scaffold_controller_generator.rb
@@ -4,11 +4,14 @@ module Rails
include ControllerNamedBase
check_class_collision :suffix => "Controller"
- class_option :orm, :desc => "ORM to generate the controller for", :banner => "NAME", :type => :string
- class_option :singleton, :type => :boolean, :desc => "Supply to create a singleton controller" # TODO Spec me
+
+ class_option :orm, :banner => "NAME", :type => :string, :required => true,
+ :desc => "ORM to generate the controller for"
+
+ class_option :singleton, :type => :boolean, :desc => "Supply to create a singleton controller"
def create_controller_files
- template 'controller.rb', File.join('app/controllers', class_path, "#{file_name}_controller.rb")
+ template 'controller.rb', File.join('app/controllers', class_path, "#{controller_file_name}_controller.rb")
end
hook_for :template_engine, :test_framework, :as => :scaffold
@@ -22,7 +25,12 @@ module Rails
protected
def orm_class
- @orm_class ||= "#{options[:orm].to_s.classify}::Generators::ActionORM".constantize
+ @orm_class ||= begin
+ action_orm = "#{options[:orm].to_s.classify}::Generators::ActionORM"
+ action_orm.constantize
+ rescue NameError => e
+ raise Error, "Could not load #{action_orm}, skipping controller. Error: #{e.message}."
+ end
end
def orm_instance
diff --git a/railties/lib/generators/test_unit/scaffold/scaffold_generator.rb b/railties/lib/generators/test_unit/scaffold/scaffold_generator.rb
index 7c73a23267..0f6255383e 100644
--- a/railties/lib/generators/test_unit/scaffold/scaffold_generator.rb
+++ b/railties/lib/generators/test_unit/scaffold/scaffold_generator.rb
@@ -4,6 +4,8 @@ module TestUnit
module Generators
class ScaffoldGenerator < Base
include Rails::Generators::ControllerNamedBase
+
+ class_option :singleton, :type => :boolean, :desc => "Supply to create a singleton controller"
check_class_collision :suffix => "ControllerTest"
def create_test_files
diff --git a/railties/lib/generators/test_unit/scaffold/templates/functional_test.rb b/railties/lib/generators/test_unit/scaffold/templates/functional_test.rb
index cd2fc578bf..e4bf4035da 100644
--- a/railties/lib/generators/test_unit/scaffold/templates/functional_test.rb
+++ b/railties/lib/generators/test_unit/scaffold/templates/functional_test.rb
@@ -1,11 +1,13 @@
require 'test_helper'
class <%= controller_class_name %>ControllerTest < ActionController::TestCase
+<% unless options[:singleton] -%>
test "should get index" do
get :index
assert_response :success
assert_not_nil assigns(:<%= table_name %>)
end
+<% end -%>
test "should get new" do
get :new
diff --git a/railties/test/generators/generators_test_helper.rb b/railties/test/generators/generators_test_helper.rb
index 591da45c72..578753e070 100644
--- a/railties/test/generators/generators_test_helper.rb
+++ b/railties/test/generators/generators_test_helper.rb
@@ -72,8 +72,8 @@ class GeneratorsTestCase < Test::Unit::TestCase
end
def assert_instance_method(content, method)
- assert_match /def #{method}(.*?)end/m, content
- yield content.match(/def #{method}(.*?)end/m)[1] if block_given?
+ assert content =~ /def #{method}(\(.+\))?(.*?)\n end/m, "Expected to have method #{method}"
+ yield $2.strip if block_given?
end
protected
diff --git a/railties/test/generators/scaffold_controller_generator_test.rb b/railties/test/generators/scaffold_controller_generator_test.rb
new file mode 100644
index 0000000000..60c1145310
--- /dev/null
+++ b/railties/test/generators/scaffold_controller_generator_test.rb
@@ -0,0 +1,117 @@
+require 'abstract_unit'
+require 'generators/generators_test_helper'
+require 'generators/active_record'
+require 'generators/erb/scaffold/scaffold_generator'
+require 'generators/rails/helper/helper_generator'
+require 'generators/rails/scaffold_controller/scaffold_controller_generator'
+require 'generators/test_unit/scaffold/scaffold_generator'
+require 'generators/test_unit/helper/helper_generator'
+
+class ScaffoldControllerGeneratorTest < GeneratorsTestCase
+
+ def test_controller_skeleton_is_created
+ run_generator
+
+ assert_file "app/controllers/users_controller.rb" do |content|
+ assert_match /class UsersController < ApplicationController/, content
+
+ assert_instance_method content, :index do |m|
+ assert_match /@users = User\.all/, m
+ end
+
+ assert_instance_method content, :show do |m|
+ assert_match /@user = User\.find\(params\[:id\]\)/, m
+ end
+
+ assert_instance_method content, :new do |m|
+ assert_match /@user = User\.new/, m
+ end
+
+ assert_instance_method content, :edit do |m|
+ assert_match /@user = User\.find\(params\[:id\]\)/, m
+ end
+
+ assert_instance_method content, :create do |m|
+ assert_match /@user = User\.new\(params\[:user\]\)/, m
+ assert_match /@user\.save/, m
+ assert_match /@user\.errors/, m
+ end
+
+ assert_instance_method content, :update do |m|
+ assert_match /@user = User\.find\(params\[:id\]\)/, m
+ assert_match /@user\.update_attributes\(params\[:user\]\)/, m
+ assert_match /@user\.errors/, m
+ end
+
+ assert_instance_method content, :destroy do |m|
+ assert_match /@user = User\.find\(params\[:id\]\)/, m
+ assert_match /@user\.destroy/, m
+ end
+ end
+ end
+
+ def test_helper_are_invoked_with_a_pluralized_name
+ run_generator
+ assert_file "app/helpers/users_helper.rb", /module UsersHelper/
+ assert_file "test/unit/helpers/users_helper_test.rb", /class UsersHelperTest < ActionView::TestCase/
+ end
+
+ def test_views_are_generated
+ run_generator
+
+ %w(
+ index
+ edit
+ new
+ show
+ ).each { |view| assert_file "app/views/users/#{view}.html.erb" }
+ assert_file "app/views/layouts/users.html.erb"
+ end
+
+ def test_functional_tests
+ run_generator
+
+ assert_file "test/functional/users_controller_test.rb" do |content|
+ assert_match /class UsersControllerTest < ActionController::TestCase/, content
+ assert_match /test "should get index"/, content
+ end
+ end
+
+ def test_generates_singleton_controller
+ run_generator ["User", "name:string", "age:integer", "--singleton"]
+
+ assert_file "app/controllers/users_controller.rb" do |content|
+ assert_no_match /def index/, content
+ end
+
+ assert_file "test/functional/users_controller_test.rb" do |content|
+ assert_no_match /test "should get index"/, content
+ end
+
+ assert_no_file "app/views/users/index.html.erb"
+ end
+
+ def test_skip_helper_if_required
+ run_generator ["User", "name:string", "age:integer", "--no-helper"]
+ assert_no_file "app/helpers/users_helper.rb"
+ assert_no_file "test/unit/helpers/users_helper_test.rb"
+ end
+
+ def test_skip_layout_if_required
+ run_generator ["User", "name:string", "age:integer", "--no-layout"]
+ assert_no_file "app/views/layouts/users.html.erb"
+ end
+
+ def test_error_is_shown_if_orm_does_not_provide_interface
+ error = capture(:stderr){ run_generator ["User", "--orm=unknown"] }
+ assert_equal "Could not load Unknown::Generators::ActionORM, skipping controller. " <<
+ "Error: uninitialized constant Unknown.\n", error
+ end
+
+ protected
+
+ def run_generator(args=["User", "name:string", "age:integer"])
+ silence(:stdout) { Rails::Generators::ScaffoldControllerGenerator.start args, :root => destination_root }
+ end
+
+end