2010-01-04 04:43:58 +00:00
|
|
|
require 'singleton'
|
|
|
|
|
|
|
|
class Scheduler
|
|
|
|
include Singleton
|
|
|
|
|
|
|
|
WEEKLY = [ 7 ]
|
2010-01-05 00:43:15 +00:00
|
|
|
DAILY = [ 1 ]
|
2010-01-04 04:43:58 +00:00
|
|
|
|
2010-01-05 00:33:58 +00:00
|
|
|
def skip_to_dow(date, dow)
|
|
|
|
if dow.is_a? String
|
|
|
|
dow = Date::DAYNAMES.collect { |d| d.downcase }.index(dow.downcase)
|
|
|
|
end
|
|
|
|
|
|
|
|
if dow.is_a? Fixnum
|
|
|
|
while date.wday != dow
|
|
|
|
date += 1
|
|
|
|
end
|
|
|
|
end
|
|
|
|
date
|
|
|
|
end
|
|
|
|
|
2010-01-05 00:43:15 +00:00
|
|
|
def ok_to_add(date, breaks)
|
|
|
|
ok = true
|
|
|
|
breaks.each do |i|
|
2010-01-05 00:44:39 +00:00
|
|
|
if (i['from'] <= date) && (i['to'] >= date)
|
2010-01-05 00:43:15 +00:00
|
|
|
ok = false
|
|
|
|
end
|
|
|
|
end
|
|
|
|
ok
|
|
|
|
end
|
|
|
|
|
2010-01-04 04:43:58 +00:00
|
|
|
def schedule(parameters, to_produce)
|
|
|
|
dates = []
|
|
|
|
|
2010-01-05 00:44:39 +00:00
|
|
|
if parameters['start']
|
|
|
|
current = parameters['start']
|
2010-01-04 04:43:58 +00:00
|
|
|
|
2010-01-05 00:44:39 +00:00
|
|
|
breaks = parameters['breaks'] || []
|
2010-01-05 00:43:15 +00:00
|
|
|
|
|
|
|
while dates.length < to_produce
|
2010-01-05 00:44:39 +00:00
|
|
|
interval = parameters['interval'].shift
|
2010-01-04 04:43:58 +00:00
|
|
|
|
|
|
|
case interval.class.to_s
|
2010-01-05 00:33:58 +00:00
|
|
|
when 'String'
|
|
|
|
current = skip_to_dow(current, interval)
|
|
|
|
|
2010-01-05 00:43:15 +00:00
|
|
|
if ok_to_add(current, breaks)
|
|
|
|
dates << current
|
|
|
|
end
|
2010-01-04 04:43:58 +00:00
|
|
|
|
2010-01-05 00:33:58 +00:00
|
|
|
current += 1
|
2010-01-04 04:43:58 +00:00
|
|
|
when 'Fixnum'
|
2010-01-05 00:43:15 +00:00
|
|
|
if ok_to_add(current, breaks)
|
|
|
|
dates << current
|
|
|
|
end
|
2010-01-04 04:43:58 +00:00
|
|
|
|
2010-01-05 00:33:58 +00:00
|
|
|
current += interval
|
|
|
|
end
|
2010-01-04 04:43:58 +00:00
|
|
|
|
2010-01-05 00:44:39 +00:00
|
|
|
parameters['interval'] << interval
|
2010-01-04 04:43:58 +00:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
dates
|
|
|
|
end
|
|
|
|
end
|