Sha256: d5d0020ec63e42ec6c9558c68571f0ebd0acef1e0a0d146fe3605b2e03f720cf

Contents?: true

Size: 1.92 KB

Versions: 1

Compression:

Stored size: 1.92 KB

Contents

class Progressrus
  class Store
    class Redis < Base
      BACKEND_EXCEPTIONS = [ ::Redis::BaseError ]

      attr_reader :redis, :interval, :persisted_at, :prefix, :name

      def initialize(instance, prefix: "progressrus", interval: 1, now: Time.now)
        @name          = :redis
        @redis         = instance
        @persisted_ats = Hash.new({})
        @interval      = interval
        @prefix        = prefix
      end

      def persist(progress, now: Time.now, force: false)
        if outdated?(progress) || force
          redis.hset(key(progress.scope), progress.id, progress.to_serializeable.to_json)
          @persisted_ats[progress.scope][progress.id] = now
        end
      rescue *BACKEND_EXCEPTIONS => e
        raise Progressrus::Store::BackendError.new(e)
      end

      def scope(scope)
        scope = redis.hgetall(key(scope))
        scope.each_pair { |id, value|
          scope[id] = Progressrus.new(deserialize(value))
        }
      rescue *BACKEND_EXCEPTIONS => e
        raise Progressrus::Store::BackendError.new(e)
      end

      def find(scope, id)
        value = redis.hget(key(scope), id)
        return unless value

        Progressrus.new(deserialize(value))
      rescue *BACKEND_EXCEPTIONS => e
        raise Progressrus::Store::BackendError.new(e)
      end

      def flush(scope, id = nil)
        if id
          redis.hdel(key(scope), id)
        else
          redis.del(key(scope))
        end
      rescue *BACKEND_EXCEPTIONS => e
        raise Progressrus::Store::BackendError.new(e)
      end

      private

      def key(scope)
        "#{prefix}:#{scope.join(":")}"
      end

      def deserialize(value)
        JSON.parse(value, symbolize_names: true)
      end

      def outdated?(progress, now: Time.now)
        (now - interval).to_i >= persisted_at(progress).to_i
      end

      def persisted_at(progress)
        @persisted_ats[progress.scope][progress.id]
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
progressrus-0.0.3 lib/progressrus/store/redis.rb