The plugin builder allows you to override elements of the plugin generator without being forced to reverse the operations of the default generator.

This allows you to override entire operations, like the creation of the Gemfile, README, or JavaScript files, without needing to know exactly what those operations do so you can create another template action.

Methods

Constants

DUMMY_IGNORE_OPTIONS = %i[dev edge master template]

Instance Public methods

app()

📝 Source code
# File railties/lib/rails/generators/rails/plugin/plugin_generator.rb, line 20
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 options[: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 options[: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
🔎 See on GitHub

bin()

📝 Source code
# File railties/lib/rails/generators/rails/plugin/plugin_generator.rb, line 182
def bin
  exclude_pattern = Regexp.union([(engine? ? /test\.tt/ : /rails\.tt/), (/rubocop/ if skip_rubocop?)].compact)
  directory "bin", { exclude_pattern: exclude_pattern } do |content|
    "#{shebang}\n" + content
  end
  chmod "bin", 0755 & ~File.umask, verbose: false
end
🔎 See on GitHub

cifiles()

📝 Source code
# File railties/lib/rails/generators/rails/plugin/plugin_generator.rb, line 69
def cifiles
  empty_directory ".github/workflows"
  template "github/ci.yml", ".github/workflows/ci.yml"
  template "github/dependabot.yml", ".github/dependabot.yml"
end
🔎 See on GitHub

config()

📝 Source code
# File railties/lib/rails/generators/rails/plugin/plugin_generator.rb, line 97
def config
  template "config/routes.rb" if engine?
end
🔎 See on GitHub

gemfile()

📝 Source code
# File railties/lib/rails/generators/rails/plugin/plugin_generator.rb, line 53
def gemfile
  template "Gemfile"
end
🔎 See on GitHub

gemfile_entry()

📝 Source code
# File railties/lib/rails/generators/rails/plugin/plugin_generator.rb, line 190
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
🔎 See on GitHub

gemspec()

📝 Source code
# File railties/lib/rails/generators/rails/plugin/plugin_generator.rb, line 61
def gemspec
  template "%name%.gemspec"
end
🔎 See on GitHub

generate_test_dummy(force = false)

📝 Source code
# File railties/lib/rails/generators/rails/plugin/plugin_generator.rb, line 122
def generate_test_dummy(force = false)
  opts = options.transform_keys(&:to_sym).except(*DUMMY_IGNORE_OPTIONS)
  opts[:force] = force
  opts[:skip_thruster] = true
  opts[:skip_brakeman] = true
  opts[:skip_bundler_audit] = true
  opts[:skip_bundle] = true
  opts[:skip_ci] = true
  opts[:skip_kamal] = true
  opts[:skip_solid] = true
  opts[:skip_git] = true
  opts[:skip_hotwire] = true
  opts[:skip_rubocop] = true
  opts[:dummy_app] = true

  invoke Rails::Generators::AppGenerator,
    [ File.expand_path(dummy_path, destination_root) ], opts
end
🔎 See on GitHub

gitignore()

📝 Source code
# File railties/lib/rails/generators/rails/plugin/plugin_generator.rb, line 65
def gitignore
  template "gitignore", ".gitignore"
end
🔎 See on GitHub

lib()

📝 Source code
# File railties/lib/rails/generators/rails/plugin/plugin_generator.rb, line 85
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
🔎 See on GitHub

license()

📝 Source code
# File railties/lib/rails/generators/rails/plugin/plugin_generator.rb, line 57
def license
  template "MIT-LICENSE" unless inside_application?
end
🔎 See on GitHub

rakefile()

📝 Source code
# File railties/lib/rails/generators/rails/plugin/plugin_generator.rb, line 16
def rakefile
  template "Rakefile"
end
🔎 See on GitHub

readme()

📝 Source code
# File railties/lib/rails/generators/rails/plugin/plugin_generator.rb, line 49
def readme
  template "README.md"
end
🔎 See on GitHub

rubocop()

📝 Source code
# File railties/lib/rails/generators/rails/plugin/plugin_generator.rb, line 75
def rubocop
  template "rubocop.yml", ".rubocop.yml"
end
🔎 See on GitHub

stylesheets()

📝 Source code
# File railties/lib/rails/generators/rails/plugin/plugin_generator.rb, line 173
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
🔎 See on GitHub

test()

📝 Source code
# File railties/lib/rails/generators/rails/plugin/plugin_generator.rb, line 101
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
🔎 See on GitHub

test_dummy_assets()

📝 Source code
# File railties/lib/rails/generators/rails/plugin/plugin_generator.rb, line 156
def test_dummy_assets
  template "rails/stylesheets.css", "#{dummy_path}/app/assets/stylesheets/application.css", force: true
end
🔎 See on GitHub

test_dummy_clean()

📝 Source code
# File railties/lib/rails/generators/rails/plugin/plugin_generator.rb, line 160
def test_dummy_clean
  inside dummy_path do
    remove_file ".ruby-version"
    remove_dir "db"
    remove_file "Gemfile"
    remove_dir "lib"
    remove_file "public/robots.txt"
    remove_file "README.md"
    remove_file "test"
    remove_file "vendor"
  end
end
🔎 See on GitHub

test_dummy_config()

📝 Source code
# File railties/lib/rails/generators/rails/plugin/plugin_generator.rb, line 141
def test_dummy_config
  template "rails/boot.rb", "#{dummy_path}/config/boot.rb", force: true

  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
🔎 See on GitHub

version_control()

📝 Source code
# File railties/lib/rails/generators/rails/plugin/plugin_generator.rb, line 79
def version_control
  if !options[:skip_git] && !options[:pretend]
    run git_init_command, capture: options[:quiet], abort_on_failure: false
  end
end
🔎 See on GitHub

Definition files