class Kanban::Backlog

Attributes

item[R]
namespace[R]
queue[R]

Public Class Methods

new(backend:, **options) click to toggle source
# File lib/kanban/backlog.rb, line 13
def initialize(backend:, **options)
  @namespace = options.fetch :namespace, 'default'
  @queue = "#{@namespace}:#{options.fetch :queue, 'tasks'}"
  @item = "#{@namespace}:#{options.fetch :item, 'task'}"
  @backend = backend
end

Public Instance Methods

add(task) click to toggle source
# File lib/kanban/backlog.rb, line 36
def add(task)
  id = next_id
  @backend.hmset "#{@item}:#{id}", *task.to_a
  @backend.lpush "#{@queue}:todo", id
  id
end
add!(task) click to toggle source
# File lib/kanban/backlog.rb, line 44
def add!(task)
  safe = task.with_string_keys
  add(safe)
end
claim(duration: 3) click to toggle source
# File lib/kanban/backlog.rb, line 50
def claim(duration: 3)
  id = @backend.brpoplpush("#{@queue}:todo", "#{@queue}:doing")
  @backend.set "#{@item}:#{id}:claimed", true, ex: duration
  id.to_i
end
claimed?(id) click to toggle source
# File lib/kanban/backlog.rb, line 57
def claimed?(id)
  @backend.exists "#{@item}:#{id}:claimed"
end
complete(id) click to toggle source
# File lib/kanban/backlog.rb, line 67
def complete(id)
  @backend.setbit("#{@queue}:completed", id, 1).zero?
end
completed?(id) click to toggle source
# File lib/kanban/backlog.rb, line 72
def completed?(id)
  @backend.getbit("#{@queue}:completed", id) == 1
end
doing() click to toggle source
# File lib/kanban/backlog.rb, line 62
def doing
  @backend.lrange("#{@queue}:doing", 0, -1).map(&:to_i)
end
done?(id) click to toggle source
# File lib/kanban/backlog.rb, line 87
def done?(id)
  completed?(id) || unworkable?(id)
end
expire_claim(id) click to toggle source
# File lib/kanban/backlog.rb, line 98
def expire_claim(id)
  @backend.expire "#{@item}:#{id}:claimed", 0
end
get(id) click to toggle source
# File lib/kanban/backlog.rb, line 21
def get(id)
  @backend.hgetall "#{@item}:#{id}"
end
groom() click to toggle source
# File lib/kanban/backlog.rb, line 109
def groom
  doing.map do |id|
    next if claimed? id
    if done? id
      id if release id
    else
      id if requeue id
    end
  end.compact
end
next_id() click to toggle source
# File lib/kanban/backlog.rb, line 26
def next_id
  @backend.incr "#{@queue}:id"
end
release(id) click to toggle source
# File lib/kanban/backlog.rb, line 92
def release(id)
  expire_claim id
  @backend.lrem("#{@queue}:doing", 0, id) > 0
end
requeue(id) click to toggle source
# File lib/kanban/backlog.rb, line 103
def requeue(id)
  release id
  @backend.lpush("#{@queue}:todo", id) > 0
end
todo() click to toggle source
# File lib/kanban/backlog.rb, line 31
def todo
  @backend.lrange("#{@queue}:todo", 0, -1).map(&:to_i)
end
unworkable(id) click to toggle source
# File lib/kanban/backlog.rb, line 77
def unworkable(id)
  @backend.setbit("#{@queue}:unworkable", id, 1).zero?
end
unworkable?(id) click to toggle source
# File lib/kanban/backlog.rb, line 82
def unworkable?(id)
  @backend.getbit("#{@queue}:unworkable", id) == 1
end