Class: BlueberryRails::AppBuilder

Inherits:
Rails::AppBuilder
  • Object
show all
Includes:
ActionHelpers
Defined in:
lib/blueberry_rails/app_builder.rb

Instance Method Summary collapse

Methods included from ActionHelpers

#action_mailer_host, #configure_environment, #rename_file, #replace_in_file

Instance Method Details

#add_ruby_version_fileObject



229
230
231
232
233
234
235
236
237
# File 'lib/blueberry_rails/app_builder.rb', line 229

def add_ruby_version_file
  current_version = RUBY_VERSION.split('.').map(&:to_i)
  version = if current_version[0] >= 2 && current_version[1] >= 0
              RUBY_VERSION
            else
              "#{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}"
            end
  add_file '.ruby-version', "#{version}\n", force: true
end

#cache_and_compressObject



288
289
290
291
292
293
# File 'lib/blueberry_rails/app_builder.rb', line 288

def cache_and_compress
  configure_environment 'production',
    "config.public_file_server.headers = {\n    'Cache-Control' => 'public, max-age=31536000'\n  }"
  configure_environment 'production',
    'config.middleware.insert_before ActionDispatch::Static, Rack::Deflater'
end

#cocoon_configObject



25
26
27
28
29
30
# File 'lib/blueberry_rails/app_builder.rb', line 25

def cocoon_config
  run 'yarn add https://github.com/1776/cocoon'
  inject_into_file 'app/javascript/packs/application.js',
                   "import 'cocoon';\n",
                   before: 'import { Application } from "stimulus"'
end

#configure_bin_setupObject



332
333
334
# File 'lib/blueberry_rails/app_builder.rb', line 332

def configure_bin_setup
  copy_file 'setup', 'bin/setup', force: true
end

#configure_circleObject



224
225
226
227
# File 'lib/blueberry_rails/app_builder.rb', line 224

def configure_circle
  empty_directory '.circleci'
  template 'circle.yml.erb', '.circleci/config.yml'
end

#configure_generatorsObject



188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
# File 'lib/blueberry_rails/app_builder.rb', line 188

def configure_generators
  config = <<-RUBY
config.generators do |generate|
  generate.helper false
  generate.javascript_engine false
  generate.request_specs false
  generate.routing_specs false
  generate.stylesheets false
  generate.test_framework :rspec
  generate.view_specs false
end

  RUBY

  inject_into_class 'config/application.rb', 'Application', config
end

#configure_i18nObject



205
206
207
208
209
210
211
212
213
214
215
216
# File 'lib/blueberry_rails/app_builder.rb', line 205

def configure_i18n
  inject_into_file "config/application.rb",
                   "\n    config.i18n.load_path += Dir[Rails.root.join 'config/locales/**/*.{rb,yml}']",
                   before: "\n    # Settings"

  inject_into_file 'config/application.rb',
                   "\n    config.i18n.available_locales = [:cs, :en]\n    config.i18n.default_locale = :cs",
                   before: "\n    # Settings"

  remove_file 'config/locales/en.yml'
  directory 'locales', 'config/locales'
end

#configure_i18n_loggerObject



218
219
220
221
222
# File 'lib/blueberry_rails/app_builder.rb', line 218

def configure_i18n_logger
  configure_environment 'development',
                        "# I18n debug\n  I18nLogger = ActiveSupport::" \
                        "Logger.new(Rails.root.join('log/i18n.log'))"
end

#configure_mailcatcherObject



181
182
183
184
185
186
# File 'lib/blueberry_rails/app_builder.rb', line 181

def configure_mailcatcher
  configure_environment 'development',
    'config.action_mailer.delivery_method = :smtp'
  configure_environment 'development',
    "config.action_mailer.smtp_settings = { address: 'localhost', port: 1025 }"
end

#configure_rspecObject



152
153
154
# File 'lib/blueberry_rails/app_builder.rb', line 152

def configure_rspec
  copy_file 'spec/spec_helper.rb', 'spec/spec_helper.rb', force: true
