onotole 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +6 -0
- data/.rubocop.yml +44 -0
- data/.ruby-version +1 -0
- data/.travis.yml +11 -0
- data/Gemfile +3 -0
- data/Guardfile +60 -0
- data/LICENSE +19 -0
- data/README.md +288 -0
- data/Rakefile +8 -0
- data/bin/onotole +35 -0
- data/bin/rake +16 -0
- data/bin/rspec +16 -0
- data/bin/setup +13 -0
- data/lib/onotole.rb +6 -0
- data/lib/onotole/actions.rb +33 -0
- data/lib/onotole/adapters/heroku.rb +125 -0
- data/lib/onotole/add_user_gems/after_install_patch.rb +119 -0
- data/lib/onotole/add_user_gems/before_bundle_patch.rb +137 -0
- data/lib/onotole/add_user_gems/edit_menu_questions.rb +80 -0
- data/lib/onotole/add_user_gems/user_gems_menu_questions.rb +17 -0
- data/lib/onotole/app_builder.rb +678 -0
- data/lib/onotole/colors.rb +20 -0
- data/lib/onotole/generators/app_generator.rb +299 -0
- data/lib/onotole/version.rb +6 -0
- data/onotole.gemspec +33 -0
- data/spec/adapters/heroku_spec.rb +52 -0
- data/spec/fakes/bin/heroku +5 -0
- data/spec/fakes/bin/hub +5 -0
- data/spec/features/github_spec.rb +15 -0
- data/spec/features/heroku_spec.rb +93 -0
- data/spec/features/new_project_spec.rb +204 -0
- data/spec/spec_helper.rb +20 -0
- data/spec/support/fake_github.rb +21 -0
- data/spec/support/fake_heroku.rb +51 -0
- data/spec/support/onotole.rb +59 -0
- data/templates/Gemfile.erb +61 -0
- data/templates/Procfile +2 -0
- data/templates/README.md.erb +30 -0
- data/templates/_analytics.html.erb +7 -0
- data/templates/_flashes.html.erb +7 -0
- data/templates/_javascript.html.erb +12 -0
- data/templates/action_mailer.rb +5 -0
- data/templates/app.json.erb +39 -0
- data/templates/application.scss +1 -0
- data/templates/bin_deploy +12 -0
- data/templates/bin_setup +21 -0
- data/templates/bin_setup_review_app.erb +19 -0
- data/templates/browserslist +4 -0
- data/templates/bundler_audit.rake +12 -0
- data/templates/capybara_webkit.rb +3 -0
- data/templates/circle.yml.erb +6 -0
- data/templates/config_locales_en.yml.erb +19 -0
- data/templates/database_cleaner_rspec.rb +22 -0
- data/templates/dev.rake +12 -0
- data/templates/devise_rspec.rb +3 -0
- data/templates/disable_xml_params.rb +1 -0
- data/templates/dotfiles/.ctags +2 -0
- data/templates/dotfiles/.env +13 -0
- data/templates/dotfiles/.rspec +3 -0
- data/templates/errors.rb +34 -0
- data/templates/factories.rb +2 -0
- data/templates/factory_girl_rspec.rb +3 -0
- data/templates/flashes_helper.rb +5 -0
- data/templates/gitignore_file +18 -0
- data/templates/hound.yml +17 -0
- data/templates/i18n.rb +3 -0
- data/templates/json_encoding.rb +1 -0
- data/templates/newrelic.yml.erb +34 -0
- data/templates/onotole_layout.html.erb.erb +21 -0
- data/templates/postgresql_database.yml.erb +22 -0
- data/templates/puma.rb +28 -0
- data/templates/rails_helper.rb +22 -0
- data/templates/rubocop.yml +44 -0
- data/templates/secrets.yml +14 -0
- data/templates/shoulda_matchers_config_rspec.rb +6 -0
- data/templates/smtp.rb +9 -0
- data/templates/spec_helper.rb +23 -0
- data/templates/staging.rb +5 -0
- data/templates/tinymce.yml +6 -0
- metadata +172 -0
@@ -0,0 +1,80 @@
|
|
1
|
+
module Onotole
|
2
|
+
module EditMenuQuestions
|
3
|
+
def choose_frontend
|
4
|
+
# do not forget add in def configure_simple_form new frameworks
|
5
|
+
variants = { none: 'No front-end framework',
|
6
|
+
bootstrap3_sass: 'Twitter bootstrap v.3 sass',
|
7
|
+
bootstrap3: 'Twitter bootstrap v.3 asset pipeline'
|
8
|
+
}
|
9
|
+
gem = choice 'Select front-end framework: ', variants
|
10
|
+
add_to_user_choise(gem) if gem
|
11
|
+
end
|
12
|
+
|
13
|
+
def choose_template_engine
|
14
|
+
variants = { none: 'Erb', slim: 'Slim', haml: 'Haml' }
|
15
|
+
gem = choice 'Select markup language: ', variants
|
16
|
+
add_to_user_choise(gem) if gem
|
17
|
+
end
|
18
|
+
|
19
|
+
def choose_authenticate_engine
|
20
|
+
variants = { none: 'None', devise: 'devise', devise_with_model: 'devise vs pre-installed model' }
|
21
|
+
gem = choice 'Select authenticate engine: ', variants
|
22
|
+
if gem == :devise_with_model
|
23
|
+
AppBuilder.devise_model = ask_stylish 'Enter devise model name:'
|
24
|
+
gem = :devise
|
25
|
+
end
|
26
|
+
add_to_user_choise(gem) if gem
|
27
|
+
end
|
28
|
+
|
29
|
+
def choose_undroup_gems
|
30
|
+
variants = { none: 'None',
|
31
|
+
will_paginate: 'Easy pagination implement',
|
32
|
+
rails_db: 'For pretty view in browser & xls export for models',
|
33
|
+
faker: 'Gem for generate fake data in testing',
|
34
|
+
rubocop: 'Code inspector and code formatting tool',
|
35
|
+
guard: 'Guard (with RSpec, livereload, rails, migrate, bundler)',
|
36
|
+
guard_rubocop: 'Auto-declare code miss in guard',
|
37
|
+
bundler_audit: 'Extra possibilities for gems version control',
|
38
|
+
airbrake: 'Airbrake error logging',
|
39
|
+
responders: 'A set of responders modules to dry up your Rails 4.2+ app.',
|
40
|
+
hirbunicode: 'Hirb unicode support',
|
41
|
+
dotenv_heroku: 'dotenv-heroku support',
|
42
|
+
tinymce: 'Integration of TinyMCE with the Rails asset pipeline',
|
43
|
+
meta_request: "Rails meta panel in chrome console. Very usefull in AJAX debugging.\n#{' ' * 24}Link for chrome add-on in Gemfile.\n#{' ' * 24}Do not delete comments if you need this link"
|
44
|
+
}
|
45
|
+
multiple_choice('Write numbers of all preferred gems.', variants).each do |gem|
|
46
|
+
add_to_user_choise gem
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
# template for yes/no question
|
51
|
+
#
|
52
|
+
# def supeawesome_gem
|
53
|
+
# gem_name = __callee__.to_s.gsub(/_gem$/, '')
|
54
|
+
# gem_description = 'Awesome gem description'
|
55
|
+
# add_to_user_choise( yes_no_question( gem_name,
|
56
|
+
# gem_description)) unless options[gem_name]
|
57
|
+
# end
|
58
|
+
|
59
|
+
def users_init_commit_choice
|
60
|
+
variants = { none: 'No', gitcommit: 'Yes' }
|
61
|
+
sel = choice 'Make init commit in the end? ', variants
|
62
|
+
add_to_user_choise(sel) unless sel == :none
|
63
|
+
end
|
64
|
+
|
65
|
+
def ask_cleanup_commens
|
66
|
+
unless options[:clean_comments]
|
67
|
+
variants = { none: 'No', clean_comments: 'Yes' }
|
68
|
+
sel = choice 'Delete comments in Gemfile, routes.rb & config files? ',
|
69
|
+
variants
|
70
|
+
add_to_user_choise(sel) unless sel == :none
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def add_github_repo_creation_choice
|
75
|
+
variants = { none: 'No', create_github_repo: 'Yes' }
|
76
|
+
sel = choice "Create github repo #{app_name}?", variants
|
77
|
+
add_to_user_choise(sel) unless sel == :none
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Onotole
|
2
|
+
module UserGemsMenu
|
3
|
+
def users_gems
|
4
|
+
choose_authenticate_engine
|
5
|
+
choose_template_engine
|
6
|
+
choose_frontend
|
7
|
+
# Placeholder for other gem additions
|
8
|
+
# menu description in add_gems_in_menu.rb
|
9
|
+
|
10
|
+
choose_undroup_gems
|
11
|
+
ask_cleanup_commens
|
12
|
+
users_init_commit_choice
|
13
|
+
add_github_repo_creation_choice
|
14
|
+
add_user_gems
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,678 @@
|
|
1
|
+
require 'forwardable'
|
2
|
+
require 'onotole/add_user_gems/user_gems_menu_questions'
|
3
|
+
require 'onotole/add_user_gems/edit_menu_questions'
|
4
|
+
require 'onotole/add_user_gems/before_bundle_patch'
|
5
|
+
require 'onotole/add_user_gems/after_install_patch'
|
6
|
+
|
7
|
+
module Onotole
|
8
|
+
class AppBuilder < Rails::AppBuilder
|
9
|
+
include Onotole::Actions
|
10
|
+
include Onotole::UserGemsMenu
|
11
|
+
include Onotole::EditMenuQuestions
|
12
|
+
include Onotole::BeforeBundlePatch
|
13
|
+
include Onotole::AfterInstallPatch
|
14
|
+
extend Forwardable
|
15
|
+
|
16
|
+
@use_asset_pipelline = true
|
17
|
+
@user_choice = []
|
18
|
+
@app_file_scss = 'app/assets/stylesheets/application.scss'
|
19
|
+
@app_file_css = 'app/assets/stylesheets/application.css'
|
20
|
+
@js_file = 'app/assets/javascripts/application.js'
|
21
|
+
|
22
|
+
class << self
|
23
|
+
attr_accessor :use_asset_pipelline,
|
24
|
+
:devise_model,
|
25
|
+
:user_choice, :app_file_scss, :app_file_css, :js_file
|
26
|
+
end
|
27
|
+
|
28
|
+
def_delegators :heroku_adapter,
|
29
|
+
:create_heroku_pipelines_config_file,
|
30
|
+
:create_heroku_pipeline,
|
31
|
+
:create_production_heroku_app,
|
32
|
+
:create_staging_heroku_app,
|
33
|
+
:provide_review_apps_setup_script,
|
34
|
+
:set_heroku_rails_secrets,
|
35
|
+
:set_heroku_remotes,
|
36
|
+
:set_heroku_serve_static_files,
|
37
|
+
:set_up_heroku_specific_gems
|
38
|
+
|
39
|
+
def readme
|
40
|
+
template 'README.md.erb', 'README.md'
|
41
|
+
end
|
42
|
+
|
43
|
+
def raise_on_missing_assets_in_test
|
44
|
+
inject_into_file(
|
45
|
+
'config/environments/test.rb',
|
46
|
+
"\n config.assets.raise_runtime_errors = true",
|
47
|
+
after: 'Rails.application.configure do'
|
48
|
+
)
|
49
|
+
end
|
50
|
+
|
51
|
+
def raise_on_delivery_errors
|
52
|
+
replace_in_file 'config/environments/development.rb',
|
53
|
+
'raise_delivery_errors = false', 'raise_delivery_errors = true'
|
54
|
+
end
|
55
|
+
|
56
|
+
def set_test_delivery_method
|
57
|
+
inject_into_file(
|
58
|
+
'config/environments/development.rb',
|
59
|
+
"\n config.action_mailer.delivery_method = :test",
|
60
|
+
after: 'config.action_mailer.raise_delivery_errors = true'
|
61
|
+
)
|
62
|
+
end
|
63
|
+
|
64
|
+
def add_bullet_gem_configuration
|
65
|
+
config = <<-RUBY
|
66
|
+
config.after_initialize do
|
67
|
+
Bullet.enable = true
|
68
|
+
Bullet.bullet_logger = true
|
69
|
+
Bullet.rails_logger = true
|
70
|
+
end
|
71
|
+
|
72
|
+
RUBY
|
73
|
+
|
74
|
+
inject_into_file(
|
75
|
+
'config/environments/development.rb',
|
76
|
+
config,
|
77
|
+
after: "config.action_mailer.raise_delivery_errors = true\n"
|
78
|
+
)
|
79
|
+
end
|
80
|
+
|
81
|
+
def raise_on_unpermitted_parameters
|
82
|
+
config = "\n config.action_controller.action_on_unpermitted_parameters = :raise\n"
|
83
|
+
inject_into_class 'config/application.rb', 'Application', config
|
84
|
+
end
|
85
|
+
|
86
|
+
def configure_quiet_assets
|
87
|
+
config = "\n config.quiet_assets = true\n"
|
88
|
+
inject_into_class 'config/application.rb', 'Application', config
|
89
|
+
end
|
90
|
+
|
91
|
+
def provide_setup_script
|
92
|
+
template 'bin_setup', 'bin/setup', force: true
|
93
|
+
run 'chmod a+x bin/setup'
|
94
|
+
end
|
95
|
+
|
96
|
+
def provide_dev_prime_task
|
97
|
+
copy_file 'dev.rake', 'lib/tasks/dev.rake'
|
98
|
+
end
|
99
|
+
|
100
|
+
def configure_generators
|
101
|
+
config = <<-RUBY
|
102
|
+
|
103
|
+
config.generators do |generate|
|
104
|
+
generate.helper false
|
105
|
+
generate.javascript_engine false
|
106
|
+
generate.request_specs false
|
107
|
+
generate.routing_specs false
|
108
|
+
generate.stylesheets false
|
109
|
+
generate.test_framework :rspec
|
110
|
+
generate.view_specs false
|
111
|
+
generate.fixture_replacement :factory_girl
|
112
|
+
end
|
113
|
+
|
114
|
+
RUBY
|
115
|
+
|
116
|
+
inject_into_class 'config/application.rb', 'Application', config
|
117
|
+
end
|
118
|
+
|
119
|
+
def set_up_factory_girl_for_rspec
|
120
|
+
copy_file 'factory_girl_rspec.rb', 'spec/support/factory_girl.rb'
|
121
|
+
end
|
122
|
+
|
123
|
+
def generate_factories_file
|
124
|
+
copy_file 'factories.rb', 'spec/factories.rb'
|
125
|
+
end
|
126
|
+
|
127
|
+
def set_up_hound
|
128
|
+
copy_file 'hound.yml', '.hound.yml'
|
129
|
+
end
|
130
|
+
|
131
|
+
def configure_newrelic
|
132
|
+
template 'newrelic.yml.erb', 'config/newrelic.yml'
|
133
|
+
end
|
134
|
+
|
135
|
+
def configure_smtp
|
136
|
+
copy_file 'smtp.rb', 'config/smtp.rb'
|
137
|
+
|
138
|
+
prepend_file 'config/environments/production.rb',
|
139
|
+
%{require Rails.root.join("config/smtp")\n}
|
140
|
+
|
141
|
+
config = <<-RUBY
|
142
|
+
|
143
|
+
config.action_mailer.delivery_method = :smtp
|
144
|
+
config.action_mailer.smtp_settings = SMTP_SETTINGS
|
145
|
+
RUBY
|
146
|
+
|
147
|
+
inject_into_file 'config/environments/production.rb', config,
|
148
|
+
after: 'config.action_mailer.raise_delivery_errors = false'
|
149
|
+
end
|
150
|
+
|
151
|
+
def enable_rack_canonical_host
|
152
|
+
config = <<-RUBY
|
153
|
+
|
154
|
+
if ENV.fetch("HEROKU_APP_NAME", "").include?("staging-pr-")
|
155
|
+
ENV["APPLICATION_HOST"] = ENV["HEROKU_APP_NAME"] + ".herokuapp.com"
|
156
|
+
end
|
157
|
+
|
158
|
+
# Ensure requests are only served from one, canonical host name
|
159
|
+
config.middleware.use Rack::CanonicalHost, ENV.fetch("APPLICATION_HOST")
|
160
|
+
RUBY
|
161
|
+
|
162
|
+
inject_into_file(
|
163
|
+
'config/environments/production.rb',
|
164
|
+
config,
|
165
|
+
after: 'Rails.application.configure do'
|
166
|
+
)
|
167
|
+
end
|
168
|
+
|
169
|
+
def enable_rack_deflater
|
170
|
+
config = <<-RUBY
|
171
|
+
|
172
|
+
# Enable deflate / gzip compression of controller-generated responses
|
173
|
+
config.middleware.use Rack::Deflater
|
174
|
+
RUBY
|
175
|
+
|
176
|
+
inject_into_file(
|
177
|
+
'config/environments/production.rb',
|
178
|
+
config,
|
179
|
+
after: serve_static_files_line
|
180
|
+
)
|
181
|
+
end
|
182
|
+
|
183
|
+
def setup_asset_host
|
184
|
+
replace_in_file 'config/environments/production.rb',
|
185
|
+
"# config.action_controller.asset_host = 'http://assets.example.com'",
|
186
|
+
'config.action_controller.asset_host = ENV.fetch("ASSET_HOST", ENV.fetch("APPLICATION_HOST"))'
|
187
|
+
|
188
|
+
replace_in_file 'config/initializers/assets.rb',
|
189
|
+
"config.assets.version = '1.0'",
|
190
|
+
'config.assets.version = (ENV["ASSETS_VERSION"] || "1.0")'
|
191
|
+
|
192
|
+
inject_into_file(
|
193
|
+
'config/environments/production.rb',
|
194
|
+
' config.static_cache_control = "public, max-age=#{1.year.to_i}"',
|
195
|
+
after: serve_static_files_line
|
196
|
+
)
|
197
|
+
end
|
198
|
+
|
199
|
+
def setup_staging_environment
|
200
|
+
staging_file = 'config/environments/staging.rb'
|
201
|
+
copy_file 'staging.rb', staging_file
|
202
|
+
|
203
|
+
config = <<-RUBY
|
204
|
+
|
205
|
+
Rails.application.configure do
|
206
|
+
# ...
|
207
|
+
end
|
208
|
+
RUBY
|
209
|
+
|
210
|
+
append_file staging_file, config
|
211
|
+
end
|
212
|
+
|
213
|
+
def setup_secret_token
|
214
|
+
template 'secrets.yml', 'config/secrets.yml', force: true
|
215
|
+
end
|
216
|
+
|
217
|
+
def disallow_wrapping_parameters
|
218
|
+
remove_file 'config/initializers/wrap_parameters.rb'
|
219
|
+
end
|
220
|
+
|
221
|
+
def create_partials_directory
|
222
|
+
empty_directory 'app/views/application'
|
223
|
+
end
|
224
|
+
|
225
|
+
def create_shared_flashes
|
226
|
+
copy_file '_flashes.html.erb',
|
227
|
+
'app/views/application/_flashes.html.erb'
|
228
|
+
copy_file 'flashes_helper.rb',
|
229
|
+
'app/helpers/flashes_helper.rb'
|
230
|
+
end
|
231
|
+
|
232
|
+
def create_shared_javascripts
|
233
|
+
copy_file '_javascript.html.erb',
|
234
|
+
'app/views/application/_javascript.html.erb'
|
235
|
+
end
|
236
|
+
|
237
|
+
def create_application_layout
|
238
|
+
template 'onotole_layout.html.erb.erb',
|
239
|
+
'app/views/layouts/application.html.erb',
|
240
|
+
force: true
|
241
|
+
end
|
242
|
+
|
243
|
+
def use_postgres_config_template
|
244
|
+
template 'postgresql_database.yml.erb', 'config/database.yml',
|
245
|
+
force: true
|
246
|
+
template 'postgresql_database.yml.erb', 'config/database.yml.sample',
|
247
|
+
force: true
|
248
|
+
end
|
249
|
+
|
250
|
+
def create_database
|
251
|
+
bundle_command 'exec rake db:drop db:create db:migrate'
|
252
|
+
end
|
253
|
+
|
254
|
+
def replace_gemfile
|
255
|
+
remove_file 'Gemfile'
|
256
|
+
template 'Gemfile.erb', 'Gemfile'
|
257
|
+
end
|
258
|
+
|
259
|
+
def set_ruby_to_version_being_used
|
260
|
+
create_file '.ruby-version', "#{Onotole::RUBY_VERSION}\n"
|
261
|
+
end
|
262
|
+
|
263
|
+
def enable_database_cleaner
|
264
|
+
copy_file 'database_cleaner_rspec.rb', 'spec/support/database_cleaner.rb'
|
265
|
+
end
|
266
|
+
|
267
|
+
def provide_shoulda_matchers_config
|
268
|
+
copy_file(
|
269
|
+
'shoulda_matchers_config_rspec.rb',
|
270
|
+
'spec/support/shoulda_matchers.rb'
|
271
|
+
)
|
272
|
+
end
|
273
|
+
|
274
|
+
def configure_spec_support_features
|
275
|
+
empty_directory_with_keep_file 'spec/features'
|
276
|
+
empty_directory_with_keep_file 'spec/support/features'
|
277
|
+
end
|
278
|
+
|
279
|
+
def configure_rspec
|
280
|
+
remove_file 'spec/rails_helper.rb'
|
281
|
+
remove_file 'spec/spec_helper.rb'
|
282
|
+
copy_file 'rails_helper.rb', 'spec/rails_helper.rb'
|
283
|
+
copy_file 'spec_helper.rb', 'spec/spec_helper.rb'
|
284
|
+
end
|
285
|
+
|
286
|
+
def configure_ci
|
287
|
+
template 'circle.yml.erb', 'circle.yml'
|
288
|
+
end
|
289
|
+
|
290
|
+
def configure_i18n_for_test_environment
|
291
|
+
copy_file 'i18n.rb', 'spec/support/i18n.rb'
|
292
|
+
end
|
293
|
+
|
294
|
+
def configure_i18n_for_missing_translations
|
295
|
+
raise_on_missing_translations_in('development')
|
296
|
+
raise_on_missing_translations_in('test')
|
297
|
+
end
|
298
|
+
|
299
|
+
def configure_background_jobs_for_rspec
|
300
|
+
generate 'delayed_job:active_record'
|
301
|
+
end
|
302
|
+
|
303
|
+
def configure_action_mailer_in_specs
|
304
|
+
copy_file 'action_mailer.rb', 'spec/support/action_mailer.rb'
|
305
|
+
end
|
306
|
+
|
307
|
+
def configure_capybara_webkit
|
308
|
+
copy_file 'capybara_webkit.rb', 'spec/support/capybara_webkit.rb'
|
309
|
+
end
|
310
|
+
|
311
|
+
def configure_time_formats
|
312
|
+
remove_file 'config/locales/en.yml'
|
313
|
+
template 'config_locales_en.yml.erb', 'config/locales/en.yml'
|
314
|
+
end
|
315
|
+
|
316
|
+
def configure_rack_timeout
|
317
|
+
rack_timeout_config = 'Rack::Timeout.timeout = (ENV["RACK_TIMEOUT"] || 10).to_i'
|
318
|
+
append_file 'config/environments/production.rb', rack_timeout_config
|
319
|
+
end
|
320
|
+
|
321
|
+
def configure_simple_form
|
322
|
+
if user_choose?(:bootstrap3_sass) || user_choose?(:bootstrap3)
|
323
|
+
bundle_command 'exec rails generate simple_form:install --bootstrap'
|
324
|
+
else
|
325
|
+
bundle_command 'exec rails generate simple_form:install'
|
326
|
+
end
|
327
|
+
end
|
328
|
+
|
329
|
+
def configure_action_mailer
|
330
|
+
action_mailer_host 'development', %("localhost:3000")
|
331
|
+
action_mailer_host 'test', %("www.example.com")
|
332
|
+
action_mailer_host 'production', %{ENV.fetch("APPLICATION_HOST")}
|
333
|
+
end
|
334
|
+
|
335
|
+
def configure_active_job
|
336
|
+
configure_application_file(
|
337
|
+
'config.active_job.queue_adapter = :delayed_job'
|
338
|
+
)
|
339
|
+
configure_environment 'test', 'config.active_job.queue_adapter = :inline'
|
340
|
+
end
|
341
|
+
|
342
|
+
def fix_i18n_deprecation_warning
|
343
|
+
config = ' config.i18n.enforce_available_locales = true'
|
344
|
+
inject_into_class 'config/application.rb', 'Application', config
|
345
|
+
end
|
346
|
+
|
347
|
+
def generate_rspec
|
348
|
+
generate 'rspec:install'
|
349
|
+
end
|
350
|
+
|
351
|
+
def configure_puma
|
352
|
+
copy_file 'puma.rb', 'config/puma.rb'
|
353
|
+
end
|
354
|
+
|
355
|
+
def set_up_forego
|
356
|
+
copy_file 'Procfile', 'Procfile'
|
357
|
+
end
|
358
|
+
|
359
|
+
def setup_stylesheets
|
360
|
+
remove_file 'app/assets/stylesheets/application.css'
|
361
|
+
copy_file 'application.scss',
|
362
|
+
'app/assets/stylesheets/application.scss'
|
363
|
+
end
|
364
|
+
|
365
|
+
def install_refills
|
366
|
+
generate 'refills:import flashes'
|
367
|
+
run 'rm app/views/refills/_flashes.html.erb'
|
368
|
+
run 'rmdir app/views/refills'
|
369
|
+
end
|
370
|
+
|
371
|
+
def install_bitters
|
372
|
+
run 'bitters install --path app/assets/stylesheets'
|
373
|
+
end
|
374
|
+
|
375
|
+
def gitignore_files
|
376
|
+
remove_file '.gitignore'
|
377
|
+
copy_file 'gitignore_file', '.gitignore'
|
378
|
+
[
|
379
|
+
'app/views/pages',
|
380
|
+
'spec/lib',
|
381
|
+
'spec/controllers',
|
382
|
+
'spec/helpers',
|
383
|
+
'spec/support/matchers',
|
384
|
+
'spec/support/mixins',
|
385
|
+
'spec/support/shared_examples'
|
386
|
+
].each do |dir|
|
387
|
+
run "mkdir #{dir}"
|
388
|
+
run "touch #{dir}/.keep"
|
389
|
+
end
|
390
|
+
end
|
391
|
+
|
392
|
+
def copy_dotfiles
|
393
|
+
directory 'dotfiles', '.', force: true
|
394
|
+
end
|
395
|
+
|
396
|
+
def init_git
|
397
|
+
run 'git init'
|
398
|
+
end
|
399
|
+
|
400
|
+
def git_init_commit
|
401
|
+
if user_choose?(:gitcommit)
|
402
|
+
say 'Init commit'
|
403
|
+
run 'git add .'
|
404
|
+
run 'git commit -m "Init commit"'
|
405
|
+
end
|
406
|
+
end
|
407
|
+
|
408
|
+
def create_heroku_apps(flags)
|
409
|
+
create_staging_heroku_app(flags)
|
410
|
+
create_production_heroku_app(flags)
|
411
|
+
end
|
412
|
+
|
413
|
+
def provide_deploy_script
|
414
|
+
copy_file 'bin_deploy', 'bin/deploy'
|
415
|
+
|
416
|
+
instructions = <<-MARKDOWN
|
417
|
+
|
418
|
+
## Deploying
|
419
|
+
|
420
|
+
If you have previously run the `./bin/setup` script,
|
421
|
+
you can deploy to staging and production with:
|
422
|
+
|
423
|
+
$ ./bin/deploy staging
|
424
|
+
$ ./bin/deploy production
|
425
|
+
MARKDOWN
|
426
|
+
|
427
|
+
append_file 'README.md', instructions
|
428
|
+
run 'chmod a+x bin/deploy'
|
429
|
+
end
|
430
|
+
|
431
|
+
def configure_automatic_deployment
|
432
|
+
deploy_command = <<-YML.strip_heredoc
|
433
|
+
deployment:
|
434
|
+
staging:
|
435
|
+
branch: master
|
436
|
+
commands:
|
437
|
+
- bin/deploy staging
|
438
|
+
YML
|
439
|
+
|
440
|
+
append_file 'circle.yml', deploy_command
|
441
|
+
end
|
442
|
+
|
443
|
+
def create_github_repo(repo_name)
|
444
|
+
system "hub create #{repo_name}"
|
445
|
+
end
|
446
|
+
|
447
|
+
def setup_segment
|
448
|
+
copy_file '_analytics.html.erb',
|
449
|
+
'app/views/application/_analytics.html.erb'
|
450
|
+
end
|
451
|
+
|
452
|
+
def setup_spring
|
453
|
+
bundle_command 'exec spring binstub --all'
|
454
|
+
run 'spring stop'
|
455
|
+
end
|
456
|
+
|
457
|
+
def copy_miscellaneous_files
|
458
|
+
copy_file 'browserslist', 'browserslist'
|
459
|
+
copy_file 'errors.rb', 'config/initializers/errors.rb'
|
460
|
+
copy_file 'json_encoding.rb', 'config/initializers/json_encoding.rb'
|
461
|
+
end
|
462
|
+
|
463
|
+
def customize_error_pages
|
464
|
+
meta_tags = <<-EOS
|
465
|
+
<meta charset="utf-8" />
|
466
|
+
<meta name="ROBOTS" content="NOODP" />
|
467
|
+
<meta name="viewport" content="initial-scale=1" />
|
468
|
+
EOS
|
469
|
+
|
470
|
+
%w(500 404 422).each do |page|
|
471
|
+
inject_into_file "public/#{page}.html", meta_tags, after: "<head>\n"
|
472
|
+
replace_in_file "public/#{page}.html", /<!--.+-->\n/, ''
|
473
|
+
end
|
474
|
+
end
|
475
|
+
|
476
|
+
def remove_config_comment_lines
|
477
|
+
config_files = [
|
478
|
+
'application.rb',
|
479
|
+
'environment.rb',
|
480
|
+
'environments/development.rb',
|
481
|
+
'environments/production.rb',
|
482
|
+
'environments/test.rb'
|
483
|
+
]
|
484
|
+
|
485
|
+
config_files.each do |config_file|
|
486
|
+
cleanup_comments File.join(destination_root, "config/#{config_file}")
|
487
|
+
end
|
488
|
+
end
|
489
|
+
|
490
|
+
def remove_routes_comment_lines
|
491
|
+
replace_in_file 'config/routes.rb',
|
492
|
+
/Rails\.application\.routes\.draw do.*end/m,
|
493
|
+
"Rails.application.routes.draw do\nend"
|
494
|
+
end
|
495
|
+
|
496
|
+
def disable_xml_params
|
497
|
+
copy_file 'disable_xml_params.rb',
|
498
|
+
'config/initializers/disable_xml_params.rb'
|
499
|
+
end
|
500
|
+
|
501
|
+
def setup_default_rake_task
|
502
|
+
append_file 'Rakefile' do
|
503
|
+
<<-EOS
|
504
|
+
task(:default).clear
|
505
|
+
task default: [:spec]
|
506
|
+
|
507
|
+
if defined? RSpec
|
508
|
+
task(:spec).clear
|
509
|
+
RSpec::Core::RakeTask.new(:spec) do |t|
|
510
|
+
t.verbose = false
|
511
|
+
end
|
512
|
+
end
|
513
|
+
EOS
|
514
|
+
end
|
515
|
+
end
|
516
|
+
|
517
|
+
def install_user_gems_from_github
|
518
|
+
File.readlines('Gemfile').each do |l|
|
519
|
+
possible_gem_name = l.match(/(?:github:\s+)(?:'|")\w+\/(.*)(?:'|")/i)
|
520
|
+
install_from_github possible_gem_name[1] if possible_gem_name
|
521
|
+
end
|
522
|
+
end
|
523
|
+
|
524
|
+
# def rvm_bundler_stubs_install
|
525
|
+
# if system "rvm -v | grep 'rvm.io'"
|
526
|
+
# run 'chmod +x $rvm_path/hooks/after_cd_bundler'
|
527
|
+
# run 'bundle install --binstubs=./bundler_stubs'
|
528
|
+
# end
|
529
|
+
# end
|
530
|
+
|
531
|
+
def user_gems_from_args_or_default_set
|
532
|
+
gems_flags = []
|
533
|
+
options.each { |k, v| gems_flags.push k.to_sym if v == true }
|
534
|
+
gems = GEMPROCLIST & gems_flags
|
535
|
+
if gems.empty?
|
536
|
+
AppBuilder.user_choice = DEFAULT_GEMSET
|
537
|
+
else
|
538
|
+
gems.each { |g| AppBuilder.user_choice << g }
|
539
|
+
end
|
540
|
+
add_user_gems
|
541
|
+
end
|
542
|
+
|
543
|
+
def show_goodbye_message
|
544
|
+
say_color BOLDGREEN, "Congratulations! Onotole gives you: 'Intellect+= 1'"
|
545
|
+
say_color BOLDGREEN, "You can 'git push -u origin master' to your new repo
|
546
|
+
#{app_name} or check log for errors"
|
547
|
+
if user_choose? :create_github_repo
|
548
|
+
say_color YELLOW, "Remember to run 'rails generate airbrake' with your API key." if user_choose? :airbrake
|
549
|
+
end
|
550
|
+
|
551
|
+
private
|
552
|
+
|
553
|
+
def yes_no_question(gem_name, gem_description)
|
554
|
+
gem_name_color = "#{gem_name.capitalize}.\n"
|
555
|
+
variants = { none: 'No', gem_name.to_sym => gem_name_color }
|
556
|
+
choice "Use #{gem_name}? #{gem_description}", variants
|
557
|
+
end
|
558
|
+
|
559
|
+
def choice(selector, variants)
|
560
|
+
unless variants.keys[1..-1].map { |a| options[a] }.include? true
|
561
|
+
values = []
|
562
|
+
say "\n #{BOLDGREEN}#{selector}#{COLOR_OFF}"
|
563
|
+
variants.each_with_index do |variant, i|
|
564
|
+
values.push variant[0]
|
565
|
+
say "#{i.to_s.rjust(5)}. #{BOLDBLUE}#{variant[1]}#{COLOR_OFF}"
|
566
|
+
end
|
567
|
+
answer = ask_stylish('Enter choice:') until (0...variants.length)
|
568
|
+
.map(&:to_s).include? answer
|
569
|
+
values[answer.to_i] == :none ? nil : values[answer.to_i]
|
570
|
+
end
|
571
|
+
end
|
572
|
+
|
573
|
+
def multiple_choice(selector, variants)
|
574
|
+
values = []
|
575
|
+
result = []
|
576
|
+
answers = ''
|
577
|
+
say "\n #{BOLDGREEN}#{selector} Use space as separator#{COLOR_OFF}"
|
578
|
+
variants.each_with_index do |variant, i|
|
579
|
+
values.push variant[0]
|
580
|
+
say "#{i.to_s.rjust(5)}. #{BOLDBLUE}#{variant[0]
|
581
|
+
.to_s.ljust(15)}-#{COLOR_OFF} #{variant[1]}"
|
582
|
+
end
|
583
|
+
loop do
|
584
|
+
answers = ask_stylish('Enter choices:').split ' '
|
585
|
+
break if answers.any? && (answers - (0...variants.length)
|
586
|
+
.to_a.map(&:to_s)).empty?
|
587
|
+
end
|
588
|
+
answers.delete '0'
|
589
|
+
answers.uniq.each { |a| result.push values[a.to_i] }
|
590
|
+
result
|
591
|
+
end
|
592
|
+
|
593
|
+
def ask_stylish(str)
|
594
|
+
ask "#{BOLDGREEN} #{str} #{COLOR_OFF}".rjust(10)
|
595
|
+
end
|
596
|
+
|
597
|
+
def say_color(color, str)
|
598
|
+
say "#{color}#{str}#{COLOR_OFF}".rjust(4)
|
599
|
+
end
|
600
|
+
|
601
|
+
def raise_on_missing_translations_in(environment)
|
602
|
+
config = 'config.action_view.raise_on_missing_translations = true'
|
603
|
+
uncomment_lines("config/environments/#{environment}.rb", config)
|
604
|
+
end
|
605
|
+
|
606
|
+
def heroku_adapter
|
607
|
+
@heroku_adapter ||= Adapters::Heroku.new(self)
|
608
|
+
end
|
609
|
+
|
610
|
+
def serve_static_files_line
|
611
|
+
"config.serve_static_files = ENV['RAILS_SERVE_STATIC_FILES'].present?\n"
|
612
|
+
end
|
613
|
+
|
614
|
+
def add_gems_from_args
|
615
|
+
ARGV.each do |g|
|
616
|
+
next unless g[0] == '-' && g[1] == '-'
|
617
|
+
add_to_user_choise g[2..-1].to_sym
|
618
|
+
end
|
619
|
+
end
|
620
|
+
|
621
|
+
def cleanup_comments(file)
|
622
|
+
accepted_content = File.readlines(file).reject do |line|
|
623
|
+
line =~ /^\s*#.*$/ || line =~ /^$\n/
|
624
|
+
end
|
625
|
+
|
626
|
+
File.open(file, 'w') do |f|
|
627
|
+
accepted_content.each { |line| f.puts line }
|
628
|
+
end
|
629
|
+
end
|
630
|
+
|
631
|
+
def delete_comments
|
632
|
+
if options[:clean_comments] || user_choose?(:clean_comments)
|
633
|
+
cleanup_comments 'Gemfile'
|
634
|
+
remove_config_comment_lines
|
635
|
+
remove_routes_comment_lines
|
636
|
+
end
|
637
|
+
end
|
638
|
+
|
639
|
+
# does not recognize variable nesting, but now it does not matter
|
640
|
+
def cover_def_by(file, lookup_str, external_def)
|
641
|
+
expect_end = 0
|
642
|
+
found = false
|
643
|
+
accepted_content = ''
|
644
|
+
File.readlines(file).each do |line|
|
645
|
+
expect_end += 1 if found && line =~ /\sdo\s/
|
646
|
+
expect_end -= 1 if found && line =~ /(\s+end|^end)/
|
647
|
+
if line =~ Regexp.new(lookup_str)
|
648
|
+
accepted_content += "#{external_def}\n#{line}"
|
649
|
+
expect_end += 1
|
650
|
+
found = true
|
651
|
+
else
|
652
|
+
accepted_content += line
|
653
|
+
end
|
654
|
+
if found && expect_end == 0
|
655
|
+
accepted_content += "\nend"
|
656
|
+
found = false
|
657
|
+
end
|
658
|
+
end
|
659
|
+
File.open(file, 'w') do |f|
|
660
|
+
f.puts accepted_content
|
661
|
+
end
|
662
|
+
end
|
663
|
+
|
664
|
+
def install_from_github(gem_name)
|
665
|
+
return nil unless gem_name
|
666
|
+
path = `bundle list #{gem_name}`.chomp
|
667
|
+
run "cd #{path} && gem build #{gem_name}.gemspec && gem install #{gem_name}"
|
668
|
+
end
|
669
|
+
|
670
|
+
def user_choose?(g)
|
671
|
+
AppBuilder.user_choice.include? g
|
672
|
+
end
|
673
|
+
|
674
|
+
def add_to_user_choise(g)
|
675
|
+
AppBuilder.user_choice.push g
|
676
|
+
end
|
677
|
+
end
|
678
|
+
end
|