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



41
42
43
44
# File 'lib/risky/cron_list.rb', line 41

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

Instance Method Details

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



53
54
55
56
57
58
59
60
61
62
63
64
65
# 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

#add_item(item) ⇒ Object



68
69
70
71
72
73
74
75
76
77
78
79
80
# 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_itemsObject



82
83
84
# File 'lib/risky/cron_list.rb', line 82

def added_items
  @added_items
end

#added_items=(items) ⇒ Object



86
87
88
# File 'lib/risky/cron_list.rb', line 86

def added_items=(items)
  @added_items = items
end

#after_deleteObject



90
91
92
93
94
95
96
97
98
# 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_saveObject



100
101
102
103
104
105
106
107
108
109
# 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

#allObject



111
112
113
# File 'lib/risky/cron_list.rb', line 111

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

#before_saveObject



115
116
117
118
119
120
121
# 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

#clearObject

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



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

def clear
  @removed_items += items
  items.clear
end

#delete_item(item) ⇒ Object

Takes an entry of items and deletes it.



153
154
155
# File 'lib/risky/cron_list.rb', line 153

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

#initialize(*a) ⇒ Object



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

def initialize(*a)
  super *a

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

#limitObject

Remove dangling references. Items will actually be deleted on #save TODO… def cleanup end



134
135
136
# File 'lib/risky/cron_list.rb', line 134

def limit
  self.class.limit
end

#new_item_key(item = nil) ⇒ Object

Generates a key for a newly added item.



158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
# 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) ⇒ Object

Remove an item by key.



139
140
141
142
143
144
145
146
147
148
149
150
# 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_itemsObject



174
175
176
# File 'lib/risky/cron_list.rb', line 174

def removed_items
  @removed_items
end

#removed_items=(items) ⇒ Object



178
179
180
# File 'lib/risky/cron_list.rb', line 178

def removed_items=(items)
  @removed_items = items
end

#trimObject



182
183
184
185
186
187
188
189
190
191
# 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