Module: Risky::CronList

Defined in:
lib/risky/cron_list.rb

Defined Under Namespace

Modules: ClassMethods

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.included(base) ⇒ Object



47
48
49
50
# File 'lib/risky/cron_list.rb', line 47

def self.included(base)
  base.value :items, :default => []
  base.extend ClassMethods
end

Instance Method Details

#<<(item) ⇒ Object Also known as: add



59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/risky/cron_list.rb', line 59

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

#add_item(item) ⇒ Object



74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/risky/cron_list.rb', line 74

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_itemsObject



88
89
90
# File 'lib/risky/cron_list.rb', line 88

def added_items
  @added_items
end

#added_items=(items) ⇒ Object



92
93
94
# File 'lib/risky/cron_list.rb', line 92

def added_items=(items)
  @added_items = items
end

#after_deleteObject



96
97
98
99
100
101
102
103
104
# File 'lib/risky/cron_list.rb', line 96

def after_delete
  super

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

  @removed_items.clear
end

#after_saveObject



106
107
108
109
110
111
112
113
114
115
# File 'lib/risky/cron_list.rb', line 106

def after_save
  super
  
  @removed_items.each do |item|
    delete_item(item) rescue nil
  end

  @added_items.clear
  @removed_items.clear
end

#allObject



117
118
119
# File 'lib/risky/cron_list.rb', line 117

def all
  items.map { |item| self.class.item_class[item] }
end

#before_saveObject



121
122
123
124
125
126
127
# File 'lib/risky/cron_list.rb', line 121

def before_save
  super

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

#clearObject

Remove all items. Items will actually be deleted on #save



130
131
132
133
# File 'lib/risky/cron_list.rb', line 130

def clear
  @removed_items += items
  items.clear
end

#delete_item(item) ⇒ Object

Takes an entry of items and deletes it.



155
156
157
# File 'lib/risky/cron_list.rb', line 155

def delete_item(item)
  self.class.item_class.delete item
end

#initialize(*a) ⇒ Object



52
53
54
55
56
57
# File 'lib/risky/cron_list.rb', line 52

def initialize(*a)
  super *a

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

#new_item_key(item = nil) ⇒ Object

Generates a key for a newly added item.



160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
# File 'lib/risky/cron_list.rb', line 160

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) ⇒ Object

Remove an item by key.



141
142
143
144
145
146
147
148
149
150
151
152
# File 'lib/risky/cron_list.rb', line 141

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_itemsObject



176
177
178
# File 'lib/risky/cron_list.rb', line 176

def removed_items
  @removed_items
end

#removed_items=(items) ⇒ Object



180
181
182
# File 'lib/risky/cron_list.rb', line 180

def removed_items=(items)
  @removed_items = items
end

#trimObject



184
185
186
187
188
189
190
191
192
193
# File 'lib/risky/cron_list.rb', line 184

def trim
  # Remove expired items
  if limit = self.class.limit
    if removed = items.slice!(limit..-1)
      @removed_items += removed
    end
  end

  self
end