Created
April 24, 2009 16:29
-
-
Save gnufied/101191 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require "rubygems" | |
require "active_support" | |
require "chronic" | |
module BackgrounDRb | |
class CronTrigger | |
WDAYS = { 0 => "Sunday",1 => "Monday",2 => "Tuesday",3 => "Wednesday", 4 => "Thursday", 5 => "Friday", 6 => "Saturday" } | |
LeapYearMonthDays = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] | |
CommonYearMonthDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] | |
attr_reader :sec, :min, :hour, :day, :month, :wday, :year, :cron_expr | |
# initialize the Cron Trigger | |
def initialize(expr) | |
self.cron_expr = expr | |
end | |
# create the cron expression and populate instance variables. | |
def cron_expr=(expr) | |
@cron_expr = expr | |
self.sec, self.min, self.hour, self.day, self.month, self.wday, self.year = @cron_expr.split(' ') | |
end | |
def fire_after_time(p_time) | |
@t_sec,@t_min,@t_hour,@t_day,@t_month,@t_year,@t_wday,@t_yday,@t_idst,@t_zone = p_time.to_a | |
puts @t_idst | |
@count = 0 | |
loop do | |
@count += 1 | |
if @year && [email protected]?(@t_year) | |
return nil if @t_year > @year.max | |
@t_year = @year.detect { |y| y > @t_year } | |
end | |
# if range of months doesn't include current month, find next month from the range | |
unless @month.include?(@t_month) | |
next_month = @month.detect { |m| m > @t_month } || @month.min | |
@t_day,@t_hour,@t_min,@t_sec = @day.min,@hour.min,@min.min,@sec.min | |
if next_month < @t_month | |
@t_month = next_month | |
@t_year += 1 | |
retry | |
end | |
@t_month = next_month | |
end | |
if !day_restricted? && wday_restricted? | |
unless @wday.include?(@t_wday) | |
next_wday = @wday.detect { |w| w > @t_wday} || @wday.min | |
@t_hour,@t_min,@t_sec = @hour.min,@min.min,@sec.min | |
t_time = Chronic.parse("next #{WDAYS[next_wday]}",:now => current_time) | |
@t_day,@t_month,@t_year = t_time.to_a[3..5] | |
@t_wday = next_wday | |
retry | |
end | |
elsif !wday_restricted? && day_restricted? | |
day_range = (1.. month_days(@t_year,@t_month)) | |
# day array, that includes days which are present in current month | |
day_array = @day.select { |d| day_range === d } | |
unless day_array.include?(@t_day) | |
next_day = day_array.detect { |d| d > @t_day } || day_array.min | |
@t_hour,@t_min,@t_sec = @hour.min,@min.min,@sec.min | |
if !next_day || next_day < @t_day | |
t_time = Chronic.parse("next month",:now => current_time) | |
@t_day = next_day.nil? ? @day.min : next_day | |
@t_month,@t_year = t_time.month,t_time.year | |
retry | |
end | |
@t_day = next_day | |
end | |
else | |
# if both day and wday are restricted cron should give preference to one thats closer to current time | |
puts "I am here" | |
day_range = (1 .. month_days(@t_year,@t_month)) | |
day_array = @day.select { |d| day_range === d } | |
puts day_array | |
if !day_array.include?(@t_day) && [email protected]?(@t_wday) | |
next_day = day_array.detect { |d| d > @t_day } || day_array.min | |
next_wday = @wday.detect { |w| w > @t_wday } || @wday.min | |
@t_hour,@t_min,@t_sec = @hour.min,@min.min,@sec.min | |
# if next_day is nil or less than @t_day it means that it should run in next month | |
if !next_day || next_day < @t_day | |
next_time_mday = Chronic.parse("next month",:now => current_time) | |
else | |
@t_day = next_day | |
next_time_mday = current_time | |
end | |
next_time_wday = Chronic.parse("next #{WDAYS[next_wday]}",:now => current_time) | |
if next_time_mday < next_time_wday | |
@t_day,@t_month,@t_year = next_time_mday.to_a[3..5] | |
else | |
@t_day,@t_month,@t_year = next_time_wday.to_a[3..5] | |
end | |
retry | |
end | |
end | |
unless @hour.include?(@t_hour) | |
next_hour = @hour.detect { |h| h > @t_hour } || @hour.min | |
@t_min,@t_sec = @min.min,@sec.min | |
if next_hour < @t_hour | |
@t_hour = next_hour | |
next_day = Chronic.parse("next day",:now => current_time) | |
@t_day,@t_month,@t_year,@t_wday = next_day.to_a[3..6] | |
retry | |
end | |
@t_hour = next_hour | |
end | |
unless @min.include?(@t_min) | |
next_min = @min.detect { |m| m > @t_min } || @min.min | |
@t_sec = @sec.min | |
if next_min < @t_min | |
@t_min = next_min | |
next_hour = Chronic.parse("next hour",:now => current_time) | |
@t_hour,@t_day,@t_month,@t_year,@t_wday = next_hour.to_a[2..6] | |
retry | |
end | |
@t_min = next_min | |
end | |
unless @sec.include?(@t_sec) | |
next_sec = @sec.detect { |s| s > @t_sec } || @sec.min | |
if next_sec < @t_sec | |
@t_sec = next_sec | |
next_min = Chronic.parse("next minute",:now => current_time) | |
@t_min,@t_hour,@t_day,@t_month,@t_year,@t_wday = next_min.to_a[1..6] | |
retry | |
end | |
@t_sec = next_sec | |
end | |
break | |
end # end of loop do | |
current_time | |
end | |
def current_time | |
Time.local(@t_sec,@t_min,@t_hour,@t_day,@t_month,@t_year,@t_wday,nil,@t_idst,@t_zone) | |
end | |
def day_restricted? | |
return [email protected]?(1..31) | |
end | |
def wday_restricted? | |
return [email protected]?(0..6) | |
end | |
# TODO: mimic attr_reader to define all of these | |
def sec=(sec); @sec = parse_part(sec, 0 .. 59); end | |
def min=(min); @min = parse_part(min, 0 .. 59); end | |
def hour=(hour); @hour = parse_part(hour, 0 .. 23); end | |
def day=(day) | |
@day = parse_part(day, 1 .. 31) | |
end | |
def month=(month) | |
@month = parse_part(month, 1 .. 12) | |
end | |
def year=(year) | |
@year = parse_part(year) | |
end | |
def wday=(wday) | |
@wday = parse_part(wday, 0 .. 6) | |
end | |
private | |
def month_days(y, m) | |
if ((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0) | |
LeapYearMonthDays[m-1] | |
else | |
CommonYearMonthDays[m-1] | |
end | |
end | |
# 0-5,8,10; 0-5; *; */5 | |
def parse_part(part, range=nil) | |
return range if part.nil? or part == '*' or part =~ /^[*0]\/1$/ | |
r = Array.new | |
part.split(',').each do |p| | |
if p =~ /-/ # 0-5 | |
r << Range.new(*(p.scan(/\d+/).map { |x| x.to_i })).map { |x| x.to_i } | |
elsif p =~ /(\*|\d+)\/(\d+)/ && range # */5, 2/10 | |
min = $1 == '*' ? 0 : $1.to_i | |
inc = $2.to_i | |
(min .. range.end).each_with_index do |x, i| | |
r << (range.begin == 1 ? x + 1 : x) if i % inc == 0 | |
end | |
else | |
r << p.to_i | |
end | |
end | |
r.flatten | |
end | |
end | |
end | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require "cron_trigger" | |
context "Cront Trigger in general" do | |
specify "should let tasks running at given time interval run" do | |
# every 5 seconds | |
a = BackgrounDRb::CronTrigger.new("*/5 * * * * * *") | |
t_time = Time.parse("Wed Feb 13 20:53:43 +0530 2008") | |
firetime = a.fire_after_time(t_time) | |
firetime.min.should == 53 | |
firetime.sec.should == 45 | |
firetime.hour.should == 20 | |
# 5 minute of every hour | |
a = BackgrounDRb::CronTrigger.new("0 5 * * * * *") | |
firetime = a.fire_after_time(t_time) | |
firetime.sec.should == 0 | |
firetime.min.should == 5 | |
firetime.hour.should == 21 | |
firetime.day.should == 13 | |
# every 5 minute | |
a = BackgrounDRb::CronTrigger.new("0 */5 * * * * *") | |
firetime = a.fire_after_time(t_time) | |
firetime.sec.should == 0 | |
firetime.min.should == 55 | |
firetime.hour.should == 20 | |
firetime.day.should == 13 | |
# every 5 AM of every day | |
a = BackgrounDRb::CronTrigger.new("0 0 5 * * * *") | |
firetime = a.fire_after_time(t_time) | |
firetime.hour.should == 5 | |
firetime.min.should == 0 | |
firetime.sec.should == 0 | |
firetime.day.should == 14 | |
firetime.month.should == 2 | |
a = BackgrounDRb::CronTrigger.new("*/10 * * * * * ") | |
t_time = Time.parse("Wed Feb 13 23:17:55 +0530 2008") | |
firetime = a.fire_after_time(t_time) | |
firetime.hour.should == 23 | |
firetime.min.should == 18 | |
firetime.sec.should == 0 | |
firetime.day.should == 13 | |
firetime.month.should == 2 | |
end | |
specify "should return correct firetime for hour intervals" do | |
# every 5 hour | |
t_time = Time.parse("Wed Feb 13 20:53:43 +0530 2008") | |
a = BackgrounDRb::CronTrigger.new("0 0 */5 * * * *") | |
firetime = a.fire_after_time(t_time) | |
firetime.hour.should == 0 | |
firetime.min.should == 0 | |
firetime.sec.should == 0 | |
firetime.day.should == 14 | |
firetime.month.should == 2 | |
end | |
specify "should return firetime based on wday restriction" do | |
t_time = Time.parse("Wed Feb 13 20:53:43 +0530 2008") | |
# on sunday and monday it should run every 5 th hour | |
a = BackgrounDRb::CronTrigger.new("0 0 */5 * * 0-1 *") | |
firetime = a.fire_after_time(t_time) | |
firetime.hour.should == 0 | |
firetime.min.should == 0 | |
firetime.sec.should == 0 | |
firetime.day.should == 17 | |
firetime.month.should == 2 | |
t_time2 = Time.parse("Sun Feb 17 20:53:43 +0530 2008") | |
firetime = a.fire_after_time(t_time2) | |
firetime.hour.should == 0 | |
firetime.min.should == 0 | |
firetime.sec.should == 0 | |
firetime.day.should == 18 | |
firetime.month.should == 2 | |
end | |
specify "should wrap to next week for wday restirctions" do | |
a = BackgrounDRb::CronTrigger.new("0 0 */5 * * 0-1 *") | |
t_time = Time.parse("Mon Feb 18 20:53:43 +0530 2008") | |
firetime = a.fire_after_time(t_time) | |
firetime.hour.should == 0 | |
firetime.min.should == 0 | |
firetime.sec.should == 0 | |
firetime.day.should == 24 | |
firetime.month.should == 2 | |
end | |
specify "should return firetime based on day restriction" do | |
t_time = Time.parse("Wed Feb 13 20:53:43 +0530 2008") | |
# 21st of every month run every 5 hour | |
a = BackgrounDRb::CronTrigger.new("0 0 */5 21 * * *") | |
firetime = a.fire_after_time(t_time) | |
firetime.hour.should == 0 | |
firetime.min.should == 0 | |
firetime.sec.should == 0 | |
firetime.day.should == 21 | |
firetime.month.should == 2 | |
t_time = Time.parse("Wed Feb 22 20:53:43 +0530 2008") | |
# 21st of every month run every 5 hour | |
a = BackgrounDRb::CronTrigger.new("0 0 */5 21 * * *") | |
firetime = a.fire_after_time(t_time) | |
firetime.hour.should == 0 | |
firetime.min.should == 0 | |
firetime.sec.should == 0 | |
firetime.day.should == 21 | |
firetime.month.should == 3 | |
end | |
specify "for feb month should take into account day count" do | |
t_time = Time.parse("Thu Feb 28 20:53:43 +0530 2008") | |
# 21st of every month run every 5 hour | |
a = BackgrounDRb::CronTrigger.new("0 0 */5 30 * * *") | |
firetime = a.fire_after_time(t_time) | |
firetime.hour.should == 0 | |
firetime.min.should == 0 | |
firetime.sec.should == 0 | |
firetime.day.should == 30 | |
firetime.month.should == 3 | |
end | |
specify "should take care if number of days is not available in month" do | |
t_time = Time.parse("Tue Nov 12 20:53:43 +0530 2007") | |
# 21st of every month run every 5 hour | |
a = BackgrounDRb::CronTrigger.new("0 0 */5 31 * * *") | |
firetime = a.fire_after_time(t_time) | |
firetime.hour.should == 0 | |
firetime.min.should == 0 | |
firetime.sec.should == 0 | |
firetime.day.should == 31 | |
firetime.month.should == 12 | |
end | |
specify "should take care of periodic variations in day restrictions" do | |
t_time = Time.parse("Tue Aug 12 20:53:43 +0530 2007") | |
a = BackgrounDRb::CronTrigger.new("0 0 */5 */2 1-5 * *") | |
firetime = a.fire_after_time(t_time) | |
firetime.hour.should == 0 | |
firetime.min.should == 0 | |
firetime.sec.should == 0 | |
firetime.day.should == 1 | |
firetime.month.should == 1 | |
firetime.year.should == 2008 | |
t_time = Time.parse("Tue Aug 12 20:53:43 +0530 2007") | |
a = BackgrounDRb::CronTrigger.new("0 0 */5 */3 1-5 * *") | |
firetime = a.fire_after_time(t_time) | |
firetime.hour.should == 0 | |
firetime.min.should == 0 | |
firetime.sec.should == 0 | |
firetime.day.should == 1 | |
firetime.month.should == 1 | |
firetime.year.should == 2008 | |
t_time = Time.parse("Tue Aug 12 20:53:43 +0530 2007") | |
a = BackgrounDRb::CronTrigger.new("0 0 */1 */7 1-5 * *") | |
firetime = a.fire_after_time(t_time) | |
firetime.hour.should == 0 | |
firetime.min.should == 0 | |
firetime.sec.should == 0 | |
firetime.day.should == 1 | |
firetime.month.should == 1 | |
firetime.year.should == 2008 | |
end | |
specify "should return firetime based on hour restriction" do | |
t_time = Time.parse("Wed Feb 13 20:53:43 +0530 2008") | |
a = BackgrounDRb::CronTrigger.new("0 0 */5 * * * *") | |
firetime = a.fire_after_time(t_time) | |
firetime.hour.should == 0 | |
firetime.min.should == 0 | |
firetime.sec.should == 0 | |
firetime.day.should == 14 | |
firetime.month.should == 2 | |
end | |
specify "should take care of both fuck restrictions" do | |
# in case of conflict between day and wday options, we should chose one closer to current time | |
t_time = Time.parse("Tue Aug 12 20:53:43 +0530 2007") | |
a = BackgrounDRb::CronTrigger.new("0 0 */5 */3 1-5 3-5 *") | |
firetime = a.fire_after_time(t_time) | |
firetime.hour.should == 0 | |
firetime.min.should == 0 | |
firetime.sec.should == 0 | |
firetime.day.should == 1 | |
firetime.wday.should == 2 | |
firetime.month.should == 1 | |
firetime.year.should == 2008 | |
end | |
specify "for user reported trigger" do | |
# on friday | |
t_time = Time.parse("Fri Jan 18 4:53:43 +0530 2008") | |
a = BackgrounDRb::CronTrigger.new("0 0/5 09-17 * * 1,3,5 *") | |
firetime = a.fire_after_time(t_time) | |
firetime.hour.should == 9 | |
firetime.min.should == 0 | |
firetime.sec.should == 0 | |
firetime.wday.should == 5 | |
firetime.month.should == 1 | |
firetime.year.should == 2008 | |
t_time = Time.parse("Fri Jan 18 9:53:43 +0530 2008") | |
a = BackgrounDRb::CronTrigger.new("0 0/5 09-17 * * 1,3,5 *") | |
firetime = a.fire_after_time(t_time) | |
firetime.hour.should == 9 | |
firetime.min.should == 55 | |
firetime.sec.should == 0 | |
firetime.wday.should == 5 | |
firetime.month.should == 1 | |
firetime.day.should == 18 | |
firetime.year.should == 2008 | |
t_time = Time.parse("Sat Jan 19 4:53:43 +0530 2008") | |
a = BackgrounDRb::CronTrigger.new("0 0/5 09-17 * * 1,3,5 *") | |
firetime = a.fire_after_time(t_time) | |
firetime.hour.should == 9 | |
firetime.min.should == 0 | |
firetime.sec.should == 0 | |
firetime.wday.should == 1 | |
firetime.month.should == 1 | |
firetime.day.should == 21 | |
firetime.year.should == 2008 | |
t_time = Time.parse("Mon Jan 21 4:53:43 +0530 2008") | |
a = BackgrounDRb::CronTrigger.new("0 0/5 09-17 * * 1,3,5 *") | |
firetime = a.fire_after_time(t_time) | |
firetime.hour.should == 9 | |
firetime.min.should == 0 | |
firetime.sec.should == 0 | |
firetime.wday.should == 1 | |
firetime.month.should == 1 | |
firetime.day.should == 21 | |
firetime.year.should == 2008 | |
t_time = Time.parse("Tue Jan 1 4:53:43 +0530 2008") | |
a = BackgrounDRb::CronTrigger.new("0 0/5 09-17 * * 1,3,5 *") | |
firetime = a.fire_after_time(t_time) | |
firetime.hour.should == 9 | |
firetime.min.should == 0 | |
firetime.sec.should == 0 | |
firetime.wday.should == 3 | |
firetime.month.should == 1 | |
firetime.day.should == 2 | |
firetime.year.should == 2008 | |
end | |
specify "should return firetime based on month restriction" do | |
t_time = Time.parse("Wed Feb 13 20:53:43 +0530 2008") | |
a = BackgrounDRb::CronTrigger.new("0 0 */5 * * * *") | |
firetime = a.fire_after_time(t_time) | |
firetime.hour.should == 0 | |
firetime.min.should == 0 | |
firetime.sec.should == 0 | |
firetime.day.should == 14 | |
firetime.month.should == 2 | |
end | |
specify "should run for weekdays " do | |
t_time = Time.parse("Wed Feb 13 20:53:43 +0530 2008") | |
a = BackgrounDRb::CronTrigger.new("0 0 2 * * 1-5 *") | |
firetime = a.fire_after_time(t_time) | |
firetime.hour.should == 2 | |
firetime.min.should == 0 | |
firetime.sec.should == 0 | |
firetime.wday.should == 4 | |
t_time = Time.parse("Fri June 6 20:53:43 +0530 2008") | |
a = BackgrounDRb::CronTrigger.new("0 0 2 * * 1-5 *") | |
firetime = a.fire_after_time(t_time) | |
firetime.hour.should == 2 | |
firetime.min.should == 0 | |
firetime.sec.should == 0 | |
firetime.wday.should == 1 | |
end | |
end |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require "cron_trigger" | |
context "Cront Trigger in general" do | |
specify "should let tasks running at given time interval run" do | |
# every 5 seconds | |
a = BackgrounDRb::CronTrigger.new("*/5 * * * * * *") | |
t_time = Time.parse("Fri Apr 24 12:35:01 -0400 2009") | |
firetime = a.fire_after_time(t_time) | |
firetime.min.should == 35 | |
firetime.sec.should == 05 | |
firetime.hour.should == 12 | |
# 5th minute of every hour | |
a = BackgrounDRb::CronTrigger.new("0 5 * * * * *") | |
firetime = a.fire_after_time(t_time) | |
firetime.sec.should == 0 | |
firetime.min.should == 5 | |
firetime.hour.should == 13 | |
firetime.day.should == 24 | |
# every 5 minute | |
a = BackgrounDRb::CronTrigger.new("0 */5 * * * * *") | |
firetime = a.fire_after_time(t_time) | |
firetime.sec.should == 0 | |
firetime.min.should == 40 | |
firetime.hour.should == 12 | |
firetime.day.should == 24 | |
# every 5 AM of every day | |
a = BackgrounDRb::CronTrigger.new("0 0 5 * * * *") | |
firetime = a.fire_after_time(t_time) | |
firetime.hour.should == 5 | |
firetime.min.should == 0 | |
firetime.sec.should == 0 | |
firetime.day.should == 25 | |
firetime.month.should == 4 | |
# every 10 second | |
a = BackgrounDRb::CronTrigger.new("*/10 * * * * * ") | |
t_time = Time.parse("Fri Apr 24 12:35:01 -0400 2009") | |
firetime = a.fire_after_time(t_time) | |
firetime.hour.should == 12 | |
firetime.min.should == 35 | |
firetime.sec.should == 10 | |
firetime.day.should == 24 | |
firetime.month.should == 4 | |
end | |
specify "should return correct firetime for hour intervals" do | |
# every 5 hour | |
t_time = Time.parse("Web Mar 25 12:35:01 -0400 2009") | |
a = BackgrounDRb::CronTrigger.new("0 0 */5 * * * *") | |
firetime = a.fire_after_time(t_time) | |
puts firetime | |
firetime.hour.should == 15 | |
firetime.min.should == 0 | |
firetime.sec.should == 0 | |
firetime.day.should == 25 | |
firetime.month.should == 3 | |
end | |
specify "should return firetime based on wday restriction" do | |
t_time = Time.parse("Fri Apr 24 12:35:01 -0400 2009") | |
# on sunday and monday it should run every 5 th hour | |
a = BackgrounDRb::CronTrigger.new("0 0 */5 * * 0-1 *") | |
firetime = a.fire_after_time(t_time) | |
firetime.hour.should == 0 | |
firetime.min.should == 0 | |
firetime.sec.should == 0 | |
firetime.day.should == 26 | |
firetime.month.should == 4 | |
t_time2 = Time.parse("Sun Apr 26 20:53:01 -0400 2009") | |
firetime = a.fire_after_time(t_time2) | |
firetime.hour.should == 0 | |
firetime.min.should == 0 | |
firetime.sec.should == 0 | |
firetime.day.should == 27 | |
firetime.month.should == 4 | |
end | |
specify "should wrap to next week for wday restirctions" do | |
a = BackgrounDRb::CronTrigger.new("0 0 */5 * * 0-1 *") | |
t_time = Time.parse("Mon Apr 27 20:53:01 -0400 2009") | |
firetime = a.fire_after_time(t_time) | |
firetime.hour.should == 0 | |
firetime.min.should == 0 | |
firetime.sec.should == 0 | |
firetime.day.should == 3 | |
firetime.month.should == 5 | |
end | |
specify "For reported bug with dst" do | |
a = BackgrounDRb::CronTrigger.new("0 5 0 * * * *") | |
t_time = Time.parse("Sun Mar 08 12:37:08 -0400 2009") | |
firetime = a.fire_after_time(t_time) | |
puts firetime | |
end | |
# specify "should return firetime based on day restriction" do | |
# t_time = Time.parse("Wed Feb 13 20:53:43 +0530 2008") | |
# # 21st of every month run every 5 hour | |
# a = BackgrounDRb::CronTrigger.new("0 0 */5 21 * * *") | |
# firetime = a.fire_after_time(t_time) | |
# firetime.hour.should == 0 | |
# firetime.min.should == 0 | |
# firetime.sec.should == 0 | |
# firetime.day.should == 21 | |
# firetime.month.should == 2 | |
# t_time = Time.parse("Fri Apr 24 12:35:01 -0400 2009") | |
# # 21st of every month run every 5 hour | |
# a = BackgrounDRb::CronTrigger.new("0 0 */5 21 * * *") | |
# firetime = a.fire_after_time(t_time) | |
# firetime.hour.should == 0 | |
# firetime.min.should == 0 | |
# firetime.sec.should == 0 | |
# firetime.day.should == 21 | |
# firetime.month.should == 5 | |
# end | |
# specify "for feb month should take into account day count" do | |
# t_time = Time.parse("Thu Feb 28 20:53:43 +0530 2008") | |
# # 21st of every month run every 5 hour | |
# a = BackgrounDRb::CronTrigger.new("0 0 */5 30 * * *") | |
# firetime = a.fire_after_time(t_time) | |
# firetime.hour.should == 0 | |
# firetime.min.should == 0 | |
# firetime.sec.should == 0 | |
# firetime.day.should == 30 | |
# firetime.month.should == 3 | |
# end | |
# specify "should take care if number of days is not available in month" do | |
# t_time = Time.parse("Tue Nov 12 20:53:43 +0530 2007") | |
# # 21st of every month run every 5 hour | |
# a = BackgrounDRb::CronTrigger.new("0 0 */5 31 * * *") | |
# firetime = a.fire_after_time(t_time) | |
# firetime.hour.should == 0 | |
# firetime.min.should == 0 | |
# firetime.sec.should == 0 | |
# firetime.day.should == 31 | |
# firetime.month.should == 12 | |
# end | |
# specify "should take care of periodic variations in day restrictions" do | |
# t_time = Time.parse("Tue Aug 12 20:53:43 +0530 2007") | |
# a = BackgrounDRb::CronTrigger.new("0 0 */5 */2 1-5 * *") | |
# firetime = a.fire_after_time(t_time) | |
# firetime.hour.should == 0 | |
# firetime.min.should == 0 | |
# firetime.sec.should == 0 | |
# firetime.day.should == 1 | |
# firetime.month.should == 1 | |
# firetime.year.should == 2008 | |
# t_time = Time.parse("Tue Aug 12 20:53:43 +0530 2007") | |
# a = BackgrounDRb::CronTrigger.new("0 0 */5 */3 1-5 * *") | |
# firetime = a.fire_after_time(t_time) | |
# firetime.hour.should == 0 | |
# firetime.min.should == 0 | |
# firetime.sec.should == 0 | |
# firetime.day.should == 1 | |
# firetime.month.should == 1 | |
# firetime.year.should == 2008 | |
# t_time = Time.parse("Tue Aug 12 20:53:43 +0530 2007") | |
# a = BackgrounDRb::CronTrigger.new("0 0 */1 */7 1-5 * *") | |
# firetime = a.fire_after_time(t_time) | |
# firetime.hour.should == 0 | |
# firetime.min.should == 0 | |
# firetime.sec.should == 0 | |
# firetime.day.should == 1 | |
# firetime.month.should == 1 | |
# firetime.year.should == 2008 | |
# end | |
# specify "should return firetime based on hour restriction" do | |
# t_time = Time.parse("Wed Feb 13 20:53:43 +0530 2008") | |
# a = BackgrounDRb::CronTrigger.new("0 0 */5 * * * *") | |
# firetime = a.fire_after_time(t_time) | |
# firetime.hour.should == 0 | |
# firetime.min.should == 0 | |
# firetime.sec.should == 0 | |
# firetime.day.should == 14 | |
# firetime.month.should == 2 | |
# end | |
# specify "should take care of both fuck restrictions" do | |
# # in case of conflict between day and wday options, we should chose one closer to current time | |
# t_time = Time.parse("Tue Aug 12 20:53:43 +0530 2007") | |
# a = BackgrounDRb::CronTrigger.new("0 0 */5 */3 1-5 3-5 *") | |
# firetime = a.fire_after_time(t_time) | |
# firetime.hour.should == 0 | |
# firetime.min.should == 0 | |
# firetime.sec.should == 0 | |
# firetime.day.should == 1 | |
# firetime.wday.should == 2 | |
# firetime.month.should == 1 | |
# firetime.year.should == 2008 | |
# end | |
# specify "for user reported trigger" do | |
# # on friday | |
# t_time = Time.parse("Fri Jan 18 4:53:43 +0530 2008") | |
# a = BackgrounDRb::CronTrigger.new("0 0/5 09-17 * * 1,3,5 *") | |
# firetime = a.fire_after_time(t_time) | |
# firetime.hour.should == 9 | |
# firetime.min.should == 0 | |
# firetime.sec.should == 0 | |
# firetime.wday.should == 5 | |
# firetime.month.should == 1 | |
# firetime.year.should == 2008 | |
# t_time = Time.parse("Fri Jan 18 9:53:43 +0530 2008") | |
# a = BackgrounDRb::CronTrigger.new("0 0/5 09-17 * * 1,3,5 *") | |
# firetime = a.fire_after_time(t_time) | |
# firetime.hour.should == 9 | |
# firetime.min.should == 55 | |
# firetime.sec.should == 0 | |
# firetime.wday.should == 5 | |
# firetime.month.should == 1 | |
# firetime.day.should == 18 | |
# firetime.year.should == 2008 | |
# t_time = Time.parse("Sat Jan 19 4:53:43 +0530 2008") | |
# a = BackgrounDRb::CronTrigger.new("0 0/5 09-17 * * 1,3,5 *") | |
# firetime = a.fire_after_time(t_time) | |
# firetime.hour.should == 9 | |
# firetime.min.should == 0 | |
# firetime.sec.should == 0 | |
# firetime.wday.should == 1 | |
# firetime.month.should == 1 | |
# firetime.day.should == 21 | |
# firetime.year.should == 2008 | |
# t_time = Time.parse("Mon Jan 21 4:53:43 +0530 2008") | |
# a = BackgrounDRb::CronTrigger.new("0 0/5 09-17 * * 1,3,5 *") | |
# firetime = a.fire_after_time(t_time) | |
# firetime.hour.should == 9 | |
# firetime.min.should == 0 | |
# firetime.sec.should == 0 | |
# firetime.wday.should == 1 | |
# firetime.month.should == 1 | |
# firetime.day.should == 21 | |
# firetime.year.should == 2008 | |
# t_time = Time.parse("Tue Jan 1 4:53:43 +0530 2008") | |
# a = BackgrounDRb::CronTrigger.new("0 0/5 09-17 * * 1,3,5 *") | |
# firetime = a.fire_after_time(t_time) | |
# firetime.hour.should == 9 | |
# firetime.min.should == 0 | |
# firetime.sec.should == 0 | |
# firetime.wday.should == 3 | |
# firetime.month.should == 1 | |
# firetime.day.should == 2 | |
# firetime.year.should == 2008 | |
# end | |
# specify "should return firetime based on month restriction" do | |
# t_time = Time.parse("Wed Feb 13 20:53:43 +0530 2008") | |
# a = BackgrounDRb::CronTrigger.new("0 0 */5 * * * *") | |
# firetime = a.fire_after_time(t_time) | |
# firetime.hour.should == 0 | |
# firetime.min.should == 0 | |
# firetime.sec.should == 0 | |
# firetime.day.should == 14 | |
# firetime.month.should == 2 | |
# end | |
# specify "should run for weekdays " do | |
# t_time = Time.parse("Wed Feb 13 20:53:43 +0530 2008") | |
# a = BackgrounDRb::CronTrigger.new("0 0 2 * * 1-5 *") | |
# firetime = a.fire_after_time(t_time) | |
# firetime.hour.should == 2 | |
# firetime.min.should == 0 | |
# firetime.sec.should == 0 | |
# firetime.wday.should == 4 | |
# t_time = Time.parse("Fri June 6 20:53:43 +0530 2008") | |
# a = BackgrounDRb::CronTrigger.new("0 0 2 * * 1-5 *") | |
# firetime = a.fire_after_time(t_time) | |
# firetime.hour.should == 2 | |
# firetime.min.should == 0 | |
# firetime.sec.should == 0 | |
# firetime.wday.should == 1 | |
# end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment