redmint_composer 2.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.textile +10 -0
- data/bin/redmint_composer +7 -0
- data/lib/rails_wizard.rb +7 -0
- data/lib/rails_wizard/command.rb +204 -0
- data/lib/rails_wizard/config.rb +88 -0
- data/lib/rails_wizard/diagnostics.rb +58 -0
- data/lib/rails_wizard/recipe.rb +114 -0
- data/lib/rails_wizard/recipes.rb +56 -0
- data/lib/rails_wizard/template.rb +111 -0
- data/recipes/admin.rb +42 -0
- data/recipes/analytics.rb +41 -0
- data/recipes/core.rb +32 -0
- data/recipes/deployment.rb +178 -0
- data/recipes/devise.rb +34 -0
- data/recipes/email.rb +65 -0
- data/recipes/email_dev.rb +92 -0
- data/recipes/example.rb +63 -0
- data/recipes/extras.rb +283 -0
- data/recipes/frontend.rb +33 -0
- data/recipes/gems.rb +274 -0
- data/recipes/git.rb +27 -0
- data/recipes/init.rb +179 -0
- data/recipes/learn_rails.rb +89 -0
- data/recipes/locale.rb +31 -0
- data/recipes/omniauth.rb +38 -0
- data/recipes/pages.rb +91 -0
- data/recipes/rails_bootstrap.rb +29 -0
- data/recipes/rails_devise.rb +26 -0
- data/recipes/rails_devise_pundit.rb +25 -0
- data/recipes/rails_devise_roles.rb +25 -0
- data/recipes/rails_foundation.rb +29 -0
- data/recipes/rails_mailinglist_activejob.rb +76 -0
- data/recipes/rails_omniauth.rb +27 -0
- data/recipes/rails_signup_download.rb +69 -0
- data/recipes/rails_stripe_checkout.rb +84 -0
- data/recipes/rails_stripe_coupons.rb +125 -0
- data/recipes/rails_stripe_membership_saas.rb +112 -0
- data/recipes/railsapps.rb +77 -0
- data/recipes/readme.rb +161 -0
- data/recipes/roles.rb +40 -0
- data/recipes/setup.rb +162 -0
- data/recipes/tests.rb +59 -0
- data/spec/rails_wizard/config_spec.rb +108 -0
- data/spec/rails_wizard/recipe_spec.rb +115 -0
- data/spec/rails_wizard/recipes/sanity_spec.rb +30 -0
- data/spec/rails_wizard/recipes_spec.rb +41 -0
- data/spec/rails_wizard/template_spec.rb +92 -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/spec/test_recipes/test_recipe_in_file.rb +9 -0
- data/templates/helpers.erb +138 -0
- data/templates/layout.erb +231 -0
- data/templates/recipe.erb +13 -0
- data/version.rb +3 -0
- metadata +201 -0
@@ -0,0 +1,56 @@
|
|
1
|
+
module RailsWizard
|
2
|
+
module Recipes
|
3
|
+
@@categories = {}
|
4
|
+
@@list = {}
|
5
|
+
|
6
|
+
def self.add(recipe)
|
7
|
+
RailsWizard::Recipes.const_set ActiveSupport::Inflector.camelize(recipe.key), recipe
|
8
|
+
@@list[recipe.key] = recipe
|
9
|
+
(@@categories[recipe.category.to_s] ||= []) << recipe.key
|
10
|
+
@@categories[recipe.category.to_s].uniq!
|
11
|
+
recipe
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.clear
|
15
|
+
self.list.each do |recipe_key|
|
16
|
+
send(:remove_const, ActiveSupport::Inflector.camelize(recipe_key))
|
17
|
+
end
|
18
|
+
@@categories = {}
|
19
|
+
@@list = {}
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.[](key)
|
23
|
+
@@list[key.to_s]
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.list
|
27
|
+
@@list.keys.sort
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.list_classes
|
31
|
+
@@list.values.sort_by{|c| c.key}
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.categories
|
35
|
+
@@categories.keys.sort
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.for(category)
|
39
|
+
(@@categories[category.to_s] || []).sort
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.remove_from_category(category, recipe)
|
43
|
+
(@@categories[category.to_s] ||= []).delete(recipe.key)
|
44
|
+
end
|
45
|
+
|
46
|
+
def self.add_from_directory(directory)
|
47
|
+
Dir.foreach(directory) do |file|
|
48
|
+
path = File.join(directory, file)
|
49
|
+
next unless path.match /\.rb$/
|
50
|
+
key = File.basename(path, '.rb')
|
51
|
+
recipe = Recipe.generate(key, File.open(path))
|
52
|
+
add(recipe)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
module RailsWizard
|
2
|
+
class Template
|
3
|
+
attr_reader :recipes, :gems, :args, :defaults
|
4
|
+
|
5
|
+
def initialize(recipes, gems=[], args=[], defaults={})
|
6
|
+
@recipes = recipes.map{|r| RailsWizard::Recipe.from_mongo(r)}
|
7
|
+
@args = args
|
8
|
+
@defaults = defaults
|
9
|
+
unless defaults['prefs'].nil?
|
10
|
+
@prefs = defaults['prefs']
|
11
|
+
else
|
12
|
+
@prefs = {}
|
13
|
+
end
|
14
|
+
unless defaults['gems'].nil?
|
15
|
+
@gems = gems | defaults['gems']
|
16
|
+
else
|
17
|
+
@gems = gems
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.template_root
|
22
|
+
@template_root ||= File.dirname(__FILE__) + '/../../templates'
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.template_root=(root)
|
26
|
+
@template_root = root
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.render(template_name, binding = nil)
|
30
|
+
erb = ERB.new(File.open(template_root + '/' + template_name + '.erb').read)
|
31
|
+
erb.result(binding)
|
32
|
+
end
|
33
|
+
def render(template_name, binding = nil); self.class.render(template_name, binding) end
|
34
|
+
|
35
|
+
def resolve_preferences
|
36
|
+
@resolve_preferences ||= begin
|
37
|
+
@prefs.inspect
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def resolve_gems
|
42
|
+
@resolve_gems ||= begin
|
43
|
+
@gems.uniq.inspect
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def resolve_diagnostics_recipes
|
48
|
+
@resolve_diagnostics_recipes ||= begin
|
49
|
+
RailsWizard::Diagnostics.recipes.inspect
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def resolve_diagnostics_prefs
|
54
|
+
@resolve_diagnostics_prefs ||= begin
|
55
|
+
RailsWizard::Diagnostics.prefs.inspect
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
# Sort the recipes list taking 'run_after' directives into account.
|
60
|
+
def resolve_recipes
|
61
|
+
@resolve_recipes ||= begin
|
62
|
+
list = recipes_with_dependencies
|
63
|
+
|
64
|
+
for i in 0...list.size
|
65
|
+
after_keys = list[i+1..-1].map { |r| r.key }
|
66
|
+
|
67
|
+
if (list[i].run_after & after_keys).any?
|
68
|
+
list.push list.slice!(i)
|
69
|
+
redo
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
list.each {|recipe| recipe.defaults = defaults[recipe.key] }
|
74
|
+
list
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def recipe_classes
|
79
|
+
@recipe_classes ||= recipes.map{|r| RailsWizard::Recipe.from_mongo(r)}
|
80
|
+
end
|
81
|
+
|
82
|
+
def recipes_with_dependencies
|
83
|
+
@recipes_with_dependencies ||= recipe_classes
|
84
|
+
|
85
|
+
added_more = false
|
86
|
+
for recipe in recipe_classes
|
87
|
+
recipe.requires.each do |requirement|
|
88
|
+
requirement = RailsWizard::Recipe.from_mongo(requirement)
|
89
|
+
count = @recipes_with_dependencies.size
|
90
|
+
(@recipes_with_dependencies << requirement).uniq!
|
91
|
+
unless @recipes_with_dependencies.size == count
|
92
|
+
added_more = true
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
added_more ? recipes_with_dependencies : @recipes_with_dependencies
|
98
|
+
end
|
99
|
+
|
100
|
+
def compile
|
101
|
+
render 'layout', binding
|
102
|
+
end
|
103
|
+
|
104
|
+
def args
|
105
|
+
recipes.map(&:args).uniq
|
106
|
+
end
|
107
|
+
|
108
|
+
def custom_code?; false end
|
109
|
+
def custom_code; nil end
|
110
|
+
end
|
111
|
+
end
|
data/recipes/admin.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
# Application template recipe for the rails_apps_composer. Change the recipe here:
|
2
|
+
# https://github.com/RailsApps/rails_apps_composer/blob/master/recipes/admin.rb
|
3
|
+
|
4
|
+
prefs[:admin] = config['admin'] unless config['admin'] == 'none'
|
5
|
+
|
6
|
+
if prefer :admin, 'activeadmin'
|
7
|
+
add_gem 'activeadmin', '~> 1.0.0.pre2'
|
8
|
+
elsif prefer :admin, 'rails_admin'
|
9
|
+
add_gem 'rails_admin'
|
10
|
+
end
|
11
|
+
|
12
|
+
stage_two do
|
13
|
+
say_wizard "recipe stage two"
|
14
|
+
if prefer :admin, 'activeadmin'
|
15
|
+
say_wizard "recipe installing activeadmin"
|
16
|
+
generate 'active_admin:install'
|
17
|
+
end
|
18
|
+
if prefer :admin, 'rails_admin'
|
19
|
+
say_wizard "recipe installing rails_admin"
|
20
|
+
generate 'rails_admin:install'
|
21
|
+
end
|
22
|
+
### GIT
|
23
|
+
git :add => '-A' if prefer :git, true
|
24
|
+
git :commit => %Q(-qm "redmint_composer: installed #{prefs[:admin]}") if prefer :git, true
|
25
|
+
end
|
26
|
+
|
27
|
+
__END__
|
28
|
+
|
29
|
+
name: admin
|
30
|
+
description: "Adding rails admin gem to your application"
|
31
|
+
author: JangoSteve
|
32
|
+
|
33
|
+
category: admin
|
34
|
+
requires: [setup]
|
35
|
+
run_after: [setup]
|
36
|
+
args: -T
|
37
|
+
|
38
|
+
config:
|
39
|
+
- admin:
|
40
|
+
type: multiple_choice
|
41
|
+
prompt: Install admin gem?
|
42
|
+
choices: [ ["None", "none"], ["ActiveAdmin", "activeadmin"], ["RailsAdmin", "rails_admin"] ]
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# Application template recipe for the rails_apps_composer. Change the recipe here:
|
2
|
+
# https://github.com/RailsApps/rails_apps_composer/blob/master/recipes/analytics.rb
|
3
|
+
|
4
|
+
prefs[:analytics] = multiple_choice "Install page-view analytics?", [["None", "none"],
|
5
|
+
["Google Analytics", "ga"],
|
6
|
+
["Segment.io", "segmentio"]] unless prefs.has_key? :analytics
|
7
|
+
case prefs[:analytics]
|
8
|
+
when 'ga'
|
9
|
+
ga_id = ask_wizard('Google Analytics ID?')
|
10
|
+
when 'segmentio'
|
11
|
+
segmentio_api_key = ask_wizard('Segment.io API key?')
|
12
|
+
end
|
13
|
+
|
14
|
+
stage_two do
|
15
|
+
say_wizard "recipe stage two"
|
16
|
+
unless prefer :analytics, 'none'
|
17
|
+
# don't add the gem if it has already been added by the railsapps recipe
|
18
|
+
add_gem 'rails_apps_pages', :group => :development unless prefs[:apps4]
|
19
|
+
end
|
20
|
+
case prefs[:analytics]
|
21
|
+
when 'ga'
|
22
|
+
generate 'analytics:google -f'
|
23
|
+
gsub_file 'app/assets/javascripts/google_analytics.js.coffee', /UA-XXXXXXX-XX/, ga_id
|
24
|
+
when 'segmentio'
|
25
|
+
generate 'analytics:segmentio -f'
|
26
|
+
gsub_file 'app/assets/javascripts/segmentio.js', /SEGMENTIO_API_KEY/, segmentio_api_key
|
27
|
+
end
|
28
|
+
### GIT ###
|
29
|
+
git :add => '-A' if prefer :git, true
|
30
|
+
git :commit => '-qm "redmint_composer: add analytics"' if prefer :git, true
|
31
|
+
end
|
32
|
+
|
33
|
+
__END__
|
34
|
+
|
35
|
+
name: analytics
|
36
|
+
description: "Add JavaScript files for Segment.io or Google Analytics"
|
37
|
+
author: RailsApps
|
38
|
+
|
39
|
+
requires: [setup, gems]
|
40
|
+
run_after: [setup, gems, init]
|
41
|
+
category: other
|
data/recipes/core.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
# Application template recipe for the rails_apps_composer. Change the recipe here:
|
2
|
+
# https://github.com/RailsApps/rails_apps_composer/blob/master/recipes/core.rb
|
3
|
+
|
4
|
+
## Git
|
5
|
+
say_wizard "selected all core recipes"
|
6
|
+
|
7
|
+
__END__
|
8
|
+
|
9
|
+
name: core
|
10
|
+
description: "Select all core recipes."
|
11
|
+
author: RailsApps
|
12
|
+
|
13
|
+
requires: [git, railsapps,
|
14
|
+
learn_rails,
|
15
|
+
rails_bootstrap,
|
16
|
+
rails_foundation,
|
17
|
+
rails_omniauth,
|
18
|
+
rails_devise,
|
19
|
+
rails_devise_roles,
|
20
|
+
rails_devise_pundit,
|
21
|
+
rails_signup_download,
|
22
|
+
rails_mailinglist_activejob,
|
23
|
+
rails_stripe_checkout,
|
24
|
+
rails_stripe_coupons,
|
25
|
+
rails_stripe_membership_saas,
|
26
|
+
setup, locale, readme, gems,
|
27
|
+
tests,
|
28
|
+
email,
|
29
|
+
devise, omniauth, roles,
|
30
|
+
frontend, pages,
|
31
|
+
init, analytics, deployment, extras, admin]
|
32
|
+
category: collections
|
@@ -0,0 +1,178 @@
|
|
1
|
+
# Application template recipe for the rails_apps_composer. Change the recipe here:
|
2
|
+
# https://github.com/RailsApps/rails_apps_composer/blob/master/recipes/deployment.rb
|
3
|
+
|
4
|
+
prefs[:deployment] = multiple_choice "Prepare for deployment?", [["no", "none"],
|
5
|
+
["Heroku", "heroku"],
|
6
|
+
["Capistrano", "capistrano3"]] unless prefs.has_key? :deployment
|
7
|
+
|
8
|
+
if prefer :deployment, 'heroku'
|
9
|
+
say_wizard "installing gems for Heroku"
|
10
|
+
if prefer :database, 'sqlite'
|
11
|
+
gsub_file 'Gemfile', /.*gem 'sqlite3'\n/, ''
|
12
|
+
add_gem 'sqlite3', group: [:development, :test]
|
13
|
+
add_gem 'pg', group: :production
|
14
|
+
end
|
15
|
+
add_gem 'rails_12factor', group: :production
|
16
|
+
stage_three do
|
17
|
+
say_wizard "recipe stage three"
|
18
|
+
say_wizard "precompiling assets for Heroku"
|
19
|
+
run 'RAILS_ENV=production rake assets:precompile'
|
20
|
+
say_wizard "creating app.json file for Heroku Button"
|
21
|
+
create_file 'app.json' do <<-TEXT
|
22
|
+
{
|
23
|
+
"name": "#{app_name.humanize.titleize}",
|
24
|
+
"description": "Starter application generated by Rails Composer",
|
25
|
+
"logo": "https://avatars3.githubusercontent.com/u/788200",
|
26
|
+
TEXT
|
27
|
+
end
|
28
|
+
append_file 'app.json', " \"repository\": \"https://github.com/RailsApps/#{prefs[:apps4]}\",\n" if prefs.keys.include?(:apps4)
|
29
|
+
append_file 'app.json', ' "keywords": [' + "\n"
|
30
|
+
append_file 'app.json', ' "Rails Composer",' + "\n"
|
31
|
+
append_file 'app.json', ' "RailsApps",' + "\n" + ' "starter",' + "\n" if prefs.keys.include?(:apps4)
|
32
|
+
append_file 'app.json', ' "RSpec",' + "\n" if prefer :tests, 'rspec'
|
33
|
+
append_file 'app.json', ' "Bootstrap",' + "\n" if prefer :frontend, 'bootstrap3'
|
34
|
+
append_file 'app.json', ' "Foundation",' + "\n" if prefer :frontend, 'pundit'
|
35
|
+
append_file 'app.json', ' "authentication",' + "\n" + ' "Devise",' + "\n" if prefer :authentication, 'devise'
|
36
|
+
append_file 'app.json', ' "authentication",' + "\n" + ' "OmniAuth",' + "\n" if prefer :authentication, 'omniauth'
|
37
|
+
append_file 'app.json', ' "authorization",' + "\n" + ' "roles",' + "\n" if prefer :authorization, 'roles'
|
38
|
+
append_file 'app.json', ' "authorization",' + "\n" + ' "Pundit",' + "\n" if prefer :authorization, 'pundit'
|
39
|
+
append_file 'app.json' do <<-TEXT
|
40
|
+
"Ruby",
|
41
|
+
"Rails"
|
42
|
+
],
|
43
|
+
"scripts": {},
|
44
|
+
"env": {
|
45
|
+
TEXT
|
46
|
+
end
|
47
|
+
case prefs[:email]
|
48
|
+
when 'gmail'
|
49
|
+
append_file 'app.json' do <<-TEXT
|
50
|
+
"GMAIL_USERNAME": {
|
51
|
+
"description": "Your Gmail address for sending mail.",
|
52
|
+
"value": "admin@redmintlabs.com",
|
53
|
+
"required": false
|
54
|
+
},
|
55
|
+
"GMAIL_PASSWORD": {
|
56
|
+
"description": "Your Gmail password for sending mail.",
|
57
|
+
"value": "changeme",
|
58
|
+
"required": false
|
59
|
+
},
|
60
|
+
TEXT
|
61
|
+
end
|
62
|
+
when 'sendgrid'
|
63
|
+
append_file 'app.json' do <<-TEXT
|
64
|
+
"SENDGRID_USERNAME": {
|
65
|
+
"description": "Your SendGrid address for sending mail.",
|
66
|
+
"value": "admin@redmintlabs.com",
|
67
|
+
"required": false
|
68
|
+
},
|
69
|
+
"SENDGRID_PASSWORD": {
|
70
|
+
"description": "Your SendGrid password for sending mail.",
|
71
|
+
"value": "changeme",
|
72
|
+
"required": false
|
73
|
+
},
|
74
|
+
TEXT
|
75
|
+
end
|
76
|
+
when 'mandrill'
|
77
|
+
append_file 'app.json' do <<-TEXT
|
78
|
+
"MANDRILL_USERNAME": {
|
79
|
+
"description": "Your Mandrill address for sending mail.",
|
80
|
+
"value": "admin@redmintlabs.com",
|
81
|
+
"required": false
|
82
|
+
},
|
83
|
+
"MANDRILL_APIKEY": {
|
84
|
+
"description": "Your Mandrill API key for sending mail.",
|
85
|
+
"value": "changeme",
|
86
|
+
"required": false
|
87
|
+
},
|
88
|
+
TEXT
|
89
|
+
end
|
90
|
+
end
|
91
|
+
if prefer :authentication, 'omniauth'
|
92
|
+
append_file 'app.json' do <<-TEXT
|
93
|
+
"OMNIAUTH_PROVIDER_KEY": {
|
94
|
+
"description": "Credentials from Twitter, Facebook, or another provider.",
|
95
|
+
"value": "some_long_key",
|
96
|
+
"required": false
|
97
|
+
},
|
98
|
+
"OMNIAUTH_PROVIDER_SECRET": {
|
99
|
+
"description": "Credentials from Twitter, Facebook, or another provider.",
|
100
|
+
"value": "some_long_key",
|
101
|
+
"required": false
|
102
|
+
},
|
103
|
+
TEXT
|
104
|
+
end
|
105
|
+
end
|
106
|
+
if prefer :authentication, 'devise'
|
107
|
+
append_file 'app.json' do <<-TEXT
|
108
|
+
"ADMIN_EMAIL": {
|
109
|
+
"description": "The administrator's email address for signing in.",
|
110
|
+
"value": "admin@redmintlabs.com",
|
111
|
+
"required": true
|
112
|
+
},
|
113
|
+
"ADMIN_PASSWORD": {
|
114
|
+
"description": "The administrator's password for signing in.",
|
115
|
+
"value": "changeme",
|
116
|
+
"required": true
|
117
|
+
},
|
118
|
+
"DOMAIN_NAME": {
|
119
|
+
"description": "Required for sending mail. Give an app name or use a custom domain.",
|
120
|
+
"value": "myapp.herokuapp.com",
|
121
|
+
"required": false
|
122
|
+
},
|
123
|
+
TEXT
|
124
|
+
end
|
125
|
+
end
|
126
|
+
if (!prefs[:secrets].nil?)
|
127
|
+
prefs[:secrets].each do |secret|
|
128
|
+
append_file 'app.json' do <<-TEXT
|
129
|
+
"#{secret.upcase}": {
|
130
|
+
"description": "no description",
|
131
|
+
"required": false
|
132
|
+
},
|
133
|
+
TEXT
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
137
|
+
append_file 'app.json' do <<-TEXT
|
138
|
+
"RAILS_ENV": "production"
|
139
|
+
}
|
140
|
+
}
|
141
|
+
TEXT
|
142
|
+
end
|
143
|
+
if File.exists?('db/migrate')
|
144
|
+
gsub_file 'app.json', /"scripts": {/,
|
145
|
+
"\"scripts\": {\"postdeploy\": \"bundle exec rake db:migrate; bundle exec rake db:seed\""
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
if prefer :deployment, 'capistrano3'
|
151
|
+
say_wizard "installing gems for Capistrano"
|
152
|
+
add_gem 'capistrano', '~> 3.0.1', group: :development
|
153
|
+
add_gem 'capistrano-rvm', '~> 0.1.1', group: :development
|
154
|
+
add_gem 'capistrano-bundler', group: :development
|
155
|
+
add_gem 'capistrano-rails', '~> 1.1.0', group: :development
|
156
|
+
add_gem 'capistrano-rails-console', group: :development
|
157
|
+
stage_two do
|
158
|
+
say_wizard "recipe stage two"
|
159
|
+
say_wizard "installing Capistrano files"
|
160
|
+
run 'bundle exec cap install'
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
stage_three do
|
165
|
+
### GIT ###
|
166
|
+
git :add => '-A' if prefer :git, true
|
167
|
+
git :commit => '-qm "redmint_composer: prepare for deployment"' if prefer :git, true
|
168
|
+
end
|
169
|
+
|
170
|
+
__END__
|
171
|
+
|
172
|
+
name: deployment
|
173
|
+
description: "Prepare for deployment"
|
174
|
+
author: RailsApps
|
175
|
+
|
176
|
+
requires: [setup]
|
177
|
+
run_after: [init]
|
178
|
+
category: development
|