orats 0.2.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.
@@ -0,0 +1,809 @@
1
+ # =====================================================================================================
2
+ # Template for generating an opinionated base Rails 4.0.2 project using Ruby 2.1.0
3
+ # =====================================================================================================
4
+
5
+ # ----- Helper functions and variables ----------------------------------------------------------------
6
+
7
+ require 'securerandom'
8
+
9
+ def generate_token
10
+ SecureRandom.hex(64)
11
+ end
12
+
13
+ def from_gem(source, destination = nil)
14
+ base_path = "#{File.expand_path File.dirname(__FILE__)}/../includes"
15
+ file_name = source.split('/').last
16
+
17
+ if destination.present? && file_name != destination
18
+ if destination.include? '/'
19
+ run "mkdir -p #{destination}"
20
+ end
21
+ end
22
+
23
+ run "cp #{base_path}/#{file_name} #{destination}"
24
+ end
25
+
26
+ app_name_upper = app_name.upcase
27
+ app_name_class = app_name.humanize
28
+
29
+ # ----- Create the git repo ----------------------------------------------------------------------------
30
+
31
+ puts
32
+ say_status 'git', 'Creating a new local git repo...', :yellow
33
+ puts '-'*80, ''; sleep 0.25
34
+
35
+ git :init
36
+ git add: '.'
37
+ git commit: "-m 'Initial commit'"
38
+
39
+ # ----- Modify the .gitignore file --------------------------------------------------------------------
40
+
41
+ puts
42
+ say_status 'root', 'Modifying the .gitignore file...', :yellow
43
+ puts '-'*80, ''; sleep 0.25
44
+
45
+ append_to_file '.gitignore' do <<-TEXT
46
+
47
+ # Ignore OS and editor files.
48
+ .DS_Store
49
+ */**.DS_Store
50
+ ._*
51
+ .*.sw*
52
+ *~
53
+ .idea/
54
+
55
+ # Ignore the main environment file.
56
+ .env
57
+ TEXT
58
+ end
59
+
60
+ git add: '.'
61
+ git commit: "-m 'Add common OS and editor files to the .gitignore file'"
62
+
63
+ # ----- Create a few root files -----------------------------------------------------------------------
64
+
65
+ puts
66
+ say_status 'root', 'Creating root files...', :yellow
67
+ puts '-'*80, ''; sleep 0.25
68
+
69
+ file '.ruby-version', '2.1.0'
70
+
71
+ git add: '.'
72
+ git commit: "-m 'Add .ruby-version file for common ruby version managers'"
73
+
74
+ file 'Procfile' do <<-CODE
75
+ web: puma -C config/puma.rb
76
+ worker: sidekiq -C config/sidekiq.yml
77
+ CODE
78
+ end
79
+
80
+ git add: '.'
81
+ git commit: "-m 'Add a basic Procfile to start the puma and sidekiq processes'"
82
+
83
+ # ----- Create an .env file ---------------------------------------------------------------------------
84
+
85
+ puts
86
+ say_status 'root', 'Creating .env file...', :yellow
87
+ puts '-'*80, ''; sleep 0.25
88
+
89
+ file '.env' do <<-CODE
90
+ #{app_name_upper}_TOKEN_RAILS_SECRET: #{generate_token}
91
+
92
+ #{app_name_upper}_SMTP_ADDRESS: smtp.gmail.com
93
+ #{app_name_upper}_SMTP_PORT: 587
94
+ #{app_name_upper}_SMTP_DOMAIN: gmail.com
95
+ #{app_name_upper}_SMTP_USERNAME: #{app_name}@gmail.com
96
+ #{app_name_upper}_SMTP_PASSWORD: thebestpassword
97
+ #{app_name_upper}_SMTP_AUTH: plain
98
+ #{app_name_upper}_SMTP_STARTTTLS_AUTO: true
99
+
100
+ #{app_name_upper}_ACTION_MAILER_HOST: localhost:3000
101
+ #{app_name_upper}_ACTION_MAILER_DEFAULT_EMAIL: info@#{app_name}.com
102
+
103
+ #{app_name_upper}_DATABASE_NAME: #{app_name}
104
+ #{app_name_upper}_DATABASE_HOST: localhost
105
+ #{app_name_upper}_DATABASE_POOL: 25
106
+ #{app_name_upper}_DATABASE_TIMEOUT: 5000
107
+ #{app_name_upper}_DATABASE_USERNAME: postgres
108
+ #{app_name_upper}_DATABASE_PASSWORD: supersecrets
109
+
110
+ #{app_name_upper}_CACHE_HOST: localhost
111
+ #{app_name_upper}_CACHE_PORT: 6379
112
+ #{app_name_upper}_CACHE_DATABASE: 0
113
+
114
+ #{app_name_upper}_PUMA_THREADS_MIN: 0
115
+ #{app_name_upper}_PUMA_THREADS_MAX: 1
116
+ #{app_name_upper}_PUMA_WORKERS: 0
117
+
118
+ #{app_name_upper}_SIDEKIQ_CONCURRENCY: 25
119
+ CODE
120
+ end
121
+
122
+ # ----- Modify the secret token -----------------------------------------------------------------------
123
+
124
+ gsub_file 'config/initializers/secret_token.rb', /'\w{128}'/, "ENV['#{app_name_upper}_TOKEN_RAILS_SECRET']"
125
+
126
+
127
+ # ----- Modify the application file -------------------------------------------------------------------
128
+
129
+ puts
130
+ say_status 'config', 'Modifying the application file...', :yellow
131
+ puts '-'*80, ''; sleep 0.25
132
+
133
+ inject_into_file 'config/application.rb', after: "automatically loaded.\n" do <<-CODE
134
+ config.x.track.google_analytics = ''
135
+ config.x.track.disqus_shortname = 'test-#{app_name}'
136
+ config.x.email.default_to = ENV['#{app_name_upper}_ACTION_MAILER_DEFAULT_EMAIL']
137
+
138
+ config.action_mailer.delivery_method = :smtp
139
+ config.action_mailer.smtp_settings = {
140
+ :address => ENV['#{app_name_upper}_SMTP_ADDRESS'],
141
+ :port => ENV['#{app_name_upper}_SMTP_PORT'].to_i,
142
+ :domain => ENV['#{app_name_upper}_SMTP_DOMAIN'],
143
+ :user_name => ENV['#{app_name_upper}_SMTP_USERNAME'],
144
+ :password => ENV['#{app_name_upper}_SMTP_PASSWORD'],
145
+ :authentication => ENV['#{app_name_upper}_SMTP_AUTH'].to_sym,
146
+ :enable_starttls_auto => ENV['#{app_name_upper}_SMTP_STARTTTLS_AUTO'] == 'true'
147
+ }
148
+
149
+ config.action_mailer.default_url_options = { host: ENV['#{app_name_upper}_ACTION_MAILER_HOST'] }
150
+
151
+ config.cache_store = :redis_store, { host: ENV['#{app_name_upper}_CACHE_HOST'],
152
+ port: ENV['#{app_name_upper}_CACHE_PORT'].to_i,
153
+ db: ENV['#{app_name_upper}_CACHE_DATABASE'].to_i,
154
+ namespace: '#{app_name}::cache'
155
+ }
156
+ CODE
157
+ end
158
+
159
+ gsub_file 'config/application.rb', "# config.time_zone = 'Central Time (US & Canada)'", "config.time_zone = 'Eastern Time (US & Canada)'"
160
+
161
+ append_file 'config/application.rb' do <<-'FILE'
162
+
163
+ ActionView::Base.field_error_proc = Proc.new do |html_tag, instance|
164
+ if html_tag =~ /\<label/
165
+ html_tag
166
+ else
167
+ errors = Array(instance.error_message).join(',')
168
+ %(#{html_tag}<p class="validation-error"> #{errors}</p>).html_safe
169
+ end
170
+ end
171
+ FILE
172
+ end
173
+
174
+ git add: '.'
175
+ git commit: "-m 'Add tweakable settings, update the timezone and change the way validation errors are shown'"
176
+
177
+ # ----- Modify the config files -----------------------------------------------------------------------
178
+
179
+ puts
180
+ say_status 'config', 'Modifying the config files...', :yellow
181
+ puts '-'*80, ''; sleep 0.25
182
+
183
+ gsub_file 'config/database.yml', /.*\n/, ''
184
+ append_file 'config/database.yml' do <<-FILE
185
+ development: &default
186
+ adapter: postgresql
187
+ database: <%= ENV['#{app_name_upper}_DATABASE_NAME'] %>
188
+ host: <%= ENV['#{app_name_upper}_DATABASE_HOST'] %>
189
+ pool: <%= ENV['#{app_name_upper}_DATABASE_POOL'] %>
190
+ timeout: <%= ENV['#{app_name_upper}_DATABASE_TIMEOUT'] %>
191
+ username: <%= ENV['#{app_name_upper}_DATABASE_USERNAME'] %>
192
+ password: <%= ENV['#{app_name_upper}_DATABASE_PASSWORD'] %>
193
+
194
+ test:
195
+ <<: *default
196
+ database: <%= ENV['#{app_name_upper}_DATABASE_NAME'] %>_test
197
+
198
+ staging:
199
+ <<: *default
200
+
201
+ production:
202
+ <<: *default
203
+ FILE
204
+ end
205
+
206
+ git add: '.'
207
+ git commit: "-m 'Dry up the database settings'"
208
+
209
+ file 'config/puma.rb', <<-CODE
210
+ threads ENV['#{app_name_upper}_PUMA_THREADS_MIN'].to_i,ENV['#{app_name_upper}_PUMA_THREADS_MAX'].to_i
211
+ workers ENV['#{app_name_upper}_PUMA_WORKERS'].to_i
212
+
213
+ pidfile '/tmp/puma.pid'
214
+
215
+ if ENV['RAILS_ENV'] == 'production'
216
+ bind 'unix:///tmp/puma.sock'
217
+ else
218
+ port '3000'
219
+ end
220
+
221
+ restart_command 'bundle exec puma'
222
+
223
+ on_worker_boot do
224
+ require 'active_record'
225
+ config_path = File.expand_path('../database.yml', __FILE__)
226
+
227
+ ActiveRecord::Base.connection.disconnect! rescue ActiveRecord::ConnectionNotEstablished
228
+ ActiveRecord::Base.establish_connection(ENV['DATABASE_URL'] || YAML.load_file(config_path)[ENV['RAILS_ENV']])
229
+ end
230
+ CODE
231
+
232
+ git add: '.'
233
+ git commit: "-m 'Add the puma config'"
234
+
235
+ file 'config/sidekiq.yml', <<-CODE
236
+ ---
237
+ :pidfile: /tmp/sidekiq.pid
238
+ :concurrency: <%= ENV['#{app_name_upper}_SIDEKIQ_CONCURRENCY'].to_i %>
239
+ :queues:
240
+ - default
241
+ CODE
242
+
243
+ git add: '.'
244
+ git commit: "-m 'Add the sidekiq config'"
245
+
246
+ file 'config/sitemap.rb', <<-'CODE'
247
+ # Set the host name for URL creation
248
+ SitemapGenerator::Sitemap.default_host = "http://www.app_name.com"
249
+
250
+ SitemapGenerator::Sitemap.create do
251
+ # Put links creation logic here.
252
+ #
253
+ # The root path '/' and sitemap index file are added automatically for you.
254
+ # Links are added to the Sitemap in the order they are specified.
255
+ #
256
+ # Examples:
257
+ #
258
+ # add root_path
259
+ # add foobar_path, priority: 0.7, changefreq: 'daily'
260
+ #
261
+ # Iteration example:
262
+ #
263
+ # Article.published.find_each do |article|
264
+ # add article_path("#{article.id}-#{article.permalink}"), priority: 0.9, lastmod: article.updated_at
265
+ # end
266
+ end
267
+ CODE
268
+
269
+ gsub_file 'config/sitemap.rb', 'app_name', app_name
270
+
271
+ git add: '.'
272
+ git commit: "-m 'Add the sitemap config'"
273
+
274
+ file 'config/schedule.rb', <<-CODE
275
+ every 1.day, at: '4:00 am' do
276
+ rake '-s sitemap:refresh'
277
+ end
278
+ CODE
279
+
280
+ git add: '.'
281
+ git commit: "-m 'Add a sitemap rake task that occurs at 4am'"
282
+
283
+ # ----- Modify the environment files ------------------------------------------------------------------
284
+
285
+ puts
286
+ say_status 'Config', 'Modifying the environment files...', :yellow
287
+ puts '-'*80, ''; sleep 0.25
288
+
289
+ file 'config/environments/staging.rb', <<-CODE
290
+ require_relative 'production.rb'
291
+
292
+ #{app_name_class}::Application.configure do
293
+ config.x.track.google_analytics = ''
294
+ config.x.track.disqus_shortname = 'test-#{app_name}'
295
+ end
296
+ CODE
297
+
298
+ git add: '.'
299
+ git commit: "-m 'Add tweakable settings'"
300
+
301
+ inject_into_file 'config/environments/production.rb', after: "config/application.rb.\n" do <<-"CODE"
302
+ config.x.track.google_analytics = 'YOUR_UA_CODE'
303
+ config.x.track.disqus_shortname = '#{app_name}'
304
+ CODE
305
+ end
306
+
307
+ inject_into_file 'config/environments/production.rb', after: "config.log_level = :info\n" do <<-"CODE"
308
+ config.logger = Logger.new(config.paths['log'].first, 'daily')
309
+ CODE
310
+ end
311
+
312
+ inject_into_file 'config/environments/production.rb', after: "%w( search.js )\n" do <<-"CODE"
313
+ config.assets.precompile << Proc.new { |path|
314
+ if path =~ /\.(eot|svg|ttf|woff|png)\z/
315
+ true
316
+ end
317
+ }
318
+ CODE
319
+ end
320
+
321
+ git add: '.'
322
+ git commit: "-m 'Add tweakable settings, setup daily log rotation and add fonts/pngs to the asset precompiler'"
323
+
324
+ # ----- Modify the initializer files ------------------------------------------------------------------
325
+
326
+ puts
327
+ say_status 'config', 'Modifying the initializer files...', :yellow
328
+ puts '-'*80, ''; sleep 0.25
329
+
330
+ file 'config/initializers/sidekiq.rb', <<-'CODE'
331
+ Sidekiq.configure_server do |config|
332
+ config.redis = { url: "redis://#{ENV['app_name_CACHE_HOST']}:#{ENV['app_name_CACHE_PORT']}/#{ENV['app_name_CACHE_DATABASE']}", namespace: "ns_app::sidekiq_#{Rails.env}" }
333
+ end
334
+
335
+ Sidekiq.configure_client do |config|
336
+ config.redis = { url: "redis://#{ENV['app_name_CACHE_HOST']}:#{ENV['app_name_CACHE_PORT']}/#{ENV['app_name_CACHE_DATABASE']}", namespace: "ns_app::sidekiq_#{Rails.env}" }
337
+ end
338
+ CODE
339
+
340
+ gsub_file 'config/initializers/sidekiq.rb', 'app_name', app_name_upper
341
+ gsub_file 'config/initializers/sidekiq.rb', 'ns_app', app_name
342
+
343
+ git add: '.'
344
+ git commit: "-m 'Add the sidekiq initializer'"
345
+
346
+ file 'config/initializers/mini_profiler.rb', <<-CODE
347
+ if defined? Rack::MiniProfiler
348
+ # Toggle with ALT+p
349
+ Rack::MiniProfiler.config.start_hidden = true
350
+ end
351
+ CODE
352
+
353
+ git add: '.'
354
+ git commit: "-m 'Add the rack mini profiler initializer'"
355
+
356
+ # ----- Modify the routes file ------------------------------------------------------------------------
357
+
358
+ puts
359
+ say_status 'config', 'Modifying the routes file...', :yellow
360
+ puts '-'*80, ''; sleep 0.25
361
+
362
+ prepend_file 'config/routes.rb', "require 'sidekiq/web'\n\n"
363
+
364
+ git add: '.'
365
+ git commit: "-m 'Add sidekiq to the routes file'"
366
+
367
+ inject_into_file 'config/routes.rb', after: "draw do\n" do <<-CODE
368
+ concern :pageable do
369
+ get 'page/:page', action: :index, on: :collection
370
+ end
371
+ CODE
372
+ end
373
+
374
+ git add: '.'
375
+ git commit: "-m 'Add a route concern for pagination'"
376
+
377
+ # ----- Creating application tasks --------------------------------------------------------------------
378
+
379
+ puts
380
+ say_status 'Tasks', 'Creating application tasks...', :yellow
381
+ puts '-'*80, ''; sleep 0.25
382
+
383
+ file 'lib/tasks/favicon.rake', <<-'CODE'
384
+ namespace :assets do
385
+ desc 'Create favicons from a single base png'
386
+ task favicon: :environment do
387
+ require 'favicon_maker'
388
+
389
+ options = {
390
+ versions: [:apple_144, :apple_120, :apple_114, :apple_72, :apple_57, :apple_pre, :apple, :fav_png, :fav_ico],
391
+ custom_versions: {
392
+ apple_extreme_retina: {
393
+ filename: 'apple-touch-icon-228x228-precomposed.png', dimensions: '228x228', format: 'png'
394
+ },
395
+ speeddial: {
396
+ filename: 'speeddial-160px.png', dimensions: '160x160', format: 'png'
397
+ }
398
+ },
399
+ root_dir: Rails.root,
400
+ input_dir: File.join('app', 'assets', 'favicon'),
401
+ base_image: 'favicon_base.png',
402
+ output_dir: File.join('app', 'assets', 'images'),
403
+ copy: true
404
+ }
405
+
406
+ FaviconMaker::Generator.create_versions(options) do |filepath|
407
+ puts "Created favicon: #{filepath}"
408
+ end
409
+ end
410
+ end
411
+ CODE
412
+
413
+ git add: '.'
414
+ git commit: "-m 'Add a favicon generator task'"
415
+
416
+ # ----- Creating application helpers ------------------------------------------------------------------
417
+
418
+ puts
419
+ say_status 'helpers', 'Creating application helpers...', :yellow
420
+ puts '-'*80, ''; sleep 0.25
421
+
422
+ inject_into_file 'app/helpers/application_helper.rb', after: "ApplicationHelper\n" do <<-CODE
423
+ def title(page_title)
424
+ content_for(:title) { page_title }
425
+ end
426
+
427
+ def meta_description(page_meta_description)
428
+ content_for(:meta_description) { page_meta_description }
429
+ end
430
+
431
+ def heading(page_heading)
432
+ content_for(:heading) { page_heading }
433
+ end
434
+
435
+ def link_to_all_favicons
436
+ capture do
437
+ concat favicon_link_tag 'speeddial-160px.png', rel: 'icon', type: 'image/png'
438
+ concat favicon_link_tag 'favicon.ico', rel: 'icon', type: 'image/x-icon'
439
+ concat favicon_link_tag 'favicon.ico', rel: 'shortcut icon', type: 'image/x-icon'
440
+ concat favicon_link_tag 'favicon.png', rel: 'icon', type: 'image/png'
441
+ concat favicon_link_tag 'apple-touch-icon-228x228-precomposed.png', sizes: '72x72', rel: 'apple-touch-icon-precomposed', type: 'image/png'
442
+ concat favicon_link_tag 'apple-touch-icon-144x144-precomposed.png', sizes: '144x144', rel: 'apple-touch-icon-precomposed', type: 'image/png'
443
+ concat favicon_link_tag 'apple-touch-icon-120x120-precomposed.png', sizes: '120x120', rel: 'apple-touch-icon-precomposed', type: 'image/png'
444
+ concat favicon_link_tag 'apple-touch-icon-114x114-precomposed.png', sizes: '114x114', rel: 'apple-touch-icon-precomposed', type: 'image/png'
445
+ concat favicon_link_tag 'apple-touch-icon-72x72-precomposed.png', sizes: '72x72', rel: 'apple-touch-icon-precomposed', type: 'image/png'
446
+ concat favicon_link_tag 'apple-touch-icon-57x57-precomposed.png', sizes: '57x57', rel: 'apple-touch-icon-precomposed', type: 'image/png'
447
+ concat favicon_link_tag 'apple-touch-icon-precomposed.png', sizes: '57x54', rel: 'apple-touch-icon-precomposed', type: 'image/png'
448
+ concat favicon_link_tag 'apple-touch-icon.png', sizes: '57x54', rel: 'apple-touch-icon', type: 'image/png'
449
+ end
450
+ end
451
+
452
+ def humanize_boolean(input)
453
+ input ||= ''
454
+
455
+ case input.to_s.downcase
456
+ when 't', 'true'
457
+ 'Yes'
458
+ else
459
+ 'No'
460
+ end
461
+ end
462
+
463
+ def css_for_boolean(input)
464
+ if input
465
+ 'success'
466
+ else
467
+ 'danger'
468
+ end
469
+ end
470
+ CODE
471
+ end
472
+
473
+ git add: '.'
474
+ git commit: "-m 'Add favicon and boolean view helpers'"
475
+
476
+ # ----- Creating view files ---------------------------------------------------------------------------
477
+
478
+ puts
479
+ say_status 'views', 'Creating view files...', :yellow
480
+ puts '-'*80, ''; sleep 0.25
481
+
482
+ run 'rm -f app/views/layouts/application.html.erb'
483
+
484
+ file 'app/views/layouts/application.html.erb', <<-HTML
485
+ <!doctype html>
486
+ <html lang="en">
487
+ <head>
488
+ <title><%= yield :title %></title>
489
+ <meta charset="utf-8" />
490
+ <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
491
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
492
+ <meta name="description" content="<%= yield :meta_description %>" />
493
+ <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %>
494
+ <%= javascript_include_tag '//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js', 'application', 'data-turbolinks-track' => true %>
495
+ <%= csrf_meta_tags %>
496
+ <%= link_to_all_favicons %>
497
+ <!--[if lt IE 9]>
498
+ <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7/html5shiv.js"></script>
499
+ <script src="//cdnjs.cloudflare.com/ajax/libs/json3/3.3.0/json3.min.js"></script>
500
+ <script src="//cdnjs.cloudflare.com/ajax/libs/respond.js/1.4.2/respond.js"></script>
501
+ <![endif]-->
502
+ </head>
503
+ <body>
504
+ <header>
505
+ <%= render 'layouts/navigation' %>
506
+ </header>
507
+
508
+ <main role="main" class="container">
509
+ <div class="page-header">
510
+ <h1><%= yield :heading %></h1>
511
+ </div>
512
+ <%= render 'layouts/flash' %>
513
+ <%= yield %>
514
+ </main>
515
+
516
+ <footer>
517
+ <hr />
518
+ <div class="container">
519
+ <%= render 'layouts/footer' %>
520
+ </div>
521
+ </footer>
522
+
523
+ <% render 'layouts/google_analytics' %>
524
+ </body>
525
+ </html>
526
+ HTML
527
+
528
+ git add: '.'
529
+ git commit: "-m 'Add new layout view'"
530
+
531
+ file 'app/views/layouts/_flash.html.erb', <<-'HTML'
532
+ <% flash.each do |key, msg| %>
533
+ <% unless key == :timedout %>
534
+ <%= content_tag :div, class: "alert alert-dismissable alert-#{key}" do -%>
535
+ <button type="button" class="close" data-dismiss="alert" aria-hidden="true">
536
+ &times;
537
+ </button>
538
+ <%= msg %>
539
+ <% end %>
540
+ <% end %>
541
+ <% end %>
542
+ HTML
543
+
544
+ git add: '.'
545
+ git commit: "-m 'Add flash message partial'"
546
+
547
+ file 'app/views/layouts/_navigation.html.erb', <<-HTML
548
+ <nav class="navbar navbar-default">
549
+ <div class="container">
550
+ <div class="navbar-header">
551
+ <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
552
+ <span class="sr-only">Toggle navigation</span>
553
+ <span class="icon-bar"></span>
554
+ <span class="icon-bar"></span>
555
+ <span class="icon-bar"></span>
556
+ </button>
557
+ <%= link_to '#{app_name}', '#root_path_would_go_here', class: 'navbar-brand' %>
558
+ </div>
559
+ <div class="collapse navbar-collapse">
560
+ <ul class="nav navbar-nav">
561
+ <%= render 'layouts/navigation_links' %>
562
+ </ul>
563
+ </div>
564
+ </div>
565
+ </nav>
566
+ HTML
567
+
568
+ git add: '.'
569
+ git commit: "-m 'Add navigation partial'"
570
+
571
+ file 'app/views/layouts/_navigation_links.html.erb', <<-HTML
572
+ <li class="active">
573
+ <%= link_to 'Bar', '#' %>
574
+ </li>
575
+ HTML
576
+
577
+ git add: '.'
578
+ git commit: "-m 'Add navigation links partial'"
579
+
580
+ file 'app/views/layouts/_footer.html.erb', <<-HTML
581
+ <p class="text-muted">&copy; #{Time.now.year.to_s} #{app_name} - All rights reserved</p>
582
+ HTML
583
+
584
+ git add: '.'
585
+ git commit: "-m 'Add footer partial'"
586
+
587
+ file 'app/views/layouts/_google_analytics.html.erb', <<-HTML
588
+ HTML
589
+
590
+ git add: '.'
591
+ git commit: "-m 'Add google analytics partial'"
592
+
593
+ # ----- Creating public files -------------------------------------------------------------------------
594
+
595
+ puts
596
+ say_status 'public', 'Creating public files...', :yellow
597
+ puts '-'*80, ''; sleep 0.25
598
+
599
+ run 'rm -f public/404.html'
600
+ run 'rm -f public/422.html'
601
+ run 'rm -f public/500.html'
602
+
603
+ file 'public/404.html', <<-HTML
604
+ <!DOCTYPE html>
605
+ <html>
606
+ <head>
607
+ <title>Error 404</title>
608
+ <meta charset="utf-8" />
609
+ <style>
610
+ </style>
611
+ </head>
612
+
613
+ <body>
614
+ <h1>Error 404</h1>
615
+ </body>
616
+ </html>
617
+ HTML
618
+
619
+ file 'public/422.html', <<-HTML
620
+ <!DOCTYPE html>
621
+ <html>
622
+ <head>
623
+ <title>Error 422</title>
624
+ <meta charset="utf-8" />
625
+ <style>
626
+ </style>
627
+ </head>
628
+
629
+ <body>
630
+ <h1>Error 422</h1>
631
+ </body>
632
+ </html>
633
+ HTML
634
+
635
+ file 'public/500.html', <<-HTML
636
+ <!DOCTYPE html>
637
+ <html>
638
+ <head>
639
+ <title>Error 500</title>
640
+ <meta charset="utf-8" />
641
+ <style>
642
+ </style>
643
+ </head>
644
+
645
+ <body>
646
+ <h1>Error 500</h1>
647
+ </body>
648
+ </html>
649
+ HTML
650
+
651
+ file 'public/502.html', <<-HTML
652
+ <!DOCTYPE html>
653
+ <html>
654
+ <head>
655
+ <title>Error 502</title>
656
+ <meta charset="utf-8" />
657
+ <style>
658
+ </style>
659
+ </head>
660
+
661
+ <body>
662
+ <h1>Error 502</h1>
663
+ </body>
664
+ </html>
665
+ HTML
666
+
667
+ git add: '.'
668
+ git commit: "-m 'Add public 404, 422, 500 and 502 error pages'"
669
+
670
+ # ----- Modifying sass files --------------------------------------------------------------------------
671
+
672
+ puts
673
+ say_status 'assets', 'Modifying sass files...', :yellow
674
+ puts '-'*80, ''; sleep 0.25
675
+
676
+ run 'mv app/assets/stylesheets/application.css app/assets/stylesheets/application.css.scss'
677
+
678
+ git add: '.'
679
+ git commit: "-m 'Rename application.css to application.scss'"
680
+ git add: '-u'
681
+
682
+ inject_into_file 'app/assets/stylesheets/application.css.scss',
683
+ " *= require font-awesome\n",
684
+ before: " *= require_self\n"
685
+
686
+ git add: '.'
687
+ git commit: "-m 'Add font-awesome to the application.scss file'"
688
+
689
+ append_file 'app/assets/stylesheets/application.css.scss' do <<-SCSS
690
+
691
+ // Core variables and mixins
692
+ @import "bootstrap/variables";
693
+ @import "bootstrap/mixins";
694
+
695
+ // Reset
696
+ @import "bootstrap/normalize";
697
+ @import "bootstrap/print";
698
+
699
+ // Core CSS
700
+ @import "bootstrap/scaffolding";
701
+ @import "bootstrap/type";
702
+ @import "bootstrap/code";
703
+ @import "bootstrap/grid";
704
+ @import "bootstrap/tables";
705
+ @import "bootstrap/forms";
706
+ @import "bootstrap/buttons";
707
+
708
+ // Components
709
+ @import "bootstrap/component-animations";
710
+ // @import "bootstrap/glyphicons";
711
+ @import "bootstrap/dropdowns";
712
+ @import "bootstrap/button-groups";
713
+ @import "bootstrap/input-groups";
714
+ @import "bootstrap/navs";
715
+ @import "bootstrap/navbar";
716
+ @import "bootstrap/breadcrumbs";
717
+ @import "bootstrap/pagination";
718
+ @import "bootstrap/pager";
719
+ @import "bootstrap/labels";
720
+ @import "bootstrap/badges";
721
+ @import "bootstrap/jumbotron";
722
+ @import "bootstrap/thumbnails";
723
+ @import "bootstrap/alerts";
724
+ @import "bootstrap/progress-bars";
725
+ @import "bootstrap/media";
726
+ @import "bootstrap/list-group";
727
+ @import "bootstrap/panels";
728
+ @import "bootstrap/wells";
729
+ @import "bootstrap/close";
730
+
731
+ // Components w/ JavaScript
732
+ @import "bootstrap/modals";
733
+ @import "bootstrap/tooltip";
734
+ @import "bootstrap/popovers";
735
+ @import "bootstrap/carousel";
736
+
737
+ // Utility classes
738
+ @import "bootstrap/utilities";
739
+ @import "bootstrap/responsive-utilities";
740
+
741
+ .alert-notice {
742
+ @extend .alert-success;
743
+ }
744
+
745
+ .alert-alert {
746
+ @extend .alert-danger;
747
+ }
748
+
749
+ img {
750
+ @extend .img-responsive;
751
+ margin: 0 auto;
752
+ }
753
+
754
+ .validation-error {
755
+ margin-top: 2px;
756
+ color: $brand-danger;
757
+ font-size: $font-size-small;
758
+ }
759
+ SCSS
760
+ end
761
+
762
+ # ----- Modifying javascript and coffeescript files ------------------------------------------------------------------
763
+
764
+ puts
765
+ say_status 'assets', 'Modifying javascript and coffeescript files...', :yellow
766
+ puts '-'*80, ''; sleep 0.25
767
+
768
+ gsub_file 'app/assets/javascripts/application.js', "//= require jquery\n", ''
769
+
770
+ git add: '.'
771
+ git commit: "-m 'Remove jquery from the application.js file because it is loaded from a CDN'"
772
+
773
+ inject_into_file 'app/assets/javascripts/application.js',
774
+ "//= require jquery.turbolinks\n",
775
+ before: "//= require_tree .\n"
776
+
777
+ git add: '.'
778
+ git commit: "-m 'Add jquery-turbolinks to the application.js file'"
779
+
780
+ inject_into_file 'app/assets/javascripts/application.js', before: "//= require_tree .\n" do <<-CODE
781
+ //= require bootstrap/affix
782
+ //= require bootstrap/alert
783
+ //= require bootstrap/button
784
+ //= require bootstrap/carousel
785
+ //= require bootstrap/collapse
786
+ //= require bootstrap/dropdown
787
+ //= require bootstrap/modal
788
+ //= require bootstrap/popover
789
+ //= require bootstrap/scrollspy
790
+ //= require bootstrap/tab
791
+ //= require bootstrap/tooltip
792
+ //= require bootstrap/transition
793
+ CODE
794
+ end
795
+
796
+ git add: '.'
797
+ git commit: "-m 'Add bootstrap to the application.js file'"
798
+
799
+ # ----- Modifying gem file ----------------------------------------------------------------------------
800
+
801
+ puts
802
+ say_status 'root', 'Copying Gemfile...', :yellow
803
+ puts '-'*80, ''; sleep 0.25
804
+
805
+ run 'rm -f Gemfile'
806
+ from_gem 'Gemfile', 'Gemfile'
807
+
808
+ git add: '.'
809
+ git commit: "-m 'Add basic gems to the Gemfile'"