cron_format 0.3.5 → 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 +5 -5
- checksums.yaml.gz.sig +0 -0
- data/lib/cron_format.rb +147 -80
- data.tar.gz.sig +4 -1
- metadata +51 -25
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
2
|
+
SHA256:
|
|
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
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
require 'date'
|
|
6
6
|
require 'time'
|
|
7
|
+
require 'c32'
|
|
7
8
|
|
|
8
9
|
|
|
9
10
|
MINUTE = 60
|
|
@@ -14,64 +15,72 @@ TF = "%s-%s-%s %s:%s"
|
|
|
14
15
|
|
|
15
16
|
|
|
16
17
|
class CronFormat
|
|
18
|
+
using ColouredText
|
|
17
19
|
|
|
18
20
|
attr_reader :to_time, :to_expression
|
|
19
21
|
|
|
20
|
-
def initialize(cron_string, now=Time.now)
|
|
21
|
-
|
|
22
|
+
def initialize(cron_string, now=Time.now, debug: false)
|
|
23
|
+
|
|
24
|
+
puts 'inside CronFormat'.info if debug
|
|
25
|
+
@cron_string, @now, @debug = cron_string, now, debug
|
|
26
|
+
@to_time = @now
|
|
22
27
|
parse()
|
|
28
|
+
|
|
23
29
|
end
|
|
24
|
-
|
|
25
|
-
# supply a Time object. Modifying the date can be helpful when
|
|
26
|
-
# 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
|
|
27
33
|
# before the last sunday in March (British summer time).
|
|
28
34
|
#
|
|
29
35
|
def adjust_date(d)
|
|
30
|
-
|
|
36
|
+
|
|
31
37
|
@to_time = d
|
|
32
38
|
m, h, dd, mm, yy = @to_expression.split
|
|
33
|
-
|
|
39
|
+
|
|
34
40
|
day = dd =~ /^\d+$/ ? d.day : dd
|
|
35
41
|
month = mm =~ /^\d+$/ ? d.month : mm
|
|
36
42
|
year = yy =~ /^\d+$/ ? d.year : yy
|
|
37
|
-
|
|
43
|
+
|
|
38
44
|
@to_expression = [m, h, day, month, year].join(' ')
|
|
39
|
-
|
|
45
|
+
|
|
40
46
|
end
|
|
41
|
-
|
|
47
|
+
|
|
42
48
|
def next()
|
|
43
|
-
|
|
49
|
+
|
|
44
50
|
nudge() #unless @cron_string =~ %r{/}
|
|
45
51
|
#puts ':to_time : ' + @to_time.inspect
|
|
46
|
-
parse()
|
|
52
|
+
parse(nudged: true)
|
|
47
53
|
end
|
|
48
|
-
|
|
49
|
-
private
|
|
50
|
-
|
|
54
|
+
|
|
55
|
+
private
|
|
56
|
+
|
|
51
57
|
def nudge()
|
|
52
58
|
|
|
53
59
|
t1 = @to_time
|
|
60
|
+
puts ('t1: ' + t1.inspect).debug if @debug
|
|
54
61
|
a = @cron_string.split
|
|
55
|
-
|
|
62
|
+
|
|
56
63
|
val = if @cron_string =~ %r{[/,-]} then
|
|
57
64
|
a.reverse.detect{|x| x[/[\/,-]/]}
|
|
58
65
|
else
|
|
59
66
|
a[1..-1].detect{|x| x != '*'}
|
|
60
67
|
end
|
|
61
|
-
|
|
68
|
+
|
|
62
69
|
index, n = 0, 1
|
|
63
70
|
|
|
71
|
+
puts ('val: ' + val.inspect).debug if @debug
|
|
72
|
+
|
|
64
73
|
if val then
|
|
65
74
|
index = a.index(val)
|
|
66
75
|
|
|
67
|
-
r = val[/,|\/(\d+)$/,1]
|
|
76
|
+
r = val[/,|\/(\d+)$/,1]
|
|
68
77
|
|
|
69
78
|
n = if r then
|
|
70
|
-
|
|
79
|
+
|
|
71
80
|
index == 4 ? r.to_i * 7 : 0
|
|
72
|
-
|
|
81
|
+
|
|
73
82
|
else
|
|
74
|
-
|
|
83
|
+
|
|
75
84
|
if val =~ /[,-]/ then
|
|
76
85
|
1
|
|
77
86
|
else
|
|
@@ -80,6 +89,7 @@ class CronFormat
|
|
|
80
89
|
end
|
|
81
90
|
end
|
|
82
91
|
|
|
92
|
+
puts ('index: ' + index.inspect).debug if @debug
|
|
83
93
|
|
|
84
94
|
month_proc = lambda {|t1,n|
|
|
85
95
|
a = t1.to_a
|
|
@@ -92,72 +102,111 @@ class CronFormat
|
|
|
92
102
|
day_proc = lambda {|x,n| x + n * DAY}
|
|
93
103
|
|
|
94
104
|
units = [
|
|
95
|
-
lambda {|x,n| x + n * MINUTE},
|
|
96
|
-
lambda {|x,n| x + n * HOUR},
|
|
97
|
-
day_proc,
|
|
105
|
+
lambda {|x,n| x + n * MINUTE},
|
|
106
|
+
lambda {|x,n| x + n * HOUR},
|
|
107
|
+
day_proc,
|
|
98
108
|
month_proc,
|
|
99
109
|
day_proc
|
|
100
110
|
]
|
|
101
111
|
|
|
112
|
+
if @debug then
|
|
113
|
+
puts ('@to_time: ' + @to_time.inspect).debug
|
|
114
|
+
puts ('n: ' + n.inspect).debug
|
|
115
|
+
end
|
|
116
|
+
|
|
102
117
|
r = units[index].call @to_time, n
|
|
118
|
+
|
|
119
|
+
puts ('r: ' + r.inspect).debug if @debug
|
|
120
|
+
|
|
121
|
+
@to_time = if n > 1 then
|
|
122
|
+
|
|
123
|
+
# given day light savings, ensure the time fragment is preserved
|
|
124
|
+
Time.new(r.year, r.month, r.day, t1.hour, t1.min)
|
|
125
|
+
|
|
126
|
+
else
|
|
127
|
+
r
|
|
128
|
+
end
|
|
103
129
|
#r += MINUTE if r == t1
|
|
104
130
|
|
|
105
|
-
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def parse(nudged: false)
|
|
106
134
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
def parse()
|
|
135
|
+
puts ('0. @to_time: ' + @to_time.inspect).debug if @debug
|
|
110
136
|
|
|
111
137
|
raw_a = @cron_string.split
|
|
112
138
|
raw_a << '*' if raw_a.length <= 5 # add the year?
|
|
113
139
|
mins, hours, day, month, wday, year = raw_a[0..5]
|
|
114
|
-
|
|
140
|
+
|
|
115
141
|
if day[/\d+/] and month[/\d+/] and year == '*' then
|
|
116
142
|
@to_time += DAY until @to_time.day == day.to_i and \
|
|
117
143
|
@to_time.month == month.to_i
|
|
118
144
|
end
|
|
119
|
-
|
|
145
|
+
|
|
146
|
+
puts ('1. @to_time: ' + @to_time.inspect).debug if @debug
|
|
147
|
+
|
|
148
|
+
#
|
|
149
|
+
|
|
150
|
+
if @debug then
|
|
151
|
+
puts ('1.5 @to_time: ' + @to_time.inspect).debug
|
|
152
|
+
puts ('hours: ' + hours.inspect).debug
|
|
153
|
+
puts ('mins: ' + mins.inspect).debug
|
|
154
|
+
end
|
|
155
|
+
|
|
120
156
|
if mins[/^\d+$/] and hours[/^\d+$/] then
|
|
121
|
-
|
|
122
|
-
|
|
157
|
+
|
|
158
|
+
if @to_time.to_date != @now.to_date then
|
|
159
|
+
@to_time = Time.local(@to_time.year, @to_time.month, @to_time.day)
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
until (@to_time.min == mins.to_i and @to_time.hour == hours.to_i) \
|
|
163
|
+
or (@to_time - 1).isdst != @to_time.isdst do
|
|
164
|
+
|
|
165
|
+
puts ('1.7 @to_time: ' + @to_time.inspect).debug if @debug
|
|
166
|
+
@to_time += MINUTE
|
|
167
|
+
end
|
|
123
168
|
@to_time -= MINUTE
|
|
124
169
|
else
|
|
125
|
-
|
|
170
|
+
|
|
126
171
|
if mins[/^\d+$/] then
|
|
127
|
-
@to_time += MINUTE until @to_time.min == mins.to_i
|
|
172
|
+
@to_time += MINUTE until @to_time.min == mins.to_i
|
|
128
173
|
@to_time -= MINUTE
|
|
129
174
|
end
|
|
130
|
-
|
|
175
|
+
|
|
131
176
|
@to_time += HOUR until @to_time.hour == hours.to_i if hours[/^\d+$/]
|
|
132
|
-
end
|
|
133
|
-
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
puts ('2. @to_time: ' + @to_time.inspect).debug if @debug
|
|
180
|
+
|
|
134
181
|
if wday[/^[0-6]$/] and @to_time.wday != wday.to_i then
|
|
135
182
|
@to_time += DAY until @to_time.wday == wday.to_i
|
|
136
183
|
end
|
|
137
|
-
|
|
184
|
+
|
|
138
185
|
dayceiling = raw_a[2][/-(\d+)$/,1]
|
|
139
|
-
|
|
186
|
+
|
|
140
187
|
if dayceiling and dayceiling.to_i <= @to_time.day then
|
|
141
188
|
|
|
142
189
|
dt2 = @to_time.to_datetime
|
|
143
190
|
next_month = dt2.next_month.month
|
|
144
191
|
dt2 += 1 until dt2.month == next_month
|
|
145
192
|
|
|
146
|
-
@to_time = dt2.to_time
|
|
193
|
+
@to_time = dt2.to_time
|
|
147
194
|
end
|
|
148
195
|
|
|
196
|
+
puts ('3. @to_time: ' + @to_time.inspect).debug if @debug
|
|
197
|
+
|
|
149
198
|
units = @to_time.to_a.values_at(1..4) + [nil, @to_time.year]
|
|
150
199
|
|
|
151
200
|
procs = {
|
|
152
201
|
min: lambda {|x, interval| x += (interval * MINUTE).to_i},
|
|
153
202
|
hour: lambda {|x, interval| x += (interval * HOUR).to_i},
|
|
154
|
-
day: lambda {|x, interval| x += (interval * DAY).to_i},
|
|
155
|
-
month: lambda {|x, interval|
|
|
203
|
+
day: lambda {|x, interval| x += (interval * DAY).to_i},
|
|
204
|
+
month: lambda {|x, interval|
|
|
156
205
|
date = x.to_a.values_at(1..5)
|
|
157
206
|
interval.times { date[3].succ! }
|
|
158
207
|
Time.parse(TF % date.reverse)},
|
|
159
|
-
week: lambda {|x, interval| x += (interval * WEEK).to_i},
|
|
160
|
-
year: lambda {|x, interval|
|
|
208
|
+
week: lambda {|x, interval| x += (interval * WEEK).to_i},
|
|
209
|
+
year: lambda {|x, interval|
|
|
161
210
|
date = x.to_a.values_at(1..5)
|
|
162
211
|
interval.times { date[4].succ! }
|
|
163
212
|
Time.parse(TF % date.reverse)}
|
|
@@ -176,35 +225,35 @@ class CronFormat
|
|
|
176
225
|
end
|
|
177
226
|
|
|
178
227
|
end
|
|
179
|
-
|
|
228
|
+
|
|
180
229
|
# take any repeater out of the unit value
|
|
181
230
|
raw_units, repeaters = [], []
|
|
182
|
-
|
|
183
|
-
raw_a.each do |x|
|
|
231
|
+
|
|
232
|
+
raw_a.each do |x|
|
|
184
233
|
v1, v2 = x.split('/')
|
|
185
234
|
raw_units << v1
|
|
186
235
|
repeaters << v2
|
|
187
236
|
end
|
|
188
|
-
|
|
189
|
-
|
|
237
|
+
|
|
238
|
+
|
|
190
239
|
if raw_a[4] != '*' then
|
|
191
|
-
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
|
|
192
241
|
|
|
193
242
|
to_i = lambda {|x|
|
|
194
243
|
a = Date::DAYNAMES
|
|
195
244
|
a.index a.grep(/#{x}/i).first
|
|
196
245
|
}
|
|
197
246
|
raw_a[4].gsub!(r,&to_i)
|
|
198
|
-
raw_units[4].gsub!(r,&to_i)
|
|
247
|
+
raw_units[4].gsub!(r,&to_i)
|
|
199
248
|
end
|
|
200
|
-
|
|
201
|
-
@to_expression = raw_a[0..4].join ' '
|
|
249
|
+
|
|
250
|
+
@to_expression = raw_a[0..4].join ' '
|
|
202
251
|
|
|
203
252
|
raw_date = raw_units.map.with_index {|x,i| dt[i].call(x) }
|
|
204
253
|
|
|
205
254
|
# expand the repeater
|
|
206
255
|
|
|
207
|
-
ceil = {min: MINUTE, hour: 23, day: 31, month: 12}.values
|
|
256
|
+
ceil = {min: MINUTE, hour: 23, day: 31, month: 12}.values
|
|
208
257
|
|
|
209
258
|
if repeaters.any? then
|
|
210
259
|
repeaters.each_with_index do |x,i|
|
|
@@ -212,16 +261,18 @@ class CronFormat
|
|
|
212
261
|
next if i == 4
|
|
213
262
|
|
|
214
263
|
if x and not raw_a[i][/^\*/] then
|
|
215
|
-
raw_date[i] = raw_date[i].map {|y|
|
|
264
|
+
raw_date[i] = raw_date[i].map {|y|
|
|
216
265
|
(y.to_i...ceil[i]).step(x.to_i).to_a.map(&:to_s)
|
|
217
266
|
}.flatten
|
|
218
|
-
else
|
|
267
|
+
else
|
|
219
268
|
raw_date[i]
|
|
220
|
-
end
|
|
269
|
+
end
|
|
221
270
|
end
|
|
222
|
-
end
|
|
271
|
+
end
|
|
272
|
+
|
|
273
|
+
dates = inflate(raw_date)
|
|
223
274
|
|
|
224
|
-
dates
|
|
275
|
+
puts ('dates: ' + dates.inspect).debug if @debug
|
|
225
276
|
|
|
226
277
|
a = dates.map do |date|
|
|
227
278
|
|
|
@@ -230,23 +281,23 @@ class CronFormat
|
|
|
230
281
|
d << year
|
|
231
282
|
|
|
232
283
|
next unless day_valid? d.reverse.take 3
|
|
233
|
-
t = Time.parse(TF % d.reverse)
|
|
234
|
-
# 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
|
|
235
286
|
# a time to match that weekday
|
|
236
287
|
if wday and wday != t.wday then
|
|
237
|
-
|
|
238
|
-
t = Time.parse(TF % d.reverse)
|
|
288
|
+
|
|
289
|
+
t = Time.parse(TF % d.reverse)
|
|
239
290
|
|
|
240
291
|
if repeaters[4] then
|
|
241
292
|
t += repeaters[4].to_i * WEEK while t < @to_time
|
|
242
293
|
else
|
|
243
|
-
d[2], d[3] = @to_time.to_a.values_at(3,4).map(&:to_s)
|
|
244
|
-
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
|
|
245
296
|
end
|
|
246
|
-
|
|
297
|
+
|
|
247
298
|
end
|
|
248
|
-
|
|
249
|
-
# increment the month, day, hour, and minute for
|
|
299
|
+
|
|
300
|
+
# increment the month, day, hour, and minute for
|
|
250
301
|
# expressions which match '* * * *' consecutively
|
|
251
302
|
i = 3
|
|
252
303
|
|
|
@@ -257,9 +308,14 @@ class CronFormat
|
|
|
257
308
|
i -= 1
|
|
258
309
|
end
|
|
259
310
|
|
|
260
|
-
# starting from the biggest unit, attempt to increment that
|
|
311
|
+
# starting from the biggest unit, attempt to increment that
|
|
261
312
|
# unit where it is equal to '*'
|
|
262
313
|
|
|
314
|
+
if @debug then
|
|
315
|
+
puts ('t: ' + t.inspect).debug
|
|
316
|
+
puts ('@to_time: ' + @to_time.inspect).debug
|
|
317
|
+
end
|
|
318
|
+
|
|
263
319
|
if t < @to_time then
|
|
264
320
|
|
|
265
321
|
if t.month < @to_time.month and raw_a[4] == '*' then
|
|
@@ -267,6 +323,7 @@ class CronFormat
|
|
|
267
323
|
# increment the year
|
|
268
324
|
d[4].succ!
|
|
269
325
|
t = Time.parse(TF % d.reverse)
|
|
326
|
+
puts 't: ' + t.inspect if @debug
|
|
270
327
|
|
|
271
328
|
if repeaters[4] then
|
|
272
329
|
|
|
@@ -280,6 +337,7 @@ class CronFormat
|
|
|
280
337
|
and t.min < @to_time.min and raw_a[1] != '*') ) \
|
|
281
338
|
and raw_a[2] == '*' then
|
|
282
339
|
|
|
340
|
+
puts 'incrementing the day' if @debug
|
|
283
341
|
# increment the day
|
|
284
342
|
t += DAY * ((@to_time.day - d[2].to_i) + 1)
|
|
285
343
|
elsif t.min < @to_time.min and raw_a[1] == '*' then
|
|
@@ -295,12 +353,12 @@ class CronFormat
|
|
|
295
353
|
t = procs.values[i].call(t, repeaters[i].to_i) if repeaters[i]
|
|
296
354
|
elsif raw_a[3] == '*' then
|
|
297
355
|
|
|
298
|
-
t = increment_month d
|
|
299
|
-
end
|
|
356
|
+
t = increment_month d
|
|
357
|
+
end
|
|
300
358
|
|
|
301
359
|
end
|
|
302
360
|
|
|
303
|
-
# after the units have been incremented we need to
|
|
361
|
+
# after the units have been incremented we need to
|
|
304
362
|
# increment the weekday again if need be
|
|
305
363
|
if wday then
|
|
306
364
|
|
|
@@ -313,9 +371,14 @@ class CronFormat
|
|
|
313
371
|
|
|
314
372
|
end
|
|
315
373
|
|
|
374
|
+
if @debug then
|
|
375
|
+
puts ('2. t: ' + t.inspect).debug
|
|
376
|
+
puts ('2. @to_time: ' + @to_time.inspect).debug
|
|
377
|
+
end
|
|
378
|
+
|
|
316
379
|
# finally, if the date is still less than the current time we can
|
|
317
380
|
# increment the date using any repeating intervals
|
|
318
|
-
if t
|
|
381
|
+
if (t < @to_time or (!nudged and t == @to_time)) and repeaters.any? then
|
|
319
382
|
|
|
320
383
|
repeaters.each_with_index do |x,i|
|
|
321
384
|
|
|
@@ -325,31 +388,35 @@ class CronFormat
|
|
|
325
388
|
end
|
|
326
389
|
end
|
|
327
390
|
|
|
328
|
-
t
|
|
391
|
+
t
|
|
329
392
|
end
|
|
330
393
|
|
|
394
|
+
puts ('a: ' + a.inspect).debug if @debug
|
|
395
|
+
|
|
331
396
|
@to_time = a.compact.min
|
|
332
397
|
end
|
|
333
|
-
|
|
398
|
+
|
|
334
399
|
def day_valid?(date)
|
|
335
400
|
|
|
336
401
|
year, month, day = date
|
|
337
|
-
last_day = DateTime.parse("%s-%s-%s" % [year,
|
|
402
|
+
last_day = DateTime.parse("%s-%s-%s" % [year,
|
|
338
403
|
(month.to_i < 12 ? month.succ : 1), 1]) - 1
|
|
339
404
|
day.to_i <= last_day.day
|
|
340
|
-
end
|
|
405
|
+
end
|
|
341
406
|
|
|
342
407
|
def increment_month(d)
|
|
343
408
|
|
|
409
|
+
puts 'inside increment_month' if @debug
|
|
410
|
+
|
|
344
411
|
if d[3].to_i <= 11 then
|
|
345
412
|
d[3].succ!
|
|
346
|
-
else
|
|
413
|
+
else
|
|
347
414
|
d[3] = '1'
|
|
348
415
|
d[4].succ!
|
|
349
416
|
end
|
|
350
417
|
|
|
351
418
|
Time.parse(TF % d.reverse)
|
|
352
|
-
end
|
|
419
|
+
end
|
|
353
420
|
|
|
354
421
|
def inflate(raw_a)
|
|
355
422
|
|
|
@@ -359,5 +426,5 @@ class CronFormat
|
|
|
359
426
|
a.map{|x| x.length <= 1 ? x.first : x.shift}
|
|
360
427
|
end
|
|
361
428
|
end
|
|
362
|
-
|
|
429
|
+
|
|
363
430
|
end
|
data.tar.gz.sig
CHANGED
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
|
|
@@ -10,30 +10,55 @@ bindir: bin
|
|
|
10
10
|
cert_chain:
|
|
11
11
|
- |
|
|
12
12
|
-----BEGIN CERTIFICATE-----
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
13
|
+
MIIEXjCCAsagAwIBAgIBATANBgkqhkiG9w0BAQsFADAsMSowKAYDVQQDDCFnZW1t
|
|
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
|
+
c29uLmV1MCYGA1UdEgQfMB2BG2dlbW1hc3RlckBqYW1lc3JvYmVydHNvbi5ldTAN
|
|
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
|
|
32
37
|
-----END CERTIFICATE-----
|
|
33
|
-
date:
|
|
34
|
-
dependencies:
|
|
38
|
+
date: 2022-02-02 00:00:00.000000000 Z
|
|
39
|
+
dependencies:
|
|
40
|
+
- !ruby/object:Gem::Dependency
|
|
41
|
+
name: c32
|
|
42
|
+
requirement: !ruby/object:Gem::Requirement
|
|
43
|
+
requirements:
|
|
44
|
+
- - ">="
|
|
45
|
+
- !ruby/object:Gem::Version
|
|
46
|
+
version: 0.3.0
|
|
47
|
+
- - "~>"
|
|
48
|
+
- !ruby/object:Gem::Version
|
|
49
|
+
version: '0.3'
|
|
50
|
+
type: :runtime
|
|
51
|
+
prerelease: false
|
|
52
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
53
|
+
requirements:
|
|
54
|
+
- - ">="
|
|
55
|
+
- !ruby/object:Gem::Version
|
|
56
|
+
version: 0.3.0
|
|
57
|
+
- - "~>"
|
|
58
|
+
- !ruby/object:Gem::Version
|
|
59
|
+
version: '0.3'
|
|
35
60
|
description:
|
|
36
|
-
email:
|
|
61
|
+
email: digital.robertson@gmail.com
|
|
37
62
|
executables: []
|
|
38
63
|
extensions: []
|
|
39
64
|
extra_rdoc_files: []
|
|
@@ -59,8 +84,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
59
84
|
version: '0'
|
|
60
85
|
requirements: []
|
|
61
86
|
rubyforge_project:
|
|
62
|
-
rubygems_version: 2.
|
|
87
|
+
rubygems_version: 2.7.10
|
|
63
88
|
signing_key:
|
|
64
89
|
specification_version: 4
|
|
65
|
-
summary:
|
|
90
|
+
summary: Accepts a cron expression and outputs the relative time (e.g. 0 7 1 1 * *
|
|
91
|
+
=> 2019-01-01 07:00:00 +0000
|
|
66
92
|
test_files: []
|
metadata.gz.sig
CHANGED
|
Binary file
|