Skip to content
Merged
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
4 changes: 4 additions & 0 deletions Appraisals
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,7 @@ end
appraise "sidekiq-7.3" do
gem "sidekiq", "~> 7.3.0"
end

appraise "sidekiq-8.0" do
gem "sidekiq", "8.0.0.beta1"
end
27 changes: 27 additions & 0 deletions gemfiles/sidekiq_8.0.gemfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# This file was generated by Appraisal

source "https://rubygems.org"

gem "appraisal", git: "https://github.com/thoughtbot/appraisal.git"
gem "faraday-retry"
gem "gem-release"
gem "github-markup"
gem "rack-test"
gem "rake"
gem "rspec"
gem "rspec-benchmark"
gem "rspec-html-matchers"
gem "rspec-its"
gem "rubocop-mhenrixon"
gem "simplecov-sublime", ">= 0.21.2", require: false
gem "sinatra"
gem "timecop"
gem "toxiproxy"
gem "yard"
gem "sidekiq", "8.0.0.beta1"

platforms :mri do
gem "concurrent-ruby-ext"
end

gemspec path: "../"
72 changes: 39 additions & 33 deletions lib/sidekiq_unique_jobs/web.rb
Original file line number Diff line number Diff line change
Expand Up @@ -8,57 +8,55 @@ module SidekiqUniqueJobs
# @author Mikael Henriksson <[email protected]>
module Web
def self.registered(app) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
app.helpers do
include Web::Helpers
end
app.helpers Web::Helpers

app.get "/changelogs" do
@filter = h(params[:filter] || "*")
@filter = h(safe_url_params("filter") || "*")
@filter = "*" if @filter == ""
@count = h(params[:count] || 100).to_i
@current_cursor = h(params[:cursor]).to_i
@prev_cursor = h(params[:prev_cursor]).to_i
@count = h(safe_url_params("count") || 100).to_i
@current_cursor = h(safe_url_params("cursor")).to_i
@prev_cursor = h(safe_url_params("prev_cursor")).to_i
@total_size, @next_cursor, @changelogs = changelog.page(
cursor: @current_cursor,
pattern: @filter,
page_size: @count,
page_size: @count
)

erb(unique_template(:changelogs))
end

app.get "/changelogs/delete_all" do
changelog.clear
redirect_to :changelogs
safe_redirect_to :changelogs
end

app.get "/locks" do
@filter = h(params[:filter]) || "*"
@filter = h(safe_url_params("filter") || "*")
@filter = "*" if @filter == ""
@count = h(params[:count] || 100).to_i
@current_cursor = h(params[:cursor]).to_i
@prev_cursor = h(params[:prev_cursor]).to_i
@count = h(safe_url_params("count") || 100).to_i
@current_cursor = h(safe_url_params("cursor")).to_i
@prev_cursor = h(safe_url_params("prev_cursor")).to_i

@total_size, @next_cursor, @locks = digests.page(
cursor: @current_cursor,
pattern: @filter,
page_size: @count,
page_size: @count
)

erb(unique_template(:locks))
end

app.get "/expiring_locks" do
@filter = h(params[:filter]) || "*"
@filter = h(safe_url_params("filter") || "*")
@filter = "*" if @filter == ""
@count = h(params[:count] || 100).to_i
@current_cursor = h(params[:cursor]).to_i
@prev_cursor = h(params[:prev_cursor]).to_i
@count = h(safe_url_params("count") || 100).to_i
@current_cursor = h(safe_url_params("cursor")).to_i
@prev_cursor = h(safe_url_params("prev_cursor")).to_i

@total_size, @next_cursor, @locks = expiring_digests.page(
cursor: @current_cursor,
pattern: @filter,
page_size: @count,
page_size: @count
)

erb(unique_template(:locks))
Expand All @@ -67,29 +65,29 @@ def self.registered(app) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
app.get "/locks/delete_all" do
digests.delete_by_pattern("*", count: digests.count)
expiring_digests.delete_by_pattern("*", count: digests.count)
redirect_to :locks
safe_redirect_to :locks
end

app.get "/locks/:digest" do
@digest = h(params[:digest])
@digest = h(safe_route_params(:digest))
@lock = SidekiqUniqueJobs::Lock.new(@digest)

