#!/usr/bin/env ruby # This script simplifies the usage of `katapult` by grouping relevant actions # that the user else had to perform manually. require_relative '../lib/katapult/version' require_relative '../lib/katapult/support/binary_util' util = Katapult::BinaryUtil require 'optparse' options = {} OptionParser.new do |opts| opts.on '-u', '--db-user USER', 'Database user name' do |name| options[:dbuser] = name end opts.on '-p', '--db-password PASS', 'Database password' do |password| options[:dbpass] = password end opts.on '-v', '--verbose', 'Verbose output' do |verbose| options[:verbose] = verbose end end.parse! # Check Ruby version ########################################################### supported_ruby = Katapult::RUBY_VERSION current_ruby = `ruby -v`.chomp # Long version string à la "ruby 2.5.0p0 ..." current_ruby.include?(supported_ruby) or util.fail <<-MSG Ruby version error Your current Ruby (#{current_ruby}) is not supported by this version of katapult. Please switch to Ruby #{supported_ruby} and run again. MSG # Prepare output ############################################################### # This is also used as README heading version = <<-VERSION Katapult #{Katapult::VERSION} Generating a Rails #{Katapult::RAILS_VERSION} app on Ruby #{Katapult::RUBY_VERSION}. VERSION usage = <<-USAGE Usage: katapult Commands: new APP_NAME Generate a configured Rails application fire [PATH] Transform application model into code Default path: lib/katapult/application_model.rb templates Copy templates to lib/templates/katapult version Print version USAGE case ARGV.shift when 'new' app_name = ARGV.shift || util.ask('Please enter the application name:') app_name = util.snake_case(app_name) puts "Normalized application name: #{app_name}" if options[:verbose] # Any options that haven't be passed via command line should be asked for options[:dbuser] ||= util.ask 'Please enter the database user:' options[:dbpass] ||= util.ask 'Please enter the database password:' basics_command = 'bundle exec rails generate katapult:basics' basics_command << ' --db-user ' << options[:dbuser] basics_command << ' --db-password ' << options[:dbpass] util.pink "Creating new Rails application in #{app_name} ..." util.create_rails_app app_name Dir.chdir app_name util.pink 'Initializing git repository ...' util.run 'git init --quiet' util.git_commit "rails new #{ app_name }", '--quiet' util.pink 'Installing katapult ...' File.open('Gemfile', 'a') do |file| file.puts "gem 'katapult', '#{ Katapult::VERSION }', group: :development #{ ENV['KATAPULT_GEMFILE_OPTIONS'] }" end # "update rails" ensures the application uses the Rails version that katapult # requires (the default Gemfile lists Rails with ~>, meaning the patch level # may mismatch). It also installs katapult. util.run 'bundle update rails --quiet' util.run 'bundle exec rails generate katapult:app_model' util.git_commit 'rails generate katapult:app_model', '--quiet' util.pink 'Generating katapult basics ...' util.run basics_command # Do not use `basics_command` as commit message, it contains the db password! util.git_commit 'rails generate katapult:basics', '--quiet' util.pink <<-INSTRUCTIONS Application initialization done. Next steps: - \`cd #{app_name}\` - Customize Katapult's template files in lib/templates/katapult - Model your application in lib/katapult/application_model.rb and transform it into code by running \`katapult fire\` - Run \`bundle update\` if you want to use the latest versions of all gems - Configure public/robots.txt - Write a README INSTRUCTIONS when 'fire' app_model_path = ARGV.shift || 'lib/katapult/application_model.rb' transform_command = 'bin/rails generate katapult:transform ' + app_model_path util.pink 'Loading katapult ...' util.run transform_command util.pink 'Committing result ...' util.git_commit transform_command util.pink <<-INSTRUCTIONS Model transformation done. Now boot up your development server (e.g. with `rails server`) and try your kickstarted application in the browser! INSTRUCTIONS when 'templates' util.run 'bundle exec rails generate katapult:templates' util.pink 'Templates copied to lib/templates/katapult.' when 'version' puts version else puts version puts puts usage end