diff options
Diffstat (limited to 'railties')
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 |