class MockRedis::Stream

Attributes

members[RW]

Public Class Methods

new() click to toggle source
# File lib/mock_redis/stream.rb, line 15
def initialize
  @members = Set.new
  @last_id = nil
end

Public Instance Methods

add(id, values) click to toggle source
# File lib/mock_redis/stream.rb, line 24
def add(id, values)
  @last_id = MockRedis::Stream::Id.new(id, min: @last_id)
  if @last_id.to_s == '0-0'
    raise Redis::CommandError,
      'ERR The ID specified in XADD must be greater than 0-0'
  end
  members.add [@last_id, Hash[values.map { |k, v| [k.to_s, v.to_s] }]]
  @last_id.to_s
end
each(&block) click to toggle source
# File lib/mock_redis/stream.rb, line 74
def each(&block)
  members.each(&block)
end
last_id() click to toggle source
# File lib/mock_redis/stream.rb, line 20
def last_id
  @last_id.to_s
end
range(start, finish, reversed, *opts_in) click to toggle source
# File lib/mock_redis/stream.rb, line 48
def range(start, finish, reversed, *opts_in)
  opts = options opts_in, ['count']
  start_id = MockRedis::Stream::Id.new(start)
  finish_id = MockRedis::Stream::Id.new(finish, sequence: Float::INFINITY)
  items = if start_id.exclusive
            members
              .select { |m| (start_id < m[0]) && (finish_id >= m[0]) }
              .map { |m| [m[0].to_s, m[1]] }
          else
            members
              .select { |m| (start_id <= m[0]) && (finish_id >= m[0]) }
              .map { |m| [m[0].to_s, m[1]] }
          end
  items.reverse! if reversed
  return items.first(opts['count'].to_i) if opts.key?('count')
  items
end
read(id, *opts_in) click to toggle source
# File lib/mock_redis/stream.rb, line 66
def read(id, *opts_in)
  opts = options opts_in, %w[count block]
  stream_id = MockRedis::Stream::Id.new(id)
  items = members.select { |m| (stream_id < m[0]) }.map { |m| [m[0].to_s, m[1]] }
  return items.first(opts['count'].to_i) if opts.key?('count')
  items
end
trim(count) click to toggle source
# File lib/mock_redis/stream.rb, line 34
def trim(count)
  deleted = @members.size - count
  if deleted > 0
    @members = if count == 0
                 Set.new
               else
                 @members.to_a[-count..].to_set
               end
    deleted
  else
    0
  end
end

Private Instance Methods

options(opts_in, permitted) click to toggle source
# File lib/mock_redis/stream.rb, line 80
def options(opts_in, permitted)
  opts_out = {}
  raise Redis::CommandError, 'ERR syntax error' unless (opts_in.length % 2).zero?
  opts_in.each_slice(2).map { |pair| opts_out[pair[0].downcase] = pair[1] }
  raise Redis::CommandError, 'ERR syntax error' unless (opts_out.keys - permitted).empty?
  opts_out
end