end

#configure_simple_formObject



259
260
261
262
263
264
265
266
267
268
269
270
271
272
# File 'lib/blueberry_rails/app_builder.rb', line 259

def configure_simple_form
  if options[:bootstrap]
    generate 'simple_form:install --bootstrap'

    replace_in_file 'config/initializers/simple_form.rb',
                    '# config.label_text = lambda { |label, required, explicit_label| "#{required} #{label}" }',
                    'config.label_text = lambda { |label, required, explicit_label| "#{required} #{label}" }'

  else
    generate 'simple_form:install'
  end
  rename_file 'config/locales/simple_form.en.yml',
              'config/locales/en/en.simple_form.yml'
end

#copy_assets_directoryObject



93
94
95
96
97
98
99
100
101
102
103
104
# File 'lib/blueberry_rails/app_builder.rb', line 93

def copy_assets_directory
  remove_file 'app/assets/stylesheets', force: true
  remove_file 'app/assets/javascripts', force: true

  run 'mkdir app/javascript/stylesheets', force: true
  run 'touch app/javascript/packs/application.sass', force: true

  if options[:administration]
    run 'touch app/javascript/packs/admin.js', force: true
    run 'touch app/javascript/packs/admin.sass', force: true
  end
end

#copy_custom_errorsObject



317
318
319
320
321
322
323
324
325
326
327
328
329
330
# File 'lib/blueberry_rails/app_builder.rb', line 317

def copy_custom_errors
  copy_file 'controllers/errors_controller.rb', 'app/controllers/errors_controller.rb'

  config = <<-RUBY
config.exceptions_app = self.routes

  RUBY

  inject_into_class 'config/application.rb', 'Application', config

  remove_file 'public/404.html', force: true
  remove_file 'public/422.html', force: true
  remove_file 'public/500.html', force: true
end

#copy_initializersObject



106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# File 'lib/blueberry_rails/app_builder.rb', line 106

def copy_initializers
  if options[:translation_engine]
    copy_file 'config/initializers/translation_engine.rb',
              'config/initializers/translation_engine.rb'
  end
  if options[:bootstrap]
    copy_file 'config/initializers/simple_form_bootstrap.rb',
              'config/initializers/simple_form_bootstrap.rb', force: true
  end
  copy_file 'config/initializers/airbrake.rb',
            'config/initializers/airbrake.rb'

  copy_file 'config/initializers/plurals.rb',
            'config/initializers/plurals.rb'
end

#copy_rake_tasksObject



313
314
315
# File 'lib/blueberry_rails/app_builder.rb', line 313

def copy_rake_tasks
  copy_file 'tasks/images.rake', 'lib/tasks/images.rake'
end

#create_application_layoutObject



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/blueberry_rails/app_builder.rb', line 76

def create_application_layout
  remove_file 'app/views/layouts/application.html.erb'
  remove_file 'app/views/layouts/mailer.html.erb'
  remove_file 'app/views/layouts/mailer.text.erb'

  template 'views/layouts/application.html.slim.erb',
           'app/views/layouts/application.html.slim', force: true

  template 'views/layouts/mailer.html.slim.erb',
           'app/views/layouts/mailer.html.slim', force: true

  directory 'helpers', 'app/helpers', force: true

  remove_file 'public/favicon.ico'
  directory 'public/icons', 'public'
end

#create_databaseObject



135
136
137
# File 'lib/blueberry_rails/app_builder.rb', line 135

def create_database
  bundle_command 'exec rails db:create'
end

#create_partials_directoryObject



72
73
74
# File 'lib/blueberry_rails/app_builder.rb', line 72

def create_partials_directory
  directory 'views/application', 'app/views/application', force: true
end

#create_procfileObject



126
127
128
# File 'lib/blueberry_rails/app_builder.rb', line 126

def create_procfile
  copy_file 'Procfile', 'Procfile'
end

#create_pryrcObject



122
123
124
# File 'lib/blueberry_rails/app_builder.rb', line 122

