cron_format 0.6.0 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/lib/cron_format.rb +99 -94
- data.tar.gz.sig +0 -0
- metadata +35 -34
- metadata.gz.sig +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 176722aed0424cfe698ec0bb9bc159a962a747e665b25ab4754101e078295248
|
4
|
+
data.tar.gz: e298aa75482b25335176e367f61fe9578fcca8c1539de5b0c0c8fa39dc88f580
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9ced118aab5b8e497844b1fc6e3978203ad3dc9849d33e5974cca00a5e4abe5512dff9314b0dbced73cab7c74eb6b008a6733e2da784b1f7472140800308a578
|
7
|
+
data.tar.gz: 9143586bcba2e3ab259a169e583c1733a72c24dc388c784287b256458800b75a6fbe1a4432df43beb84cc13a36aa8688cbdfa60bd3b42fb63156116a0510a56e
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/lib/cron_format.rb
CHANGED
@@ -19,68 +19,68 @@ class CronFormat
|
|
19
19
|
|
20
20
|
attr_reader :to_time, :to_expression
|
21
21
|
|
22
|
-
def initialize(cron_string, now=Time.now, debug: false)
|
23
|
-
|
22
|
+
def initialize(cron_string, now=Time.now, debug: false)
|
23
|
+
|
24
24
|
puts 'inside CronFormat'.info if debug
|
25
25
|
@cron_string, @now, @debug = cron_string, now, debug
|
26
26
|
@to_time = @now
|
27
27
|
parse()
|
28
|
-
|
28
|
+
|
29
29
|
end
|
30
|
-
|
31
|
-
# supply a Time object. Modifying the date can be helpful when
|
32
|
-
# triggering a day before an actual expression date e.g. the day
|
30
|
+
|
31
|
+
# supply a Time object. Modifying the date can be helpful when
|
32
|
+
# triggering a day before an actual expression date e.g. the day
|
33
33
|
# before the last sunday in March (British summer time).
|
34
34
|
#
|
35
35
|
def adjust_date(d)
|
36
|
-
|
36
|
+
|
37
37
|
@to_time = d
|
38
38
|
m, h, dd, mm, yy = @to_expression.split
|
39
|
-
|
39
|
+
|
40
40
|
day = dd =~ /^\d+$/ ? d.day : dd
|
41
41
|
month = mm =~ /^\d+$/ ? d.month : mm
|
42
42
|
year = yy =~ /^\d+$/ ? d.year : yy
|
43
|
-
|
43
|
+
|
44
44
|
@to_expression = [m, h, day, month, year].join(' ')
|
45
|
-
|
45
|
+
|
46
46
|
end
|
47
|
-
|
47
|
+
|
48
48
|
def next()
|
49
|
-
|
49
|
+
|
50
50
|
nudge() #unless @cron_string =~ %r{/}
|
51
51
|
#puts ':to_time : ' + @to_time.inspect
|
52
52
|
parse(nudged: true)
|
53
53
|
end
|
54
|
-
|
55
|
-
private
|
56
|
-
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
57
|
def nudge()
|
58
58
|
|
59
59
|
t1 = @to_time
|
60
60
|
puts ('t1: ' + t1.inspect).debug if @debug
|
61
61
|
a = @cron_string.split
|
62
|
-
|
62
|
+
|
63
63
|
val = if @cron_string =~ %r{[/,-]} then
|
64
64
|
a.reverse.detect{|x| x[/[\/,-]/]}
|
65
65
|
else
|
66
66
|
a[1..-1].detect{|x| x != '*'}
|
67
67
|
end
|
68
|
-
|
68
|
+
|
69
69
|
index, n = 0, 1
|
70
|
-
|
70
|
+
|
71
71
|
puts ('val: ' + val.inspect).debug if @debug
|
72
72
|
|
73
73
|
if val then
|
74
74
|
index = a.index(val)
|
75
75
|
|
76
|
-
r = val[/,|\/(\d+)$/,1]
|
76
|
+
r = val[/,|\/(\d+)$/,1]
|
77
77
|
|
78
78
|
n = if r then
|
79
|
-
|
79
|
+
|
80
80
|
index == 4 ? r.to_i * 7 : 0
|
81
|
-
|
81
|
+
|
82
82
|
else
|
83
|
-
|
83
|
+
|
84
84
|
if val =~ /[,-]/ then
|
85
85
|
1
|
86
86
|
else
|
@@ -90,7 +90,7 @@ class CronFormat
|
|
90
90
|
end
|
91
91
|
|
92
92
|
puts ('index: ' + index.inspect).debug if @debug
|
93
|
-
|
93
|
+
|
94
94
|
month_proc = lambda {|t1,n|
|
95
95
|
a = t1.to_a
|
96
96
|
a[4] = a[4] + n <= 12 ? a[4] + n : a[4] + n - 12
|
@@ -102,97 +102,97 @@ class CronFormat
|
|
102
102
|
day_proc = lambda {|x,n| x + n * DAY}
|
103
103
|
|
104
104
|
units = [
|
105
|
-
lambda {|x,n| x + n * MINUTE},
|
106
|
-
lambda {|x,n| x + n * HOUR},
|
107
|
-
day_proc,
|
105
|
+
lambda {|x,n| x + n * MINUTE},
|
106
|
+
lambda {|x,n| x + n * HOUR},
|
107
|
+
day_proc,
|
108
108
|
month_proc,
|
109
109
|
day_proc
|
110
110
|
]
|
111
|
-
|
111
|
+
|
112
112
|
if @debug then
|
113
113
|
puts ('@to_time: ' + @to_time.inspect).debug
|
114
114
|
puts ('n: ' + n.inspect).debug
|
115
115
|
end
|
116
|
-
|
116
|
+
|
117
117
|
r = units[index].call @to_time, n
|
118
|
-
|
118
|
+
|
119
119
|
puts ('r: ' + r.inspect).debug if @debug
|
120
|
-
|
120
|
+
|
121
121
|
@to_time = if n > 1 then
|
122
|
-
|
123
|
-
# given day light savings, ensure the time fragment is preserved
|
122
|
+
|
123
|
+
# given day light savings, ensure the time fragment is preserved
|
124
124
|
Time.new(r.year, r.month, r.day, t1.hour, t1.min)
|
125
|
-
|
125
|
+
|
126
126
|
else
|
127
127
|
r
|
128
128
|
end
|
129
129
|
#r += MINUTE if r == t1
|
130
130
|
|
131
|
-
end
|
132
|
-
|
131
|
+
end
|
132
|
+
|
133
133
|
def parse(nudged: false)
|
134
|
-
|
134
|
+
|
135
135
|
puts ('0. @to_time: ' + @to_time.inspect).debug if @debug
|
136
136
|
|
137
137
|
raw_a = @cron_string.split
|
138
138
|
raw_a << '*' if raw_a.length <= 5 # add the year?
|
139
139
|
mins, hours, day, month, wday, year = raw_a[0..5]
|
140
|
-
|
140
|
+
|
141
141
|
if day[/\d+/] and month[/\d+/] and year == '*' then
|
142
142
|
@to_time += DAY until @to_time.day == day.to_i and \
|
143
143
|
@to_time.month == month.to_i
|
144
144
|
end
|
145
|
-
|
145
|
+
|
146
146
|
puts ('1. @to_time: ' + @to_time.inspect).debug if @debug
|
147
|
-
|
147
|
+
|
148
148
|
#
|
149
|
-
|
149
|
+
|
150
150
|
if @debug then
|
151
|
-
puts ('1.5 @to_time: ' + @to_time.inspect).debug
|
151
|
+
puts ('1.5 @to_time: ' + @to_time.inspect).debug
|
152
152
|
puts ('hours: ' + hours.inspect).debug
|
153
153
|
puts ('mins: ' + mins.inspect).debug
|
154
154
|
end
|
155
|
-
|
155
|
+
|
156
156
|
if mins[/^\d+$/] and hours[/^\d+$/] then
|
157
157
|
|
158
158
|
if @to_time.to_date != @now.to_date then
|
159
159
|
@to_time = Time.local(@to_time.year, @to_time.month, @to_time.day)
|
160
160
|
end
|
161
|
-
|
161
|
+
|
162
162
|
until (@to_time.min == mins.to_i and @to_time.hour == hours.to_i) \
|
163
163
|
or (@to_time - 1).isdst != @to_time.isdst do
|
164
|
-
|
164
|
+
|
165
165
|
puts ('1.7 @to_time: ' + @to_time.inspect).debug if @debug
|
166
166
|
@to_time += MINUTE
|
167
167
|
end
|
168
168
|
@to_time -= MINUTE
|
169
169
|
else
|
170
|
-
|
170
|
+
|
171
171
|
if mins[/^\d+$/] then
|
172
|
-
@to_time += MINUTE until @to_time.min == mins.to_i
|
172
|
+
@to_time += MINUTE until @to_time.min == mins.to_i
|
173
173
|
@to_time -= MINUTE
|
174
174
|
end
|
175
|
-
|
175
|
+
|
176
176
|
@to_time += HOUR until @to_time.hour == hours.to_i if hours[/^\d+$/]
|
177
177
|
end
|
178
178
|
|
179
|
-
puts ('2. @to_time: ' + @to_time.inspect).debug if @debug
|
180
|
-
|
179
|
+
puts ('2. @to_time: ' + @to_time.inspect).debug if @debug
|
180
|
+
|
181
181
|
if wday[/^[0-6]$/] and @to_time.wday != wday.to_i then
|
182
182
|
@to_time += DAY until @to_time.wday == wday.to_i
|
183
183
|
end
|
184
|
-
|
184
|
+
|
185
185
|
dayceiling = raw_a[2][/-(\d+)$/,1]
|
186
|
-
|
186
|
+
|
187
187
|
if dayceiling and dayceiling.to_i <= @to_time.day then
|
188
188
|
|
189
189
|
dt2 = @to_time.to_datetime
|
190
190
|
next_month = dt2.next_month.month
|
191
191
|
dt2 += 1 until dt2.month == next_month
|
192
192
|
|
193
|
-
@to_time = dt2.to_time
|
193
|
+
@to_time = dt2.to_time
|
194
194
|
end
|
195
|
-
|
195
|
+
|
196
196
|
puts ('3. @to_time: ' + @to_time.inspect).debug if @debug
|
197
197
|
|
198
198
|
units = @to_time.to_a.values_at(1..4) + [nil, @to_time.year]
|
@@ -200,13 +200,13 @@ class CronFormat
|
|
200
200
|
procs = {
|
201
201
|
min: lambda {|x, interval| x += (interval * MINUTE).to_i},
|
202
202
|
hour: lambda {|x, interval| x += (interval * HOUR).to_i},
|
203
|
-
day: lambda {|x, interval| x += (interval * DAY).to_i},
|
204
|
-
month: lambda {|x, interval|
|
203
|
+
day: lambda {|x, interval| x += (interval * DAY).to_i},
|
204
|
+
month: lambda {|x, interval|
|
205
205
|
date = x.to_a.values_at(1..5)
|
206
206
|
interval.times { date[3].succ! }
|
207
207
|
Time.parse(TF % date.reverse)},
|
208
|
-
week: lambda {|x, interval| x += (interval * WEEK).to_i},
|
209
|
-
year: lambda {|x, interval|
|
208
|
+
week: lambda {|x, interval| x += (interval * WEEK).to_i},
|
209
|
+
year: lambda {|x, interval|
|
210
210
|
date = x.to_a.values_at(1..5)
|
211
211
|
interval.times { date[4].succ! }
|
212
212
|
Time.parse(TF % date.reverse)}
|
@@ -225,35 +225,35 @@ class CronFormat
|
|
225
225
|
end
|
226
226
|
|
227
227
|
end
|
228
|
-
|
228
|
+
|
229
229
|
# take any repeater out of the unit value
|
230
230
|
raw_units, repeaters = [], []
|
231
|
-
|
232
|
-
raw_a.each do |x|
|
231
|
+
|
232
|
+
raw_a.each do |x|
|
233
233
|
v1, v2 = x.split('/')
|
234
234
|
raw_units << v1
|
235
235
|
repeaters << v2
|
236
236
|
end
|
237
|
-
|
238
|
-
|
237
|
+
|
238
|
+
|
239
239
|
if raw_a[4] != '*' then
|
240
|
-
r = /(sun|mon|tues|wed|thurs|fri|satur|sun)(day)?|tue|thu|sat/i
|
240
|
+
r = /(sun|mon|tues|wed|thurs|fri|satur|sun)(day)?|tue|thu|sat/i
|
241
241
|
|
242
242
|
to_i = lambda {|x|
|
243
243
|
a = Date::DAYNAMES
|
244
244
|
a.index a.grep(/#{x}/i).first
|
245
245
|
}
|
246
246
|
raw_a[4].gsub!(r,&to_i)
|
247
|
-
raw_units[4].gsub!(r,&to_i)
|
247
|
+
raw_units[4].gsub!(r,&to_i)
|
248
248
|
end
|
249
|
-
|
250
|
-
@to_expression = raw_a[0..4].join ' '
|
249
|
+
|
250
|
+
@to_expression = raw_a[0..4].join ' '
|
251
251
|
|
252
252
|
raw_date = raw_units.map.with_index {|x,i| dt[i].call(x) }
|
253
253
|
|
254
254
|
# expand the repeater
|
255
255
|
|
256
|
-
ceil = {min: MINUTE, hour: 23, day: 31, month: 12}.values
|
256
|
+
ceil = {min: MINUTE, hour: 23, day: 31, month: 12}.values
|
257
257
|
|
258
258
|
if repeaters.any? then
|
259
259
|
repeaters.each_with_index do |x,i|
|
@@ -261,14 +261,14 @@ class CronFormat
|
|
261
261
|
next if i == 4
|
262
262
|
|
263
263
|
if x and not raw_a[i][/^\*/] then
|
264
|
-
raw_date[i] = raw_date[i].map {|y|
|
264
|
+
raw_date[i] = raw_date[i].map {|y|
|
265
265
|
(y.to_i...ceil[i]).step(x.to_i).to_a.map(&:to_s)
|
266
266
|
}.flatten
|
267
|
-
else
|
267
|
+
else
|
268
268
|
raw_date[i]
|
269
|
-
end
|
269
|
+
end
|
270
270
|
end
|
271
|
-
end
|
271
|
+
end
|
272
272
|
|
273
273
|
dates = inflate(raw_date)
|
274
274
|
|
@@ -281,23 +281,23 @@ class CronFormat
|
|
281
281
|
d << year
|
282
282
|
|
283
283
|
next unless day_valid? d.reverse.take 3
|
284
|
-
t = Time.parse(TF % d.reverse)
|
285
|
-
# if there is a defined weekday, increment a day at
|
284
|
+
t = Time.parse(TF % d.reverse)
|
285
|
+
# if there is a defined weekday, increment a day at
|
286
286
|
# a time to match that weekday
|
287
287
|
if wday and wday != t.wday then
|
288
|
-
|
289
|
-
t = Time.parse(TF % d.reverse)
|
288
|
+
|
289
|
+
t = Time.parse(TF % d.reverse)
|
290
290
|
|
291
291
|
if repeaters[4] then
|
292
292
|
t += repeaters[4].to_i * WEEK while t < @to_time
|
293
293
|
else
|
294
|
-
d[2], d[3] = @to_time.to_a.values_at(3,4).map(&:to_s)
|
295
|
-
t += DAY until t.wday == wday.to_i
|
294
|
+
d[2], d[3] = @to_time.to_a.values_at(3,4).map(&:to_s)
|
295
|
+
t += DAY until t.wday == wday.to_i
|
296
296
|
end
|
297
|
-
|
297
|
+
|
298
298
|
end
|
299
|
-
|
300
|
-
# increment the month, day, hour, and minute for
|
299
|
+
|
300
|
+
# increment the month, day, hour, and minute for
|
301
301
|
# expressions which match '* * * *' consecutively
|
302
302
|
i = 3
|
303
303
|
|
@@ -308,14 +308,14 @@ class CronFormat
|
|
308
308
|
i -= 1
|
309
309
|
end
|
310
310
|
|
311
|
-
# starting from the biggest unit, attempt to increment that
|
311
|
+
# starting from the biggest unit, attempt to increment that
|
312
312
|
# unit where it is equal to '*'
|
313
313
|
|
314
314
|
if @debug then
|
315
315
|
puts ('t: ' + t.inspect).debug
|
316
316
|
puts ('@to_time: ' + @to_time.inspect).debug
|
317
317
|
end
|
318
|
-
|
318
|
+
|
319
319
|
if t < @to_time then
|
320
320
|
|
321
321
|
if t.month < @to_time.month and raw_a[4] == '*' then
|
@@ -353,12 +353,12 @@ class CronFormat
|
|
353
353
|
t = procs.values[i].call(t, repeaters[i].to_i) if repeaters[i]
|
354
354
|
elsif raw_a[3] == '*' then
|
355
355
|
|
356
|
-
t = increment_month d
|
357
|
-
end
|
356
|
+
t = increment_month d
|
357
|
+
end
|
358
358
|
|
359
359
|
end
|
360
360
|
|
361
|
-
# after the units have been incremented we need to
|
361
|
+
# after the units have been incremented we need to
|
362
362
|
# increment the weekday again if need be
|
363
363
|
if wday then
|
364
364
|
|
@@ -371,6 +371,11 @@ class CronFormat
|
|
371
371
|
|
372
372
|
end
|
373
373
|
|
374
|
+
if @debug then
|
375
|
+
puts ('2. t: ' + t.inspect).debug
|
376
|
+
puts ('2. @to_time: ' + @to_time.inspect).debug
|
377
|
+
end
|
378
|
+
|
374
379
|
# finally, if the date is still less than the current time we can
|
375
380
|
# increment the date using any repeating intervals
|
376
381
|
if (t < @to_time or (!nudged and t == @to_time)) and repeaters.any? then
|
@@ -383,35 +388,35 @@ class CronFormat
|
|
383
388
|
end
|
384
389
|
end
|
385
390
|
|
386
|
-
t
|
391
|
+
t
|
387
392
|
end
|
388
|
-
|
393
|
+
|
389
394
|
puts ('a: ' + a.inspect).debug if @debug
|
390
395
|
|
391
396
|
@to_time = a.compact.min
|
392
397
|
end
|
393
|
-
|
398
|
+
|
394
399
|
def day_valid?(date)
|
395
400
|
|
396
401
|
year, month, day = date
|
397
|
-
last_day = DateTime.parse("%s-%s-%s" % [year,
|
402
|
+
last_day = DateTime.parse("%s-%s-%s" % [year,
|
398
403
|
(month.to_i < 12 ? month.succ : 1), 1]) - 1
|
399
404
|
day.to_i <= last_day.day
|
400
|
-
end
|
405
|
+
end
|
401
406
|
|
402
407
|
def increment_month(d)
|
403
|
-
|
408
|
+
|
404
409
|
puts 'inside increment_month' if @debug
|
405
410
|
|
406
411
|
if d[3].to_i <= 11 then
|
407
412
|
d[3].succ!
|
408
|
-
else
|
413
|
+
else
|
409
414
|
d[3] = '1'
|
410
415
|
d[4].succ!
|
411
416
|
end
|
412
417
|
|
413
418
|
Time.parse(TF % d.reverse)
|
414
|
-
end
|
419
|
+
end
|
415
420
|
|
416
421
|
def inflate(raw_a)
|
417
422
|
|
@@ -421,5 +426,5 @@ class CronFormat
|
|
421
426
|
a.map{|x| x.length <= 1 ? x.first : x.shift}
|
422
427
|
end
|
423
428
|
end
|
424
|
-
|
429
|
+
|
425
430
|
end
|
data.tar.gz.sig
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cron_format
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Robertson
|
@@ -11,54 +11,54 @@ cert_chain:
|
|
11
11
|
- |
|
12
12
|
-----BEGIN CERTIFICATE-----
|
13
13
|
MIIEXjCCAsagAwIBAgIBATANBgkqhkiG9w0BAQsFADAsMSowKAYDVQQDDCFnZW1t
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
14
|
+
YXN0ZXIvREM9amFtZXNyb2JlcnRzb24vREM9ZXUwHhcNMjIwMjAyMTM1NDI2WhcN
|
15
|
+
MjMwMjAyMTM1NDI2WjAsMSowKAYDVQQDDCFnZW1tYXN0ZXIvREM9amFtZXNyb2Jl
|
16
|
+
cnRzb24vREM9ZXUwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQDaqxbw
|
17
|
+
i8z4aBfUw7+JhsnZcVYu1jFVmXO63cYZ1G7VZ1mvBcDKmvdV/C1KsmvJwd/OF6Hw
|
18
|
+
CSypZVJP0RA37xnaKYP18uwhJZv8lQfjasdDe/4C4ZddH7P1QP3VP4WnzOf3Ve5F
|
19
|
+
cmTShT54uQfizdwRv2mG842hdyoX1DdaLZSA8adeMod/BJtkfSMVJjl971zO6o48
|
20
|
+
d7iWIYmYuZ6cNTv9iP3LbNwgqC7+zn/THw957Yck5yzGWAZu/ShxmlXFYU04V789
|
21
|
+
++poeo7tNfvXmUcFdgOIOpLdy33ledbtMBM7MCUvX8KGn+CePyUfljcY/9nyGk7l
|
22
|
+
YRJ3P4bizbp3x9TKDShGxkSvZn28eJEjhq1sMzlB4JrrFlFVq9hDuasE3dkHVE30
|
23
|
+
KcO/vPbSs2LC2DQsrGeTSIye1S84pClYQtSAtlGqWczTz/6MWENwHwWI2vdnUdug
|
24
|
+
wZXBZeSpej/Dife8z0lL+JY+KN93pBtI4jqlij1OwlvUzJzDkqQKRCKkIisCAwEA
|
25
|
+
AaOBijCBhzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUsNZCEbjl
|
26
|
+
+Uq/N/Syy8npoZaD1+wwJgYDVR0RBB8wHYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0
|
27
27
|
c29uLmV1MCYGA1UdEgQfMB2BG2dlbW1hc3RlckBqYW1lc3JvYmVydHNvbi5ldTAN
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
28
|
+
BgkqhkiG9w0BAQsFAAOCAYEAtBIY++5WxMTzCHiXGZK4dRJCNdRAkbmqm0fjJN1R
|
29
|
+
UYWdiFaxL7MHeAIfvHsak0h6LI3MPAQLaWkAyJ8L1ZLJIVRSvv0bx8fbLhBtN/FC
|
30
|
+
D0yfZMg72qhlRcsxzCVnG6wRQ5kluc4qhuNIKBYkOJ0WDPwzGDAZxyJ4yXHCLcRQ
|
31
|
+
OWJBYG8t1DmTKleEcp3CXAekJdO6l7Wi4cM7bYWQUCTxlOZa2D25YTvfqOpsk+EH
|
32
|
+
or4fMXtXEDQxaKx2wMkSBVy/rWBhyPg710+V/DEFeQ+hGhB9d99At57YF9D3y3+q
|
33
|
+
csZWukFdHN+hy4SdISkg8n8cWqcAwCwGqxF4xyxmVd0Ky7yO5qBmFAdNOkOfrB7+
|
34
|
+
ghwxte8R5fbBMm8cewDXZOQHxKxWGZRNdugo6RlR7qHdT4EB8/7quJkQtJq2wee7
|
35
|
+
IOc1Uet1LzHGtt67bFCbybnKiPeMGwdnC9KZwboHDQvntyk7WUSQuufvMrxo8AYF
|
36
|
+
I/8uxBZWY2iH3RgPYs9wlzDv
|
37
37
|
-----END CERTIFICATE-----
|
38
|
-
date:
|
38
|
+
date: 2022-02-02 00:00:00.000000000 Z
|
39
39
|
dependencies:
|
40
40
|
- !ruby/object:Gem::Dependency
|
41
41
|
name: c32
|
42
42
|
requirement: !ruby/object:Gem::Requirement
|
43
43
|
requirements:
|
44
|
-
- - "~>"
|
45
|
-
- !ruby/object:Gem::Version
|
46
|
-
version: '0.1'
|
47
44
|
- - ">="
|
48
45
|
- !ruby/object:Gem::Version
|
49
|
-
version: 0.
|
46
|
+
version: 0.3.0
|
47
|
+
- - "~>"
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
version: '0.3'
|
50
50
|
type: :runtime
|
51
51
|
prerelease: false
|
52
52
|
version_requirements: !ruby/object:Gem::Requirement
|
53
53
|
requirements:
|
54
|
-
- - "~>"
|
55
|
-
- !ruby/object:Gem::Version
|
56
|
-
version: '0.1'
|
57
54
|
- - ">="
|
58
55
|
- !ruby/object:Gem::Version
|
59
|
-
version: 0.
|
56
|
+
version: 0.3.0
|
57
|
+
- - "~>"
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
version: '0.3'
|
60
60
|
description:
|
61
|
-
email:
|
61
|
+
email: digital.robertson@gmail.com
|
62
62
|
executables: []
|
63
63
|
extensions: []
|
64
64
|
extra_rdoc_files: []
|
@@ -83,7 +83,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
83
83
|
- !ruby/object:Gem::Version
|
84
84
|
version: '0'
|
85
85
|
requirements: []
|
86
|
-
|
86
|
+
rubyforge_project:
|
87
|
+
rubygems_version: 2.7.10
|
87
88
|
signing_key:
|
88
89
|
specification_version: 4
|
89
90
|
summary: Accepts a cron expression and outputs the relative time (e.g. 0 7 1 1 * *
|
metadata.gz.sig
CHANGED
@@ -1 +1,2 @@
|
|
1
|
-
|
1
|
+
�*�ԜХ9��p���#����G��4WO�U��X��\!w:�O������QuZ3"�U ��ё���\)��� ��M[�١�'՟φjK��e�N���Ț�rqW�nޚ��֠��Lu_�-b,�R(����^uw1i��n(�FQ� ��kXV�ep̫��B���GT�c&c��Xd'���gX��U)��s(9�/��� �L���
|
2
|
+
6�l�s1ْ��̹&w�!G��͕����tqR�V3.]�Zqzуx���l?c�(��l&��'ԙ�e�*$�� ��5p�tƯp��ClN��(Cg��8�&�F�'
|