Commit 65e6739cafd5dcb864185a5d65345c83c4dc8738

Authored by Dan Croak
1 parent 588faac9

updating SMTP settings to default to Gmail. adding the Coulda plugin.

Showing 29 changed files with 1147 additions and 4 deletions   Show diff stats
.gems
1 1 thoughtbot-clearance --version '>= 0.6.8' --source gems.github.com
2   -RedCloth --version '= 3.0.4'
  2 +RedCloth --version '= 4.1.1'
3 3 mislav-will_paginate --version '~> 2.3.11' --source gems.github.com
4 4  
... ...
config/initializers/mail.rb
  1 +config.action_mailer.delivery_method = :smtp
  2 +
1 3 ActionMailer::Base.smtp_settings = {
2   - :address => "smtp.thoughtbot.com",
3   - :port => 25,
4   - :domain => "thoughtbot.com"
  4 + :tls => true,
  5 + :address => "smtp.gmail.com",
  6 + :port => "587",
  7 + :domain => "heroku.com",
  8 + :authentication => :plain,
  9 + :user_name => "YOUREMAIL",
  10 + :password => "YOURPASSWORD"
5 11 }
6 12  
7 13 DO_NOT_REPLY = "donotreply@example.com"
... ...
vendor/plugins/coulda/CHANGELOG.textile 0 → 100644
... ... @@ -0,0 +1,9 @@
  1 +h1. March 8, 2009
  2 +
  3 +* Updated functional tests to use shoulda 2.10 should_redirect_to block syntax
  4 +
  5 +h1. March 7, 2009
  6 +
  7 +* Added Paperclip option to model generator
  8 +* Removed comments on model per complaints by thoughtbot
  9 +
... ...
vendor/plugins/coulda/README.textile 0 → 100644
... ... @@ -0,0 +1,145 @@
  1 +h1. Coulda generators
  2 +
  3 +A plugin that overrides Rails' model, controller, & helper generators. It also adds a view generator. It uses Shoulda & Factory Girl for tests.
  4 +
  5 +h2. Requirements
  6 +
  7 +* "Shoulda":http://github.com/thoughtbot/shoulda
  8 +* "Factory Girl":http://github.com/thoughtbot/factory_girl
  9 +
  10 +h2. Installation
  11 +
  12 + $ script/plugin install git://github.com/dancroak/coulda.git
  13 +
  14 +h2. Model generator
  15 +
  16 + $ script/generate model User
  17 +
  18 +* factory (Factory Girl)
  19 +* unit test (Shoulda)
  20 +* migration
  21 +* model
  22 +
  23 +h2. Controller generator
  24 +
  25 + $ script/generate controller Users new
  26 +
  27 +* functional test (Shoulda & Factory Girl), only test RESTful new action
  28 +* controller, only RESTful new action
  29 +* no helper file
  30 +
  31 +h2. Helper generator
  32 +
  33 + $ script/generate helper Navigation
  34 +
  35 +* empty helper test file
  36 +* empty helper module
  37 +
  38 +h2. View generator
  39 +
  40 + $ script/generate view Posts new
  41 +
  42 +* We're not sure we like this one yet. Let us know what you think.
  43 +
  44 +h2. Model generator: belongs_to
  45 +
  46 + $ script/generate model post user:belongs_to
  47 +
  48 +* "add_index" in the migration
  49 +* "belongs_to" in the model
  50 +* "should_belong_to" in unit test
  51 +* association in the factory
  52 +
  53 +<pre><code>class CreatePosts < ActiveRecord::Migration
  54 + def self.up
  55 + create_table :posts do |t|
  56 + t.belongs_to :user
  57 + t.timestamps
  58 + end
  59 +
  60 + add_index :posts, :user_id
  61 + end
  62 +
  63 + def self.down
  64 + remove_index :posts, :user_id
  65 + drop_table :posts
  66 + end
  67 +end
  68 +
  69 +class Post < ActiveRecord::Base
  70 + belongs_to :user
  71 +end
  72 +
  73 +class PostTest < ActiveSupport::TestCase
  74 + should_belong_to :user
  75 + should_have_index :user_id
  76 +end
  77 +
  78 +Factory.define :post do |post|
  79 + post.association(:user)
  80 +end</code></pre>
  81 +
  82 +h2. Model generator: paperclip
  83 +
  84 + $ script/generate model design image:paperclip
  85 +
  86 +* all the necessary columns in the migration
  87 +* "has_attached_file" in the model
  88 +* "should_have_attached_file" in unit test
  89 +
  90 +<pre><code>class CreateDesigns < ActiveRecord::Migration
  91 + def self.up
  92 + create_table :designs do |t|
  93 + t.string :image_file_name
  94 + t.string :image_content_type
  95 + t.integer :image_file_size
  96 + t.datetime :image_updated_at
  97 + t.timestamps
  98 + end
  99 + end
  100 +
  101 + def self.down
  102 + drop_table :designs
  103 + end
  104 +end
  105 +
  106 +class Design < ActiveRecord::Base
  107 + has_attached_file :image
  108 +end
  109 +
  110 +class DesignTest < ActiveSupport::TestCase
  111 + should "be valid with factory" do
  112 + assert_valid Factory.build(:design)
  113 + end
  114 + should_have_attached_file :image
  115 +end</code></pre>
  116 +
  117 +h2. Attribution
  118 +
  119 +"Mike Breen":http://github.com/hardbap and "Dan Croak":http://github.com/dancroak
  120 +
  121 +Inspired by "shoulda_generator":http://github.com/technicalpickles/shoulda_generator, "model_generator_with_factories":http://github.com/vigetlabs/model_generator_with_factories, and "nifty_generators":http://github.com/ryanb/nifty-generators
  122 +
  123 +h2. License
  124 +
  125 +The MIT License
  126 +
  127 +Copyright (c) 2008, 2009 Mike Breen
  128 +
  129 +Permission is hereby granted, free of charge, to any person obtaining a copy
  130 +of this software and associated documentation files (the "Software"), to deal
  131 +in the Software without restriction, including without limitation the rights
  132 +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  133 +copies of the Software, and to permit persons to whom the Software is
  134 +furnished to do so, subject to the following conditions:
  135 +
  136 +The above copyright notice and this permission notice shall be included in
  137 +all copies or substantial portions of the Software.
  138 +
  139 +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  140 +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  141 +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  142 +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  143 +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  144 +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  145 +THE SOFTWARE.
