Sha256: a290db7d15d4cc19394a0db580e7795c19f356d799d05ec386a3d13e9a0c2141

Contents?: true

Size: 1.5 KB

Versions: 1

Compression:

Stored size: 1.5 KB

Contents

class RedisClassy
  class << self
    attr_accessor :redis

    def inherited(subclass)
      raise Error.new('RedisClassy.redis is not assigned') unless RedisClassy.redis
      subclass.redis = Redis::Namespace.new(subclass.name, redis: RedisClassy.redis)
    end

    def singletons(*args)
      args.each do |key|
        define_singleton_method(key) do
          new key
        end
      end
    end

    def singleton
      @singleton = true
    end

    def keys(pattern = nil)
      @redis.keys(pattern || '*')
    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
  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.0.0 lib/redis_classy.rb