adzap-cronos 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG ADDED
@@ -0,0 +1,2 @@
1
+ == 0.2.1 2009-01-17
2
+ - 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,67 @@
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
+ == Credits
66
+
67
+ Adam Meehan (http://duckpunching.com, adam.meehan@gmail.com)
data/Rakefile ADDED
@@ -0,0 +1,57 @@
1
+ require 'rubygems'
2
+ require 'rake/gempackagetask'
3
+ require 'rubygems/specification'
4
+ require 'date'
5
+ require 'spec/rake/spectask'
6
+
7
+ GEM = "cronos"
8
+ GEM_VERSION = "0.2.1"
9
+ AUTHOR = "Adam Meehan"
10
+ EMAIL = "adam.meehan@gmail.com"
11
+ HOMEPAGE = "http://github.com/adzap/cronos"
12
+ SUMMARY = "Tool for generating cron intervals using a natural syntax"
13
+
14
+ spec = Gem::Specification.new do |s|
15
+ s.name = GEM
16
+ s.version = GEM_VERSION
17
+ s.platform = Gem::Platform::RUBY
18
+ s.has_rdoc = true
19
+ s.extra_rdoc_files = ["README.rdoc", "LICENSE", 'TODO']
20
+ s.summary = SUMMARY
21
+ s.description = s.summary
22
+ s.author = AUTHOR
23
+ s.email = EMAIL
24
+ s.homepage = HOMEPAGE
25
+
26
+ # Uncomment this to add a dependency
27
+ # s.add_dependency "foo"
28
+
29
+ s.require_path = 'lib'
30
+ s.autorequire = GEM
31
+ s.files = %w(LICENSE README.rdoc Rakefile TODO CHANGELOG) + Dir.glob("{lib,spec}/**/*")
32
+ end
33
+
34
+ task :default => :spec
35
+
36
+ desc "Run specs"
37
+ Spec::Rake::SpecTask.new do |t|
38
+ t.spec_files = FileList['spec/**/*_spec.rb']
39
+ t.spec_opts = %w(-fs --color)
40
+ end
41
+
42
+
43
+ Rake::GemPackageTask.new(spec) do |pkg|
44
+ pkg.gem_spec = spec
45
+ end
46
+
47
+ desc "install the gem locally"
48
+ task :install => [:package] do
49
+ sh %{sudo gem install pkg/#{GEM}-#{GEM_VERSION}}
50
+ end
51
+
52
+ desc "create a gemspec file"
53
+ task :make_spec do
54
+ File.open("#{GEM}.gemspec", "w") do |file|
55
+ file.puts spec.to_ruby
56
+ end
57
+ end
data/TODO ADDED
@@ -0,0 +1,3 @@
1
+ TODO:
2
+ - more examples
3
+ - more everything as its a start
data/lib/cronos.rb ADDED
@@ -0,0 +1,206 @@
1
+ module Cronos
2
+
3
+ class Interval
4
+ attr_accessor :min, :hour, :day, :month, :dow
5
+
6
+ MONTHS = [:jan, :feb, :mar, :apr, :may, :jun, :jul, :aug, :sep, :oct, :nov, :dec]
7
+
8
+ DAYS = [:sun, :mon, :tue, :wed, :thu, :fri, :sat]
9
+
10
+ # Time:
11
+ # at(12)
12
+ # at(1.30)
13
+ # at('01.30')
14
+ # at(14.30)
15
+ # at('2pm')
16
+ #
17
+ def at(time)
18
+ @hour, @min, meridian = parse_time(time)
19
+
20
+ raise "invalid hour value for 'at'" if @hour > 12 && meridian
21
+ raise "invalid minute value for 'at'" if @min > 59
22
+
23
+ case meridian
24
+ when 'am': @hour = 0 if @hour == 12
25
+ when 'pm': @hour += 12 if @hour < 12
26
+ end
27
+ raise "invalid hour value for 'at'" if @hour > 23
28
+ self
29
+ end
30
+
31
+ # Repeats an interval:
32
+ # every(10).minutes
33
+ # every(6).hours
34
+ # every(2).months
35
+ #
36
+ def every(multiple)
37
+ RepeatInterval.new(multiple, self)
38
+ end
39
+
40
+ # Days of month:
41
+ # on(13)
42
+ # on('13th')
43
+ # on(13..17)
44
+ # on_the('13th')
45
+ #
46
+ def on(*args)
47
+ if args.first.is_a?(Range)
48
+ range = args.first
49
+ @day = "#{range.first.to_i}-#{range.last.to_i}"
50
+ else
51
+ list = args.collect {|day| day.to_s.to_i }
52
+ @day = list.join(',')
53
+ end
54
+ self
55
+ end
56
+ alias on_the on
57
+
58
+ # Days of the week:
59
+ # days(:monday)
60
+ # days('Monday')
61
+ # days(:mon)
62
+ # on_day(:monday)
63
+ # days(:mon, :tues)
64
+ # on_days(:mon, :tues)
65
+ #
66
+ def days(*args)
67
+ list = args.map {|day| DAYS.index(day.to_s.downcase[0..2].to_sym) }
68
+ @dow = list.join(',')
69
+ self
70
+ end
71
+ alias on_days days
72
+ alias on_day days
73
+
74
+ # Months:
75
+ # of(:january)
76
+ # of('January')
77
+ # of(:jan
78
+ # of(:jan, :feb, :mar)
79
+ # of_months(1, 2, 3)
80
+ #
81
+ def of(*args)
82
+ list = args.map {|month| MONTHS.index(month.to_s.downcase[0..2].to_sym) + 1 unless month.is_a?(Fixnum) }
83
+ @month = list.join(',')
84
+ self
85
+ end
86
+ alias of_months of
87
+
88
+ def hourly
89
+ @min = 0
90
+ @hour = nil
91
+ self
92
+ end
93
+
94
+ def daily
95
+ @min ||= 0
96
+ @hour ||= 0
97
+ @day = nil
98
+ self
99
+ end
100
+ alias once_a_day daily
101
+
102
+ def weekly
103
+ @min ||= 0
104
+ @hour ||= 0
105
+ @dow ||= 0
106
+ @day = nil
107
+ @month = nil
108
+ self
109
+ end
110
+ alias once_a_week weekly
111
+
112
+ def monthly
113
+ @min ||= 0
114
+ @hour ||= 0
115
+ @day ||= 1
116
+ @month = nil
117
+ @dow = nil
118
+ self
119
+ end
120
+ alias once_a_month monthly
121
+
122
+ def weekdays
123
+ @min ||= 0
124
+ @hour ||= 0
125
+ @dow = '1-5'
126
+ self
127
+ end
128
+
129
+ def weekends
130
+ @min ||= 0
131
+ @hour ||= 0
132
+ @dow = '0,6'
133
+ self
134
+ end
135
+
136
+ def to_s
137
+ "#{min || '*'} #{hour || '*'} #{day || '*'} #{month || '*'} #{dow || '*'}"
138
+ end
139
+
140
+ def to_hash
141
+ {:minute => min || '*', :hour => hour || '*', :day => day || '*', :month => month || '*', :weekday => dow || '*'}
142
+ end
143
+
144
+ private
145
+
146
+ def parse_time(time)
147
+ meridian = /pm|am/i.match(time.to_s)[0].downcase rescue nil
148
+ hour, min = *time.to_s.split('.')
149
+
150
+ hour = hour.to_i
151
+ min = min.strip.ljust(2, '0').to_i if min
152
+ min ||= 0
153
+
154
+ return hour, min, meridian
155
+ end
156
+
157
+ class RepeatInterval
158
+
159
+ def initialize(multiple, interval)
160
+ @multiple, @interval = multiple, interval
161
+ end
162
+
163
+ def minutes
164
+ raise 'Multiple of minutes will not fit into an hour' if (60 % @multiple) > 0
165
+ calculate_intervals(60)
166
+ @interval.min = self
167
+ @interval
168
+ end
169
+
170
+ def hours
171
+ raise 'Multiple of hours will not fit into a day' if (24 % @multiple) > 0
172
+ calculate_intervals(24)
173
+ @interval.min = 0
174
+ @interval.hour = self
175
+ @interval
176
+ end
177
+
178
+ def months
179
+ raise 'Multiple of months will not fit into a year' if (12 % @multiple) > 0
180
+ calculate_intervals(12, 1)
181
+ @interval.min ||= 0
182
+ @interval.hour ||= 0
183
+ @interval.day ||= 1
184
+ @interval.month = self
185
+ @interval
186
+ end
187
+
188
+ def calculate_intervals(base, initial = 0)
189
+ repeats = (base / @multiple) - 1
190
+ set = [initial]
191
+ 1.upto(repeats) {|factor| set << (factor * @multiple + initial) }
192
+ @intervals = set
193
+ end
194
+
195
+ def to_s
196
+ @intervals.join(',')
197
+ end
198
+
199
+ def to_a
200
+ @intervals
201
+ end
202
+ end
203
+
204
+ end
205
+
206
+ end
@@ -0,0 +1,277 @@
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.to_hash.should == {:minute => '*', :hour => '*', :day => '*', :month => '*', :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 integer 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 integer array as day number list" do
61
+ interval.on(15, 16, 17).to_s.should == '* * 15,16,17 * *'
62
+ end
63
+
64
+ it "should output interval from day string array as day number list" do
65
+ interval.on('15th', '16th', '17th').to_s.should == '* * 15,16,17 * *'
66
+ end
67
+ end
68
+
69
+ describe "of method" do
70
+ it "should output interval with month number from a symbol month name" do
71
+ interval.of(:january).to_s.should == '* * * 1 *'
72
+ end
73
+
74
+ it "should output interval with month number from a symbol short month name" do
75
+ interval.of(:jan).to_s.should == '* * * 1 *'
76
+ end
77
+
78
+ it "should output interval with month number from a strong month name" do
79
+ interval.of('January').to_s.should == '* * * 1 *'
80
+ end
81
+
82
+ it "should output interval with comma seperated month numbers from array of symbol month names" do
83
+ interval.of(:january, :february, :march).to_s.should == '* * * 1,2,3 *'
84
+ end
85
+
86
+ it "should output interval with comma seperated month numbers from array of short symbol month names" do
87
+ interval.of(:jan, :feb, :mar).to_s.should == '* * * 1,2,3 *'
88
+ end
89
+
90
+ it "should output interval with comma seperated month numbers from array of string month names" do
91
+ interval.of('January', 'February', 'March').to_s.should == '* * * 1,2,3 *'
92
+ end
93
+ end
94
+
95
+ describe "days method" do
96
+ it "should output interval with day number from a symbol day name" do
97
+ interval.days(:monday).to_s.should == '* * * * 1'
98
+ end
99
+
100
+ it "should output interval with day number from a string day name" do
101
+ interval.days('Mondays').to_s.should == '* * * * 1'
102
+ end
103
+
104
+ it "should output interval with day number from a symbol short day name" do
105
+ interval.days(:mon).to_s.should == '* * * * 1'
106
+ end
107
+
108
+ it "should output interval with day numbers from array of symbol day names" do
109
+ interval.days(:monday, :wednesday, :friday).to_s.should == '* * * * 1,3,5'
110
+ end
111
+
112
+ it "should output interval with day numbers from array of symbol short day names" do
113
+ interval.days(:mon, :wed, :fri).to_s.should == '* * * * 1,3,5'
114
+ end
115
+
116
+ it "should output interval with day numbers from array of string day names" do
117
+ interval.days('Monday', 'Wednesday', 'Friday').to_s.should == '* * * * 1,3,5'
118
+ end
119
+ end
120
+
121
+ describe "hourly method" do
122
+ it "should output interval to run at start of every hour" do
123
+ interval.hourly.to_s.should == '0 * * * *'
124
+ end
125
+
126
+ it "should only affect the hour and minutes" do
127
+ interval.day = 1
128
+ interval.month = 1
129
+ interval.dow = 1
130
+ interval.hourly.to_s.should == '0 * 1 1 1'
131
+ end
132
+ end
133
+
134
+ describe "daily method" do
135
+ it "should output interval to run at 00:00 every day by default" do
136
+ interval.daily.to_s.should == '0 0 * * *'
137
+ end
138
+
139
+ it "should only affect the hour, minutes and day" do
140
+ interval.month = 1
141
+ interval.dow = 1
142
+ interval.daily.to_s.should == '0 0 * 1 1'
143
+ end
144
+
145
+ it "should preserve hour and minutes if set" do
146
+ interval.min = 10
147
+ interval.hour = 11
148
+ interval.daily.to_s.should == '10 11 * * *'
149
+ end
150
+ end
151
+
152
+ describe "weekly method" do
153
+ it "should output interval to run on Sunday at 00:00 by default" do
154
+ interval.weekly.to_s.should == '0 0 * * 0'
155
+ end
156
+
157
+ it "should override day of month and month" do
158
+ interval.day = 1
159
+ interval.month = 1
160
+ interval.weekly.to_s.should == '0 0 * * 0'
161
+ end
162
+
163
+ it "should preserve hour, minute and day of week if set" do
164
+ interval.min = 10
165
+ interval.hour = 11
166
+ interval.dow = 1
167
+ interval.daily.to_s.should == '10 11 * * 1'
168
+ end
169
+ end
170
+
171
+ describe "monthly method" do
172
+ it "should output interval to run on the 1st day of every month at 00:00 by default" do
173
+ interval.monthly.to_s.should == '0 0 1 * *'
174
+ end
175
+
176
+ it "should override day of month and month" do
177
+ interval.day = 1
178
+ interval.month = 1
179
+ interval.monthly.to_s.should == '0 0 1 * *'
180
+ end
181
+
182
+ it "should preserve hour, minute and day if set" do
183
+ interval.min = 10
184
+ interval.hour = 11
185
+ interval.day = 12
186
+ interval.monthly.to_s.should == '10 11 12 * *'
187
+ end
188
+ end
189
+
190
+ describe "weekends method" do
191
+ it "should output interval to run at 00:00 every Saturday and Sunday" do
192
+ interval.weekends.to_s.should == '0 0 * * 0,6'
193
+ end
194
+ end
195
+
196
+ describe "weekdays method" do
197
+ it "should output interval to run at 00:00 every day Monday to Friday" do
198
+ interval.weekdays.to_s.should == '0 0 * * 1-5'
199
+ end
200
+ end
201
+
202
+ describe "every(x).minutes" do
203
+ it "should output interval for list of minutes differing by arg value" do
204
+ interval.every(15).minutes.to_s.should == '0,15,30,45 * * * *'
205
+ end
206
+
207
+ it "should raise error if x not a divisor of 60" do
208
+ lambda { interval.every(13).minutes }.should raise_error
209
+ end
210
+ end
211
+
212
+ describe "every(x).hours" do
213
+ it "should output interval for 0 minute and list of hours differing by arg value" do
214
+ interval.every(6).hours.to_s.should == '0 0,6,12,18 * * *'
215
+ end
216
+
217
+ it "should raise error if x not a divisor of 24" do
218
+ lambda { interval.every(13).minutes }.should raise_error
219
+ end
220
+ end
221
+
222
+ describe "every(x).months" do
223
+ it "should output interval for 00:00 on 1st day of month and list of months differing by arg value" do
224
+ interval.every(6).hours.to_s.should == '0 0,6,12,18 * * *'
225
+ end
226
+
227
+ it "should raise error if x not a divisor of 12" do
228
+ lambda { interval.every(7).minutes }.should raise_error
229
+ end
230
+ end
231
+
232
+ describe "combinations" do
233
+ it "weekly.at(3.30) should output '30 3 * * 0'" do
234
+ interval.weekly.at(3.30).to_s.should == '30 3 * * 0'
235
+ end
236
+
237
+ it "monthly.at(3.30) should output '30 3 * * *'" do
238
+ interval.monthly.at(3.30).to_s.should == '30 3 1 * *'
239
+ end
240
+
241
+ it "monthly.on_the('15th').at(3.30) should output '30 3 15 * *'" do
242
+ interval.monthly.on_the('15th').at(3.30).to_s.should == '30 3 15 * *'
243
+ end
244
+
245
+ it "at('11pm').on_days(:monday, :tuesday) should output '0 11 * * 1,2'" do
246
+ interval.at('11pm').on_days(:monday, :tuesday).to_s.should == '0 23 * * 1,2'
247
+ end
248
+
249
+ it "on(15).of(:january) should output '* * 15 1 *'" do
250
+ interval.on(15).of(:january).to_s.should == '* * 15 1 *'
251
+ end
252
+
253
+ it "on(15, 16, 17).of(:january) should output '* * 15,16,17 1 *'" do
254
+ interval.on(15, 16, 17).of(:january).to_s.should == '* * 15,16,17 1 *'
255
+ end
256
+
257
+ it "on(15..17).of(:january) should output '* * 15-17 1 *'" do
258
+ interval.on(15..17).of(:january).to_s.should == '* * 15-17 1 *'
259
+ end
260
+
261
+ it "on(15, 16, 17).of(:january) should output '* * 15 1,6,12 *'" do
262
+ interval.on(15).of(:jan, :jun, :dec).to_s.should == '* * 15 1,6,12 *'
263
+ end
264
+
265
+ it "at('2.13pm').on_the_('15th').of(:january) should output '13 14 15 1'" do
266
+ interval.at('2.13pm').on_the(15).of(:january).to_s.should == '13 14 15 1 *'
267
+ end
268
+
269
+ it "every(15).minutes.on_the('15th').of(:january) should output '0,15,30,45 * 15 1 *'" do
270
+ interval.every(15).minutes.on_the('15th').of(:january).to_s.should == '0,15,30,45 * 15 1 *'
271
+ end
272
+ end
273
+
274
+ def interval
275
+ @interval ||= Cronos::Interval.new
276
+ end
277
+ end
@@ -0,0 +1,6 @@
1
+ $TESTING=true
2
+ $:.push File.join(File.dirname(__FILE__), '..', 'lib')
3
+
4
+ require 'rubygems'
5
+ require 'spec'
6
+ require 'cronos'
metadata ADDED
@@ -0,0 +1,62 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: adzap-cronos
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.1
5
+ platform: ruby
6
+ authors:
7
+ - Adam Meehan
8
+ autorequire: cronos
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-01-17 00:00:00 -08: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
+ files:
27
+ - LICENSE
28
+ - README.rdoc
29
+ - Rakefile
30
+ - TODO
31
+ - CHANGELOG
32
+ - lib/cronos.rb
33
+ - spec/spec_helper.rb
34
+ - spec/cronos_spec.rb
35
+ has_rdoc: true
36
+ homepage: http://github.com/adzap/cronos
37
+ post_install_message:
38
+ rdoc_options: []
39
+
40
+ require_paths:
41
+ - lib
42
+ required_ruby_version: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: "0"
47
+ version:
48
+ required_rubygems_version: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: "0"
53
+ version:
54
+ requirements: []
55
+
56
+ rubyforge_project:
57
+ rubygems_version: 1.2.0
58
+ signing_key:
59
+ specification_version: 2
60
+ summary: Tool for generating cron intervals using a natural syntax
61
+ test_files: []
62
+