... ...
vendor/plugins/coulda/Rakefile 0 → 100644
... ... @@ -0,0 +1,10 @@
  1 +require 'rake'
  2 +require 'rake/testtask'
  3 +
  4 +require 'cucumber/rake/task'
  5 +Cucumber::Rake::Task.new(:features) do |features|
  6 + features.cucumber_opts = "features --format progress"
  7 +end
  8 +
  9 +task :default => [:features]
  10 +
... ...
vendor/plugins/coulda/features/controller_generator.feature 0 → 100644
... ... @@ -0,0 +1,61 @@
  1 +Feature: Rails controller generator
  2 + In order to better do Test-Driven Development with Rails
  3 + As a user
  4 + I want to generate Shoulda & Factory Girl tests for only RESTful actions I need.
  5 +
  6 + Scenario: Controller generator for index action
  7 + Given a Rails app
  8 + And the coulda plugin is installed
  9 + When I generate a "Posts" controller with "index" action
  10 + Then a standard "index" functional test for "posts" should be generated
  11 + And an empty "index" controller action for "posts" should be generated
  12 + And only a "index" action for RESTful "posts" route should be generated
  13 +
  14 + Scenario: Controller generator for new action
  15 + Given a Rails app
  16 + And the coulda plugin is installed
  17 + When I generate a "Posts" controller with "new" action
  18 + Then a standard "new" functional test for "posts" should be generated
  19 + And a "new" controller action for "posts" should be generated
  20 + And only a "new" action for RESTful "posts" route should be generated
  21 +
  22 + Scenario: Controller generator for create action
  23 + Given a Rails app
  24 + And the coulda plugin is installed
  25 + When I generate a "Posts" controller with "create" action
  26 + Then a standard "create" functional test for "posts" should be generated
  27 + And a "create" controller action for "posts" should be generated
  28 + And only a "create" action for RESTful "posts" route should be generated
  29 +
  30 + Scenario: Controller generator for show action
  31 + Given a Rails app
  32 + And the coulda plugin is installed
  33 + When I generate a "Posts" controller with "show" action
  34 + Then a standard "show" functional test for "posts" should be generated
  35 + And a "show" controller action for "posts" should be generated
  36 + And only a "show" action for RESTful "posts" route should be generated
  37 +
  38 + Scenario: Controller generator for edit action
  39 + Given a Rails app
  40 + And the coulda plugin is installed
  41 + When I generate a "Posts" controller with "edit" action
  42 + Then a standard "edit" functional test for "posts" should be generated
  43 + And a "edit" controller action for "posts" should be generated
  44 + And only a "edit" action for RESTful "posts" route should be generated
  45 +
  46 + Scenario: Controller generator for update action
  47 + Given a Rails app
  48 + And the coulda plugin is installed
  49 + When I generate a "Posts" controller with "update" action
  50 + Then a standard "update" functional test for "posts" should be generated
  51 + And a "update" controller action for "posts" should be generated
  52 + And only a "update" action for RESTful "posts" route should be generated
  53 +
  54 + Scenario: Controller generator for destroy action
  55 + Given a Rails app
  56 + And the coulda plugin is installed
  57 + When I generate a "Posts" controller with "destroy" action
  58 + Then a standard "destroy" functional test for "posts" should be generated
  59 + And a "destroy" controller action for "posts" should be generated
  60 + And only a "destroy" action for RESTful "posts" route should be generated
  61 +
... ...
vendor/plugins/coulda/features/helper_generator.feature 0 → 100644
... ... @@ -0,0 +1,12 @@
  1 +Feature: Rails helper generator
  2 + In order to better do Test-Driven Development with Rails
  3 + As a user
  4 + I want to generate just the module and test I need.
  5 +
  6 + Scenario: Helper
  7 + Given a Rails app
  8 + And the coulda plugin is installed
  9 + When I generate a helper named "Navigation"
  10 + Then a helper should be generated for "Navigation"
  11 + And a helper test should be generated for "Navigation"
  12 +
... ...
vendor/plugins/coulda/features/model_generator.feature 0 → 100644
... ... @@ -0,0 +1,37 @@
  1 +Feature: Rails model generator
  2 + In order to better do Test-Driven Development with Rails
  3 + As a user
  4 + I want to generate a Factory definition and Shoulda tests.
  5 +
  6 + Scenario: Model generator without attributes
  7 + Given a Rails app
  8 + And the coulda plugin is installed
  9 + When I generate a model named "User"
  10 + Then a factory should be generated for "User"
  11 + And a unit test should be generated for "User"
  12 +
  13 + Scenario: Model generator with attributes
  14 + Given a Rails app
  15 + And the coulda plugin is installed
  16 + When I generate a model "User" with a string "email"
  17 + Then a factory for "User" should have an "email" string
  18 + And a unit test should be generated for "User"
  19 +
  20 + Scenario: Model generator with association
  21 + Given a Rails app
  22 + And the coulda plugin is installed
  23 + When I generate a model "Post" that belongs to a "User"
  24 + Then a factory for "Post" should have an association to "User"
  25 + And the "Post" unit test should have "should_belong_to :user" macro
  26 + And the "Post" unit test should have "should_have_db_index :user_id" macro
  27 + And the "posts" table should have db index on "user_id"
  28 + And the "Post" model should have "belongs_to :user" macro
  29 +
  30 + Scenario: Model generator with Paperclip
  31 + Given a Rails app
  32 + And the coulda plugin is installed
  33 + When I generate a model "Design" with file "Image"
  34 + Then the "Design" model should have "has_attached_file :image" macro
  35 + And the "Design" unit test should have "should_have_attached_file :image" macro
  36 + And the "designs" table should have paperclip columns for "image"
  37 +
