Class: Katapult::Generators::BasicsGenerator

Inherits:
Rails::Generators::Base
  • Object
show all
Includes:
Katapult::GeneratorGoodies
Defined in:
lib/generators/katapult/basics/basics_generator.rb

Constant Summary collapse

WEBPACK_DIR =
'app/webpack'
YARN_PACKAGES =
%w[
  autoprefixer
  autosize
  bootstrap-sass
  jquery
  jquery-ujs
  unpoly
]

Instance Method Summary collapse

Methods included from Katapult::GeneratorGoodies

#file_contains?, #yarn

Instance Method Details

#add_basic_filesObject



29
30
31
32
33
34
# File 'lib/generators/katapult/basics/basics_generator.rb', line 29

def add_basic_files
  template '.ruby-version'
  template '.gitignore', force: true
  template 'public/robots.txt', force: true
  template 'README.md', force: true
end

#add_modularity_load_pathsObject



223
224
225
226
227
228
229
230
231
# File 'lib/generators/katapult/basics/basics_generator.rb', line 223

def add_modularity_load_paths
  # This results in correct indentation :)
  application <<-'LOAD_PATHS'
config.autoload_paths << "#{Rails.root}/app/controllers/shared"
    config.autoload_paths << "#{Rails.root}/app/models/shared"
    config.autoload_paths << "#{Rails.root}/app/util"
    config.autoload_paths << "#{Rails.root}/app/util/shared"
  LOAD_PATHS
end

#bundle_installObject



46
47
48
49
50
51
52
53
54
55
56
# File 'lib/generators/katapult/basics/basics_generator.rb', line 46

def bundle_install
  run 'bundle install --quiet'

  # Fix Bundler for parallel_tests
  run 'bundle config --local disable_exec_load true'

  # This is relevant for the server, so it may happen after bundling here.
  # By having Nokogiri use system libraries, it will get automatic updates
  # of the frequently broken libxml (i.e. when the system libxml updates).
  run 'bundle config --local build.nokogiri --use-system-libraries'
end

#configure_action_mailerObject



124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
# File 'lib/generators/katapult/basics/basics_generator.rb', line 124

def configure_action_mailer
  app_con = 'app/controllers/application_controller.rb'
  inject_into_file app_con, <<-CONFIG, before: /end\n\z/
  before_action :make_action_mailer_use_request_host_and_protocol

  private

  def make_action_mailer_use_request_host_and_protocol
    ActionMailer::Base.default_url_options[:protocol] = request.protocol
    ActionMailer::Base.default_url_options[:host] = request.host_with_port
  end
  CONFIG

  gsub_file 'app/mailers/application_mailer.rb',
    /(^\s+default from:).*$/, '\1 Rails.configuration.system_email'
end

#configure_autoprefixerObject



304
305
306
# File 'lib/generators/katapult/basics/basics_generator.rb', line 304

def configure_autoprefixer
  template '.browserslistrc'
end

#configure_system_emailObject



153
154
155
# File 'lib/generators/katapult/basics/basics_generator.rb', line 153

def configure_system_email
  application "config.system_email = 'system@#{app_name}.com'\n"
end

#configure_test_environmentObject



108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
# File 'lib/generators/katapult/basics/basics_generator.rb', line 108

def configure_test_environment
  test_env = 'config/environments/test.rb'

  gsub_file test_env,
    /# Do not eager load code on boot.*config\.eager_load = false/m,
    'config.eager_load = true'
  gsub_file test_env,
    /  # Show full error.*\n  config\.consider_all_requests_local\s.*$/,
    '  config.consider_all_requests_local = false'
  gsub_file test_env,
    /  # Disable request forgery protection.*\n  config\.action_controller\.allow_forgery_protection\s.*$\n/,
    ''
  gsub_file test_env, /config\.action_controller\.perform_caching\s.*$/,
    'config.action_controller.perform_caching = true'
end

#copy_templatesObject



184
185
186
# File 'lib/generators/katapult/basics/basics_generator.rb', line 184

def copy_templates
  invoke 'katapult:templates'
end

#create_databasesObject



69
70
71
72
73
74
75
76
# File 'lib/generators/katapult/basics/basics_generator.rb', line 69

