Sha256: e5b1364e2a8da6914105f5a8a4c9700d69385adff20841d7b591030aeb80f6ca
Contents?: true
Size: 1.67 KB
Versions: 2
Compression:
Stored size: 1.67 KB
Contents
# frozen_string_literal: true module AcidicJob class IdempotencyKey def self.generate(unique_by:, job_class:) new(:job_args).value_for({ "job_class" => job_class }, Marshal.dump(unique_by)) end def initialize(identifier = :job_id) @identifier = identifier end def value_for(hash_or_job, *args, **kwargs) return value_from_job_args(hash_or_job, *args, **kwargs) if @identifier == :job_args value = if hash_or_job.is_a?(Hash) value_from_job_id_for_hash(hash_or_job) else value_from_job_id_for_obj(hash_or_job) end value || value_from_job_args(hash_or_job, *args, **kwargs) end private def value_from_job_id_for_hash(hash) if hash.key?("job_id") return if hash["job_id"].nil? return if hash["job_id"].empty? hash["job_id"] elsif hash.key?("jid") return if hash["jid"].nil? return if hash["jid"].empty? hash["jid"] end end def value_from_job_id_for_obj(obj) if obj.respond_to?(:job_id) return if obj.job_id.nil? return if obj.job_id.empty? obj.job_id elsif obj.respond_to?(:jid) return if obj.jid.nil? return if obj.jid.empty? obj.jid end end def value_from_job_args(hash_or_job, *args, **kwargs) worker_class = case hash_or_job when Hash hash_or_job["worker"] || hash_or_job["job_class"] else hash_or_job.class.name end Digest::SHA1.hexdigest [worker_class, args, kwargs].flatten.join end end end
Version data entries
2 entries across 2 versions & 1 rubygems
Version | Path |
---|---|
acidic_job-1.0.0.pre11 | lib/acidic_job/idempotency_key.rb |
acidic_job-1.0.0.pre10 | lib/acidic_job/idempotency_key.rb |