cron_format 0.3.5 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 770687981ae1603cae0ae5742d3361dc96b5a92e
4
- data.tar.gz: 159e4a8dc03bafb524c3daf488c8cf95e5c5ddca
2
+ SHA256:
3
+ metadata.gz: 176722aed0424cfe698ec0bb9bc159a962a747e665b25ab4754101e078295248
4
+ data.tar.gz: e298aa75482b25335176e367f61fe9578fcca8c1539de5b0c0c8fa39dc88f580
5
5
  SHA512:
6
- metadata.gz: a6a96846405c3a0fb418f361d806fcb1535a7cee7682e58014937e83e36ee98523456178bd2386b16d0ec97619b7ec6a0273a04b02e33d2b076e282449bc1633
7
- data.tar.gz: 36115594470e04363446f08bdc91516a6f3bce814500f6442ce8879eabc44ca6de8b6ff63cc66ddb930ba1e742aead7bebb2efddea3bc0749a29e8adec6121aa
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
- @cron_string, @to_time = cron_string, now
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
- @to_time = r
131
+ end
132
+
133
+ def parse(nudged: false)
106
134
 
107
- end
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
- @to_time += MINUTE until @to_time.min == mins.to_i and \
122
- @to_time.hour == hours.to_i
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 = inflate(raw_date)
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 <= @to_time and repeaters.any? then
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
@@ -1 +1,4 @@
1
- %Z���%M ��i��>����:ѣ9g�Q�}W\��[�,��ZJ���G�m"I�:�A�<|%��$����"�q�}܉�)$
1
+ /���U�Z�o�Ԧ[?�_I�����!{nn݈%��q!��a����p{{��� R���� ���e%
2
+ K ����[�\a
3
+
4
+ m�\N=oU�kW���Z���������rض�ohX�*
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.3.5
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
- MIIDXjCCAkagAwIBAgIBATANBgkqhkiG9w0BAQUFADAsMSowKAYDVQQDDCFnZW1t
14
- YXN0ZXIvREM9amFtZXNyb2JlcnRzb24vREM9ZXUwHhcNMTgwMzEzMjIzNDEyWhcN
15
- MTkwMzEzMjIzNDEyWjAsMSowKAYDVQQDDCFnZW1tYXN0ZXIvREM9amFtZXNyb2Jl
16
- cnRzb24vREM9ZXUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCkCdEJ
17
- UjtgmEedQ8w+ubTmHE4BpsUFewYhdAJ8eANKV0Mc6Km1JS7iviiHXmnqPYdWcrTx
18
- khljN3zaqNX/vR5y+zIy7vXqy9M/0BPGVnEJHj8/Tn2NvXG/kfFXIcfHqKSxsvX7
19
- go9CBM0aB3ZeueDgT6Sm5Nf5nwixgNSeQ6CSq6qrMDq7/5oDUJ5VxeyPsdhy9TJF
20
- pjt5V93mDqgDq5SaYoEETtgqTpugtD8bUf3MSehMAG1TqdTpYrGZEewIfqIgXRxN
21
- YG+4M8lI0S9a+OPrXNKlFOfvB1wlC+tRvYdgTdX2Qj7Eb0o17CnL4sR3WgcmAIYi
22
- vU/XM/O4V/TWDq4NAgMBAAGjgYowgYcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAw
23
- HQYDVR0OBBYEFBV/59mIpXOYt1x0MSWeLm6vy/ySMCYGA1UdEQQfMB2BG2dlbW1h
24
- c3RlckBqYW1lc3JvYmVydHNvbi5ldTAmBgNVHRIEHzAdgRtnZW1tYXN0ZXJAamFt
25
- ZXNyb2JlcnRzb24uZXUwDQYJKoZIhvcNAQEFBQADggEBABmqh5CsvL7K2KCHCLyX
26
- YEuF5nVn+MsAJZj1mm6sd0sA5HkQ2lT+Xx5jwpxYLrOqV0qT5DmhaDQUkM6W7WLa
27
- tIFEac2buOY83gIjRo14D1PRz2e8jH12ffYAxtm7bRTerzbxBqZm7xDTjuJnj1n8
28
- 4eLJfD0Ck0i2f1z206DqwPyymN+uDH/kE5ewB9reHgUeXlFCeo8c2Su8egxJf8Ww
29
- sZzkbSOjq5ekNiNAV7ACU+yp1AU2dWlpbCZt/1J6aOFI90nYVV1iKf3gRNgCT777
30
- E0pbk0dRdBt0x5gnA8Q7lsQkyZT5li/rMvu6b9ZdRlzg6dA1S40k3ibt6RI6ht4T
31
- lIM=
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: 2018-03-13 00:00:00.000000000 Z
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: james@jamesrobertson.eu
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.6.13
87
+ rubygems_version: 2.7.10
63
88
  signing_key:
64
89
  specification_version: 4
65
- summary: cron_format
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