def create_databases
  # Need to unset RAILS_ENV variable for this sub command because
  # parallel_tests defaults to "test" only if the variable is not set (<->
  # empty string value). However, because this is run from a Rails
  # generator, the variable is already set to "development". Cannot set to
  # "test" either because parallel_tests is only loaded in development.
  run 'unset RAILS_ENV; bundle exec rake db:drop db:create parallel:drop parallel:create'
end

#disable_asset_debuggingObject

Faster



157
158
159
160
161
# File 'lib/generators/katapult/basics/basics_generator.rb', line 157

def disable_asset_debugging # Faster
  gsub_file 'config/environments/development.rb',
    /config\.assets\.debug =.*$/,
    'config.assets.debug = false'
end

#disable_migration_errorsObject



91
92
93
94
# File 'lib/generators/katapult/basics/basics_generator.rb', line 91

def disable_migration_errors
  development = 'config/environments/development.rb'
  gsub_file development, /(migration_error =) :page_load/, '\1 false'
end

#enhance_gemfileObject

Gems ###################################################################



38
39
40
41
42
43
44
# File 'lib/generators/katapult/basics/basics_generator.rb', line 38

def enhance_gemfile
  # Need to transfer the katapult line, because in tests, katapult is
  # installed with a custom :path option
  @katapult = File.readlines('Gemfile').find{ |line| line =~ /^gem 'katapult'/ }
  template 'Gemfile', force: true
  template 'Gemfile.lock', force: true
end

#install_application_layoutObject

Configure Rails ########################################################



81
82
83
84
# File 'lib/generators/katapult/basics/basics_generator.rb', line 81

def install_application_layout
  remove_file 'app/views/layouts/application.html.erb'
  directory 'app/views/layouts'
end

#install_capistranoObject



266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
# File 'lib/generators/katapult/basics/basics_generator.rb', line 266

def install_capistrano
  # Create Capfile *before* installing Capistrano to prevent annoying
  # Harrow.io ad
  template 'Capfile', force: true
  run 'cap install'

  deploy_rb = File.read('config/deploy.rb')
  @version = deploy_rb[/^lock.*?([\d\.]+)/, 1]
  template 'config/deploy.rb', force: true
  template 'config/deploy/staging.rb', force: true
  template 'config/deploy/production.rb', force: true

  directory 'lib/capistrano/tasks'
  template 'lib/tasks/pending_migrations.rake'

  # Whenever needs this file for deployment
  create_file 'config/schedule.rb'
end

#install_cucumberObject



233
234
235
236
237
238
239
240
241
242
243
244
245
246
# File 'lib/generators/katapult/basics/basics_generator.rb', line 233

def install_cucumber
  run 'spring stop' # Spring constantly causes trouble here

  generate 'cucumber:install'
  directory 'features/support'
  template 'config/cucumber.yml', force: true

  # Remove cucumber section from database.yml. Don't need this.
  gsub_file 'config/database.yml', /^cucumber.*\z/m, ''

  environment <<~ACTIVE_JOB, env: 'test'
    config.active_job.queue_adapter = :inline
  ACTIVE_JOB
end

#install_errors_controllerObject



171
172
173
174
# File 'lib/generators/katapult/basics/basics_generator.rb', line 171

def install_errors_controller
  template 'app/controllers/errors_controller.rb'
  route 'resources :errors, only: :new'
end

#install_extObject



180
181
182
# File 'lib/generators/katapult/basics/basics_generator.rb', line 180

def install_ext
  directory 'lib/ext'
end

#install_helpersObject



163
164
165
# File 'lib/generators/katapult/basics/basics_generator.rb', line 163

def install_helpers
  directory 'app/helpers'
end

#install_initializersObject



176
177
178
# File 'lib/generators/katapult/basics/basics_generator.rb', line 176

def install_initializers
  directory 'config/initializers'
end

#install_rspecObject



248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
# File 'lib/generators/katapult/basics/basics_generator.rb', line 248

def install_rspec
  generate 'rspec:install'

  directory 'spec'

  gsub_file '.rspec', "--warnings\n", '' # Don't show Ruby warnings
  template '.rspec_parallel'

  merge_rails_helper_into_spec_helper

  uncomment_lines 'spec/spec_helper.rb', /Dir.Rails.root.join.+spec.support/
  gsub_file 'spec/spec_helper.rb',
    /^  config\.use_transactional_fixtures = true/, <<-CONTENT
  # RSpec's transaction logic needs to be disabled for DatabaseCleaner to work
  config.use_transactional_fixtures = false
  CONTENT
end

#prepare_application_recordObject



167
168
169
# File 'lib/generators/katapult/basics/basics_generator.rb', line 167

def prepare_application_record
  template 'app/models/application_record.rb', force: true
end

#remove_asset_pipeline_tracesObject

We’re using Webpacker



87
88
89
# File 'lib/generators/katapult/basics/basics_generator.rb', line 87

def remove_asset_pipeline_traces
  remove_dir 'app/assets'
end

#set_timezoneObject



141
142
143
144
145
146
147
148
149
150
151
# File 'lib/generators/katapult/basics/basics_generator.rb', line 141

def set_timezone
  # This results in correct indentation :)
  application <<-'LOAD_PATHS'
config.time_zone = 'Berlin'
    config.active_record.default_timezone = :local
    config.active_record.time_zone_aware_attributes = false
    LOAD_PATHS
  gsub_file 'config/application.rb',
    /# config\.time_zone =.*$/,
    "config.time_zone = 'Berlin'"
end

#setup_guardObject



217
218
219
220
221
# File 'lib/generators/katapult/basics/basics_generator.rb', line 217

def setup_guard
  template 'Guardfile'
  environment "config.middleware.use Rack::LiveReload\n", env: :development
  environment "config.assets.digest = false # For Guard::Livereload\n", env: :development
end

#setup_springObject

Configure 3rd party ####################################################



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
# File 'lib/generators/katapult/basics/basics_generator.rb', line 190

def setup_spring
  run 'bundle exec spring binstub --all'

  # Enhance Spring config
  config = 'config/spring.rb'
  inject_into_file config, <<-DIR, after: /\A%w\(\n/
  lib/templates
  DIR
  prepend_to_file config, <<-MKDIR
# Custom generator templates are put into lib/templates
FileUtils.mkdir_p 'lib/templates'

  MKDIR

  # Parallel-fix binstubs
  Dir['bin/*'].each do |binstub|
    if File.read(binstub) =~ /load.*spring/
      inject_into_file binstub, <<-PARALLEL, after: /\A.*\n/
running_in_parallel = ENV.has_key?('TEST_ENV_NUMBER') || ARGV.any? { |arg| arg =~ /^parallel:/ }

      PARALLEL

      gsub_file binstub, /^(\s*load .*spring.*)$/, '\1 unless running_in_parallel'
    end
  end
end

#setup_stagingObject



96
97
98
99
100
101
102
103
104
105
106
# File 'lib/generators/katapult/basics/basics_generator.rb', line 96

def setup_staging
  template 'config/environments/staging.rb'

  # Cheating in the "staging" secret between "test" and "production"
  secret = run('bundle exec rake secret', capture: true).chomp
  insert_into_file 'config/secrets.yml', <<~SECRET, after: "test:\n"
    secret_key_base: #{ secret }

  staging:
  SECRET
end

#setup_webpackerObject



285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
# File 'lib/generators/katapult/basics/basics_generator.rb', line 285

def setup_webpacker
  remove_dir 'app/javascript'
  directory WEBPACK_DIR
  directory 'config/webpack'

  gsub_file 'config/webpacker.yml', /^(  source_path:).*$/, '\1 ' + WEBPACK_DIR
  inject_into_file 'config/webpack/environment.js', <<~JQUERY, after: /\A.*\n/ # 1st line
  const webpack = require('webpack')

  environment.plugins.prepend('Provide', new webpack.ProvidePlugin({
      $: 'jquery',
      jQuery: 'jquery'
    })
  )
  JQUERY

  yarn :add, *YARN_PACKAGES
end

#write_database_ymlsObject

Database ###############################################################



61
62
63
64
65
66
67
# File 'lib/generators/katapult/basics/basics_generator.rb', line 61

def write_database_ymls
  @db_user = options.db_user
  @db_password = options.db_password

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