-
-
Notifications
You must be signed in to change notification settings - Fork 530
/
app_builder.rb
310 lines (249 loc) · 8.55 KB
/
app_builder.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
module Suspenders
class AppBuilder < Rails::AppBuilder
include Suspenders::Actions
def readme
template 'README.md.erb', 'README.md'
end
def remove_public_index
remove_file 'public/index.html'
end
def remove_rails_logo_image
remove_file 'app/assets/images/rails.png'
end
def raise_delivery_errors
replace_in_file 'config/environments/development.rb',
'raise_delivery_errors = false', 'raise_delivery_errors = true'
end
def provide_setup_script
copy_file 'bin_setup', 'bin/setup'
run 'chmod a+x bin/setup'
end
def enable_factory_girl_syntax
copy_file 'factory_girl_syntax_rspec.rb', 'spec/support/factory_girl.rb'
end
def test_factories_first
copy_file 'factories_spec.rb', 'spec/models/factories_spec.rb'
append_file 'Rakefile', factories_spec_rake_task
end
def configure_smtp
copy_file 'smtp.rb', 'config/initializers/smtp.rb'
prepend_file 'config/environments/production.rb',
"require Rails.root.join('config/initializers/smtp')\n"
config = <<-RUBY
config.action_mailer.delivery_method = :smtp
config.action_mailer.smtp_settings = SMTP_SETTINGS
RUBY
inject_into_file 'config/environments/production.rb', config,
:after => 'config.action_mailer.raise_delivery_errors = false'
end
def setup_staging_environment
run 'cp config/environments/production.rb config/environments/staging.rb'
prepend_file 'config/environments/staging.rb',
"Mail.register_interceptor RecipientInterceptor.new(ENV['EMAIL_RECIPIENTS'])\n"
end
def initialize_on_precompile
inject_into_file 'config/application.rb',
"\n config.assets.initialize_on_precompile = false",
:after => 'config.assets.enabled = true'
end
def create_partials_directory
empty_directory 'app/views/application'
end
def create_shared_flashes
copy_file '_flashes.html.erb', 'app/views/application/_flashes.html.erb'
end
def create_shared_javascripts
copy_file '_javascript.html.erb', 'app/views/application/_javascript.html.erb'
end
def create_application_layout
template 'suspenders_layout.html.erb.erb',
'app/views/layouts/application.html.erb',
:force => true
end
def create_common_javascripts
directory 'javascripts', 'app/assets/javascripts'
end
def add_jquery_ui
inject_into_file 'app/assets/javascripts/application.js',
"//= require jquery-ui\n", :before => '//= require_tree .'
end
def use_postgres_config_template
template 'postgresql_database.yml.erb', 'config/database.yml',
:force => true
end
def create_database
bundle_command 'exec rake db:create'
end
def replace_gemfile
remove_file 'Gemfile'
copy_file 'Gemfile_clean', 'Gemfile'
end
def set_ruby_to_version_being_used
inject_into_file 'Gemfile', "\n\nruby '#{RUBY_VERSION}'",
after: /source 'https:\/\/rubygems.org'/
end
def enable_database_cleaner
replace_in_file 'spec/spec_helper.rb',
'config.use_transactional_fixtures = true',
'config.use_transactional_fixtures = false'
copy_file 'database_cleaner_rspec.rb', 'spec/support/database_cleaner.rb'
end
def configure_rspec
remove_file '.rspec'
copy_file 'rspec', '.rspec'
prepend_file 'spec/spec_helper.rb', simplecov_init
replace_in_file 'spec/spec_helper.rb',
'# config.mock_with :mocha',
'config.mock_with :mocha'
rspec_expect_syntax = <<-RUBY
config.expect_with :rspec do |c|
c.syntax = :expect
end
RUBY
config = <<-RUBY
config.generators do |generate|
generate.test_framework :rspec
generate.helper false
generate.stylesheets false
generate.javascript_engine false
generate.view_specs false
end
RUBY
inject_into_file 'spec/spec_helper.rb', rspec_expect_syntax,
:after => 'RSpec.configure do |config|'
inject_into_class 'config/application.rb', 'Application', config
end
def blacklist_active_record_attributes
replace_in_file 'config/application.rb',
'config.active_record.whitelist_attributes = true',
'config.active_record.whitelist_attributes = false'
end
def configure_strong_parameters
copy_file 'strong_parameters.rb', 'config/initializers/strong_parameters.rb'
end
def configure_time_zone
config = <<-RUBY
config.active_record.default_timezone = :utc
RUBY
inject_into_class 'config/application.rb', 'Application', config
end
def configure_time_formats
remove_file 'config/locales/en.yml'
copy_file 'config_locales_en.yml', 'config/locales/en.yml'
end
def configure_rack_timeout
copy_file 'rack_timeout.rb', 'config/initializers/rack_timeout.rb'
end
def configure_action_mailer
action_mailer_host 'development', "#{app_name}.local"
action_mailer_host 'test', 'www.example.com'
action_mailer_host 'staging', "staging.#{app_name}.com"
action_mailer_host 'production', "#{app_name}.com"
end
def generate_rspec
generate 'rspec:install'
end
def configure_capybara_webkit
append_file 'spec/spec_helper.rb' do
"\nCapybara.javascript_driver = :webkit"
end
end
def generate_clearance
generate 'clearance:install'
end
def configure_unicorn
copy_file 'unicorn.rb', 'config/unicorn.rb'
end
def setup_foreman
copy_file 'sample.env', '.sample.env'
copy_file 'Procfile', 'Procfile'
end
def setup_stylesheets
copy_file 'app/assets/stylesheets/application.css',
'app/assets/stylesheets/application.css.scss'
remove_file 'app/assets/stylesheets/application.css'
concat_file 'import_scss_styles', 'app/assets/stylesheets/application.css.scss'
create_file 'app/assets/stylesheets/_screen.scss'
end
def gitignore_files
concat_file 'suspenders_gitignore', '.gitignore'
[
'app/models',
'app/assets/images',
'app/views/pages',
'db/migrate',
'log',
'spec/support',
'spec/lib',
'spec/models',
'spec/views',
'spec/controllers',
'spec/helpers',
'spec/support/matchers',
'spec/support/mixins',
'spec/support/shared_examples'
].each do |dir|
empty_directory_with_gitkeep dir
end
end
def init_git
run 'git init'
end
def create_heroku_apps
path_addition = override_path_for_tests
run "#{path_addition} heroku create #{app_name}-production --remote=production"
run "#{path_addition} heroku create #{app_name}-staging --remote=staging"
run "#{path_addition} heroku config:add RACK_ENV=staging RAILS_ENV=staging --remote=staging"
end
def create_github_repo(repo_name)
path_addition = override_path_for_tests
run "#{path_addition} hub create #{repo_name}"
end
def copy_miscellaneous_files
copy_file 'errors.rb', 'config/initializers/errors.rb'
end
def customize_error_pages
meta_tags =<<-EOS
<meta charset='utf-8' />
<meta name='ROBOTS' content='NOODP' />
EOS
style_tags =<<-EOS
<link href='/assets/application.css' media='all' rel='stylesheet' type='text/css' />
EOS
%w(500 404 422).each do |page|
inject_into_file "public/#{page}.html", meta_tags, :after => "<head>\n"
replace_in_file "public/#{page}.html", /<style.+>.+<\/style>/mi, style_tags.strip
replace_in_file "public/#{page}.html", /<!--.+-->\n/, ''
end
end
def remove_routes_comment_lines
replace_in_file 'config/routes.rb',
/Application\.routes\.draw do.*end/m,
"Application.routes.draw do\nend"
end
def add_email_validator
copy_file 'email_validator.rb', 'app/validators/email_validator.rb'
end
def disable_xml_params
copy_file 'disable_xml_params.rb', 'config/initializers/disable_xml_params.rb'
end
def setup_default_rake_task
append_file 'Rakefile' do
"task(:default).clear\ntask :default => [:spec]"
end
end
private
def override_path_for_tests
if ENV['TESTING']
support_bin = File.expand_path(File.join('..', '..', '..', 'features', 'support', 'bin'))
"PATH=#{support_bin}:$PATH"
end
end
def factories_spec_rake_task
IO.read find_in_source_paths('factories_spec_rake_task.rb')
end
def simplecov_init
IO.read find_in_source_paths('simplecov_init.rb')
end
end
end