erb(unique_template(:lock))
end

app.get "/locks/:digest/delete" do
digests.delete_by_digest(h(params[:digest]))
expiring_digests.delete_by_digest(h(params[:digest]))
redirect_to :locks
digests.delete_by_digest(h(safe_route_params(:digest)))
expiring_digests.delete_by_digest(h(safe_route_params(:digest)))
safe_redirect_to :locks
end

app.get "/locks/:digest/jobs/:job_id/delete" do
@digest = h(params[:digest])
@job_id = h(params[:job_id])
@digest = h(safe_route_params(:digest))
@job_id = h(safe_route_params(:job_id))
@lock = SidekiqUniqueJobs::Lock.new(@digest)
@lock.unlock(@job_id)

redirect_to "locks/#{@lock.key}"
safe_redirect_to "locks/#{@lock.key}"
end
end
end
Expand All @@ -99,11 +97,19 @@ def self.registered(app) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
require "delegate" unless defined?(DelegateClass)
require "sidekiq/web" unless defined?(Sidekiq::Web)

Sidekiq::Web.register(SidekiqUniqueJobs::Web)
Sidekiq::Web.tabs["Locks"] = "locks"
Sidekiq::Web.tabs["Expiring Locks"] = "expiring_locks"
Sidekiq::Web.tabs["Changelogs"] = "changelogs"
if Sidekiq::MAJOR >= 8
Sidekiq::Web.configure do |config|
config.register_extension(SidekiqUniqueJobs::Web, name: "unique_jobs", tab: ["Locks", "Expiring Locks", "Changelogs"],
index: %w[locks/ expiring_locks/ changelogs/])
end
else
Sidekiq::Web.register(SidekiqUniqueJobs::Web)
Sidekiq::Web.tabs["Locks"] = "locks"
Sidekiq::Web.tabs["Expiring Locks"] = "expiring_locks"
Sidekiq::Web.tabs["Changelogs"] = "changelogs"
end

Sidekiq::Web.settings.locales << File.join(File.dirname(__FILE__), "locales")
rescue NameError, LoadError => ex
SidekiqUniqueJobs.logger.error(ex)
rescue NameError, LoadError => e
SidekiqUniqueJobs.logger.error(e)
end
22 changes: 21 additions & 1 deletion lib/sidekiq_unique_jobs/web/helpers.rb
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ def display_lock_args(args, truncate_after_chars = 2000)
#
# @return a redirect to the new subpath
#
def redirect_to(subpath)
def safe_redirect_to(subpath)
if respond_to?(:to)
# Sinatra-based web UI
redirect to(subpath)
Expand Down Expand Up @@ -170,6 +170,26 @@ def parse_time(time)
Time.parse(time.to_s)
end
end

# Copied from sidekiq for compatibility with older versions

# stuff after ? or form input
# uses String keys, no Symbols!
def safe_url_params(key)
return url_params(key) if Sidekiq::MAJOR >= 8

warn { "URL parameter `#{key}` should be accessed via String, not Symbol (at #{caller(3..3).first})" } if key.is_a?(Symbol)
request.params[key.to_s]
end

# variables embedded in path, `/metrics/:name`
# uses Symbol keys, no Strings!
def safe_route_params(key)
return route_params(key) if Sidekiq::MAJOR >= 8

warn { "Route parameter `#{key}` should be accessed via Symbol, not String (at #{caller(3..3).first})" } if key.is_a?(String)
env["rack.route_params"][key.to_sym]
end
end
end
end
4 changes: 2 additions & 2 deletions sidekiq-unique-jobs.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,9 @@ Gem::Specification.new do |spec|
spec.required_ruby_version = ">= 2.7"

spec.add_dependency "concurrent-ruby", "~> 1.0", ">= 1.0.5"
spec.add_dependency "sidekiq", ">= 7.0.0", "< 8.0.0"
spec.add_dependency "sidekiq", ">= 7.0.0", "< 9.0.0"
spec.add_dependency "thor", ">= 1.0", "< 3.0"
spec.metadata = {
"rubygems_mfa_required" => "true",
"rubygems_mfa_required" => "true"
}
end
Loading