class Rails::AppBuilder
end
end
generate “rspec:install”
run “bundle install”
@generator.gem “rspec-rails”, group: [:development, :test]
def test
class CustomAppBuilder < Rails::AppBuilder
what those operations do so you can create another template action.
Gemfile, README, or JavaScript files, without needing to know exactly
This allows you to override entire operations, like the creation of the
generator.
generator without being forced to reverse the operations of the default
The application builder allows you to override elements of the application
def app
def app directory "app" empty_directory_with_keep_file "app/assets/images" keep_file "app/controllers/concerns" keep_file "app/models/concerns" end
def bin
def bin exclude_pattern = Regexp.union([(/thrust/ if skip_thruster?), (/rubocop/ if skip_rubocop?), (/brakeman/ if skip_brakeman?)].compact) directory "bin", { exclude_pattern: exclude_pattern } do |content| "#{shebang}\n" + content end chmod "bin", 0755 & ~File.umask, verbose: false end
def bin_when_updating
def bin_when_updating bin end
def cifiles
def cifiles empty_directory ".github/workflows" template "github/ci.yml", ".github/workflows/ci.yml" template "github/dependabot.yml", ".github/dependabot.yml" end
def config
def config empty_directory "config" inside "config" do template "routes.rb" unless options[:update] template "application.rb" template "environment.rb" template "cable.yml" unless options[:update] || options[:skip_action_cable] template "puma.rb" template "storage.yml" unless options[:update] || skip_active_storage? directory "environments" directory "initializers" directory "locales" unless options[:update] end end
def config_target_version
def config_target_version @config_target_version || Rails::VERSION::STRING.to_f end
def config_when_updating
def config_when_updating action_cable_config_exist = File.exist?("config/cable.yml") active_storage_config_exist = File.exist?("config/storage.yml") rack_cors_config_exist = File.exist?("config/initializers/cors.rb") assets_config_exist = File.exist?("config/initializers/assets.rb") asset_app_stylesheet_exist = File.exist?("app/assets/stylesheets/application.css") csp_config_exist = File.exist?("config/initializers/content_security_policy.rb") @config_target_version = Rails.application.config.loaded_config_version || "5.0" config if !options[:skip_action_cable] && !action_cable_config_exist template "config/cable.yml" end if !skip_active_storage? && !active_storage_config_exist template "config/storage.yml" end if skip_asset_pipeline? && !assets_config_exist remove_file "config/initializers/assets.rb" end if skip_asset_pipeline? && !asset_app_stylesheet_exist remove_file "app/assets/stylesheets/application.css" end unless rack_cors_config_exist remove_file "config/initializers/cors.rb" end if options[:api] unless csp_config_exist remove_file "config/initializers/content_security_policy.rb" end end end
def configru
def configru template "config.ru" end
def credentials
def credentials return if options[:pretend] || options[:dummy_app] require "rails/generators/rails/credentials/credentials_generator" Rails::Generators::CredentialsGenerator.new([], quiet: true).add_credentials_file end
def credentials_diff_enroll
def credentials_diff_enroll return if options[:skip_decrypted_diffs] || options[:dummy_app] || options[:pretend] @generator.shell.mute do rails_command "credentials:diff --enroll", inline: true, shell: @generator.shell end end
def database_yml
def database_yml template database.template, "config/database.yml" end
def db
def db directory "db" end
def devcontainer
def devcontainer devcontainer_options = { database: options[:database], redis: options[:skip_solid] && !(options[:skip_action_cable] && options[:skip_active_job]), kamal: !options[:skip_kamal], system_test: depends_on_system_test?, active_storage: !options[:skip_active_storage], dev: options[:dev], node: using_node?, app_name: app_name, skip_solid: options[:skip_solid] } Rails::Generators::DevcontainerGenerator.new([], devcontainer_options).invoke_all end
def dockerfiles
def dockerfiles template "Dockerfile" template "dockerignore", ".dockerignore" template "docker-entrypoint", "bin/docker-entrypoint" chmod "bin/docker-entrypoint", 0755 & ~File.umask, verbose: false end
def gemfile
def gemfile template "Gemfile" end
def gitattributes
def gitattributes template "gitattributes", ".gitattributes" end
def gitignore
def gitignore template "gitignore", ".gitignore" end
def lib
def lib empty_directory "lib" empty_directory_with_keep_file "lib/tasks" end
def log
def log empty_directory_with_keep_file "log" end
def master_key
def master_key return if options[:pretend] || options[:dummy_app] require "rails/generators/rails/master_key/master_key_generator" master_key_generator = Rails::Generators::MasterKeyGenerator.new([], quiet: options[:quiet], force: options[:force]) master_key_generator.add_master_key_file_silently master_key_generator.ignore_master_key_file_silently end
def node_version
def node_version template "node-version", ".node-version" end
def public_directory
def public_directory return if options[:update] && options[:api] directory "public", "public", recursive: false end
def rakefile
def rakefile template "Rakefile" end
def readme
def readme copy_file "README.md", "README.md" end
def rubocop
def rubocop template "rubocop.yml", ".rubocop.yml" end
def ruby_version
def ruby_version template "ruby-version", ".ruby-version" end
def script
def script empty_directory_with_keep_file "script" end
def storage
def storage empty_directory_with_keep_file "storage" empty_directory_with_keep_file "tmp/storage" end
def system_test
def system_test empty_directory_with_keep_file "test/system" template "test/application_system_test_case.rb" end
def test
def test empty_directory_with_keep_file "test/fixtures/files" empty_directory_with_keep_file "test/controllers" empty_directory_with_keep_file "test/mailers" empty_directory_with_keep_file "test/models" empty_directory_with_keep_file "test/helpers" empty_directory_with_keep_file "test/integration" template "test/test_helper.rb" end
def tmp
def tmp empty_directory_with_keep_file "tmp" empty_directory_with_keep_file "tmp/pids" end
def vendor
def vendor empty_directory_with_keep_file "vendor" end
def version_control
def version_control if !options[:skip_git] && !options[:pretend] run git_init_command, capture: options[:quiet], abort_on_failure: false end end