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 181
    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 189
    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_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 172
    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 155
    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 159
    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 140
    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