... ...
vendor/plugins/coulda/features/step_definitions/controller_steps.rb 0 → 100644
... ... @@ -0,0 +1,189 @@
  1 +When /^I generate a "(.*)" controller with "(.*)" action$/ do |controller, action|
  2 + system "cd #{@rails_root} && " <<
  3 + "script/generate controller #{controller} #{action} && " <<
  4 + "cd .."
  5 +end
  6 +
  7 +Then /^a standard "index" functional test for "posts" should be generated$/ do
  8 + assert_generated_functional_test_for("posts") do |body|
  9 + expected = " context 'GET to index' do\n" <<
  10 + " setup { get :index }\n\n" <<
  11 + " should_render_template :index\n" <<
  12 + " should_respond_with :success\n" <<
  13 + " end"
  14 + assert body.include?(expected),
  15 + "expected #{expected} but was #{body.inspect}"
  16 + end
  17 +end
  18 +
  19 +Then /^a standard "new" functional test for "posts" should be generated$/ do
  20 + assert_generated_functional_test_for("posts") do |body|
  21 + expected = " context 'GET to new' do\n" <<
  22 + " setup { get :new }\n\n" <<
  23 + " should_assign_to :post\n" <<
  24 + " should_render_template :new\n" <<
  25 + " should_respond_with :success\n" <<
  26 + " end"
  27 + assert body.include?(expected),
  28 + "expected #{expected} but was #{body.inspect}"
  29 + end
  30 +end
  31 +
  32 +Then /^a standard "create" functional test for "posts" should be generated$/ do
  33 + assert_generated_functional_test_for("posts") do |body|
  34 + expected = " context 'POST to create with valid parameters' do\n" <<
  35 + " setup do\n" <<
  36 + " post :create, :post => Factory.attributes_for(:post)\n" <<
  37 + " end\n\n" <<
  38 + " should_create :post\n" <<
  39 + " should_set_the_flash_to /created/i\n" <<
  40 + " should_redirect_to('posts index') { posts_path }\n" <<
  41 + " end"
  42 + assert body.include?(expected),
  43 + "expected #{expected} but was #{body.inspect}"
  44 + end
  45 +end
  46 +
  47 +Then /^a standard "show" functional test for "posts" should be generated$/ do
  48 + assert_generated_functional_test_for("posts") do |body|
  49 + expected = " context 'GET to show for existing post' do\n" <<
  50 + " setup do\n" <<
  51 + " @post = Factory(:post)\n" <<
  52 + " get :show, :id => @post.to_param\n" <<
  53 + " end\n\n" <<
  54 + " should_assign_to :post, :equals => '@post'\n" <<
  55 + " should_render_template :show\n" <<
  56 + " should_respond_with :success\n" <<
  57 + " end"
  58 + assert body.include?(expected),
  59 + "expected #{expected} but was #{body.inspect}"
  60 + end
  61 +end
  62 +
  63 +Then /^a standard "edit" functional test for "posts" should be generated$/ do
  64 + assert_generated_functional_test_for("posts") do |body|
  65 + expected = " context 'GET to edit for existing post' do\n" <<
  66 + " setup do\n" <<
  67 + " @post = Factory(:post)\n" <<
  68 + " get :edit, :id => @post.to_param\n" <<
  69 + " end\n\n" <<
  70 + " should_assign_to :post, :equals => '@post'\n" <<
  71 + " should_render_template :edit\n" <<
  72 + " should_respond_with :success\n" <<
  73 + " end"
  74 + assert body.include?(expected),
  75 + "expected #{expected} but was #{body.inspect}"
  76 + end
  77 +end
  78 +
  79 +Then /^a standard "update" functional test for "posts" should be generated$/ do
  80 + assert_generated_functional_test_for("posts") do |body|
  81 + expected = " context 'PUT to update for existing post' do\n" <<
  82 + " setup do\n" <<
  83 + " @post = Factory(:post)\n" <<
  84 + " put :update, :id => @post.to_param,\n" <<
  85 + " :post => Factory.attributes_for(:post)\n" <<
  86 + " end\n\n" <<
  87 + " should_set_the_flash_to /updated/i\n" <<
  88 + " should_redirect_to('posts index') { posts_path }\n" <<
  89 + " end"
  90 + assert body.include?(expected),
  91 + "expected #{expected} but was #{body.inspect}"
  92 + end
  93 +end
  94 +
  95 +Then /^a standard "destroy" functional test for "posts" should be generated$/ do
  96 + assert_generated_functional_test_for("posts") do |body|
  97 + expected = " context 'given a post' do\n" <<
  98 + " setup { @post = Factory(:post) }\n\n" <<
  99 + " context 'DELETE to destroy' do\n" <<
  100 + " setup { delete :destroy, :id => @post.to_param }\n\n" <<
  101 + " should_destroy :post\n" <<
  102 + " should_set_the_flash_to /deleted/i\n" <<
  103 + " should_redirect_to('posts index') { posts_path }\n" <<
  104 + " end\n" <<
  105 + " end"
  106 + assert body.include?(expected),
  107 + "expected #{expected} but was #{body.inspect}"
  108 + end
  109 +end
  110 +
  111 +Then /^a "new" controller action for "posts" should be generated$/ do
  112 + assert_generated_controller_for("posts") do |body|
  113 + expected = " def new\n" <<
  114 + " @post = Post.new\n" <<
  115 + " end"
  116 + assert body.include?(expected),
  117 + "expected #{expected} but was #{body.inspect}"
  118 + end
  119 +end
  120 +
  121 +Then /^a "create" controller action for "posts" should be generated$/ do
  122 + assert_generated_controller_for("posts") do |body|
  123 + expected = " def create\n" <<
  124 + " @post = Post.new(params[:post])\n" <<
  125 + " @post.save\n" <<
  126 + " flash[:success] = 'Post created.'\n" <<
  127 + " redirect_to posts_path\n" <<
  128 + " end"
  129 + assert body.include?(expected),
  130 + "expected #{expected} but was #{body.inspect}"
  131 + end
  132 +end
  133 +
  134 +Then /^a "show" controller action for "posts" should be generated$/ do
  135 + assert_generated_controller_for("posts") do |body|
  136 + expected = " def show\n" <<
  137 + " @post = Post.find(params[:id])\n" <<
  138 + " end"
  139 + assert body.include?(expected),
  140 + "expected #{expected} but was #{body.inspect}"
  141 + end
  142 +end
  143 +
  144 +Then /^a "edit" controller action for "posts" should be generated$/ do
  145 + assert_generated_controller_for("posts") do |body|
  146 + expected = " def edit\n" <<
  147 + " @post = Post.find(params[:id])\n" <<
  148 + " end"
  149 + assert body.include?(expected),
  150 + "expected #{expected} but was #{body.inspect}"
  151 + end
  152 +end
  153 +
  154 +Then /^a "update" controller action for "posts" should be generated$/ do
  155 + assert_generated_controller_for("posts") do |body|
  156 + expected = " def update\n" <<
  157 + " @post = Post.find(params[:id])\n" <<
  158 + " @post.update_attributes(params[:post])\n" <<
  159 + " flash[:success] = 'Post updated.'\n" <<
  160 + " redirect_to posts_path\n" <<
  161 + " end"
  162 + assert body.include?(expected),
  163 + "expected #{expected} but was #{body.inspect}"
  164 + end
  165 +end
  166 +
  167 +Then /^a "destroy" controller action for "posts" should be generated$/ do
  168 + assert_generated_controller_for("posts") do |body|
  169 + expected = " def destroy\n" <<
  170 + " @post = Post.find(params[:id])\n" <<
  171 + " @post.destroy\n" <<
  172 + " flash[:success] = 'Post deleted.'\n" <<
  173 + " redirect_to posts_path\n" <<
  174 + " end"
  175 + assert body.include?(expected),
  176 + "expected #{expected} but was #{body.inspect}"
  177 + end
  178 +end
  179 +
  180 +Then /^an empty "(.*)" controller action for "(.*)" should be generated$/ do |action, controller|
  181 + assert_generated_controller_for(controller) do |body|
  182 + assert_has_empty_method(body, action)
  183 + end
  184 +end
  185 +
  186 +Then /^only a "([^\"]*)" action for RESTful "([^\"]*)" route should be generated$/ do |action, resource|
  187 + assert_generated_route_for resource, action
  188 +end
  189 +
... ...
vendor/plugins/coulda/features/step_definitions/generator_steps.rb 0 → 100644
... ... @@ -0,0 +1,16 @@
  1 +Given 'a Rails app' do
  2 + system "rails rails_root"
  3 + @rails_root = File.join(File.dirname(__FILE__), "..", "..", "rails_root")
  4 +end
  5 +
  6 +Given /^the coulda plugin is installed$/ do
  7 + plugin_dir = File.join(@rails_root, "vendor", "plugins")
  8 + target = File.join(File.dirname(__FILE__), "..", "..", "generators")
  9 + FileUtils.mkdir_p "#{plugin_dir}/coulda"
  10 + system "cp -r #{target} #{plugin_dir}/coulda"
  11 +end
  12 +
  13 +After do
  14 + FileUtils.rm_rf @rails_root if @rails_root
  15 +end
  16 +
... ...
vendor/plugins/coulda/features/step_definitions/helper_steps.rb 0 → 100644
... ... @@ -0,0 +1,14 @@
  1 +When /^I generate a helper named "(.*)"$/ do |name|
  2 + system "cd #{@rails_root} && " <<
  3 + "script/generate helper #{name} && " <<
  4 + "cd .."
  5 +end
  6 +
  7 +Then /^a helper should be generated for "(.*)"$/ do |name|
  8 + assert_generated_helper_for(name)
  9 +end
  10 +
  11 +Then /^a helper test should be generated for "(.*)"$/ do |name|
  12 + assert_generated_helper_test_for(name)
  13 +end
  14 +
... ...
vendor/plugins/coulda/features/step_definitions/migration_steps.rb 0 → 100644
... ... @@ -0,0 +1,14 @@
  1 +Then /^the paperclip migration should add "(.*)" columns to the "(.*)"$/ do |attr, table|
  2 + up = " add_column :#{table}, :#{attr}_file_name, :string\n" <<
  3 + " add_column :#{table}, :#{attr}_content_type, :string\n" <<
  4 + " add_column :#{table}, :#{attr}_file_size, :integer\n" <<
  5 + " add_column :#{table}, :#{attr}_updated_at, :datetime"
  6 + down = " remove_column :#{table}, :#{attr}_file_name\n" <<
  7 + " remove_column :#{table}, :#{attr}_content_type\n" <<
  8 + " remove_column :#{table}, :#{attr}_file_size\n" <<
  9 + " remove_column :#{table}, :#{attr}_updated_at"
  10 + assert_generated_migration(table) do |body|
  11 + assert body.include?(up), body.inspect
  12 + assert body.include?(down), body.inspect
  13 + end
  14 +end
