prologue 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,140 @@
1
+ generate(:controller, "admin/users index new create edit update destroy")
2
+
3
+ inject_into_file 'config/routes.rb', :after => "devise_for :users\n" do
4
+ <<-'FILE'
5
+ namespace "admin" do
6
+ resources :users
7
+ end
8
+ FILE
9
+ end
10
+
11
+ inject_into_file 'app/controllers/admin/users_controller.rb', :after => "def index\n" do
12
+ <<-'FILE'
13
+ @sortable = SortIndex::Sortable.new(params, INDEX_SORT)
14
+ @users = User.paginate :page => params[:page], :order => @sortable.order, :per_page => 2
15
+ FILE
16
+ end
17
+
18
+ inject_into_file 'app/controllers/admin/users_controller.rb', :after => "def new\n" do
19
+ <<-'FILE'
20
+ @user = User.new
21
+ FILE
22
+ end
23
+
24
+ inject_into_file 'app/controllers/admin/users_controller.rb', :after => "def create\n" do
25
+ <<-'FILE'
26
+ @user = User.new(params[:user])
27
+ if @user.save
28
+ flash[:notice] = "User created!"
29
+ redirect_to admin_users_url
30
+ else
31
+ render :action => 'new'
32
+ end
33
+ FILE
34
+ end
35
+
36
+ inject_into_file 'app/controllers/admin/users_controller.rb', :after => "def update\n" do
37
+ <<-'FILE'
38
+ if @user.update_attributes(params[:user])
39
+ flash[:notice] = "Successfully updated #{@user.name}."
40
+ redirect_to admin_users_url
41
+ else
42
+ render :action => 'edit'
43
+ end
44
+ FILE
45
+ end
46
+
47
+ inject_into_file 'app/controllers/admin/users_controller.rb', :after => "def destroy\n" do
48
+ <<-'FILE'
49
+ @user.destroy
50
+ flash[:notice] = "User deleted."
51
+ redirect_to admin_users_url
52
+ FILE
53
+ end
54
+
55
+ gsub_file 'app/controllers/admin/users_controller.rb', /ApplicationController/, 'Admin::BaseController'
56
+
57
+ inject_into_file 'app/controllers/admin/users_controller.rb', :after => "class Admin::UsersController < Admin::BaseController\n" do
58
+ <<-'FILE'
59
+ before_filter :find_user, :only => [:edit, :update, :destroy]
60
+
61
+ INDEX_SORT = SortIndex::Config.new(
62
+ {'name' => 'name'},
63
+ {
64
+ 'email' => 'email',
65
+ 'login' => 'login',
66
+ 'roles_mask' => 'roles_mask',
67
+ 'last_login_at' => 'last_login_at'
68
+ }
69
+ #, optionally SortIndex::SORT_KEY_ASC
70
+ )
71
+
72
+ def find_user
73
+ @user = User.find(params[:id])
74
+ end
75
+
76
+ FILE
77
+ end
78
+
79
+ create_file 'app/views/admin/users/_form.html.haml' do
80
+ <<-'FILE'
81
+ - form_for([:admin, @user]) do |f|
82
+ .form_errors
83
+ = f.error_messages
84
+ %fieldset#user_form
85
+ .form_row
86
+ = f.label :name
87
+ = f.text_field :name
88
+ .form_row
89
+ = f.label :email
90
+ = f.text_field :email
91
+ .form_row
92
+ = f.label :password
93
+ = f.password_field :password
94
+ .form_row
95
+ = f.label :password_confirmation
96
+ = f.password_field :password_confirmation
97
+ .form_row.form_row_button
98
+ = f.submit "Save"
99
+ FILE
100
+ end
101
+
102
+ create_file 'app/views/admin/users/edit.html.haml' do
103
+ <<-'FILE'
104
+ = render :partial => "form"
105
+ FILE
106
+ end
107
+
108
+ create_file 'app/views/admin/users/new.html.haml' do
109
+ <<-'FILE'
110
+ = render :partial => "form"
111
+ FILE
112
+ end
113
+
114
+ create_file 'app/views/admin/users/index.html.haml' do
115
+ <<-FILE
116
+ - if !@users.blank?
117
+ %table
118
+ %thead
119
+ %tr
120
+ %th= @sortable.header_link('name', 'Name')
121
+ %th= @sortable.header_link('email', 'Email')
122
+ %th
123
+ %th
124
+ %tbody
125
+ - for user in @users
126
+ %tr
127
+ %td= user.name
128
+ %td= user.email
129
+ %td= link_to "Edit", edit_admin_user_path(user), :class => 'edit_link'
130
+ %td
131
+ - if user.id != current_user.id
132
+ = link_to "Delete", admin_user_path(user), :confirm => t('forms.confirm'), :method => :delete, :class => 'delete_link'
133
+ - else
134
+ That's you!
135
+ = will_paginate @users
136
+ - else
137
+ %p No users
138
+ FILE
139
+ end
140
+
@@ -0,0 +1,29 @@
1
+ create_file 'spec/controllers/admin/users_controller_spec.rb' do
2
+ <<-'FILE'
3
+ require 'spec_helper'
4
+ include Devise::TestHelpers
5
+
6
+ describe Admin::UsersController do
7
+
8
+ before(:each) do
9
+ @user = @user ||=Factory.create(:admin)
10
+ sign_in @user
11
+ end
12
+
13
+ describe "GET 'index'" do
14
+ it "should be successful" do
15
+ get 'index'
16
+ response.should be_success
17
+ end
18
+ end
19
+
20
+ describe "GET 'new'" do
21
+ it "should be successful" do
22
+ get 'new'
23
+ response.should be_success
24
+ end
25
+ end
26
+ end
27
+
28
+ FILE
29
+ end
@@ -0,0 +1,28 @@
1
+ say "Building admin"
2
+ generate(:controller, "admin/dashboard index")
3
+
4
+ inject_into_file 'config/routes.rb', :after => "devise_for :users\n" do
5
+ <<-RUBY
6
+ match 'admin' => 'admin/dashboard#index'
7
+ RUBY
8
+ end
9
+
10
+ # Do layout and SASS stuff
11
+ apply File.expand_path("../admin/sass.rb", __FILE__)
12
+ apply File.expand_path("../admin/layout.rb", __FILE__)
13
+
14
+ create_file 'app/controllers/admin/base_controller.rb' do
15
+ <<-RUBY
16
+ class Admin::BaseController < ApplicationController
17
+ layout 'admin'
18
+ before_filter :authenticate_user!
19
+ end
20
+ RUBY
21
+ end
22
+
23
+ gsub_file 'app/controllers/admin/dashboard_controller.rb', /ApplicationController/, 'Admin::BaseController'
24
+
25
+ # make a user admin
26
+ apply File.expand_path("../admin/users.rb", __FILE__)
27
+ apply File.expand_path("../admin/dashboard_spec.rb", __FILE__)
28
+ apply File.expand_path("../admin/users_spec.rb", __FILE__)
@@ -0,0 +1,71 @@
1
+ run 'mkdir app/views/shared'
2
+
3
+ create_file 'app/views/shared/_header.html.haml' do
4
+ <<-FILE
5
+ %header#main_header
6
+ %h1= link_to '#{app_name.humanize}', root_path
7
+ = render 'shared/messages'
8
+ %nav#main_nav
9
+ %ul
10
+ %li= link_to 'Home', root_path
11
+ FILE
12
+ end
13
+
14
+ create_file 'app/views/shared/_messages.html.haml' do
15
+ <<-FILE
16
+ - if flash[:notice]
17
+ %div#messenger{:class => "flasher"}= flash[:notice]
18
+ - if flash[:error]
19
+ %div#error{:class => "flasher"}= flash[:error]
20
+ FILE
21
+ end
22
+
23
+ create_file 'app/views/shared/_footer.html.haml' do
24
+ <<-FILE
25
+ %footer#main_footer
26
+ %a{:href => "http://quickleft.com"}
27
+ #{app_name.humanize}
28
+ FILE
29
+ end
30
+
31
+ create_file 'app/views/shared/_end_scripts.html.haml' do
32
+ <<-FILE
33
+ = javascript_include_tag :defaults
34
+ FILE
35
+ end
36
+
37
+ run 'rm app/views/layouts/application.html.erb'
38
+ create_file 'app/views/layouts/application.html.haml' do
39
+ <<-FILE
40
+ !!! 5
41
+ %html
42
+ %head
43
+ %meta{'http-equiv' => 'Content-Type', :content => 'text/html; charset=utf-8'}
44
+ %meta{'http-equiv' => 'X-UA-Compatible', :content => 'IE=edge,chrome=1'}
45
+ %title
46
+ #{app_name.humanize}
47
+ = yield(:title)
48
+ %meta{:name => 'description', :content => ''}
49
+ %meta{:name => 'author', :content => ''}
50
+ %meta{:name => 'viewport', :content => 'width=device-width; initial-scale=1.0'}
51
+ = csrf_meta_tag
52
+ %link{:rel => "shortcut icon", :href => "/images/favicon.ico", :type => "image/x-icon"}
53
+ %link{:rel => "apple-touch-icon", :href => "/images/ati.png"}
54
+ /[if lt IE 9]
55
+ %script{:type => "text/javascript", :src => "/javascripts/shiv.js"}
56
+ = stylesheet_link_tag :all
57
+ = yield(:head)
58
+ /[if IE 7]
59
+ = stylesheet_link_tag 'ie7', :media => 'all'
60
+ /[if IE 8]
61
+ = stylesheet_link_tag 'ie8', :media => 'all'
62
+ %body
63
+ #container
64
+ = render :partial => "shared/header"
65
+ %section#content
66
+ = yield
67
+ #pusher
68
+ = render :partial => "shared/footer"
69
+ = render :partial => "shared/end_scripts"
70
+ FILE
71
+ end
@@ -0,0 +1,91 @@
1
+ say "Building Application with Prologue..."
2
+
3
+ append_file '.gitignore' do
4
+ '.DS_Store'
5
+ 'log/*.log'
6
+ 'tmp/**/*'
7
+ 'config/database.yml'
8
+ 'db/*.sqlite3'
9
+ 'public/system/**/**/**/*'
10
+ '.idea/*'
11
+ end
12
+
13
+ git :init
14
+
15
+ # Apply Gemfile
16
+ apply File.expand_path("../gemfile.rb", __FILE__)
17
+
18
+ # Apply Jammit
19
+ apply File.expand_path("../jammit.rb", __FILE__)
20
+
21
+ # Apply HAML generator
22
+ apply File.expand_path("../haml_generator.rb", __FILE__)
23
+
24
+ # Apply rails clean up
25
+ apply File.expand_path("../rails_clean.rb", __FILE__)
26
+
27
+ # Apply js
28
+ apply File.expand_path("../js.rb", __FILE__)
29
+
30
+ # Apply HTML5 Layout
31
+ apply File.expand_path("../application_layout.rb", __FILE__)
32
+
33
+ # Apply SASS
34
+ apply File.expand_path("../sass.rb", __FILE__)
35
+
36
+ # Apply Test Suite
37
+ apply File.expand_path("../test_suite.rb", __FILE__)
38
+
39
+ # Apply Friendly Id
40
+ apply File.expand_path("../friendly_id.rb", __FILE__)
41
+
42
+ # Apply Devise?
43
+ apply File.expand_path("../devise.rb", __FILE__) if ENV['PROLOGUE_AUTH']
44
+
45
+ # Apply sorter helper
46
+ apply File.expand_path("../sorter_lib.rb", __FILE__)
47
+
48
+ # Apply admin
49
+ apply File.expand_path("../admin.rb", __FILE__) if ENV['PROLOGUE_ADMIN']
50
+
51
+ # Apply cancan
52
+ apply File.expand_path("../cancan.rb", __FILE__) if ENV['PROLOGUE_ROLES']
53
+
54
+ # Apply db create and migrations
55
+ apply File.expand_path("../db.rb", __FILE__)
56
+
57
+ # Apply db seeds
58
+ apply File.expand_path("../db_seed.rb", __FILE__)
59
+
60
+ # Make a home controller
61
+ apply File.expand_path("../home_controller.rb", __FILE__)
62
+
63
+ # Clean up generated routes
64
+ apply File.expand_path("../clean_routes.rb", __FILE__)
65
+
66
+ # Remove RSpec stuff we are not gonna use right away
67
+ apply File.expand_path("../rspec_clean.rb", __FILE__)
68
+
69
+ # Make the form errors work like they did in 2.3.8
70
+ apply File.expand_path("../dynamic_form.rb", __FILE__)
71
+
72
+ login_msg = (ENV['PROLOGUE_ADMIN']) ? "Login to admin with email #{ENV['PROLOGUE_USER_EMAIL']} and password #{ENV['PROLOGUE_USER_PASSWORD']}" : ""
73
+
74
+ say <<-D
75
+
76
+
77
+
78
+
79
+ ########################################################################
80
+
81
+ Prologue just added like 6 hours to your life.
82
+
83
+ Next run...
84
+ rake spec
85
+ rake cucumber
86
+ rails s
87
+
88
+ #{login_msg}
89
+
90
+ ########################################################################
91
+ D
@@ -0,0 +1,104 @@
1
+ say "Building roles"
2
+ generate(:model, "role name:string")
3
+ generate(:migration, "UsersHaveAndBelongToManyRoles")
4
+ habtm_roles = Dir['db/migrate/*_users_have_and_belong_to_many_roles.rb'].first
5
+ inject_into_file habtm_roles, :after => "def self.up\n" do
6
+ <<-RUBY
7
+ create_table :roles_users, :id => false do |t|
8
+ t.references :role, :user
9
+ end
10
+ RUBY
11
+ end
12
+
13
+ inject_into_file habtm_roles, :after => "def self.down\n" do
14
+ <<-RUBY
15
+ drop_table :roles_users
16
+ RUBY
17
+ end
18
+
19
+ inject_into_file 'app/models/user.rb', :after => "class User < ActiveRecord::Base\n" do
20
+ <<-RUBY
21
+ has_and_belongs_to_many :roles
22
+ RUBY
23
+ end
24
+
25
+ inject_into_file 'app/models/role.rb', :after => "class Role < ActiveRecord::Base\n" do
26
+ <<-RUBY
27
+ has_and_belongs_to_many :users
28
+ RUBY
29
+ end
30
+
31
+ create_file 'app/models/ability.rb' do
32
+ <<-RUBY
33
+ class Ability
34
+ include CanCan::Ability
35
+
36
+ def initialize(user)
37
+ user ||= User.new # guest user
38
+
39
+ if user.role? :admin
40
+ can :manage, :all
41
+ # elsif user.role? :writter
42
+ # can :manage, [Post, Asset]
43
+ # elsif user.role? :memeber
44
+ # can :read, [MemberPost, Asset]
45
+ # # manage posts, assets user owns
46
+ # can :manage, Post do |p|
47
+ # p.try(:owner) == user
48
+ # end
49
+ # can :manage, Asset do |a|
50
+ # a.try(:owner) == user
51
+ # end
52
+ end
53
+ end
54
+ end
55
+ RUBY
56
+ end
57
+
58
+ inject_into_file 'app/models/user.rb', :before => "end\n" do
59
+ <<-RUBY
60
+
61
+ def role?(role)
62
+ return !!self.roles.find_by_name(role.to_s.camelize)
63
+ end
64
+ RUBY
65
+ end
66
+
67
+ inject_into_file 'app/controllers/application_controller.rb', :before => "end\n" do
68
+ <<-RUBY
69
+
70
+ rescue_from CanCan::AccessDenied do |exception|
71
+ flash[:error] = "Access Denied"
72
+ redirect_to root_url
73
+ end
74
+ RUBY
75
+ end
76
+
77
+ if ENV['PROLOGUE_ADMIN']
78
+ inject_into_file 'app/views/admin/users/_form.html.haml', :after => "= f.password_field :password_confirmation\n" do
79
+ <<-RUBY
80
+ .form_row
81
+ - for role in Role.find(:all, :order => "name")
82
+ .check_box_item
83
+ = check_box_tag "user[role_ids][]", role.id, @user.roles.include?(role)
84
+ = role.name.humanize
85
+ RUBY
86
+ end
87
+ end
88
+
89
+ append_file 'db/seeds.rb' do
90
+ <<-FILE
91
+ Role.create! :name => 'Admin'.camelize
92
+ Role.create! :name => 'Member'.camelize
93
+
94
+ user1 = User.find_by_email('#{ENV['PROLOGUE_USER_EMAIL']}')
95
+ user1.role_ids = [1,2]
96
+ user1.save
97
+ FILE
98
+ end
99
+
100
+
101
+
102
+
103
+
104
+
@@ -0,0 +1,8 @@
1
+ gsub_file 'config/routes.rb', /get \"home\/index\"/, ''
2
+ gsub_file 'config/routes.rb', /get \"users\/index\"/, ''
3
+ gsub_file 'config/routes.rb', /get \"users\/new\"/, ''
4
+ gsub_file 'config/routes.rb', /get \"users\/create\"/, ''
5
+ gsub_file 'config/routes.rb', /get \"users\/edit\"/, ''
6
+ gsub_file 'config/routes.rb', /get \"users\/update\"/, ''
7
+ gsub_file 'config/routes.rb', /get \"users\/destroy\"/, ''
8
+ gsub_file 'config/routes.rb', /get \"dashboard\/index\"/, ''
data/templates/db.rb ADDED
@@ -0,0 +1 @@
1
+ run 'rake db:migrate'
@@ -0,0 +1 @@
1
+ run 'rake db:seed'
@@ -0,0 +1,91 @@
1
+ create_file 'features/authentication.feature' do
2
+ <<-'FILE'
3
+ Feature: User admin authentication
4
+ As an administrator
5
+ I want to manage the application
6
+ So that I can have full control over the site
7
+
8
+ Scenario: Login as an admin
9
+ Given a logged in admin user
10
+ When I am on the admin
11
+ Then I should see "Admin"
12
+ FILE
13
+ end
14
+
15
+ create_file 'spec/factories/user.rb' do
16
+ <<-'FILE'
17
+ Factory.define :user do |u|
18
+ u.sequence(:name) { |n| "Quick #{n}" }
19
+ u.sequence(:email) { |n| "info.#{n}@quickleft.com" }
20
+ u.password "password"
21
+ u.confirmed_at Time.new.to_s
22
+ u.confirmation_sent_at Time.new.to_s
23
+ u.password_confirmation { |u| u.password }
24
+ end
25
+
26
+ Factory.define :admin, :parent => :user do |admin|
27
+ admin.email "quickleft@quickleft.com"
28
+ admin.password "password"
29
+ admin.roles { [ Factory(:role, :name => 'admin') ] }
30
+ end
31
+
32
+ Factory.define :member, :parent => :user do |member|
33
+ member.email "member@quickleft.com"
34
+ member.password "password"
35
+ member.roles { [ Factory(:role, :name => 'member') ] }
36
+ end
37
+
38
+ Factory.define :role do |role|
39
+ role.sequence(:name) { |n| "Quick #{n}".camelize }
40
+ end
41
+ FILE
42
+ end
43
+
44
+ create_file 'features/step_definitions/devise_steps.rb' do
45
+ <<-'FILE'
46
+ When /^I log in as "([^\"]*)" with password "([^\"]*)"$/ do |email, password|
47
+ visit(new_user_session_path)
48
+ fill_in("user[email]", :with => email)
49
+ fill_in("user[password]", :with => password)
50
+ click_button("Sign in")
51
+ end
52
+
53
+ Given /^a logged in admin user$/ do
54
+ Factory.create(:admin)
55
+ visit(new_user_session_path)
56
+ fill_in("user[email]", :with => "quickleft@quickleft.com")
57
+ fill_in("user[password]", :with => "password")
58
+ click_button("Sign in")
59
+ end
60
+
61
+ Given /^a logged in member user$/ do
62
+ Factory.create(:member)
63
+ visit(new_user_session_path)
64
+ fill_in("user[email]", :with => "member@quickleft.com")
65
+ fill_in("user[password]", :with => "password")
66
+ click_button("Sign in")
67
+ end
68
+
69
+ When /^I log out$/ do
70
+ visit(destroy_user_session_path)
71
+ end
72
+
73
+ Given /^a user "([^\"]*)"$/ do |email|
74
+ Factory.create(:user, :email => email)
75
+ end
76
+ FILE
77
+ end
78
+
79
+ inject_into_file 'features/support/paths.rb', :after => "case page_name\n" do
80
+ <<-'FILE'
81
+
82
+ when /the admin/
83
+ '/admin'
84
+
85
+ when /logout/
86
+ '/users/sign_out'
87
+
88
+ when /login/
89
+ '/users/sign_in'
90
+ FILE
91
+ end
@@ -0,0 +1,94 @@
1
+ say "Building authentication"
2
+ gsub_file 'config/application.rb', /:password/, ':password, :password_confirmation'
3
+
4
+ run 'rails generate devise:install'
5
+ run 'rails generate devise:views'
6
+
7
+ gsub_file 'config/environments/development.rb', /# Don't care if the mailer can't send/, '### ActionMailer Config'
8
+
9
+ gsub_file 'config/environments/development.rb', /config.action_mailer.raise_delivery_errors = false/ do
10
+ <<-RUBY
11
+ config.action_mailer.default_url_options = { :host => '0.0.0.0:3000' }
12
+ # A dummy setup for development - no deliveries, but logged
13
+ config.action_mailer.delivery_method = :smtp
14
+ config.action_mailer.perform_deliveries = false
15
+ config.action_mailer.raise_delivery_errors = true
16
+ config.action_mailer.default :charset => "utf-8"
17
+ RUBY
18
+ end
19
+
20
+ inject_into_file 'config/environments/test.rb', :after => "config.action_controller.allow_forgery_protection = false\n" do
21
+ <<-RUBY
22
+ config.action_mailer.default_url_options = { :host => '0.0.0.0:3000' }
23
+ RUBY
24
+ end
25
+
26
+ gsub_file 'config/environments/production.rb', /config.i18n.fallbacks = true/ do
27
+ <<-RUBY
28
+ config.i18n.fallbacks = true
29
+ config.action_mailer.default_url_options = { :host => 'yourhost.com' }
30
+ ### ActionMailer Config
31
+ # Setup for production - deliveries, no errors raised
32
+ config.action_mailer.delivery_method = :smtp
33
+ config.action_mailer.perform_deliveries = true
34
+ config.action_mailer.raise_delivery_errors = false
35
+ config.action_mailer.default :charset => "utf-8"
36
+ RUBY
37
+ end
38
+
39
+ run 'rails generate devise User'
40
+ run 'rm app/models/user.rb'
41
+
42
+ create_file 'app/models/user.rb' do
43
+ <<-RUBY
44
+ class User < ActiveRecord::Base
45
+ devise :database_authenticatable, :token_authenticatable, :recoverable, :rememberable, :trackable, :validatable, :confirmable
46
+ validates_presence_of :name
47
+ validates_uniqueness_of :name, :email, :case_sensitive => false
48
+ attr_accessible :name, :email, :password, :password_confirmation, :remember_me
49
+ has_friendly_id :name, :use_slug => true, :strip_non_ascii => true
50
+ end
51
+ RUBY
52
+ end
53
+
54
+ generate(:migration, "AddNameToUsers name:string")
55
+ generate(:migration, "AddCachedSlugToUsers cached_slug:string")
56
+
57
+ create_file 'app/views/devise/menu/_login_items.html.haml' do
58
+ <<-'FILE'
59
+ - if user_signed_in?
60
+ %li
61
+ = link_to('Logout', destroy_user_session_path)
62
+ - else
63
+ %li
64
+ = link_to('Login', new_user_session_path)
65
+ %li
66
+ User:
67
+ - if current_user
68
+ = current_user.name
69
+ - else
70
+ (not logged in)
71
+ FILE
72
+ end
73
+
74
+ append_file 'app/views/shared/_header.html.haml' do
75
+ <<-'FILE'
76
+ %ul#user_nav
77
+ = render 'devise/menu/login_items'
78
+ FILE
79
+ end
80
+
81
+ devise_migration = Dir['db/migrate/*_devise_create_users.rb'].first
82
+
83
+ gsub_file devise_migration, /# t.confirmable/, 't.confirmable'
84
+ gsub_file devise_migration, /# t.token_authenticatable/, 't.token_authenticatable'
85
+ gsub_file devise_migration, /# add_index :users, :confirmation_token, :unique => true/, 'add_index :users, :confirmation_token, :unique => true'
86
+
87
+ append_file 'db/seeds.rb' do
88
+ <<-FILE
89
+ User.create! :name => '#{ENV['PROLOGUE_USER_NAME']}', :email => '#{ENV['PROLOGUE_USER_EMAIL']}', :password => '#{ENV['PROLOGUE_USER_PASSWORD']}', :password_confirmation => '#{ENV['PROLOGUE_USER_PASSWORD']}'
90
+ FILE
91
+ end
92
+
93
+ # make cukes and websteps for devise
94
+ apply File.expand_path("../devise/cucumber.rb", __FILE__)
@@ -0,0 +1 @@
1
+ run 'rails plugin install git://github.com/rails/dynamic_form.git'
@@ -0,0 +1 @@
1
+ run 'rails generate friendly_id'