rails-base 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
data/lib/template.rb ADDED
@@ -0,0 +1,3171 @@
1
+ module Generator
2
+ # >---------------------------------------------------------------------------<
3
+ #
4
+ # _____ _ _
5
+ # | __ \ (_) | /\
6
+ # | |__) |__ _ _| |___ / \ _ __ _ __ ___
7
+ # | _ // _` | | / __| / /\ \ | '_ \| '_ \/ __|
8
+ # | | \ \ (_| | | \__ \/ ____ \| |_) | |_) \__ \
9
+ # |_| \_\__,_|_|_|___/_/ \_\ .__/| .__/|___/
10
+ # | | | |
11
+ # |_| |_|
12
+ #
13
+ # Application template generated by the rails_apps_composer gem.
14
+ # Restrain your impulse to make changes to this file; instead,
15
+ # make changes to the recipes in the rails_apps_composer gem.
16
+ #
17
+ # For more information, see:
18
+ # https://github.com/RailsApps/rails_apps_composer/
19
+ #
20
+ # Thank you to Michael Bleigh for leading the way with the RailsWizard gem.
21
+ #
22
+ # Primarily generated by file:
23
+ # https://github.com/RailsApps/rails_apps_composer/templates/layout.erb
24
+ #
25
+ # >---------------------------------------------------------------------------<
26
+
27
+ # >----------------------------[ Initial Setup ]------------------------------<
28
+
29
+ module Gemfile
30
+ class GemInfo
31
+ def initialize(name) @name=name; @group=[]; @opts={}; end
32
+ attr_accessor :name, :version
33
+ attr_reader :group, :opts
34
+
35
+ def opts=(new_opts={})
36
+ new_group = new_opts.delete(:group)
37
+ if (new_group && self.group != new_group)
38
+ @group = ([self.group].flatten + [new_group].flatten).compact.uniq.sort
39
+ end
40
+ @opts = (self.opts || {}).merge(new_opts)
41
+ end
42
+
43
+ def group_key() @group end
44
+
45
+ def gem_args_string
46
+ args = ["'#{@name}'"]
47
+ args << "'#{@version}'" if @version
48
+ @opts.each do |name,value|
49
+ args << ":#{name}=>#{value.inspect}"
50
+ end
51
+ args.join(', ')
52
+ end
53
+ end
54
+
55
+ @geminfo = {}
56
+
57
+ class << self
58
+ # add(name, version, opts={})
59
+ def add(name, *args)
60
+ name = name.to_s
61
+ version = args.first && !args.first.is_a?(Hash) ? args.shift : nil
62
+ opts = args.first && args.first.is_a?(Hash) ? args.shift : {}
63
+ @geminfo[name] = (@geminfo[name] || GemInfo.new(name)).tap do |info|
64
+ info.version = version if version
65
+ info.opts = opts
66
+ end
67
+ end
68
+
69
+ def write
70
+ File.open('Gemfile', 'a') do |file|
71
+ file.puts
72
+ grouped_gem_names.sort.each do |group, gem_names|
73
+ indent = ""
74
+ unless group.empty?
75
+ file.puts "group :#{group.join(', :')} do" unless group.empty?
76
+ indent=" "
77
+ end
78
+ gem_names.sort.each do |gem_name|
79
+ file.puts "#{indent}gem #{@geminfo[gem_name].gem_args_string}"
80
+ end
81
+ file.puts "end" unless group.empty?
82
+ file.puts
83
+ end
84
+ end
85
+ end
86
+
87
+ private
88
+ #returns {group=>[...gem names...]}, ie {[:development, :test]=>['rspec-rails', 'mocha'], :assets=>[], ...}
89
+ def grouped_gem_names
90
+ {}.tap do |_groups|
91
+ @geminfo.each do |gem_name, geminfo|
92
+ (_groups[geminfo.group_key] ||= []).push(gem_name)
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
98
+ def add_gem(*all) Gemfile.add(*all); end
99
+
100
+ @recipes = ["core", "git", "railsapps", "setup", "readme", "admin", "email", "gems", "frontend", "models", "testing", "init", "apps4", "controllers", "views", "prelaunch", "saas", "routes", "extras", "email_dev"]
101
+ @prefs = {}
102
+ @gems = ["rails_12factor", "uuidtools", "whenever", "god"]
103
+ @diagnostics_recipes = [["example"], ["setup"], ["railsapps"], ["gems", "setup"], ["gems", "readme", "setup"], ["extras", "gems", "readme", "setup"], ["example", "git"], ["git", "setup"], ["git", "railsapps"], ["gems", "git", "setup"], ["gems", "git", "readme", "setup"], ["extras", "gems", "git", "readme", "setup"], ["controllers", "email", "extras", "frontend", "gems", "git", "init", "models", "railsapps", "readme", "routes", "setup", "testing", "views"], ["controllers", "core", "email", "extras", "frontend", "gems", "git", "init", "models", "railsapps", "readme", "routes", "setup", "testing", "views"], ["controllers", "core", "email", "extras", "frontend", "gems", "git", "init", "models", "prelaunch", "railsapps", "readme", "routes", "setup", "testing", "views"], ["controllers", "core", "email", "extras", "frontend", "gems", "git", "init", "models", "prelaunch", "railsapps", "readme", "routes", "saas", "setup", "testing", "views"], ["controllers", "email", "example", "extras", "frontend", "gems", "git", "init", "models", "railsapps", "readme", "routes", "setup", "testing", "views"], ["controllers", "email", "example", "extras", "frontend", "gems", "git", "init", "models", "prelaunch", "railsapps", "readme", "routes", "setup", "testing", "views"], ["controllers", "email", "example", "extras", "frontend", "gems", "git", "init", "models", "prelaunch", "railsapps", "readme", "routes", "saas", "setup", "testing", "views"], ["apps4", "controllers", "core", "email", "extras", "frontend", "gems", "git", "init", "models", "prelaunch", "railsapps", "readme", "routes", "saas", "setup", "testing", "views"]]
104
+ @diagnostics_prefs = [{:railsapps=>"rails-recurly-subscription-saas", :database=>"sqlite", :unit_test=>"rspec", :integration=>"cucumber", :fixtures=>"factory_girl", :frontend=>"bootstrap", :bootstrap=>"sass", :email=>"gmail", :authentication=>"devise", :devise_modules=>"default", :authorization=>"cancan", :starter_app=>"admin_app", :form_builder=>"simple_form"}, {:railsapps=>"rails-stripe-membership-saas", :database=>"sqlite", :unit_test=>"rspec", :integration=>"cucumber", :fixtures=>"factory_girl", :frontend=>"bootstrap", :bootstrap=>"sass", :email=>"gmail", :authentication=>"devise", :devise_modules=>"default", :authorization=>"cancan", :starter_app=>"admin_app", :form_builder=>"simple_form"}, {:railsapps=>"rails-stripe-membership-saas", :database=>"sqlite", :unit_test=>"rspec", :integration=>"cucumber", :fixtures=>"factory_girl", :frontend=>"bootstrap", :bootstrap=>"sass", :email=>"mandrill", :authentication=>"devise", :devise_modules=>"confirmable", :authorization=>"cancan", :starter_app=>"admin_app", :form_builder=>"simple_form"}, {:railsapps=>"rails-prelaunch-signup", :database=>"sqlite", :unit_test=>"rspec", :integration=>"cucumber", :fixtures=>"factory_girl", :frontend=>"bootstrap", :bootstrap=>"sass", :email=>"mandrill", :authentication=>"devise", :devise_modules=>"confirmable", :authorization=>"cancan", :starter_app=>"admin_app", :form_builder=>"simple_form"}, {:railsapps=>"rails3-bootstrap-devise-cancan", :database=>"sqlite", :unit_test=>"rspec", :integration=>"cucumber", :fixtures=>"factory_girl", :frontend=>"bootstrap", :bootstrap=>"sass", :email=>"gmail", :authentication=>"devise", :devise_modules=>"default", :authorization=>"cancan", :starter_app=>"admin_app", :form_builder=>"simple_form"}, {:railsapps=>"rails3-bootstrap-devise-cancan", :database=>"sqlite", :unit_test=>"rspec", :integration=>"cucumber", :fixtures=>"factory_girl", :frontend=>"bootstrap", :bootstrap=>"sass", :email=>"gmail", :authentication=>"devise", :devise_modules=>"default", :authorization=>"cancan", :starter_app=>"admin_app", :form_builder=>"simple_form", :local_env_file=>"figaro", :continuous_testing=>"none"}, {:railsapps=>"rails3-devise-rspec-cucumber", :database=>"sqlite", :unit_test=>"rspec", :integration=>"cucumber", :fixtures=>"factory_girl", :frontend=>"none", :email=>"gmail", :authentication=>"devise", :devise_modules=>"default", :authorization=>"none", :starter_app=>"users_app", :form_builder=>"none"}, {:railsapps=>"rails3-mongoid-devise", :database=>"mongodb", :orm=>"mongoid", :unit_test=>"rspec", :integration=>"cucumber", :fixtures=>"factory_girl", :frontend=>"none", :email=>"gmail", :authentication=>"devise", :devise_modules=>"default", :authorization=>"none", :starter_app=>"users_app", :form_builder=>"none"}, {:railsapps=>"rails3-mongoid-omniauth", :database=>"mongodb", :orm=>"mongoid", :unit_test=>"rspec", :integration=>"cucumber", :fixtures=>"factory_girl", :frontend=>"none", :email=>"none", :authentication=>"omniauth", :omniauth_provider=>"twitter", :authorization=>"none", :starter_app=>"users_app", :form_builder=>"none"}, {:railsapps=>"rails3-subdomains", :database=>"mongodb", :orm=>"mongoid", :unit_test=>"rspec", :integration=>"cucumber", :fixtures=>"factory_girl", :frontend=>"none", :email=>"gmail", :authentication=>"devise", :devise_modules=>"default", :authorization=>"none", :starter_app=>"subdomains_app", :form_builder=>"none"}, {:railsapps=>"none", :database=>"sqlite", :unit_test=>"rspec", :integration=>"rspec-capybara", :fixtures=>"factory_girl", :frontend=>"bootstrap", :bootstrap=>"sass", :email=>"none", :authentication=>"omniauth", :omniauth_provider=>"twitter", :authorization=>"cancan", :form_builder=>"none", :starter_app=>"admin_app"}, {:railsapps=>"none", :database=>"sqlite", :unit_test=>"rspec", :integration=>"cucumber", :fixtures=>"none", :frontend=>"bootstrap", :bootstrap=>"sass", :email=>"gmail", :authentication=>"devise", :devise_modules=>"invitable", :authorization=>"cancan", :form_builder=>"simple_form", :starter_app=>"admin_app"}, {:railsapps=>"none", :database=>"sqlite", :unit_test=>"rspec", :integration=>"cucumber", :fixtures=>"factory_girl", :frontend=>"bootstrap", :bootstrap=>"sass", :email=>"gmail", :authentication=>"devise", :devise_modules=>"default", :authorization=>"cancan", :form_builder=>"none", :starter_app=>"admin_app"}, {:railsapps=>"none", :database=>"sqlite", :unit_test=>"test_unit", :integration=>"none", :fixtures=>"none", :frontend=>"bootstrap", :bootstrap=>"less", :email=>"sendgrid", :authentication=>"devise", :devise_modules=>"confirmable", :authorization=>"cancan", :form_builder=>"none", :starter_app=>"admin_app"}]
105
+ diagnostics = {}
106
+
107
+ # >-------------------------- templates/helpers.erb --------------------------start<
108
+ def recipes; @recipes end
109
+ def recipe?(name); @recipes.include?(name) end
110
+ def prefs; @prefs end
111
+ def prefer(key, value); @prefs[key].eql? value end
112
+ def gems; @gems end
113
+ def diagnostics_recipes; @diagnostics_recipes end
114
+ def diagnostics_prefs; @diagnostics_prefs end
115
+
116
+ def say_custom(tag, text); say "\033[1m\033[36m" + tag.to_s.rjust(10) + "\033[0m" + " #{text}" end
117
+ def say_recipe(name); say "\033[1m\033[36m" + "recipe".rjust(10) + "\033[0m" + " Running #{name} recipe..." end
118
+ def say_wizard(text); say_custom(@current_recipe || 'composer', text) end
119
+
120
+ def rails_4?
121
+ Rails::VERSION::MAJOR.to_s == "4"
122
+ end
123
+
124
+ def rails_4_1?
125
+ Rails::VERSION::MAJOR.to_s == "4" && Rails::VERSION::MINOR.to_s == "1"
126
+ end
127
+
128
+ def ask_wizard(question)
129
+ ask "\033[1m\033[36m" + (@current_recipe || "prompt").rjust(10) + "\033[1m\033[36m" + " #{question}\033[0m"
130
+ end
131
+
132
+ def yes_wizard?(question)
133
+ answer = ask_wizard(question + " \033[33m(y/n)\033[0m")
134
+ case answer.downcase
135
+ when "yes", "y"
136
+ true
137
+ when "no", "n"
138
+ false
139
+ else
140
+ yes_wizard?(question)
141
+ end
142
+ end
143
+
144
+ def no_wizard?(question); !yes_wizard?(question) end
145
+
146
+ def multiple_choice(question, choices)
147
+ say_custom('question', question)
148
+ values = {}
149
+ choices.each_with_index do |choice,i|
150
+ values[(i + 1).to_s] = choice[1]
151
+ say_custom( (i + 1).to_s + ')', choice[0] )
152
+ end
153
+ answer = ask_wizard("Enter your selection:") while !values.keys.include?(answer)
154
+ values[answer]
155
+ end
156
+
157
+ @current_recipe = nil
158
+ @configs = {}
159
+
160
+ @after_blocks = []
161
+ def after_bundler(&block); @after_blocks << [@current_recipe, block]; end
162
+ @after_everything_blocks = []
163
+ def after_everything(&block); @after_everything_blocks << [@current_recipe, block]; end
164
+ @before_configs = {}
165
+ def before_config(&block); @before_configs[@current_recipe] = block; end
166
+
167
+ def copy_from(source, destination)
168
+ begin
169
+ remove_file destination
170
+ get source, destination
171
+ rescue OpenURI::HTTPError
172
+ say_wizard "Unable to obtain #{source}"
173
+ end
174
+ end
175
+
176
+ def copy_from_repo(filename, opts = {})
177
+ repo = 'https://raw.github.com/RailsApps/rails-composer/master/files/'
178
+ repo = opts[:repo] unless opts[:repo].nil?
179
+ if (!opts[:prefs].nil?) && (!prefs.has_value? opts[:prefs])
180
+ return
181
+ end
182
+ source_filename = filename
183
+ destination_filename = filename
184
+ unless opts[:prefs].nil?
185
+ if filename.include? opts[:prefs]
186
+ destination_filename = filename.gsub(/\-#{opts[:prefs]}/, '')
187
+ end
188
+ end
189
+ if (prefer :templates, 'haml') && (filename.include? 'views')
190
+ remove_file destination_filename
191
+ destination_filename = destination_filename.gsub(/.erb/, '.haml')
192
+ end
193
+ if (prefer :templates, 'slim') && (filename.include? 'views')
194
+ remove_file destination_filename
195
+ destination_filename = destination_filename.gsub(/.erb/, '.slim')
196
+ end
197
+ begin
198
+ remove_file destination_filename
199
+ if (prefer :templates, 'haml') && (filename.include? 'views')
200
+ create_file destination_filename, html_to_haml(repo + source_filename)
201
+ elsif (prefer :templates, 'slim') && (filename.include? 'views')
202
+ create_file destination_filename, html_to_slim(repo + source_filename)
203
+ else
204
+ get repo + source_filename, destination_filename
205
+ end
206
+ rescue OpenURI::HTTPError
207
+ say_wizard "Unable to obtain #{source_filename} from the repo #{repo}"
208
+ end
209
+ end
210
+
211
+ def html_to_haml(source)
212
+ begin
213
+ html = open(source) {|input| input.binmode.read }
214
+ Haml::HTML.new(html, :erb => true, :xhtml => true).render
215
+ rescue RubyParser::SyntaxError
216
+ say_wizard "Ignoring RubyParser::SyntaxError"
217
+ # special case to accommodate https://github.com/RailsApps/rails-composer/issues/55
218
+ html = open(source) {|input| input.binmode.read }
219
+ say_wizard "applying patch" if html.include? 'card_month'
220
+ say_wizard "applying patch" if html.include? 'card_year'
221
+ html = html.gsub(/, {add_month_numbers: true}, {name: nil, id: "card_month"}/, '')
222
+ html = html.gsub(/, {start_year: Date\.today\.year, end_year: Date\.today\.year\+10}, {name: nil, id: "card_year"}/, '')
223
+ result = Haml::HTML.new(html, :erb => true, :xhtml => true).render
224
+ result = result.gsub(/select_month nil/, "select_month nil, {add_month_numbers: true}, {name: nil, id: \"card_month\"}")
225
+ result = result.gsub(/select_year nil/, "select_year nil, {start_year: Date.today.year, end_year: Date.today.year+10}, {name: nil, id: \"card_year\"}")
226
+ end
227
+ end
228
+
229
+ def html_to_slim(source)
230
+ html = open(source) {|input| input.binmode.read }
231
+ haml = Haml::HTML.new(html, :erb => true, :xhtml => true).render
232
+ Haml2Slim.convert!(haml)
233
+ end
234
+
235
+ # full credit to @mislav in this StackOverflow answer for the #which() method:
236
+ # - http://stackoverflow.com/a/5471032
237
+ def which(cmd)
238
+ exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
239
+ ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
240
+ exts.each do |ext|
241
+ exe = "#{path}#{File::SEPARATOR}#{cmd}#{ext}"
242
+ return exe if File.executable? exe
243
+ end
244
+ end
245
+ return nil
246
+ end
247
+ # >-------------------------- templates/helpers.erb --------------------------end<
248
+
249
+ if diagnostics_recipes.sort.include? recipes.sort
250
+ diagnostics[:recipes] = 'success'
251
+ say_wizard("WOOT! The recipes you've selected are known to work together.")
252
+ else
253
+ diagnostics[:recipes] = 'fail'
254
+ say_wizard("\033[1m\033[36m" + "WARNING! The recipes you've selected might not work together." + "\033[0m")
255
+ say_wizard("Help us out by reporting whether this combination works or fails.")
256
+ say_wizard("Please open an issue for rails_apps_composer on GitHub.")
257
+ say_wizard("Your new application will contain diagnostics in its README file.")
258
+ say_wizard("Continuing...")
259
+ end
260
+
261
+ # this application template only supports Rails version 3.1 and newer
262
+ case Rails::VERSION::MAJOR.to_s
263
+ when "3"
264
+ case Rails::VERSION::MINOR.to_s
265
+ when "0"
266
+ say_wizard "You are using Rails version #{Rails::VERSION::STRING} which is not supported. Try 3.1 or newer."
267
+ raise StandardError.new "Rails #{Rails::VERSION::STRING} is not supported. Try 3.1 or newer."
268
+ end
269
+ when "4"
270
+ say_wizard "You are using Rails version #{Rails::VERSION::STRING}."
271
+ else
272
+ say_wizard "You are using Rails version #{Rails::VERSION::STRING} which is not supported. Try 3.1 or newer."
273
+ raise StandardError.new "Rails #{Rails::VERSION::STRING} is not supported. Try 3.1 or newer."
274
+ end
275
+
276
+ say_wizard "Using rails_apps_composer recipes to generate an application."
277
+
278
+ # >---------------------------[ Autoload Modules/Classes ]-----------------------------<
279
+
280
+ inject_into_file 'config/application.rb', :after => 'config.autoload_paths += %W(#{config.root}/extras)' do <<-'RUBY'
281
+
282
+ config.autoload_paths += %W(#{config.root}/lib)
283
+ RUBY
284
+ end
285
+
286
+ # >---------------------------------[ Recipes ]----------------------------------<
287
+
288
+ # >-------------------------- templates/recipe.erb ---------------------------start<
289
+ # >---------------------------------[ core ]----------------------------------<
290
+ @current_recipe = "core"
291
+ @before_configs["core"].call if @before_configs["core"]
292
+ say_recipe 'core'
293
+ @configs[@current_recipe] = config
294
+ # >----------------------------- recipes/core.rb -----------------------------start<
295
+
296
+ # Application template recipe for the rails_apps_composer. Change the recipe here:
297
+ # https://github.com/RailsApps/rails_apps_composer/blob/master/recipes/core.rb
298
+
299
+ ## Git
300
+ say_wizard "selected all core recipes"
301
+ # >----------------------------- recipes/core.rb -----------------------------end<
302
+ # >-------------------------- templates/recipe.erb ---------------------------end<
303
+
304
+ # >-------------------------- templates/recipe.erb ---------------------------start<
305
+ # >----------------------------------[ git ]----------------------------------<
306
+ @current_recipe = "git"
307
+ @before_configs["git"].call if @before_configs["git"]
308
+ say_recipe 'git'
309
+ @configs[@current_recipe] = config
310
+ # >----------------------------- recipes/git.rb ------------------------------start<
311
+
312
+ # Application template recipe for the rails_apps_composer. Change the recipe here:
313
+ # https://github.com/RailsApps/rails_apps_composer/blob/master/recipes/git.rb
314
+
315
+ ## Git
316
+ say_wizard "initialize git"
317
+ prefs[:git] = true unless prefs.has_key? :git
318
+ if prefer :git, true
319
+ copy_from 'https://raw.github.com/RailsApps/rails-composer/master/files/gitignore.txt', '.gitignore'
320
+ git :init
321
+ git :add => '-A'
322
+ git :commit => '-qm "rails_apps_composer: initial commit"'
323
+ else
324
+ after_everything do
325
+ say_wizard "removing .gitignore and .gitkeep files"
326
+ git_files = Dir[File.join('**','.gitkeep')] + Dir[File.join('**','.gitignore')]
327
+ File.unlink git_files
328
+ end
329
+ end
330
+ # >----------------------------- recipes/git.rb ------------------------------end<
331
+ # >-------------------------- templates/recipe.erb ---------------------------end<
332
+
333
+ # >-------------------------- templates/recipe.erb ---------------------------start<
334
+ # >-------------------------------[ railsapps ]-------------------------------<
335
+ @current_recipe = "railsapps"
336
+ @before_configs["railsapps"].call if @before_configs["railsapps"]
337
+ say_recipe 'railsapps'
338
+ @configs[@current_recipe] = config
339
+ # >-------------------------- recipes/railsapps.rb ---------------------------start<
340
+
341
+ # Application template recipe for the rails_apps_composer. Change the recipe here:
342
+ # https://github.com/RailsApps/rails_apps_composer/blob/master/recipes/railsapps.rb
343
+
344
+ raise if (defined? defaults) || (defined? preferences) # Shouldn't happen.
345
+ if options[:verbose]
346
+ print "\nrecipes: ";p recipes
347
+ print "\ngems: " ;p gems
348
+ print "\nprefs: " ;p prefs
349
+ print "\nconfig: " ;p config
350
+ end
351
+
352
+ case Rails::VERSION::MAJOR.to_s
353
+ when "3"
354
+ prefs[:railsapps] = multiple_choice "Install an example application for Rails 3.2?",
355
+ [["I want to build my own application", "none"],
356
+ ["membership/subscription/saas", "saas"],
357
+ ["rails-prelaunch-signup", "rails-prelaunch-signup"],
358
+ ["rails3-bootstrap-devise-cancan", "rails3-bootstrap-devise-cancan"],
359
+ ["rails3-devise-rspec-cucumber", "rails3-devise-rspec-cucumber"],
360
+ ["rails3-mongoid-devise", "rails3-mongoid-devise"],
361
+ ["rails3-mongoid-omniauth", "rails3-mongoid-omniauth"],
362
+ ["rails3-subdomains", "rails3-subdomains"]] unless prefs.has_key? :railsapps
363
+ when "4"
364
+ prefs[:apps4] = multiple_choice "Install an example application for Rails 4.0?",
365
+ [["Build a RailsApps starter application", "railsapps"],
366
+ ["Build a contributed application", "contributed_app"],
367
+ ["I want to build my own application", "none"]] unless prefs.has_key? :apps4
368
+ case prefs[:apps4]
369
+ when 'railsapps'
370
+ prefs[:apps4] = multiple_choice "Starter apps for Rails 4.0. More to come.",
371
+ [["learn-rails", "learn-rails"],
372
+ ["rails-bootstrap", "rails-bootstrap"],
373
+ ["rails-foundation", "rails-foundation"],
374
+ ["rails-devise", "rails-devise"],
375
+ ["rails-omniauth", "rails-omniauth"]]
376
+ when 'contributed_app'
377
+ prefs[:apps4] = multiple_choice "No contributed applications are available.",
378
+ [["continue", "none"]]
379
+ end
380
+ end
381
+
382
+ case prefs[:apps4]
383
+ when 'simple-test'
384
+ prefs[:dev_webserver] = 'webrick'
385
+ prefs[:prod_webserver] = 'same'
386
+ prefs[:templates] = 'erb'
387
+ prefs[:git] = false
388
+ prefs[:github] = false
389
+ prefs[:database] = 'sqlite'
390
+ prefs[:unit_test] = false
391
+ prefs[:integration] = false
392
+ prefs[:fixtures] = false
393
+ prefs[:frontend] = false
394
+ prefs[:email] = false
395
+ prefs[:authentication] = false
396
+ prefs[:devise_modules] = false
397
+ prefs[:authorization] = false
398
+ prefs[:starter_app] = false
399
+ prefs[:form_builder] = false
400
+ prefs[:quiet_assets] = false
401
+ prefs[:local_env_file] = 'none'
402
+ prefs[:better_errors] = false
403
+ prefs[:ban_spiders] = false
404
+ prefs[:continuous_testing] = false
405
+ when 'learn-rails'
406
+ prefs[:git] = true
407
+ prefs[:database] = 'default'
408
+ prefs[:unit_test] = false
409
+ prefs[:integration] = false
410
+ prefs[:fixtures] = false
411
+ prefs[:email] = 'gmail'
412
+ prefs[:authentication] = false
413
+ prefs[:devise_modules] = false
414
+ prefs[:authorization] = false
415
+ prefs[:starter_app] = false
416
+ prefs[:form_builder] = 'simple_form'
417
+ prefs[:quiet_assets] = true
418
+ prefs[:local_env_file] = 'figaro'
419
+ prefs[:better_errors] = true
420
+ when 'rails-bootstrap'
421
+ prefs[:git] = true
422
+ prefs[:database] = 'default'
423
+ prefs[:unit_test] = false
424
+ prefs[:integration] = false
425
+ prefs[:fixtures] = false
426
+ prefs[:frontend] = 'bootstrap3'
427
+ prefs[:email] = 'none'
428
+ prefs[:authentication] = false
429
+ prefs[:devise_modules] = false
430
+ prefs[:authorization] = false
431
+ prefs[:starter_app] = false
432
+ prefs[:form_builder] = 'simple_form'
433
+ prefs[:quiet_assets] = true
434
+ prefs[:local_env_file] = 'figaro'
435
+ prefs[:better_errors] = true
436
+ when 'rails-foundation'
437
+ prefs[:git] = true
438
+ prefs[:database] = 'default'
439
+ prefs[:unit_test] = false
440
+ prefs[:integration] = false
441
+ prefs[:fixtures] = false
442
+ prefs[:frontend] = 'foundation5'
443
+ prefs[:email] = 'none'
444
+ prefs[:authentication] = false
445
+ prefs[:devise_modules] = false
446
+ prefs[:authorization] = false
447
+ prefs[:starter_app] = false
448
+ prefs[:form_builder] = 'simple_form'
449
+ prefs[:quiet_assets] = true
450
+ prefs[:local_env_file] = 'figaro'
451
+ prefs[:better_errors] = true
452
+ when 'rails-devise'
453
+ prefs[:git] = true
454
+ prefs[:unit_test] = false
455
+ prefs[:integration] = false
456
+ prefs[:fixtures] = false
457
+ prefs[:authentication] = 'devise'
458
+ prefs[:authorization] = false
459
+ prefs[:starter_app] = false
460
+ prefs[:quiet_assets] = true
461
+ prefs[:local_env_file] = 'figaro'
462
+ prefs[:better_errors] = true
463
+ when 'rails-omniauth'
464
+ prefs[:git] = true
465
+ prefs[:unit_test] = false
466
+ prefs[:integration] = false
467
+ prefs[:fixtures] = false
468
+ prefs[:email] = 'none'
469
+ prefs[:authentication] = 'omniauth'
470
+ prefs[:authorization] = 'none'
471
+ prefs[:starter_app] = false
472
+ prefs[:form_builder] = 'none'
473
+ prefs[:quiet_assets] = true
474
+ prefs[:local_env_file] = 'figaro'
475
+ prefs[:better_errors] = true
476
+ end
477
+
478
+ case prefs[:railsapps]
479
+ when 'saas'
480
+ prefs[:railsapps] = multiple_choice "Billing with Stripe or Recurly?",
481
+ [["Stripe", "rails-stripe-membership-saas"],
482
+ ["Recurly", "rails-recurly-subscription-saas"]]
483
+ end
484
+
485
+ case prefs[:railsapps]
486
+ when 'rails-stripe-membership-saas'
487
+ prefs[:git] = true
488
+ prefs[:database] = 'sqlite'
489
+ prefs[:unit_test] = 'rspec'
490
+ prefs[:integration] = 'cucumber'
491
+ prefs[:fixtures] = 'factory_girl'
492
+ prefs[:frontend] = 'bootstrap2'
493
+ prefs[:email] = 'gmail'
494
+ prefs[:authentication] = 'devise'
495
+ prefs[:devise_modules] = 'default'
496
+ prefs[:authorization] = 'cancan'
497
+ prefs[:starter_app] = 'admin_app'
498
+ prefs[:form_builder] = 'simple_form'
499
+ prefs[:quiet_assets] = true
500
+ prefs[:local_env_file] = 'figaro'
501
+ prefs[:better_errors] = true
502
+ when 'rails-recurly-subscription-saas'
503
+ prefs[:git] = true
504
+ prefs[:database] = 'sqlite'
505
+ prefs[:unit_test] = 'rspec'
506
+ prefs[:integration] = 'cucumber'
507
+ prefs[:fixtures] = 'factory_girl'
508
+ prefs[:frontend] = 'bootstrap2'
509
+ prefs[:email] = 'gmail'
510
+ prefs[:authentication] = 'devise'
511
+ prefs[:devise_modules] = 'default'
512
+ prefs[:authorization] = 'cancan'
513
+ prefs[:starter_app] = 'admin_app'
514
+ prefs[:form_builder] = 'simple_form'
515
+ prefs[:quiet_assets] = true
516
+ prefs[:local_env_file] = 'figaro'
517
+ prefs[:better_errors] = true
518
+ when 'rails-prelaunch-signup'
519
+ prefs[:git] = true
520
+ prefs[:database] = 'sqlite'
521
+ prefs[:unit_test] = 'rspec'
522
+ prefs[:integration] = 'cucumber'
523
+ prefs[:fixtures] = 'factory_girl'
524
+ prefs[:frontend] = 'bootstrap2'
525
+ prefs[:email] = 'mandrill'
526
+ prefs[:authentication] = 'devise'
527
+ prefs[:devise_modules] = 'confirmable'
528
+ prefs[:authorization] = 'cancan'
529
+ prefs[:starter_app] = 'admin_app'
530
+ prefs[:form_builder] = 'simple_form'
531
+ prefs[:quiet_assets] = true
532
+ prefs[:local_env_file] = 'figaro'
533
+ prefs[:better_errors] = true
534
+ if prefer :git, true
535
+ prefs[:prelaunch_branch] = multiple_choice "Git branch for the prelaunch app?",
536
+ [["wip (work-in-progress)", "wip"],
537
+ ["master", "master"],
538
+ ["prelaunch", "prelaunch"],
539
+ ["staging", "staging"]] unless prefs.has_key? :prelaunch_branch
540
+
541
+ prefs[:main_branch] = unless 'master' == prefs[:prelaunch_branch]
542
+ 'master'
543
+ else
544
+ multiple_choice "Git branch for the main app?",
545
+ [["None", "none"],
546
+ ["wip (work-in-progress)", "wip"],
547
+ ["edge", "edge"]]
548
+ end unless prefs.has_key? :main_branch
549
+ end
550
+ when 'rails3-bootstrap-devise-cancan'
551
+ prefs[:git] = true
552
+ prefs[:database] = 'sqlite'
553
+ prefs[:unit_test] = 'rspec'
554
+ prefs[:integration] = 'cucumber'
555
+ prefs[:fixtures] = 'factory_girl'
556
+ prefs[:frontend] = 'bootstrap2'
557
+ prefs[:email] = 'gmail'
558
+ prefs[:authentication] = 'devise'
559
+ prefs[:devise_modules] = 'default'
560
+ prefs[:authorization] = 'cancan'
561
+ prefs[:starter_app] = 'admin_app'
562
+ prefs[:form_builder] = 'simple_form'
563
+ prefs[:quiet_assets] = true
564
+ prefs[:local_env_file] = 'figaro'
565
+ prefs[:better_errors] = true
566
+ when 'rails3-devise-rspec-cucumber'
567
+ prefs[:git] = true
568
+ prefs[:database] = 'sqlite'
569
+ prefs[:unit_test] = 'rspec'
570
+ prefs[:integration] = 'cucumber'
571
+ prefs[:fixtures] = 'factory_girl'
572
+ prefs[:frontend] = 'none'
573
+ prefs[:email] = 'gmail'
574
+ prefs[:authentication] = 'devise'
575
+ prefs[:devise_modules] = 'default'
576
+ prefs[:authorization] = 'none'
577
+ prefs[:starter_app] = 'users_app'
578
+ prefs[:form_builder] = 'none'
579
+ prefs[:quiet_assets] = true
580
+ prefs[:local_env_file] = 'figaro'
581
+ prefs[:better_errors] = true
582
+ when 'rails3-devise-rspec-cucumber-fabrication'
583
+ prefs[:git] = true
584
+ prefs[:database] = 'sqlite'
585
+ prefs[:unit_test] = 'rspec'
586
+ prefs[:integration] = 'cucumber'
587
+ prefs[:fixtures] = 'fabrication'
588
+ prefs[:frontend] = 'none'
589
+ prefs[:email] = 'gmail'
590
+ prefs[:authentication] = 'devise'
591
+ prefs[:devise_modules] = 'default'
592
+ prefs[:authorization] = 'none'
593
+ prefs[:starter_app] = 'users_app'
594
+ prefs[:form_builder] = 'none'
595
+ prefs[:quiet_assets] = true
596
+ prefs[:local_env_file] = 'figaro'
597
+ prefs[:better_errors] = true
598
+ when 'rails3-mongoid-devise'
599
+ prefs[:git] = true
600
+ prefs[:database] = 'mongodb'
601
+ prefs[:orm] = 'mongoid'
602
+ prefs[:unit_test] = 'rspec'
603
+ prefs[:integration] = 'cucumber'
604
+ prefs[:fixtures] = 'factory_girl'
605
+ prefs[:frontend] = 'none'
606
+ prefs[:email] = 'gmail'
607
+ prefs[:authentication] = 'devise'
608
+ prefs[:devise_modules] = 'default'
609
+ prefs[:authorization] = 'none'
610
+ prefs[:starter_app] = 'users_app'
611
+ prefs[:form_builder] = 'none'
612
+ prefs[:quiet_assets] = true
613
+ prefs[:local_env_file] = 'figaro'
614
+ prefs[:better_errors] = true
615
+ when 'rails3-mongoid-omniauth'
616
+ prefs[:git] = true
617
+ prefs[:database] = 'mongodb'
618
+ prefs[:orm] = 'mongoid'
619
+ prefs[:unit_test] = 'rspec'
620
+ prefs[:integration] = 'cucumber'
621
+ prefs[:fixtures] = 'factory_girl'
622
+ prefs[:frontend] = 'none'
623
+ prefs[:email] = 'none'
624
+ prefs[:authentication] = 'omniauth'
625
+ prefs[:omniauth_provider] = 'twitter'
626
+ prefs[:authorization] = 'none'
627
+ prefs[:starter_app] = 'users_app'
628
+ prefs[:form_builder] = 'none'
629
+ prefs[:quiet_assets] = true
630
+ prefs[:local_env_file] = 'figaro'
631
+ prefs[:better_errors] = true
632
+ when 'rails3-subdomains'
633
+ prefs[:git] = true
634
+ prefs[:database] = 'mongodb'
635
+ prefs[:orm] = 'mongoid'
636
+ prefs[:unit_test] = 'rspec'
637
+ prefs[:integration] = 'cucumber'
638
+ prefs[:fixtures] = 'factory_girl'
639
+ prefs[:frontend] = 'none'
640
+ prefs[:email] = 'gmail'
641
+ prefs[:authentication] = 'devise'
642
+ prefs[:devise_modules] = 'default'
643
+ prefs[:authorization] = 'none'
644
+ prefs[:starter_app] = 'subdomains_app'
645
+ prefs[:form_builder] = 'none'
646
+ prefs[:quiet_assets] = true
647
+ prefs[:local_env_file] = 'figaro'
648
+ prefs[:better_errors] = true
649
+ end
650
+ # >-------------------------- recipes/railsapps.rb ---------------------------end<
651
+ # >-------------------------- templates/recipe.erb ---------------------------end<
652
+
653
+ # >-------------------------- templates/recipe.erb ---------------------------start<
654
+ # >---------------------------------[ setup ]---------------------------------<
655
+ @current_recipe = "setup"
656
+ @before_configs["setup"].call if @before_configs["setup"]
657
+ say_recipe 'setup'
658
+ @configs[@current_recipe] = config
659
+ # >---------------------------- recipes/setup.rb -----------------------------start<
660
+
661
+ # Application template recipe for the rails_apps_composer. Change the recipe here:
662
+ # https://github.com/RailsApps/rails_apps_composer/blob/master/recipes/setup.rb
663
+
664
+ ## Ruby on Rails
665
+ HOST_OS = RbConfig::CONFIG['host_os']
666
+ say_wizard "Your operating system is #{HOST_OS}."
667
+ say_wizard "You are using Ruby version #{RUBY_VERSION}."
668
+ say_wizard "You are using Rails version #{Rails::VERSION::STRING}."
669
+
670
+ ## Is sqlite3 in the Gemfile?
671
+ gemfile = File.read(destination_root() + '/Gemfile')
672
+ sqlite_detected = gemfile.include? 'sqlite3'
673
+
674
+ ## Web Server
675
+ prefs[:dev_webserver] = multiple_choice "Web server for development?", [["WEBrick (default)", "webrick"],
676
+ ["Thin", "thin"], ["Unicorn", "unicorn"], ["Puma", "puma"], ["Phusion Passenger (Apache/Nginx)", "passenger"],
677
+ ["Phusion Passenger (Standalone)", "passenger_standalone"]] unless prefs.has_key? :dev_webserver
678
+ prefs[:prod_webserver] = multiple_choice "Web server for production?", [["Same as development", "same"],
679
+ ["Thin", "thin"], ["Unicorn", "unicorn"], ["Puma", "puma"], ["Phusion Passenger (Apache/Nginx)", "passenger"],
680
+ ["Phusion Passenger (Standalone)", "passenger_standalone"]] unless prefs.has_key? :prod_webserver
681
+ if prefs[:prod_webserver] == 'same'
682
+ case prefs[:dev_webserver]
683
+ when 'thin'
684
+ prefs[:prod_webserver] = 'thin'
685
+ when 'unicorn'
686
+ prefs[:prod_webserver] = 'unicorn'
687
+ when 'puma'
688
+ prefs[:prod_webserver] = 'puma'
689
+ when 'passenger'
690
+ prefs[:prod_webserver] = 'passenger'
691
+ when 'passenger_standalone'
692
+ prefs[:prod_webserver] = 'passenger_standalone'
693
+ end
694
+ end
695
+
696
+ ## Database Adapter
697
+ prefs[:database] = multiple_choice "Database used in development?", [["SQLite", "sqlite"], ["PostgreSQL", "postgresql"],
698
+ ["MySQL", "mysql"], ["MongoDB", "mongodb"], ["Redis", "redis"]] unless prefs.has_key? :database
699
+ case prefs[:database]
700
+ when 'redis'
701
+ prefs[:orm] = multiple_choice "How will you connect to Redis?", [["Redis","Redis"]] unless prefs.has_key? :orm
702
+ end
703
+ when 'mongodb'
704
+ unless sqlite_detected
705
+ prefs[:orm] = multiple_choice "How will you connect to MongoDB?", [["Mongoid","mongoid"]] unless prefs.has_key? :orm
706
+ else
707
+ say_wizard "WARNING! SQLite gem detected in the Gemfile"
708
+ say_wizard "If you wish to use MongoDB you must skip Active Record."
709
+ say_wizard "If using rails_apps_composer, choose 'skip Active Record'."
710
+ say_wizard "If using Rails Composer or an application template, use the '-O' flag as in 'rails new foo -O'."
711
+ prefs[:fail] = multiple_choice "Abort or continue?", [["abort", "abort"], ["continue", "continue"]]
712
+ if prefer :fail, 'abort'
713
+ raise StandardError.new "SQLite detected in the Gemfile. Use '-O' or '--skip-activerecord' as in 'rails new foo -O' if you don't want ActiveRecord and SQLite"
714
+ end
715
+ end
716
+ end
717
+
718
+ ## Template Engine
719
+ prefs[:templates] = multiple_choice "Template engine?", [["ERB", "erb"], ["Haml", "haml"], ["Slim", "slim"]] unless prefs.has_key? :templates
720
+
721
+ ## Testing Framework
722
+ if recipes.include? 'testing'
723
+ prefs[:unit_test] = multiple_choice "Unit testing?", [["Test::Unit", "test_unit"], ["RSpec", "rspec"], ["MiniTest", "minitest"]] unless prefs.has_key? :unit_test
724
+ prefs[:integration] = multiple_choice "Integration testing?", [["None", "none"], ["RSpec with Capybara", "rspec-capybara"],
725
+ ["Cucumber with Capybara", "cucumber"], ["Turnip with Capybara", "turnip"], ["MiniTest with Capybara", "minitest-capybara"]] unless prefs.has_key? :integration
726
+ prefs[:continuous_testing] = multiple_choice "Continuous testing?", [["None", "none"], ["Guard", "guard"]] unless prefs.has_key? :continuous_testing
727
+ prefs[:fixtures] = multiple_choice "Fixture replacement?", [["None","none"], ["Factory Girl","factory_girl"], ["Machinist","machinist"], ["Fabrication","fabrication"]] unless prefs.has_key? :fixtures
728
+ end
729
+
730
+ ## Front-end Framework
731
+ if recipes.include? 'frontend'
732
+ prefs[:frontend] = multiple_choice "Front-end framework?", [["None", "none"],
733
+ ["Zurb Foundation 5.0", "foundation5"], ["Zurb Foundation 4.0", "foundation4"],
734
+ ["Twitter Bootstrap 3.0", "bootstrap3"], ["Twitter Bootstrap 2.3", "bootstrap2"],
735
+ ["Simple CSS", "simple"]] unless prefs.has_key? :frontend
736
+ end
737
+
738
+ ## Email
739
+ if recipes.include? 'email'
740
+ unless prefs.has_key? :email
741
+ say_wizard "The Devise 'forgot password' feature requires email." if prefer :authentication, 'devise'
742
+ prefs[:email] = multiple_choice "Add support for sending email?", [["None", "none"], ["Gmail","gmail"], ["SMTP","smtp"],
743
+ ["SendGrid","sendgrid"], ["Mandrill","mandrill"]]
744
+ end
745
+ else
746
+ prefs[:email] = 'none'
747
+ end
748
+
749
+ ## Authentication and Authorization
750
+ if recipes.include? 'models'
751
+ prefs[:authentication] = multiple_choice "Authentication?", [["None", "none"], ["Devise", "devise"], ["OmniAuth", "omniauth"]] unless prefs.has_key? :authentication
752
+ case prefs[:authentication]
753
+ when 'devise'
754
+ if prefer :orm, 'mongoid'
755
+ prefs[:devise_modules] = multiple_choice "Devise modules?", [["Devise with default modules","default"]] unless prefs.has_key? :devise_modules
756
+ else
757
+ if rails_4?
758
+ prefs[:devise_modules] = multiple_choice "Devise modules?", [["Devise with default modules","default"],
759
+ ["Devise with Confirmable module","confirmable"],
760
+ ["Devise with Confirmable and Invitable modules","invitable"]] unless prefs.has_key? :devise_modules
761
+ else
762
+ prefs[:devise_modules] = multiple_choice "Devise modules?", [["Devise with default modules","default"],
763
+ ["Devise with Confirmable module","confirmable"]] unless prefs.has_key? :devise_modules
764
+ end
765
+ end
766
+ when 'omniauth'
767
+ prefs[:omniauth_provider] = multiple_choice "OmniAuth provider?", [["Facebook", "facebook"], ["Twitter", "twitter"], ["GitHub", "github"],
768
+ ["LinkedIn", "linkedin"], ["Google-Oauth-2", "google_oauth2"], ["Tumblr", "tumblr"]] unless prefs.has_key? :omniauth_provider
769
+ end
770
+ prefs[:authorization] = multiple_choice "Authorization?", [["None", "none"], ["CanCan with Rolify", "cancan"]] unless prefs.has_key? :authorization
771
+ end
772
+
773
+ ## Form Builder
774
+ prefs[:form_builder] = multiple_choice "Use a form builder gem?", [["None", "none"], ["SimpleForm", "simple_form"]] unless prefs.has_key? :form_builder
775
+
776
+ ## MVC
777
+ if (recipes.include? 'models') && (recipes.include? 'controllers') && (recipes.include? 'views') && (recipes.include? 'routes')
778
+ if prefer :authorization, 'cancan'
779
+ prefs[:starter_app] = multiple_choice "Install a starter app?", [["None", "none"], ["Home Page", "home_app"],
780
+ ["Home Page, User Accounts", "users_app"], ["Home Page, User Accounts, Admin Dashboard", "admin_app"]] unless prefs.has_key? :starter_app
781
+ elsif prefer :authentication, 'devise'
782
+ if prefer :orm, 'mongoid'
783
+ prefs[:starter_app] = multiple_choice "Install a starter app?", [["None", "none"], ["Home Page", "home_app"],
784
+ ["Home Page, User Accounts", "users_app"], ["Home Page, User Accounts, Subdomains", "subdomains_app"]] unless prefs.has_key? :starter_app
785
+ else
786
+ prefs[:starter_app] = multiple_choice "Install a starter app?", [["None", "none"], ["Home Page", "home_app"],
787
+ ["Home Page, User Accounts", "users_app"]] unless prefs.has_key? :starter_app
788
+ end
789
+ elsif prefer :authentication, 'omniauth'
790
+ prefs[:starter_app] = multiple_choice "Install a starter app?", [["None", "none"], ["Home Page", "home_app"],
791
+ ["Home Page, User Accounts", "users_app"]] unless prefs.has_key? :starter_app
792
+ else
793
+ prefs[:starter_app] = multiple_choice "Install a starter app?", [["None", "none"], ["Home Page", "home_app"]] unless prefs.has_key? :starter_app
794
+ end
795
+ end
796
+
797
+ # save diagnostics before anything can fail
798
+ create_file "README", "RECIPES\n#{recipes.sort.inspect}\n"
799
+ append_file "README", "PREFERENCES\n#{prefs.inspect}"
800
+ # >---------------------------- recipes/setup.rb -----------------------------end<
801
+ # >-------------------------- templates/recipe.erb ---------------------------end<
802
+
803
+ # >-------------------------- templates/recipe.erb ---------------------------start<
804
+ # >--------------------------------[ readme ]---------------------------------<
805
+ @current_recipe = "readme"
806
+ @before_configs["readme"].call if @before_configs["readme"]
807
+ say_recipe 'readme'
808
+ @configs[@current_recipe] = config
809
+ # >---------------------------- recipes/readme.rb ----------------------------start<
810
+
811
+ # Application template recipe for the rails_apps_composer. Change the recipe here:
812
+ # https://github.com/RailsApps/rails_apps_composer/blob/master/recipes/readme.rb
813
+
814
+ after_everything do
815
+ say_wizard "recipe running after everything"
816
+
817
+ # remove default READMEs
818
+ %w{
819
+ README
820
+ README.rdoc
821
+ doc/README_FOR_APP
822
+ }.each { |file| remove_file file }
823
+
824
+ # add placeholder READMEs and humans.txt file
825
+ copy_from_repo 'public/humans.txt'
826
+ copy_from_repo 'README'
827
+ copy_from_repo 'README.md'
828
+ gsub_file "README", /App_Name/, "#{app_name.humanize.titleize}"
829
+ gsub_file "README.md", /App_Name/, "#{app_name.humanize.titleize}"
830
+
831
+ # Diagnostics
832
+ gsub_file "README.md", /recipes that are known/, "recipes that are NOT known" if diagnostics[:recipes] == 'fail'
833
+ gsub_file "README.md", /preferences that are known/, "preferences that are NOT known" if diagnostics[:prefs] == 'fail'
834
+ print_recipes = recipes.sort.map { |r| "\n* #{r}" }.join('')
835
+ print_preferences = prefs.map { |k, v| "\n* #{k}: #{v}" }.join('')
836
+ gsub_file "README.md", /RECIPES/, print_recipes
837
+ gsub_file "README.md", /PREFERENCES/, print_preferences
838
+ gsub_file "README", /RECIPES/, print_recipes
839
+ gsub_file "README", /PREFERENCES/, print_preferences
840
+
841
+ # Ruby on Rails
842
+ gsub_file "README.md", /\* Ruby/, "* Ruby version #{RUBY_VERSION}"
843
+ gsub_file "README.md", /\* Rails/, "* Rails version #{Rails::VERSION::STRING}"
844
+
845
+ # Database
846
+ gsub_file "README.md", /SQLite/, "PostgreSQL" if prefer :database, 'postgresql'
847
+ gsub_file "README.md", /SQLite/, "MySQL" if prefer :database, 'mysql'
848
+ gsub_file "README.md", /SQLite/, "MongoDB" if prefer :database, 'mongodb'
849
+ gsub_file "README.md", /ActiveRecord/, "the Mongoid ORM" if prefer :orm, 'mongoid'
850
+
851
+ # Template Engine
852
+ gsub_file "README.md", /ERB/, "Haml" if prefer :templates, 'haml'
853
+ gsub_file "README.md", /ERB/, "Slim" if prefer :templates, 'slim'
854
+
855
+ # Testing Framework
856
+ gsub_file "README.md", /Test::Unit/, "RSpec" if prefer :unit_test, 'rspec'
857
+ gsub_file "README.md", /RSpec/, "RSpec and Cucumber" if prefer :integration, 'cucumber'
858
+ gsub_file "README.md", /RSpec/, "RSpec and Factory Girl" if prefer :fixtures, 'factory_girl'
859
+ gsub_file "README.md", /RSpec/, "RSpec and Machinist" if prefer :fixtures, 'machinist'
860
+
861
+ # Front-end Framework
862
+ gsub_file "README.md", /Front-end Framework: None/, "Front-end Framework: Twitter Bootstrap 2.3 (Sass)" if prefer :frontend, 'bootstrap2'
863
+ gsub_file "README.md", /Front-end Framework: None/, "Front-end Framework: Twitter Bootstrap 3.0 (Sass)" if prefer :frontend, 'bootstrap3'
864
+ gsub_file "README.md", /Front-end Framework: None/, "Front-end Framework: Zurb Foundation 4" if prefer :frontend, 'foundation4'
865
+ gsub_file "README.md", /Front-end Framework: None/, "Front-end Framework: Zurb Foundation 5" if prefer :frontend, 'foundation5'
866
+
867
+ # Form Builder
868
+ gsub_file "README.md", /Form Builder: None/, "Form Builder: SimpleForm" if prefer :form_builder, 'simple_form'
869
+
870
+ # Email
871
+ unless prefer :email, 'none'
872
+ gsub_file "README.md", /Gmail/, "SMTP" if prefer :email, 'smtp'
873
+ gsub_file "README.md", /Gmail/, "SendGrid" if prefer :email, 'sendgrid'
874
+ gsub_file "README.md", /Gmail/, "Mandrill" if prefer :email, 'mandrill'
875
+ gsub_file "README.md", /Email delivery is disabled in development./, "Email delivery is configured via MailCatcher in development." if prefer :mailcatcher, true
876
+ insert_into_file 'README.md', "\nEmail rendering in development enabled via MailView.", :after => /Email delivery is.*\n/ if prefer :mail_view, true
877
+ else
878
+ gsub_file "README.md", /Email/, ""
879
+ gsub_file "README.md", /-----/, ""
880
+ gsub_file "README.md", /The application is configured to send email using a Gmail account./, ""
881
+ gsub_file "README.md", /Email delivery is disabled in development./, ""
882
+ end
883
+
884
+ # Authentication and Authorization
885
+ gsub_file "README.md", /Authentication: None/, "Authentication: Devise" if prefer :authentication, 'devise'
886
+ gsub_file "README.md", /Authentication: None/, "Authentication: OmniAuth" if prefer :authentication, 'omniauth'
887
+ gsub_file "README.md", /Authorization: None/, "Authorization: CanCan" if prefer :authorization, 'cancan'
888
+
889
+ # Admin
890
+ gsub_file "README.md", /Admin: None/, "Admin: ActiveAdmin" if prefer :admin, 'activeadmin'
891
+ gsub_file "README.md", /Admin: None/, "Admin: RailsAdmin" if prefer :admin, 'rails_admin'
892
+
893
+ git :add => '-A' if prefer :git, true
894
+ git :commit => '-qm "rails_apps_composer: add README files"' if prefer :git, true
895
+
896
+ end # after_everything
897
+ # >---------------------------- recipes/readme.rb ----------------------------end<
898
+ # >-------------------------- templates/recipe.erb ---------------------------end<
899
+
900
+ # >-------------------------- templates/recipe.erb ---------------------------start<
901
+ # >---------------------------------[ admin ]---------------------------------<
902
+ @current_recipe = "admin"
903
+ @before_configs["admin"].call if @before_configs["admin"]
904
+ say_recipe 'admin'
905
+ config = {}
906
+ config['admin'] = multiple_choice("Install admin gem?", [["None", "none"], ["ActiveAdmin", "activeadmin"], ["RailsAdmin", "rails_admin"]]) if true && true unless config.key?('admin') || prefs.has_key?(:admin)
907
+ @configs[@current_recipe] = config
908
+ # >---------------------------- recipes/admin.rb -----------------------------start<
909
+
910
+ # Application template recipe for the rails_apps_composer. Change the recipe here:
911
+ # https://github.com/RailsApps/rails_apps_composer/blob/master/recipes/admin.rb
912
+
913
+ case config['admin']
914
+ when 'activeadmin'
915
+ prefs[:admin] = 'activeadmin'
916
+ when 'rails_admin'
917
+ prefs[:admin] = 'rails_admin'
918
+ end
919
+
920
+ if prefer :admin, 'activeadmin'
921
+ if rails_4?
922
+ add_gem 'activeadmin', github: 'gregbell/active_admin'
923
+ else
924
+ add_gem 'activeadmin'
925
+ end
926
+ end
927
+ add_gem 'rails_admin' if prefer :admin, 'rails_admin'
928
+
929
+ after_bundler do
930
+ if prefer :admin, 'activeadmin'
931
+ say_wizard "recipe installing activeadmin"
932
+ generate 'active_admin:install'
933
+ end
934
+ if prefer :admin, 'rails_admin'
935
+ say_wizard "recipe installing rails_admin"
936
+ generate 'rails_admin:install'
937
+ end
938
+ ### GIT
939
+ git :add => '-A' if prefer :git, true
940
+ git :commit => %Q(-qm "rails_apps_composer: installed #{prefs[:admin]}") if prefer :git, true
941
+ end
942
+ # >---------------------------- recipes/admin.rb -----------------------------end<
943
+ # >-------------------------- templates/recipe.erb ---------------------------end<
944
+
945
+ # >-------------------------- templates/recipe.erb ---------------------------start<
946
+ # >---------------------------------[ email ]---------------------------------<
947
+ @current_recipe = "email"
948
+ @before_configs["email"].call if @before_configs["email"]
949
+ say_recipe 'email'
950
+ @configs[@current_recipe] = config
951
+ # >---------------------------- recipes/email.rb -----------------------------start<
952
+
953
+ # Application template recipe for the rails_apps_composer. Change the recipe here:
954
+ # https://github.com/RailsApps/rails_apps_composer/blob/master/recipes/email.rb
955
+
956
+ after_bundler do
957
+ say_wizard "recipe running after 'bundle install'"
958
+ unless prefer :email, 'none'
959
+ if rails_4?
960
+ dev_email_text = <<-TEXT
961
+ # ActionMailer Config
962
+ config.action_mailer.default_url_options = { :host => 'localhost:3000' }
963
+ config.action_mailer.delivery_method = :smtp
964
+ config.action_mailer.raise_delivery_errors = true
965
+ # Send email in development mode.
966
+ config.action_mailer.perform_deliveries = false
967
+ TEXT
968
+ prod_email_text = <<-TEXT
969
+ # ActionMailer Config
970
+ config.action_mailer.default_url_options = { :host => 'example.com' }
971
+ config.action_mailer.delivery_method = :smtp
972
+ config.action_mailer.perform_deliveries = true
973
+ config.action_mailer.raise_delivery_errors = false
974
+ TEXT
975
+ inject_into_file 'config/environments/development.rb', dev_email_text, :after => "config.assets.debug = true"
976
+ inject_into_file 'config/environments/production.rb', prod_email_text, :after => "config.active_support.deprecation = :notify"
977
+ else
978
+ ### DEVELOPMENT
979
+ gsub_file 'config/environments/development.rb', /# Don't care if the mailer can't send/, '# ActionMailer Config'
980
+ gsub_file 'config/environments/development.rb', /config.action_mailer.raise_delivery_errors = false/ do
981
+ <<-RUBY
982
+ config.action_mailer.default_url_options = { :host => 'localhost:3000' }
983
+ config.action_mailer.delivery_method = :smtp
984
+ # change to true to allow email to be sent during development
985
+ config.action_mailer.perform_deliveries = false
986
+ config.action_mailer.raise_delivery_errors = true
987
+ config.action_mailer.default :charset => "utf-8"
988
+ RUBY
989
+ end
990
+ ### TEST
991
+ inject_into_file 'config/environments/test.rb', :before => "\nend" do
992
+ <<-RUBY
993
+ \n
994
+ # ActionMailer Config
995
+ config.action_mailer.default_url_options = { :host => 'example.com' }
996
+ RUBY
997
+ end
998
+ ### PRODUCTION
999
+ gsub_file 'config/environments/production.rb', /config.active_support.deprecation = :notify/ do
1000
+ <<-RUBY
1001
+ config.active_support.deprecation = :notify
1002
+
1003
+ config.action_mailer.default_url_options = { :host => 'example.com' }
1004
+ # ActionMailer Config
1005
+ # Setup for production - deliveries, no errors raised
1006
+ config.action_mailer.delivery_method = :smtp
1007
+ config.action_mailer.perform_deliveries = true
1008
+ config.action_mailer.raise_delivery_errors = false
1009
+ config.action_mailer.default :charset => "utf-8"
1010
+ RUBY
1011
+ end
1012
+ end
1013
+ end
1014
+ ### GMAIL ACCOUNT
1015
+ if prefer :email, 'gmail'
1016
+ gmail_configuration_text = <<-TEXT
1017
+ \n
1018
+ config.action_mailer.smtp_settings = {
1019
+ address: "smtp.gmail.com",
1020
+ port: 587,
1021
+ domain: ENV["DOMAIN_NAME"],
1022
+ authentication: "plain",
1023
+ enable_starttls_auto: true,
1024
+ user_name: ENV["GMAIL_USERNAME"],
1025
+ password: ENV["GMAIL_PASSWORD"]
1026
+ }
1027
+ TEXT
1028
+ inject_into_file 'config/environments/development.rb', gmail_configuration_text, :after => "config.assets.debug = true"
1029
+ inject_into_file 'config/environments/production.rb', gmail_configuration_text, :after => "config.active_support.deprecation = :notify"
1030
+ end
1031
+ ### SENDGRID ACCOUNT
1032
+ if prefer :email, 'sendgrid'
1033
+ sendgrid_configuration_text = <<-TEXT
1034
+ \n
1035
+ config.action_mailer.smtp_settings = {
1036
+ address: "smtp.sendgrid.net",
1037
+ port: 587,
1038
+ domain: ENV["DOMAIN_NAME"],
1039
+ authentication: "plain",
1040
+ user_name: ENV["SENDGRID_USERNAME"],
1041
+ password: ENV["SENDGRID_PASSWORD"]
1042
+ }
1043
+ TEXT
1044
+ inject_into_file 'config/environments/development.rb', sendgrid_configuration_text, :after => "config.assets.debug = true"
1045
+ inject_into_file 'config/environments/production.rb', sendgrid_configuration_text, :after => "config.active_support.deprecation = :notify"
1046
+ end
1047
+ ### MANDRILL ACCOUNT
1048
+ if prefer :email, 'mandrill'
1049
+ mandrill_configuration_text = <<-TEXT
1050
+ \n
1051
+ config.action_mailer.smtp_settings = {
1052
+ :address => "smtp.mandrillapp.com",
1053
+ :port => 587,
1054
+ :user_name => ENV["MANDRILL_USERNAME"],
1055
+ :password => ENV["MANDRILL_APIKEY"]
1056
+ }
1057
+ TEXT
1058
+ inject_into_file 'config/environments/development.rb', mandrill_configuration_text, :after => "config.assets.debug = true"
1059
+ inject_into_file 'config/environments/production.rb', mandrill_configuration_text, :after => "config.active_support.deprecation = :notify"
1060
+ end
1061
+ ### GIT
1062
+ git :add => '-A' if prefer :git, true
1063
+ git :commit => '-qm "rails_apps_composer: set email accounts"' if prefer :git, true
1064
+ end # after_bundler
1065
+ # >---------------------------- recipes/email.rb -----------------------------end<
1066
+ # >-------------------------- templates/recipe.erb ---------------------------end<
1067
+
1068
+ # >-------------------------- templates/recipe.erb ---------------------------start<
1069
+ # >---------------------------------[ gems ]----------------------------------<
1070
+ @current_recipe = "gems"
1071
+ @before_configs["gems"].call if @before_configs["gems"]
1072
+ say_recipe 'gems'
1073
+ @configs[@current_recipe] = config
1074
+ # >----------------------------- recipes/gems.rb -----------------------------start<
1075
+
1076
+ # Application template recipe for the rails_apps_composer. Change the recipe here:
1077
+ # https://github.com/RailsApps/rails_apps_composer/blob/master/recipes/gems.rb
1078
+
1079
+ ### GEMFILE ###
1080
+
1081
+ ## Ruby on Rails
1082
+ insert_into_file('Gemfile', "ruby '#{RUBY_VERSION}'\n", :before => /^ *gem 'rails'/, :force => false)
1083
+
1084
+ ## Cleanup
1085
+ # remove the 'sdoc' gem
1086
+ gsub_file 'Gemfile', /group :doc do/, ''
1087
+ gsub_file 'Gemfile', /\s*gem 'sdoc', require: false\nend/, ''
1088
+
1089
+ assets_group = rails_4? ? nil : :assets
1090
+
1091
+ ## Web Server
1092
+ if (prefs[:dev_webserver] == prefs[:prod_webserver])
1093
+ add_gem 'thin' if prefer :dev_webserver, 'thin'
1094
+ add_gem 'unicorn' if prefer :dev_webserver, 'unicorn'
1095
+ add_gem 'unicorn-rails' if prefer :dev_webserver, 'unicorn'
1096
+ add_gem 'puma' if prefer :dev_webserver, 'puma'
1097
+ add_gem 'passenger' if prefer :dev_webserver, 'passenger_standalone'
1098
+ else
1099
+ add_gem 'thin', :group => [:development, :test] if prefer :dev_webserver, 'thin'
1100
+ add_gem 'unicorn', :group => [:development, :test] if prefer :dev_webserver, 'unicorn'
1101
+ add_gem 'unicorn-rails', :group => [:development, :test] if prefer :dev_webserver, 'unicorn'
1102
+ add_gem 'puma', :group => [:development, :test] if prefer :dev_webserver, 'puma'
1103
+ add_gem 'passenger', :group => [:development, :test] if prefer :dev_webserver, 'passenger_standalone'
1104
+ add_gem 'thin', :group => :production if prefer :prod_webserver, 'thin'
1105
+ add_gem 'unicorn', :group => :production if prefer :prod_webserver, 'unicorn'
1106
+ add_gem 'puma', :group => :production if prefer :prod_webserver, 'puma'
1107
+ add_gem 'passenger', :group => :production if prefer :prod_webserver, 'passenger_standalone'
1108
+ end
1109
+
1110
+ ## Rails 4.0 attr_accessible Compatibility
1111
+ # if prefer :apps4, false
1112
+ # add_gem 'protected_attributes' if rails_4?
1113
+ # end
1114
+
1115
+ ## Database Adapter
1116
+ unless prefer :database, 'default'
1117
+ gsub_file 'Gemfile', /gem 'sqlite3'\n/, '' unless prefer :database, 'sqlite'
1118
+ end
1119
+ if rails_4?
1120
+ add_gem 'mongoid', github: 'mongoid/mongoid' if prefer :orm, 'mongoid'
1121
+ else
1122
+ add_gem 'mongoid' if prefer :orm, 'mongoid'
1123
+ end
1124
+ gsub_file 'Gemfile', /gem 'pg'.*/, ''
1125
+ add_gem 'pg' if prefer :database, 'postgresql'
1126
+ gsub_file 'Gemfile', /gem 'mysql2'.*/, ''
1127
+ add_gem 'mysql2' if prefer :database, 'mysql'
1128
+
1129
+ ## Template Engine
1130
+ if prefer :templates, 'haml'
1131
+ add_gem 'haml-rails'
1132
+ add_gem 'html2haml', :group => :development
1133
+ end
1134
+ if prefer :templates, 'slim'
1135
+ add_gem 'slim-rails'
1136
+ add_gem 'haml2slim', :group => :development
1137
+ add_gem 'html2haml', :group => :development
1138
+ end
1139
+
1140
+ ## Testing Framework
1141
+ if prefer :unit_test, 'rspec'
1142
+ add_gem 'rspec-rails', :group => [:development, :test]
1143
+ add_gem 'capybara', :group => :test if prefer :integration, 'rspec-capybara'
1144
+ add_gem 'database_cleaner', '1.0.1', :group => :test
1145
+ if prefer :orm, 'mongoid'
1146
+ if rails_4?
1147
+ add_gem 'mongoid-rspec', '>= 1.10.0', :group => :test
1148
+ else
1149
+ add_gem 'mongoid-rspec', :group => :test
1150
+ end
1151
+ end
1152
+ add_gem 'email_spec', :group => :test
1153
+ end
1154
+ if prefer :unit_test, 'minitest'
1155
+ add_gem 'minitest-spec-rails', :group => :test
1156
+ add_gem 'minitest-wscolor', :group => :test
1157
+ add_gem 'capybara', :group => :test if prefer :integration, 'minitest-capybara'
1158
+ end
1159
+ if prefer :integration, 'cucumber'
1160
+ add_gem 'cucumber-rails', :group => :test, :require => false
1161
+ add_gem 'database_cleaner', '1.0.1', :group => :test unless prefer :unit_test, 'rspec'
1162
+ add_gem 'launchy', :group => :test
1163
+ add_gem 'capybara', :group => :test
1164
+ end
1165
+ add_gem 'turnip', '>= 1.1.0', :group => :test if prefer :integration, 'turnip'
1166
+ if prefer :continuous_testing, 'guard'
1167
+ add_gem 'guard-bundler', :group => :development
1168
+ add_gem 'guard-cucumber', :group => :development if prefer :integration, 'cucumber'
1169
+ add_gem 'guard-rails', :group => :development
1170
+ add_gem 'guard-rspec', :group => :development if prefer :unit_test, 'rspec'
1171
+ add_gem 'rb-inotify', :group => :development, :require => false
1172
+ add_gem 'rb-fsevent', :group => :development, :require => false
1173
+ add_gem 'rb-fchange', :group => :development, :require => false
1174
+ end
1175
+ add_gem 'factory_girl_rails', :group => [:development, :test] if prefer :fixtures, 'factory_girl'
1176
+ add_gem 'fabrication', :group => [:development, :test] if prefer :fixtures, 'fabrication'
1177
+ add_gem 'machinist', :group => :test if prefer :fixtures, 'machinist'
1178
+
1179
+ ## Front-end Framework
1180
+ add_gem 'rails_layout', :group => :development
1181
+ case prefs[:frontend]
1182
+ when 'bootstrap2'
1183
+ add_gem 'bootstrap-sass', '~> 2.3.2.2'
1184
+ when 'bootstrap3'
1185
+ add_gem 'bootstrap-sass', '>= 3.0.0.0'
1186
+ when 'foundation4'
1187
+ if rails_4?
1188
+ add_gem 'zurb-foundation', '~> 4.3.2'
1189
+ add_gem 'compass-rails', '~> 1.1.2'
1190
+ else
1191
+ add_gem 'zurb-foundation', '~> 4.3.2', :group => assets_group
1192
+ add_gem 'compass-rails', '~> 1.0.3', :group => assets_group
1193
+ end
1194
+ when 'foundation5'
1195
+ add_gem 'foundation-rails'
1196
+ end
1197
+
1198
+ ## Email
1199
+ add_gem 'sendgrid' if prefer :email, 'sendgrid'
1200
+
1201
+ ## Authentication (Devise)
1202
+ add_gem 'devise' if prefer :authentication, 'devise'
1203
+ add_gem 'devise_invitable' if prefer :devise_modules, 'invitable'
1204
+
1205
+ ## Authentication (OmniAuth)
1206
+ add_gem 'omniauth' if prefer :authentication, 'omniauth'
1207
+ add_gem 'omniauth-twitter' if prefer :omniauth_provider, 'twitter'
1208
+ add_gem 'omniauth-facebook' if prefer :omniauth_provider, 'facebook'
1209
+ add_gem 'omniauth-github' if prefer :omniauth_provider, 'github'
1210
+ add_gem 'omniauth-linkedin' if prefer :omniauth_provider, 'linkedin'
1211
+ add_gem 'omniauth-google-oauth2' if prefer :omniauth_provider, 'google_oauth2'
1212
+ add_gem 'omniauth-tumblr' if prefer :omniauth_provider, 'tumblr'
1213
+
1214
+ ## Authorization
1215
+ if prefer :authorization, 'cancan'
1216
+ add_gem 'cancan'
1217
+ add_gem 'rolify'
1218
+ end
1219
+
1220
+ ## Form Builder
1221
+ add_gem 'simple_form' if prefer :form_builder, 'simple_form'
1222
+
1223
+ ## Membership App
1224
+ if prefer :railsapps, 'rails-stripe-membership-saas'
1225
+ add_gem 'stripe'
1226
+ add_gem 'stripe_event'
1227
+ end
1228
+ if prefer :railsapps, 'rails-recurly-subscription-saas'
1229
+ add_gem 'recurly'
1230
+ add_gem 'nokogiri'
1231
+ add_gem 'countries'
1232
+ add_gem 'httpi'
1233
+ add_gem 'httpclient'
1234
+ end
1235
+
1236
+ ## Signup App
1237
+ if prefer :railsapps, 'rails-prelaunch-signup'
1238
+ add_gem 'gibbon'
1239
+ add_gem 'capybara-webkit', :group => :test
1240
+ end
1241
+
1242
+ ## Gems from a defaults file or added interactively
1243
+ gems.each do |g|
1244
+ gem(*g)
1245
+ end
1246
+
1247
+ ## Git
1248
+ git :add => '-A' if prefer :git, true
1249
+ git :commit => '-qm "rails_apps_composer: Gemfile"' if prefer :git, true
1250
+
1251
+ ### CREATE DATABASE ###
1252
+ after_bundler do
1253
+ unless prefer :database, 'default'
1254
+ copy_from_repo 'config/database-postgresql.yml', :prefs => 'postgresql'
1255
+ copy_from_repo 'config/database-mysql.yml', :prefs => 'mysql'
1256
+ generate 'mongoid:config' if prefer :orm, 'mongoid'
1257
+ remove_file 'config/database.yml' if prefer :orm, 'mongoid'
1258
+ if prefer :database, 'postgresql'
1259
+ begin
1260
+ pg_username = prefs[:pg_username] || ask_wizard("Username for PostgreSQL?(leave blank to use the app name)")
1261
+ pg_host = prefs[:pg_username] || ask_wizard("Host for PostgreSQL in database.yml? (leave blank to use default socket connection)")
1262
+ if pg_username.blank?
1263
+ say_wizard "Creating a user named '#{app_name}' for PostgreSQL"
1264
+ run "createuser --createdb #{app_name}" if prefer :database, 'postgresql'
1265
+ gsub_file "config/database.yml", /username: .*/, "username: #{app_name}"
1266
+ else
1267
+ gsub_file "config/database.yml", /username: .*/, "username: #{pg_username}"
1268
+ pg_password = prefs[:pg_password] || ask_wizard("Password for PostgreSQL user #{pg_username}?")
1269
+ gsub_file "config/database.yml", /password:/, "password: #{pg_password}"
1270
+ say_wizard "set config/database.yml for username/password #{pg_username}/#{pg_password}"
1271
+ end
1272
+ if pg_host.present?
1273
+ gsub_file "config/database.yml", /#host: localhost/, "host: #{pg_host}"
1274
+ gsub_file "config/database.yml", /test:/, "test:\n host: #{pg_host}"
1275
+ end
1276
+ rescue StandardError => e
1277
+ raise "unable to create a user for PostgreSQL, reason: #{e}"
1278
+ end
1279
+ gsub_file "config/database.yml", /database: myapp_development/, "database: #{app_name}_development"
1280
+ gsub_file "config/database.yml", /database: myapp_test/, "database: #{app_name}_test"
1281
+ gsub_file "config/database.yml", /database: myapp_production/, "database: #{app_name}_production"
1282
+ end
1283
+ if prefer :database, 'mysql'
1284
+ mysql_username = prefs[:mysql_username] || ask_wizard("Username for MySQL? (leave blank to use the app name)")
1285
+ if mysql_username.blank?
1286
+ gsub_file "config/database.yml", /username: .*/, "username: #{app_name}"
1287
+ else
1288
+ gsub_file "config/database.yml", /username: .*/, "username: #{mysql_username}"
1289
+ mysql_password = prefs[:mysql_password] || ask_wizard("Password for MySQL user #{mysql_username}?")
1290
+ gsub_file "config/database.yml", /password:/, "password: #{mysql_password}"
1291
+ say_wizard "set config/database.yml for username/password #{mysql_username}/#{mysql_password}"
1292
+ end
1293
+ gsub_file "config/database.yml", /database: myapp_development/, "database: #{app_name}_development"
1294
+ gsub_file "config/database.yml", /database: myapp_test/, "database: #{app_name}_test"
1295
+ gsub_file "config/database.yml", /database: myapp_production/, "database: #{app_name}_production"
1296
+ end
1297
+ unless prefer :database, 'sqlite'
1298
+ if (prefs.has_key? :drop_database) ? prefs[:drop_database] :
1299
+ (yes_wizard? "Okay to drop all existing databases named #{app_name}? 'No' will abort immediately!")
1300
+ run 'bundle exec rake db:drop'
1301
+ else
1302
+ raise "aborted at user's request"
1303
+ end
1304
+ end
1305
+ run 'bundle exec rake db:create:all' unless prefer :orm, 'mongoid'
1306
+ run 'bundle exec rake db:create' if prefer :orm, 'mongoid'
1307
+ ## Git
1308
+ git :add => '-A' if prefer :git, true
1309
+ git :commit => '-qm "rails_apps_composer: create database"' if prefer :git, true
1310
+ end
1311
+ end # after_bundler
1312
+
1313
+ ### GENERATORS ###
1314
+ after_bundler do
1315
+ ## Form Builder
1316
+ if prefer :form_builder, 'simple_form'
1317
+ case prefs[:frontend]
1318
+ when 'bootstrap2'
1319
+ say_wizard "recipe installing simple_form for use with Twitter Bootstrap"
1320
+ generate 'simple_form:install --bootstrap'
1321
+ when 'bootstrap3'
1322
+ say_wizard "recipe installing simple_form for use with Twitter Bootstrap"
1323
+ generate 'simple_form:install --bootstrap'
1324
+ when 'foundation4'
1325
+ say_wizard "recipe installing simple_form for use with Zurb Foundation"
1326
+ generate 'simple_form:install --foundation'
1327
+ else
1328
+ say_wizard "recipe installing simple_form"
1329
+ generate 'simple_form:install'
1330
+ end
1331
+ end
1332
+ ## Figaro Gem
1333
+ if prefer :local_env_file, 'figaro' and not rails_4_1?
1334
+ generate 'figaro:install'
1335
+ gsub_file 'config/application.yml', /# PUSHER_.*\n/, ''
1336
+ gsub_file 'config/application.yml', /# STRIPE_.*\n/, ''
1337
+ prepend_to_file 'config/application.yml' do <<-FILE
1338
+ # Add account credentials and API keys here.
1339
+ # See http://railsapps.github.io/rails-environment-variables.html
1340
+ # This file should be listed in .gitignore to keep your settings secret!
1341
+ # Each entry sets a local environment variable and overrides ENV variables in the Unix shell.
1342
+ # For example, setting:
1343
+ # GMAIL_USERNAME: Your_Gmail_Username
1344
+ # makes 'Your_Gmail_Username' available as ENV["GMAIL_USERNAME"]
1345
+
1346
+ FILE
1347
+ end
1348
+ end
1349
+ ## Foreman Gem
1350
+ if prefer :local_env_file, 'foreman'
1351
+ create_file '.env' do <<-FILE
1352
+ # Add account credentials and API keys here.
1353
+ # This file should be listed in .gitignore to keep your settings secret!
1354
+ # Each entry sets a local environment variable and overrides ENV variables in the Unix shell.
1355
+ # For example, setting:
1356
+ # GMAIL_USERNAME=Your_Gmail_Username
1357
+ # makes 'Your_Gmail_Username' available as ENV["GMAIL_USERNAME"]
1358
+
1359
+ FILE
1360
+ end
1361
+ create_file 'Procfile', 'web: bundle exec rails server -p $PORT' if prefer :prod_webserver, 'thin'
1362
+ create_file 'Procfile', 'web: bundle exec unicorn -p $PORT' if prefer :prod_webserver, 'unicorn'
1363
+ create_file 'Procfile', 'web: bundle exec puma -p $PORT' if prefer :prod_webserver, 'puma'
1364
+ create_file 'Procfile', 'web: bundle exec passenger start -p $PORT' if prefer :prod_webserver, 'passenger_standalone'
1365
+ if (prefs[:dev_webserver] != prefs[:prod_webserver])
1366
+ create_file 'Procfile.dev', 'web: bundle exec rails server -p $PORT' if prefer :dev_webserver, 'thin'
1367
+ create_file 'Procfile.dev', 'web: bundle exec unicorn -p $PORT' if prefer :dev_webserver, 'unicorn'
1368
+ create_file 'Procfile.dev', 'web: bundle exec puma -p $PORT' if prefer :dev_webserver, 'puma'
1369
+ create_file 'Procfile.dev', 'web: bundle exec passenger start -p $PORT' if prefer :dev_webserver, 'passenger_standalone'
1370
+ end
1371
+ end
1372
+ ## Git
1373
+ git :add => '-A' if prefer :git, true
1374
+ git :commit => '-qm "rails_apps_composer: generators"' if prefer :git, true
1375
+ end # after_bundler
1376
+ # >----------------------------- recipes/gems.rb -----------------------------end<
1377
+ # >-------------------------- templates/recipe.erb ---------------------------end<
1378
+
1379
+ # >-------------------------- templates/recipe.erb ---------------------------start<
1380
+ # >-------------------------------[ frontend ]--------------------------------<
1381
+ @current_recipe = "frontend"
1382
+ @before_configs["frontend"].call if @before_configs["frontend"]
1383
+ say_recipe 'frontend'
1384
+ @configs[@current_recipe] = config
1385
+ # >--------------------------- recipes/frontend.rb ---------------------------start<
1386
+
1387
+ # Application template recipe for the rails_apps_composer. Change the recipe here:
1388
+ # https://github.com/RailsApps/rails_apps_composer/blob/master/recipes/frontend.rb
1389
+
1390
+ after_bundler do
1391
+ say_wizard "recipe running after 'bundle install'"
1392
+ # set up a front-end framework using the rails_layout gem
1393
+ case prefs[:frontend]
1394
+ when 'simple'
1395
+ generate 'layout:install simple -f'
1396
+ when 'bootstrap2'
1397
+ generate 'layout:install bootstrap2 -f'
1398
+ when 'bootstrap3'
1399
+ generate 'layout:install bootstrap3 -f'
1400
+ when 'foundation4'
1401
+ generate 'layout:install foundation4 -f'
1402
+ when 'foundation5'
1403
+ generate 'layout:install foundation5 -f'
1404
+ end
1405
+ # generate Devise views with appropriate styling
1406
+ if prefer :authentication, 'devise'
1407
+ case prefs[:frontend]
1408
+ when 'bootstrap3'
1409
+ generate 'layout:devise bootstrap3 -f'
1410
+ when 'foundation5'
1411
+ generate 'layout:devise foundation5 -f'
1412
+ end
1413
+ end
1414
+
1415
+ ### GIT ###
1416
+ git :add => '-A' if prefer :git, true
1417
+ git :commit => '-qm "rails_apps_composer: front-end framework"' if prefer :git, true
1418
+ end # after_bundler
1419
+
1420
+ after_everything do
1421
+ say_wizard "recipe running after everything"
1422
+ # create navigation links using the rails_layout gem
1423
+ generate 'layout:navigation -f'
1424
+ # replace with specialized navigation partials
1425
+ copy_from_repo 'app/views/layouts/_navigation-subdomains_app.html.erb', :prefs => 'subdomains_app'
1426
+
1427
+ ### GIT ###
1428
+ git :add => '-A' if prefer :git, true
1429
+ git :commit => '-qm "rails_apps_composer: navigation links"' if prefer :git, true
1430
+ end # after_everything
1431
+ # >--------------------------- recipes/frontend.rb ---------------------------end<
1432
+ # >-------------------------- templates/recipe.erb ---------------------------end<
1433
+
1434
+ # >-------------------------- templates/recipe.erb ---------------------------start<
1435
+ # >--------------------------------[ models ]---------------------------------<
1436
+ @current_recipe = "models"
1437
+ @before_configs["models"].call if @before_configs["models"]
1438
+ say_recipe 'models'
1439
+ @configs[@current_recipe] = config
1440
+ # >---------------------------- recipes/models.rb ----------------------------start<
1441
+
1442
+ # Application template recipe for the rails_apps_composer. Change the recipe here:
1443
+ # https://github.com/RailsApps/rails_apps_composer/blob/master/recipes/models.rb
1444
+
1445
+ after_bundler do
1446
+ say_wizard "recipe running after 'bundle install'"
1447
+ ### DEVISE ###
1448
+ if prefer :authentication, 'devise'
1449
+ # prevent logging of password_confirmation
1450
+ gsub_file 'config/application.rb', /:password/, ':password, :password_confirmation'
1451
+ generate 'devise:install'
1452
+ generate 'devise_invitable:install' if prefer :devise_modules, 'invitable'
1453
+ generate 'devise user' # create the User model
1454
+ if prefer :orm, 'mongoid'
1455
+ ## DEVISE AND MONGOID
1456
+ copy_from_repo 'app/models/user.rb', :repo => 'https://raw.github.com/RailsApps/rails3-mongoid-devise/master/' unless rails_4?
1457
+ if (prefer :devise_modules, 'confirmable') || (prefer :devise_modules, 'invitable')
1458
+ gsub_file 'app/models/user.rb', /:registerable,/, ":registerable, :confirmable,"
1459
+ gsub_file 'app/models/user.rb', /# field :confirmation_token/, "field :confirmation_token"
1460
+ gsub_file 'app/models/user.rb', /# field :confirmed_at/, "field :confirmed_at"
1461
+ gsub_file 'app/models/user.rb', /# field :confirmation_sent_at/, "field :confirmation_sent_at"
1462
+ gsub_file 'app/models/user.rb', /# field :unconfirmed_email/, "field :unconfirmed_email"
1463
+ end
1464
+ if (prefer :devise_modules, 'invitable')
1465
+ gsub_file 'app/models/user.rb', /\bend\s*\Z/ do
1466
+ <<-RUBY
1467
+ #invitable
1468
+ field :invitation_token, :type => String
1469
+ field :invitation_sent_at, :type => Time
1470
+ field :invitation_accepted_at, :type => Time
1471
+ field :invitation_limit, :type => Integer
1472
+ field :invited_by_id, :type => String
1473
+ field :invited_by_type, :type => String
1474
+ end
1475
+ RUBY
1476
+ end
1477
+ end
1478
+ else
1479
+ ## DEVISE AND ACTIVE RECORD
1480
+ unless prefer :railsapps, 'rails-recurly-subscription-saas'
1481
+ generate 'migration AddNameToUsers name:string'
1482
+ end
1483
+ copy_from_repo 'app/models/user.rb', :repo => 'https://raw.github.com/RailsApps/rails3-devise-rspec-cucumber/master/' unless rails_4?
1484
+ if (prefer :devise_modules, 'confirmable') || (prefer :devise_modules, 'invitable')
1485
+ gsub_file 'app/models/user.rb', /:registerable,/, ":registerable, :confirmable,"
1486
+ generate 'migration AddConfirmableToUsers confirmation_token:string confirmed_at:datetime confirmation_sent_at:datetime unconfirmed_email:string'
1487
+ end
1488
+ end
1489
+ ## DEVISE AND CUCUMBER
1490
+ if prefer :integration, 'cucumber'
1491
+ # Cucumber wants to test GET requests not DELETE requests for destroy_user_session_path
1492
+ # (see https://github.com/RailsApps/rails3-devise-rspec-cucumber/issues/3)
1493
+ gsub_file 'config/initializers/devise.rb', 'config.sign_out_via = :delete', 'config.sign_out_via = Rails.env.test? ? :get : :delete'
1494
+ end
1495
+ end
1496
+ ### OMNIAUTH ###
1497
+ if prefer :authentication, 'omniauth'
1498
+ repo = 'https://raw.github.com/RailsApps/rails-omniauth/master/'
1499
+ copy_from_repo 'config/initializers/omniauth.rb', :repo => repo
1500
+ gsub_file 'config/initializers/omniauth.rb', /twitter/, prefs[:omniauth_provider] unless prefer :omniauth_provider, 'twitter'
1501
+ if prefer :orm, 'mongoid'
1502
+ repo = 'https://raw.github.com/RailsApps/rails3-mongoid-omniauth/master/'
1503
+ copy_from_repo 'app/models/user.rb', :repo => repo
1504
+ else
1505
+ generate 'model User name:string email:string provider:string uid:string'
1506
+ run 'bundle exec rake db:migrate'
1507
+ copy_from_repo 'app/models/user.rb', :repo => repo
1508
+ end
1509
+ end
1510
+ ### SUBDOMAINS ###
1511
+ copy_from_repo 'app/models/user.rb', :repo => 'https://raw.github.com/RailsApps/rails3-subdomains/master/' if prefer :starter_app, 'subdomains_app'
1512
+ ### AUTHORIZATION ###
1513
+ if prefer :authorization, 'cancan'
1514
+ generate 'cancan:ability'
1515
+ if prefer :starter_app, 'admin_app'
1516
+ # Limit access to the users#index page
1517
+ copy_from_repo 'app/models/ability.rb', :repo => 'https://raw.github.com/RailsApps/rails3-bootstrap-devise-cancan/master/'
1518
+ # allow an admin to update roles
1519
+ insert_into_file 'app/models/user.rb', " attr_accessible :role_ids, :as => :admin\n", :before => " attr_accessible"
1520
+ end
1521
+ unless prefer :orm, 'mongoid'
1522
+ generate 'rolify Role User'
1523
+ else
1524
+ generate 'rolify Role User --orm=mongoid'
1525
+ end
1526
+ end
1527
+ ### GIT ###
1528
+ git :add => '-A' if prefer :git, true
1529
+ git :commit => '-qm "rails_apps_composer: models"' if prefer :git, true
1530
+ end # after_bundler
1531
+ # >---------------------------- recipes/models.rb ----------------------------end<
1532
+ # >-------------------------- templates/recipe.erb ---------------------------end<
1533
+
1534
+ # >-------------------------- templates/recipe.erb ---------------------------start<
1535
+ # >--------------------------------[ testing ]--------------------------------<
1536
+ @current_recipe = "testing"
1537
+ @before_configs["testing"].call if @before_configs["testing"]
1538
+ say_recipe 'testing'
1539
+ @configs[@current_recipe] = config
1540
+ # >--------------------------- recipes/testing.rb ----------------------------start<
1541
+
1542
+ # Application template recipe for the rails_apps_composer. Change the recipe here:
1543
+ # https://github.com/RailsApps/rails_apps_composer/blob/master/recipes/testing.rb
1544
+
1545
+ after_bundler do
1546
+ say_wizard "recipe running after 'bundle install'"
1547
+ ### TEST/UNIT ###
1548
+ if prefer :unit_test, 'test_unit'
1549
+ inject_into_file 'config/application.rb', :after => "Rails::Application\n" do <<-RUBY
1550
+
1551
+ config.generators do |g|
1552
+ #{"g.test_framework :test_unit, fixture_replacement: :fabrication" if prefer :fixtures, 'fabrication'}
1553
+ #{"g.fixture_replacement :fabrication, dir: 'test/fabricators'" if prefer :fixtures, 'fabrication'}
1554
+ end
1555
+
1556
+ RUBY
1557
+ end
1558
+ end
1559
+ ### RSPEC ###
1560
+ if prefer :unit_test, 'rspec'
1561
+ say_wizard "recipe installing RSpec"
1562
+ generate 'rspec:install'
1563
+ copy_from_repo 'spec/spec_helper.rb', :repo => 'https://raw.github.com/RailsApps/rails3-devise-rspec-cucumber/master/'
1564
+ generate 'email_spec:steps' if prefer :integration, 'cucumber'
1565
+ inject_into_file 'spec/spec_helper.rb', "require 'email_spec'\n", :after => "require 'rspec/rails'\n"
1566
+ inject_into_file 'spec/spec_helper.rb', :after => "RSpec.configure do |config|\n" do <<-RUBY
1567
+ config.include(EmailSpec::Helpers)
1568
+ config.include(EmailSpec::Matchers)
1569
+ RUBY
1570
+ end
1571
+ run 'rm -rf test/' # Removing test folder (not needed for RSpec)
1572
+ inject_into_file 'config/application.rb', :after => "Rails::Application\n" do <<-RUBY
1573
+
1574
+ # don't generate RSpec tests for views and helpers
1575
+ config.generators do |g|
1576
+ #{"g.test_framework :rspec" if prefer :fixtures, 'none'}
1577
+ #{"g.test_framework :rspec, fixture: true" unless prefer :fixtures, 'none'}
1578
+ #{"g.fixture_replacement :factory_girl, dir: 'spec/factories'" if prefer :fixtures, 'factory_girl'}
1579
+ #{"g.fixture_replacement :machinist" if prefer :fixtures, 'machinist'}
1580
+ #{"g.fixture_replacement :fabrication" if prefer :fixtures, 'fabrication'}
1581
+ g.view_specs false
1582
+ g.helper_specs false
1583
+ end
1584
+
1585
+ RUBY
1586
+ end
1587
+ ## RSPEC AND MONGOID
1588
+ if prefer :orm, 'mongoid'
1589
+ # remove ActiveRecord artifacts
1590
+ gsub_file 'spec/spec_helper.rb', /config.fixture_path/, '# config.fixture_path'
1591
+ gsub_file 'spec/spec_helper.rb', /config.use_transactional_fixtures/, '# config.use_transactional_fixtures'
1592
+ # remove either possible occurrence of "require rails/test_unit/railtie"
1593
+ gsub_file 'config/application.rb', /require 'rails\/test_unit\/railtie'/, '# require "rails/test_unit/railtie"'
1594
+ gsub_file 'config/application.rb', /require "rails\/test_unit\/railtie"/, '# require "rails/test_unit/railtie"'
1595
+ # configure RSpec to use matchers from the mongoid-rspec gem
1596
+ create_file 'spec/support/mongoid.rb' do
1597
+ <<-RUBY
1598
+ RSpec.configure do |config|
1599
+ config.include Mongoid::Matchers
1600
+ end
1601
+ RUBY
1602
+ end
1603
+ end
1604
+ ## RSPEC AND DEVISE
1605
+ if prefer :authentication, 'devise'
1606
+ # add Devise test helpers
1607
+ create_file 'spec/support/devise.rb' do
1608
+ <<-RUBY
1609
+ RSpec.configure do |config|
1610
+ config.include Devise::TestHelpers, :type => :controller
1611
+ end
1612
+ RUBY
1613
+ end
1614
+ end
1615
+ end
1616
+ ### CUCUMBER ###
1617
+ if prefer :integration, 'cucumber'
1618
+ say_wizard "recipe installing Cucumber"
1619
+ generate "cucumber:install --capybara#{' --rspec' if prefer :unit_test, 'rspec'}#{' -D' if prefer :orm, 'mongoid'}"
1620
+ # make it easy to run Cucumber for single features without adding "--require features" to the command line
1621
+ gsub_file 'config/cucumber.yml', /std_opts = "/, 'std_opts = "-r features/support/ -r features/step_definitions '
1622
+ create_file 'features/support/email_spec.rb' do <<-RUBY
1623
+ require 'email_spec/cucumber'
1624
+ RUBY
1625
+ end
1626
+ ## CUCUMBER AND MONGOID
1627
+ if prefer :orm, 'mongoid'
1628
+ gsub_file 'features/support/env.rb', /transaction/, "truncation"
1629
+ inject_into_file 'features/support/env.rb', :after => 'begin' do
1630
+ "\n DatabaseCleaner.orm = 'mongoid'"
1631
+ end
1632
+ end
1633
+ generate 'fabrication:cucumber_steps' if prefer :fixtures, 'fabrication'
1634
+ end
1635
+ ## TURNIP
1636
+ if prefer :integration, 'turnip'
1637
+ append_file '.rspec', '-r turnip/rspec'
1638
+ inject_into_file 'spec/spec_helper.rb', "require 'turnip/capybara'\n", :after => "require 'rspec/rails'\n"
1639
+ create_file 'spec/acceptance/steps/.gitkeep'
1640
+ end
1641
+ ## FIXTURE REPLACEMENTS
1642
+ if prefer :fixtures, 'machinist'
1643
+ say_wizard "generating blueprints file for 'machinist'"
1644
+ generate 'machinist:install'
1645
+ end
1646
+ ### GUARD
1647
+ if prefer :continuous_testing, 'guard'
1648
+ say_wizard "recipe initializing Guard"
1649
+ run 'bundle exec guard init'
1650
+ end
1651
+ ### GIT ###
1652
+ git :add => '-A' if prefer :git, true
1653
+ git :commit => '-qm "rails_apps_composer: testing framework"' if prefer :git, true
1654
+ end # after_bundler
1655
+
1656
+ after_everything do
1657
+ say_wizard "recipe running after everything"
1658
+ ### RSPEC ###
1659
+ if prefer :unit_test, 'rspec'
1660
+ if (prefer :authentication, 'devise') && (prefer :starter_app, 'users_app')
1661
+ say_wizard "copying RSpec files from the rails3-devise-rspec-cucumber examples"
1662
+ repo = 'https://raw.github.com/RailsApps/rails3-devise-rspec-cucumber/master/'
1663
+ copy_from_repo 'spec/factories/users.rb', :repo => repo
1664
+ gsub_file 'spec/factories/users.rb', /# confirmed_at/, "confirmed_at" if (prefer :devise_modules, 'confirmable') || (prefer :devise_modules, 'invitable')
1665
+ copy_from_repo 'spec/controllers/home_controller_spec.rb', :repo => repo
1666
+ copy_from_repo 'spec/controllers/users_controller_spec.rb', :repo => repo
1667
+ copy_from_repo 'spec/models/user_spec.rb', :repo => repo
1668
+ remove_file 'spec/views/home/index.html.erb_spec.rb'
1669
+ remove_file 'spec/views/home/index.html.haml_spec.rb'
1670
+ remove_file 'spec/views/users/show.html.erb_spec.rb'
1671
+ remove_file 'spec/views/users/show.html.haml_spec.rb'
1672
+ remove_file 'spec/helpers/home_helper_spec.rb'
1673
+ remove_file 'spec/helpers/users_helper_spec.rb'
1674
+ end
1675
+ if (prefer :authentication, 'devise') && (prefer :starter_app, 'admin_app')
1676
+ say_wizard "copying RSpec files from the rails3-bootstrap-devise-cancan examples"
1677
+ repo = 'https://raw.github.com/RailsApps/rails3-bootstrap-devise-cancan/master/'
1678
+ copy_from_repo 'spec/factories/users.rb', :repo => repo
1679
+ gsub_file 'spec/factories/users.rb', /# confirmed_at/, "confirmed_at" if (prefer :devise_modules, 'confirmable') || (prefer :devise_modules, 'invitable')
1680
+ copy_from_repo 'spec/controllers/home_controller_spec.rb', :repo => repo
1681
+ copy_from_repo 'spec/controllers/users_controller_spec.rb', :repo => repo
1682
+ copy_from_repo 'spec/models/user_spec.rb', :repo => repo
1683
+ remove_file 'spec/views/home/index.html.erb_spec.rb'
1684
+ remove_file 'spec/views/home/index.html.haml_spec.rb'
1685
+ remove_file 'spec/views/users/show.html.erb_spec.rb'
1686
+ remove_file 'spec/views/users/show.html.haml_spec.rb'
1687
+ remove_file 'spec/helpers/home_helper_spec.rb'
1688
+ remove_file 'spec/helpers/users_helper_spec.rb'
1689
+ end
1690
+ ## RSPEC AND OMNIAUTH
1691
+ if (prefer :authentication, 'omniauth') && (prefer :starter_app, 'users_app')
1692
+ say_wizard "copying RSpec files from the rails3-mongoid-omniauth examples"
1693
+ repo = 'https://raw.github.com/RailsApps/rails3-mongoid-omniauth/master/'
1694
+ copy_from_repo 'spec/factories/users.rb', :repo => repo
1695
+ copy_from_repo 'spec/controllers/sessions_controller_spec.rb', :repo => repo
1696
+ copy_from_repo 'spec/controllers/home_controller_spec.rb', :repo => repo
1697
+ copy_from_repo 'spec/controllers/users_controller_spec.rb', :repo => repo
1698
+ copy_from_repo 'spec/models/user_spec.rb', :repo => repo
1699
+ end
1700
+ ## SUBDOMAINS
1701
+ if (prefer :authentication, 'devise') && (prefer :starter_app, 'subdomains_app')
1702
+ say_wizard "copying RSpec files from the rails3-subdomains examples"
1703
+ repo = 'https://raw.github.com/RailsApps/rails3-subdomains/master/'
1704
+ copy_from_repo 'spec/factories/users.rb', :repo => repo
1705
+ copy_from_repo 'spec/controllers/home_controller_spec.rb', :repo => repo
1706
+ copy_from_repo 'spec/controllers/users_controller_spec.rb', :repo => repo
1707
+ copy_from_repo 'spec/models/user_spec.rb', :repo => repo
1708
+ end
1709
+ ## GIT
1710
+ git :add => '-A' if prefer :git, true
1711
+ git :commit => '-qm "rails_apps_composer: rspec files"' if prefer :git, true
1712
+ end
1713
+ ### CUCUMBER ###
1714
+ if prefer :integration, 'cucumber'
1715
+ ## CUCUMBER AND DEVISE (USERS APP)
1716
+ if (prefer :authentication, 'devise') && (prefer :starter_app, 'users_app')
1717
+ say_wizard "copying Cucumber scenarios from the rails3-devise-rspec-cucumber examples"
1718
+ repo = 'https://raw.github.com/RailsApps/rails3-devise-rspec-cucumber/master/'
1719
+ copy_from_repo 'spec/controllers/home_controller_spec.rb', :repo => repo
1720
+ copy_from_repo 'features/users/sign_in.feature', :repo => repo
1721
+ copy_from_repo 'features/users/sign_out.feature', :repo => repo
1722
+ copy_from_repo 'features/users/sign_up.feature', :repo => repo
1723
+ copy_from_repo 'features/users/user_edit.feature', :repo => repo
1724
+ copy_from_repo 'features/users/user_show.feature', :repo => repo
1725
+ copy_from_repo 'features/step_definitions/user_steps.rb', :repo => repo
1726
+ copy_from_repo 'features/support/paths.rb', :repo => repo
1727
+ if (prefer :devise_modules, 'confirmable') || (prefer :devise_modules, 'invitable')
1728
+ gsub_file 'features/step_definitions/user_steps.rb', /Welcome! You have signed up successfully./, "A message with a confirmation link has been sent to your email address."
1729
+ inject_into_file 'features/users/sign_in.feature', :before => ' Scenario: User signs in successfully' do
1730
+ <<-RUBY
1731
+ Scenario: User has not confirmed account
1732
+ Given I exist as an unconfirmed user
1733
+ And I am not logged in
1734
+ When I sign in with valid credentials
1735
+ Then I see an unconfirmed account message
1736
+ And I should be signed out
1737
+ RUBY
1738
+ end
1739
+ end
1740
+ end
1741
+ ## CUCUMBER AND DEVISE (ADMIN APP)
1742
+ if (prefer :authentication, 'devise') && (prefer :starter_app, 'admin_app')
1743
+ say_wizard "copying Cucumber scenarios from the rails3-bootstrap-devise-cancan examples"
1744
+ repo = 'https://raw.github.com/RailsApps/rails3-bootstrap-devise-cancan/master/'
1745
+ copy_from_repo 'spec/controllers/home_controller_spec.rb', :repo => repo
1746
+ copy_from_repo 'features/users/sign_in.feature', :repo => repo
1747
+ copy_from_repo 'features/users/sign_out.feature', :repo => repo
1748
+ copy_from_repo 'features/users/sign_up.feature', :repo => repo
1749
+ copy_from_repo 'features/users/user_edit.feature', :repo => repo
1750
+ copy_from_repo 'features/users/user_show.feature', :repo => repo
1751
+ copy_from_repo 'features/step_definitions/user_steps.rb', :repo => repo
1752
+ copy_from_repo 'features/support/paths.rb', :repo => repo
1753
+ if (prefer :devise_modules, 'confirmable') || (prefer :devise_modules, 'invitable')
1754
+ gsub_file 'features/step_definitions/user_steps.rb', /Welcome! You have signed up successfully./, "A message with a confirmation link has been sent to your email address."
1755
+ inject_into_file 'features/users/sign_in.feature', :before => ' Scenario: User signs in successfully' do
1756
+ <<-RUBY
1757
+ Scenario: User has not confirmed account
1758
+ Given I exist as an unconfirmed user
1759
+ And I am not logged in
1760
+ When I sign in with valid credentials
1761
+ Then I see an unconfirmed account message
1762
+ And I should be signed out
1763
+ RUBY
1764
+ end
1765
+ end
1766
+ end
1767
+ ## CUCUMBER AND DEVISE (SUBDOMAINS APP)
1768
+ if (prefer :authentication, 'devise') && (prefer :starter_app, 'subdomains_app')
1769
+ say_wizard "copying RSpec files from the rails3-subdomains examples"
1770
+ repo = 'https://raw.github.com/RailsApps/rails3-subdomains/master/'
1771
+ copy_from_repo 'features/users/sign_in.feature', :repo => repo
1772
+ copy_from_repo 'features/users/sign_out.feature', :repo => repo
1773
+ copy_from_repo 'features/users/sign_up.feature', :repo => repo
1774
+ copy_from_repo 'features/users/user_edit.feature', :repo => repo
1775
+ copy_from_repo 'features/users/user_show.feature', :repo => repo
1776
+ copy_from_repo 'features/step_definitions/user_steps.rb', :repo => repo
1777
+ copy_from_repo 'features/support/paths.rb', :repo => repo
1778
+ end
1779
+ ## GIT
1780
+ git :add => '-A' if prefer :git, true
1781
+ git :commit => '-qm "rails_apps_composer: cucumber files"' if prefer :git, true
1782
+ end
1783
+ ### FABRICATION ###
1784
+ if prefer :fixtures, 'fabrication'
1785
+ say_wizard "replacing FactoryGirl fixtures with Fabrication"
1786
+ remove_file 'spec/factories/users.rb'
1787
+ remove_file 'spec/fabricators/user_fabricator.rb'
1788
+ create_file 'spec/fabricators/user_fabricator.rb' do
1789
+ <<-RUBY
1790
+ Fabricator(:user) do
1791
+ name 'Test User'
1792
+ email 'example@example.com'
1793
+ password 'changeme'
1794
+ password_confirmation 'changeme'
1795
+ # required if the Devise Confirmable module is used
1796
+ # confirmed_at Time.now
1797
+ end
1798
+ RUBY
1799
+ end
1800
+ if prefer :integration, 'cucumber'
1801
+ gsub_file 'features/step_definitions/user_steps.rb', /@user = FactoryGirl.create\(:user, email: @visitor\[:email\]\)/, '@user = Fabricate(:user, email: @visitor[:email])'
1802
+ end
1803
+ if File.exist?('spec/controllers/users_controller_spec.rb')
1804
+ gsub_file 'spec/controllers/users_controller_spec.rb', /@user = FactoryGirl.create\(:user\)/, '@user = Fabricate(:user)'
1805
+ end
1806
+ end
1807
+ end # after_everything
1808
+ # >--------------------------- recipes/testing.rb ----------------------------end<
1809
+ # >-------------------------- templates/recipe.erb ---------------------------end<
1810
+
1811
+ # >-------------------------- templates/recipe.erb ---------------------------start<
1812
+ # >---------------------------------[ init ]----------------------------------<
1813
+ @current_recipe = "init"
1814
+ @before_configs["init"].call if @before_configs["init"]
1815
+ say_recipe 'init'
1816
+ @configs[@current_recipe] = config
1817
+ # >----------------------------- recipes/init.rb -----------------------------start<
1818
+
1819
+ # Application template recipe for the rails_apps_composer. Change the recipe here:
1820
+ # https://github.com/RailsApps/rails_apps_composer/blob/master/recipes/init.rb
1821
+
1822
+ after_everything do
1823
+ say_wizard "recipe running after everything"
1824
+ ### CONFIGURATION FILE ###
1825
+ ## EMAIL
1826
+ case prefs[:email]
1827
+ when 'none'
1828
+ credentials = ''
1829
+ when 'smtp'
1830
+ credentials = ''
1831
+ when 'gmail'
1832
+ credentials = "GMAIL_USERNAME: Your_Username\nGMAIL_PASSWORD: Your_Password\n"
1833
+ when 'sendgrid'
1834
+ credentials = "SENDGRID_USERNAME: Your_Username\nSENDGRID_PASSWORD: Your_Password\n"
1835
+ when 'mandrill'
1836
+ credentials = "MANDRILL_USERNAME: Your_Username\nMANDRILL_APIKEY: Your_API_Key\n"
1837
+ end
1838
+ append_file 'config/application.yml', credentials if prefer :local_env_file, 'figaro' and not rails_4_1?
1839
+ append_file '.env', credentials.gsub(': ', '=') if prefer :local_env_file, 'foreman'
1840
+ if prefer :local_env_file, 'figaro' and not rails_4_1?
1841
+ ## DEFAULT USER
1842
+ unless prefer :starter_app, false
1843
+ append_file 'config/application.yml' do <<-FILE
1844
+ ADMIN_NAME: First User
1845
+ ADMIN_EMAIL: user@example.com
1846
+ ADMIN_PASSWORD: changeme
1847
+ FILE
1848
+ end
1849
+ end
1850
+ ## AUTHENTICATION
1851
+ if prefer :authentication, 'omniauth'
1852
+ append_file 'config/application.yml' do <<-FILE
1853
+ OMNIAUTH_PROVIDER_KEY: Your_OmniAuth_Provider_Key
1854
+ OMNIAUTH_PROVIDER_SECRET: Your_OmniAuth_Provider_Secret
1855
+ FILE
1856
+ end
1857
+ end
1858
+ ## AUTHORIZATION
1859
+ if (prefer :authorization, 'cancan')
1860
+ append_file 'config/application.yml', "ROLES: [admin, user, VIP]\n"
1861
+ end
1862
+ elsif prefer :local_env_file, 'foreman'
1863
+ ## DEFAULT USER
1864
+ unless prefer :starter_app, false
1865
+ append_file '.env' do <<-FILE
1866
+ ADMIN_NAME=First User
1867
+ ADMIN_EMAIL=user@example.com
1868
+ ADMIN_PASSWORD=changeme
1869
+ FILE
1870
+ end
1871
+ end
1872
+ ## AUTHENTICATION
1873
+ if prefer :authentication, 'omniauth'
1874
+ append_file '.env' do <<-FILE
1875
+ OMNIAUTH_PROVIDER_KEY=Your_OmniAuth_Provider_Key
1876
+ OMNIAUTH_PROVIDER_SECRET=Your_OmniAuth_Provider_Secret
1877
+ FILE
1878
+ end
1879
+ end
1880
+ ## AUTHORIZATION
1881
+ if (prefer :authorization, 'cancan')
1882
+ append_file '.env', "ROLES=[admin, user, VIP]\n"
1883
+ end
1884
+ end
1885
+ ### SUBDOMAINS ###
1886
+ copy_from_repo 'config/application.yml', :repo => 'https://raw.github.com/RailsApps/rails3-subdomains/master/' if prefer :starter_app, 'subdomains_app'
1887
+ ### APPLICATION.EXAMPLE.YML ###
1888
+ if prefer :local_env_file, 'figaro' and not rails_4_1?
1889
+ copy_file destination_root + '/config/application.yml', destination_root + '/config/application.example.yml'
1890
+ elsif prefer :local_env_file, 'foreman'
1891
+ copy_file destination_root + '/.env', destination_root + '/.env.example'
1892
+ end
1893
+ ### DATABASE SEED ###
1894
+ if prefer :local_env_file, 'figaro' and not rails_4_1?
1895
+ append_file 'db/seeds.rb' do <<-FILE
1896
+ # Environment variables (ENV['...']) can be set in the file config/application.yml.
1897
+ # See http://railsapps.github.io/rails-environment-variables.html
1898
+ FILE
1899
+ end
1900
+ elsif prefer :local_env_file, 'foreman'
1901
+ append_file 'db/seeds.rb' do <<-FILE
1902
+ # Environment variables (ENV['...']) can be set in the file .env file.
1903
+ FILE
1904
+ end
1905
+ end
1906
+ if (prefer :authorization, 'cancan')
1907
+ unless prefer :orm, 'mongoid'
1908
+ append_file 'db/seeds.rb' do <<-FILE
1909
+ puts 'ROLES'
1910
+ YAML.load(ENV['ROLES']).each do |role|
1911
+ Role.find_or_create_by_name({ :name => role }, :without_protection => true)
1912
+ puts 'role: ' << role
1913
+ end
1914
+ FILE
1915
+ end
1916
+ ## Fix db seed for Rails 4.0
1917
+ gsub_file 'db/seeds.rb', /{ :name => role }, :without_protection => true/, 'role' if rails_4?
1918
+ else
1919
+ append_file 'db/seeds.rb' do <<-FILE
1920
+ puts 'ROLES'
1921
+ YAML.load(ENV['ROLES']).each do |role|
1922
+ Role.mongo_session['roles'].insert({ :name => role })
1923
+ puts 'role: ' << role
1924
+ end
1925
+ FILE
1926
+ end
1927
+ end
1928
+ end
1929
+ ## DEVISE-DEFAULT
1930
+ if (prefer :authentication, 'devise') and (not prefer :apps4, 'rails-devise')
1931
+ append_file 'db/seeds.rb' do <<-FILE
1932
+ puts 'DEFAULT USERS'
1933
+ user = User.find_or_create_by_email :name => ENV['ADMIN_NAME'].dup, :email => ENV['ADMIN_EMAIL'].dup, :password => ENV['ADMIN_PASSWORD'].dup, :password_confirmation => ENV['ADMIN_PASSWORD'].dup
1934
+ puts 'user: ' << user.name
1935
+ FILE
1936
+ end
1937
+ # Mongoid doesn't have a 'find_or_create_by' method
1938
+ gsub_file 'db/seeds.rb', /find_or_create_by_email/, 'create!' if prefer :orm, 'mongoid'
1939
+ end
1940
+ if prefer :apps4, 'rails-devise'
1941
+ append_file 'db/seeds.rb' do <<-FILE
1942
+ puts 'DEFAULT USERS'
1943
+ user = User.find_or_create_by_email :email => ENV['ADMIN_EMAIL'].dup, :password => ENV['ADMIN_PASSWORD'].dup, :password_confirmation => ENV['ADMIN_PASSWORD'].dup
1944
+ puts 'user: ' << user.email
1945
+ FILE
1946
+ end
1947
+ # Mongoid doesn't have a 'find_or_create_by' method
1948
+ gsub_file 'db/seeds.rb', /find_or_create_by_email/, 'create!' if prefer :orm, 'mongoid'
1949
+ end
1950
+ ## DEVISE-CONFIRMABLE
1951
+ if (prefer :devise_modules, 'confirmable') || (prefer :devise_modules, 'invitable')
1952
+ append_file 'db/seeds.rb', "user.confirm!\n"
1953
+ end
1954
+ if (prefer :authorization, 'cancan') && !(prefer :authentication, 'omniauth')
1955
+ append_file 'db/seeds.rb', 'user.add_role :admin'
1956
+ end
1957
+ ## DEVISE-INVITABLE
1958
+ if prefer :devise_modules, 'invitable'
1959
+ if prefer :local_env_file, 'foreman'
1960
+ run 'foreman run bundle exec rake db:migrate'
1961
+ else
1962
+ run 'bundle exec rake db:migrate'
1963
+ end
1964
+ generate 'devise_invitable user'
1965
+ end
1966
+ ### APPLY DATABASE SEED ###
1967
+ unless prefer :orm, 'mongoid'
1968
+ unless prefer :database, 'default'
1969
+ ## ACTIVE_RECORD
1970
+ say_wizard "applying migrations and seeding the database"
1971
+ if prefer :local_env_file, 'foreman'
1972
+ run 'foreman run bundle exec rake db:migrate'
1973
+ run 'foreman run bundle exec rake db:test:prepare'
1974
+ else
1975
+ run 'bundle exec rake db:migrate'
1976
+ run 'bundle exec rake db:test:prepare'
1977
+ end
1978
+ end
1979
+ else
1980
+ ## MONGOID
1981
+ say_wizard "dropping database, creating indexes and seeding the database"
1982
+ if prefer :local_env_file, 'foreman'
1983
+ run 'foreman run bundle exec rake db:drop'
1984
+ run 'foreman run bundle exec rake db:mongoid:create_indexes'
1985
+ else
1986
+ run 'bundle exec rake db:drop'
1987
+ run 'bundle exec rake db:mongoid:create_indexes'
1988
+ end
1989
+ end
1990
+ unless prefs[:skip_seeds]
1991
+ unless prefer :railsapps, 'rails-recurly-subscription-saas'
1992
+ if prefer :local_env_file, 'foreman'
1993
+ run 'foreman run bundle exec rake db:seed'
1994
+ else
1995
+ run 'bundle exec rake db:seed'
1996
+ end
1997
+ end
1998
+ end
1999
+ ### GIT ###
2000
+ git :add => '-A' if prefer :git, true
2001
+ git :commit => '-qm "rails_apps_composer: set up database"' if prefer :git, true
2002
+ end # after_everything
2003
+ # >----------------------------- recipes/init.rb -----------------------------end<
2004
+ # >-------------------------- templates/recipe.erb ---------------------------end<
2005
+
2006
+ # >-------------------------- templates/recipe.erb ---------------------------start<
2007
+ # >---------------------------------[ apps4 ]---------------------------------<
2008
+ @current_recipe = "apps4"
2009
+ @before_configs["apps4"].call if @before_configs["apps4"]
2010
+ say_recipe 'apps4'
2011
+ @configs[@current_recipe] = config
2012
+ # >---------------------------- recipes/apps4.rb -----------------------------start<
2013
+
2014
+ # Application template recipe for the rails_apps_composer. Change the recipe here:
2015
+ # https://github.com/RailsApps/rails_apps_composer/blob/master/recipes/apps4.rb
2016
+
2017
+ ### LEARN-RAILS ####
2018
+
2019
+ if prefer :apps4, 'learn-rails'
2020
+
2021
+ # >-------------------------------[ Gems ]--------------------------------<
2022
+
2023
+ add_gem 'activerecord-tableless'
2024
+ add_gem 'high_voltage'
2025
+ add_gem 'gibbon'
2026
+ add_gem 'google_drive'
2027
+ gsub_file 'Gemfile', /gem 'sqlite3'\n/, ''
2028
+ add_gem 'sqlite3', :group => :development
2029
+ add_gem 'pg', :group => :production
2030
+ add_gem 'thin', :group => :production
2031
+ add_gem 'rails_12factor', :group => :production
2032
+
2033
+ # >-------------------------------[ after_everything ]--------------------------------<
2034
+
2035
+ after_everything do
2036
+ say_wizard "recipe running after 'bundle install'"
2037
+ repo = 'https://raw.github.com/RailsApps/learn-rails/master/'
2038
+
2039
+ # >-------------------------------[ Clean up starter app ]--------------------------------<
2040
+
2041
+ # remove commented lines and multiple blank lines from Gemfile
2042
+ # thanks to https://github.com/perfectline/template-bucket/blob/master/cleanup.rb
2043
+ gsub_file 'Gemfile', /#.*\n/, "\n"
2044
+ gsub_file 'Gemfile', /\n^\s*\n/, "\n"
2045
+ # remove commented lines and multiple blank lines from config/routes.rb
2046
+ gsub_file 'config/routes.rb', / #.*\n/, "\n"
2047
+ gsub_file 'config/routes.rb', /\n^\s*\n/, "\n"
2048
+ # GIT
2049
+ git :add => '-A' if prefer :git, true
2050
+ git :commit => '-qm "rails_apps_composer: clean up starter app"' if prefer :git, true
2051
+
2052
+ # >-------------------------------[ Models ]--------------------------------<
2053
+
2054
+ copy_from_repo 'app/models/contact.rb', :repo => repo
2055
+ copy_from_repo 'app/models/visitor.rb', :repo => repo
2056
+
2057
+ # >-------------------------------[ Init ]--------------------------------<
2058
+ copy_from_repo 'config/application.yml', :repo => repo
2059
+ remove_file 'config/application.example.yml'
2060
+ copy_file destination_root + '/config/application.yml', destination_root + '/config/application.example.yml'
2061
+
2062
+ # >-------------------------------[ Controllers ]--------------------------------<
2063
+
2064
+ copy_from_repo 'app/controllers/contacts_controller.rb', :repo => repo
2065
+ copy_from_repo 'app/controllers/visitors_controller.rb', :repo => repo
2066
+
2067
+ # >-------------------------------[ Mailers ]--------------------------------<
2068
+
2069
+ generate 'mailer UserMailer'
2070
+ copy_from_repo 'app/mailers/user_mailer.rb', :repo => repo
2071
+
2072
+ # >-------------------------------[ Views ]--------------------------------<
2073
+
2074
+ copy_from_repo 'app/views/contacts/new.html.erb', :repo => repo
2075
+ copy_from_repo 'app/views/pages/about.html.erb', :repo => repo
2076
+ copy_from_repo 'app/views/user_mailer/contact_email.html.erb', :repo => repo
2077
+ copy_from_repo 'app/views/user_mailer/contact_email.text.erb', :repo => repo
2078
+ copy_from_repo 'app/views/visitors/new.html.erb', :repo => repo
2079
+ # create navigation links using the rails_layout gem
2080
+ generate 'layout:navigation -f'
2081
+
2082
+ # >-------------------------------[ Routes ]--------------------------------<
2083
+
2084
+ copy_from_repo 'config/routes.rb', :repo => repo
2085
+ ### CORRECT APPLICATION NAME ###
2086
+ gsub_file 'config/routes.rb', /^.*.routes.draw do/, "#{app_const}.routes.draw do"
2087
+
2088
+ # >-------------------------------[ Assets ]--------------------------------<
2089
+
2090
+ copy_from_repo 'app/assets/javascripts/segmentio.js', :repo => repo
2091
+
2092
+ ### GIT ###
2093
+ git :add => '-A' if prefer :git, true
2094
+ git :commit => '-qm "rails_apps_composer: learn-rails app"' if prefer :git, true
2095
+ end # after_bundler
2096
+ end # learn-rails
2097
+
2098
+ ### RAILS-BOOTSTRAP or RAILS-FOUNDATION ####
2099
+
2100
+ if (prefer :apps4, 'rails-bootstrap') || (prefer :apps4, 'rails-foundation')
2101
+
2102
+ # >-------------------------------[ Gems ]--------------------------------<
2103
+
2104
+ add_gem 'high_voltage'
2105
+
2106
+ # >-------------------------------[ after_everything ]--------------------------------<
2107
+
2108
+ after_everything do
2109
+ say_wizard "recipe running after 'bundle install'"
2110
+ repo = 'https://raw.github.com/RailsApps/rails-bootstrap/master/' if prefer :apps4, 'rails-bootstrap'
2111
+ repo = 'https://raw.github.com/RailsApps/rails-foundation/master/' if prefer :apps4, 'rails-foundation'
2112
+
2113
+ # >-------------------------------[ Clean up starter app ]--------------------------------<
2114
+
2115
+ # remove commented lines and multiple blank lines from Gemfile
2116
+ # thanks to https://github.com/perfectline/template-bucket/blob/master/cleanup.rb
2117
+ gsub_file 'Gemfile', /#.*\n/, "\n"
2118
+ gsub_file 'Gemfile', /\n^\s*\n/, "\n"
2119
+ # remove commented lines and multiple blank lines from config/routes.rb
2120
+ gsub_file 'config/routes.rb', / #.*\n/, "\n"
2121
+ gsub_file 'config/routes.rb', /\n^\s*\n/, "\n"
2122
+ # GIT
2123
+ git :add => '-A' if prefer :git, true
2124
+ git :commit => '-qm "rails_apps_composer: clean up starter app"' if prefer :git, true
2125
+
2126
+ # >-------------------------------[ Models ]--------------------------------<
2127
+
2128
+ # no models
2129
+
2130
+ # >-------------------------------[ Init ]--------------------------------<
2131
+ copy_from_repo 'config/application.yml', :repo => repo
2132
+ remove_file 'config/application.example.yml'
2133
+ copy_file destination_root + '/config/application.yml', destination_root + '/config/application.example.yml'
2134
+
2135
+ # >-------------------------------[ Controllers ]--------------------------------<
2136
+
2137
+ copy_from_repo 'app/controllers/visitors_controller.rb', :repo => repo
2138
+
2139
+ # >-------------------------------[ Views ]--------------------------------<
2140
+
2141
+ copy_from_repo 'app/views/pages/about.html.erb', :repo => repo
2142
+ copy_from_repo 'app/views/visitors/new.html.erb', :repo => repo
2143
+ # create navigation links using the rails_layout gem
2144
+ generate 'layout:navigation -f'
2145
+
2146
+ # >-------------------------------[ Routes ]--------------------------------<
2147
+
2148
+ copy_from_repo 'config/routes.rb', :repo => repo
2149
+ ### CORRECT APPLICATION NAME ###
2150
+ gsub_file 'config/routes.rb', /^.*.routes.draw do/, "#{app_const}.routes.draw do"
2151
+
2152
+ # >-------------------------------[ Assets ]--------------------------------<
2153
+
2154
+ # no assets
2155
+
2156
+ ### GIT ###
2157
+ if prefer :git, true
2158
+ git :add => '-A'
2159
+ git :commit => '-qm "rails_apps_composer: rails-bootstrap app"' if prefer :apps4, 'rails-bootstrap'
2160
+ git :commit => '-qm "rails_apps_composer: rails-foundation app"' if prefer :apps4, 'rails-foundation'
2161
+ end
2162
+ end # after_bundler
2163
+ end # rails-bootstrap
2164
+
2165
+ ### RAILS-DEVISE ####
2166
+
2167
+ if prefer :apps4, 'rails-devise'
2168
+
2169
+ # >-------------------------------[ after_bundler ]--------------------------------<
2170
+
2171
+ after_bundler do
2172
+ say_wizard "recipe running after 'bundle install'"
2173
+ repo = 'https://raw.github.com/RailsApps/rails-devise/master/'
2174
+
2175
+ # >-------------------------------[ Init ]--------------------------------<
2176
+
2177
+ copy_from_repo 'config/application.yml', :repo => repo
2178
+ remove_file 'config/application.example.yml'
2179
+ copy_file destination_root + '/config/application.yml', destination_root + '/config/application.example.yml'
2180
+
2181
+ # >-------------------------------[ Controllers ]--------------------------------<
2182
+
2183
+ copy_from_repo 'app/controllers/home_controller.rb', :repo => repo
2184
+ copy_from_repo 'app/controllers/users_controller.rb', :repo => repo
2185
+ copy_from_repo 'app/controllers/registrations_controller.rb', :repo => repo
2186
+
2187
+ # >-------------------------------[ Views ]--------------------------------<
2188
+
2189
+ copy_from_repo 'app/views/home/index.html.erb', :repo => repo
2190
+ copy_from_repo 'app/views/users/index.html.erb', :repo => repo
2191
+ copy_from_repo 'app/views/users/show.html.erb', :repo => repo
2192
+
2193
+ # >-------------------------------[ Routes ]--------------------------------<
2194
+
2195
+ copy_from_repo 'config/routes.rb', :repo => repo
2196
+ ### CORRECT APPLICATION NAME ###
2197
+ gsub_file 'config/routes.rb', /^.*.routes.draw do/, "#{app_const}.routes.draw do"
2198
+
2199
+ end
2200
+
2201
+ # >-------------------------------[ after_everything ]--------------------------------<
2202
+
2203
+ after_everything do
2204
+ say_wizard "recipe running after 'bundle install'"
2205
+
2206
+ # >-------------------------------[ Clean up starter app ]--------------------------------<
2207
+
2208
+ # remove commented lines and multiple blank lines from Gemfile
2209
+ # thanks to https://github.com/perfectline/template-bucket/blob/master/cleanup.rb
2210
+ gsub_file 'Gemfile', /#.*\n/, "\n"
2211
+ gsub_file 'Gemfile', /\n^\s*\n/, "\n"
2212
+ # remove commented lines and multiple blank lines from config/routes.rb
2213
+ gsub_file 'config/routes.rb', / #.*\n/, "\n"
2214
+ gsub_file 'config/routes.rb', /\n^\s*\n/, "\n"
2215
+ # GIT
2216
+ git :add => '-A' if prefer :git, true
2217
+ git :commit => '-qm "rails_apps_composer: clean up starter app"' if prefer :git, true
2218
+
2219
+ ### GIT ###
2220
+ git :add => '-A' if prefer :git, true
2221
+ git :commit => '-qm "rails_apps_composer: learn-rails app"' if prefer :git, true
2222
+
2223
+ end # after_bundler
2224
+ end # rails-devise
2225
+
2226
+ ### RAILS-OMNIAUTH ####
2227
+
2228
+ if prefer :apps4, 'rails-omniauth'
2229
+
2230
+ # >-------------------------------[ after_bundler ]--------------------------------<
2231
+
2232
+ after_bundler do
2233
+ say_wizard "recipe running after 'bundle install'"
2234
+ repo = 'https://raw.github.com/RailsApps/rails-omniauth/master/'
2235
+
2236
+ # >-------------------------------[ Init ]--------------------------------<
2237
+
2238
+ copy_from_repo 'config/application.yml', :repo => repo
2239
+ remove_file 'config/application.example.yml'
2240
+ copy_file destination_root + '/config/application.yml', destination_root + '/config/application.example.yml'
2241
+
2242
+ # >-------------------------------[ Models ]--------------------------------<
2243
+
2244
+ copy_from_repo 'app/models/user.rb', :repo => repo
2245
+
2246
+ # >-------------------------------[ Controllers ]--------------------------------<
2247
+
2248
+ copy_from_repo 'app/controllers/home_controller.rb', :repo => repo
2249
+ copy_from_repo 'app/controllers/sessions_controller.rb', :repo => repo
2250
+ gsub_file 'app/controllers/sessions_controller.rb', /twitter/, prefs[:omniauth_provider]
2251
+ copy_from_repo 'app/controllers/users_controller.rb', :repo => repo
2252
+
2253
+ # >-------------------------------[ Views ]--------------------------------<
2254
+
2255
+ copy_from_repo 'app/views/home/index.html.erb', :repo => repo
2256
+ copy_from_repo 'app/views/users/edit.html.erb', :repo => repo
2257
+ copy_from_repo 'app/views/users/index.html.erb', :repo => repo
2258
+ copy_from_repo 'app/views/users/show.html.erb', :repo => repo
2259
+
2260
+ # >-------------------------------[ Routes ]--------------------------------<
2261
+
2262
+ copy_from_repo 'config/routes.rb', :repo => repo
2263
+ ### CORRECT APPLICATION NAME ###
2264
+ gsub_file 'config/routes.rb', /^.*.routes.draw do/, "#{app_const}.routes.draw do"
2265
+
2266
+ end
2267
+
2268
+ # >-------------------------------[ after_everything ]--------------------------------<
2269
+
2270
+ after_everything do
2271
+ say_wizard "recipe running after 'bundle install'"
2272
+
2273
+ # >-------------------------------[ Clean up starter app ]--------------------------------<
2274
+
2275
+ # remove commented lines and multiple blank lines from Gemfile
2276
+ # thanks to https://github.com/perfectline/template-bucket/blob/master/cleanup.rb
2277
+ gsub_file 'Gemfile', /#.*\n/, "\n"
2278
+ gsub_file 'Gemfile', /\n^\s*\n/, "\n"
2279
+ # remove commented lines and multiple blank lines from config/routes.rb
2280
+ gsub_file 'config/routes.rb', / #.*\n/, "\n"
2281
+ gsub_file 'config/routes.rb', /\n^\s*\n/, "\n"
2282
+ # GIT
2283
+ git :add => '-A' if prefer :git, true
2284
+ git :commit => '-qm "rails_apps_composer: clean up starter app"' if prefer :git, true
2285
+
2286
+ ### GIT ###
2287
+ git :add => '-A' if prefer :git, true
2288
+ git :commit => '-qm "rails_apps_composer: learn-rails app"' if prefer :git, true
2289
+
2290
+ end # after_bundler
2291
+ end # rails-omniauth
2292
+ # >---------------------------- recipes/apps4.rb -----------------------------end<
2293
+ # >-------------------------- templates/recipe.erb ---------------------------end<
2294
+
2295
+ # >-------------------------- templates/recipe.erb ---------------------------start<
2296
+ # >------------------------------[ controllers ]------------------------------<
2297
+ @current_recipe = "controllers"
2298
+ @before_configs["controllers"].call if @before_configs["controllers"]
2299
+ say_recipe 'controllers'
2300
+ @configs[@current_recipe] = config
2301
+ # >------------------------- recipes/controllers.rb --------------------------start<
2302
+
2303
+ # Application template recipe for the rails_apps_composer. Change the recipe here:
2304
+ # https://github.com/RailsApps/rails_apps_composer/blob/master/recipes/controllers.rb
2305
+
2306
+ after_bundler do
2307
+ say_wizard "recipe running after 'bundle install'"
2308
+ ### APPLICATION_CONTROLLER ###
2309
+ if prefer :authentication, 'omniauth'
2310
+ copy_from_repo 'app/controllers/application_controller.rb', :repo => 'https://raw.github.com/RailsApps/rails-omniauth/master/'
2311
+ end
2312
+ if prefer :authorization, 'cancan'
2313
+ inject_into_file 'app/controllers/application_controller.rb', :before => "\nend" do <<-RUBY
2314
+ \n
2315
+ rescue_from CanCan::AccessDenied do |exception|
2316
+ redirect_to root_path, :alert => exception.message
2317
+ end
2318
+ RUBY
2319
+ end
2320
+ end
2321
+ ### HOME_CONTROLLER ###
2322
+ if ['home_app','users_app','admin_app','subdomains_app'].include? prefs[:starter_app]
2323
+ generate(:controller, "home")
2324
+ end
2325
+ ### USERS_CONTROLLER ###
2326
+ case prefs[:starter_app]
2327
+ when 'users_app'
2328
+ if (prefer :authentication, 'devise') and (not prefer :apps4, 'rails-devise')
2329
+ copy_from_repo 'app/controllers/users_controller.rb', :repo => 'https://raw.github.com/RailsApps/rails3-devise-rspec-cucumber/master/'
2330
+ elsif prefer :authentication, 'omniauth'
2331
+ if rails_4?
2332
+ copy_from_repo 'app/controllers/users_controller.rb', :repo => 'https://raw.github.com/RailsApps/rails-omniauth/master/'
2333
+ else
2334
+ copy_from_repo 'app/controllers/users_controller.rb', :repo => 'https://raw.github.com/RailsApps/rails3-mongoid-omniauth/master/'
2335
+ end
2336
+ end
2337
+ when 'admin_app'
2338
+ if (prefer :authentication, 'devise') and (not prefer :apps4, 'rails-devise')
2339
+ copy_from_repo 'app/controllers/users_controller.rb', :repo => 'https://raw.github.com/RailsApps/rails3-bootstrap-devise-cancan/master/'
2340
+ elsif prefer :authentication, 'omniauth'
2341
+ if rails_4?
2342
+ copy_from_repo 'app/controllers/users_controller.rb', :repo => 'https://raw.github.com/RailsApps/rails-omniauth/master/'
2343
+ else
2344
+ copy_from_repo 'app/controllers/users_controller.rb', :repo => 'https://raw.github.com/RailsApps/rails3-mongoid-omniauth/master/'
2345
+ end
2346
+ end
2347
+ when 'subdomains_app'
2348
+ copy_from_repo 'app/controllers/users_controller.rb', :repo => 'https://raw.github.com/RailsApps/rails3-subdomains/master/'
2349
+ end
2350
+ ### REGISTRATIONS_CONTROLLER ###
2351
+ if rails_4?
2352
+ if ['users_app','admin_app','subdomains_app'].include? prefs[:starter_app]
2353
+ ## accommodate strong parameters in Rails 4
2354
+ copy_from_repo 'app/controllers/registrations_controller-devise.rb', :prefs => 'devise'
2355
+ end
2356
+ end
2357
+ ### SESSIONS_CONTROLLER ###
2358
+ if prefer :authentication, 'omniauth'
2359
+ filename = 'app/controllers/sessions_controller.rb'
2360
+ copy_from_repo filename, :repo => 'https://raw.github.com/RailsApps/rails-omniauth/master/'
2361
+ gsub_file filename, /twitter/, prefs[:omniauth_provider] unless prefer :omniauth_provider, 'twitter'
2362
+ if prefer :authorization, 'cancan'
2363
+ inject_into_file filename, " user.add_role :admin if User.count == 1 # make the first user an admin\n", :after => "session[:user_id] = user.id\n"
2364
+ end
2365
+ end
2366
+ ### PROFILES_CONTROLLER ###
2367
+ copy_from_repo 'app/controllers/profiles_controller.rb', :repo => 'https://raw.github.com/RailsApps/rails3-subdomains/master/' if prefer :starter_app, 'subdomains_app'
2368
+ ### GIT ###
2369
+ git :add => '-A' if prefer :git, true
2370
+ git :commit => '-qm "rails_apps_composer: controllers"' if prefer :git, true
2371
+ end # after_bundler
2372
+ # >------------------------- recipes/controllers.rb --------------------------end<
2373
+ # >-------------------------- templates/recipe.erb ---------------------------end<
2374
+
2375
+ # >-------------------------- templates/recipe.erb ---------------------------start<
2376
+ # >---------------------------------[ views ]---------------------------------<
2377
+ @current_recipe = "views"
2378
+ @before_configs["views"].call if @before_configs["views"]
2379
+ say_recipe 'views'
2380
+ @configs[@current_recipe] = config
2381
+ # >---------------------------- recipes/views.rb -----------------------------start<
2382
+
2383
+ # Application template recipe for the rails_apps_composer. Change the recipe here:
2384
+ # https://github.com/RailsApps/rails_apps_composer/blob/master/recipes/views.rb
2385
+
2386
+ after_bundler do
2387
+ say_wizard "recipe running after 'bundle install'"
2388
+ ### DEVISE ###
2389
+ if (prefer :authentication, 'devise') and (not prefer :apps4, 'rails-devise')
2390
+ copy_from_repo 'app/views/devise/shared/_links.html.erb'
2391
+ unless prefer :form_builder, 'simple_form'
2392
+ copy_from_repo 'app/views/devise/registrations/edit.html.erb'
2393
+ copy_from_repo 'app/views/devise/registrations/new.html.erb'
2394
+ else
2395
+ copy_from_repo 'app/views/devise/registrations/edit-simple_form.html.erb', :prefs => 'simple_form'
2396
+ copy_from_repo 'app/views/devise/registrations/new-simple_form.html.erb', :prefs => 'simple_form'
2397
+ copy_from_repo 'app/views/devise/sessions/new-simple_form.html.erb', :prefs => 'simple_form'
2398
+ copy_from_repo 'app/helpers/application_helper-simple_form.rb', :prefs => 'simple_form'
2399
+ end
2400
+ end
2401
+ ### HOME ###
2402
+ copy_from_repo 'app/views/home/index.html.erb' if prefer :starter_app, 'users_app'
2403
+ copy_from_repo 'app/views/home/index.html.erb' if prefer :starter_app, 'admin_app'
2404
+ copy_from_repo 'app/views/home/index-subdomains_app.html.erb', :prefs => 'subdomains_app'
2405
+ ### USERS ###
2406
+ if ['users_app','admin_app','subdomains_app'].include? prefs[:starter_app]
2407
+ ## INDEX
2408
+ if prefer :starter_app, 'admin_app'
2409
+ copy_from_repo 'app/views/users/index-admin_app.html.erb', :prefs => 'admin_app'
2410
+ unless prefer :form_builder, 'simple_form'
2411
+ copy_from_repo 'app/views/users/_user.html.erb'
2412
+ else
2413
+ copy_from_repo 'app/views/users/_user-simple_form.html.erb', :prefs => 'simple_form'
2414
+ end
2415
+ else
2416
+ copy_from_repo 'app/views/users/index.html.erb'
2417
+ end
2418
+ ## SHOW
2419
+ copy_from_repo 'app/views/users/show.html.erb'
2420
+ copy_from_repo 'app/views/users/show-subdomains_app.html.erb', :prefs => 'subdomains_app'
2421
+ ## EDIT
2422
+ copy_from_repo 'app/views/users/edit.html.erb', :repo => 'https://raw.github.com/RailsApps/rails-omniauth/master/'
2423
+ end
2424
+ ### PROFILES ###
2425
+ copy_from_repo 'app/views/profiles/show-subdomains_app.html.erb', :prefs => 'subdomains_app'
2426
+ ### GIT ###
2427
+ git :add => '-A' if prefer :git, true
2428
+ git :commit => '-qm "rails_apps_composer: views"' if prefer :git, true
2429
+ end # after_bundler
2430
+ # >---------------------------- recipes/views.rb -----------------------------end<
2431
+ # >-------------------------- templates/recipe.erb ---------------------------end<
2432
+
2433
+ # >-------------------------- templates/recipe.erb ---------------------------start<
2434
+ # >-------------------------------[ prelaunch ]-------------------------------<
2435
+ @current_recipe = "prelaunch"
2436
+ @before_configs["prelaunch"].call if @before_configs["prelaunch"]
2437
+ say_recipe 'prelaunch'
2438
+ @configs[@current_recipe] = config
2439
+ # >-------------------------- recipes/prelaunch.rb ---------------------------start<
2440
+
2441
+ # Application template recipe for the rails_apps_composer. Change the recipe here:
2442
+ # https://github.com/RailsApps/rails_apps_composer/blob/master/recipes/prelaunch.rb
2443
+
2444
+ if prefer :railsapps, 'rails-prelaunch-signup'
2445
+
2446
+ after_everything do
2447
+ say_wizard "recipe running after 'bundle install'"
2448
+ repo = 'https://raw.github.com/RailsApps/rails-prelaunch-signup/master/'
2449
+
2450
+ # >-------------------------------[ Clean up starter app ]--------------------------------<
2451
+
2452
+ %w{
2453
+ public/index.html
2454
+ app/assets/images/rails.png
2455
+ }.each { |file| remove_file file }
2456
+ # remove commented lines and multiple blank lines from Gemfile
2457
+ # thanks to https://github.com/perfectline/template-bucket/blob/master/cleanup.rb
2458
+ gsub_file 'Gemfile', /#.*\n/, "\n"
2459
+ gsub_file 'Gemfile', /\n^\s*\n/, "\n"
2460
+ # remove commented lines and multiple blank lines from config/routes.rb
2461
+ gsub_file 'config/routes.rb', / #.*\n/, "\n"
2462
+ gsub_file 'config/routes.rb', /\n^\s*\n/, "\n"
2463
+ # GIT
2464
+ git :add => '-A' if prefer :git, true
2465
+ git :commit => '-qm "rails_apps_composer: clean up starter app"' if prefer :git, true
2466
+
2467
+ # >-------------------------------[ Create a git branch ]--------------------------------<
2468
+ if prefer :git, true
2469
+ if prefer :prelaunch_branch, 'master'
2470
+ unless prefer :main_branch, 'none'
2471
+ say_wizard "renaming git branch 'master' to '#{prefs[:main_branch]}' for starter app"
2472
+ git :branch => "-m master #{prefs[:main_branch]}"
2473
+ git :checkout => "-b master"
2474
+ else
2475
+ say_wizard "creating prelaunch app on git branch 'master'"
2476
+ end
2477
+ else
2478
+ say_wizard "creating new git branch '#{prefs[:prelaunch_branch]}' for prelaunch app"
2479
+ git :checkout => "-b #{prefs[:prelaunch_branch]}"
2480
+ end
2481
+ end
2482
+
2483
+ # >-------------------------------[ Models ]--------------------------------<
2484
+
2485
+ copy_from_repo 'app/models/user.rb', :repo => repo
2486
+
2487
+ # >-------------------------------[ Init ]--------------------------------<
2488
+ copy_from_repo 'config/application.yml', :repo => repo
2489
+ remove_file 'config/application.example.yml'
2490
+ copy_file destination_root + '/config/application.yml', destination_root + '/config/application.example.yml'
2491
+ copy_from_repo 'db/seeds.rb', :repo => repo
2492
+ run 'bundle exec rake db:seed'
2493
+ run 'bundle exec rake db:test:prepare'
2494
+
2495
+ # >-------------------------------[ Controllers ]--------------------------------<
2496
+
2497
+ copy_from_repo 'app/controllers/confirmations_controller.rb', :repo => repo
2498
+ copy_from_repo 'app/controllers/home_controller.rb', :repo => repo
2499
+ copy_from_repo 'app/controllers/registrations_controller.rb', :repo => repo
2500
+ copy_from_repo 'app/controllers/users_controller.rb', :repo => repo
2501
+
2502
+ # >-------------------------------[ Mailers ]--------------------------------<
2503
+
2504
+ generate 'mailer UserMailer'
2505
+ copy_from_repo 'spec/mailers/user_mailer_spec.rb', :repo => repo
2506
+ copy_from_repo 'app/mailers/user_mailer.rb', :repo => repo
2507
+
2508
+ # >-------------------------------[ Views ]--------------------------------<
2509
+
2510
+ copy_from_repo 'app/views/devise/confirmations/show.html.erb', :repo => repo
2511
+ copy_from_repo 'app/views/devise/mailer/confirmation_instructions.html.erb', :repo => repo
2512
+ copy_from_repo 'app/views/devise/registrations/_thankyou.html.erb', :repo => repo
2513
+ copy_from_repo 'app/views/devise/registrations/new.html.erb', :repo => repo
2514
+ copy_from_repo 'app/views/devise/shared/_links.html.erb', :repo => repo
2515
+ copy_from_repo 'app/views/home/index.html.erb', :repo => repo
2516
+ copy_from_repo 'app/views/user_mailer/welcome_email.html.erb', :repo => repo
2517
+ copy_from_repo 'app/views/user_mailer/welcome_email.text.erb', :repo => repo
2518
+ copy_from_repo 'app/views/users/index.html.erb', :repo => repo
2519
+ copy_from_repo 'public/thankyou.html', :repo => repo
2520
+
2521
+ # >-------------------------------[ Routes ]--------------------------------<
2522
+
2523
+ copy_from_repo 'config/routes.rb', :repo => repo
2524
+ ### CORRECT APPLICATION NAME ###
2525
+ gsub_file 'config/routes.rb', /^.*.routes.draw do/, "#{app_const}.routes.draw do"
2526
+
2527
+ # >-------------------------------[ Assets ]--------------------------------<
2528
+
2529
+ copy_from_repo 'app/assets/javascripts/application.js', :repo => repo
2530
+ copy_from_repo 'app/assets/stylesheets/application.css.scss', :repo => repo
2531
+
2532
+ # >-------------------------------[ Cucumber ]--------------------------------<
2533
+ say_wizard "copying Cucumber scenarios from the rails-prelaunch-signup examples"
2534
+ copy_from_repo 'features/admin/send_invitations.feature', :repo => repo
2535
+ copy_from_repo 'features/admin/view_progress.feature', :repo => repo
2536
+ copy_from_repo 'features/visitors/request_invitation.feature', :repo => repo
2537
+ copy_from_repo 'features/users/sign_in.feature', :repo => repo
2538
+ copy_from_repo 'features/users/sign_up.feature', :repo => repo
2539
+ copy_from_repo 'features/users/user_show.feature', :repo => repo
2540
+ copy_from_repo 'features/step_definitions/admin_steps.rb', :repo => repo
2541
+ copy_from_repo 'features/step_definitions/user_steps.rb', :repo => repo
2542
+ copy_from_repo 'features/step_definitions/visitor_steps.rb', :repo => repo
2543
+ copy_from_repo 'config/locales/devise.en.yml', :repo => repo
2544
+
2545
+ ### GIT ###
2546
+ git :add => '-A' if prefer :git, true
2547
+ git :commit => '-qm "rails_apps_composer: prelaunch app"' if prefer :git, true
2548
+ end # after_bundler
2549
+ end # rails-prelaunch-signup
2550
+ # >-------------------------- recipes/prelaunch.rb ---------------------------end<
2551
+ # >-------------------------- templates/recipe.erb ---------------------------end<
2552
+
2553
+ # >-------------------------- templates/recipe.erb ---------------------------start<
2554
+ # >-------------------------------[ prelaunch ]-------------------------------<
2555
+ @current_recipe = "saas"
2556
+ @before_configs["saas"].call if @before_configs["saas"]
2557
+ say_recipe 'prelaunch'
2558
+ @configs[@current_recipe] = config
2559
+ # >-------------------------- recipes/prelaunch.rb ---------------------------start<
2560
+
2561
+ # Application template recipe for the rails_apps_composer. Change the recipe here:
2562
+ # https://github.com/RailsApps/rails_apps_composer/blob/master/recipes/saas.rb
2563
+
2564
+ if prefer :railsapps, 'rails-stripe-membership-saas'
2565
+
2566
+ after_everything do
2567
+ say_wizard "recipe running after 'bundle install'"
2568
+ repo = 'https://raw.github.com/RailsApps/rails-stripe-membership-saas/master/'
2569
+
2570
+ # >-------------------------------[ Clean up starter app ]--------------------------------<
2571
+
2572
+ %w{
2573
+ public/index.html
2574
+ app/assets/images/rails.png
2575
+ }.each { |file| remove_file file }
2576
+ # remove commented lines and multiple blank lines from Gemfile
2577
+ # thanks to https://github.com/perfectline/template-bucket/blob/master/cleanup.rb
2578
+ gsub_file 'Gemfile', /#.*\n/, "\n"
2579
+ gsub_file 'Gemfile', /\n^\s*\n/, "\n"
2580
+ # remove commented lines and multiple blank lines from config/routes.rb
2581
+ gsub_file 'config/routes.rb', / #.*\n/, "\n"
2582
+ gsub_file 'config/routes.rb', /\n^\s*\n/, "\n"
2583
+ # GIT
2584
+ git :add => '-A' if prefer :git, true
2585
+ git :commit => '-qm "rails_apps_composer: clean up starter app"' if prefer :git, true
2586
+
2587
+ # >-------------------------------[ Migrations ]--------------------------------<
2588
+ generate 'migration AddStripeToUsers customer_id:string last_4_digits:string'
2589
+ run 'bundle exec rake db:drop'
2590
+ run 'bundle exec rake db:migrate'
2591
+
2592
+ # >-------------------------------[ Models ]--------------------------------<
2593
+ copy_from_repo 'app/models/ability.rb', :repo => repo
2594
+ copy_from_repo 'app/models/user.rb', :repo => repo
2595
+
2596
+ # >-------------------------------[ Init ]--------------------------------<
2597
+ copy_from_repo 'config/application.yml', :repo => repo
2598
+ remove_file 'config/application.example.yml'
2599
+ copy_file destination_root + '/config/application.yml', destination_root + '/config/application.example.yml'
2600
+ copy_from_repo 'db/seeds.rb', :repo => repo
2601
+ copy_from_repo 'config/initializers/stripe.rb', :repo => repo
2602
+ run 'bundle exec rake db:seed'
2603
+ run 'bundle exec rake db:test:prepare'
2604
+
2605
+ # >-------------------------------[ Controllers ]--------------------------------<
2606
+ copy_from_repo 'app/controllers/home_controller.rb', :repo => repo
2607
+ generate 'controller content silver gold platinum --skip-stylesheets --skip-javascripts'
2608
+ copy_from_repo 'app/controllers/content_controller.rb', :repo => repo
2609
+ copy_from_repo 'app/controllers/registrations_controller.rb', :repo => repo
2610
+ copy_from_repo 'app/controllers/application_controller.rb', :repo => repo
2611
+ copy_from_repo 'app/controllers/users_controller.rb', :repo => repo
2612
+
2613
+ # >-------------------------------[ Mailers ]--------------------------------<
2614
+ generate 'mailer UserMailer'
2615
+ copy_from_repo 'app/mailers/user_mailer.rb', :repo => repo
2616
+
2617
+ # >-------------------------------[ Views ]--------------------------------<
2618
+ copy_from_repo 'app/views/home/index.html.erb', :repo => repo
2619
+ copy_from_repo 'app/views/layouts/_navigation.html.erb', :repo => repo
2620
+ copy_from_repo 'app/views/devise/registrations/new.html.erb', :repo => repo
2621
+ copy_from_repo 'app/views/devise/registrations/edit.html.erb', :repo => repo
2622
+ copy_from_repo 'app/views/user_mailer/expire_email.html.erb', :repo => repo
2623
+ copy_from_repo 'app/views/user_mailer/expire_email.text.erb', :repo => repo
2624
+
2625
+ # >-------------------------------[ Routes ]--------------------------------<
2626
+ copy_from_repo 'config/routes.rb', :repo => repo
2627
+ ### CORRECT APPLICATION NAME ###
2628
+ gsub_file 'config/routes.rb', /^.*.routes.draw do/, "#{app_const}.routes.draw do"
2629
+
2630
+ # >-------------------------------[ Assets ]--------------------------------<
2631
+ copy_from_repo 'app/assets/javascripts/application.js', :repo => repo
2632
+ copy_from_repo 'app/assets/javascripts/jquery.readyselector.js', :repo => repo
2633
+ copy_from_repo 'app/assets/javascripts/jquery.externalscript.js', :repo => repo
2634
+ copy_from_repo 'app/assets/javascripts/registrations.js', :repo => repo
2635
+ copy_from_repo 'app/assets/stylesheets/application.css.scss', :repo => repo
2636
+ copy_from_repo 'app/assets/stylesheets/pricing.css.scss', :repo => repo
2637
+
2638
+ # >-------------------------------[ RSpec ]--------------------------------<
2639
+ say_wizard "copying RSpec tests from the rails-stripe-membership-saas examples"
2640
+ copy_from_repo 'spec/factories/roles.rb', :repo => repo
2641
+ copy_from_repo 'spec/models/user_spec.rb', :repo => repo
2642
+ copy_from_repo 'spec/controllers/content_controller_spec.rb', :repo => repo
2643
+ copy_from_repo 'spec/mailers/user_mailer_spec.rb', :repo => repo
2644
+ copy_from_repo 'spec/stripe/stripe_config_spec.rb', :repo => repo
2645
+ copy_from_repo 'spec/support/stripe_helper.rb', :repo => repo
2646
+ copy_from_repo 'spec/support/fixtures/success.json', :repo => repo
2647
+
2648
+ # >-------------------------------[ Cucumber ]--------------------------------<
2649
+ say_wizard "copying Cucumber scenarios from the rails-stripe-membership-saas examples"
2650
+ remove_file 'features/users/user_show.feature'
2651
+ copy_from_repo 'features/support/paths.rb', :repo => repo
2652
+ copy_from_repo 'features/users/sign_in.feature', :repo => repo
2653
+ copy_from_repo 'features/users/sign_up.feature', :repo => repo
2654
+ copy_from_repo 'features/users/sign_up_with_stripe.feature', :repo => repo
2655
+ copy_from_repo 'features/users/user_edit.feature', :repo => repo
2656
+ copy_from_repo 'features/users/user_delete.feature', :repo => repo
2657
+ copy_from_repo 'features/step_definitions/user_steps.rb', :repo => repo
2658
+ copy_from_repo 'features/step_definitions/form_helper_steps.rb', :repo => repo
2659
+ copy_from_repo 'config/locales/devise.en.yml', :repo => repo
2660
+
2661
+ ### GIT ###
2662
+ git :add => '-A' if prefer :git, true
2663
+ git :commit => '-qm "rails_apps_composer: membership app"' if prefer :git, true
2664
+ end # after_bundler
2665
+ end # rails-stripe-membership-saas
2666
+
2667
+ if prefer :railsapps, 'rails-recurly-subscription-saas'
2668
+
2669
+ after_everything do
2670
+ say_wizard "recipe running after 'bundle install'"
2671
+ repo = 'https://raw.github.com/RailsApps/rails-recurly-subscription-saas/master/'
2672
+
2673
+ # >-------------------------------[ Clean up starter app ]--------------------------------<
2674
+
2675
+ %w{
2676
+ public/index.html
2677
+ app/assets/images/rails.png
2678
+ }.each { |file| remove_file file }
2679
+ # remove commented lines and multiple blank lines from Gemfile
2680
+ # thanks to https://github.com/perfectline/template-bucket/blob/master/cleanup.rb
2681
+ gsub_file 'Gemfile', /#.*\n/, "\n"
2682
+ gsub_file 'Gemfile', /\n^\s*\n/, "\n"
2683
+ # remove commented lines and multiple blank lines from config/routes.rb
2684
+ gsub_file 'config/routes.rb', / #.*\n/, "\n"
2685
+ gsub_file 'config/routes.rb', /\n^\s*\n/, "\n"
2686
+ # GIT
2687
+ git :add => '-A' if prefer :git, true
2688
+ git :commit => '-qm "rails_apps_composer: clean up starter app"' if prefer :git, true
2689
+
2690
+ # >-------------------------------[ Migrations ]--------------------------------<
2691
+ generate 'migration AddRecurlyToUsers first_name:string last_name:string customer_id:string'
2692
+ run 'bundle exec rake db:drop'
2693
+ run 'bundle exec rake db:migrate'
2694
+
2695
+ # >-------------------------------[ Models ]--------------------------------<
2696
+ copy_from_repo 'app/models/ability.rb', :repo => repo
2697
+ copy_from_repo 'app/models/user.rb', :repo => repo
2698
+
2699
+ # >-------------------------------[ Init ]--------------------------------<
2700
+ copy_from_repo 'config/application.yml', :repo => repo
2701
+ remove_file 'config/application.example.yml'
2702
+ copy_file destination_root + '/config/application.yml', destination_root + '/config/application.example.yml'
2703
+ copy_from_repo 'db/seeds.rb', :repo => repo
2704
+ copy_from_repo 'config/initializers/recurly.rb', :repo => repo
2705
+ run 'bundle exec rake db:seed'
2706
+ run 'bundle exec rake db:test:prepare'
2707
+
2708
+ # >-------------------------------[ Controllers ]--------------------------------<
2709
+ copy_from_repo 'app/controllers/home_controller.rb', :repo => repo
2710
+ generate 'controller content silver gold platinum --skip-stylesheets --skip-javascripts'
2711
+ copy_from_repo 'app/controllers/content_controller.rb', :repo => repo
2712
+ copy_from_repo 'app/controllers/registrations_controller.rb', :repo => repo
2713
+ copy_from_repo 'app/controllers/application_controller.rb', :repo => repo
2714
+ copy_from_repo 'app/controllers/users_controller.rb', :repo => repo
2715
+ copy_from_repo 'app/controllers/recurly_controller.rb', :repo => repo
2716
+
2717
+ # >-------------------------------[ Mailers ]--------------------------------<
2718
+ generate 'mailer UserMailer'
2719
+ copy_from_repo 'app/mailers/user_mailer.rb', :repo => repo
2720
+
2721
+ # >-------------------------------[ Views ]--------------------------------<
2722
+ copy_from_repo 'app/views/home/index.html.erb', :repo => repo
2723
+ copy_from_repo 'app/views/layouts/_navigation.html.erb', :repo => repo
2724
+ copy_from_repo 'app/views/devise/registrations/new.html.erb', :repo => repo
2725
+ copy_from_repo 'app/views/devise/registrations/edit.html.erb', :repo => repo
2726
+ copy_from_repo 'app/views/user_mailer/expire_email.html.erb', :repo => repo
2727
+ copy_from_repo 'app/views/user_mailer/expire_email.text.erb', :repo => repo
2728
+
2729
+ # >-------------------------------[ Routes ]--------------------------------<
2730
+ copy_from_repo 'config/routes.rb', :repo => repo
2731
+ ### CORRECT APPLICATION NAME ###
2732
+ gsub_file 'config/routes.rb', /^.*.routes.draw do/, "#{app_const}.routes.draw do"
2733
+
2734
+ # >-------------------------------[ Assets ]--------------------------------<
2735
+ copy_from_repo 'app/assets/javascripts/application.js', :repo => repo
2736
+ copy_from_repo 'app/assets/javascripts/jquery.readyselector.js', :repo => repo
2737
+ copy_from_repo 'app/assets/javascripts/recurly.js', :repo => repo
2738
+ copy_from_repo 'app/assets/javascripts/registrations.js', :repo => repo
2739
+ copy_from_repo 'app/assets/stylesheets/application.css.scss', :repo => repo
2740
+ copy_from_repo 'app/assets/stylesheets/pricing.css.scss', :repo => repo
2741
+
2742
+ # >-------------------------------[ RSpec ]--------------------------------<
2743
+ say_wizard "copying RSpec tests from the rails-recurly-subscription-saas examples"
2744
+ copy_from_repo 'spec/factories/roles.rb', :repo => repo
2745
+ copy_from_repo 'spec/factories/users.rb', :repo => repo
2746
+ copy_from_repo 'spec/models/user_spec.rb', :repo => repo
2747
+ copy_from_repo 'spec/controllers/content_controller_spec.rb', :repo => repo
2748
+ copy_from_repo 'spec/mailers/user_mailer_spec.rb', :repo => repo
2749
+ copy_from_repo 'spec/recurly/recurly_config_spec.rb', :repo => repo
2750
+
2751
+ # >-------------------------------[ Cucumber ]--------------------------------<
2752
+ say_wizard "copying Cucumber scenarios from the rails-recurly-subscription-saas examples"
2753
+ remove_file 'features/users/user_show.feature'
2754
+ copy_from_repo 'features/support/paths.rb', :repo => repo
2755
+ copy_from_repo 'features/users/sign_in.feature', :repo => repo
2756
+ copy_from_repo 'features/users/sign_up.feature', :repo => repo
2757
+ copy_from_repo 'features/users/sign_up_with_recurly.feature', :repo => repo
2758
+ copy_from_repo 'features/users/user_edit.feature', :repo => repo
2759
+ copy_from_repo 'features/users/user_delete.feature', :repo => repo
2760
+ copy_from_repo 'features/step_definitions/user_steps.rb', :repo => repo
2761
+ copy_from_repo 'features/step_definitions/form_helper_steps.rb', :repo => repo
2762
+ copy_from_repo 'config/locales/devise.en.yml', :repo => repo
2763
+
2764
+ ### GIT ###
2765
+ git :add => '-A' if prefer :git, true
2766
+ git :commit => '-qm "rails_apps_composer: membership app"' if prefer :git, true
2767
+ end # after_bundler
2768
+ end # rails-recurly-subscription-saas
2769
+ # >-------------------------- recipes/prelaunch.rb ---------------------------end<
2770
+ # >-------------------------- templates/recipe.erb ---------------------------end<
2771
+
2772
+ # >-------------------------- templates/recipe.erb ---------------------------start<
2773
+ # >--------------------------------[ routes ]---------------------------------<
2774
+ @current_recipe = "routes"
2775
+ @before_configs["routes"].call if @before_configs["routes"]
2776
+ say_recipe 'routes'
2777
+ @configs[@current_recipe] = config
2778
+ # >---------------------------- recipes/routes.rb ----------------------------start<
2779
+
2780
+ # Application template recipe for the rails_apps_composer. Change the recipe here:
2781
+ # https://github.com/RailsApps/rails_apps_composer/blob/master/recipes/routes.rb
2782
+
2783
+ after_bundler do
2784
+ say_wizard "recipe running after 'bundle install'"
2785
+ ### HOME ###
2786
+ if prefer :starter_app, 'home_app'
2787
+ remove_file 'public/index.html'
2788
+ gsub_file 'config/routes.rb', /get \"home\/index\"/, 'root :to => "home#index"'
2789
+ end
2790
+ ### USER_ACCOUNTS ###
2791
+ if ['users_app','admin_app'].include? prefs[:starter_app]
2792
+ ## DEVISE
2793
+ if (prefer :authentication, 'devise') and (not prefer :apps4, 'rails-devise')
2794
+ copy_from_repo 'config/routes.rb', :repo => 'https://raw.github.com/RailsApps/rails3-devise-rspec-cucumber/master/'
2795
+ ## Rails 4.0 doesn't allow two 'root' routes
2796
+ gsub_file 'config/routes.rb', /authenticated :user do\n.*\n.*\n /, '' if rails_4?
2797
+ ## accommodate strong parameters in Rails 4
2798
+ gsub_file 'config/routes.rb', /devise_for :users/, 'devise_for :users, :controllers => {:registrations => "registrations"}' if rails_4?
2799
+ end
2800
+ ## OMNIAUTH
2801
+ if prefer :authentication, 'omniauth'
2802
+ if rails_4?
2803
+ copy_from_repo 'config/routes.rb', :repo => 'https://raw.github.com/RailsApps/rails-omniauth/master/'
2804
+ else
2805
+ copy_from_repo 'config/routes.rb', :repo => 'https://raw.github.com/RailsApps/rails3-mongoid-omniauth/master/'
2806
+ end
2807
+ end
2808
+ end
2809
+ ### SUBDOMAINS ###
2810
+ copy_from_repo 'lib/subdomain.rb', :repo => 'https://raw.github.com/RailsApps/rails3-subdomains/master/' if prefer :starter_app, 'subdomains_app'
2811
+ copy_from_repo 'config/routes.rb', :repo => 'https://raw.github.com/RailsApps/rails3-subdomains/master/' if prefer :starter_app, 'subdomains_app'
2812
+ ### CORRECT APPLICATION NAME ###
2813
+ gsub_file 'config/routes.rb', /^.*.routes.draw do/, "#{app_const}.routes.draw do"
2814
+ ### GIT ###
2815
+ git :add => '-A' if prefer :git, true
2816
+ git :commit => '-qm "rails_apps_composer: routes"' if prefer :git, true
2817
+ end # after_bundler
2818
+ # >---------------------------- recipes/routes.rb ----------------------------end<
2819
+ # >-------------------------- templates/recipe.erb ---------------------------end<
2820
+
2821
+ # >-------------------------- templates/recipe.erb ---------------------------start<
2822
+ # >--------------------------------[ extras ]---------------------------------<
2823
+ @current_recipe = "extras"
2824
+ @before_configs["extras"].call if @before_configs["extras"]
2825
+ say_recipe 'extras'
2826
+ config = {}
2827
+ config['ban_spiders'] = yes_wizard?("Set a robots.txt file to ban spiders?") if true && true unless config.key?('ban_spiders') || prefs.has_key?(:ban_spiders)
2828
+ config['github'] = yes_wizard?("Create a GitHub repository?") if true && true unless config.key?('github') || prefs.has_key?(:github)
2829
+ config['local_env_file'] = multiple_choice("Use file for environment variables?", [["None", "none"], ["Use application.yml with Figaro", "figaro"], ["Use .env with Foreman", "foreman"]]) if true && true unless config.key?('local_env_file') || prefs.has_key?(:local_env_file)
2830
+ config['quiet_assets'] = yes_wizard?("Reduce assets logger noise during development?") if true && true unless config.key?('quiet_assets') || prefs.has_key?(:quiet_assets)
2831
+ config['better_errors'] = yes_wizard?("Improve error reporting with 'better_errors' during development?") if true && true unless config.key?('better_errors') || prefs.has_key?(:better_errors)
2832
+ @configs[@current_recipe] = config
2833
+ # >---------------------------- recipes/extras.rb ----------------------------start<
2834
+
2835
+ # Application template recipe for the rails_apps_composer. Change the recipe here:
2836
+ # https://github.com/RailsApps/rails_apps_composer/blob/master/recipes/extras.rb
2837
+
2838
+ ## RVMRC
2839
+ rvmrc_detected = false
2840
+ if File.exist?('.rvmrc')
2841
+ rvmrc_file = File.read('.rvmrc')
2842
+ rvmrc_detected = rvmrc_file.include? app_name
2843
+ end
2844
+ if File.exist?('.ruby-gemset')
2845
+ rvmrc_file = File.read('.ruby-gemset')
2846
+ rvmrc_detected = rvmrc_file.include? app_name
2847
+ end
2848
+ unless rvmrc_detected || (prefs.has_key? :rvmrc)
2849
+ prefs[:rvmrc] = yes_wizard? "Use or create a project-specific rvm gemset?"
2850
+ end
2851
+ if prefs[:rvmrc]
2852
+ if which("rvm")
2853
+ say_wizard "recipe creating project-specific rvm gemset and .rvmrc"
2854
+ # using the rvm Ruby API, see:
2855
+ # http://blog.thefrontiergroup.com.au/2010/12/a-brief-introduction-to-the-rvm-ruby-api/
2856
+ # https://rvm.io/integration/passenger
2857
+ if ENV['MY_RUBY_HOME'] && ENV['MY_RUBY_HOME'].include?('rvm')
2858
+ begin
2859
+ gems_path = ENV['MY_RUBY_HOME'].split(/@/)[0].sub(/rubies/,'gems')
2860
+ ENV['GEM_PATH'] = "#{gems_path}:#{gems_path}@global"
2861
+ require 'rvm'
2862
+ RVM.use_from_path! File.dirname(File.dirname(__FILE__))
2863
+ rescue LoadError
2864
+ raise "RVM gem is currently unavailable."
2865
+ end
2866
+ end
2867
+ say_wizard "creating RVM gemset '#{app_name}'"
2868
+ RVM.gemset_create app_name
2869
+ say_wizard "switching to gemset '#{app_name}'"
2870
+ # RVM.gemset_use! requires rvm version 1.11.3.5 or newer
2871
+ rvm_spec =
2872
+ if Gem::Specification.respond_to?(:find_by_name)
2873
+ Gem::Specification.find_by_name("rvm")
2874
+ else
2875
+ Gem.source_index.find_name("rvm").last
2876
+ end
2877
+ unless rvm_spec.version > Gem::Version.create('1.11.3.4')
2878
+ say_wizard "rvm gem version: #{rvm_spec.version}"
2879
+ raise "Please update rvm gem to 1.11.3.5 or newer"
2880
+ end
2881
+ begin
2882
+ RVM.gemset_use! app_name
2883
+ rescue => e
2884
+ say_wizard "rvm failure: unable to use gemset #{app_name}, reason: #{e}"
2885
+ raise
2886
+ end
2887
+ run "rvm gemset list"
2888
+ if File.exist?('.ruby-version')
2889
+ say_wizard ".ruby-version file already exists"
2890
+ else
2891
+ create_file '.ruby-version', "#{RUBY_VERSION}\n"
2892
+ end
2893
+ if File.exist?('.ruby-gemset')
2894
+ say_wizard ".ruby-gemset file already exists"
2895
+ else
2896
+ create_file '.ruby-gemset', "#{app_name}\n"
2897
+ end
2898
+ else
2899
+ say_wizard "WARNING! RVM does not appear to be available."
2900
+ end
2901
+ end
2902
+
2903
+ ## QUIET ASSETS
2904
+ if config['quiet_assets']
2905
+ prefs[:quiet_assets] = true
2906
+ end
2907
+ if prefs[:quiet_assets]
2908
+ say_wizard "recipe setting quiet_assets for reduced asset pipeline logging"
2909
+ add_gem 'quiet_assets', :group => :development
2910
+ end
2911
+
2912
+ ## LOCAL_ENV.YML FILE
2913
+ if config['local_env_file']
2914
+ case config['local_env_file']
2915
+ when 'figaro'
2916
+ prefs[:local_env_file] = 'figaro'
2917
+ when 'foreman'
2918
+ prefs[:local_env_file] = 'foreman'
2919
+ end
2920
+ end
2921
+ if prefer :local_env_file, 'figaro' and not rails_4_1?
2922
+ say_wizard "recipe creating application.yml file for environment variables with figaro"
2923
+ add_gem 'figaro'
2924
+ elsif prefer :local_env_file, 'foreman'
2925
+ say_wizard "recipe creating .env file for development environment variables with foreman"
2926
+ add_gem 'foreman', :group => :development
2927
+ end
2928
+
2929
+ ## BETTER ERRORS
2930
+ if config['better_errors']
2931
+ prefs[:better_errors] = true
2932
+ end
2933
+ if prefs[:better_errors]
2934
+ say_wizard "recipe adding better_errors gem"
2935
+ add_gem 'better_errors', :group => :development
2936
+ add_gem 'binding_of_caller', :group => :development, :platforms => [:mri_19, :mri_20, :rbx]
2937
+ end
2938
+
2939
+ ## BAN SPIDERS
2940
+ if config['ban_spiders']
2941
+ prefs[:ban_spiders] = true
2942
+ end
2943
+ if prefs[:ban_spiders]
2944
+ say_wizard "recipe banning spiders by modifying 'public/robots.txt'"
2945
+ after_bundler do
2946
+ gsub_file 'public/robots.txt', /# User-Agent/, 'User-Agent'
2947
+ gsub_file 'public/robots.txt', /# Disallow/, 'Disallow'
2948
+ end
2949
+ end
2950
+
2951
+ ## JSRUNTIME
2952
+ case RbConfig::CONFIG['host_os']
2953
+ when /linux/i
2954
+ prefs[:jsruntime] = yes_wizard? "Add 'therubyracer' JavaScript runtime (for Linux users without node.js)?" unless prefs.has_key? :jsruntime
2955
+ if prefs[:jsruntime]
2956
+ say_wizard "recipe adding 'therubyracer' JavaScript runtime gem"
2957
+ add_gem 'therubyracer', :platform => :ruby
2958
+ end
2959
+ end
2960
+
2961
+ ## AFTER_EVERYTHING
2962
+ after_everything do
2963
+ say_wizard "recipe removing unnecessary files and whitespace"
2964
+ %w{
2965
+ public/index.html
2966
+ app/assets/images/rails.png
2967
+ }.each { |file| remove_file file }
2968
+ # remove temporary Haml gems from Gemfile when Slim is selected
2969
+ if prefer :templates, 'slim'
2970
+ gsub_file 'Gemfile', / gem 'haml2slim'\n/, "\n"
2971
+ gsub_file 'Gemfile', / gem 'html2haml'\n/, "\n"
2972
+ end
2973
+ # remove commented lines and multiple blank lines from Gemfile
2974
+ # thanks to https://github.com/perfectline/template-bucket/blob/master/cleanup.rb
2975
+ gsub_file 'Gemfile', /#.*\n/, "\n"
2976
+ gsub_file 'Gemfile', /\n^\s*\n/, "\n"
2977
+ # remove commented lines and multiple blank lines from config/routes.rb
2978
+ gsub_file 'config/routes.rb', / #.*\n/, "\n"
2979
+ gsub_file 'config/routes.rb', /\n^\s*\n/, "\n"
2980
+ # GIT
2981
+ git :add => '-A' if prefer :git, true
2982
+ git :commit => '-qm "rails_apps_composer: extras"' if prefer :git, true
2983
+ end
2984
+
2985
+ ## GITHUB
2986
+ if config['github']
2987
+ prefs[:github] = true
2988
+ end
2989
+ if prefs[:github]
2990
+ add_gem 'hub', :require => nil, :group => [:development]
2991
+ after_everything do
2992
+ say_wizard "recipe creating GitHub repository"
2993
+ git_uri = `git config remote.origin.url`.strip
2994
+ unless git_uri.size == 0
2995
+ say_wizard "Repository already exists:"
2996
+ say_wizard "#{git_uri}"
2997
+ else
2998
+ run "hub create #{app_name}"
2999
+ unless prefer :railsapps, 'rails-prelaunch-signup'
3000
+ run "hub push -u origin master"
3001
+ else
3002
+ run "hub push -u origin #{prefs[:prelaunch_branch]}"
3003
+ run "hub push -u origin #{prefs[:main_branch]}" unless prefer :main_branch, 'none'
3004
+ end
3005
+ end
3006
+ end
3007
+ end
3008
+ # >---------------------------- recipes/extras.rb ----------------------------end<
3009
+ # >-------------------------- templates/recipe.erb ---------------------------end<
3010
+
3011
+ # >-------------------------- templates/recipe.erb ---------------------------start<
3012
+ # >-------------------------------[ email_dev ]-------------------------------<
3013
+ @current_recipe = "email_dev"
3014
+ @before_configs["email_dev"].call if @before_configs["email_dev"]
3015
+ say_recipe 'email_dev'
3016
+ config = {}
3017
+ config['mailcatcher'] = yes_wizard?("Use Mailcatcher to catch sent emails in development and display in web interface?") if true && true unless config.key?('mailcatcher') || prefs.has_key?(:mailcatcher)
3018
+ config['mail_view'] = yes_wizard?("Add MailView routes to preview email layouts in development?") if true && true unless config.key?('mail_view') || prefs.has_key?(:mail_view)
3019
+ @configs[@current_recipe] = config
3020
+ # >-------------------------- recipes/email_dev.rb ---------------------------start<
3021
+
3022
+ # Application template recipe for the rails_apps_composer. Change the recipe here:
3023
+ # https://github.com/RailsApps/rails_apps_composer/blob/master/recipes/email_dev.rb
3024
+
3025
+ prefs[:mailcatcher] = true if config['mailcatcher']
3026
+ prefs[:mail_view] = true if config['mail_view']
3027
+
3028
+ if prefs[:mailcatcher]
3029
+ if rails_4?
3030
+ add_gem 'mailcatcher', github: 'sj26/mailcatcher', group: :development
3031
+ else
3032
+ add_gem 'mailcatcher', group: :development
3033
+ end
3034
+ end
3035
+ add_gem 'mail_view', group: :development if prefs[:mail_view]
3036
+
3037
+ after_bundler do
3038
+ if prefs[:mailcatcher]
3039
+ say_wizard "recipe installing mailcatcher"
3040
+ create_file 'config/initializers/mailcatcher.rb' do <<-RUBY
3041
+ # Detect if mailcatcher is running and use that if available
3042
+ if Rails.env.development?
3043
+ begin
3044
+ sock = TCPSocket.new("localhost", 1025)
3045
+ sock.close
3046
+ catcher = true
3047
+ rescue
3048
+ catcher = false
3049
+ end
3050
+
3051
+ if catcher
3052
+ ActionMailer::Base.smtp_settings = { :host => "localhost", :port => '1025', }
3053
+ ActionMailer::Base.perform_deliveries = true
3054
+ end
3055
+ end
3056
+ RUBY
3057
+ end
3058
+ if prefer(:local_env_file, 'foreman') && File.exists?('Procfile.dev')
3059
+ append_file 'Procfile.dev', 'mail: mailcatcher --foreground'
3060
+ end
3061
+ ### GIT
3062
+ git :add => '-A' if prefer :git, true
3063
+ git :commit => '-qm "rails_apps_composer: set up mailcatcher for development"' if prefer :git, true
3064
+ end
3065
+ if prefs[:mail_view]
3066
+ say_wizard "recipe installing mail_view"
3067
+ create_file 'app/mailers/mail_preview.rb' do <<-RUBY
3068
+ class MailPreview < MailView
3069
+ # Pull data from existing fixtures
3070
+ #def invitation
3071
+ # account = Account.first
3072
+ # inviter, invitee = account.users[0, 2]
3073
+ # Notifier.invitation(inviter, invitee)
3074
+ #end
3075
+
3076
+ # Factory-like pattern
3077
+ #def welcome
3078
+ # user = User.create!
3079
+ # mail = Notifier.welcome(user)
3080
+ # user.destroy
3081
+ # mail
3082
+ #end
3083
+
3084
+ # Stub-like
3085
+ #def forgot_password
3086
+ # user = Struct.new(:email, :name).new('name@example.com', 'Jill Smith')
3087
+ # mail = UserMailer.forgot_password(user)
3088
+ #end
3089
+ end
3090
+ RUBY
3091
+ end
3092
+ inject_into_file 'config/routes.rb', "mount MailPreview => 'mail_view' if Rails.env.development?", :before => "end"
3093
+ ### GIT
3094
+ git :add => '-A' if prefer :git, true
3095
+ git :commit => '-qm "rails_apps_composer: set up mail_view for development"' if prefer :git, true
3096
+ end
3097
+ end
3098
+ # >-------------------------- recipes/email_dev.rb ---------------------------end<
3099
+ # >-------------------------- templates/recipe.erb ---------------------------end<
3100
+
3101
+
3102
+ # >-----------------------------[ Final Gemfile Write ]------------------------------<
3103
+ Gemfile.write
3104
+
3105
+ # >---------------------------------[ Diagnostics ]----------------------------------<
3106
+
3107
+ # remove prefs which are diagnostically irrelevant
3108
+ redacted_prefs = prefs.clone
3109
+ redacted_prefs.delete(:ban_spiders)
3110
+ redacted_prefs.delete(:better_errors)
3111
+ redacted_prefs.delete(:dev_webserver)
3112
+ redacted_prefs.delete(:git)
3113
+ redacted_prefs.delete(:github)
3114
+ redacted_prefs.delete(:jsruntime)
3115
+ redacted_prefs.delete(:local_env_file)
3116
+ redacted_prefs.delete(:main_branch)
3117
+ redacted_prefs.delete(:prelaunch_branch)
3118
+ redacted_prefs.delete(:prod_webserver)
3119
+ redacted_prefs.delete(:quiet_assets)
3120
+ redacted_prefs.delete(:rvmrc)
3121
+ redacted_prefs.delete(:templates)
3122
+
3123
+ if diagnostics_prefs.include? redacted_prefs
3124
+ diagnostics[:prefs] = 'success'
3125
+ else
3126
+ diagnostics[:prefs] = 'fail'
3127
+ end
3128
+
3129
+ @current_recipe = nil
3130
+
3131
+ # >-----------------------------[ Run 'Bundle Install' ]-------------------------------<
3132
+
3133
+ say_wizard "Installing gems. This will take a while."
3134
+ run 'bundle install --without production'
3135
+ say_wizard "Updating gem paths."
3136
+ Gem.clear_paths
3137
+ # >-----------------------------[ Run 'After Bundler' Callbacks ]-------------------------------<
3138
+
3139
+ say_wizard "Running 'after bundler' callbacks."
3140
+ if prefer :templates, 'haml'
3141
+ say_wizard "importing html2haml conversion tool"
3142
+ require 'html2haml'
3143
+ end
3144
+ if prefer :templates, 'slim'
3145
+ say_wizard "importing html2haml and haml2slim conversion tools"
3146
+ require 'html2haml'
3147
+ require 'haml2slim'
3148
+ end
3149
+ @after_blocks.each{|b| config = @configs[b[0]] || {}; @current_recipe = b[0]; puts @current_recipe; b[1].call}
3150
+
3151
+ # >-----------------------------[ Run 'After Everything' Callbacks ]-------------------------------<
3152
+
3153
+ @current_recipe = nil
3154
+ say_wizard "Running 'after everything' callbacks."
3155
+ @after_everything_blocks.each{|b| config = @configs[b[0]] || {}; @current_recipe = b[0]; puts @current_recipe; b[1].call}
3156
+
3157
+ @current_recipe = nil
3158
+ say_wizard("Creating God Scripts")
3159
+ exec "touch lib/scripts/server.god"
3160
+ exec "cat <<EOF>> lib/scripts/server.god
3161
+ God.watch do |w|
3162
+ w.name = \"server\"
3163
+ w.start = \"foreman start\"
3164
+ w.keepalive
3165
+ end
3166
+ EOF"
3167
+ say_wizard("Your new application will contain diagnostics in its README file.")
3168
+ say_wizard("When reporting an issue on GitHub, include the README diagnostics.")
3169
+ say_wizard "Finished running the rails_apps_composer app template."
3170
+ say_wizard "Your new Rails app is ready. Time to run 'bundle install'."
3171
+ end