... ...
vendor/plugins/coulda/features/step_definitions/model_steps.rb 0 → 100644
... ... @@ -0,0 +1,122 @@
  1 +# GENERATION
  2 +
  3 +When /^I generate a model named "(.*)"$/ do |model|
  4 + system "cd #{@rails_root} && " <<
  5 + "script/generate model #{model} && " <<
  6 + "cd .."
  7 +end
  8 +
  9 +When /^I generate a model "(.*)" with a (.*) "(.*)"$/ do |model, attr_type, attr_name|
  10 + system "cd #{@rails_root} && " <<
  11 + "script/generate model #{model} #{attr_name}:#{attr_type} && " <<
  12 + "cd .."
  13 +end
  14 +
  15 +When /^I generate a model "(.*)" that belongs to a "(.*)"$/ do |model, association|
  16 + association.downcase!
  17 + system "cd #{@rails_root} && " <<
  18 + "script/generate model #{model} #{association}:belongs_to && " <<
  19 + "cd .."
  20 +end
  21 +
  22 +When /^I generate a model "(.*)" with file "(.*)"$/ do |model, file|
  23 + file.downcase!
  24 + system "cd #{@rails_root} && " <<
  25 + "script/generate model #{model} #{file}:paperclip && " <<
  26 + "cd .."
  27 +end
  28 +
  29 +# MODEL
  30 +
  31 +Then /^a model with comments should be generated for "(.*)"$/ do |model|
  32 + model.downcase!
  33 + assert_generated_model_for(model) do |body|
  34 + comments = []
  35 + comments << "# includes: mixed in behavior" <<
  36 + "# properties: attributes, associations" <<
  37 + "# lifecycle: validations, callbacks" <<
  38 + "# class methods: self.method, named_scopes" <<
  39 + "# instance methods" <<
  40 + "# non-public interface: protected helpers"
  41 + comments.each do |comment|
  42 + assert body.include?(comment), body.inspect
  43 + end
  44 + end
  45 +end
  46 +
  47 +Then /^the "(.*)" model should have "(.*)" macro$/ do |model, macro|
  48 + model.downcase!
  49 + assert_generated_model_for(model) do |body|
  50 + assert body.include?(macro), body.inspect
  51 + end
  52 +end
  53 +
  54 +# FACTORY
  55 +
  56 +Then /^a factory should be generated for "(.*)"$/ do |model|
  57 + model.downcase!
  58 + assert_generated_factory_for(model) do |body|
  59 + expected = "Factory.define :#{model.downcase} do |#{model.downcase}|\n" <<
  60 + "end\n"
  61 + assert_equal expected, body
  62 + end
  63 +end
  64 +
  65 +Then /^a factory for "(.*)" should have an? "(.*)" (.*)$/ do |model, attr_name, attr_type|
  66 + model.downcase!
  67 + assert_generated_factory_for(model) do |body|
  68 + expected = "Factory.define :#{model} do |#{model}|\n" <<
  69 + " #{model}.#{attr_name} { '#{attr_type}' }\n" <<
  70 + "end\n"
  71 + assert_equal expected, body
  72 + end
  73 +end
  74 +
  75 +Then /^a factory for "(.*)" should have an association to "(.*)"$/ do |model, associated_model|
  76 + model.downcase!
  77 + associated_model.downcase!
  78 + assert_generated_factory_for(model) do |body|
  79 + expected = "Factory.define :#{model} do |#{model}|\n" <<
  80 + " #{model}.association(:#{associated_model})\n" <<
  81 + "end\n"
  82 + assert_equal expected, body
  83 + end
  84 +end
  85 +
  86 +# UNIT TEST
  87 +
  88 +Then /^a unit test should be generated for "(.*)"$/ do |model|
  89 + model.downcase!
  90 + assert_generated_unit_test_for(model) do |body|
  91 + match = "assert_valid Factory.build(:#{model})"
  92 + assert body.include?(match), body.inspect
  93 + end
  94 +end
  95 +
  96 +Then /^the "(.*)" unit test should have "(.*)" macro$/ do |model, macro|
  97 + model.downcase!
  98 + assert_generated_unit_test_for(model) do |body|
  99 + assert body.include?(macro), body.inspect
  100 + end
  101 +end
  102 +
  103 +# MIGRATION
  104 +
  105 +Then /^the "(.*)" table should have db index on "(.*)"$/ do |table, foreign_key|
  106 + assert_generated_migration(table) do |body|
  107 + index = "add_index :#{table}, :#{foreign_key}"
  108 + assert body.include?(index), body.inspect
  109 + end
  110 +end
  111 +
  112 +Then /^the "(.*)" table should have paperclip columns for "(.*)"$/ do |table, attr|
  113 + up = " table.string :#{attr}_file_name\n" <<
  114 + " table.string :#{attr}_content_type\n" <<
  115 + " table.integer :#{attr}_file_size\n" <<
  116 + " table.datetime :#{attr}_updated_at"
  117 + assert_generated_migration(table) do |body|
  118 + assert body.include?(up), body.inspect
  119 + end
  120 +end
  121 +
  122 +
... ...
vendor/plugins/coulda/features/step_definitions/view_steps.rb 0 → 100644
... ... @@ -0,0 +1,4 @@
  1 +Then /^an empty "(.*)" view for "(.*)" should be generated$/ do |action, controller|
  2 + assert_generated_views_for(controller, action)
  3 +end
  4 +
... ...
vendor/plugins/coulda/features/support/env.rb 0 → 100644
... ... @@ -0,0 +1,104 @@
  1 +require 'test/unit'
  2 +
  3 +module Test::Unit::Assertions
  4 +
  5 + def assert_generated_controller_for(name)
  6 + assert_generated_file "app/controllers/#{name}_controller.rb" do |body|
  7 + yield body if block_given?
  8 + end
  9 + end
  10 +
  11 + def assert_generated_model_for(name)
  12 + assert_generated_file "app/models/#{name}.rb" do |body|
  13 + yield body if block_given?
  14 + end
  15 + end
  16 +
  17 + def assert_generated_helper_for(name)
  18 + assert_generated_file "app/helpers/#{name}_helper.rb" do |body|
  19 + yield body if block_given?
  20 + end
  21 + end
  22 +
  23 + def assert_generated_factory_for(name)
  24 + assert_generated_file "test/factories/#{name}.rb" do |body|
  25 + yield body if block_given?
  26 + end
  27 + end
  28 +
  29 + def assert_generated_functional_test_for(name)
  30 + assert_generated_file "test/functional/#{name}_controller_test.rb" do |body|
  31 + yield body if block_given?
  32 + end
  33 + end
  34 +
  35 + def assert_generated_unit_test_for(name)
  36 + assert_generated_file "test/unit/#{name}_test.rb" do |body|
  37 + yield body if block_given?
  38 + end
  39 + end
  40 +
  41 + def assert_generated_helper_test_for(name)
  42 + assert_generated_file "test/unit/helpers/#{name}_helper_test.rb" do |body|
  43 + yield body if block_given?
  44 + end
  45 + end
  46 +
  47 + def assert_generated_file(path)
  48 + assert_file_exists(path)
  49 + File.open(File.join(@rails_root, path)) do |file|
  50 + yield file.read if block_given?
  51 + end
  52 + end
  53 +
  54 + def assert_file_exists(path)
  55 + file = File.join(@rails_root, path)
  56 +
  57 + assert File.exists?(file), "#{file} expected to exist, but did not"
  58 + assert File.file?(file), "#{file} expected to be a file, but is not"
  59 + end
  60 +
  61 + def assert_generated_views_for(name, *actions)
  62 + actions.each do |action|
  63 + assert_generated_file("app/views/#{name}/#{action}.html.erb") do |body|
  64 + yield body if block_given?
  65 + end
  66 + end
  67 + end
  68 +
  69 + def assert_generated_migration(name)
  70 + file = Dir.glob("#{@rails_root}/db/migrate/*_#{name}.rb").first
  71 + file = file.match(/db\/migrate\/[0-9]+_\w+/).to_s << ".rb"
  72 + assert_generated_file file do |body|
  73 + assert_match /timestamps/, body, "should have timestamps defined"
  74 + yield body if block_given?
  75 + end
  76 + end
  77 +
  78 + def assert_generated_route_for(name, *actions)
  79 + assert_generated_file("config/routes.rb") do |body|
  80 + routeable_actions = actions.collect { |action| ":#{action}" }.join(", ")
  81 + expected = " map.resources :#{name.to_s}, :only => [#{routeable_actions}]"
  82 + assert body.include?(expected),
  83 + "expected #{expected} but was #{body.inspect}"
  84 + end
  85 + end
  86 +
  87 + def assert_has_empty_method(body, *methods)
  88 + methods.each do |name|
  89 + assert body.include?(" def #{name}\n end"),
  90 + "should have method #{name} in #{body.inspect}"
  91 + yield(name, $2) if block_given?
  92 + end
  93 + end
  94 +
  95 +end
  96 +
  97 +class CouldaWorld
  98 + include Test::Unit::Assertions
  99 +end
  100 +
  101 +World do
  102 + CouldaWorld.new
  103 +end
  104 +