def create_pryrc
  copy_file 'pryrc.rb', '.pryrc'
end

#create_puma_configObject



130
131
132
133
# File 'lib/blueberry_rails/app_builder.rb', line 130

def create_puma_config
  remove_file 'config/puma.rb'
  copy_file 'puma.rb', 'config/puma.rb'
end

#create_root_pageObject



343
344
345
# File 'lib/blueberry_rails/app_builder.rb', line 343

def create_root_page
  generate_root_controller_and_route
end

#gemfileObject



13
14
15
# File 'lib/blueberry_rails/app_builder.rb', line 13

def gemfile
  template 'Gemfile_custom.erb', 'Gemfile'
end

#generate_root_controller_and_routeObject



336
337
338
339
340
341
# File 'lib/blueberry_rails/app_builder.rb', line 336

def generate_root_controller_and_route
  generate 'controller', 'root index'
  inject_into_file 'config/routes.rb',
                   "  root to: 'root#index'\n",
                   after: "Rails.application.routes.draw do\n"
end

#generate_rspecObject



139
140
141
142
143
144
145
146
147
148
149
150
# File 'lib/blueberry_rails/app_builder.rb', line 139

def generate_rspec
  generate 'rspec:install'

  copy_file 'spec/drivers.rb', 'spec/support/drivers.rb'

  inject_into_file 'spec/rails_helper.rb',
                   "\n# Screenshots\n" \
                   "require 'capybara-screenshot/rspec'\n" \
                   "Capybara::Screenshot.autosave_on_failure =\n" \
                   "  (ENV['SCR'] || ENV['AUTO_SCREENSHOT']) == '1'\n",
                   after: "Rails is not loaded until this point!\n"
end

#gitignoreObject



9
10
11
# File 'lib/blueberry_rails/app_builder.rb', line 9

def gitignore
  template 'gitignore_custom.erb', '.gitignore'
end

#hound_configObject



17
18
19
20
21
22
23
# File 'lib/blueberry_rails/app_builder.rb', line 17

def hound_config
  copy_file '../.hound.yml', '.hound.yml'
  copy_file '../.eslintrc', '.eslintrc'
  copy_file '../.rubocop.yml', '.rubocop.yml'

  run 'yarn add -D eslint eslint-config-airbnb-base eslint-config-import'
end

#init_gitObject



309
310
311
# File 'lib/blueberry_rails/app_builder.rb', line 309

def init_git
  run 'git init'
end

#init_guardObject



166
167
168
# File 'lib/blueberry_rails/app_builder.rb', line 166

def init_guard
  bundle_command 'exec guard init'
end

#install_deviseObject



239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
# File 'lib/blueberry_rails/app_builder.rb', line 239

def install_devise
  generate 'devise:install'
  generate_root_controller_and_route
  if options[:devise_model].present?
    generate 'devise', options[:devise_model]
  end

  if options[:administration]
    generate 'devise', 'administrator'
    replace_in_file 'app/models/administrator.rb',
                    ' :registerable,',
                    ''
  end

  copy_file 'locales/cs/cs.devise.yml', 'config/locales/cs/cs.devise.yml'

  rename_file 'config/locales/devise.en.yml',
              'config/locales/en/en.devise.yml'
end

#raise_on_unpermitted_parametersObject



176
177
178
179
# File 'lib/blueberry_rails/app_builder.rb', line 176

def raise_on_unpermitted_parameters
  configure_environment 'development',
    'config.action_controller.action_on_unpermitted_parameters = :raise'
end

#readmeObject



5
6
7
# File 'lib/blueberry_rails/app_builder.rb', line 5

def readme
  template 'README.md.erb', 'README.md'
end

#replace_root_controller_specObject



283
284
285
286
# File 'lib/blueberry_rails/app_builder.rb', line 283

def replace_root_controller_spec
  copy_file 'spec/controllers/root_controller_spec.rb',
            'spec/controllers/root_controller_spec.rb', force: true
end

#replace_users_factoryObject



