lib/redis_lock.rb in redis_lock-0.3.1 vs lib/redis_lock.rb in redis_lock-0.4.0

- old
+ new

@@ -1,8 +1,7 @@ require 'redis' require "redis_lock/version" -require "redis_lock/configuration" class RedisLock attr_reader :key def self.config @@ -11,20 +10,23 @@ def self.setup yield config end - def self.semaphore(key, args = {}, &block) - setup_instance(key, args).semaphore(args, &block) + def self.semaphore(*args, &block) + opts = extract_options!(args) + Semaphore.new(MultiLock.new(*args, opts), opts).call(&block) end - def self.if_open(key, args = {}, &block) - setup_instance(key, args).if_open(args, &block) + def self.if_open(*args, &block) + opts = extract_options!(args) + IfOpen.new(MultiLock.new(*args, opts), opts).call(&block) end - def self.if_locked(key, args = {}, &block) - setup_instance(key, args).if_locked(args, &block) + def self.if_locked(*args, &block) + opts = extract_options!(args) + IfLocked.new(MultiLock.new(*args, opts), opts).call(&block) end def config; self.class.config; end def initialize(key, opts = {}) @@ -49,29 +51,21 @@ { ex: expiration_time } end redis.set(key, value, args.merge(opts)) == "OK" ? true : false end - def semaphore(args = {}, &block) - ttl = args[:ttl] || config.default_ttl - set_opts = args[:set_opts] || {} - while locked? - sleep (args[:wait] || 3) - end - set(ttl, set_opts) - _semaphore_perform(&block) + def semaphore(opts = {}, &block) + Semaphore.new(self, opts).call(&block) end - def if_open(args = {}, &block) - return if locked? - _perform(&block) + def if_open(opts = {}, &block) + IfOpen.new(self, opts).call(&block) end alias_method :perform, :if_open - def if_locked(args = {}, &block) - return if open? - _perform(&block) + def if_locked(opts = {}, &block) + IfLocked.new(self, opts).call(&block) end def locked? ttl == -2 ? false : true end @@ -96,30 +90,15 @@ def value redis.get(key) end - private - - def self.setup_instance(key, args) - inst_opts = { redis: args.delete(:redis) }.reject{ |_, v| v.nil? } - new(key, inst_opts) + def self.extract_options!(args) + args.last.is_a?(::Hash) ? args.pop : {} end - - def _semaphore_perform(&block) - yield self - rescue => e - config.logger.error "[#{self.class}] key: `#{key}` error:" - config.logger.error e - raise e - ensure - unlock! - end - - def _perform(&block) - yield self - rescue => e - config.logger.error "[#{self.class}] key: `#{key}` error:" - config.logger.error e - raise e - end end + +require "redis_lock/configuration" +require "redis_lock/semaphore" +require "redis_lock/if_open" +require "redis_lock/if_locked" +require "redis_lock/multi_lock"