class Rufus::CronLine
(man 5 crontab) file line.
A ‘cron line’ is a line in the sense of a crontab
def initialize (line)
def initialize (line) super() @original = line items = line.split unless [ 5, 6 ].include?(items.length) raise \ "cron '#{line}' string should hold 5 or 6 items, " + "not #{items.length}" \ end offset = items.length - 5 @seconds = if offset == 1 parse_item(items[0], 0, 59) else [ 0 ] end @minutes = parse_item(items[0+offset], 0, 59) @hours = parse_item(items[1+offset], 0, 24) @days = parse_item(items[2+offset], 1, 31) @months = parse_item(items[3+offset], 1, 12) @weekdays = parse_weekdays(items[4+offset]) #adjust_arrays() end
def matches? (time)
Returns true if the given time matches this cron line.
def matches? (time) time = Time.at(time) \ if time.kind_of?(Float) or time.kind_of?(Integer) return false if no_match?(time.sec, @seconds) return false if no_match?(time.min, @minutes) return false if no_match?(time.hour, @hours) return false if no_match?(time.day, @days) return false if no_match?(time.month, @months) return false if no_match?(time.wday, @weekdays) true end
def no_match? (value, cron_values)
def no_match? (value, cron_values) return false if not cron_values cron_values.each do |v| return false if value == v end true end
def parse_item (item, min, max)
def parse_item (item, min, max) return nil \ if item == "*" return parse_list(item, min, max) \ if item.index(",") return parse_range(item, min, max) \ if item.index("*") or item.index("-") i = Integer(item) i = min if i < min i = max if i > max [ i ] end
def parse_list (item, min, max)
def parse_list (item, min, max) items = item.split(",") items.inject([]) do |result, i| i = Integer(i) i = min if i < min i = max if i > max result.push i end end
def parse_range (item, min, max)
def parse_range (item, min, max) i = item.index("-") j = item.index("/") inc = 1 inc = Integer(item[j+1..-1]) if j istart = -1 iend = -1 if i istart = Integer(item[0..i-1]) if j iend = Integer(item[i+1..j]) else iend = Integer(item[i+1..-1]) end else # case */x istart = min iend = max end istart = min if istart < min iend = max if iend > max result = [] value = istart loop do result << value value = value + inc break if value > iend end result end
def parse_weekdays (item)
def parse_weekdays (item) item = item.downcase WDS.each_with_index do |day, index| item = item.gsub(day, "#{index+1}") end parse_item(item, 1, 7) end
def to_array
This method is used by the cronline unit tests.
months, weekdays).
Returns an array of 6 arrays (seconds, minutes, hours, days,
def to_array [ @seconds, @minutes, @hours, @days, @months, @weekdays ] end