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