chronic_cron 0.3.6 → 0.6.1

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