cron_format 0.6.0 → 0.7.0
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.
- 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�'
|