Sha256: b7cf95d204b3ec7331b84ade027354f597343e838789c1d353ea37b2fdb28375

Contents?: true

Size: 2 KB

Versions: 1

Compression:

Stored size: 2 KB

Contents

class RedisClassy
  class << self
    attr_writer :redis

    Redis::Namespace::COMMANDS.keys.each do |command|
      define_method(command) do |*args, &block|
        if @singleton
          new('singleton').send(command, *args, &block)
        else
          redis.send(command, *args, &block)
        end
      end
    end

    def redis
      @redis ||= begin
        if self == RedisClassy
          # only RedisClassy itself holds the raw non-namespaced Redis instance
          nil
        else
          # subclasses of RedisClassy
          raise Error.new('RedisClassy.redis must be assigned first') if RedisClassy.redis.nil?
          Redis::Namespace.new(self.name, redis: RedisClassy.redis)
        end
      end
    end

    def on(key)
      new(key)
    end

    def method_missing(command, *args, &block)
      if @singleton
        new('singleton').send(command, *args, &block)
      else
        super
      end
    end

    # Singletons

    attr_reader :singletons_keys

    def singletons(*args)
      args.each do |key|
        @singletons_keys ||= []
        @singletons_keys << key
        define_singleton_method(key) do
          new key
        end
      end
    end

    def singleton
      @singleton = true
    end
  end

  # Instance methods

  attr_accessor :key, :redis, :object

  def initialize(object)
    @redis = self.class.redis
    @object = object

    case object
    when String, Symbol, Integer
      @key = object.to_s
    else
      if object.respond_to?(:id)
        @key = object.id.to_s
      else
        raise ArgumentError, 'object must be a string, symbol, integer or respond to :id method'
      end
    end
  end

  KEYLESS_COMMANDS = [:multi, :pipelined, :exec, :eval]

  def method_missing(command, *args, &block)
    if @redis.respond_to?(command)
      case command
      when *KEYLESS_COMMANDS
        @redis.send(command, *args, &block)
      else
        @redis.send(command, @key, *args, &block)
      end
    else
      super
    end
  end

  Error = Class.new(StandardError)
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
redis-classy-2.3.1 lib/redis_classy.rb