Class: KronParser

Inherits:
Object
  • Object
show all
Defined in:
lib/kronparser.rb,
lib/kronparser/version.rb,
lib/kronparser/simple_process.rb

Defined Under Namespace

Modules: SimpleProcess

Constant Summary collapse

TIME_RANGE =
{
  :min => 0..59,
  :hour => 0..23,
  :day => 1..31,
  :mon => 1..12,
  :wday => 0..6,
}
MONTH_LAST_DATE =
{
  1 => 31,
  2 => 29,
  3 => 31,
  4 => 30,
  5 => 31,
  6 => 30,
  7 => 31,
  8 => 31,
  9 => 30,
  10 => 31,
  11 => 30,
  12 => 31
}
VERSION =
"0.0.2"

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(cron_time_format) ⇒ KronParser

Returns a new instance of KronParser.

Raises:

  • (ArgumentError)


33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/kronparser.rb', line 33

def initialize(cron_time_format)
  elems = cron_time_format.split
  raise ArgumentError.new("invalid format #{cron_time_format}") if elems.size != 5
  
  @data = {}
  [:min, :hour, :day, :mon, :wday].each_with_index do |t, idx|
    @data[t] = parse_elem(elems[idx], TIME_RANGE[t])
  end

  if elems[4] == "*"
    @day_type = :day
  elsif elems[2] == "*"
    @day_type = :wday
  else
    @day_type = :each
  end

  @is_time_exist = time_exist?
end

Class Method Details

.parse(cron_time_format) ⇒ Object



29
30
31
# File 'lib/kronparser.rb', line 29

def self.parse(cron_time_format)
  return KronParser.new(cron_time_format)
end

Instance Method Details

#last(time = TIme.now) ⇒ Object



89
90
91
# File 'lib/kronparser.rb', line 89

def last(time = TIme.now)
  Time.now
end

#next(time = Time.now) ⇒ Object



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/kronparser.rb', line 53

def next(time = Time.now)
  return nil unless @is_time_exist

  forward = 1
  time_items = [:min, :hour, :day, :mon]
  time_data = {}
  time_items.each_with_index do |time_item, idx|
    time_data[time_item], forward = next_elem(time_item, 
                                              time.send(time_item) + forward,
                                              :mon => time.mon,
                                              :year => time.year)
    if (forward == 1) || (time_data[time_item] != time.send(time_item))
      idx.times do |i|
        time_data[time_items[i]] = first_elem(time_items[i], :mon => time.mon, :year => time.year)
      end
    end
  end

  time_data[:year] = time.year + forward

  date = nil
  while date.nil?
    date = Date.new(time_data[:year], time_data[:mon], time_data[:day]) rescue nil
    next if date

    time_data[:min] = first_elem(:min)
    time_data[:hour] = first_elem(:hour)

    time_data[:day], forward = next_elem(:day, time_data[:day] + 1, time_data)
    time_data[:mon], forward = next_elem(:mon, time_data[:mon] + forward)
    time_data[:year] += forward
  end

  return Time.local(time_data[:year], time_data[:mon], time_data[:day], time_data[:hour], time_data[:min])
end