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 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