zsh_dots 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. data/.gitignore +25 -0
  2. data/.gitmodules +3 -0
  3. data/.rvmrc +47 -0
  4. data/Gemfile +7 -0
  5. data/Gemfile.lock +38 -0
  6. data/README.md +115 -0
  7. data/Rakefile +9 -0
  8. data/bin/dots +7 -0
  9. data/bin/elocal_nightly.sh +12 -0
  10. data/bin/gbrt +42 -0
  11. data/bin/git_cwd_info +40 -0
  12. data/bin/lein +229 -0
  13. data/bin/reattach-to-user-namespace +0 -0
  14. data/bin/ssh-copy-id +54 -0
  15. data/bin/stock +83 -0
  16. data/config/.dot_file +1 -0
  17. data/config/aws +0 -0
  18. data/config/example.aws.zsh +13 -0
  19. data/config/gemrc +9 -0
  20. data/config/gitconfig +46 -0
  21. data/config/railsrc +2 -0
  22. data/config/rspec +2 -0
  23. data/config/rvmrc +1 -0
  24. data/config/screenrc +1 -0
  25. data/config/tmux.conf +6 -0
  26. data/config/zlogin +1 -0
  27. data/config/zshenv +59 -0
  28. data/config/zshrc +8 -0
  29. data/etc/mandlebrot.c +59 -0
  30. data/etc/rails/composer.yml +30 -0
  31. data/etc/rails/ember_template.rb +60 -0
  32. data/etc/rails/recipes/haml_views.rb +20 -0
  33. data/etc/rails/recipes/html5.rb +84 -0
  34. data/etc/rails/recipes/readme_markdown.rb +87 -0
  35. data/etc/rails/template.rb +1419 -0
  36. data/lib/dots/aliases.zsh +40 -0
  37. data/lib/dots/directories.zsh +28 -0
  38. data/lib/dots/functions.zsh +41 -0
  39. data/lib/dots/plugins.zsh +18 -0
  40. data/lib/dots.sh +11 -0
  41. data/lib/plugins/aws/aws.plugin.zsh +20 -0
  42. data/lib/plugins/bundler/_bundler +82 -0
  43. data/lib/plugins/bundler/bundler.plugin.zsh +7 -0
  44. data/lib/plugins/git/git.plugin.zsh +126 -0
  45. data/lib/plugins/git-flow/git-flow.plugin.zsh +340 -0
  46. data/lib/plugins/knife/_knife +183 -0
  47. data/lib/plugins/knife/knife.plugin.zsh +1 -0
  48. data/lib/plugins/macvim/macvim.plugin.zsh +13 -0
  49. data/lib/plugins/osx/_man-preview +5 -0
  50. data/lib/plugins/osx/osx.plugin.zsh +101 -0
  51. data/lib/plugins/rails3/rails3.plugin.zsh +75 -0
  52. data/lib/plugins/rake/rake.plugin.zsh +6 -0
  53. data/lib/plugins/ruby/ruby.plugin.zsh +58 -0
  54. data/lib/ruby/dots/command.rb +58 -0
  55. data/lib/ruby/dots/dot_file.rb +73 -0
  56. data/lib/ruby/dots/version.rb +3 -0
  57. data/lib/ruby/dots.rb +9 -0
  58. data/lib/tasks/db.rake +55 -0
  59. data/lib/tasks/dots.rake +32 -0
  60. data/spec/integration/command_spec.rb +34 -0
  61. data/spec/models/dot_file_spec.rb +45 -0
  62. data/spec/spec_helper.rb +6 -0
  63. data/vendor/antigen.zsh +251 -0
  64. data/vendor/oh-my-zsh/check_for_upgrade.sh +45 -0
  65. data/vendor/oh-my-zsh/install.sh +43 -0
  66. data/vendor/oh-my-zsh/require_tool.sh +161 -0
  67. data/vendor/oh-my-zsh/uninstall.sh +20 -0
  68. data/vendor/oh-my-zsh/upgrade.sh +6 -0
  69. data/zsh_dots.gemspec +28 -0
  70. metadata +163 -0
