-
Notifications
You must be signed in to change notification settings - Fork 0
Add generator for sidekiq #17
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
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,93 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| # 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_web_ui, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| type: :boolean, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| aliases: "-sw", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| default: false, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| desc: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "Tell us if you want to skip sidekiq routes for viewing Web UI. Defaults to false." | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| class_option :skip_authenticated_web_ui, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| type: :boolean, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| aliases: "-saw", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| default: false, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| desc: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "Tell us if you want sidekiq web UI 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_web_ui | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| return if options[:skip_web_ui] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| say "Adding sidekiq web UI", :green | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| if options[:skip_authenticated_web_ui] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| route = "mount Sidekiq::Web => '/sidekiq'\n\n" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| else | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| route = <<~RUBY | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| authenticate :user do | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| mount Sidekiq::Web => '/sidekiq' | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| end | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| RUBY | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| end | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+49
to
+64
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Don’t assume Devise; generate a safe route that works without it. Using Apply this diff: def add_sidekiq_web_ui
return if options[:skip_web_ui]
say "Adding sidekiq web UI", :green
- if options[:skip_authenticated_web_ui]
- route = "mount Sidekiq::Web => '/sidekiq'\n\n"
- else
- route = <<~RUBY
- authenticate :user do
- mount Sidekiq::Web => '/sidekiq'
- end
-
- RUBY
- end
+ mount_line = "mount Sidekiq::Web => '/sidekiq'"
+ if options[:skip_authenticated_web_ui]
+ route = "#{mount_line}\n\n"
+ else
+ route = <<~RUBY
+ if defined?(Devise)
+ authenticate :user do
+ #{mount_line}
+ end
+ else
+ #{mount_line}
+ end
+
+ RUBY
+ end📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| inject_into_file "config/routes.rb", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| "require 'sidekiq/web'\n\n", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| before: "Rails.application.routes.draw do\n" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| inject_into_file "config/routes.rb", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
coolprobn marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 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 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+74
to
+79
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Append Without a newline, the worker entry can be glued to the last line. Also, prevent multiple worker lines across repeated runs. Apply this diff: 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"
+ path = "Procfile.dev"
+ content = File.read(path)
+ return if content.include?("worker: bundle exec sidekiq")
+
+ needs_newline = !content.end_with?("\n")
+ append_to_file path, "#{needs_newline ? "\n" : ""}worker: bundle exec sidekiq\n"
end📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 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.", | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+81
to
+90
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Fix options mismatch in
Apply this diff: 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.",
- :yellow
- end
+ return if options[:skip_web_ui]
+
+ if options[:skip_authenticated_web_ui]
+ say "\nWe've added Sidekiq routes. Please protect it with authentication as necessary to suit your requirements.",
+ :yellow
+ else
+ readme "README"
+ end
end📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| end | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| end | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| end | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 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. | ||
|
|
||
| =============================================================================== |
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,76 @@ | ||||||||||||||||||||||||||||||||||||||||
| # 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(/authenticate :user do/, 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_web_ui | ||||||||||||||||||||||||||||||||||||||||
| Dir.chdir(app_path) do | ||||||||||||||||||||||||||||||||||||||||
| quietly { run_generator %w[--skip_web_ui] } | ||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||
| assert_file "config/routes.rb" do |content| | ||||||||||||||||||||||||||||||||||||||||
| assert_no_match(/mount Sidekiq::Web/, content) | ||||||||||||||||||||||||||||||||||||||||
| end | ||||||||||||||||||||||||||||||||||||||||
| end | ||||||||||||||||||||||||||||||||||||||||
| end | ||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+39
to
+47
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧹 Nitpick Also assert Strengthens the contract when Apply this diff: assert_file "config/routes.rb" do |content|
assert_no_match(/mount Sidekiq::Web/, content)
+ assert_no_match(/require 'sidekiq\/web'/, content)
end📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||
| def test_should_skip_authenticated_web_ui | ||||||||||||||||||||||||||||||||||||||||
| Dir.chdir(app_path) do | ||||||||||||||||||||||||||||||||||||||||
| quietly { run_generator %w[--skip_authenticated_web_ui] } | ||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||
| assert_file "config/routes.rb" do |content| | ||||||||||||||||||||||||||||||||||||||||
| refute_match(/authenticate :user do/, content) | ||||||||||||||||||||||||||||||||||||||||
| assert_match(/mount Sidekiq::Web/, content) | ||||||||||||||||||||||||||||||||||||||||
| end | ||||||||||||||||||||||||||||||||||||||||
| end | ||||||||||||||||||||||||||||||||||||||||
| end | ||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||
| def test_should_skip_procfile_config | ||||||||||||||||||||||||||||||||||||||||
| 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 | ||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Avoid double bundling;
check_and_install_gemalready runsbundle install.This currently triggers
bundle installtwice, slowing the generator.Apply this diff:
def add_sidekiq_gem say "Adding sidekiq gem to Gemfile", :green check_and_install_gem("sidekiq") - bundle_install end📝 Committable suggestion
🤖 Prompt for AI Agents