module Risky::CronList

Public Class Methods

included(base) click to toggle source
# File lib/risky/cron_list.rb, line 41
def self.included(base)
  base.value :items, :default => []
  base.extend ClassMethods
end
new(*a) click to toggle source
Calls superclass method
# File lib/risky/cron_list.rb, line 46
def initialize(*a)
  super *a

  @added_items ||= []
  @removed_items ||= []
end

Public Instance Methods

<<(item) click to toggle source
# File lib/risky/cron_list.rb, line 53
def <<(item)
  if self.class.item_class === item
    # Item is already an object; ensure it has a key.
    item.key ||= new_item_key(item)
  else
    # Create a new item with <item> as the data.
    item = self.class.item_class.new(new_item_key(item), item)
  end

  add_item item

  trim
end
Also aliased as: add
add(item)
Alias for: <<
add_item(item) click to toggle source
# File lib/risky/cron_list.rb, line 68
def add_item(item)
  @added_items << item
  @removed_items.delete item.key 

  unless items.include? item.key
    items.unshift item.key

    if self.class.sort_items(items[0,2]).first != item.key
      # We must reorder.
      self.items = self.class.sort_items(items)
    end
  end
end
added_items() click to toggle source
# File lib/risky/cron_list.rb, line 82
def added_items
  @added_items
end
added_items=(items) click to toggle source
# File lib/risky/cron_list.rb, line 86
def added_items=(items)
  @added_items = items
end
after_delete() click to toggle source
Calls superclass method
# File lib/risky/cron_list.rb, line 90
def after_delete
  super

  (@removed_items + items).each do |item|
    delete_item(item) rescue nil
  end

  @removed_items.clear
end
after_save() click to toggle source
Calls superclass method
# File lib/risky/cron_list.rb, line 100
def after_save
  super
  
  @removed_items.each do |item|
    delete_item(item) rescue nil
  end

  @added_items.clear
  @removed_items.clear
end
all() click to toggle source
# File lib/risky/cron_list.rb, line 111
def all
  items.map { |item| self.class.item_class[item] }
end
before_save() click to toggle source
Calls superclass method
# File lib/risky/cron_list.rb, line 115
def before_save
  super

  @added_items.each do |item|
    item.save(:w => :all) or raise "unable to save #{item}"
  end
end
clear() click to toggle source

Remove all items. Items will actually be deleted on save

# File lib/risky/cron_list.rb, line 124
def clear
  @removed_items += items
  items.clear
end
delete_item(item) click to toggle source

Takes an entry of items and deletes it.

# File lib/risky/cron_list.rb, line 153
def delete_item(item)
  self.class.item_class.delete item
end
limit() click to toggle source
Remove dangling references. Items will actually be deleted on #save
TODO...

def cleanup end

# File lib/risky/cron_list.rb, line 134
def limit
  self.class.limit
end
new_item_key(item = nil) click to toggle source

Generates a key for a newly added item.

# File lib/risky/cron_list.rb, line 158
def new_item_key(item = nil)
  # Re-use existing time
  begin
    t = item['created_at']
    if t.kind_of? String
      time = Time.iso8601(t)
    elsif t.kind_of? Time
      time = t
    end
  rescue
  end
  time ||= Time.now
   
  "k#{key}_t#{time.to_f}#{rand(10**5)}"
end
remove(item_key) click to toggle source

Remove an item by key.

# File lib/risky/cron_list.rb, line 139
def remove(item_key)
  if key = items.delete(item_key)
    # This item existed.
    @added_items.reject! do |item|
      item['key'] == item_key
    end

    @removed_items << key
  end

  key
end
removed_items() click to toggle source
# File lib/risky/cron_list.rb, line 174
def removed_items
  @removed_items
end
removed_items=(items) click to toggle source
# File lib/risky/cron_list.rb, line 178
def removed_items=(items)
  @removed_items = items
end
trim() click to toggle source
# File lib/risky/cron_list.rb, line 182
def trim
  # Remove expired items
  if limit = self.limit
    if removed = items.slice!(limit..-1)
      @removed_items += removed
    end
  end

  self
end