chronic_cron 0.3.6 → 0.6.1

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: 6880061d93fedcede28b7e651d068f16f7add182
4
- data.tar.gz: c4c085e839bc2beb70cbe76a26bf62e58922b8e9
2
+ SHA256:
3
+ metadata.gz: a592752d6002e699c468d42d5bb44557ae37dd07269cbb9a242aeaaaa3705e7c
4
+ data.tar.gz: d65322901ada5081ad53d3a6bffc407dc5195142069766d05e2ff62a540c75b6
5
5
  SHA512:
6
- metadata.gz: c73c6e91eeaca2e88c8d0079d1c593bf4379907c034ace3d0c104725dfa61ba2c144ce6616750226db106ff1b8fa0e451c8544ed12dbbeff65c4bf7ad35ed606
7
- data.tar.gz: 3dcbe3cb2092b39a51c8758fa24eac419b2574a08c3803e1548ba237a44747fec72dc86ccebe7719dfdef36d755af6771e5ba8cfad43679977231313dd4c1964
6
+ metadata.gz: 8c270f38875374250ab0281be21729fd21f3fc5d468a08989537cd32f1eb3575b5ca5e9bd7459da297b6995729456ff06fb8fd756dd19f662ededf3dedc50b66
7
+ data.tar.gz: debbbca0aed6c3edeeed46d071273c9bacabdb9ba191a79fea1d4b62ae36b1c80e1267ff6b1ba8062703de9004adafbcb6addb351494acb5fb0c8064ee0b2c8b
Binary file
data.tar.gz.sig CHANGED
Binary file
@@ -10,28 +10,56 @@ require 'timetoday'
10
10
 
11
11
  class ChronicCron
12
12
  include AppRoutes
13
+ using ColouredText
13
14
 
14
15
  attr_reader :to_expression
15
16
 
16
- def initialize(s, now=Time.now)
17
+ def self.parse(s)
18
+ r = new(s)
19
+ r.valid? ? r : nil
20
+ end
21
+
22
+ def initialize(s, now=Time.now, log: nil, debug: false)
23
+
24
+ @now, @log, @debug = now, log, debug
17
25
 
18
- @now = now
26
+ puts ('@now: ' + @now.inspect).debug if @debug
19
27
 
20
28
  super()
21
29
  @params = {input: s}
22
30
  expressions(@params)
23
31
 
