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