Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add generator for sidekiq #17

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# Changelog

## master (unreleased)
* Adds Sidekiq generator. ([@TheZero0-ctrl][])

## 0.14.0 (Aug 4th, 2024)

Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ The boring generator introduces following generators:
- Install Rails ERD: `rails generate boring:rails_erd:install`
- Install Annotate: `rails generate boring:annotate:install`
- Install CanCanCan: `rails generate boring:cancancan:install`
- Install Sidekiq: `rails generate boring:sidekiq:install`

## Screencasts

Expand Down
91 changes: 91 additions & 0 deletions lib/generators/boring/sidekiq/install/install_generator.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
# frozen_string_literal: true

require 'boring_generators/generator_helper'

module Boring
module Sidekiq
class InstallGenerator < Rails::Generators::Base
include BoringGenerators::GeneratorHelper

desc "Adds Sidekiq to the application"
source_root File.expand_path("templates", __dir__)

class_option :skip_routes,
type: :boolean,
aliases: "-sr",
default: false,
desc: "Tell us if you want to skip sidekiq routes for viewing Web UI. Defaults to false."
class_option :authenticate_routes_with_devise,
type: :boolean,
aliases: "-ar",
default: false,
desc: "Tell us if you want sidekiq routes to only be accessed by authenticated users. Defaults to false."
class_option :skip_procfile_config,
type: :boolean,
aliases: "-sp",
default: false,
desc: "Tell us if you want to skip adding sidekiq worker to Procfile. Defaults to false."

def add_sidekiq_gem
say "Adding sidekiq gem to Gemfile", :green
check_and_install_gem("sidekiq")
bundle_install
end

def set_sidekiq_as_active_job_adapter
say "Setting sidekiq as active_job adapter", :green

inject_into_file "config/application.rb",
optimize_indentation(
"config.active_job.queue_adapter = :sidekiq\n",
4
),
after: /class Application < Rails::Application\n/

end

def add_sidekiq_routes
return if options[:skip_routes]

say "Adding sidekiq routes", :green

if options[:authenticate_routes_with_devise]
route = <<~RUBY
authenticate :user do
mount Sidekiq::Web => '/sidekiq'
end

RUBY
else
route = "mount Sidekiq::Web => '/sidekiq'\n\n"
end

inject_into_file "config/routes.rb",
"require 'sidekiq/web'\n\n",
before: "Rails.application.routes.draw do\n"

inject_into_file "config/routes.rb",
optimize_indentation(route, 2),
after: "Rails.application.routes.draw do\n"
end

def add_sidekiq_worker_to_procfile
return if options[:skip_procfile_config] || !File.exist?("Procfile.dev")

say "Adding sidekiq worker to Procfile.dev", :green
append_to_file "Procfile.dev", "worker: bundle exec sidekiq"
end

def show_message
return if options[:skip_routes]

if options[:authenticate_routes_with_devise]
readme "README"
else
say "\nWe've added Sidekiq routes. Please protect it as necessary to suit your requirements.",
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's update to " ... ... Please protect it with authentication as necessary ... ... ..."

:yellow
end
end
end
end
end
12 changes: 12 additions & 0 deletions lib/generators/boring/sidekiq/install/templates/README
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
===============================================================================

We've protected Sidekiq routes with Devise to ensure only authenticated users can access them.
This is implemented in the following snippet located in the config/routes.rb file.
```
authenticate :user do
mount Sidekiq::Web => '/sidekiq'
end
```
Please adjust it as necessary to suit your requirements.

===============================================================================
75 changes: 75 additions & 0 deletions test/generators/sidekiq/sidekiq_install_generator_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
# frozen_string_literal: true

require "test_helper"
require "generators/boring/sidekiq/install/install_generator"

class SidekiqInstallGeneratorTest < Rails::Generators::TestCase
tests Boring::Sidekiq::InstallGenerator
setup :build_app
teardown :teardown_app

include GeneratorHelper
include ActiveSupport::Testing::Isolation

def destination_root
app_path
end

def test_should_configure_sidekiq
Dir.chdir(app_path) do
add_procfile
quietly { run_generator }

assert_gem "sidekiq"
assert_file "config/application.rb" do |content|
assert_match(/config\.active_job\.queue_adapter = :sidekiq/, content)
end
assert_file "config/routes.rb" do |content|
assert_match(/require 'sidekiq\/web'/, content)
assert_match(/mount Sidekiq::Web/, content)
end

assert_file "Procfile.dev" do |content|
assert_match(/worker: bundle exec sidekiq/, content)
end
end
end

def test_should_skip_sidekiq_routes
Dir.chdir(app_path) do
quietly { run_generator %w[--skip-routes] }

assert_file "config/routes.rb" do |content|
assert_no_match(/mount Sidekiq::Web/, content)
end
end
end

def test_should_authenticate_routes_with_devise
Dir.chdir(app_path) do
quietly { run_generator %w[--authenticate_routes_with_devise] }

assert_file "config/routes.rb" do |content|
assert_match(/authenticate :user do/, content)
assert_match(/mount Sidekiq::Web/, content)
end
end
end

def test_should_skip_adding_sidekiq_worker_to_procfile
Dir.chdir(app_path) do
add_procfile
quietly { run_generator %w[--skip_procfile_config] }

assert_file "Procfile.dev" do |content|
assert_no_match(/worker: bundle exec sidekiq/, content)
end
end
end

private

def add_procfile
File.write("#{app_path}/Procfile.dev", "web: bin/rails server -p 3000 -b 0.0.0.0")
end
end