... ...
vendor/plugins/coulda/generators/controller/controller_generator.rb 0 → 100644
... ... @@ -0,0 +1,29 @@
  1 +require File.join(File.dirname(__FILE__), "..", "support", "insert_commands")
  2 +
  3 +class ControllerGenerator < Rails::Generator::NamedBase
  4 + def manifest
  5 + record do |m|
  6 + m.class_collisions "#{class_name}Controller", "#{class_name}ControllerTest"
  7 +
  8 + m.directory File.join('app/controllers', class_path)
  9 + m.directory File.join('test/functional', class_path)
  10 +
  11 + m.template 'controller.rb',
  12 + File.join('app/controllers',
  13 + class_path,
  14 + "#{file_name}_controller.rb")
  15 +
  16 + m.template 'functional_test.rb',
  17 + File.join('test/functional',
  18 + class_path,
  19 + "#{file_name}_controller_test.rb")
  20 +
  21 + m.insert_into "config/routes.rb",
  22 + "map.resources :#{file_name}, :only => [#{routeable_actions}]"
  23 + end
  24 + end
  25 +
  26 + def routeable_actions
  27 + actions.collect { |action| ":#{action}" }.join(", ")
  28 + end
  29 +end
... ...
vendor/plugins/coulda/generators/controller/templates/controller.rb 0 → 100644
... ... @@ -0,0 +1,56 @@
  1 +class <%= class_name %>Controller < ApplicationController
  2 +<% resource = file_name.singularize -%>
  3 +<% resources = file_name.pluralize -%>
  4 +<% resource_class = class_name.singularize -%>
  5 +
  6 +<% if actions.include?("index") -%>
  7 + def index
  8 + end
  9 +
  10 +<% end -%>
  11 +<% if actions.include?("new") -%>
  12 + def new
  13 + @<%= resource %> = <%= resource_class %>.new
  14 + end
  15 +
  16 +<% end -%>
  17 +<% if actions.include?("create") -%>
  18 + def create
  19 + @<%= resource %> = <%= resource_class %>.new(params[:<%= resource %>])
  20 + @<%= resource %>.save
  21 + flash[:success] = '<%= resource_class %> created.'
  22 + redirect_to <%= resources %>_path
  23 + end
  24 +
  25 +<% end -%>
  26 +<% if actions.include?("show") -%>
  27 + def show
  28 + @<%= resource %> = <%= resource_class %>.find(params[:id])
  29 + end
  30 +
  31 +<% end -%>
  32 +<% if actions.include?("edit") -%>
  33 + def edit
  34 + @<%= resource %> = <%= resource_class %>.find(params[:id])
  35 + end
  36 +
  37 +<% end -%>
  38 +<% if actions.include?("update") -%>
  39 + def update
  40 + @<%= resource %> = <%= resource_class %>.find(params[:id])
  41 + @<%= resource %>.update_attributes(params[:<%= resource %>])
  42 + flash[:success] = '<%= resource_class %> updated.'
  43 + redirect_to <%= resources %>_path
  44 + end
  45 +
  46 +<% end -%>
  47 +<% if actions.include?("destroy") -%>
  48 + def destroy
  49 + @<%= resource %> = <%= resource_class %>.find(params[:id])
  50 + @<%= resource %>.destroy
  51 + flash[:success] = '<%= resource_class %> deleted.'
  52 + redirect_to <%= resources %>_path
  53 + end
  54 +
  55 +<% end -%>
  56 +end
