rails_apps_composer 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.textile +313 -0
- data/bin/rails_apps_composer +7 -0
- data/lib/rails_wizard.rb +10 -0
- data/lib/rails_wizard/command.rb +79 -0
- data/lib/rails_wizard/config.rb +86 -0
- data/lib/rails_wizard/recipe.rb +106 -0
- data/lib/rails_wizard/recipes.rb +38 -0
- data/lib/rails_wizard/template.rb +58 -0
- data/recipes/action_mailer.rb +41 -0
- data/recipes/activerecord.rb +37 -0
- data/recipes/add_user.rb +87 -0
- data/recipes/add_user_name.rb +74 -0
- data/recipes/application_layout.rb +45 -0
- data/recipes/ban_spiders.rb +27 -0
- data/recipes/capybara.rb +34 -0
- data/recipes/cleanup.rb +36 -0
- data/recipes/css_setup.rb +42 -0
- data/recipes/cucumber.rb +62 -0
- data/recipes/devise.rb +76 -0
- data/recipes/devise_navigation.rb +93 -0
- data/recipes/env_yaml.rb +54 -0
- data/recipes/git.rb +38 -0
- data/recipes/haml.rb +23 -0
- data/recipes/heroku.rb +58 -0
- data/recipes/home_page.rb +45 -0
- data/recipes/home_page_users.rb +47 -0
- data/recipes/hoptoad.rb +34 -0
- data/recipes/jammit.rb +43 -0
- data/recipes/jquery.rb +70 -0
- data/recipes/less.rb +12 -0
- data/recipes/mongo_mapper.rb +18 -0
- data/recipes/mongohq.rb +59 -0
- data/recipes/mongoid.rb +39 -0
- data/recipes/mootools.rb +23 -0
- data/recipes/navigation.rb +68 -0
- data/recipes/omniauth.rb +152 -0
- data/recipes/omniauth_email.rb +82 -0
- data/recipes/pow.rb +12 -0
- data/recipes/prototype.rb +11 -0
- data/recipes/rails_admin.rb +21 -0
- data/recipes/redis.rb +17 -0
- data/recipes/redistogo.rb +40 -0
- data/recipes/rightjs.rb +17 -0
- data/recipes/rspec.rb +112 -0
- data/recipes/sass.rb +13 -0
- data/recipes/seed_database.rb +42 -0
- data/recipes/sequel.rb +13 -0
- data/recipes/settingslogic.rb +43 -0
- data/recipes/slim.rb +11 -0
- data/recipes/test_unit.rb +11 -0
- data/recipes/users_page.rb +103 -0
- data/spec/rails_wizard/config_spec.rb +99 -0
- data/spec/rails_wizard/recipe_spec.rb +103 -0
- data/spec/rails_wizard/recipes/sanity_spec.rb +30 -0
- data/spec/rails_wizard/recipes_spec.rb +24 -0
- data/spec/rails_wizard/template_spec.rb +48 -0
- data/spec/spec_helper.rb +11 -0
- data/spec/support/rails_directory.rb +17 -0
- data/spec/support/template_runner.rb +28 -0
- data/templates/helpers.erb +45 -0
- data/templates/layout.erb +69 -0
- data/templates/recipe.erb +10 -0
- data/version.rb +3 -0
- metadata +206 -0
data/recipes/mongoid.rb
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
# Application template recipe for the rails_apps_composer. Check for a newer version here:
|
2
|
+
# https://github.com/fortuity/rails_apps_composer/blob/master/recipes/mongoid.rb
|
3
|
+
|
4
|
+
if config['mongoid']
|
5
|
+
say_wizard "REMINDER: When creating a Rails app using Mongoid..."
|
6
|
+
say_wizard "you should add the '-O' flag to 'rails new'"
|
7
|
+
gem 'bson_ext', '>= 1.3.0'
|
8
|
+
gem 'mongoid', '>= 2.0.1'
|
9
|
+
else
|
10
|
+
recipes.delete('mongoid')
|
11
|
+
end
|
12
|
+
|
13
|
+
if config['mongoid']
|
14
|
+
after_bundler do
|
15
|
+
say_wizard "Mongoid recipe running 'after bundler'"
|
16
|
+
# note: the mongoid generator automatically modifies the config/application.rb file
|
17
|
+
# to remove the ActiveRecord dependency by commenting out "require active_record/railtie'"
|
18
|
+
generate 'mongoid:config'
|
19
|
+
# remove the unnecessary 'config/database.yml' file
|
20
|
+
remove_file 'config/database.yml'
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
__END__
|
25
|
+
|
26
|
+
name: Mongoid
|
27
|
+
description: "Use Mongoid to connect to a MongoDB database."
|
28
|
+
author: fortuity
|
29
|
+
|
30
|
+
category: persistence
|
31
|
+
exclusive: orm
|
32
|
+
tags: [orm, mongodb]
|
33
|
+
|
34
|
+
args: ["-O"]
|
35
|
+
|
36
|
+
config:
|
37
|
+
- mongoid:
|
38
|
+
type: boolean
|
39
|
+
prompt: Would you like to use Mongoid to connect to a MongoDB database?
|
data/recipes/mootools.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
inside "public/javascripts" do
|
2
|
+
get "https://github.com/kevinvaldek/mootools-ujs/raw/master/Source/rails.js", "rails.js"
|
3
|
+
get "http://ajax.googleapis.com/ajax/libs/mootools/1.3.1/mootools-yui-compressed.js", "mootools.min.js"
|
4
|
+
end
|
5
|
+
|
6
|
+
gsub_file "config/application.rb", /# JavaScript.*\n/, ""
|
7
|
+
gsub_file "config/application.rb", /# config\.action_view\.javascript.*\n/, ""
|
8
|
+
|
9
|
+
application do
|
10
|
+
"\n config.action_view.javascript_expansions[:defaults] = %w(mootools.min rails)\n"
|
11
|
+
end
|
12
|
+
|
13
|
+
__END__
|
14
|
+
|
15
|
+
name: MooTools
|
16
|
+
description: "Adds MooTools and MooTools-compatible UJS helpers."
|
17
|
+
author: mbleigh
|
18
|
+
|
19
|
+
exclusive: javascript_framework
|
20
|
+
category: assets
|
21
|
+
tags: [javascript, framework]
|
22
|
+
|
23
|
+
args: ["-J"]
|
@@ -0,0 +1,68 @@
|
|
1
|
+
# Application template recipe for the rails_apps_composer. Check for a newer version here:
|
2
|
+
# https://github.com/fortuity/rails_apps_composer/blob/master/recipes/navigation.rb
|
3
|
+
|
4
|
+
after_bundler do
|
5
|
+
|
6
|
+
say_wizard "Navigation recipe running 'after bundler'"
|
7
|
+
|
8
|
+
# Create navigation links
|
9
|
+
if recipes.include? 'haml'
|
10
|
+
# There is Haml code in this script. Changing the indentation is perilous between HAMLs.
|
11
|
+
# We have to use single-quote-style-heredoc to avoid interpolation.
|
12
|
+
create_file "app/views/shared/_navigation.html.haml" do <<-'HAML'
|
13
|
+
- if user_signed_in?
|
14
|
+
%li
|
15
|
+
Logged in as #{current_user.name}
|
16
|
+
%li
|
17
|
+
= link_to('Logout', signout_path)
|
18
|
+
- else
|
19
|
+
%li
|
20
|
+
= link_to('Login', signin_path)
|
21
|
+
HAML
|
22
|
+
end
|
23
|
+
else
|
24
|
+
create_file "app/views/shared/_navigation.html.erb" do <<-ERB
|
25
|
+
<% if user_signed_in? %>
|
26
|
+
<li>
|
27
|
+
Logged in as <%= current_user.name %>
|
28
|
+
</li>
|
29
|
+
<li>
|
30
|
+
<%= link_to('Logout', signout_path) %>
|
31
|
+
</li>
|
32
|
+
<% else %>
|
33
|
+
<li>
|
34
|
+
<%= link_to('Login', signin_path) %>
|
35
|
+
</li>
|
36
|
+
<% end %>
|
37
|
+
ERB
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# Add navigation links to the default application layout
|
42
|
+
if recipes.include? 'haml'
|
43
|
+
# There is Haml code in this script. Changing the indentation is perilous between HAMLs.
|
44
|
+
inject_into_file 'app/views/layouts/application.html.haml', :after => "%body\n" do <<-HAML
|
45
|
+
%ul.hmenu
|
46
|
+
= render 'shared/navigation'
|
47
|
+
HAML
|
48
|
+
end
|
49
|
+
else
|
50
|
+
inject_into_file 'app/views/layouts/application.html.erb', :after => "<body>\n" do
|
51
|
+
<<-ERB
|
52
|
+
<ul class="hmenu">
|
53
|
+
<%= render 'shared/navigation' %>
|
54
|
+
</ul>
|
55
|
+
ERB
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
__END__
|
62
|
+
|
63
|
+
name: Navigation
|
64
|
+
description: "Add navigation links."
|
65
|
+
author: fortuity
|
66
|
+
|
67
|
+
category: other
|
68
|
+
tags: [utilities, configuration]
|
data/recipes/omniauth.rb
ADDED
@@ -0,0 +1,152 @@
|
|
1
|
+
# Application template recipe for the rails_apps_composer. Check for a newer version here:
|
2
|
+
# https://github.com/fortuity/rails_apps_composer/blob/master/recipes/omniauth.rb
|
3
|
+
|
4
|
+
if config['omniauth']
|
5
|
+
gem 'omniauth', '>= 0.2.4'
|
6
|
+
else
|
7
|
+
recipes.delete('omniauth')
|
8
|
+
end
|
9
|
+
|
10
|
+
if config['omniauth']
|
11
|
+
after_bundler do
|
12
|
+
|
13
|
+
# Don't use single-quote-style-heredoc: we want interpolation.
|
14
|
+
create_file 'config/initializers/omniauth.rb' do <<-RUBY
|
15
|
+
Rails.application.config.middleware.use OmniAuth::Builder do
|
16
|
+
provider :#{config['provider']}, 'KEY', 'SECRET'
|
17
|
+
end
|
18
|
+
RUBY
|
19
|
+
end
|
20
|
+
|
21
|
+
# add routes
|
22
|
+
route "match '/auth/failure' => 'sessions#failure'"
|
23
|
+
route "match '/signout' => 'sessions#destroy', :as => :signout"
|
24
|
+
route "match '/signin' => 'sessions#new', :as => :signin"
|
25
|
+
route "match '/auth/:provider/callback' => 'sessions#create'"
|
26
|
+
route "resources :users, :only => [ :show, :edit, :update ]"
|
27
|
+
|
28
|
+
# add a user model (unless another recipe did so already)
|
29
|
+
unless recipes.include? 'add_user'
|
30
|
+
generate(:model, "user provider:string uid:string name:string email:string")
|
31
|
+
gsub_file 'app/models/user.rb', /end/ do
|
32
|
+
<<-RUBY
|
33
|
+
attr_accessible :provider, :uid, :name, :email
|
34
|
+
end
|
35
|
+
RUBY
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
# modify the user model
|
40
|
+
inject_into_file 'app/models/user.rb', :before => 'end' do <<-RUBY
|
41
|
+
|
42
|
+
def self.create_with_omniauth(auth)
|
43
|
+
begin
|
44
|
+
create! do |user|
|
45
|
+
user.provider = auth['provider']
|
46
|
+
user.uid = auth['uid']
|
47
|
+
if auth['user_info']
|
48
|
+
user.name = auth['user_info']['name'] if auth['user_info']['name'] # Twitter, Google, Yahoo, GitHub
|
49
|
+
user.email = auth['user_info']['email'] if auth['user_info']['email'] # Google, Yahoo, GitHub
|
50
|
+
end
|
51
|
+
if auth['extra']['user_hash']
|
52
|
+
user.name = auth['extra']['user_hash']['name'] if auth['extra']['user_hash']['name'] # Facebook
|
53
|
+
user.email = auth['extra']['user_hash']['email'] if auth['extra']['user_hash']['email'] # Facebook
|
54
|
+
end
|
55
|
+
end
|
56
|
+
rescue Exception
|
57
|
+
raise Exception, "cannot create user record"
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
RUBY
|
62
|
+
end
|
63
|
+
|
64
|
+
# We have to use single-quote-style-heredoc to avoid interpolation.
|
65
|
+
create_file 'app/controllers/sessions_controller.rb' do <<-'RUBY'
|
66
|
+
class SessionsController < ApplicationController
|
67
|
+
|
68
|
+
def create
|
69
|
+
auth = request.env["omniauth.auth"]
|
70
|
+
user = User.where(:provider => auth['provider'],
|
71
|
+
:uid => auth['uid']).first || User.create_with_omniauth(auth)
|
72
|
+
session[:user_id] = user.id
|
73
|
+
redirect_to root_url, :notice => 'Signed in!'
|
74
|
+
end
|
75
|
+
|
76
|
+
def destroy
|
77
|
+
session[:user_id] = nil
|
78
|
+
redirect_to root_url, :notice => 'Signed out!'
|
79
|
+
end
|
80
|
+
|
81
|
+
def failure
|
82
|
+
redirect_to root_url, :alert => "Authentication error: #{params[:message].humanize}"
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
86
|
+
RUBY
|
87
|
+
end
|
88
|
+
|
89
|
+
# Don't use single-quote-style-heredoc: we want interpolation.
|
90
|
+
inject_into_class 'app/controllers/sessions_controller.rb', 'SessionsController' do <<-RUBY
|
91
|
+
|
92
|
+
def new
|
93
|
+
redirect_to '/auth/#{config['provider']}'
|
94
|
+
end
|
95
|
+
|
96
|
+
RUBY
|
97
|
+
end
|
98
|
+
|
99
|
+
inject_into_file 'app/controllers/application_controller.rb', :before => 'end' do <<-RUBY
|
100
|
+
helper_method :current_user
|
101
|
+
helper_method :user_signed_in?
|
102
|
+
helper_method :correct_user?
|
103
|
+
|
104
|
+
private
|
105
|
+
def current_user
|
106
|
+
begin
|
107
|
+
@current_user ||= User.find(session[:user_id]) if session[:user_id]
|
108
|
+
rescue Mongoid::Errors::DocumentNotFound
|
109
|
+
nil
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def user_signed_in?
|
114
|
+
return true if current_user
|
115
|
+
end
|
116
|
+
|
117
|
+
def correct_user?
|
118
|
+
@user = User.find(params[:id])
|
119
|
+
unless current_user == @user
|
120
|
+
redirect_to root_url, :alert => "Access denied."
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
def authenticate_user!
|
125
|
+
if !current_user
|
126
|
+
redirect_to root_url, :alert => 'You need to sign in for access to this page.'
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
RUBY
|
131
|
+
end
|
132
|
+
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
__END__
|
137
|
+
|
138
|
+
name: OmniAuth
|
139
|
+
description: "Utilize OmniAuth for authentication."
|
140
|
+
author: fortuity
|
141
|
+
|
142
|
+
exclusive: authentication
|
143
|
+
category: authentication
|
144
|
+
|
145
|
+
config:
|
146
|
+
- omniauth:
|
147
|
+
type: boolean
|
148
|
+
prompt: Would you like to use OmniAuth for authentication?
|
149
|
+
- provider:
|
150
|
+
type: multiple_choice
|
151
|
+
prompt: "Which service provider will you use?"
|
152
|
+
choices: [["Twitter", twitter], ["Facebook", facebook], ["GitHub", github], ["LinkedIn", linked_in], ["Other", provider]]
|
@@ -0,0 +1,82 @@
|
|
1
|
+
# Application template recipe for the rails_apps_composer. Check for a newer version here:
|
2
|
+
# https://github.com/fortuity/rails_apps_composer/blob/master/recipes/omniauth_email.rb
|
3
|
+
|
4
|
+
after_bundler do
|
5
|
+
|
6
|
+
say_wizard "OmniAuthEmail recipe running 'after bundler'"
|
7
|
+
|
8
|
+
#----------------------------------------------------------------------------
|
9
|
+
# Modify a users controller
|
10
|
+
#----------------------------------------------------------------------------
|
11
|
+
inject_into_file 'app/controllers/users_controller.rb', :after => "before_filter :authenticate_user!\n" do <<-RUBY
|
12
|
+
before_filter :correct_user?
|
13
|
+
RUBY
|
14
|
+
end
|
15
|
+
|
16
|
+
inject_into_file 'app/controllers/users_controller.rb', :before => 'def show' do <<-RUBY
|
17
|
+
def edit
|
18
|
+
@user = User.find(params[:id])
|
19
|
+
end
|
20
|
+
|
21
|
+
def update
|
22
|
+
@user = User.find(params[:id])
|
23
|
+
if @user.update_attributes(params[:user])
|
24
|
+
redirect_to @user
|
25
|
+
else
|
26
|
+
render :edit
|
27
|
+
end
|
28
|
+
end
|
29
|
+
\n
|
30
|
+
RUBY
|
31
|
+
end
|
32
|
+
|
33
|
+
#----------------------------------------------------------------------------
|
34
|
+
# Create a users edit page
|
35
|
+
#----------------------------------------------------------------------------
|
36
|
+
if recipes.include? 'haml'
|
37
|
+
remove_file 'app/views/users/edit.html.haml'
|
38
|
+
# There is Haml code in this script. Changing the indentation is perilous between HAMLs.
|
39
|
+
# We have to use single-quote-style-heredoc to avoid interpolation.
|
40
|
+
create_file 'app/views/users/edit.html.haml' do <<-'HAML'
|
41
|
+
= form_for(@user) do |f|
|
42
|
+
= f.label :email
|
43
|
+
= f.text_field :email
|
44
|
+
%br/
|
45
|
+
= f.submit "Sign in"
|
46
|
+
HAML
|
47
|
+
end
|
48
|
+
else
|
49
|
+
create_file 'app/views/users/edit.html.erb' do <<-ERB
|
50
|
+
<%= form_for(@user) do |f| %>
|
51
|
+
<%= f.label :email %>
|
52
|
+
<%= f.text_field :email %>
|
53
|
+
<br />
|
54
|
+
<%= f.submit "Sign in" %>
|
55
|
+
<% end %>
|
56
|
+
ERB
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
#----------------------------------------------------------------------------
|
61
|
+
# Modify a Sessions controller
|
62
|
+
#----------------------------------------------------------------------------
|
63
|
+
gsub_file 'app/controllers/sessions_controller.rb', /redirect_to root_url, :notice => 'Signed in!'/ do
|
64
|
+
<<-RUBY
|
65
|
+
if !user.email
|
66
|
+
redirect_to edit_user_path(user), :alert => "Please enter your email address."
|
67
|
+
else
|
68
|
+
redirect_to root_url, :notice => 'Signed in!'
|
69
|
+
end
|
70
|
+
RUBY
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
__END__
|
76
|
+
|
77
|
+
name: OmniAuthEmail
|
78
|
+
description: "Request a user's email address for an OmniAuth example app."
|
79
|
+
author: fortuity
|
80
|
+
|
81
|
+
category: other
|
82
|
+
tags: [utilities, configuration]
|
data/recipes/pow.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
gem 'rails_admin', :git => 'git://github.com/sferik/rails_admin.git'
|
2
|
+
|
3
|
+
after_bundler do
|
4
|
+
generate 'rails_admin:install_admin'
|
5
|
+
rake 'admin:copy_assets'
|
6
|
+
rake 'admin:ckeditor_download' if config['ckeditor']
|
7
|
+
end
|
8
|
+
|
9
|
+
__END__
|
10
|
+
|
11
|
+
name: RailsAdmin
|
12
|
+
description: "Install RailsAdmin to manage data in your application"
|
13
|
+
author: alno
|
14
|
+
|
15
|
+
category: other
|
16
|
+
|
17
|
+
config:
|
18
|
+
- ckeditor:
|
19
|
+
type: boolean
|
20
|
+
prompt: Install CKEditor?
|
21
|
+
|
data/recipes/redis.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
gem 'redis'
|
2
|
+
|
3
|
+
say_wizard "Generating Redis initializer..."
|
4
|
+
|
5
|
+
initializer "redis.rb", <<-RUBY
|
6
|
+
REDIS = Redis.new
|
7
|
+
RUBY
|
8
|
+
|
9
|
+
__END__
|
10
|
+
|
11
|
+
name: Redis
|
12
|
+
description: "Add Redis as a persistence engine to your application."
|
13
|
+
author: mbleigh
|
14
|
+
|
15
|
+
exclusive: key_value
|
16
|
+
category: persistence
|
17
|
+
tags: [key_value, cache, session_store]
|
@@ -0,0 +1,40 @@
|
|
1
|
+
prepend_file "config/initializers/redis.rb", <<-RUBY
|
2
|
+
uri = URI.parse(ENV['REDISTOGO_URL'])
|
3
|
+
|
4
|
+
RUBY
|
5
|
+
|
6
|
+
inject_into_file "config/initializers/redis.rb", :after => "Redis.new" do
|
7
|
+
"(:host => uri.host, :port => uri.port, :password => uri.password)"
|
8
|
+
end
|
9
|
+
|
10
|
+
env("REDISTOGO_URL", "redis://localhost:6379")
|
11
|
+
|
12
|
+
after_everything do
|
13
|
+
if config['use_heroku']
|
14
|
+
say_wizard "Adding redistogo:nano Heroku addon, you can always upgrade later."
|
15
|
+
run "heroku addons:add redistogo:nano"
|
16
|
+
else
|
17
|
+
env("REDISTOGO_URL", config['url'], 'production') if config['url']
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
__END__
|
22
|
+
|
23
|
+
name: RedisToGo
|
24
|
+
description: "Use RedisToGo hosting for this app's Redis."
|
25
|
+
author: mbleigh
|
26
|
+
|
27
|
+
requires: [redis, env_yaml]
|
28
|
+
run_after: [redis, env_yaml]
|
29
|
+
category: services
|
30
|
+
|
31
|
+
config:
|
32
|
+
- use_heroku:
|
33
|
+
type: boolean
|
34
|
+
prompt: "Use the RedisToGo Heroku addon?"
|
35
|
+
if_recipe: heroku
|
36
|
+
- url:
|
37
|
+
type: string
|
38
|
+
prompt: "Enter your RedisToGo URL:"
|
39
|
+
unless: use_heroku
|
40
|
+
|