24
- expression = find_expression(s.downcase\
32
+ if s =~ /^tomorrow/i then
33
+
34
+ s.sub!(/^tomorrow /i,'')
35
+ expression = find_expression(s.downcase\
36
+ .sub(/^(?:is|on|at|from|starting)\s+/,''))
37
+ @cf = CronFormat.new(expression, now)
38
+ @cf.adjust_date @cf.to_time - (24 * 60 * 60)
39
+
40
+ else
41
+
42
+ expression = find_expression(s.downcase\
25
43
  .sub(/^(?:on|at|from|starting)\s+/,''))
26
- #puts 'expression : ' + expression.inspect
27
- @cf = CronFormat.new(expression, now)
44
+ puts 'expression: ' + expression.inspect if @debug
45
+ return unless expression
46
+
47
+ @cf = CronFormat.new(expression, now)
48
+
49
+ end
50
+
51
+
28
52
  @to_expression = @cf.to_expression
29
53
 
30
54
  end
31
55
 
32
- def inspect()
33
- "#<ChronicCron:%s @to_expression=\"%s\", @to_time=\"%s\">" %
56
+ def inspect()
57
+ if @cf then
58
+ "#<ChronicCron:%s @to_expression=\"%s\", @to_time=\"%s\">" %
34
59
  [self.object_id, @to_expression, @cf.to_time]
60
+ else
61
+ "#<ChronicCron:%s >" % [self.object_id]
62
+ end
35
63
  end
36
64
 
37
65
  def next()
@@ -45,30 +73,45 @@ class ChronicCron
45
73
  def to_time()
46
74
  @cf.to_time
47
75
  end
76
+
77
+ def valid?
78
+ !@cf.nil?
79
+ end
48
80
 
49
81
  protected
50
82
 
51
83
  def expressions(params)
84
+
85
+ log = @log
52
86
 
53
87
  r = '[0-9\*,\?\/\-]+'
54
88
  daily = '(?:every day|daily)'
55
89
 
56
90
  # e.g. 00 5 15 * *
57
91
  get /(#{r}\s+#{r}\s+#{r}\s#{r}\s#{r})(\s#{r})?/ do
92
+
93
+ puts 'ChronicCron#expressions 10' if @debug
94
+
58
95
  "%s%s" % params[:captures]
59
96
  end
60
97
 
61
98
  # e.g. 9:00-18:00 every day
62
99
  get /(\d{1,2}):(\d{1,2})-(\d{1,2}):\d{1,2}\s+#{daily}/ do
100
+
101
+ puts 'ChronicCron#expressions 20' if @debug
102
+
63
103
  "%s %s-%s * * *" % params[:captures].values_at(1,0,2)
64
104
  end
65
105
 
66
106
  # e.g. every 30mins from 8:00am until 8:00pm mon-fri
67
- get /every\s+(\d+)\s*mins\s+from\s+(\d{1,2}):(\d{1,2})([ap]m)(?:\s+until\s+|\s*-\s*)(\d{1,2}):\d{1,2}([ap]m)\s+(\w+\-\w+)/ do
107
+ get /every\s+(\d+)\s*mins\s+from\s+(\d{1,2}):(\d{1,2})([ap]m)(?:\s+until\s+|\s*-\s*)(\d{1,2}):\d{1,2}([ap]m)\s+(\w+\-\w+)/x do
68
108
  |interval_mins, r_hrs1, mins1, meridiem1, r_hrs2, meridiem2, wdays|
69
109
 
70
110
  hrs1 = meridiem1 == 'pm' ? r_hrs1.to_i + 12 : r_hrs1
71
111
  hrs2 = meridiem2 == 'pm' ? r_hrs2.to_i + 12 : r_hrs2
112
+
113
+ puts 'ChronicCron#expressions 30' if @debug
114
+
72
115
  "%s/%s %s-%s * * %s" % [mins1.to_i, interval_mins, hrs1, hrs2, wdays]
73
116
  end
74
117
 
@@ -77,6 +120,9 @@ class ChronicCron
77
120
  |interval_mins, r_hrs1, mins1, meridiem1, r_hrs2, meridiem2|
78
121
  hrs1 = meridiem1 == 'pm' ? r_hrs1.to_i + 12 : r_hrs1
79
122
  hrs2 = meridiem2 == 'pm' ? r_hrs2.to_i + 12 : r_hrs2
123
+
124
+ puts 'ChronicCron#expressions 40' if @debug
125
+
80
126
  "%s/%s %s-%s * * *" % [mins1.to_i, interval_mins, hrs1, hrs2]
81
127
  end
82
128
 
@@ -85,12 +131,18 @@ class ChronicCron
85
131
  |r_hrs1, mins1, meridiem1, r_hrs2, meridiem2|
86
132
  hrs1 = meridiem1 == 'pm' ? r_hrs1.to_i + 12 : r_hrs1
87
133
  hrs2 = meridiem2 == 'pm' ? r_hrs2.to_i + 12 : r_hrs2
134
+
135
+ puts 'ChronicCron#expressions 50' if @debug
136
+
88
137
  "%s %s-%s * * *" % [mins1.to_i, hrs1, hrs2]
89
138
  end
90
139
 
91
140
  # e.g. 10:15am every day
92
141
  get /(\d{1,2}):?(\d{1,2})([ap]m)?\s+#{daily}/ do |raw_hrs, mins, meridiem|
93
142
  hrs = in24hrs(raw_hrs, meridiem)
143
+
144
+ puts 'ChronicCron#expressions 60' if @debug
145
+
94
146
  "%s %s * * *" % [mins.to_i, hrs]
95
147
  end
96
148
 
@@ -98,11 +150,17 @@ class ChronicCron
98
150
  get /(\d{1,2}):?(\d{1,2})([ap]m)?\s+(\w+) to (\w+)/ do
99
151
  |raw_hrs, mins, meridiem, wday1, wday2|
100
152
  hrs = in24hrs(raw_hrs, meridiem)
153
+
154
+ puts 'ChronicCron#expressions 70' if @debug
155
+
101
156
  "%s %s * * %s-%s" % [mins.to_i, hrs , wday1, wday2]
102
157
  end
103
158
 
104
159
  # e.g. at 11:00 and 16:00 on every day
105
160
  get /(\d{1,2}):?(\d{1,2}) and (\d{1,2}):?\d{1,2} (?:on )?#{daily}/ do
161
+
162
+ puts 'ChronicCron#expressions 80' if @debug
163
+
106
164
  "%s %s,%s * * *" % params[:captures].values_at(1,0,2)
107
165
  end
108
166
 
@@ -121,6 +179,9 @@ class ChronicCron
121
179
  get /(\d{1,2}):?(\d{1,2})([ap]m)?\s+(?:on )?every #{weekday}/i do
122
180
  |raw_hrs, mins, meridiem, wday|
123
181
  hrs = in24hrs(raw_hrs, meridiem)
182
+
183
+ puts 'ChronicCron#expressions 90' if @debug
184
+
124
185
  "%s %s * * %s" % [mins, hrs , wday]
125
186
  end
126
187
 
@@ -128,6 +189,9 @@ class ChronicCron
128
189
  get /(\d{1,2})([ap]m)?\s+(?:on )?every #{weekday}/i do
129
190
  |raw_hrs, meridiem, wday|
130
191
  hrs = in24hrs(raw_hrs, meridiem)
192
+
193
+ puts 'ChronicCron#expressions 100' if @debug
194
+
131
195
  "0 %s * * %s" % [hrs , wday]
132
196
  end
133
197
 
@@ -140,7 +204,14 @@ class ChronicCron
140
204
  get(/every hour/){ "0 * * * *"}
141
205
 
142
206
  # e.g. every 2 days
143
- get(/every (\d{1,2}) days?/){|days| "* * */%s * *" % [days]}
207
+ get(/every (\d{1,2}) days?/) do |days|
208
+
209
+ log.info 'ChronicCron/expressions/get: r130' if log
210
+ puts 'ChronicCron#expressions 150' if @debug
211
+
212
+ "* * */%s * *" % [days]
213
+ end
214
+
144
215
  get(/#{daily}/){ "0 0 * * *"}
145
216
 
146
217
  get /(?:any\s?time)?(?: today)? between (\S+) and (\S+)/ do |s1, s2|
@@ -151,6 +222,9 @@ class ChronicCron
151
222
  t
152
223
  end
153
224
  )
225
+
226
+ puts 'ChronicCron#expressions 170' if @debug
227
+
154
228
  "%s %s %s %s *" % TimeToday.between(s1,s2).to_a[1..4]
155
229
  end
156
230
 
@@ -162,6 +236,8 @@ class ChronicCron
162
236
  t
163
237
  end
164
238
  )
239
+ puts 'ChronicCron#expressions 180' if @debug
240
+
165
241
  "%s %s %s %s *" % TimeToday.future.to_a[1..4]
166
242
  end
167
243
 
@@ -186,6 +262,9 @@ class ChronicCron
186
262
  raw_time ||= '6:00am'
187
263
 
188
264
  minute, hour = Chronic.parse(raw_time).to_a[1,2]
265
+
266
+ puts 'ChronicCron#expressions 190' if @debug
267
+
189
268
  "%s %s %s * %s" % [minute, hour, day_range, wday]
190
269
 
191
270
  end
@@ -196,6 +275,8 @@ class ChronicCron
196
275
 
197
276
  hrs = in24hrs(raw_hrs, meridiem)
198
277
 
278
+ puts 'ChronicCron#expressions 200' if @debug
279
+
199
280
  "0 %s * * %s" % [hrs , Date::DAYNAMES.index(wday.capitalize)]
200
281
  end
201
282
 
@@ -207,20 +288,41 @@ class ChronicCron
207
288
  ([ap]m)/i do |day, month, raw_hrs, mins, meridiem|
208
289
 
209
290
  now = Chronic.parse(month, now: @now)
291
+ puts ('now: ' + now.inspect).debug if @debug
292
+
293
+ d = last_wdayofmonth(day, now)
294
+ puts ('d: ' + d.inspect).debug if @debug
210
295
 
211
- t = Chronic.parse(month, now:
212
- Time.local(now > @now ? now.year : now.year.next))
213
- t2 = Chronic.parse('last ' + day, now:
214
- Time.local(t.year, t.month.next)).to_date
215
296
  hrs = in24hrs(raw_hrs, meridiem)
216
297
 
217
- "%s %s %s %s *" % [mins.to_i, hrs, t2.day, t.month]
298
+ puts 'ChronicCron#expressions 210' if @debug
299
+
300
+ "%s %s %s %s *" % [mins.to_i, hrs, d.day, d.month]
218
301
  end
302
+
303
+ # e.g. last sunday of October
304
+
305
+ get /last (#{Date::DAYNAMES.join('|')}) (?:of|in) \
306
+ (#{Date::MONTHNAMES[1..-1].join('|')})/i do |day, month|
307
+
308
+ now = Chronic.parse(month, now: @now)
309
+
310
+ d = last_wdayofmonth(day, now)
311
+
312
+ puts 'ChronicCron#expressions 220' if @debug
313
+
314
+ "* * %s %s *" % [d.day, d.month]
315
+ end
316
+
219
317
 
220
318
  # e.g. every 2nd tuesday at 4:40pm
221
319
  get /every\s+2nd\s+#{weekday}\s+at\s+(\d{1,2})(?::(\d{1,2}))?([ap]m)/i do
222
320
  |wday, raw_hrs, mins, meridiem, |
223
321
  hrs = in24hrs(raw_hrs, meridiem)
322
+ log.info 'ChronicCron/expressions/get: r230' if log
323
+
324
+ puts 'ChronicCron#expressions 220' if @debug
325
+
224
326
  "%s %s * * %s/2" % [mins.to_i, hrs , wday]
225
327
  end
226
328
 
@@ -228,6 +330,9 @@ class ChronicCron
228
330
  get /every\s+#{weekday}\s+at\s+(\d{1,2}):(\d{1,2})([ap]m)/i do
229
331
  |wday, raw_hrs, mins, meridiem, |
230
332
  hrs = in24hrs(raw_hrs, meridiem)
333
+
334
+ puts 'ChronicCron#expressions 230' if @debug
335
+
231
336
  "%s %s * * %s" % [mins, hrs , wday]
232
337
  end
233
338
 
@@ -236,7 +341,9 @@ class ChronicCron
236
341
  get /every 2nd week\s+at\s+([^\s]+)/ do |raw_time|
237
342
 
238
343
  t = Chronic.parse(raw_time, :now => @now)
239
-
344
+ log.info 'ChronicCron/expressions/get: r250' if log
345
+ puts 'ChronicCron#expressions 240' if @debug
346
+
240
347
  "%s %s * * %s/2" % [t.min,t.hour,t.wday]
241
348
 
242
349
  end
@@ -245,16 +352,50 @@ class ChronicCron
245
352
  # e.g. every 2nd monday
246
353
  get /every 2nd #{weekday}/ do |wday|
247
354
 
355
+ puts 'ChronicCron#expressions 250' if @debug
248
356
  "* * * * %s/2" % [wday]
249
357
 
250
358
  end
359
+
360
+
361
+ # e.g. every 2 weeks (starting 7th Jan 2020)
362
+ get /^every (\w+) weeks \(starting ([^\)]+)/ do |interval, raw_date|
363
+
364
+ if @debug then
365
+ puts ('raw_date: ' + raw_date.inspect).debug
366
+ puts ('now: ' + @now.inspect).debug
367
+ end
368
+
369
+ t = raw_date ? Chronic.parse(raw_date, :now => @now) : @now
370
+ t += WEEK * interval.to_i until t > @now
371
+ mins, hrs = t.to_a.values_at(1,2)
372
+
373
+ log.info 'ChronicCron/expressions/get: r260' if log
374
+ if @debug then
375
+ puts 'ChronicCron#expressions 260'
376
+ puts ('t: ' + t.inspect).debug
377
+ end
378
+
379
+ "%s %s * * %s/%s" % [mins, hrs, t.wday, interval]
380
+ end
251
381
 
252
382
  # e.g. every 2 weeks at 6am starting from 7th Jan
253
- get /every (\w+) weeks\s+(?:at\s+([^\s]+))?/ do |interval, raw_time|
383
+ get /^every (\w+) weeks(?:\s+at\s+([^\s]+))?/ do |interval, raw_time|
254
384
 
255
- t = Chronic.parse(raw_time, :now => @now)
385
+ if @debug then
386
+ puts ('raw_time: ' + raw_time.inspect).debug
387
+ puts ('now: ' + @now.inspect).debug
388
+ end
389
+
390
+ t = raw_time ? Chronic.parse(raw_time, :now => @now) : @now
256
391
  t += WEEK * interval.to_i until t > @now
257
392
  mins, hrs = t.to_a.values_at(1,2)
393
+
394
+ log.info 'ChronicCron/expressions/get: r270' if log
395
+ if @debug then
396
+ puts 'ChronicCron#expressions 270'
397
+ puts ('t: ' + t.inspect).debug
398
+ end
258
399
 
259
400
  "%s %s * * %s/%s" % [mins, hrs, t.wday, interval]
260
401
  end
@@ -265,6 +406,8 @@ class ChronicCron
265
406
 
266
407
  t = Chronic.parse(raw_date, :now => @now)
267
408
  mins, hrs = t.to_a.values_at(1,2)
409
+ puts 'ChronicCron#expressions 280' if @debug
410
+
268
411
  "%s %s * * %s/%s" % [mins, hrs, t.wday, interval]
269
412
  end
270
413
 
@@ -273,6 +416,8 @@ class ChronicCron
273
416
 
274
417
  t = Chronic.parse(raw_date, :now => @now)
275
418
  mins, hrs, day, month, year = t.to_a.values_at(1,2,3,4,5)
419
+ puts 'ChronicCron#expressions 290' if @debug
420
+
276
421
  "%s %s %s %s %s/2 %s" % [mins, hrs, day, month, t.wday, year]
277
422
  end
278
423
 
@@ -281,11 +426,16 @@ class ChronicCron
281
426
 
282
427
  t = Chronic.parse(raw_date, :now => @now)
283
428
  mins, hrs, day, month, year = t.to_a.values_at(1,2,3,4,5)
429
+ puts 'ChronicCron#expressions 300' if @debug
430
+
284
431
  "%s %s %s %s %s %s" % [mins, hrs, day, month, t.wday, year]
285
432
  end
286
433
 
287
434
  # e.g. every sunday
288
435
  get /every\s+#{weekday}/ do |wday|
436
+
437
+ puts 'ChronicCron#expressions 310' if @debug
438
+
289
439
  "0 12 * * %s" % wday
290
440
  end
291
441
 
@@ -293,7 +443,11 @@ class ChronicCron
293
443
  get '*' do
294
444
 
295
445
  t = Chronic.parse(params[:input], :now => @now)
296
- "%s %s %s %s * %s" % t.to_a.values_at(1,2,3,4,5)
446
+ puts 'ChronicCron#expressions 330' if @debug
447
+ puts 't: ' + t.inspect if @debug
448
+ if t then
449
+ "%s %s %s %s * %s" % t.to_a.values_at(1,2,3,4,5)
450
+ end
297
451
  end
298
452
 
299
453
  def in24hrs(raw_hrs, meridiem)
@@ -306,6 +460,21 @@ class ChronicCron
306
460
  end
307
461
  end
308
462
 
463
+
309
464
  alias find_expression run_route
310
465
 
466
+ private
467
+
468
+ def last_wdayofmonth(day, now)
469
+
470
+ wday = Date::DAYNAMES.map(&:downcase).index(day)
471
+
472
+ d2 = Date.today
473
+ date = Date.civil(now.year, now.month, -1)
474
+ date -= 1 until date.wday == wday
475
+
476
+ return date
477
+
478
+ end
479
+
311
480
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chronic_cron
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.6
4
+ version: 0.6.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Robertson
@@ -10,28 +10,32 @@ bindir: bin
10
10
  cert_chain:
11
11
  - |
12
12
  -----BEGIN CERTIFICATE-----
13
- MIIDljCCAn6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBIMRIwEAYDVQQDDAlnZW1t
14
- YXN0ZXIxHjAcBgoJkiaJk/IsZAEZFg5qYW1lc3JvYmVydHNvbjESMBAGCgmSJomT
15
- 8ixkARkWAmV1MB4XDTE2MTExMDE3NTIwNVoXDTE3MTExMDE3NTIwNVowSDESMBAG
16
- A1UEAwwJZ2VtbWFzdGVyMR4wHAYKCZImiZPyLGQBGRYOamFtZXNyb2JlcnRzb24x
17
- EjAQBgoJkiaJk/IsZAEZFgJldTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
18
- ggEBAMXvIIMnFzqgqEUdrqypkw6RdcfEI40u5r0bcgvbyhw6CZAZZKWk0q5Ziw7a
19
- S1tatAttBGZLzVdeHnymo8vmiscNwdCS2gUDXCp8rlpah4BvCmKv3LLAnaEZK1ep
20
- ftYwmRqNILNAmsiRbF5nmDcr7zR0vFeoZ5Vdl/ZBzaoMQ72RtJY8zoo5zpnZnpU6
21
- ShRUsnEH08CtD8qh6ZljzTp96A1RRT7LUJQwK4UcIC0yjeTB2JsKs5iVePuo7y3p
22
- CFAQF4vrUakYiTDz/n598bqgoUA4CNtWZl2gBQ3h1W+T31F2uUSfDmHbJhhnDAPL
23
- TITa8E5aBl9deGJhyhHyjpj/tVUCAwEAAaOBijCBhzAJBgNVHRMEAjAAMAsGA1Ud
24
- DwQEAwIEsDAdBgNVHQ4EFgQUh2SBKNkdbuyEwL8nsr5pfoVEM2wwJgYDVR0RBB8w
25
- HYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0c29uLmV1MCYGA1UdEgQfMB2BG2dlbW1h
26
- c3RlckBqYW1lc3JvYmVydHNvbi5ldTANBgkqhkiG9w0BAQUFAAOCAQEAs6RT28SG
27
- 9X2mZGolXDgPCWpJOAbB8c9WB+ptbJLeLCFuGwWpp4bqAkx4FBpLG096xwSrNkQ4
28
- 81EO1GAXvLZmY8cIf0UrGXrW5rAvWPXkJlMW+10sO8yGDMMtQ5QijBECToyN4417
29
- 6PciD+0Dtqud1TvvkcWEZ+eu2/AjeHN4MfLoEv5rEXtQl7yQ3fF3Lh8skc9eoGji
30
- X96JRh2ZgKjqCh+r806HDBd1oCjzY9iFBukHV/vVe103rVdKZP0DcFJcE6UsLqAH
31
- 0wcgVFIVtcpX9C67gxjhpnaGcldx1X9px9b4jorMz4yZHdq+MonVlmQlYfhPLRog
32
- krK/e35wvDmTqQ==
13
+ MIIEXjCCAsagAwIBAgIBATANBgkqhkiG9w0BAQsFADAsMSowKAYDVQQDDCFnZW1t
14
+ YXN0ZXIvREM9amFtZXNyb2JlcnRzb24vREM9ZXUwHhcNMjAxMTA2MjI1NDExWhcN
15
+ MjExMTA2MjI1NDExWjAsMSowKAYDVQQDDCFnZW1tYXN0ZXIvREM9amFtZXNyb2Jl
16
+ cnRzb24vREM9ZXUwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQDOybkb
17
+ e05urfbOlnahAdXyF2BABMxwCz8Z07BgC78nOYER2ONb8Wt1o4wIoZnfzsrUK5Ff
18
+ bCNY0bAsdp9DbB4S/i8L0T5Bs2Jr/b2xk/y9igE+lA2w6Q2gXnip2p/GjRJcjdAP
19
+ Xm2ZV8QS+EMl2h23bte9FtX/mQuH+E/zdCn9wtvyhxHDox8tLYnanjhv6tvMBDPE
20
+ gb5wgXHudArg8t+7zA29iiQPRJ6qwnDLbRdBodC/P5CwCK40EIPmhshOznaGI57V
21
+ jYg8sunmT2Q2etsBCoV1d0PoNJRzDivkL6s9imRrONJMP9bt1k+qLdtrrCz1hFj1
22
+ NZJWIvRNmnOSBecETfycIzpN5r89uTDl5qXeFXPBPk+aUpeBFB1Ntic2pcbJvAQb
23
+ nIL4TL6Xe9Md+q/uA0ufnHRbKeRQl7HHUE0j3EzHuwHgEn1FuJhVPifDl+2qtB4j
24
+ ps38QmZLa+UFSTuArU4ur24zg+J4XTOkCNR1bPYQJjuGO9Oyj0GI2QyqP6UCAwEA
25
+ AaOBijCBhzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQU9eCFvE24
26
+ Mq+pXeKKzmUwTNmn62wwJgYDVR0RBB8wHYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0
27
+ c29uLmV1MCYGA1UdEgQfMB2BG2dlbW1hc3RlckBqYW1lc3JvYmVydHNvbi5ldTAN
28
+ BgkqhkiG9w0BAQsFAAOCAYEAaUlfcuP6kAan4TbMfsLwTtpKDRgmPvX0xPCzZK9Y
29
+ C47NhmUz3j4M1Tfbz6R6PUXYS50KtZ83rk9lTbiSRJ3ZbR/Q+I8WCci1342SkMSX
30
+ R3M0TPq2gK5OB0Dv/oyYhzR2iXChWD88KH74NTFHPHBoJHtlHytBUYpMG/wtbKr3
31
+ ZLF/ga/SF8CuiJdoA160i0cn1Rb4rEmmkP9y/J5jO43CF/Zs6aDjDM8bYqslntX5
32
+ Sl0J29FpvFrEiRBj3k/NEJWeArhmqaDW/7kA4CBbWDB7lpmV98IiJ8HrEDQOn7lt
33
+ VdN1c4pVVB5CiS9JlmpbB1bALwq7NcM9MGIwGjjdBDOe2i2XjgWDCjfNrT7iqjUN
34
+ Gs7jYeqFD5zboPtQtb3SiWnAbJgeGF9ojFFCO2qUwZh1PuZbCEnC80ZbM7AmAxJ7
35
+ 5/R97FUsc8ka/0HRADqJU3kQxMvTx/YlBFjaiBqJ3XO/3ZBHwLPyIXVKEmbNT5Wz
36
+ p1yxSFG+W4RfwEZu4aKdGsuB
33
37
  -----END CERTIFICATE-----
34
- date: 2017-06-08 00:00:00.000000000 Z
38
+ date: 2020-11-06 00:00:00.000000000 Z
35
39
  dependencies:
36
40
  - !ruby/object:Gem::Dependency
37
41
  name: app-routes
@@ -57,22 +61,22 @@ dependencies:
57
61
  name: cron_format
58
62
  requirement: !ruby/object:Gem::Requirement
59
63
  requirements:
60
- - - "~>"
61
- - !ruby/object:Gem::Version
62
- version: '0.3'
63
64
  - - ">="
64
65
  - !ruby/object:Gem::Version
65
- version: 0.3.4
66
+ version: 0.6.0
67
+ - - "~>"
68
+ - !ruby/object:Gem::Version
69
+ version: '0.6'
66
70
  type: :runtime
67
71
  prerelease: false
68
72
  version_requirements: !ruby/object:Gem::Requirement
69
73
  requirements:
70
- - - "~>"
71
- - !ruby/object:Gem::Version
72
- version: '0.3'
73
74
  - - ">="
74
75
  - !ruby/object:Gem::Version
75
- version: 0.3.4
76
+ version: 0.6.0
77
+ - - "~>"
78
+ - !ruby/object:Gem::Version
79
+ version: '0.6'
76
80
  - !ruby/object:Gem::Dependency
77
81
  name: chronic
78
82
  requirement: !ruby/object:Gem::Requirement
@@ -97,22 +101,22 @@ dependencies:
97
101
  name: timetoday
98
102
  requirement: !ruby/object:Gem::Requirement
99
103
  requirements:
100
- - - "~>"
101
- - !ruby/object:Gem::Version
102
- version: '0.2'
103
104
  - - ">="
104
105
  - !ruby/object:Gem::Version
105
106
  version: 0.2.0
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '0.2'
106
110
  type: :runtime
107
111
  prerelease: false
108
112
  version_requirements: !ruby/object:Gem::Requirement
109
113
  requirements:
110
- - - "~>"
111
- - !ruby/object:Gem::Version
112
- version: '0.2'
113
114
  - - ">="
114
115
  - !ruby/object:Gem::Version
115
116
  version: 0.2.0
117
+ - - "~>"
118
+ - !ruby/object:Gem::Version
119
+ version: '0.2'
116
120
  description:
117
121
  email: james@jamesrobertson.eu
118
122
  executables: []
@@ -139,10 +143,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
139
143
  - !ruby/object:Gem::Version
140
144
  version: '0'
141
145
  requirements: []
142
- rubyforge_project:
143
- rubygems_version: 2.6.8
146
+ rubygems_version: 3.0.3
144
147
  signing_key:
145
148
  specification_version: 4
146
- summary: Converts a human-readable time (e.g. 10:15 daily) into a cron format (e,g,
149
+ summary: Converts a human-readable time (e.g. 10:15 daily) into a cron format (e,g,
147
150
  15 10 * * *)
148
151
  test_files: []
metadata.gz.sig CHANGED
Binary file