Class: Cronline::Simulator

Inherits:
Object
  • Object
show all
Defined in:
lib/cronline/simulator.rb

Defined Under Namespace

Classes: Builder

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(timezone = nil, start_time = Time.new, end_time = start_time + Simulator.default_timeframe_seconds, max_ticks = Simulator.default_max_ticks, max_time_output = Simulator.default_max_time_output) ⇒ Simulator

Returns a new instance of Simulator.



69
70
71
72
73
74
75
76
77
78
79
80
# File 'lib/cronline/simulator.rb', line 69

def initialize(
    timezone = nil,
    start_time = Time.new,
    end_time = start_time + Simulator.default_timeframe_seconds,
    max_ticks = Simulator.default_max_ticks,
    max_time_output = Simulator.default_max_time_output)
  @start_time = start_time
  @end_time = end_time
  @max_ticks = max_ticks
  @max_time_output = max_time_output
  @timezone = timezone
end

Class Method Details

.builderObject



65
66
67
# File 'lib/cronline/simulator.rb', line 65

def self.builder
  Builder.new
end

.default_max_ticksObject



4
5
6
# File 'lib/cronline/simulator.rb', line 4

def self.default_max_ticks
  1e+5
end

.default_max_time_outputObject



8
9
10
# File 'lib/cronline/simulator.rb', line 8

def self.default_max_time_output
  365
end

.default_timeframe_secondsObject



12
13
14
# File 'lib/cronline/simulator.rb', line 12

def self.default_timeframe_seconds
  12.month.to_i
end

Instance Method Details

#aligned_start_time(start_time) ⇒ Object



127
128
129
130
# File 'lib/cronline/simulator.rb', line 127

def aligned_start_time(start_time)
  #Align to day since minutes / seconds are relatively deterministic across timezones and DST...
  Time.new(start_time.year, start_time.month, start_time.day, start_time.hour).to_i
end

#generate_hours_and_seconds(cron, time) ⇒ Object



107
108
109
110
111
112
113
114
115
116
# File 'lib/cronline/simulator.rb', line 107

def generate_hours_and_seconds(cron, time)
  accumulator = []
  cron.minutes.range.each do |minute|
    cron.seconds.range.each do |second|
      @tick += 1
      accumulator.push(Time.new(time.year, time.month, time.day, time.hour, minute, second))
    end
  end
  accumulator
end

#simulate_cron(cron_expression, timezone = nil) ⇒ Object



82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/cronline/simulator.rb', line 82

def simulate_cron(cron_expression, timezone = nil)
  merged_timezone = timezone.nil? ? @timezone : timezone
  @time_accumulator = []
  cron = Cron.new(cron_expression)
  time_increment = time_increment_size
  @start_unix_time = aligned_start_time(@start_time)
  @end_unix_time = @end_time.to_time.to_i
  @tick = 0
  while @start_unix_time <= @end_unix_time do
    if stop_simulation
      break
    end
    if merged_timezone.nil?
      time = Time.at(@start_unix_time)
    else
      time = Time.at(@start_unix_time).in_time_zone(merged_timezone)
    end
    if cron.test_up_to_hours?(time)
      @time_accumulator += generate_hours_and_seconds(cron, time)
    end
    @start_unix_time += time_increment
  end
  @time_accumulator
end

#stop_simulationObject



118
119
120
121
122
123
124
125
# File 'lib/cronline/simulator.rb', line 118

def stop_simulation
  if @tick >= @max_ticks
    return true
  end
  if @time_accumulator.size >= @max_time_output
    return true
  end
end

#time_increment_sizeObject



132
133
134
135
# File 'lib/cronline/simulator.rb', line 132

def time_increment_size
  #Skip seconds and minutes since we will generate these
  1.hours.to_i
end