274
275
276
277
278
279
280
281
# File 'lib/blueberry_rails/app_builder.rb', line 274

def replace_users_factory
  copy_file 'spec/factories/users.rb',
            'spec/factories/users.rb', force: true
  if options[:administration]
    copy_file 'spec/factories/administrators.rb',
              'spec/factories/administrators.rb', force: true
  end
end

#reviews_appObject



347
348
349
# File 'lib/blueberry_rails/app_builder.rb', line 347

def reviews_app
  template 'app.json.erb', 'app.json'
end

#setup_adminObject



58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/blueberry_rails/app_builder.rb', line 58

def setup_admin
  directory 'admin_controllers', 'app/controllers/admin'
  directory 'admin_views', 'app/views/admin'

  template 'views/layouts/admin.html.slim.erb',
           'app/views/layouts/admin.html.slim'

  inject_into_file 'config/routes.rb',
                   "\n  namespace :admin do\n" \
                   "    root to: 'dashboard#show'\n" \
                   "  end\n\n",
                   before: '  root'
end

#setup_gitignoreObject



295
296
297
298
299
300
301
302
303
304
305
306
307
# File 'lib/blueberry_rails/app_builder.rb', line 295

def setup_gitignore
  [
    'spec/lib',
    'spec/controllers',
    'spec/features',
    'spec/support/matchers',
    'spec/support/mixins',
    'spec/support/shared_examples'
  ].each do |dir|
    run "mkdir -p #{dir}"
    run "touch #{dir}/.keep"
  end
end

#setup_guardObject



170
171
172
173
174
# File 'lib/blueberry_rails/app_builder.rb', line 170

def setup_guard
  config = 'watch(%r{^spec/factories/(.+)\.rb$}) { |m| rspec.spec.call("models/factories") }'
  inject_into_file('Guardfile',
                   "\n\n  #{config}", before: "\nend")
end

#setup_integration_environmentObject



53
54
55
56
# File 'lib/blueberry_rails/app_builder.rb', line 53

def setup_integration_environment
  copy_file 'config/environments/production.rb',
            'config/environments/integration.rb'
end

#setup_mailer_hostsObject



32
33
34
35
36
37
38
# File 'lib/blueberry_rails/app_builder.rb', line 32

def setup_mailer_hosts
  action_mailer_host 'development', "development.#{app_name}.com"
  action_mailer_host 'test', "test.#{app_name}.com"
  action_mailer_host 'staging', "staging.#{app_name}.com"
  action_mailer_host 'integration', "integration.#{app_name}.com"
  action_mailer_host 'production', "#{app_name}.com"
end

#setup_rspec_support_filesObject



160
161
162
163
164
# File 'lib/blueberry_rails/app_builder.rb', line 160

def setup_rspec_support_files
  copy_file 'spec/factory_bot_syntax.rb', 'spec/support/factory_bot.rb'
  copy_file 'spec/database_cleaner_setup.rb', 'spec/support/database_cleaner.rb'
  copy_file 'spec/mail_body_helpers.rb', 'spec/support/mixins/mail_body_helpers.rb'
end

#setup_staging_environmentObject



45
46
47
48
49
50
51
# File 'lib/blueberry_rails/app_builder.rb', line 45

def setup_staging_environment
  run 'cp config/environments/production.rb config/environments/staging.rb'

  replace_in_file 'config/environments/staging.rb',
                  'config.consider_all_requests_local       = false',
                  'config.consider_all_requests_local       = true'
end

#test_factories_firstObject



156
157
158
# File 'lib/blueberry_rails/app_builder.rb', line 156

def test_factories_first
  copy_file 'spec/factories_spec.rb', 'spec/models/factories_spec.rb'
end

#use_postgres_config_templateObject



40
41
42
43
# File 'lib/blueberry_rails/app_builder.rb', line 40

def use_postgres_config_template
  template 'database.yml.erb', 'config/database.yml', force: true
  template 'database.yml.erb', 'config/database.yml.sample'
end