@@ -0,0 +1,1419 @@
1
+ # >---------------------------------------------------------------------------<
2
+ #
3
+ # _____ _ _
4
+ # | __ \ (_) | /\
5
+ # | |__) |__ _ _| |___ / \ _ __ _ __ ___
6
+ # | _ // _` | | / __| / /\ \ | '_ \| '_ \/ __|
7
+ # | | \ \ (_| | | \__ \/ ____ \| |_) | |_) \__ \
8
+ # |_| \_\__,_|_|_|___/_/ \_\ .__/| .__/|___/
9
+ # | | | |
10
+ # |_| |_|
11
+ #
12
+ # Template generated by rails_apps_composer. For more information, see:
13
+ # https://github.com/RailsApps/rails_apps_composer/
14
+ # Thank you to Michael Bleigh for leading the way with the RailsWizard gem.
15
+ #
16
+ # >---------------------------------------------------------------------------<
17
+
18
+ # >----------------------------[ Initial Setup ]------------------------------<
19
+
20
+ initializer 'generators.rb', <<-RUBY
21
+ Rails.application.config.generators do |g|
22
+ end
23
+ RUBY
24
+
25
+ @recipes = ["git", "setup", "readme_markdown", "gems", "testing", "auth", "models", "controllers", "views", "haml_views", "routes", "frontend", "html5", "extras"]
26
+ @prefs = {:dev_webserver=>"thin", :prod_webserver=>"unicorn", :database=>"postgresql", :templates=>"haml", :unit_test=>"minitest", :integration=>"capybara", :fixtures=>"factory_girl", :frontend=>"bootstrap", :bootstrap=>"sass", :form_builder=>"simpleform", :email=>"gmail", :authentication=>"devise", :devise_modules=>"default", :authorization=>"none"}
27
+ @gems = []
28
+ @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"], ["auth", "controllers", "email", "extras", "frontend", "gems", "git", "init", "models", "railsapps", "readme", "routes", "setup", "testing", "views"], ["all", "auth", "controllers", "email", "extras", "frontend", "gems", "git", "init", "models", "railsapps", "readme", "routes", "setup", "testing", "views"], ["auth", "controllers", "email", "example", "extras", "frontend", "gems", "git", "init", "models", "railsapps", "readme", "routes", "setup", "testing", "views"], ["auth", "controllers", "email", "example", "extras", "frontend", "gems", "git", "init", "models", "prelaunch", "railsapps", "readme", "routes", "setup", "testing", "views"], ["all", "auth", "controllers", "email", "example", "extras", "frontend", "gems", "git", "init", "models", "prelaunch", "railsapps", "readme", "routes", "setup", "testing", "views"]]
29
+ @diagnostics_prefs = [{:railsapps=>"rails3-bootstrap-devise-cancan", :database=>"sqlite", :templates=>"erb", :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=>"none"}, {:railsapps=>"rails3-devise-rspec-cucumber", :database=>"sqlite", :templates=>"erb", :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", :templates=>"erb", :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", :templates=>"erb", :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", :templates=>"haml", :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"}]
30
+ diagnostics = {}
31
+
32
+ def recipes; @recipes end
33
+ def recipe?(name); @recipes.include?(name) end
34
+ def prefs; @prefs end
35
+ def prefer(key, value); @prefs[key].eql? value end
36
+ def gems; @gems end
37
+ def diagnostics_recipes; @diagnostics_recipes end
38
+ def diagnostics_prefs; @diagnostics_prefs end
39
+
40
+ def say_custom(tag, text); say "\033[1m\033[36m" + tag.to_s.rjust(10) + "\033[0m" + " #{text}" end
41
+ def say_recipe(name); say "\033[1m\033[36m" + "recipe".rjust(10) + "\033[0m" + " Running #{name} recipe..." end
42
+ def say_wizard(text); say_custom(@current_recipe || 'composer', text) end
43
+
44
+ def ask_wizard(question)
45
+ ask "\033[1m\033[30m\033[46m" + (@current_recipe || "prompt").rjust(10) + "\033[1m\033[36m" + " #{question}\033[0m"
46
+ end
47
+
48
+ def yes_wizard?(question)
49
+ answer = ask_wizard(question + " \033[33m(y/n)\033[0m")
50
+ case answer.downcase
51
+ when "yes", "y"
52
+ true
53
+ when "no", "n"
54
+ false
55
+ else
56
+ yes_wizard?(question)
57
+ end
58
+ end
59
+
60
+ def no_wizard?(question); !yes_wizard?(question) end
61
+
62
+ def multiple_choice(question, choices)
63
+ say_custom('question', question)
64
+ values = {}
65
+ choices.each_with_index do |choice,i|
66
+ values[(i + 1).to_s] = choice[1]
67
+ say_custom (i + 1).to_s + ')', choice[0]
68
+ end
69
+ answer = ask_wizard("Enter your selection:") while !values.keys.include?(answer)
70
+ values[answer]
71
+ end
72
+
73
+ @current_recipe = nil
74
+ @configs = {}
75
+
76
+ @after_blocks = []
77
+ def after_bundler(&block); @after_blocks << [@current_recipe, block]; end
78
+ @after_everything_blocks = []
79
+ def after_everything(&block); @after_everything_blocks << [@current_recipe, block]; end
80
+ @before_configs = {}
81
+ def before_config(&block); @before_configs[@current_recipe] = block; end
82
+
83
+ def copy_from(source, destination)
84
+ begin
85
+ remove_file destination
86
+ get source, destination
87
+ rescue OpenURI::HTTPError
88
+ say_wizard "Unable to obtain #{source}"
89
+ end
90
+ end
91
+
92
+ def copy_from_repo(filename, opts = {})
93
+ repo = 'https://raw.github.com/RailsApps/rails-composer/master/files/'
94
+ repo = opts[:repo] unless opts[:repo].nil?
95
+ if (!opts[:prefs].nil?) && (!prefs.has_value? opts[:prefs])
96
+ return
97
+ end
98
+ source_filename = filename
99
+ destination_filename = filename
100
+ unless opts[:prefs].nil?
101
+ if filename.include? opts[:prefs]
102
+ destination_filename = filename.gsub(/\-#{opts[:prefs]}/, '')
103
+ end
104
+ end
105
+ if (prefer :templates, 'haml') && (filename.include? 'views')
106
+ remove_file destination_filename
107
+ destination_filename = destination_filename.gsub(/.erb/, '.haml')
108
+ end
109
+ if (prefer :templates, 'slim') && (filename.include? 'views')
110
+ remove_file destination_filename
111
+ destination_filename = destination_filename.gsub(/.erb/, '.slim')
112
+ end
113
+ begin
114
+ remove_file destination_filename
115
+ if (prefer :templates, 'haml') && (filename.include? 'views')
116
+ create_file destination_filename, html_to_haml(repo + source_filename)
117
+ elsif (prefer :templates, 'slim') && (filename.include? 'views')
118
+ create_file destination_filename, html_to_slim(repo + source_filename)
119
+ else
120
+ get repo + source_filename, destination_filename
121
+ end
122
+ rescue OpenURI::HTTPError
123
+ say_wizard "Unable to obtain #{source_filename} from the repo #{repo}"
124
+ end
125
+ end
126
+
127
+ def html_to_haml(source)
128
+ html = open(source) {|input| input.binmode.read }
129
+ Haml::HTML.new(html, :erb => true, :xhtml => true).render
130
+ end
131
+
132
+ def html_to_slim(source)
133
+ html = open(source) {|input| input.binmode.read }
134
+ haml = Haml::HTML.new(html, :erb => true, :xhtml => true).render
135
+ Haml2Slim.convert!(haml)
136
+ end
137
+
138
+
139
+ if diagnostics_recipes.sort.include? recipes.sort
140
+ diagnostics[:recipes] = 'success'
141
+ say_wizard("WOOT! The recipes you've selected are known to work together.")
142
+ else
143
+ diagnostics[:recipes] = 'fail'
144
+ say_wizard("\033[1m\033[36m" + "WARNING! The recipes you've selected might not work together." + "\033[0m")
145
+ say_wizard("Help us out by reporting whether this combination works or fails.")
146
+ say_wizard("Please open an issue for rails_apps_composer on GitHub.")
147
+ say_wizard("Your new application will contain diagnostics in its README file.")
148
+ say_wizard("Continuing...")
149
+ end
150
+
151
+ # this application template only supports Rails version 3.1 and newer
152
+ case Rails::VERSION::MAJOR.to_s
153
+ when "3"
154
+ case Rails::VERSION::MINOR.to_s
155
+ when "0"
156
+ say_wizard "You are using Rails version #{Rails::VERSION::STRING} which is not supported. Try 3.1 or newer."
157
+ raise StandardError.new "Rails #{Rails::VERSION::STRING} is not supported. Try 3.1 or newer."
158
+ end
159
+ else
160
+ say_wizard "You are using Rails version #{Rails::VERSION::STRING} which is not supported. Try 3.1 or newer."
161
+ raise StandardError.new "Rails #{Rails::VERSION::STRING} is not supported. Try 3.1 or newer."
162
+ end
163
+
164
+ say_wizard "Using rails_apps_composer recipes to generate an application."
165
+
166
+ # >---------------------------[ Autoload Modules/Classes ]-----------------------------<
167
+
168
+ inject_into_file 'config/application.rb', :after => 'config.autoload_paths += %W(#{config.root}/extras)' do <<-'RUBY'
169
+
170
+ config.autoload_paths += %W(#{config.root}/lib)
171
+ RUBY
172
+ end
173
+
174
+ # >---------------------------------[ Recipes ]----------------------------------<
175
+
176
+
177
+ # >----------------------------------[ git ]----------------------------------<
178
+
179
+ @current_recipe = "git"
180
+ @before_configs["git"].call if @before_configs["git"]
181
+ say_recipe 'git'
182
+
183
+
184
+ @configs[@current_recipe] = config
185
+
186
+ # Application template recipe for the rails_apps_composer. Change the recipe here:
187
+ # https://github.com/RailsApps/rails_apps_composer/blob/master/recipes/git.rb
188
+
189
+ ## Git
190
+ say_wizard "initialize git"
191
+ prefs[:git] = true unless prefs.has_key? :git
192
+ if prefer :git, true
193
+ copy_from 'https://raw.github.com/RailsApps/rails-composer/master/files/gitignore.txt', '.gitignore'
194
+ git :init
195
+ git :add => '.'
196
+ git :commit => "-aqm 'rails_apps_composer: initial commit'"
197
+ end
198
+
199
+
200
+ # >---------------------------------[ setup ]---------------------------------<
201
+
202
+ @current_recipe = "setup"
203
+ @before_configs["setup"].call if @before_configs["setup"]
204
+ say_recipe 'setup'
205
+
206
+
207
+ @configs[@current_recipe] = config
208
+
209
+ # Application template recipe for the rails_apps_composer. Change the recipe here:
210
+ # https://github.com/RailsApps/rails_apps_composer/blob/master/recipes/setup.rb
211
+
212
+ ## Ruby on Rails
213
+ say_wizard "You are using Ruby version #{RUBY_VERSION}."
214
+ say_wizard "You are using Rails version #{Rails::VERSION::STRING}."
215
+
216
+ ## Is sqlite3 in the Gemfile?
217
+ gemfile = File.read(destination_root() + '/Gemfile')
218
+ sqlite_detected = gemfile.include? 'sqlite3'
219
+
220
+ ## Web Server
221
+ prefs[:dev_webserver] = multiple_choice "Web server for development?", [["WEBrick (default)", "webrick"],
222
+ ["Thin", "thin"], ["Unicorn", "unicorn"], ["Puma", "puma"]] unless prefs.has_key? :dev_webserver
223
+ webserver = multiple_choice "Web server for production?", [["Same as development", "same"],
224
+ ["Thin", "thin"], ["Unicorn", "unicorn"], ["Puma", "puma"]] unless prefs.has_key? :prod_webserver
225
+ if webserver == 'same'
226
+ case prefs[:dev_webserver]
227
+ when 'thin'
228
+ prefs[:prod_webserver] = 'thin'
229
+ when 'unicorn'
230
+ prefs[:prod_webserver] = 'unicorn'
231
+ when 'puma'
232
+ prefs[:prod_webserver] = 'puma'
233
+ end
234
+ else
235
+ prefs[:prod_webserver] = webserver
236
+ end
237
+
238
+ ## Database Adapter
239
+ prefs[:database] = multiple_choice "Database used in development?", [["SQLite", "sqlite"], ["PostgreSQL", "postgresql"],
240
+ ["MySQL", "mysql"], ["MongoDB", "mongodb"]] unless prefs.has_key? :database
241
+ case prefs[:database]
242
+ when 'mongodb'
243
+ unless sqlite_detected
244
+ prefs[:orm] = multiple_choice "How will you connect to MongoDB?", [["Mongoid","mongoid"]] unless prefs.has_key? :orm
245
+ else
246
+ say_wizard "WARNING! SQLite gem detected in the Gemfile"
247
+ say_wizard "If you wish to use MongoDB you must skip Active Record."
248
+ say_wizard "When launching rails_apps_composer, choose 'skip Active Record'."
249
+ say_wizard "If using an application template, use the '-O' flag as in 'rails new foo -O'."
250
+ prefs[:fail] = multiple_choice "Abort or continue?", [["abort", "abort"], ["continue", "continue"]]
251
+ if prefer :fail, 'abort'
252
+ 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"
253
+ end
254
+ end
255
+ end
256
+
257
+ ## Template Engine
258
+ prefs[:templates] = multiple_choice "Template engine?", [["ERB", "erb"], ["Haml", "haml"], ["Slim", "slim"]] unless prefs.has_key? :templates
259
+
260
+ ## Testing Framework
261
+ if recipes.include? 'testing'
262
+ prefs[:unit_test] = multiple_choice "Unit testing?", [["Test::Unit", "test_unit"], ["RSpec", "rspec"]] unless prefs.has_key? :unit_test
263
+ prefs[:integration] = multiple_choice "Integration testing?", [["RSpec with Capybara", "capybara"],
264
+ ["Cucumber with Capybara", "cucumber"], ["Turnip with Capybara", "turnip"]] unless prefs.has_key? :integration
265
+ prefs[:fixtures] = multiple_choice "Fixture replacement?", [["None","none"], ["Factory Girl","factory_girl"], ["Machinist","machinist"]] unless prefs.has_key? :fixtures
266
+ end
267
+
268
+ ## Front-end Framework
269
+ if recipes.include? 'frontend'
270
+ prefs[:frontend] = multiple_choice "Front-end framework?", [["None", "none"], ["Twitter Bootstrap", "bootstrap"],
271
+ ["Zurb Foundation", "foundation"], ["Skeleton", "skeleton"], ["Just normalize CSS for consistent styling", "normalize"]] unless prefs.has_key? :frontend
272
+ if prefer :frontend, 'bootstrap'
273
+ prefs[:bootstrap] = multiple_choice "Twitter Bootstrap version?", [["Twitter Bootstrap (Less)", "less"],
274
+ ["Twitter Bootstrap (Sass)", "sass"]] unless prefs.has_key? :bootstrap
275
+ end
276
+ end
277
+
278
+ ## Email
279
+ if recipes.include? 'email'
280
+ prefs[:email] = multiple_choice "Add support for sending email?", [["None", "none"], ["Gmail","gmail"], ["SMTP","smtp"],
281
+ ["SendGrid","sendgrid"], ["Mandrill","mandrill"]] unless prefs.has_key? :email
282
+ else
283
+ prefs[:email] = 'none'
284
+ end
285
+
286
+ ## Authentication and Authorization
287
+ if recipes.include? 'auth'
288
+ prefs[:authentication] = multiple_choice "Authentication?", [["None", "none"], ["Devise", "devise"], ["OmniAuth", "omniauth"]] unless prefs.has_key? :authentication
289
+ case prefs[:authentication]
290
+ when 'devise'
291
+ if prefer :orm, 'mongoid'
292
+ prefs[:devise_modules] = multiple_choice "Devise modules?", [["Devise with default modules","default"]] unless prefs.has_key? :devise_modules
293
+ else
294
+ prefs[:devise_modules] = multiple_choice "Devise modules?", [["Devise with default modules","default"], ["Devise with Confirmable module","confirmable"],
295
+ ["Devise with Confirmable and Invitable modules","invitable"]] unless prefs.has_key? :devise_modules
296
+ end
297
+ when 'omniauth'
298
+ prefs[:omniauth_provider] = multiple_choice "OmniAuth provider?", [["Facebook", "facebook"], ["Twitter", "twitter"], ["GitHub", "github"],
299
+ ["LinkedIn", "linkedin"], ["Google-Oauth-2", "google-oauth2"], ["Tumblr", "tumblr"]] unless prefs.has_key? :omniauth_provider
300
+ end
301
+ prefs[:authorization] = multiple_choice "Authorization?", [["None", "none"], ["CanCan with Rolify", "cancan"]] unless prefs.has_key? :authorization
302
+ end
303
+
304
+ ## MVC
305
+ if (recipes.include? 'models') && (recipes.include? 'controllers') && (recipes.include? 'views') && (recipes.include? 'routes')
306
+ if prefer :authorization, 'cancan'
307
+ prefs[:starter_app] = multiple_choice "Install a starter app?", [["None", "none"], ["Home Page", "home_app"],
308
+ ["Home Page, User Accounts", "users_app"], ["Home Page, User Accounts, Admin Dashboard", "admin_app"]] unless prefs.has_key? :starter_app
309
+ elsif prefer :authentication, 'devise'
310
+ if prefer :orm, 'mongoid'
311
+ prefs[:starter_app] = multiple_choice "Install a starter app?", [["None", "none"], ["Home Page", "home_app"],
312
+ ["Home Page, User Accounts", "users_app"], ["Home Page, User Accounts, Subdomains", "subdomains_app"]] unless prefs.has_key? :starter_app
313
+ else
314
+ prefs[:starter_app] = multiple_choice "Install a starter app?", [["None", "none"], ["Home Page", "home_app"],
315
+ ["Home Page, User Accounts", "users_app"]] unless prefs.has_key? :starter_app
316
+ end
317
+ elsif prefer :authentication, 'omniauth'
318
+ prefs[:starter_app] = multiple_choice "Install a starter app?", [["None", "none"], ["Home Page", "home_app"],
319
+ ["Home Page, User Accounts", "users_app"]] unless prefs.has_key? :starter_app
320
+ else
321
+ prefs[:starter_app] = multiple_choice "Install a starter app?", [["None", "none"], ["Home Page", "home_app"]] unless prefs.has_key? :starter_app
322
+ end
323
+ if (recipes.include? 'prelaunch') && (prefer :authentication, 'devise') && (prefer :authorization, 'cancan')
324
+ prefs[:prelaunch_app] = multiple_choice "Install a prelaunch app?", [["None", "none"], ["Prelaunch Signup App", "signup_app"]]
325
+ if prefs[:prelaunch_app] == 'signup_app'
326
+ prefs[:devise_modules] = 'confirmable'
327
+ prefs[:bulkmail] = multiple_choice "Send news and announcements with a mail service?", [["None", "none"], ["MailChimp","mailchimp"]]
328
+ if prefer :git, true
329
+ prefs[:prelaunch_branch] = multiple_choice "Git branch for the prelaunch app?", [["wip (work-in-progress)", "wip"], ["master", "master"], ["prelaunch", "prelaunch"], ["staging", "staging"]]
330
+ if prefs[:prelaunch_branch] == 'master'
331
+ prefs[:main_branch] = multiple_choice "Git branch for the main app?", [["None (delete)", "none"], ["wip (work-in-progress)", "wip"], ["edge", "edge"]]
332
+ end
333
+ end
334
+ end
335
+ end
336
+ end
337
+
338
+
339
+ # >----------------------------[ readme_markdown ]----------------------------<
340
+
341
+ @current_recipe = "readme_markdown"
342
+ @before_configs["readme_markdown"].call if @before_configs["readme_markdown"]
343
+ say_recipe 'readme_markdown'
344
+
345
+
346
+ @configs[@current_recipe] = config
347
+
348
+ # Application template recipe for the rails_apps_composer. Change the recipe here:
349
+ # https://github.com/RailsApps/rails_apps_composer/blob/master/recipes/readme.rb
350
+
351
+ after_everything do
352
+ say_wizard "recipe running after everything"
353
+
354
+ # remove default READMEs
355
+ %w{
356
+ README
357
+ README.rdoc
358
+ doc/README_FOR_APP
359
+ }.each { |file| remove_file file }
360
+
361
+ # add placeholder READMEs and humans.txt file
362
+ copy_from_repo 'public/humans.txt'
363
+ copy_from_repo 'README'
364
+ copy_from_repo 'README.md'
365
+ gsub_file "README", /App_Name/, "#{app_name.humanize.titleize}"
366
+ gsub_file "README.md", /App_Name/, "#{app_name.humanize.titleize}"
367
+
368
+ # Diagnostics
369
+ gsub_file "README.md", /recipes that are known/, "recipes that are NOT known" if diagnostics[:recipes] == 'fail'
370
+ gsub_file "README.md", /preferences that are known/, "preferences that are NOT known" if diagnostics[:prefs] == 'fail'
371
+ gsub_file "README.md", /RECIPES/, recipes.sort.inspect
372
+ gsub_file "README.md", /PREFERENCES/, prefs.inspect
373
+ gsub_file "README", /RECIPES/, recipes.sort.inspect
374
+ gsub_file "README", /PREFERENCES/, prefs.inspect
375
+
376
+ # Ruby on Rails
377
+ gsub_file "README.md", /\* Ruby/, "* Ruby version #{RUBY_VERSION}"
378
+ gsub_file "README.md", /\* Rails/, "* Rails version #{Rails::VERSION::STRING}"
379
+
380
+ # Database
381
+ gsub_file "README.md", /SQLite/, "PostgreSQL" if prefer :database, 'postgresql'
382
+ gsub_file "README.md", /SQLite/, "MySQL" if prefer :database, 'mysql'
383
+ gsub_file "README.md", /SQLite/, "MongoDB" if prefer :database, 'mongodb'
384
+ gsub_file "README.md", /ActiveRecord/, "the Mongoid ORM" if prefer :orm, 'mongoid'
385
+
386
+ # Template Engine
387
+ gsub_file "README.md", /ERB/, "Haml" if prefer :templates, 'haml'
388
+ gsub_file "README.md", /ERB/, "Slim" if prefer :templates, 'slim'
389
+
390
+ # Testing Framework
391
+ gsub_file "README.md", /Test::Unit/, "RSpec" if prefer :unit_test, 'rspec'
392
+ gsub_file "README.md", /RSpec/, "RSpec and Cucumber" if prefer :integration, 'cucumber'
393
+ gsub_file "README.md", /RSpec/, "RSpec and Factory Girl" if prefer :fixtures, 'factory_girl'
394
+ gsub_file "README.md", /RSpec/, "RSpec and Machinist" if prefer :fixtures, 'machinist'
395
+
396
+ # Front-end Framework
397
+ gsub_file "README.md", /Front-end Framework: None/, "Front-end Framework: Twitter Bootstrap (Sass)" if prefer :bootstrap, 'sass'
398
+ gsub_file "README.md", /Front-end Framework: None/, "Front-end Framework: Twitter Bootstrap (Less)" if prefer :bootstrap, 'less'
399
+ gsub_file "README.md", /Front-end Framework: None/, "Front-end Framework: Zurb Foundation" if prefer :frontend, 'foundation'
400
+ gsub_file "README.md", /Front-end Framework: None/, "Front-end Framework: Skeleton" if prefer :frontend, 'skeleton'
401
+ gsub_file "README.md", /Front-end Framework: None/, "Front-end Framework: Normalized CSS" if prefer :frontend, 'normalize'
402
+
403
+ # Form Builder
404
+ gsub_file "README.md", /Form Builder: None/, "Form Builder: SimpleForm" if prefer :form_builder, 'simple_form'
405
+
406
+ # Email
407
+ unless prefer :email, 'none'
408
+ gsub_file "README.md", /Gmail/, "SMTP" if prefer :email, 'smtp'
409
+ gsub_file "README.md", /Gmail/, "SendGrid" if prefer :email, 'sendgrid'
410
+ gsub_file "README.md", /Gmail/, "Mandrill" if prefer :email, 'mandrill'
411
+ else
412
+ gsub_file "README.md", /h2. Email/, ""
413
+ gsub_file "README.md", /The application is configured to send email using a Gmail account./, ""
414
+ end
415
+
416
+ # Authentication and Authorization
417
+ gsub_file "README.md", /Authentication: None/, "Authentication: Devise" if prefer :authentication, 'devise'
418
+ gsub_file "README.md", /Authentication: None/, "Authentication: OmniAuth" if prefer :authentication, 'omniauth'
419
+ gsub_file "README.md", /Authorization: None/, "Authorization: CanCan" if prefer :authorization, 'cancan'
420
+
421
+ git :add => '.' if prefer :git, true
422
+ git :commit => "-aqm 'rails_apps_composer: add README files'" if prefer :git, true
423
+
424
+ end # after_everything
425
+
426
+
427
+ # >---------------------------------[ gems ]----------------------------------<
428
+
429
+ @current_recipe = "gems"
430
+ @before_configs["gems"].call if @before_configs["gems"]
431
+ say_recipe 'gems'
432
+
433
+
434
+ @configs[@current_recipe] = config
435
+
436
+ # Application template recipe for the rails_apps_composer. Change the recipe here:
437
+ # https://github.com/RailsApps/rails_apps_composer/blob/master/recipes/gems.rb
438
+
439
+ ### GEMFILE ###
440
+
441
+ ## Ruby on Rails
442
+ insert_into_file 'Gemfile', "ruby '1.9.3'\n", :before => "gem 'rails', '3.2.6'" if prefer :deploy, 'heroku'
443
+
444
+ ## Web Server
445
+ gem 'thin', '>= 1.4.1', :group => [:development, :test] if prefer :dev_webserver, 'thin'
446
+ gem 'unicorn', '>= 4.3.1', :group => [:development, :test] if prefer :dev_webserver, 'unicorn'
447
+ gem 'puma', '>= 1.5.0', :group => [:development, :test] if prefer :dev_webserver, 'puma'
448
+ gem 'thin', '>= 1.4.1', :group => :production if prefer :prod_webserver, 'thin'
449
+ gem 'unicorn', '>= 4.3.1', :group => :production if prefer :prod_webserver, 'unicorn'
450
+ gem 'puma', '>= 1.6.1', :group => :production if prefer :prod_webserver, 'puma'
451
+
452
+ ## Database Adapter
453
+ gsub_file 'Gemfile', /gem 'sqlite3'\n/, '' unless prefer :database, 'sqlite'
454
+ gem 'mongoid', '>= 3.0.3' if prefer :orm, 'mongoid'
455
+ gem 'pg', '>= 0.14.0' if prefer :database, 'postgresql'
456
+ gem 'mysql2', '>= 0.3.11' if prefer :database, 'mysql'
457
+ copy_from_repo 'config/database-postgresql.yml', :prefs => 'postgresql'
458
+ copy_from_repo 'config/database-mysql.yml', :prefs => 'mysql'
459
+
460
+ ## Template Engine
461
+ if prefer :templates, 'haml'
462
+ gem 'haml', '>= 3.1.7'
463
+ gem 'haml-rails', '>= 0.3.4', :group => :development
464
+ # hpricot and ruby_parser are needed for conversion of HTML to Haml
465
+ gem 'hpricot', '>= 0.8.6', :group => :development
466
+ gem 'ruby_parser', '>= 2.3.1', :group => :development
467
+ end
468
+ if prefer :templates, 'slim'
469
+ gem 'slim', '>= 1.2.2'
470
+ gem 'haml2slim', '>= 0.4.6', :group => :development
471
+ # Haml is needed for conversion of HTML to Slim
472
+ gem 'haml', '>= 3.1.6', :group => :development
473
+ gem 'haml-rails', '>= 0.3.4', :group => :development
474
+ gem 'hpricot', '>= 0.8.6', :group => :development
475
+ gem 'ruby_parser', '>= 2.3.1', :group => :development
476
+ end
477
+
478
+ ## Testing Framework
479
+ if prefer :unit_test, 'rspec'
480
+ gem 'rspec-rails', '>= 2.11.0', :group => [:development, :test]
481
+ gem 'capybara', '>= 1.1.2', :group => :test
482
+ if prefer :orm, 'mongoid'
483
+ # use the database_cleaner gem to reset the test database
484
+ gem 'database_cleaner', '>= 0.8.0', :group => :test
485
+ # include RSpec matchers from the mongoid-rspec gem
486
+ gem 'mongoid-rspec', '>= 1.4.6', :group => :test
487
+ end
488
+ gem 'email_spec', '>= 1.2.1', :group => :test unless prefer :email, 'none'
489
+ end
490
+ if prefer :integration, 'cucumber'
491
+ gem 'cucumber-rails', '>= 1.3.0', :group => :test, :require => false
492
+ gem 'database_cleaner', '>= 0.8.0', :group => :test unless prefer :orm, 'mongoid'
493
+ gem 'launchy', '>= 2.1.2', :group => :test
494
+ end
495
+ gem 'turnip', '>= 1.0.0', :group => :test if prefer :integration, 'turnip'
496
+ gem 'factory_girl_rails', '>= 4.0.0', :group => [:development, :test] if prefer :fixtures, 'factory_girl'
497
+ gem 'machinist', '>= 2.0', :group => :test if prefer :fixtures, 'machinist'
498
+
499
+ ## Front-end Framework
500
+ gem 'bootstrap-sass', '>= 2.0.4.0' if prefer :bootstrap, 'sass'
501
+ gem 'zurb-foundation', '>= 3.0.8' if prefer :frontend, 'foundation'
502
+ if prefer :bootstrap, 'less'
503
+ gem 'twitter-bootstrap-rails', '>= 2.1.1', :group => :assets
504
+ # install gem 'therubyracer' to use Less
505
+ gem 'therubyracer', '>= 0.10.2', :group => :assets, :platform => :ruby
506
+ end
507
+
508
+ ## Email
509
+ gem 'sendgrid', '>= 1.0.1' if prefer :email, 'sendgrid'
510
+ gem 'hominid', '>= 3.0.5' if prefer :email, 'mandrill'
511
+
512
+ ## Authentication (Devise)
513
+ gem 'devise', '>= 2.1.2' if prefer :authentication, 'devise'
514
+ gem 'devise_invitable', '>= 1.0.3' if prefer :devise_modules, 'invitable'
515
+
516
+ ## Authentication (OmniAuth)
517
+ gem 'omniauth', '>= 1.1.0' if prefer :authentication, 'omniauth'
518
+ gem 'omniauth-twitter' if prefer :omniauth_provider, 'twitter'
519
+ gem 'omniauth-facebook' if prefer :omniauth_provider, 'facebook'
520
+ gem 'omniauth-github' if prefer :omniauth_provider, 'github'
521
+ gem 'omniauth-linkedin' if prefer :omniauth_provider, 'linkedin'
522
+ gem 'omniauth-google-oauth2' if prefer :omniauth_provider, 'google-oauth2'
523
+ gem 'omniauth-tumblr' if prefer :omniauth_provider, 'tumblr'
524
+
525
+ ## Authorization
526
+ if prefer :authorization, 'cancan'
527
+ gem 'cancan', '>= 1.6.8'
528
+ gem 'rolify', '>= 3.2.0'
529
+ end
530
+
531
+ ## Signup App
532
+ if prefer :prelaunch_app, 'signup_app'
533
+ gem 'google_visualr', '>= 2.1.2'
534
+ gem 'jquery-datatables-rails', '>= 1.10.0'
535
+ end
536
+
537
+ ## Gems from a defaults file or added interactively
538
+ gems.each do |g|
539
+ gem g
540
+ end
541
+
542
+ ## Git
543
+ git :add => '.' if prefer :git, true
544
+ git :commit => "-aqm 'rails_apps_composer: Gemfile'" if prefer :git, true
545
+
546
+ ### GENERATORS ###
547
+ after_bundler do
548
+ ## Database
549
+ generate 'mongoid:config' if prefer :orm, 'mongoid'
550
+ remove_file 'config/database.yml' if prefer :orm, 'mongoid'
551
+ ## Git
552
+ git :add => '.' if prefer :git, true
553
+ git :commit => "-aqm 'rails_apps_composer: generators'" if prefer :git, true
554
+ end # after_bundler
555
+
556
+
557
+ # >--------------------------------[ testing ]--------------------------------<
558
+
559
+ @current_recipe = "testing"
560
+ @before_configs["testing"].call if @before_configs["testing"]
561
+ say_recipe 'testing'
562
+
563
+
564
+ @configs[@current_recipe] = config
565
+
566
+ # Application template recipe for the rails_apps_composer. Change the recipe here:
567
+ # https://github.com/RailsApps/rails_apps_composer/blob/master/recipes/testing.rb
568
+
569
+ after_bundler do
570
+ say_wizard "recipe running after 'bundle install'"
571
+ ### RSPEC ###
572
+ if prefer :unit_test, 'rspec'
573
+ say_wizard "recipe installing RSpec"
574
+ generate 'rspec:install'
575
+ unless prefer :email, 'none'
576
+ generate 'email_spec:steps'
577
+ inject_into_file 'spec/spec_helper.rb', "require 'email_spec'\n", :after => "require 'rspec/rails'\n"
578
+ inject_into_file 'spec/spec_helper.rb', :after => "RSpec.configure do |config|\n" do <<-RUBY
579
+ config.include(EmailSpec::Helpers)
580
+ config.include(EmailSpec::Matchers)
581
+ RUBY
582
+ end
583
+ end
584
+ run 'rm -rf test/' # Removing test folder (not needed for RSpec)
585
+ inject_into_file 'config/application.rb', :after => "Rails::Application\n" do <<-RUBY
586
+
587
+ # don't generate RSpec tests for views and helpers
588
+ config.generators do |g|
589
+ g.view_specs false
590
+ g.helper_specs false
591
+ #{"g.fixture_replacement :machinist" if prefer :fixtures, 'machinist'}
592
+ end
593
+
594
+ RUBY
595
+ end
596
+ ## RSPEC AND MONGOID
597
+ if prefer :orm, 'mongoid'
598
+ # remove ActiveRecord artifacts
599
+ gsub_file 'spec/spec_helper.rb', /config.fixture_path/, '# config.fixture_path'
600
+ gsub_file 'spec/spec_helper.rb', /config.use_transactional_fixtures/, '# config.use_transactional_fixtures'
601
+ # reset your application database to a pristine state during testing
602
+ inject_into_file 'spec/spec_helper.rb', :before => "\nend" do
603
+ <<-RUBY
604
+ \n
605
+ require 'database_cleaner'
606
+ config.before(:suite) do
607
+ DatabaseCleaner.strategy = :truncation
608
+ DatabaseCleaner.orm = "mongoid"
609
+ end
610
+
611
+ config.before(:each) do
612
+ DatabaseCleaner.clean
613
+ end
614
+ RUBY
615
+ end
616
+ # remove either possible occurrence of "require rails/test_unit/railtie"
617
+ gsub_file 'config/application.rb', /require 'rails\/test_unit\/railtie'/, '# require "rails/test_unit/railtie"'
618
+ gsub_file 'config/application.rb', /require "rails\/test_unit\/railtie"/, '# require "rails/test_unit/railtie"'
619
+ # configure RSpec to use matchers from the mongoid-rspec gem
620
+ create_file 'spec/support/mongoid.rb' do
621
+ <<-RUBY
622
+ RSpec.configure do |config|
623
+ config.include Mongoid::Matchers
624
+ end
625
+ RUBY
626
+ end
627
+ end
628
+ ## RSPEC AND DEVISE
629
+ if prefer :authentication, 'devise'
630
+ # add Devise test helpers
631
+ create_file 'spec/support/devise.rb' do
632
+ <<-RUBY
633
+ RSpec.configure do |config|
634
+ config.include Devise::TestHelpers, :type => :controller
635
+ end
636
+ RUBY
637
+ end
638
+ end
639
+ end
640
+ ### CUCUMBER ###
641
+ if prefer :integration, 'cucumber'
642
+ say_wizard "recipe installing Cucumber"
643
+ generate "cucumber:install --capybara#{' --rspec' if prefer :unit_test, 'rspec'}#{' -D' if prefer :orm, 'mongoid'}"
644
+ # make it easy to run Cucumber for single features without adding "--require features" to the command line
645
+ gsub_file 'config/cucumber.yml', /std_opts = "/, 'std_opts = "-r features/support/ -r features/step_definitions '
646
+ unless prefer :email, 'none'
647
+ create_file 'features/support/email_spec.rb' do <<-RUBY
648
+ require 'email_spec/cucumber'
649
+ RUBY
650
+ end
651
+ end
652
+ ## CUCUMBER AND MONGOID
653
+ if prefer :orm, 'mongoid'
654
+ gsub_file 'features/support/env.rb', /transaction/, "truncation"
655
+ inject_into_file 'features/support/env.rb', :after => 'begin' do
656
+ "\n DatabaseCleaner.orm = 'mongoid'"
657
+ end
658
+ end
659
+ end
660
+ ## TURNIP
661
+ if prefer :integration, 'turnip'
662
+ append_to_file '.rspec', '-r turnip/rspec'
663
+ inject_into_file 'spec/spec_helper.rb', "require 'turnip/capybara'\n", :after => "require 'rspec/rails'\n"
664
+ create_file 'spec/acceptance/steps/.gitkeep'
665
+ end
666
+ ## FIXTURE REPLACEMENTS
667
+ if prefer :fixtures, 'machinist'
668
+ say_wizard "generating blueprints file for 'machinist'"
669
+ generate 'machinist:install'
670
+ end
671
+ ### GIT ###
672
+ git :add => '.' if prefer :git, true
673
+ git :commit => "-aqm 'rails_apps_composer: testing framework'" if prefer :git, true
674
+ end # after_bundler
675
+
676
+ after_everything do
677
+ say_wizard "recipe running after everything"
678
+ ### RSPEC ###
679
+ if prefer :unit_test, 'rspec'
680
+ if (prefer :authentication, 'devise') && (prefer :starter_app, 'users_app')
681
+ say_wizard "copying RSpec files from the rails3-devise-rspec-cucumber examples"
682
+ repo = 'https://raw.github.com/RailsApps/rails3-devise-rspec-cucumber/master/'
683
+ copy_from_repo 'spec/factories/users.rb', :repo => repo
684
+ gsub_file 'spec/factories/users.rb', /# confirmed_at/, "confirmed_at" if (prefer :devise_modules, 'confirmable') || (prefer :devise_modules, 'invitable')
685
+ copy_from_repo 'spec/controllers/home_controller_spec.rb', :repo => repo
686
+ copy_from_repo 'spec/controllers/users_controller_spec.rb', :repo => repo
687
+ copy_from_repo 'spec/models/user_spec.rb', :repo => repo
688
+ remove_file 'spec/views/home/index.html.erb_spec.rb'
689
+ remove_file 'spec/views/home/index.html.haml_spec.rb'
690
+ remove_file 'spec/views/users/show.html.erb_spec.rb'
691
+ remove_file 'spec/views/users/show.html.haml_spec.rb'
692
+ remove_file 'spec/helpers/home_helper_spec.rb'
693
+ remove_file 'spec/helpers/users_helper_spec.rb'
694
+ end
695
+ if (prefer :authentication, 'devise') && (prefer :starter_app, 'admin_app')
696
+ say_wizard "copying RSpec files from the rails3-bootstrap-devise-cancan examples"
697
+ repo = 'https://raw.github.com/RailsApps/rails3-bootstrap-devise-cancan/master/'
698
+ copy_from_repo 'spec/factories/users.rb', :repo => repo
699
+ gsub_file 'spec/factories/users.rb', /# confirmed_at/, "confirmed_at" if (prefer :devise_modules, 'confirmable') || (prefer :devise_modules, 'invitable')
700
+ copy_from_repo 'spec/controllers/home_controller_spec.rb', :repo => repo
701
+ copy_from_repo 'spec/controllers/users_controller_spec.rb', :repo => repo
702
+ copy_from_repo 'spec/models/user_spec.rb', :repo => repo
703
+ remove_file 'spec/views/home/index.html.erb_spec.rb'
704
+ remove_file 'spec/views/home/index.html.haml_spec.rb'
705
+ remove_file 'spec/views/users/show.html.erb_spec.rb'
706
+ remove_file 'spec/views/users/show.html.haml_spec.rb'
707
+ remove_file 'spec/helpers/home_helper_spec.rb'
708
+ remove_file 'spec/helpers/users_helper_spec.rb'
709
+ end
710
+ ## RSPEC AND OMNIAUTH
711
+ if (prefer :authentication, 'omniauth') && (prefer :starter_app, 'users_app')
712
+ say_wizard "copying RSpec files from the rails3-mongoid-omniauth examples"
713
+ repo = 'https://raw.github.com/RailsApps/rails3-mongoid-omniauth/master/'
714
+ copy_from_repo 'spec/spec_helper.rb', :repo => repo
715
+ copy_from_repo 'spec/factories/users.rb', :repo => repo
716
+ copy_from_repo 'spec/controllers/sessions_controller_spec.rb', :repo => repo
717
+ copy_from_repo 'spec/controllers/home_controller_spec.rb', :repo => repo
718
+ copy_from_repo 'spec/controllers/users_controller_spec.rb', :repo => repo
719
+ copy_from_repo 'spec/models/user_spec.rb', :repo => repo
720
+ end
721
+ ## GIT
722
+ git :add => '.' if prefer :git, true
723
+ git :commit => "-aqm 'rails_apps_composer: rspec files'" if prefer :git, true
724
+ end
725
+ ### CUCUMBER ###
726
+ if prefer :integration, 'cucumber'
727
+ ## CUCUMBER AND DEVISE
728
+ if (prefer :authentication, 'devise') && (prefer :starter_app, 'users_app')
729
+ say_wizard "copying Cucumber scenarios from the rails3-devise-rspec-cucumber examples"
730
+ repo = 'https://raw.github.com/RailsApps/rails3-devise-rspec-cucumber/master/'
731
+ copy_from_repo 'spec/controllers/home_controller_spec.rb', :repo => repo
732
+ copy_from_repo 'features/users/sign_in.feature', :repo => repo
733
+ copy_from_repo 'features/users/sign_out.feature', :repo => repo
734
+ copy_from_repo 'features/users/sign_up.feature', :repo => repo
735
+ copy_from_repo 'features/users/user_edit.feature', :repo => repo
736
+ copy_from_repo 'features/users/user_show.feature', :repo => repo
737
+ copy_from_repo 'features/step_definitions/user_steps.rb', :repo => repo
738
+ copy_from_repo 'features/support/paths.rb', :repo => repo
739
+ if (prefer :devise_modules, 'confirmable') || (prefer :devise_modules, 'invitable')
740
+ 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."
741
+ inject_into_file 'features/users/sign_in.feature', :before => ' Scenario: User signs in successfully' do
742
+ <<-RUBY
743
+ Scenario: User has not confirmed account
744
+ Given I exist as an unconfirmed user
745
+ And I am not logged in
746
+ When I sign in with valid credentials
747
+ Then I see an unconfirmed account message
748
+ And I should be signed out
749
+ RUBY
750
+ end
751
+ end
752
+ end
753
+ if (prefer :authentication, 'devise') && (prefer :starter_app, 'admin_app')
754
+ say_wizard "copying Cucumber scenarios from the rails3-bootstrap-devise-cancan examples"
755
+ repo = 'https://raw.github.com/RailsApps/rails3-bootstrap-devise-cancan/master/'
756
+ copy_from_repo 'spec/controllers/home_controller_spec.rb', :repo => repo
757
+ copy_from_repo 'features/users/sign_in.feature', :repo => repo
758
+ copy_from_repo 'features/users/sign_out.feature', :repo => repo
759
+ copy_from_repo 'features/users/sign_up.feature', :repo => repo
760
+ copy_from_repo 'features/users/user_edit.feature', :repo => repo
761
+ copy_from_repo 'features/users/user_show.feature', :repo => repo
762
+ copy_from_repo 'features/step_definitions/user_steps.rb', :repo => repo
763
+ copy_from_repo 'features/support/paths.rb', :repo => repo
764
+ if (prefer :devise_modules, 'confirmable') || (prefer :devise_modules, 'invitable')
765
+ 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."
766
+ inject_into_file 'features/users/sign_in.feature', :before => ' Scenario: User signs in successfully' do
767
+ <<-RUBY
768
+ Scenario: User has not confirmed account
769
+ Given I exist as an unconfirmed user
770
+ And I am not logged in
771
+ When I sign in with valid credentials
772
+ Then I see an unconfirmed account message
773
+ And I should be signed out
774
+ RUBY
775
+ end
776
+ end
777
+ end
778
+ ## GIT
779
+ git :add => '.' if prefer :git, true
780
+ git :commit => "-aqm 'rails_apps_composer: cucumber files'" if prefer :git, true
781
+ end
782
+ end # after_everything
783
+
784
+
785
+ # >---------------------------------[ auth ]----------------------------------<
786
+
787
+ @current_recipe = "auth"
788
+ @before_configs["auth"].call if @before_configs["auth"]
789
+ say_recipe 'auth'
790
+
791
+
792
+ @configs[@current_recipe] = config
793
+
794
+ # Application template recipe for the rails_apps_composer. Change the recipe here:
795
+ # https://github.com/RailsApps/rails_apps_composer/blob/master/recipes/auth.rb
796
+
797
+ after_bundler do
798
+ say_wizard "recipe running after 'bundle install'"
799
+ ### DEVISE ###
800
+ if prefer :authentication, 'devise'
801
+ # Prevent logging of password_confirmation
802
+ gsub_file 'config/application.rb', /:password/, ':password, :password_confirmation'
803
+ generate 'devise:install'
804
+ generate 'devise_invitable:install' if prefer :devise_modules, 'invitable'
805
+ generate 'devise user'
806
+ ## DEVISE AND CUCUMBER
807
+ if prefer :integration, 'cucumber'
808
+ # Cucumber wants to test GET requests not DELETE requests for destroy_user_session_path
809
+ # (see https://github.com/RailsApps/rails3-devise-rspec-cucumber/issues/3)
810
+ gsub_file 'config/initializers/devise.rb', 'config.sign_out_via = :delete', 'config.sign_out_via = Rails.env.test? ? :get : :delete'
811
+ end
812
+ ## DEVISE MODULES
813
+ if (prefer :devise_modules, 'confirmable') || (prefer :devise_modules, 'invitable')
814
+ gsub_file 'app/models/user.rb', /:registerable,/, ":registerable, :confirmable,"
815
+ gsub_file 'app/models/user.rb', /:remember_me/, ':remember_me, :confirmed_at'
816
+ if prefer :orm, 'mongoid'
817
+ gsub_file 'app/models/user.rb', /# field :confirmation_token/, "field :confirmation_token"
818
+ gsub_file 'app/models/user.rb', /# field :confirmed_at/, "field :confirmed_at"
819
+ gsub_file 'app/models/user.rb', /# field :confirmation_sent_at/, "field :confirmation_sent_at"
820
+ gsub_file 'app/models/user.rb', /# field :unconfirmed_email/, "field :unconfirmed_email"
821
+ end
822
+ end
823
+ if prefer :devise_modules, 'invitable'
824
+ if prefer :orm, 'mongoid'
825
+ gsub_file 'app/models/user.rb', /\bend\s*\Z/ do
826
+ <<-RUBY
827
+ #invitable
828
+ field :invitation_token, :type => String
829
+ field :invitation_sent_at, :type => Time
830
+ field :invitation_accepted_at, :type => Time
831
+ field :invitation_limit, :type => Integer
832
+ field :invited_by_id, :type => String
833
+ field :invited_by_type, :type => String
834
+ end
835
+ RUBY
836
+ end
837
+ end
838
+ end
839
+ end
840
+ ### OMNIAUTH ###
841
+ if prefer :authentication, 'omniauth'
842
+ # Don't use single-quote-style-heredoc: we want interpolation.
843
+ create_file 'config/initializers/omniauth.rb' do <<-RUBY
844
+ Rails.application.config.middleware.use OmniAuth::Builder do
845
+ provider :#{prefs[:omniauth_provider]}, ENV['OMNIAUTH_PROVIDER_KEY'], ENV['OMNIAUTH_PROVIDER_SECRET']
846
+ end
847
+ RUBY
848
+ end
849
+ end
850
+ ### CANCAN ###
851
+ if prefer :authorization, 'cancan'
852
+ generate 'cancan:ability'
853
+ if prefer :starter_app, 'admin_app'
854
+ # Limit access to the users#index page
855
+ inject_into_file 'app/models/ability.rb', :after => "def initialize(user)\n" do <<-RUBY
856
+ user ||= User.new # guest user (not logged in)
857
+ if user.has_role? :admin
858
+ can :manage, :all
859
+ end
860
+ RUBY
861
+ end
862
+ end
863
+ end
864
+ ### GIT ###
865
+ git :add => '.' if prefer :git, true
866
+ git :commit => "-aqm 'rails_apps_composer: authentication and authorization'" if prefer :git, true
867
+ end # after_bundler
868
+
869
+
870
+ # >--------------------------------[ models ]---------------------------------<
871
+
872
+ @current_recipe = "models"
873
+ @before_configs["models"].call if @before_configs["models"]
874
+ say_recipe 'models'
875
+
876
+
877
+ @configs[@current_recipe] = config
878
+
879
+ # Application template recipe for the rails_apps_composer. Change the recipe here:
880
+ # https://github.com/RailsApps/rails_apps_composer/blob/master/recipes/models.rb
881
+
882
+ after_bundler do
883
+ say_wizard "recipe running after 'bundle install'"
884
+ ### DEVISE ###
885
+ if prefer :authentication, 'devise'
886
+ if prefer :orm, 'mongoid'
887
+ copy_from_repo 'app/models/user.rb', :repo => 'https://raw.github.com/RailsApps/rails3-mongoid-devise/master/' if prefer :orm, 'mongoid'
888
+ else
889
+ generate 'migration AddNameToUsers name:string'
890
+ if (prefer :devise_modules, 'confirmable') || (prefer :devise_modules, 'invitable')
891
+ generate 'migration AddConfirmableToUsers confirmation_token:string confirmed_at:datetime confirmation_sent_at:datetime unconfirmed_email:string'
892
+ end
893
+ copy_from_repo 'app/models/user.rb', :repo => 'https://raw.github.com/RailsApps/rails3-devise-rspec-cucumber/master/'
894
+ end
895
+ end
896
+ ### OMNIAUTH ###
897
+ if prefer :authentication, 'omniauth'
898
+ if prefer :orm, 'mongoid'
899
+ copy_from_repo 'app/models/user.rb', :repo => 'https://raw.github.com/RailsApps/rails3-mongoid-omniauth/master/'
900
+ else
901
+ generate 'model User name:string email:string provider:string uid:string'
902
+ run 'bundle exec rake db:migrate'
903
+ copy_from_repo 'app/models/user.rb', :repo => 'https://raw.github.com/RailsApps/rails3-mongoid-omniauth/master/'
904
+ gsub_file 'app/models/user.rb', /class User/, 'class User < ActiveRecord::Base'
905
+ gsub_file 'app/models/user.rb', /^\s*include Mongoid::Document\n/, ''
906
+ gsub_file 'app/models/user.rb', /^\s*field.*\n/, ''
907
+ gsub_file 'app/models/user.rb', /^\s*# run 'rake db:mongoid:create_indexes' to create indexes\n/, ''
908
+ gsub_file 'app/models/user.rb', /^\s*index\(\{ email: 1 \}, \{ unique: true, background: true \}\)\n/, ''
909
+ end
910
+ end
911
+ ### SUBDOMAINS ###
912
+ copy_from_repo 'app/models/user.rb', :repo => 'https://raw.github.com/RailsApps/rails3-subdomains/master/' if prefer :starter_app, 'subdomains'
913
+ ### AUTHORIZATION (insert 'rolify' after User model is created) ###
914
+ if prefer :authorization, 'cancan'
915
+ unless prefer :orm, 'mongoid'
916
+ generate 'rolify:role Role User'
917
+ else
918
+ generate 'rolify:role Role User mongoid'
919
+ # correct the generation of rolify 3.1 with mongoid
920
+ # the call to `rolify` should be *after* the inclusion of mongoid
921
+ # (see https://github.com/EppO/rolify/issues/61)
922
+ # This isn't needed for rolify>=3.2.0.beta4, but should cause no harm
923
+ gsub_file 'app/models/user.rb',
924
+ /^\s*(rolify.*?)$\s*(include Mongoid::Document.*?)$/,
925
+ " \\2\n extend Rolify\n \\1\n"
926
+ end
927
+ end
928
+ ### GIT ###
929
+ git :add => '.' if prefer :git, true
930
+ git :commit => "-aqm 'rails_apps_composer: models'" if prefer :git, true
931
+ end # after_bundler
932
+
933
+
934
+ # >------------------------------[ controllers ]------------------------------<
935
+
936
+ @current_recipe = "controllers"
937
+ @before_configs["controllers"].call if @before_configs["controllers"]
938
+ say_recipe 'controllers'
939
+
940
+
941
+ @configs[@current_recipe] = config
942
+
943
+ # Application template recipe for the rails_apps_composer. Change the recipe here:
944
+ # https://github.com/RailsApps/rails_apps_composer/blob/master/recipes/controllers.rb
945
+
946
+ after_bundler do
947
+ say_wizard "recipe running after 'bundle install'"
948
+ ### APPLICATION_CONTROLLER ###
949
+ if prefer :authentication, 'omniauth'
950
+ copy_from_repo 'app/controllers/application_controller.rb', :repo => 'https://raw.github.com/RailsApps/rails3-mongoid-omniauth/master/'
951
+ end
952
+ if prefer :authorization, 'cancan'
953
+ inject_into_file 'app/controllers/application_controller.rb', :before => 'end' do <<-RUBY
954
+ rescue_from CanCan::AccessDenied do |exception|
955
+ redirect_to root_path, :alert => exception.message
956
+ end
957
+ RUBY
958
+ end
959
+ end
960
+ ### HOME_CONTROLLER ###
961
+ if ['home_app','users_app','admin_app','subdomains_app'].include? prefs[:starter_app]
962
+ generate(:controller, "home index")
963
+ end
964
+ if ['users_app','admin_app','subdomains_app'].include? prefs[:starter_app]
965
+ gsub_file 'app/controllers/home_controller.rb', /def index/, "def index\n @users = User.all"
966
+ end
967
+ ### USERS_CONTROLLER ###
968
+ if ['users_app','admin_app','subdomains_app'].include? prefs[:starter_app]
969
+ if prefer :authentication, 'devise'
970
+ copy_from_repo 'app/controllers/users_controller.rb', :repo => 'https://raw.github.com/RailsApps/rails3-devise-rspec-cucumber/master/'
971
+ elsif prefer :authentication, 'omniauth'
972
+ copy_from_repo 'app/controllers/users_controller.rb', :repo => 'https://raw.github.com/RailsApps/rails3-mongoid-omniauth/master/'
973
+ end
974
+ if prefer :authorization, 'cancan'
975
+ inject_into_file 'app/controllers/users_controller.rb', " authorize! :index, @user, :message => 'Not authorized as an administrator.'\n", :after => "def index\n"
976
+ end
977
+ end
978
+ gsub_file 'app/controllers/users_controller.rb', /before_filter :authenticate_user!/, '' if prefer :starter_app, 'subdomains'
979
+ ### SESSIONS_CONTROLLER ###
980
+ if prefer :authentication, 'omniauth'
981
+ filename = 'app/controllers/sessions_controller.rb'
982
+ copy_from_repo filename, :repo => 'https://raw.github.com/RailsApps/rails3-mongoid-omniauth/master/'
983
+ gsub_file filename, /twitter/, prefs[:omniauth_provider] unless prefer :omniauth_provider, 'twitter'
984
+ end
985
+ ### PROFILES_CONTROLLER ###
986
+ copy_from_repo 'app/controllers/profiles_controller.rb', :repo => 'https://raw.github.com/RailsApps/rails3-subdomains/master/' if prefer :starter_app, 'subdomains'
987
+ ### GIT ###
988
+ git :add => '.' if prefer :git, true
989
+ git :commit => "-aqm 'rails_apps_composer: controllers'" if prefer :git, true
990
+ end # after_bundler
991
+
992
+
993
+ # >---------------------------------[ views ]---------------------------------<
994
+
995
+ @current_recipe = "views"
996
+ @before_configs["views"].call if @before_configs["views"]
997
+ say_recipe 'views'
998
+
999
+
1000
+ @configs[@current_recipe] = config
1001
+
1002
+ # Application template recipe for the rails_apps_composer. Change the recipe here:
1003
+ # https://github.com/RailsApps/rails_apps_composer/blob/master/recipes/views.rb
1004
+
1005
+ after_bundler do
1006
+ say_wizard "recipe running after 'bundle install'"
1007
+ ### DEVISE ###
1008
+ copy_from_repo 'app/views/devise/shared/_links.html.erb' if prefer :authentication, 'devise'
1009
+ copy_from_repo 'app/views/devise/registrations/edit.html.erb' if prefer :authentication, 'devise'
1010
+ copy_from_repo 'app/views/devise/registrations/new.html.erb' if prefer :authentication, 'devise'
1011
+ ### HOME ###
1012
+ copy_from_repo 'app/views/home/index.html.erb' if prefer :starter_app, 'users_app'
1013
+ copy_from_repo 'app/views/home/index.html.erb' if prefer :starter_app, 'admin_app'
1014
+ copy_from_repo 'app/views/home/index-subdomains_app.html.erb', :prefs => 'subdomains_app'
1015
+ ### USERS ###
1016
+ if ['users_app','admin_app','subdomains_app'].include? prefs[:starter_app]
1017
+ ## INDEX
1018
+ copy_from_repo 'app/views/users/index.html.erb'
1019
+ ## SHOW
1020
+ copy_from_repo 'app/views/users/show.html.erb'
1021
+ copy_from_repo 'app/views/users/show-subdomains_app.html.erb', :prefs => 'subdomains_app'
1022
+ ## EDIT
1023
+ copy_from_repo 'app/views/users/edit-omniauth.html.erb', :prefs => 'omniauth'
1024
+ end
1025
+ ### PROFILES ###
1026
+ copy_from_repo 'app/views/profiles/show-subdomains_app.html.erb', :prefs => 'subdomains_app'
1027
+ ### GIT ###
1028
+ git :add => '.' if prefer :git, true
1029
+ git :commit => "-aqm 'rails_apps_composer: views'" if prefer :git, true
1030
+ end # after_bundler
1031
+
1032
+
1033
+ # >------------------------------[ haml_views ]-------------------------------<
1034
+
1035
+ @current_recipe = "haml_views"
1036
+ @before_configs["haml_views"].call if @before_configs["haml_views"]
1037
+ say_recipe 'haml_views'
1038
+
1039
+
1040
+ @configs[@current_recipe] = config
1041
+
1042
+ after_bundler do
1043
+ say_wizard "recipe running after 'bundle install'"
1044
+
1045
+ # Convert all views to Haml
1046
+ run "for i in `find app/views -name '*.erb'` ; do html2haml -e $i ${i%erb}haml ; rm $i ; done"
1047
+
1048
+ ### GIT ###
1049
+ git :add => '.' if prefer :git, true
1050
+ git :commit => "-aqm 'rails_apps_composer: Haml starter views.'" if prefer :git, true
1051
+ end # after_bundler
1052
+
1053
+
1054
+ # >--------------------------------[ routes ]---------------------------------<
1055
+
1056
+ @current_recipe = "routes"
1057
+ @before_configs["routes"].call if @before_configs["routes"]
1058
+ say_recipe 'routes'
1059
+
1060
+
1061
+ @configs[@current_recipe] = config
1062
+
1063
+ # Application template recipe for the rails_apps_composer. Change the recipe here:
1064
+ # https://github.com/RailsApps/rails_apps_composer/blob/master/recipes/routes.rb
1065
+
1066
+ after_bundler do
1067
+ say_wizard "recipe running after 'bundle install'"
1068
+ ### HOME ###
1069
+ if prefer :starter_app, 'home_app'
1070
+ remove_file 'public/index.html'
1071
+ gsub_file 'config/routes.rb', /get \"home\/index\"/, 'root :to => "home#index"'
1072
+ end
1073
+ ### USER_ACCOUNTS ###
1074
+ if ['users_app','admin_app'].include? prefs[:starter_app]
1075
+ ## DEVISE
1076
+ copy_from_repo 'config/routes.rb', :repo => 'https://raw.github.com/RailsApps/rails3-devise-rspec-cucumber/master/' if prefer :authentication, 'devise'
1077
+ ## OMNIAUTH
1078
+ copy_from_repo 'config/routes.rb', :repo => 'https://raw.github.com/RailsApps/rails3-mongoid-omniauth/master/' if prefer :authentication, 'omniauth'
1079
+ end
1080
+ ### SUBDOMAINS ###
1081
+ copy_from_repo 'lib/subdomain.rb', :repo => 'https://raw.github.com/RailsApps/rails3-subdomains/master/' if prefer :starter_app, 'subdomains'
1082
+ copy_from_repo 'config/routes.rb', :repo => 'https://raw.github.com/RailsApps/rails3-subdomains/master/' if prefer :starter_app, 'subdomains'
1083
+ ### CORRECT APPLICATION NAME ###
1084
+ gsub_file 'config/routes.rb', /^.*.routes.draw do/, "#{app_const}.routes.draw do"
1085
+ ### GIT ###
1086
+ git :add => '.' if prefer :git, true
1087
+ git :commit => "-aqm 'rails_apps_composer: routes'" if prefer :git, true
1088
+ end # after_bundler
1089
+
1090
+
1091
+ # >-------------------------------[ frontend ]--------------------------------<
1092
+
1093
+ @current_recipe = "frontend"
1094
+ @before_configs["frontend"].call if @before_configs["frontend"]
1095
+ say_recipe 'frontend'
1096
+
1097
+
1098
+ @configs[@current_recipe] = config
1099
+
1100
+ # Application template recipe for the rails_apps_composer. Change the recipe here:
1101
+ # https://github.com/RailsApps/rails_apps_composer/blob/master/recipes/frontend.rb
1102
+
1103
+ after_bundler do
1104
+ say_wizard "recipe running after 'bundle install'"
1105
+ ### LAYOUTS ###
1106
+ copy_from_repo 'app/views/layouts/application.html.erb'
1107
+ copy_from_repo 'app/views/layouts/application-bootstrap.html.erb', :prefs => 'bootstrap'
1108
+ copy_from_repo 'app/views/layouts/_messages.html.erb'
1109
+ copy_from_repo 'app/views/layouts/_messages-bootstrap.html.erb', :prefs => 'bootstrap'
1110
+ copy_from_repo 'app/views/layouts/_navigation.html.erb'
1111
+ copy_from_repo 'app/views/layouts/_navigation-devise.html.erb', :prefs => 'devise'
1112
+ copy_from_repo 'app/views/layouts/_navigation-cancan.html.erb', :prefs => 'cancan'
1113
+ copy_from_repo 'app/views/layouts/_navigation-omniauth.html.erb', :prefs => 'omniauth'
1114
+ copy_from_repo 'app/views/layouts/_navigation-subdomains_app.html.erb', :prefs => 'subdomains_app'
1115
+ ## APPLICATION NAME
1116
+ application_layout_file = Dir['app/views/layouts/application.html.*'].first
1117
+ navigation_partial_file = Dir['app/views/layouts/_navigation.html.*'].first
1118
+ gsub_file application_layout_file, /App_Name/, "#{app_name.humanize.titleize}"
1119
+ gsub_file navigation_partial_file, /App_Name/, "#{app_name.humanize.titleize}"
1120
+ ### CSS ###
1121
+ remove_file 'app/assets/stylesheets/application.css'
1122
+ copy_from_repo 'app/assets/stylesheets/application.css.scss'
1123
+ copy_from_repo 'app/assets/stylesheets/application-bootstrap.css.scss', :prefs => 'bootstrap'
1124
+ if prefer :bootstrap, 'less'
1125
+ generate 'bootstrap:install'
1126
+ insert_into_file 'app/assets/stylesheets/bootstrap_and_overrides.css.less', "body { padding-top: 60px; }\n", :after => "@import \"twitter/bootstrap/bootstrap\";\n"
1127
+ elsif prefer :bootstrap, 'sass'
1128
+ insert_into_file 'app/assets/javascripts/application.js', "//= require bootstrap\n", :after => "jquery_ujs\n"
1129
+ create_file 'app/assets/stylesheets/bootstrap_and_overrides.css.scss', <<-RUBY
1130
+ @import "bootstrap";
1131
+ body { padding-top: 60px; }
1132
+ @import "bootstrap-responsive";
1133
+ RUBY
1134
+ elsif prefer :frontend, 'foundation'
1135
+ insert_into_file 'app/assets/javascripts/application.js', "//= require foundation\n", :after => "jquery_ujs\n"
1136
+ insert_into_file 'app/assets/stylesheets/application.css.scss', " *= require foundation\n", :after => "require_self\n"
1137
+ elsif prefer :frontend, 'skeleton'
1138
+ copy_from 'https://raw.github.com/necolas/normalize.css/master/normalize.css', 'app/assets/stylesheets/normalize.css'
1139
+ copy_from 'https://raw.github.com/dhgamache/Skeleton/master/stylesheets/base.css', 'app/assets/stylesheets/base.css'
1140
+ copy_from 'https://raw.github.com/dhgamache/Skeleton/master/stylesheets/layout.css', 'app/assets/stylesheets/layout.css'
1141
+ copy_from 'https://raw.github.com/dhgamache/Skeleton/master/stylesheets/skeleton.css', 'app/assets/stylesheets/skeleton.css'
1142
+ elsif prefer :frontend, 'normalize'
1143
+ copy_from 'https://raw.github.com/necolas/normalize.css/master/normalize.css', 'app/assets/stylesheets/normalize.css'
1144
+ end
1145
+ ### GIT ###
1146
+ git :add => '.' if prefer :git, true
1147
+ git :commit => "-aqm 'rails_apps_composer: front-end framework'" if prefer :git, true
1148
+ end # after_bundler
1149
+
1150
+
1151
+ # >---------------------------------[ html5 ]---------------------------------<
1152
+
1153
+ @current_recipe = "html5"
1154
+ @before_configs["html5"].call if @before_configs["html5"]
1155
+ say_recipe 'html5'
1156
+
1157
+
1158
+ @configs[@current_recipe] = config
1159
+
1160
+ # Application template recipe for the rails_apps_composer. Check for a newer version here:
1161
+ # https://github.com/RailsApps/rails_apps_composer/blob/master/recipes/html5.rb
1162
+
1163
+ after_bundler do
1164
+ say_wizard "HTML5 recipe running 'after bundler'"
1165
+ # add a humans.txt file
1166
+ get 'https://raw.github.com/RailsApps/rails3-application-templates/master/files/humans.txt', 'public/humans.txt'
1167
+ # install a front-end framework for HTML5 and CSS3
1168
+ remove_file 'app/assets/stylesheets/application.css'
1169
+ remove_file 'app/views/layouts/application.html.erb'
1170
+ remove_file 'app/views/layouts/application.html.haml'
1171
+ unless recipes.include? 'bootstrap'
1172
+ if recipes.include? 'haml'
1173
+ # Haml version of a simple application layout
1174
+ get 'https://raw.github.com/RailsApps/rails3-application-templates/master/files/simple/views/layouts/application.html.haml', 'app/views/layouts/application.html.haml'
1175
+ get 'https://raw.github.com/RailsApps/rails3-application-templates/master/files/simple/views/layouts/_messages.html.haml', 'app/views/layouts/_messages.html.haml'
1176
+ else
1177
+ # ERB version of a simple application layout
1178
+ get 'https://raw.github.com/RailsApps/rails3-application-templates/master/files/simple/views/layouts/application.html.erb', 'app/views/layouts/application.html.erb'
1179
+ get 'https://raw.github.com/RailsApps/rails3-application-templates/master/files/simple/views/layouts/_messages.html.erb', 'app/views/layouts/_messages.html.erb'
1180
+ end
1181
+ # simple css styles
1182
+ get 'https://raw.github.com/RailsApps/rails3-application-templates/master/files/simple/assets/stylesheets/application.css.scss', 'app/assets/stylesheets/application.css.scss'
1183
+ else # for Twitter Bootstrap
1184
+ if recipes.include? 'haml'
1185
+ # Haml version of a complex application layout using Twitter Bootstrap
1186
+ get 'https://raw.github.com/RailsApps/rails3-application-templates/master/files/twitter-bootstrap/views/layouts/application.html.haml', 'app/views/layouts/application.html.haml'
1187
+ get 'https://raw.github.com/RailsApps/rails3-application-templates/master/files/twitter-bootstrap/views/layouts/_messages.html.haml', 'app/views/layouts/_messages.html.haml'
1188
+ else
1189
+ # ERB version of a complex application layout using Twitter Bootstrap
1190
+ get 'https://raw.github.com/RailsApps/rails3-application-templates/master/files/twitter-bootstrap/views/layouts/application.html.erb', 'app/views/layouts/application.html.erb'
1191
+ get 'https://raw.github.com/RailsApps/rails3-application-templates/master/files/twitter-bootstrap/views/layouts/_messages.html.erb', 'app/views/layouts/_messages.html.erb'
1192
+ end
1193
+ # complex css styles using Twitter Bootstrap
1194
+ get 'https://raw.github.com/RailsApps/rails3-application-templates/master/files/twitter-bootstrap/assets/stylesheets/application.css.scss', 'app/assets/stylesheets/application.css.scss'
1195
+ end
1196
+ # get an appropriate navigation partial
1197
+ if recipes.include? 'haml'
1198
+ if recipes.include? 'devise'
1199
+ if recipes.include? 'authorization'
1200
+ get 'https://raw.github.com/RailsApps/rails3-application-templates/master/files/navigation/devise/authorization/_navigation.html.haml', 'app/views/layouts/_navigation.html.haml'
1201
+ else
1202
+ get 'https://raw.github.com/RailsApps/rails3-application-templates/master/files/navigation/devise/_navigation.html.haml', 'app/views/layouts/_navigation.html.haml'
1203
+ end
1204
+ elsif recipes.include? 'omniauth'
1205
+ get 'https://raw.github.com/RailsApps/rails3-application-templates/master/files/navigation/omniauth/_navigation.html.haml', 'app/views/layouts/_navigation.html.haml'
1206
+ elsif recipes.include? 'subdomains'
1207
+ get 'https://raw.github.com/RailsApps/rails3-application-templates/master/files/navigation/subdomains/_navigation.html.haml', 'app/views/layouts/_navigation.html.haml'
1208
+ else
1209
+ get 'https://raw.github.com/RailsApps/rails3-application-templates/master/files/navigation/none/_navigation.html.haml', 'app/views/layouts/_navigation.html.haml'
1210
+ end
1211
+ else
1212
+ if recipes.include? 'devise'
1213
+ if recipes.include? 'authorization'
1214
+ get 'https://raw.github.com/RailsApps/rails3-application-templates/master/files/navigation/devise/authorization/_navigation.html.erb', 'app/views/layouts/_navigation.html.erb'
1215
+ else
1216
+ get 'https://raw.github.com/RailsApps/rails3-application-templates/master/files/navigation/devise/_navigation.html.erb', 'app/views/layouts/_navigation.html.erb'
1217
+ end
1218
+ elsif recipes.include? 'omniauth'
1219
+ get 'https://raw.github.com/RailsApps/rails3-application-templates/master/files/navigation/omniauth/_navigation.html.erb', 'app/views/layouts/_navigation.html.erb'
1220
+ elsif recipes.include? 'subdomains'
1221
+ get 'https://raw.github.com/RailsApps/rails3-application-templates/master/files/navigation/subdomains/_navigation.html.erb', 'app/views/layouts/_navigation.html.erb'
1222
+ else
1223
+ get 'https://raw.github.com/RailsApps/rails3-application-templates/master/files/navigation/none/_navigation.html.erb', 'app/views/layouts/_navigation.html.erb'
1224
+ end
1225
+ end
1226
+ if recipes.include? 'haml'
1227
+ gsub_file 'app/views/layouts/application.html.haml', /App_Name/, "#{app_name.humanize.titleize}"
1228
+ gsub_file 'app/views/layouts/_navigation.html.haml', /App_Name/, "#{app_name.humanize.titleize}"
1229
+ else
1230
+ gsub_file 'app/views/layouts/application.html.erb', /App_Name/, "#{app_name.humanize.titleize}"
1231
+ gsub_file 'app/views/layouts/_navigation.html.erb', /App_Name/, "#{app_name.humanize.titleize}"
1232
+ end
1233
+ end
1234
+
1235
+
1236
+ # >--------------------------------[ extras ]---------------------------------<
1237
+
1238
+ @current_recipe = "extras"
1239
+ @before_configs["extras"].call if @before_configs["extras"]
1240
+ say_recipe 'extras'
1241
+
1242
+ config = {}
1243
+ config['form_builder'] = multiple_choice("Use a form builder gem?", [["None", "none"], ["SimpleForm", "simple_form"]]) if true && true unless config.key?('form_builder') || prefs.has_key?(:form_builder)
1244
+ 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)
1245
+ config['jsruntime'] = yes_wizard?("Add 'therubyracer' JavaScript runtime (for Linux users without node.js)?") if true && true unless config.key?('jsruntime') || prefs.has_key?(:jsruntime)
1246
+ config['rvmrc'] = yes_wizard?("Create a project-specific rvm gemset and .rvmrc?") if true && true unless config.key?('rvmrc') || prefs.has_key?(:rvmrc)
1247
+ @configs[@current_recipe] = config
1248
+
1249
+ # Application template recipe for the rails_apps_composer. Change the recipe here:
1250
+ # https://github.com/RailsApps/rails_apps_composer/blob/master/recipes/extras.rb
1251
+
1252
+ ## FORM BUILDER
1253
+ case config['form_builder']
1254
+ when 'simple_form'
1255
+ prefs[:form_builder] = 'simple_form'
1256
+ end
1257
+ case prefs[:form_builder]
1258
+ when 'simple_form'
1259
+ gem 'simple_form'
1260
+ after_bundler do
1261
+ if prefer :frontend, 'bootstrap'
1262
+ say_wizard "recipe installing simple_form for use with Twitter Bootstrap"
1263
+ generate 'simple_form:install --bootstrap'
1264
+ else
1265
+ say_wizard "recipe installing simple_form"
1266
+ generate 'simple_form:install'
1267
+ end
1268
+ end
1269
+ end
1270
+
1271
+ ## BAN SPIDERS
1272
+ if config['ban_spiders']
1273
+ prefs[:ban_spiders] = true
1274
+ end
1275
+ if prefs[:ban_spiders]
1276
+ say_wizard "Banning spiders by modifying 'public/robots.txt'"
1277
+ after_bundler do
1278
+ gsub_file 'public/robots.txt', /# User-Agent/, 'User-Agent'
1279
+ gsub_file 'public/robots.txt', /# Disallow/, 'Disallow'
1280
+ end
1281
+ end
1282
+
1283
+ ## JSRUNTIME
1284
+ if config['jsruntime']
1285
+ prefs[:jsruntime] = true
1286
+ end
1287
+ if prefs[:jsruntime]
1288
+ say_wizard "Adding 'therubyracer' JavaScript runtime gem"
1289
+ # maybe it was already added for bootstrap-less?
1290
+ unless prefer :bootstrap, 'less'
1291
+ gem 'therubyracer', :group => :assets, :platform => :ruby
1292
+ end
1293
+ end
1294
+
1295
+ ## RVMRC
1296
+ if config['rvmrc']
1297
+ prefs[:rvmrc] = true
1298
+ end
1299
+ if prefs[:rvmrc]
1300
+ # using the rvm Ruby API, see:
1301
+ # http://blog.thefrontiergroup.com.au/2010/12/a-brief-introduction-to-the-rvm-ruby-api/
1302
+ if ENV['MY_RUBY_HOME'] && ENV['MY_RUBY_HOME'].include?('rvm')
1303
+ begin
1304
+ rvm_path = File.dirname(File.dirname(ENV['MY_RUBY_HOME']))
1305
+ rvm_lib_path = File.join(rvm_path, 'lib')
1306
+ require 'rvm'
1307
+ rescue LoadError
1308
+ raise "RVM ruby lib is currently unavailable."
1309
+ end
1310
+ else
1311
+ raise "RVM ruby lib is currently unavailable."
1312
+ end
1313
+ say_wizard "creating RVM gemset '#{app_name}'"
1314
+ RVM.gemset_create app_name
1315
+ run "rvm rvmrc trust"
1316
+ say_wizard "switching to gemset '#{app_name}'"
1317
+ begin
1318
+ RVM.gemset_use! app_name
1319
+ rescue StandardError
1320
+ raise "rvm failure: unable to use gemset #{app_name}"
1321
+ end
1322
+ run "rvm gemset list"
1323
+ copy_from_repo '.rvmrc'
1324
+ gsub_file '.rvmrc', /App_Name/, "#{app_name}"
1325
+ end
1326
+
1327
+ ## AFTER_EVERYTHING
1328
+ after_everything do
1329
+ say_wizard "recipe removing unnecessary files and whitespace"
1330
+ %w{
1331
+ public/index.html
1332
+ app/assets/images/rails.png
1333
+ }.each { |file| remove_file file }
1334
+ # remove commented lines and multiple blank lines from Gemfile
1335
+ # thanks to https://github.com/perfectline/template-bucket/blob/master/cleanup.rb
1336
+ gsub_file 'Gemfile', /#.*\n/, "\n"
1337
+ gsub_file 'Gemfile', /\n^\s*\n/, "\n"
1338
+ # remove commented lines and multiple blank lines from config/routes.rb
1339
+ gsub_file 'config/routes.rb', / #.*\n/, "\n"
1340
+ gsub_file 'config/routes.rb', /\n^\s*\n/, "\n"
1341
+ # GIT
1342
+ git :add => '.' if prefer :git, true
1343
+ git :commit => "-aqm 'rails_apps_composer: extras'" if prefer :git, true
1344
+ end
1345
+
1346
+
1347
+
1348
+ # >---------------------------------[ Diagnostics ]----------------------------------<
1349
+
1350
+ # remove prefs which are diagnostically irrelevant
1351
+ redacted_prefs = prefs
1352
+ redacted_prefs.delete(:git)
1353
+ redacted_prefs.delete(:dev_webserver)
1354
+ redacted_prefs.delete(:prod_webserver)
1355
+ redacted_prefs.delete(:ban_spiders)
1356
+ redacted_prefs.delete(:jsruntime)
1357
+ redacted_prefs.delete(:rvmrc)
1358
+
1359
+ if diagnostics_prefs.include? redacted_prefs
1360
+ diagnostics[:prefs] = 'success'
1361
+ else
1362
+ diagnostics[:prefs] = 'fail'
1363
+ end
1364
+
1365
+
1366
+
1367
+ @current_recipe = nil
1368
+
1369
+ # >-----------------------------[ Run 'Bundle Install' ]-------------------------------<
1370
+
1371
+ say_wizard "Installing gems. This will take a while."
1372
+ if prefs.has_key? :bundle_path
1373
+ run "bundle install --without production --path #{prefs[:bundle_path]}"
1374
+ else
1375
+ run 'bundle install --without production'
1376
+ end
1377
+
1378
+ # >-----------------------------[ Run 'After Bundler' Callbacks ]-------------------------------<
1379
+
1380
+ say_wizard "Running 'after bundler' callbacks."
1381
+ require 'bundler/setup'
1382
+ if prefer :templates, 'haml'
1383
+ say_wizard "importing html2haml conversion tool"
1384
+ require 'haml/html'
1385
+ end
1386
+ if prefer :templates, 'slim'
1387
+ say_wizard "importing html2haml and haml2slim conversion tools"
1388
+ require 'haml/html'
1389
+ require 'haml2slim'
1390
+ end
1391
+ @after_blocks.each{|b| config = @configs[b[0]] || {}; @current_recipe = b[0]; b[1].call}
1392
+
1393
+ # >-----------------------------[ Run 'After Everything' Callbacks ]-------------------------------<
1394
+
1395
+ @current_recipe = nil
1396
+ say_wizard "Running 'after everything' callbacks."
1397
+ @after_everything_blocks.each{|b| config = @configs[b[0]] || {}; @current_recipe = b[0]; b[1].call}
1398
+
1399
+ @current_recipe = nil
1400
+ if diagnostics[:recipes] == 'success'
1401
+ say_wizard("WOOT! The recipes you've selected are known to work together.")
1402
+ say_wizard("If they don't, open an issue for rails_apps_composer on GitHub.")
1403
+ else
1404
+ say_wizard("\033[1m\033[36m" + "WARNING! The recipes you've selected might not work together." + "\033[0m")
1405
+ say_wizard("Help us out by reporting whether this combination works or fails.")
1406
+ say_wizard("Please open an issue for rails_apps_composer on GitHub.")
1407
+ say_wizard("Your new application will contain diagnostics in its README file.")
1408
+ end
1409
+ if diagnostics[:prefs] == 'success'
1410
+ say_wizard("WOOT! The preferences you've selected are known to work together.")
1411
+ say_wizard("If they don't, open an issue for rails_apps_composer on GitHub.")
1412
+ else
1413
+ say_wizard("\033[1m\033[36m" + "WARNING! The preferences you've selected might not work together." + "\033[0m")
1414
+ say_wizard("Help us out by reporting whether this combination works or fails.")
1415
+ say_wizard("Please open an issue for rails_apps_composer on GitHub.")
1416
+ say_wizard("Your new application will contain diagnostics in its README file.")
1417
+ end
1418
+ say_wizard "Finished running the rails_apps_composer app template."
1419
+ say_wizard "Your new Rails app is ready. Time to run 'bundle install'."