adzap-cronos 0.2.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 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
+