class Rails::PluginBuilder

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 plugin builder allows you to override elements of the plugin

def app

def app
  if mountable?
    if api?
      directory "app", exclude_pattern: %r{app/(views|helpers)}
    else
      directory "app"
      empty_directory_with_keep_file "app/assets/images/#{namespaced_name}"
    end
    empty_directory_with_keep_file "app/models/concerns"
    empty_directory_with_keep_file "app/controllers/concerns"
    remove_dir "app/mailers" if skip_action_mailer?
    remove_dir "app/jobs" if options[:skip_active_job]
  elsif full?
    empty_directory_with_keep_file "app/models"
    empty_directory_with_keep_file "app/controllers"
    empty_directory_with_keep_file "app/models/concerns"
    empty_directory_with_keep_file "app/controllers/concerns"
    empty_directory_with_keep_file "app/mailers" unless skip_action_mailer?
    empty_directory_with_keep_file "app/jobs" unless options[:skip_active_job]
    unless api?
      empty_directory_with_keep_file "app/assets/images/#{namespaced_name}"
      empty_directory_with_keep_file "app/helpers"
      empty_directory_with_keep_file "app/views"
    end
  end
end

def assets_manifest

def assets_manifest
  template "rails/engine_manifest.js", "app/assets/config/#{underscored_name}_manifest.js"
end

def bin(force = false)

def bin(force = false)
  bin_file = engine? ? "bin/rails.tt" : "bin/test.tt"
  template bin_file, force: force do |content|
    "#{shebang}\n" + content
  end
  chmod "bin", 0755, verbose: false
end

def config

def config
  template "config/routes.rb" if engine?
end

def gemfile

def gemfile
  template "Gemfile"
end

def gemfile_entry

def gemfile_entry
  return unless inside_application?
  gemfile_in_app_path = File.join(rails_app_path, "Gemfile")
  if File.exist? gemfile_in_app_path
    entry = "\ngem '#{name}', path: '#{relative_path}'"
    append_file gemfile_in_app_path, entry
  end
end

def gemspec

def gemspec
  template "%name%.gemspec"
end

def generate_test_dummy(force = false)

def generate_test_dummy(force = false)
  opts = options.transform_keys(&:to_sym).except(*DUMMY_IGNORE_OPTIONS)
  opts[:force] = force
  opts[:skip_bundle] = true
  opts[:skip_git] = true
  opts[:skip_hotwire] = true
  opts[:dummy_app] = true
  invoke Rails::Generators::AppGenerator,
    [ File.expand_path(dummy_path, destination_root) ], opts
end

def gitignore

def gitignore
  template "gitignore", ".gitignore"
end

def lib

def lib
  template "lib/%namespaced_name%.rb"
  template "lib/tasks/%namespaced_name%_tasks.rake"
  template "lib/%namespaced_name%/version.rb"
  if engine?
    template "lib/%namespaced_name%/engine.rb"
  else
    template "lib/%namespaced_name%/railtie.rb"
  end
end

def license

def license
  template "MIT-LICENSE" unless inside_application?
end

def rakefile

def rakefile
  template "Rakefile"
end

def readme

def readme
  template "README.md"
end

def stylesheets

def stylesheets
  if mountable?
    copy_file "rails/stylesheets.css",
              "app/assets/stylesheets/#{namespaced_name}/application.css"
  elsif full?
    empty_directory_with_keep_file "app/assets/stylesheets/#{namespaced_name}"
  end
end

def test

def test
  template "test/test_helper.rb"
  template "test/%namespaced_name%_test.rb"
  if engine?
    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/integration"
    unless api?
      empty_directory_with_keep_file "test/helpers"
    end
    template "test/integration/navigation_test.rb"
  end
end

def test_dummy_clean

def test_dummy_clean
  inside dummy_path do
    remove_file ".ruby-version"
    remove_file "db/seeds.rb"
    remove_file "Gemfile"
    remove_file "lib/tasks"
    remove_file "public/robots.txt"
    remove_file "README.md"
    remove_file "test"
    remove_file "vendor"
  end
end

def test_dummy_config

def test_dummy_config
  template "rails/boot.rb", "#{dummy_path}/config/boot.rb", force: true
  insert_into_file "#{dummy_path}/config/application.rb", <<~RUBY, after: /^Bundler\.require.+\n/
    require #{namespaced_name.inspect}
  RUBY
  if mountable?
    template "rails/routes.rb", "#{dummy_path}/config/routes.rb", force: true
  end
  if engine? && !api?
    insert_into_file "#{dummy_path}/config/application.rb", indent(<<~RUBY, 4), after: /^\s*config\.load_defaults.*\n/
      # For compatibility with applications that use this config
      config.action_controller.include_all_helpers = false
    RUBY
  end
end

def test_dummy_sprocket_assets

def test_dummy_sprocket_assets
  template "rails/stylesheets.css",   "#{dummy_path}/app/assets/stylesheets/application.css", force: true
  template "rails/dummy_manifest.js", "#{dummy_path}/app/assets/config/manifest.js", force: true
end

def user_default_branch

def user_default_branch
  @user_default_branch ||= `git config init.defaultbranch`
end

def version_control

def version_control
  if !options[:skip_git] && !options[:pretend]
    run "git init", capture: options[:quiet], abort_on_failure: false
    if user_default_branch.strip.empty?
      `git symbolic-ref HEAD refs/heads/main`
    end
  end
end