cronos 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +14 -0
- data/LICENSE +20 -0
- data/README.rdoc +73 -0
- data/Rakefile +58 -0
- data/TODO +3 -0
- data/lib/cronos.rb +261 -0
- data/spec/cronos_spec.rb +329 -0
- data/spec/spec_helper.rb +6 -0
- metadata +63 -0
data/CHANGELOG
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
== 0.3.1 2009-02-03
|
2
|
+
- added ranges to #days
|
3
|
+
|
4
|
+
== 0.3.0 2009-01-27
|
5
|
+
- better range handling for #on and #of including support for end excluded ranges
|
6
|
+
- aliased #of with #in
|
7
|
+
- make #every more flexible to allow use with for days and months eg. every(:thursday, 'Friday') or every(:jan, :feb)
|
8
|
+
- adde midnight and midday methods
|
9
|
+
|
10
|
+
== 0.2.2 2009-01-17
|
11
|
+
- fix to ensure string values in hash from to_hash method
|
12
|
+
|
13
|
+
== 0.2.1 2009-01-17
|
14
|
+
- added to_hash method with CronEdit compatible key names
|
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2008 Adam Meehan
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
= Cronos
|
2
|
+
|
3
|
+
A Ruby DSL for outputting Cron intervals.
|
4
|
+
|
5
|
+
Using a natural syntax to write cron task intervals assists in generating the correct cron interval
|
6
|
+
you are after instead of trying to remember the cron syntax and conventions.
|
7
|
+
|
8
|
+
|
9
|
+
== Examples
|
10
|
+
|
11
|
+
cron = Cronos::Interval
|
12
|
+
|
13
|
+
cron.new.hourly.to_s
|
14
|
+
# => '0 * * * *'
|
15
|
+
|
16
|
+
cron.new.daily.to_s
|
17
|
+
# => '0 0 * * *'
|
18
|
+
|
19
|
+
cron.new.weekly.to_s
|
20
|
+
# => '0 0 * * 0'
|
21
|
+
|
22
|
+
cron.new.weekdays.at(12.30).to_s
|
23
|
+
# => '30 12 * * 1-5'
|
24
|
+
|
25
|
+
cron.new.weekends.at(12.30).to_s
|
26
|
+
# => '30 12 * * 0,6'
|
27
|
+
|
28
|
+
cron.new.at('1.30pm').daily.to_s
|
29
|
+
# => '30 13 * * *'
|
30
|
+
|
31
|
+
cron.new.every(6).hours.on('15th').of(:january).to_s
|
32
|
+
# => '0 0,6,12,18 15 1 *'
|
33
|
+
|
34
|
+
cron.new.every(20).minutes.on(15..18).of(:jan, :feb, :mar).to_s
|
35
|
+
# => '0,20,40 * 15-18 1,2,3 *'
|
36
|
+
|
37
|
+
cron.new.at(14.45).on_days(:monday, :tuesday).to_s
|
38
|
+
# => '45 14 * * 1,2'
|
39
|
+
|
40
|
+
== Caveats
|
41
|
+
|
42
|
+
Certain combinations produce unintuitive results. They should be obvious but just in case I will
|
43
|
+
list some. Such as
|
44
|
+
|
45
|
+
weekly.on_days(:monday, :tuesday)
|
46
|
+
|
47
|
+
Will actually run the task *twice* weekly
|
48
|
+
|
49
|
+
TODO: more weird stuff?
|
50
|
+
|
51
|
+
Also cron itself allows days of month and days of week to be set. These are independent of each other.
|
52
|
+
|
53
|
+
For example:
|
54
|
+
|
55
|
+
on_the('15th').of(:jan).on_days(:mon, :tue)
|
56
|
+
|
57
|
+
This will be run on the 15th of January AND every Monday and Tuesday of January, so be aware. Though it
|
58
|
+
is a strange combination anyway, the result is the union of both and not the intersection.
|
59
|
+
|
60
|
+
|
61
|
+
== Install
|
62
|
+
|
63
|
+
sudo gem install adzap-cronos -s http://gems.github.com
|
64
|
+
|
65
|
+
|
66
|
+
== Credits
|
67
|
+
|
68
|
+
Adam Meehan (http://duckpunching.com, adam.meehan@gmail.com)
|
69
|
+
|
70
|
+
|
71
|
+
== License
|
72
|
+
|
73
|
+
Copyright (c) 2008 Adam Meehan, released under the MIT license
|
data/Rakefile
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake/gempackagetask'
|
3
|
+
require 'rubygems/specification'
|
4
|
+
require 'date'
|
5
|
+
require 'spec/rake/spectask'
|
6
|
+
require 'lib/cronos'
|
7
|
+
|
8
|
+
GEM = "cronos"
|
9
|
+
GEM_VERSION = Cronos::VERSION
|
10
|
+
AUTHOR = "Adam Meehan"
|
11
|
+
EMAIL = "adam.meehan@gmail.com"
|
12
|
+
HOMEPAGE = "http://github.com/adzap/cronos"
|
13
|
+
SUMMARY = "Tool for generating cron intervals using a natural syntax"
|
14
|
+
|
15
|
+
spec = Gem::Specification.new do |s|
|
16
|
+
s.name = GEM
|
17
|
+
s.version = GEM_VERSION
|
18
|
+
s.platform = Gem::Platform::RUBY
|
19
|
+
s.has_rdoc = true
|
20
|
+
s.extra_rdoc_files = ["README.rdoc", "LICENSE", 'TODO', "CHANGELOG"]
|
21
|
+
s.summary = SUMMARY
|
22
|
+
s.description = s.summary
|
23
|
+
s.author = AUTHOR
|
24
|
+
s.email = EMAIL
|
25
|
+
s.homepage = HOMEPAGE
|
26
|
+
|
27
|
+
# Uncomment this to add a dependency
|
28
|
+
# s.add_dependency "foo"
|
29
|
+
|
30
|
+
s.require_path = 'lib'
|
31
|
+
s.autorequire = GEM
|
32
|
+
s.files = %w(LICENSE README.rdoc Rakefile TODO CHANGELOG) + Dir.glob("{lib,spec}/**/*")
|
33
|
+
end
|
34
|
+
|
35
|
+
task :default => :spec
|
36
|
+
|
37
|
+
desc "Run specs"
|
38
|
+
Spec::Rake::SpecTask.new do |t|
|
39
|
+
t.spec_files = FileList['spec/**/*_spec.rb']
|
40
|
+
t.spec_opts = %w(-fs --color)
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
Rake::GemPackageTask.new(spec) do |pkg|
|
45
|
+
pkg.gem_spec = spec
|
46
|
+
end
|
47
|
+
|
48
|
+
desc "install the gem locally"
|
49
|
+
task :install => [:package] do
|
50
|
+
sh %{sudo gem install pkg/#{GEM}-#{GEM_VERSION}}
|
51
|
+
end
|
52
|
+
|
53
|
+
desc "create a gemspec file"
|
54
|
+
task :make_spec do
|
55
|
+
File.open("#{GEM}.gemspec", "w") do |file|
|
56
|
+
file.puts spec.to_ruby
|
57
|
+
end
|
58
|
+
end
|
data/lib/cronos.rb
ADDED
@@ -0,0 +1,261 @@
|
|
1
|
+
module Cronos
|
2
|
+
|
3
|
+
VERSION = '0.3.1'
|
4
|
+
|
5
|
+
class Interval
|
6
|
+
attr_accessor :min, :hour, :day, :month, :dow
|
7
|
+
|
8
|
+
MONTHS = [:jan, :feb, :mar, :apr, :may, :jun, :jul, :aug, :sep, :oct, :nov, :dec]
|
9
|
+
|
10
|
+
DAYS = [:sun, :mon, :tue, :wed, :thu, :fri, :sat]
|
11
|
+
|
12
|
+
# Time:
|
13
|
+
# at(12)
|
14
|
+
# at(1.30)
|
15
|
+
# at('01.30')
|
16
|
+
# at(14.30)
|
17
|
+
# at('2pm')
|
18
|
+
#
|
19
|
+
def at(time)
|
20
|
+
@hour, @min, meridian = parse_time(time)
|
21
|
+
|
22
|
+
raise "invalid hour value for 'at'" if @hour > 12 && meridian
|
23
|
+
raise "invalid minute value for 'at'" if @min > 59
|
24
|
+
|
25
|
+
case meridian
|
26
|
+
when 'am': @hour = 0 if @hour == 12
|
27
|
+
when 'pm': @hour += 12 if @hour < 12
|
28
|
+
end
|
29
|
+
raise "invalid hour value for 'at'" if @hour > 23
|
30
|
+
self
|
31
|
+
end
|
32
|
+
|
33
|
+
# Repeats an interval:
|
34
|
+
# every(10).minutes
|
35
|
+
# every(6).hours
|
36
|
+
# every(2).months
|
37
|
+
#
|
38
|
+
# or use as an alias for #on or #days
|
39
|
+
# every(:monday)
|
40
|
+
# every('February', :march)
|
41
|
+
#
|
42
|
+
def every(*multiple)
|
43
|
+
return RepeatInterval.new(multiple.first, self) if multiple.first.is_a?(Fixnum)
|
44
|
+
|
45
|
+
abbrs = multiple.map {|i| i.to_s.downcase[0..2].to_sym }
|
46
|
+
|
47
|
+
if abbrs.all? {|abbr| MONTHS.include?(abbr) }
|
48
|
+
of(*abbrs)
|
49
|
+
elsif abbrs.all? {|abbr| DAYS.include?(abbr) }
|
50
|
+
days(*abbrs)
|
51
|
+
else
|
52
|
+
raise "Unknown interval type passed to #every"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
# Days of month:
|
57
|
+
# on(13)
|
58
|
+
# on('13th')
|
59
|
+
# on(13..17)
|
60
|
+
# on(13...18)
|
61
|
+
# on_the('13th')
|
62
|
+
#
|
63
|
+
def on(*args)
|
64
|
+
if args.first.is_a?(Range)
|
65
|
+
@day = format_range(args.first)
|
66
|
+
else
|
67
|
+
list = args.collect {|day| day.to_s.to_i }
|
68
|
+
@day = list.join(',')
|
69
|
+
end
|
70
|
+
self
|
71
|
+
end
|
72
|
+
alias on_the on
|
73
|
+
|
74
|
+
# Days of the week:
|
75
|
+
# days(:monday)
|
76
|
+
# days('Monday')
|
77
|
+
# days(:mon)
|
78
|
+
# days(1..3)
|
79
|
+
# days(1...4)
|
80
|
+
# on_day(:monday)
|
81
|
+
# days(:mon, :tues)
|
82
|
+
# on_days(:mon, :tues)
|
83
|
+
#
|
84
|
+
def days(*args)
|
85
|
+
if args.first.is_a?(Range)
|
86
|
+
@dow = format_range(args.first)
|
87
|
+
else
|
88
|
+
list = args.map {|day| DAYS.index(day.to_s.downcase[0..2].to_sym) }
|
89
|
+
@dow = list.join(',')
|
90
|
+
end
|
91
|
+
self
|
92
|
+
end
|
93
|
+
alias on_days days
|
94
|
+
alias on_day days
|
95
|
+
|
96
|
+
# Months:
|
97
|
+
# of(:january)
|
98
|
+
# of('January')
|
99
|
+
# of(:jan)
|
100
|
+
# of(:jan, :feb, :mar)
|
101
|
+
# of(1..3)
|
102
|
+
# of(1...4)
|
103
|
+
# of_months(1, 2, 3)
|
104
|
+
# in(:january)
|
105
|
+
#
|
106
|
+
def of(*args)
|
107
|
+
if args.first.is_a?(Range)
|
108
|
+
@month = format_range(args.first)
|
109
|
+
else
|
110
|
+
list = args.map {|month| MONTHS.index(month.to_s.downcase[0..2].to_sym) + 1 unless month.is_a?(Fixnum) }
|
111
|
+
@month = list.join(',')
|
112
|
+
end
|
113
|
+
self
|
114
|
+
end
|
115
|
+
alias of_months of
|
116
|
+
alias in of
|
117
|
+
|
118
|
+
def hourly
|
119
|
+
@min = 0
|
120
|
+
@hour = nil
|
121
|
+
self
|
122
|
+
end
|
123
|
+
|
124
|
+
def daily
|
125
|
+
@min ||= 0
|
126
|
+
@hour ||= 0
|
127
|
+
@day = nil
|
128
|
+
self
|
129
|
+
end
|
130
|
+
alias once_a_day daily
|
131
|
+
|
132
|
+
def midnight
|
133
|
+
@min = 0
|
134
|
+
@hour = 0
|
135
|
+
self
|
136
|
+
end
|
137
|
+
alias at_midnight midnight
|
138
|
+
|
139
|
+
def midday
|
140
|
+
@min = 0
|
141
|
+
@hour = 12
|
142
|
+
self
|
143
|
+
end
|
144
|
+
alias at_midday midday
|
145
|
+
|
146
|
+
def weekly
|
147
|
+
@min ||= 0
|
148
|
+
@hour ||= 0
|
149
|
+
@dow ||= 0
|
150
|
+
@day = nil
|
151
|
+
@month = nil
|
152
|
+
self
|
153
|
+
end
|
154
|
+
alias once_a_week weekly
|
155
|
+
|
156
|
+
def monthly
|
157
|
+
@min ||= 0
|
158
|
+
@hour ||= 0
|
159
|
+
@day ||= 1
|
160
|
+
@month = nil
|
161
|
+
@dow = nil
|
162
|
+
self
|
163
|
+
end
|
164
|
+
alias once_a_month monthly
|
165
|
+
|
166
|
+
def weekdays
|
167
|
+
@min ||= 0
|
168
|
+
@hour ||= 0
|
169
|
+
@dow = '1-5'
|
170
|
+
self
|
171
|
+
end
|
172
|
+
|
173
|
+
def weekends
|
174
|
+
@min ||= 0
|
175
|
+
@hour ||= 0
|
176
|
+
@dow = '0,6'
|
177
|
+
self
|
178
|
+
end
|
179
|
+
|
180
|
+
def to_s
|
181
|
+
"#{min || '*'} #{hour || '*'} #{day || '*'} #{month || '*'} #{dow || '*'}"
|
182
|
+
end
|
183
|
+
|
184
|
+
def to_hash
|
185
|
+
{
|
186
|
+
:minute => "#{min || '*'}",
|
187
|
+
:hour => "#{hour || '*'}",
|
188
|
+
:day => "#{day || '*'}",
|
189
|
+
:month => "#{month || '*'}",
|
190
|
+
:weekday => "#{dow || '*'}"
|
191
|
+
}
|
192
|
+
end
|
193
|
+
|
194
|
+
private
|
195
|
+
|
196
|
+
def parse_time(time)
|
197
|
+
meridian = /pm|am/i.match(time.to_s)[0].downcase rescue nil
|
198
|
+
hour, min = *time.to_s.split('.')
|
199
|
+
|
200
|
+
hour = hour.to_i
|
201
|
+
min = min.strip.ljust(2, '0').to_i if min
|
202
|
+
min ||= 0
|
203
|
+
|
204
|
+
return hour, min, meridian
|
205
|
+
end
|
206
|
+
|
207
|
+
def format_range(range)
|
208
|
+
list = Array(range).sort
|
209
|
+
"#{list.first}-#{list.last}"
|
210
|
+
end
|
211
|
+
|
212
|
+
class RepeatInterval
|
213
|
+
|
214
|
+
def initialize(multiple, interval)
|
215
|
+
@multiple, @interval = multiple, interval
|
216
|
+
end
|
217
|
+
|
218
|
+
def minutes
|
219
|
+
raise 'Multiple of minutes will not fit into an hour' if (60 % @multiple) > 0
|
220
|
+
calculate_intervals(60)
|
221
|
+
@interval.min = self
|
222
|
+
@interval
|
223
|
+
end
|
224
|
+
|
225
|
+
def hours
|
226
|
+
raise 'Multiple of hours will not fit into a day' if (24 % @multiple) > 0
|
227
|
+
calculate_intervals(24)
|
228
|
+
@interval.min = 0
|
229
|
+
@interval.hour = self
|
230
|
+
@interval
|
231
|
+
end
|
232
|
+
|
233
|
+
def months
|
234
|
+
raise 'Multiple of months will not fit into a year' if (12 % @multiple) > 0
|
235
|
+
calculate_intervals(12, 1)
|
236
|
+
@interval.min ||= 0
|
237
|
+
@interval.hour ||= 0
|
238
|
+
@interval.day ||= 1
|
239
|
+
@interval.month = self
|
240
|
+
@interval
|
241
|
+
end
|
242
|
+
|
243
|
+
def calculate_intervals(base, initial = 0)
|
244
|
+
repeats = (base / @multiple) - 1
|
245
|
+
set = [initial]
|
246
|
+
1.upto(repeats) {|factor| set << (factor * @multiple + initial) }
|
247
|
+
@intervals = set
|
248
|
+
end
|
249
|
+
|
250
|
+
def to_s
|
251
|
+
@intervals.join(',')
|
252
|
+
end
|
253
|
+
|
254
|
+
def to_a
|
255
|
+
@intervals
|
256
|
+
end
|
257
|
+
end
|
258
|
+
|
259
|
+
end
|
260
|
+
|
261
|
+
end
|
data/spec/cronos_spec.rb
ADDED
@@ -0,0 +1,329 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/spec_helper'
|
2
|
+
|
3
|
+
describe Cronos::Interval do
|
4
|
+
|
5
|
+
it "should return default interval for every minute" do
|
6
|
+
interval.to_s.should == '* * * * *'
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should return hash of values from to_hash method" do
|
10
|
+
interval.at(2.01).on_the('3rd').of(:april).to_hash.should == {:minute => '1', :hour => '2', :day => '3', :month => '4', :weekday => '*'}
|
11
|
+
end
|
12
|
+
|
13
|
+
describe "at method" do
|
14
|
+
it "should output interval from integer with hour as integer value and 0 minute" do
|
15
|
+
interval.at(8).to_s.should == '0 8 * * *'
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should output interval from a float with hour value from integer part and minute from decimal part" do
|
19
|
+
interval.at(8.21).to_s.should == '21 8 * * *'
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should output interval from a float with hour value from integer part and minute from decimal part left justified to 2 digits" do
|
23
|
+
interval.at(8.20).to_s.should == '20 8 * * *'
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should output interval from time string with pm meridian having hour adjusted 24 hour time" do
|
27
|
+
interval.at('8.21pm').to_s.should == '21 20 * * *'
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should output interval from time string with pm meridian having hour unadjusted if hour is 12" do
|
31
|
+
interval.at('12.21pm').to_s.should == '21 12 * * *'
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should output interval from time string with am meridian having hour adjusted to 0 if hour is 12" do
|
35
|
+
interval.at('12.21am').to_s.should == '21 0 * * *'
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should raise error if hours out of range" do
|
39
|
+
lambda { interval.daily.at('24.21') }.should raise_error
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should raise error if minutes out of range" do
|
43
|
+
lambda { interval.daily.at('23.60') }.should raise_error
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe "on method" do
|
48
|
+
it "should output interval from integer with day of month as value" do
|
49
|
+
interval.on(15).to_s.should == '* * 15 * *'
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should output interval from day string with ordinal suffix" do
|
53
|
+
interval.on('15th').to_s.should == '* * 15 * *'
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should output interval from inclusive range as dashed day of month range " do
|
57
|
+
interval.on(15..17).to_s.should == '* * 15-17 * *'
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should output interval from exclusive range as dashed day of month range " do
|
61
|
+
interval.on(15...18).to_s.should == '* * 15-17 * *'
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should output interval from integer array as day number list" do
|
65
|
+
interval.on(15, 16, 17).to_s.should == '* * 15,16,17 * *'
|
66
|
+
end
|
67
|
+
|
68
|
+
it "should output interval from day string array as day number list" do
|
69
|
+
interval.on('15th', '16th', '17th').to_s.should == '* * 15,16,17 * *'
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
describe "of method" do
|
74
|
+
it "should output interval with month number from a symbol month name" do
|
75
|
+
interval.of(:january).to_s.should == '* * * 1 *'
|
76
|
+
end
|
77
|
+
|
78
|
+
it "should output interval with month number from a symbol short month name" do
|
79
|
+
interval.of(:jan).to_s.should == '* * * 1 *'
|
80
|
+
end
|
81
|
+
|
82
|
+
it "should output interval with month number from a strong month name" do
|
83
|
+
interval.of('January').to_s.should == '* * * 1 *'
|
84
|
+
end
|
85
|
+
|
86
|
+
it "should output interval with comma seperated month numbers from array of symbol month names" do
|
87
|
+
interval.of(:january, :february, :march).to_s.should == '* * * 1,2,3 *'
|
88
|
+
end
|
89
|
+
|
90
|
+
it "should output interval with comma seperated month numbers from array of short symbol month names" do
|
91
|
+
interval.of(:jan, :feb, :mar).to_s.should == '* * * 1,2,3 *'
|
92
|
+
end
|
93
|
+
|
94
|
+
it "should output interval with comma seperated month numbers from array of string month names" do
|
95
|
+
interval.of('January', 'February', 'March').to_s.should == '* * * 1,2,3 *'
|
96
|
+
end
|
97
|
+
|
98
|
+
it "should output interval from integer inclusive range as dashed month range " do
|
99
|
+
interval.of(1..3).to_s.should == '* * * 1-3 *'
|
100
|
+
end
|
101
|
+
|
102
|
+
it "should output interval from integer exclusive range as dashed month range " do
|
103
|
+
interval.of(1...4).to_s.should == '* * * 1-3 *'
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
describe "days method" do
|
108
|
+
it "should output interval with day number from a symbol day name" do
|
109
|
+
interval.days(:monday).to_s.should == '* * * * 1'
|
110
|
+
end
|
111
|
+
|
112
|
+
it "should output interval with day number from a string day name" do
|
113
|
+
interval.days('Mondays').to_s.should == '* * * * 1'
|
114
|
+
end
|
115
|
+
|
116
|
+
it "should output interval with day number from a symbol short day name" do
|
117
|
+
interval.days(:mon).to_s.should == '* * * * 1'
|
118
|
+
end
|
119
|
+
|
120
|
+
it "should output interval with day numbers from array of symbol day names" do
|
121
|
+
interval.days(:monday, :wednesday, :friday).to_s.should == '* * * * 1,3,5'
|
122
|
+
end
|
123
|
+
|
124
|
+
it "should output interval with day numbers from array of symbol short day names" do
|
125
|
+
interval.days(:mon, :wed, :fri).to_s.should == '* * * * 1,3,5'
|
126
|
+
end
|
127
|
+
|
128
|
+
it "should output interval with day numbers from array of string day names" do
|
129
|
+
interval.days('Monday', 'Wednesday', 'Friday').to_s.should == '* * * * 1,3,5'
|
130
|
+
end
|
131
|
+
|
132
|
+
it "should output interval from integer inclusive range as dashed dow range " do
|
133
|
+
interval.days(1..3).to_s.should == '* * * * 1-3'
|
134
|
+
end
|
135
|
+
|
136
|
+
it "should output interval from integer exclusive range as dashed dow range " do
|
137
|
+
interval.days(1...4).to_s.should == '* * * * 1-3'
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
describe "hourly method" do
|
142
|
+
it "should output interval to run at start of every hour" do
|
143
|
+
interval.hourly.to_s.should == '0 * * * *'
|
144
|
+
end
|
145
|
+
|
146
|
+
it "should only affect the hour and minutes" do
|
147
|
+
interval.day = 1
|
148
|
+
interval.month = 1
|
149
|
+
interval.dow = 1
|
150
|
+
interval.hourly.to_s.should == '0 * 1 1 1'
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
describe "daily method" do
|
155
|
+
it "should output interval to run at 00:00 every day by default" do
|
156
|
+
interval.daily.to_s.should == '0 0 * * *'
|
157
|
+
end
|
158
|
+
|
159
|
+
it "should only affect the hour, minutes and day" do
|
160
|
+
interval.month = 1
|
161
|
+
interval.dow = 1
|
162
|
+
interval.daily.to_s.should == '0 0 * 1 1'
|
163
|
+
end
|
164
|
+
|
165
|
+
it "should preserve hour and minutes if set" do
|
166
|
+
interval.min = 10
|
167
|
+
interval.hour = 11
|
168
|
+
interval.daily.to_s.should == '10 11 * * *'
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
describe "midnight method" do
|
173
|
+
it "should output interval to run at 00:00" do
|
174
|
+
interval.midnight.to_s.should == '0 0 * * *'
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
describe "midday method" do
|
179
|
+
it "should output interval to run at 12:00" do
|
180
|
+
interval.midday.to_s.should == '0 12 * * *'
|
181
|
+
end
|
182
|
+
end
|
183
|
+
|
184
|
+
describe "weekly method" do
|
185
|
+
it "should output interval to run on Sunday at 00:00 by default" do
|
186
|
+
interval.weekly.to_s.should == '0 0 * * 0'
|
187
|
+
end
|
188
|
+
|
189
|
+
it "should override day of month and month" do
|
190
|
+
interval.day = 1
|
191
|
+
interval.month = 1
|
192
|
+
interval.weekly.to_s.should == '0 0 * * 0'
|
193
|
+
end
|
194
|
+
|
195
|
+
it "should preserve hour, minute and day of week if set" do
|
196
|
+
interval.min = 10
|
197
|
+
interval.hour = 11
|
198
|
+
interval.dow = 1
|
199
|
+
interval.daily.to_s.should == '10 11 * * 1'
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
describe "monthly method" do
|
204
|
+
it "should output interval to run on the 1st day of every month at 00:00 by default" do
|
205
|
+
interval.monthly.to_s.should == '0 0 1 * *'
|
206
|
+
end
|
207
|
+
|
208
|
+
it "should override day of month and month" do
|
209
|
+
interval.day = 1
|
210
|
+
interval.month = 1
|
211
|
+
interval.monthly.to_s.should == '0 0 1 * *'
|
212
|
+
end
|
213
|
+
|
214
|
+
it "should preserve hour, minute and day if set" do
|
215
|
+
interval.min = 10
|
216
|
+
interval.hour = 11
|
217
|
+
interval.day = 12
|
218
|
+
interval.monthly.to_s.should == '10 11 12 * *'
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
describe "weekends method" do
|
223
|
+
it "should output interval to run at 00:00 every Saturday and Sunday" do
|
224
|
+
interval.weekends.to_s.should == '0 0 * * 0,6'
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
228
|
+
describe "weekdays method" do
|
229
|
+
it "should output interval to run at 00:00 every day Monday to Friday" do
|
230
|
+
interval.weekdays.to_s.should == '0 0 * * 1-5'
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
234
|
+
describe "every(x).minutes" do
|
235
|
+
it "should output interval for list of minutes differing by arg value" do
|
236
|
+
interval.every(15).minutes.to_s.should == '0,15,30,45 * * * *'
|
237
|
+
end
|
238
|
+
|
239
|
+
it "should raise error if x not a divisor of 60" do
|
240
|
+
lambda { interval.every(13).minutes }.should raise_error
|
241
|
+
end
|
242
|
+
end
|
243
|
+
|
244
|
+
describe "every(x).hours" do
|
245
|
+
it "should output interval for 0 minute and list of hours differing by arg value" do
|
246
|
+
interval.every(6).hours.to_s.should == '0 0,6,12,18 * * *'
|
247
|
+
end
|
248
|
+
|
249
|
+
it "should raise error if x not a divisor of 24" do
|
250
|
+
lambda { interval.every(13).minutes }.should raise_error
|
251
|
+
end
|
252
|
+
end
|
253
|
+
|
254
|
+
describe "every(x).months" do
|
255
|
+
it "should output interval for 00:00 on 1st day of month and list of months differing by arg value" do
|
256
|
+
interval.every(6).hours.to_s.should == '0 0,6,12,18 * * *'
|
257
|
+
end
|
258
|
+
|
259
|
+
it "should raise error if x not a divisor of 12" do
|
260
|
+
lambda { interval.every(7).minutes }.should raise_error
|
261
|
+
end
|
262
|
+
end
|
263
|
+
|
264
|
+
describe "every(day_name)" do
|
265
|
+
it "should output interval for day symbol as day of week" do
|
266
|
+
interval.every(:sunday).to_s.should == '* * * * 0'
|
267
|
+
end
|
268
|
+
|
269
|
+
it "should output interval for list of days as days of week" do
|
270
|
+
interval.every(:thursay, 'Friday').to_s.should == '* * * * 4,5'
|
271
|
+
end
|
272
|
+
end
|
273
|
+
|
274
|
+
describe "every(month_name)" do
|
275
|
+
it "should output interval for month symbol as month" do
|
276
|
+
interval.every(:january).to_s.should == '* * * 1 *'
|
277
|
+
end
|
278
|
+
|
279
|
+
it "should output interval for list of months as months" do
|
280
|
+
interval.every(:february, 'March').to_s.should == '* * * 2,3 *'
|
281
|
+
end
|
282
|
+
end
|
283
|
+
|
284
|
+
describe "combinations" do
|
285
|
+
it "weekly.at(3.30) should output '30 3 * * 0'" do
|
286
|
+
interval.weekly.at(3.30).to_s.should == '30 3 * * 0'
|
287
|
+
end
|
288
|
+
|
289
|
+
it "monthly.at(3.30) should output '30 3 * * *'" do
|
290
|
+
interval.monthly.at(3.30).to_s.should == '30 3 1 * *'
|
291
|
+
end
|
292
|
+
|
293
|
+
it "monthly.on_the('15th').at(3.30) should output '30 3 15 * *'" do
|
294
|
+
interval.monthly.on_the('15th').at(3.30).to_s.should == '30 3 15 * *'
|
295
|
+
end
|
296
|
+
|
297
|
+
it "at('11pm').on_days(:monday, :tuesday) should output '0 11 * * 1,2'" do
|
298
|
+
interval.at('11pm').on_days(:monday, :tuesday).to_s.should == '0 23 * * 1,2'
|
299
|
+
end
|
300
|
+
|
301
|
+
it "on(15).of(:january) should output '* * 15 1 *'" do
|
302
|
+
interval.on(15).of(:january).to_s.should == '* * 15 1 *'
|
303
|
+
end
|
304
|
+
|
305
|
+
it "on(15, 16, 17).of(:january) should output '* * 15,16,17 1 *'" do
|
306
|
+
interval.on(15, 16, 17).of(:january).to_s.should == '* * 15,16,17 1 *'
|
307
|
+
end
|
308
|
+
|
309
|
+
it "on(15..17).of(:january) should output '* * 15-17 1 *'" do
|
310
|
+
interval.on(15..17).of(:january).to_s.should == '* * 15-17 1 *'
|
311
|
+
end
|
312
|
+
|
313
|
+
it "on(15, 16, 17).of(:january) should output '* * 15 1,6,12 *'" do
|
314
|
+
interval.on(15).of(:jan, :jun, :dec).to_s.should == '* * 15 1,6,12 *'
|
315
|
+
end
|
316
|
+
|
317
|
+
it "at('2.13pm').on_the_('15th').of(:january) should output '13 14 15 1'" do
|
318
|
+
interval.at('2.13pm').on_the(15).of(:january).to_s.should == '13 14 15 1 *'
|
319
|
+
end
|
320
|
+
|
321
|
+
it "every(15).minutes.on_the('15th').of(:january) should output '0,15,30,45 * 15 1 *'" do
|
322
|
+
interval.every(15).minutes.on_the('15th').of(:january).to_s.should == '0,15,30,45 * 15 1 *'
|
323
|
+
end
|
324
|
+
end
|
325
|
+
|
326
|
+
def interval
|
327
|
+
@interval ||= Cronos::Interval.new
|
328
|
+
end
|
329
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: cronos
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.3.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Adam Meehan
|
8
|
+
autorequire: cronos
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-02-03 00:00:00 +11:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: Tool for generating cron intervals using a natural syntax
|
17
|
+
email: adam.meehan@gmail.com
|
18
|
+
executables: []
|
19
|
+
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files:
|
23
|
+
- README.rdoc
|
24
|
+
- LICENSE
|
25
|
+
- TODO
|
26
|
+
- CHANGELOG
|
27
|
+
files:
|
28
|
+
- LICENSE
|
29
|
+
- README.rdoc
|
30
|
+
- Rakefile
|
31
|
+
- TODO
|
32
|
+
- CHANGELOG
|
33
|
+
- lib/cronos.rb
|
34
|
+
- spec/spec_helper.rb
|
35
|
+
- spec/cronos_spec.rb
|
36
|
+
has_rdoc: true
|
37
|
+
homepage: http://github.com/adzap/cronos
|
38
|
+
post_install_message:
|
39
|
+
rdoc_options: []
|
40
|
+
|
41
|
+
require_paths:
|
42
|
+
- lib
|
43
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: "0"
|
48
|
+
version:
|
49
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: "0"
|
54
|
+
version:
|
55
|
+
requirements: []
|
56
|
+
|
57
|
+
rubyforge_project:
|
58
|
+
rubygems_version: 1.3.1
|
59
|
+
signing_key:
|
60
|
+
specification_version: 2
|
61
|
+
summary: Tool for generating cron intervals using a natural syntax
|
62
|
+
test_files: []
|
63
|
+
|