... ...
vendor/plugins/coulda/generators/controller/templates/functional_test.rb 0 → 100644
... ... @@ -0,0 +1,93 @@
  1 +require 'test_helper'
  2 +
  3 +class <%= class_name %>ControllerTest < ActionController::TestCase
  4 +<% resource = file_name.singularize -%>
  5 +<% resources = file_name.pluralize -%>
  6 +<% resource_class = class_name.singularize -%>
  7 +
  8 +<% if actions.include?("index") -%>
  9 + context 'GET to index' do
  10 + setup { get :index }
  11 +
  12 + should_render_template :index
  13 + should_respond_with :success
  14 + end
  15 +
  16 +<% end -%>
  17 +<% if actions.include?("new") -%>
  18 + context 'GET to new' do
  19 + setup { get :new }
  20 +
  21 + should_assign_to :<%= resource %>
  22 + should_render_template :new
  23 + should_respond_with :success
  24 + end
  25 +
  26 +<% end -%>
  27 +<% if actions.include?("create") -%>
  28 + context 'POST to create with valid parameters' do
  29 + setup do
  30 + post :create, :<%= resource %> => Factory.attributes_for(:<%= resource %>)
  31 + end
  32 +
  33 + should_create :<%= resource %>
  34 + should_set_the_flash_to /created/i
  35 + should_redirect_to('<%= resources %> index') { <%= resources %>_path }
  36 + end
  37 +
  38 +<% end -%>
  39 +<% if actions.include?("show") -%>
  40 + context 'GET to show for existing <%= resource %>' do
  41 + setup do
  42 + @<%= resource %> = Factory(:<%= resource %>)
  43 + get :show, :id => @<%= resource %>.to_param
  44 + end
  45 +
  46 + should_assign_to :<%= resource %>, :equals => '@<%= resource %>'
  47 + should_render_template :show
  48 + should_respond_with :success
  49 + end
  50 +
  51 +<% end -%>
  52 +<% if actions.include?("edit") -%>
  53 + context 'GET to edit for existing <%= resource %>' do
  54 + setup do
  55 + @<%= resource %> = Factory(:<%= resource %>)
  56 + get :edit, :id => @<%= resource %>.to_param
  57 + end
  58 +
  59 + should_assign_to :<%= resource %>, :equals => '@<%= resource %>'
  60 + should_render_template :edit
  61 + should_respond_with :success
  62 + end
  63 +
  64 +<% end -%>
  65 +<% if actions.include?("update") -%>
  66 + context 'PUT to update for existing <%= resource %>' do
  67 + setup do
  68 + @<%= resource %> = Factory(:<%= resource %>)
  69 + put :update, :id => @<%= resource %>.to_param,
  70 + :<%= resource %> => Factory.attributes_for(:<%= resource %>)
  71 + end
  72 +
  73 + should_set_the_flash_to /updated/i
  74 + should_redirect_to('<%= resources %> index') { <%= resources %>_path }
  75 + end
  76 +
  77 +<% end -%>
  78 +<% if actions.include?("destroy") -%>
  79 + context 'given a <%= resource %>' do
  80 + setup { @<%= resource %> = Factory(:<%= resource %>) }
  81 +
  82 + context 'DELETE to destroy' do
  83 + setup { delete :destroy, :id => @<%= resource %>.to_param }
  84 +
  85 + should_destroy :<%= resource %>
  86 + should_set_the_flash_to /deleted/i
  87 + should_redirect_to('<%= resources %> index') { <%= resources %>_path }
  88 + end
  89 + end
  90 +
  91 +<% end -%>
  92 +end
  93 +
... ...
vendor/plugins/coulda/generators/helper/helper_generator.rb 0 → 100644
... ... @@ -0,0 +1,23 @@
  1 +class HelperGenerator < Rails::Generator::NamedBase
  2 + def manifest
  3 + record do |m|
  4 + # Check for class naming collisions.
  5 + m.class_collisions "#{class_name}Helper", "#{class_name}HelperTest"
  6 +
  7 + # Helper and test directories.
  8 + m.directory File.join('app/helpers', class_path)
  9 + m.directory File.join('test/unit/helpers', class_path)
  10 +
  11 + # Helper module and test.
  12 + m.template 'helper.rb',
  13 + File.join('app/helpers',
  14 + class_path,
  15 + "#{file_name}_helper.rb")
  16 +
  17 + m.template 'helper_test.rb',
  18 + File.join('test/unit/helpers',
  19 + class_path,
  20 + "#{file_name}_helper_test.rb")
  21 + end
  22 + end
  23 +end
... ...
vendor/plugins/coulda/generators/helper/templates/helper.rb 0 → 100644
... ... @@ -0,0 +1,2 @@
  1 +module <%= class_name %>Helper
  2 +end
... ...
vendor/plugins/coulda/generators/helper/templates/helper_test.rb 0 → 100644
... ... @@ -0,0 +1,4 @@
  1 +require 'test_helper'
  2 +
  3 +class <%= class_name %>HelperTest < ActionView::TestCase
  4 +end
... ...
vendor/plugins/coulda/generators/model/model_generator.rb 0 → 100644
... ... @@ -0,0 +1,79 @@
  1 +class ModelGenerator < Rails::Generator::NamedBase
  2 + default_options :skip_timestamps => false,
  3 + :skip_migration => false,
  4 + :skip_factories => false
  5 +
  6 + def manifest
  7 + record do |m|
  8 + # Check for class naming collisions.
  9 + m.class_collisions class_name, "#{class_name}Test"
  10 +
  11 + # Model, test, and factories directories.
  12 + m.directory File.join('app/models', class_path)
  13 + m.directory File.join('test/unit', class_path)
  14 + m.directory File.join('test/factories', class_path)
  15 +
  16 + # Model class, unit test, and factories.
  17 + m.template 'model.rb', File.join('app/models', class_path,
  18 + "#{file_name}.rb")
  19 + m.template 'unit_test.rb', File.join('test/unit', class_path,
  20 + "#{file_name}_test.rb")
  21 +
  22 + m.template 'factory.rb', File.join('test/factories', "#{file_name}.rb")
  23 +
  24 + unless options[:skip_migration]
  25 + m.migration_template 'migration.rb', 'db/migrate', :assigns => {
  26 + :migration_name => "Create#{class_name.pluralize.gsub(/::/, '')}"
  27 + }, :migration_file_name => "create_#{file_path.gsub(/\//, '_').pluralize}"
  28 + end
  29 + end
  30 + end
  31 +
  32 + def factory_line(attribute, file_name)
  33 + if attribute.reference?
  34 + "#{file_name}.association(:#{attribute.name})"
  35 + else
  36 + "#{file_name}.#{attribute.name} #{attribute.default_for_factory}"
  37 + end
  38 + end
  39 +
  40 + protected
  41 +
  42 + def banner
  43 + "Usage: #{$0} #{spec.name} ModelName [field:type, field:type]"
  44 + end
  45 +
  46 + def add_options!(opt)
  47 + opt.separator ''
  48 + opt.separator 'Options:'
  49 + opt.on("--skip-timestamps",
  50 + "Don't add timestamps to the migration file for this model") { |v|
  51 + options[:skip_timestamps] = v
  52 + }
  53 + opt.on("--skip-migration",
  54 + "Don't generate a migration file for this model") { |v|
  55 + options[:skip_migration] = v
  56 + }
  57 + end
  58 +end
  59 +
  60 +module Rails
  61 + module Generator
  62 + class GeneratedAttribute
  63 + def default_for_factory
  64 + @default ||= case type
  65 + when :integer then "{ 1 }"
  66 + when :float then "{ 1.5 }"
  67 + when :decimal then "{ 9.99 }"
  68 + when :datetime, :timestamp, :time then "{ Time.now.to_s(:db) }"
  69 + when :date then "{ Date.today.to_s(:db) }"
  70 + when :string then "{ 'string' }"
  71 + when :text then "{ 'text' }"
  72 + when :boolean then "{ false }"
  73 + else
  74 + ""
  75 + end
  76 + end
  77 + end
  78 + end
  79 +end
... ...
vendor/plugins/coulda/generators/model/templates/factory.rb 0 → 100644
... ... @@ -0,0 +1,5 @@
  1 +Factory.define :<%= file_name %> do |<%= file_name %>|
  2 +<% attributes.each do |attribute| -%>
  3 + <%= factory_line(attribute, file_name) %>
  4 +<% end -%>
  5 +end
... ...
vendor/plugins/coulda/generators/model/templates/migration.rb 0 → 100644
... ... @@ -0,0 +1,30 @@
  1 +class <%= migration_name %> < ActiveRecord::Migration
  2 + def self.up
  3 + create_table :<%= table_name %> do |table|
  4 +<% attributes.each do |attribute| -%>
  5 +<% if attribute.type == :paperclip -%>
  6 + table.string :<%= attribute.name %>_file_name
  7 + table.string :<%= attribute.name %>_content_type
  8 + table.integer :<%= attribute.name %>_file_size
  9 + table.datetime :<%= attribute.name %>_updated_at
  10 +<% else -%>
  11 + table.<%= attribute.type %> :<%= attribute.name %>
  12 +<% end -%>
  13 +<% end -%>
  14 +<% unless options[:skip_timestamps] -%>
  15 + table.timestamps
  16 +<% end -%>
  17 + end
  18 +
  19 +<% attributes.select(&:reference?).each do |attribute| -%>
  20 + add_index :<%= table_name %>, :<%= attribute.name %>_id
  21 +<% end -%>
  22 + end
  23 +
  24 + def self.down
  25 +<% attributes.select(&:reference?).each do |attribute| -%>
  26 + remove_index :<%= table_name %>, :<%= attribute.name %>_id
  27 +<% end -%>
  28 + drop_table :<%= table_name %>
  29 + end
  30 +end
... ...
vendor/plugins/coulda/generators/model/templates/model.rb 0 → 100644
... ... @@ -0,0 +1,8 @@
  1 +class <%= class_name %> < ActiveRecord::Base
  2 +<% attributes.select(&:reference?).each do |each| -%>
  3 + belongs_to :<%= each.name %>
  4 +<% end -%>
  5 +<% attributes.select { |each| each.type == :paperclip }.each do |each| -%>
  6 + has_attached_file :<%= each.name %>
  7 +<% end -%>
  8 +end
... ...
vendor/plugins/coulda/generators/model/templates/unit_test.rb 0 → 100644
... ... @@ -0,0 +1,16 @@
  1 +require File.dirname(__FILE__) + '/../test_helper'
  2 +
  3 +class <%= class_name %>Test < ActiveSupport::TestCase
  4 + should "be valid with factory" do
  5 + assert_valid Factory.build(:<%= file_name -%>)
  6 + end
  7 +<% attributes.each do |attribute| -%>
  8 +<% if attribute.reference? -%>
  9 + should_belong_to :<%= attribute.name %>
  10 + should_have_db_index :<%= attribute.name %>_id
  11 +<% end -%>
  12 +<% if attribute.type == :paperclip -%>
  13 + should_have_attached_file :<%= attribute.name %>
  14 +<% end -%>
  15 +<% end -%>
  16 +end
... ...
vendor/plugins/coulda/generators/support/insert_commands.rb 0 → 100644
... ... @@ -0,0 +1,35 @@
  1 +# Mostly pinched from http://github.com/ryanb/nifty-generators/tree/master
  2 +
  3 +Rails::Generator::Commands::Base.class_eval do
  4 + def file_contains?(relative_destination, line)
  5 + File.read(destination_path(relative_destination)).include?(line)
  6 + end
  7 +end
  8 +
  9 +Rails::Generator::Commands::Create.class_eval do
  10 + def insert_into(file, line)
  11 + logger.insert "#{line} into #{file}"
  12 + unless options[:pretend] || file_contains?(file, line)
  13 + start_of_routes_file = "ActionController::Routing::Routes.draw"
  14 + gsub_file file, /^(class|module|#{start_of_routes_file}) .+$/ do |match|
  15 + "#{match}\n #{line}"
  16 + end
  17 + end
  18 + end
  19 +end
  20 +
  21 +Rails::Generator::Commands::Destroy.class_eval do
  22 + def insert_into(file, line)
  23 + logger.remove "#{line} from #{file}"
  24 + unless options[:pretend]
  25 + gsub_file file, "\n #{line}", ''
  26 + end
  27 + end
  28 +end
  29 +
  30 +Rails::Generator::Commands::List.class_eval do
  31 + def insert_into(file, line)
  32 + logger.insert "#{line} into #{file}"
  33 + end
  34 +end
  35 +
... ...
vendor/plugins/coulda/generators/view/templates/view_new.html.erb 0 → 100644
... ... @@ -0,0 +1,6 @@
  1 +<h1>New <%= singular_name %></h1>
  2 +
  3 +<%% form_for(@<%= singular_name %>) do |form| %>
  4 + <%%= form.error_messages %>
  5 + <%%= form.submit "Create", :disable_with => "Please wait..." %>
  6 +<%% end %>
... ...
vendor/plugins/coulda/generators/view/view_generator.rb 0 → 100644
... ... @@ -0,0 +1,14 @@
  1 +class ViewGenerator < Rails::Generator::NamedBase
  2 + def manifest
  3 + record do |m|
  4 + m.directory File.join('app/views', class_path, file_name)
  5 +
  6 + # View template for specified action.
  7 + if actions.include?("new")
  8 + path = File.join('app/views', class_path, file_name, "new.html.erb")
  9 + m.template 'view_new.html.erb', path,
  10 + :assigns => { :action => action, :path => path }
  11 + end
  12 + end
  13 + end
  14 +end
... ...