class SidekiqUniqueJobs::LockArgs

Handles uniqueness of sidekiq arguments

@author Mikael Henriksson <mikael@mhenrixon.com>

Attributes

args[R]

@!attribute [r] args

@return [Array<Objet>] the arguments passed to `perform_async`
item[R]

The sidekiq job hash @return [Hash] the Sidekiq job hash

Public Class Methods

call(item) click to toggle source

Convenience method for returning a digest @param [Hash] item a Sidekiq job hash @return [String] a unique digest

# File lib/sidekiq_unique_jobs/lock_args.rb, line 15
def self.call(item)
  new(item).lock_args
end
new(item) click to toggle source

@param [Hash] item a Sidekiq job hash

# File lib/sidekiq_unique_jobs/lock_args.rb, line 28
def initialize(item)
  @item         = item
  @worker_class = item[CLASS]
  @args         = item[ARGS]
end

Public Instance Methods

default_lock_args_method() click to toggle source

The global worker options defined in Sidekiq directly

# File lib/sidekiq_unique_jobs/lock_args.rb, line 108
def default_lock_args_method
  default_worker_options[LOCK_ARGS_METHOD] ||
    default_worker_options[UNIQUE_ARGS_METHOD]
end
default_worker_options() click to toggle source

The globally default worker options configured from Sidekiq

@return [Hash<String, Object>]

# File lib/sidekiq_unique_jobs/lock_args.rb, line 119
def default_worker_options
  @default_worker_options ||= Sidekiq.default_worker_options.stringify_keys
end
filter_by_proc(args) click to toggle source

Filters unique arguments by proc configured in the sidekiq worker @param [Array] args the arguments passed to the sidekiq worker @return [Array] with the filtered arguments

# File lib/sidekiq_unique_jobs/lock_args.rb, line 80
def filter_by_proc(args)
  lock_args_method.call(args)
end
filter_by_symbol(args) click to toggle source

Filters unique arguments by method configured in the sidekiq worker @param [Array] args the arguments passed to the sidekiq worker @return [Array] unfiltered unless {#worker_method_defined?} @return [Array] with the filtered arguments

# File lib/sidekiq_unique_jobs/lock_args.rb, line 88
def filter_by_symbol(args)
  return args unless worker_method_defined?(lock_args_method)

  worker_class.send(lock_args_method, args)
rescue ArgumentError
  raise SidekiqUniqueJobs::InvalidUniqueArguments,
        given: args,
        worker_class: worker_class,
        lock_args_method: lock_args_method
end
filtered_args() click to toggle source

Filters unique arguments by proc or symbol @return [Array] {#filter_by_proc} when {#lock_args_method} is a Proc @return [Array] {#filter_by_symbol} when {#lock_args_method} is a Symbol @return [Array] args unfiltered when neither of the above

# File lib/sidekiq_unique_jobs/lock_args.rb, line 64
def filtered_args
  return args if lock_args_disabled?

  json_args = Normalizer.jsonify(args)

  case lock_args_method
  when Proc
    filter_by_proc(json_args)
  when Symbol
    filter_by_symbol(json_args)
  end
end
lock_args() click to toggle source

The unique arguments to use for creating a lock @return [Array] the arguments filters by the {#filtered_args} method if {#lock_args_enabled?}

# File lib/sidekiq_unique_jobs/lock_args.rb, line 36
def lock_args
  @lock_args ||= filtered_args
end
lock_args_disabled?() click to toggle source

Checks if the worker class has disabled lock_args @return [true, false]

# File lib/sidekiq_unique_jobs/lock_args.rb, line 56
def lock_args_disabled?
  !lock_args_method
end
lock_args_enabled?() click to toggle source

Checks if the worker class has enabled lock_args @return [true, false]

# File lib/sidekiq_unique_jobs/lock_args.rb, line 42
def lock_args_enabled?
  # return false unless lock_args_method_valid?

  lock_args_method
end
lock_args_method() click to toggle source

The method to use for filtering unique arguments

# File lib/sidekiq_unique_jobs/lock_args.rb, line 100
def lock_args_method
  @lock_args_method ||= worker_options.slice(LOCK_ARGS_METHOD, UNIQUE_ARGS_METHOD).values.first
  @lock_args_method ||= :lock_args if worker_method_defined?(:lock_args)
  @lock_args_method ||= :unique_args if worker_method_defined?(:unique_args)
  @lock_args_method ||= default_lock_args_method
end
lock_args_method_valid?() click to toggle source

Validate that the lock_args_method is acceptable @return [true, false]

# File lib/sidekiq_unique_jobs/lock_args.rb, line 50
def lock_args_method_valid?
  [NilClass, TrueClass, FalseClass].none? { |klass| lock_args_method.is_a?(klass) }
end