Skip to content
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
4 changes: 2 additions & 2 deletions Gemfile.lock
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ GEM
json (~> 1.8)
multi_xml (>= 0.5.2)
i18n (0.7.0)
json (1.8.3)
json (1.8.6)
loofah (2.0.3)
nokogiri (>= 1.5.9)
mail (2.6.3)
Expand Down Expand Up @@ -204,4 +204,4 @@ DEPENDENCIES
yard (~> 0.8)

BUNDLED WITH
1.11.2
1.14.6
37 changes: 24 additions & 13 deletions lib/async_cache.rb
Original file line number Diff line number Diff line change
@@ -1,20 +1,31 @@
require 'sourcify'

module AsyncCache
class << self
def backend
@backend || Rails.cache
end
def backend=(backend)
@backend = backend
end
DEFAULT_OPTIONS = {
# How long Sidekiq Enterprise should hold a uniqueness lock. The default
# is 10 minutes.
uniqueness_timeout: 600,
}

def logger
@logger || Rails.logger
end
def logger=(logger)
@logger = logger
end
def self.options
@options ||= DEFAULT_OPTIONS.dup
end
def self.options=(options)
@options = options
end

def self.backend
@backend ||= Rails.cache
end
def self.backend=(backend)
@backend = backend
end

def self.logger
@logger ||= Rails.logger
end
def self.logger=(logger)
@logger = logger
end
end

Expand Down
15 changes: 13 additions & 2 deletions lib/async_cache/workers/sidekiq.rb
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,19 @@ class SidekiqWorker
include Base
include Sidekiq::Worker

# Only allow one job per set of arguments to ever be in the queue
sidekiq_options :unique => :until_executed
# Pulled out into a module so it can be tested.
module Options

Choose a reason for hiding this comment

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

😍

def self.included(mod)
if defined?(Sidekiq::Enterprise)
mod.sidekiq_options unique_for: AsyncCache.options[:uniqueness_timeout]
elsif defined?(SidekiqUniqueJobs)
# Only allow one job per set of arguments to ever be in the queue
mod.sidekiq_options unique: :until_executed
end
end
end

include Options

# Use the Sidekiq API to see if there are worker processes available to
# handle the async cache jobs queue.
Expand Down
4 changes: 4 additions & 0 deletions spec/spec_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,8 @@
Rails.cache = ActiveSupport::Cache::MemoryStore.new
Rails.logger = Logger.new($stdout).tap { |log| log.level = Logger::ERROR }

# Fake the `sidekiq-unique-jobs` gem being loaded.
module SidekiqUniqueJobs
end

require 'async_cache'
37 changes: 37 additions & 0 deletions spec/workers/sidekiq_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,13 @@
AsyncCache::Workers::SidekiqWorker
end

describe '.sidekiq_options' do
# See `spec_helper.rb` which makes it think the gem is loaded.
it 'has the uniqueness option for `sidekiq-unique-jobs`' do
expect(subject.sidekiq_options_hash).to include 'unique'
end
end

describe '::has_workers?' do
it 'returns false if no Sidekiq queues are available' do
allow(subject).to receive(:sidekiq_options).and_return({'queue' => 'good_queue'})
Expand Down Expand Up @@ -37,4 +44,34 @@
)
end
end

describe AsyncCache::Workers::SidekiqWorker::Options do
subject do
AsyncCache::Workers::SidekiqWorker::Options
end

before do
# Set by `spec_helper.rb`.
hide_const 'SidekiqUniqueJobs'

class Worker
end
end

it 'sets correct option for `sidekiq-unique-jobs`' do
stub_const 'SidekiqUniqueJobs', Module.new

expect(Worker).to receive(:sidekiq_options).with(unique: :until_executed)

Worker.include subject
end

it 'sets correct options for Sidekiq Enterprise' do
stub_const 'Sidekiq::Enterprise', Module.new

expect(Worker).to receive(:sidekiq_options).with(unique_for: AsyncCache.options[:uniqueness_timeout])

Worker.include subject
end
end
end