chronic_cron 0.5.0 → 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
2
  SHA256:
3
- metadata.gz: bda37336df08c15781de2f92da0c38856fc99617a2a9981d678a02d6c7cab433
4
- data.tar.gz: 90f135067b113779770df25b1ff01d58e3052027da8967d31e959a852e670eab
3
+ metadata.gz: 71cb9fbaff016e7cf04a40aa56dedba54844753254825889c6e1525aa680be7b
4
+ data.tar.gz: e5b614c4fdd6c3935eb7276387206c6b1e5ed90cf84c18c1a16ef8819fd6c318
5
5
  SHA512:
6
- metadata.gz: 18323a22bcbd7acd242858d2791468bda38cf7f1ad90c5cb1383161795062b7317696607ecab37787cae76849cf20af70fb1c5b9500bea90ccf59791f4cd215d
7
- data.tar.gz: 741f4e6cfc99e92130a66cea286e6186ba3090e601c8e1f5bcd5ba681e92abf4b3f4fda85a4574be3414fbb73ae96d45c99f4db814a011ebc407760f858987c0
6
+ metadata.gz: 2ca9ba056ab67289a9a63bfc865ab45f3d7cdf70caeb28db11c912f80e0161f6cf9aa7cf74a812c7cd5ee0372c14ca9b875c50d9321880bf29909fc1079fad5a
7
+ data.tar.gz: 067d8f29da520258af4fa0054e446084bb49cedb04260821a94f5ce0800b82ed4f9f7772f392d7d46ef7c87708dc2d3d4b1a891fe5ee9d5dbf8230351d2c34e5
checksums.yaml.gz.sig CHANGED
Binary file
data/lib/chronic_cron.rb CHANGED
@@ -10,59 +10,78 @@ require 'timetoday'
10
10
 
11
11
  class ChronicCron
12
12
  include AppRoutes
13
-
14
- attr_reader :to_expression
15
-
13
+ using ColouredText
14
+
15
+ attr_reader :to_expression
16
+
17
+ def self.parse(s)
18
+ r = new(s)
19
+ r.valid? ? r : nil
20
+ end
21
+
16
22
  def initialize(s, now=Time.now, log: nil, debug: false)
17
-
23
+
18
24
  @now, @log, @debug = now, log, debug
19
-
25
+
26
+ puts ('@now: ' + @now.inspect).debug if @debug
27
+
20
28
  super()
21
29
  @params = {input: s}
22
30
  expressions(@params)
23
31
 
24
32
  if s =~ /^tomorrow/i then
25
-
33
+
26
34
  s.sub!(/^tomorrow /i,'')
27
35
  expression = find_expression(s.downcase\
28
36
  .sub(/^(?:is|on|at|from|starting)\s+/,''))
29
- @cf = CronFormat.new(expression, now)
37
+ @cf = CronFormat.new(expression, now)
30
38
  @cf.adjust_date @cf.to_time - (24 * 60 * 60)
31
-
39
+
32
40
  else
33
-
41
+
34
42
  expression = find_expression(s.downcase\
35
43
  .sub(/^(?:on|at|from|starting)\s+/,''))
36
- @cf = CronFormat.new(expression, now)
37
-
44
+ puts 'expression: ' + expression.inspect if @debug
45
+ return unless expression
46
+
47
+ @cf = CronFormat.new(expression, now)
48
+
38
49
  end
39
-
50
+
40
51
 
41
52
  @to_expression = @cf.to_expression
42
53
 
43
54
  end
44
-
45
- def inspect()
46
- "#<ChronicCron:%s @to_expression=\"%s\", @to_time=\"%s\">" %
55
+
56
+ def inspect()
57
+ if @cf then
58
+ "#<ChronicCron:%s @to_expression=\"%s\", @to_time=\"%s\">" %
47
59
  [self.object_id, @to_expression, @cf.to_time]
60
+ else
61
+ "#<ChronicCron:%s >" % [self.object_id]
62
+ end
48
63
  end
49
-
64
+
50
65
  def next()
51
66
  @cf.next
52
67
  end
53
-
54
- def to_date()
68
+
69
+ def to_date()
55
70
  @cf.to_time.to_date
56
71
  end
57
-
72
+
58
73
  def to_time()
59
74
  @cf.to_time
60
75
  end
61
-
76
+
77
+ def valid?
78
+ @cf.respond_to? :to_time
79
+ end
80
+
62
81
  protected
63
82
 
64
- def expressions(params)
65
-
83
+ def expressions(params)
84
+
66
85
  log = @log
67
86
 
68
87
  r = '[0-9\*,\?\/\-]+'
@@ -70,83 +89,83 @@ class ChronicCron
70
89
 
71
90
  # e.g. 00 5 15 * *
72
91
  get /(#{r}\s+#{r}\s+#{r}\s#{r}\s#{r})(\s#{r})?/ do
73
-
92
+
74
93
  puts 'ChronicCron#expressions 10' if @debug
75
-
94
+
76
95
  "%s%s" % params[:captures]
77
96
  end
78
97
 
79
98
  # e.g. 9:00-18:00 every day
80
99
  get /(\d{1,2}):(\d{1,2})-(\d{1,2}):\d{1,2}\s+#{daily}/ do
81
-
100
+
82
101
  puts 'ChronicCron#expressions 20' if @debug
83
-
102
+
84
103
  "%s %s-%s * * *" % params[:captures].values_at(1,0,2)
85
- end
104
+ end
86
105
 
87
106
  # e.g. every 30mins from 8:00am until 8:00pm mon-fri
88
- 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
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
89
108
  |interval_mins, r_hrs1, mins1, meridiem1, r_hrs2, meridiem2, wdays|
90
109
 
91
110
  hrs1 = meridiem1 == 'pm' ? r_hrs1.to_i + 12 : r_hrs1
92
111
  hrs2 = meridiem2 == 'pm' ? r_hrs2.to_i + 12 : r_hrs2
93
-
112
+
94
113
  puts 'ChronicCron#expressions 30' if @debug
95
-
114
+
96
115
  "%s/%s %s-%s * * %s" % [mins1.to_i, interval_mins, hrs1, hrs2, wdays]
97
- end
98
-
116
+ end
117
+
99
118
  # e.g. every 30mins from 8:00am until 8:00pm every day
100
- 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+#{daily}/ do
119
+ 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+#{daily}/ do
101
120
  |interval_mins, r_hrs1, mins1, meridiem1, r_hrs2, meridiem2|
102
121
  hrs1 = meridiem1 == 'pm' ? r_hrs1.to_i + 12 : r_hrs1
103
122
  hrs2 = meridiem2 == 'pm' ? r_hrs2.to_i + 12 : r_hrs2
104
-
123
+
105
124
  puts 'ChronicCron#expressions 40' if @debug
106
-
125
+
107
126
  "%s/%s %s-%s * * *" % [mins1.to_i, interval_mins, hrs1, hrs2]
108
- end
109
-
127
+ end
128
+
110
129
  # e.g. 8:00am until 8:00pm every day
111
- get /(\d{1,2}):(\d{1,2})([ap]m)(?:\s+until\s+|\s*-\s*)(\d{1,2}):\d{1,2}([ap]m)\s+#{daily}/ do
130
+ get /(\d{1,2}):(\d{1,2})([ap]m)(?:\s+until\s+|\s*-\s*)(\d{1,2}):\d{1,2}([ap]m)\s+#{daily}/ do
112
131
  |r_hrs1, mins1, meridiem1, r_hrs2, meridiem2|
113
132
  hrs1 = meridiem1 == 'pm' ? r_hrs1.to_i + 12 : r_hrs1
114
133
  hrs2 = meridiem2 == 'pm' ? r_hrs2.to_i + 12 : r_hrs2
115
-
134
+
116
135
  puts 'ChronicCron#expressions 50' if @debug
117
-
136
+
118
137
  "%s %s-%s * * *" % [mins1.to_i, hrs1, hrs2]
119
- end
138
+ end
120
139
 
121
140
  # e.g. 10:15am every day
122
141
  get /(\d{1,2}):?(\d{1,2})([ap]m)?\s+#{daily}/ do |raw_hrs, mins, meridiem|
123
142
  hrs = in24hrs(raw_hrs, meridiem)
124
-
143
+
125
144
  puts 'ChronicCron#expressions 60' if @debug
126
-
145
+
127
146
  "%s %s * * *" % [mins.to_i, hrs]
128
147
  end
129
148
 
130
149
  # e.g. at 7:30am Monday to Friday
131
- get /(\d{1,2}):?(\d{1,2})([ap]m)?\s+(\w+) to (\w+)/ do
150
+ get /(\d{1,2}):?(\d{1,2})([ap]m)?\s+(\w+) to (\w+)/ do
132
151
  |raw_hrs, mins, meridiem, wday1, wday2|
133
152
  hrs = in24hrs(raw_hrs, meridiem)
134
-
153
+
135
154
  puts 'ChronicCron#expressions 70' if @debug
136
-
155
+
137
156
  "%s %s * * %s-%s" % [mins.to_i, hrs , wday1, wday2]
138
- end
139
-
157
+ end
158
+
140
159
  # e.g. at 11:00 and 16:00 on every day
141
160
  get /(\d{1,2}):?(\d{1,2}) and (\d{1,2}):?\d{1,2} (?:on )?#{daily}/ do
142
-
161
+
143
162
  puts 'ChronicCron#expressions 80' if @debug
144
-
163
+
145
164
  "%s %s,%s * * *" % params[:captures].values_at(1,0,2)
146
165
  end
147
166
 
148
-
149
- get('hourly') {'0 * * * *'}
167
+
168
+ get('hourly') {'0 * * * *'}
150
169
  get('daily') {'0 0 * * *'}
151
170
  get('midnight') {'0 0 * * *'}
152
171
  get('weekly') {'0 0 * * 0'}
@@ -155,44 +174,44 @@ class ChronicCron
155
174
  get('annually') {'0 0 1 1 *'}
156
175
 
157
176
  weekday = '((?:mon|tue|wed|thu|fri|sat|sun)\w*)'
158
-
177
+
159
178
  # e.g. at 10:30pm on every Monday
160
- get /(\d{1,2}):?(\d{1,2})([ap]m)?\s+(?:on )?every #{weekday}/i do
161
- |raw_hrs, mins, meridiem, wday|
179
+ get /(\d{1,2}):?(\d{1,2})([ap]m)?\s+(?:on )?every #{weekday}/i do
180
+ |raw_hrs, mins, meridiem, wday|
162
181
  hrs = in24hrs(raw_hrs, meridiem)
163
-
182
+
164
183
  puts 'ChronicCron#expressions 90' if @debug
165
-
184
+
166
185
  "%s %s * * %s" % [mins, hrs , wday]
167
186
  end
168
-
187
+
169
188
  # e.g. at 10pm on every Monday
170
- get /(\d{1,2})([ap]m)?\s+(?:on )?every #{weekday}/i do
189
+ get /(\d{1,2})([ap]m)?\s+(?:on )?every #{weekday}/i do
171
190
  |raw_hrs, meridiem, wday|
172
191
  hrs = in24hrs(raw_hrs, meridiem)
173
-
192
+
174
193
  puts 'ChronicCron#expressions 100' if @debug
175
-
194
+
176
195
  "0 %s * * %s" % [hrs , wday]
177
- end
178
-
196
+ end
197
+
179
198
  # e.g. every 10 minutes
180
199
  get(/every (\d{1,2}) min(?:ute)?s?/){|mins| "*/%s * * * *" % [mins]}
181
200
  get(/every min(?:ute)?/){"* * * * *"}
182
-
201
+
183
202
  # e.g. every 2 hours
184
203
  get(/every (\d{1,2}) h(?:ou)?rs?/){|hrs| "* */%s * * *" % [hrs]}
185
204
  get(/every hour/){ "0 * * * *"}
186
-
205
+
187
206
  # e.g. every 2 days
188
207
  get(/every (\d{1,2}) days?/) do |days|
189
-
208
+
190
209
  log.info 'ChronicCron/expressions/get: r130' if log
191
210
  puts 'ChronicCron#expressions 150' if @debug
192
-
211
+
193
212
  "* * */%s * *" % [days]
194
213
  end
195
-
214
+
196
215
  get(/#{daily}/){ "0 0 * * *"}
197
216
 
198
217
  get /(?:any\s?time)?(?: today)? between (\S+) and (\S+)/ do |s1, s2|
@@ -203,12 +222,12 @@ class ChronicCron
203
222
  t
204
223
  end
205
224
  )
206
-
225
+
207
226
  puts 'ChronicCron#expressions 170' if @debug
208
-
227
+
209
228
  "%s %s %s %s *" % TimeToday.between(s1,s2).to_a[1..4]
210
229
  end
211
-
230
+
212
231
  get /any\s?time today/ do
213
232
  self.instance_eval %q(
214
233
  def next()
@@ -218,10 +237,10 @@ class ChronicCron
218
237
  end
219
238
  )
220
239
  puts 'ChronicCron#expressions 180' if @debug
221
-
240
+
222
241
  "%s %s %s %s *" % TimeToday.future.to_a[1..4]
223
242
  end
224
-
243
+
225
244
  # e.g. first thursday of each month at 7:30pm
226
245
  nday = '(\w+(?:st|rd|nd))\s+' + weekday + '\s+'
227
246
  get /#{nday}(?:of\s+)?(?:the|each|every)\s+month(?:\s+at\s+([^\s]+))?/i do
@@ -230,9 +249,9 @@ class ChronicCron
230
249
  month = @now.month
231
250
 
232
251
  h = {
233
- /first|1st/i => '1-7',
234
- /second|2nd/i => '8-14',
235
- /third|3rd/i => '15-21',
252
+ /first|1st/i => '1-7',
253
+ /second|2nd/i => '8-14',
254
+ /third|3rd/i => '15-21',
236
255
  /fourth|4th|last/i => '22-28'
237
256
  }
238
257
 
@@ -243,78 +262,80 @@ class ChronicCron
243
262
  raw_time ||= '6:00am'
244
263
 
245
264
  minute, hour = Chronic.parse(raw_time).to_a[1,2]
246
-
265
+
247
266
  puts 'ChronicCron#expressions 190' if @debug
248
-
267
+
249
268
  "%s %s %s * %s" % [minute, hour, day_range, wday]
250
269
 
251
270
  end
252
-
271
+
253
272
  # e.g. every tuesday at 4pm
254
273
  get /every\s+#{weekday}\s+(?:at\s+)?(\d{1,2})([ap]m)/i do
255
274
  |wday, raw_hrs, meridiem, |
256
275
 
257
- hrs = in24hrs(raw_hrs, meridiem)
258
-
276
+ hrs = in24hrs(raw_hrs, meridiem)
277
+
259
278
  puts 'ChronicCron#expressions 200' if @debug
260
-
279
+
261
280
  "0 %s * * %s" % [hrs , Date::DAYNAMES.index(wday.capitalize)]
262
281
  end
263
-
264
-
282
+
283
+
265
284
  # e.g. last sunday of March at 1am
266
-
285
+
267
286
  get /last (#{Date::DAYNAMES.join('|')}) (?:of|in) \
268
287
  (#{Date::MONTHNAMES[1..-1].join('|')})\s+at\s+(\d{1,2})(?::(\d{1,2}))?\
269
288
  ([ap]m)/i do |day, month, raw_hrs, mins, meridiem|
270
289
 
271
290
  now = Chronic.parse(month, now: @now)
272
-
291
+ puts ('now: ' + now.inspect).debug if @debug
292
+
273
293
  d = last_wdayofmonth(day, now)
294
+ puts ('d: ' + d.inspect).debug if @debug
274
295
 
275
296
  hrs = in24hrs(raw_hrs, meridiem)
276
-
297
+
277
298
  puts 'ChronicCron#expressions 210' if @debug
278
-
299
+
279
300
  "%s %s %s %s *" % [mins.to_i, hrs, d.day, d.month]
280
301
  end
281
-
302
+
282
303
  # e.g. last sunday of October
283
-
304
+
284
305
  get /last (#{Date::DAYNAMES.join('|')}) (?:of|in) \
285
306
  (#{Date::MONTHNAMES[1..-1].join('|')})/i do |day, month|
286
307
 
287
308
  now = Chronic.parse(month, now: @now)
288
309
 
289
310
  d = last_wdayofmonth(day, now)
290
-
311
+
291
312
  puts 'ChronicCron#expressions 220' if @debug
292
-
313
+
293
314
  "* * %s %s *" % [d.day, d.month]
294
315
  end
295
-
316
+
296
317
 
297
318
  # e.g. every 2nd tuesday at 4:40pm
298
319
  get /every\s+2nd\s+#{weekday}\s+at\s+(\d{1,2})(?::(\d{1,2}))?([ap]m)/i do
299
320
  |wday, raw_hrs, mins, meridiem, |
300
321
  hrs = in24hrs(raw_hrs, meridiem)
301
- log.info 'ChronicCron/expressions/get: r230' if log
302
-
303
- puts 'ChronicCron#expressions 220' if @debug
304
-
322
+ log.info 'ChronicCron/expressions/get: r225' if log
323
+
324
+ puts 'ChronicCron#expressions 225' if @debug
325
+
305
326
  "%s %s * * %s/2" % [mins.to_i, hrs , wday]
306
- end
307
-
327
+ end
328
+
308
329
  # e.g. every tuesday at 4:40pm
309
330
  get /every\s+#{weekday}\s+at\s+(\d{1,2}):(\d{1,2})([ap]m)/i do
310
331
  |wday, raw_hrs, mins, meridiem, |
311
332
  hrs = in24hrs(raw_hrs, meridiem)
312
-
333
+
313
334
  puts 'ChronicCron#expressions 230' if @debug
314
-
335
+
315
336
  "%s %s * * %s" % [mins, hrs , wday]
316
- end
317
-
337
+ end
338
+
318
339
 
319
340
  # e.g. every 2nd week at 6am starting from 7th Jan
320
341
  get /every 2nd week\s+at\s+([^\s]+)/ do |raw_time|
@@ -322,32 +343,62 @@ class ChronicCron
322
343
  t = Chronic.parse(raw_time, :now => @now)
323
344
  log.info 'ChronicCron/expressions/get: r250' if log
324
345
  puts 'ChronicCron#expressions 240' if @debug
325
-
346
+
326
347
  "%s %s * * %s/2" % [t.min,t.hour,t.wday]
327
348
 
328
- end
329
-
330
-
349
+ end
350
+
351
+
331
352
  # e.g. every 2nd monday
332
353
  get /every 2nd #{weekday}/ do |wday|
333
354
 
334
355
  puts 'ChronicCron#expressions 250' if @debug
335
356
  "* * * * %s/2" % [wday]
336
357
 
337
- end
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
338
381
 
339
382
  # e.g. every 2 weeks at 6am starting from 7th Jan
340
383
  get /^every (\w+) weeks(?:\s+at\s+([^\s]+))?/ do |interval, raw_time|
341
384
 
385
+ if @debug then
386
+ puts ('raw_time: ' + raw_time.inspect).debug
387
+ puts ('now: ' + @now.inspect).debug
388
+ end
389
+
342
390
  t = raw_time ? Chronic.parse(raw_time, :now => @now) : @now
343
391
  t += WEEK * interval.to_i until t > @now
344
392
  mins, hrs = t.to_a.values_at(1,2)
345
-
346
- log.info 'ChronicCron/expressions/get: r270' if log
347
- puts 'ChronicCron#expressions 270' if @debug
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
348
399
 
349
400
  "%s %s * * %s/%s" % [mins, hrs, t.wday, interval]
350
- end
401
+ end
351
402
 
352
403
 
353
404
  # e.g. starting 05-Aug@15:03 every 2 weeks
@@ -356,19 +407,19 @@ class ChronicCron
356
407
  t = Chronic.parse(raw_date, :now => @now)
357
408
  mins, hrs = t.to_a.values_at(1,2)
358
409
  puts 'ChronicCron#expressions 280' if @debug
359
-
410
+
360
411
  "%s %s * * %s/%s" % [mins, hrs, t.wday, interval]
361
- end
362
-
412
+ end
413
+
363
414
  # e.g. from 05-Aug@12:34 fortnightly
364
415
  get /(.*)\s+(?:biweekly|fortnightly)/ do |raw_date|
365
416
 
366
417
  t = Chronic.parse(raw_date, :now => @now)
367
418
  mins, hrs, day, month, year = t.to_a.values_at(1,2,3,4,5)
368
419
  puts 'ChronicCron#expressions 290' if @debug
369
-
420
+
370
421
  "%s %s %s %s %s/2 %s" % [mins, hrs, day, month, t.wday, year]
371
- end
422
+ end
372
423
 
373
424
  # e.g. from 06-Aug@1pm every week
374
425
  get /(.*)\s+(?:weekly|every week)/ do |raw_date|
@@ -376,52 +427,56 @@ class ChronicCron
376
427
  t = Chronic.parse(raw_date, :now => @now)
377
428
  mins, hrs, day, month, year = t.to_a.values_at(1,2,3,4,5)
378
429
  puts 'ChronicCron#expressions 300' if @debug
379
-
430
+
380
431
  "%s %s %s %s %s %s" % [mins, hrs, day, month, t.wday, year]
381
- end
382
-
432
+ end
433
+
383
434
  # e.g. every sunday
384
435
  get /every\s+#{weekday}/ do |wday|
385
-
436
+
386
437
  puts 'ChronicCron#expressions 310' if @debug
387
-
438
+
388
439
  "0 12 * * %s" % wday
389
- end
390
-
440
+ end
441
+
391
442
  # e.g. 04-Aug@12:34
392
443
  get '*' do
393
444
 
394
445
  t = Chronic.parse(params[:input], :now => @now)
395
446
  puts 'ChronicCron#expressions 330' if @debug
396
-
397
- "%s %s %s %s * %s" % t.to_a.values_at(1,2,3,4,5)
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
398
451
  end
399
452
 
400
453
  def in24hrs(raw_hrs, meridiem)
401
454
 
455
+ puts 'raw_hrs: ' + raw_hrs.inspect if @debug
456
+
402
457
  hrs = if meridiem == 'pm' then
403
- raw_hrs.to_i + 12
458
+ raw_hrs.to_i < 12 ? raw_hrs.to_i + 12 : raw_hrs.to_i
404
459
  else
405
460
  raw_hrs.to_i == 12 ? 0 : raw_hrs
406
461
  end
407
- end
462
+ end
408
463
  end
409
-
410
-
464
+
465
+
411
466
  alias find_expression run_route
412
-
467
+
413
468
  private
414
-
469
+
415
470
  def last_wdayofmonth(day, now)
416
-
471
+
417
472
  wday = Date::DAYNAMES.map(&:downcase).index(day)
418
473
 
419
474
  d2 = Date.today
420
475
  date = Date.civil(now.year, now.month, -1)
421
- date -= 1 until date.wday == wday
422
-
476
+ date -= 1 until date.wday == wday
477
+
423
478
  return date
424
-
479
+
425
480
  end
426
-
481
+
427
482
  end
data.tar.gz.sig CHANGED
Binary file
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.5.0
4
+ version: 0.7.0
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
- 8ixkARkWAmV1MB4XDTE3MTExNDIzMzEwNVoXDTE4MTExNDIzMzEwNVowSDESMBAG
16
- A1UEAwwJZ2VtbWFzdGVyMR4wHAYKCZImiZPyLGQBGRYOamFtZXNyb2JlcnRzb24x
17
- EjAQBgoJkiaJk/IsZAEZFgJldTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
18
- ggEBALoP6xDp6zr7JbSKtgrtFy1wXlw+gWUsUgo1HGm4JYsHi8EIiEqalydehRVy
19
- lND168CJmdruvmvO7bjfvNzGXrYO5mRAzL54PLr7lzEbHNS3Xpac6EBbz7vU4bqV
20
- Q1RGai6youjvBhH8AkUDKeVDu7oLYJhff7CIXH2QJH92XXVAO5RnY7u/K/lEjczZ
21
- 2bnw2R383aRi+6deHmzRtUK3nbQgxhZXcjm27Xb8aU+OPmmfvx/ZbdVxIb6SEVGO
22
- 964YEOiRX1KbbnifRtfKgLCySF59jZA7KIZNRGOkerfOCNrk/D8GVECWL5erLKbw
23
- FipxWxCgik/d53/Tj/rtVI9jfGsCAwEAAaOBijCBhzAJBgNVHRMEAjAAMAsGA1Ud
24
- DwQEAwIEsDAdBgNVHQ4EFgQU+n2rEOLx53rnpxbluXFisamq6cEwJgYDVR0RBB8w
25
- HYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0c29uLmV1MCYGA1UdEgQfMB2BG2dlbW1h
26
- c3RlckBqYW1lc3JvYmVydHNvbi5ldTANBgkqhkiG9w0BAQUFAAOCAQEAjcAZZRIC
27
- hlLlASQ8THr7VLOa09WmEhlQ8QPm8HwiKoN0dTrq7V+tXyVVagJeVK1Lz/bsE4D+
28
- qZdibGXJ6m4uF3V99qsu+3yQE6hJCT8WL1dc8V6Gv0SL/6aNU+0+wFxa2zPONhJ3
29
- kCK3BJoBrAF4DycYLZ7NNi9Gk2UjFery1+51XOozsnIjawiyS1x/vx6LgO+ZxDFy
30
- KLkHJMGcM015IMO7DrDYieCXK7FEJ1bF2OTF4nuOQo5TP7hFugK7sW7EC3kUVLly
31
- q95F5t9M4vy0Q8baeY7AJ7+f6Z5LLLCK4MyPO2y4aYy209dwdEY2zHZOA+CLkPEU
32
- p0BvK7yY4ZqPZw==
13
+ MIIEXjCCAsagAwIBAgIBATANBgkqhkiG9w0BAQsFADAsMSowKAYDVQQDDCFnZW1t
14
+ YXN0ZXIvREM9amFtZXNyb2JlcnRzb24vREM9ZXUwHhcNMjEwMjIzMTIwMDUxWhcN
15
+ MjIwMjIzMTIwMDUxWjAsMSowKAYDVQQDDCFnZW1tYXN0ZXIvREM9amFtZXNyb2Jl
16
+ cnRzb24vREM9ZXUwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQCjirUC
17
+ k7cKAs7ZfV4qGlKIc5eRA/6/kpqIpAb8+YDEIpS5shCWGrGfwRczcO2imBsEcpBb
18
+ Lj7T0ol0tw0124awanj9q7E+8eJSPwvNrP891onsuJz9VBclOWHFAk0hNrJNGMYE
19
+ feeUY+LJO2DL8lVZctqMQsNtlmFq3ISm0fE9U8Uy8vaSd8ocBoZNE+ttRcVR69/R
20
+ bSZJOa+b2SizTJyXs+ynE0MLrQI0Upk6Ze2Pha3Mkuzn9JN5ylPmF7u+Ylh8NtM8
21
+ C1s0tWl91nN45k3TJQzJCjtBoobl30Fp+mRc36BttLhVs6DNjgNTSWWISbw6yWun
22
+ yYi5nb+AgbwZIGUGeuXUpiWgPR9IKYw63LQCYUkLqhMzg91Yb7xZrvSi/CkqzE8I
23
+ ApelfP+IlFac/Sue0BL+YOqCgT1UMY7S73jjInppGYQh/FiTElfyEKZallSWV5BI
24
+ liIktwj2xfFTY+gMTVkOOdPfxluHYfY26zvgy2Amgtb+quzrvYK2n0wndn8CAwEA
25
+ AaOBijCBhzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIEsDAdBgNVHQ4EFgQUYicTvE9t
26
+ tQvwBoKkP+W51JemQaUwJgYDVR0RBB8wHYEbZ2VtbWFzdGVyQGphbWVzcm9iZXJ0
27
+ c29uLmV1MCYGA1UdEgQfMB2BG2dlbW1hc3RlckBqYW1lc3JvYmVydHNvbi5ldTAN
28
+ BgkqhkiG9w0BAQsFAAOCAYEAdbeP6iericAYpjgKrroRdFU+IXPXMwF48IoESx00
29
+ Wa4bqUsy+UnXe8mCP8VA2WK/4QJJKljU2hrS/9FumREOnwF4vPYnLVNJ8nITIpTh
30
+ 1DSDinlg/hhaW/0cUwdJrFttoFqfe4EC32VgZkFlXPCD90ZX3pda6n/I4uvUVujb
31
+ LZgwewGILIRZ2UfV4cPq9gVJRMuL0Dz/9C5t0jjrXuQpScSKyZ814bBv4mvh1xWm
32
+ WEnkNkO9YKsS1PqWy3tVYd2hgfTGXRJk/THYT2Qyj07z2ksG8FzsjhV7VeKZmkBf
33
+ ow4kIK/ches8x97aJ5zbrHwK+he3lLFThcvjAJ0GbwYZrCuDaXIxBj0k+R4lWUpp
34
+ G6VQycIWs0Nb6F5NLLSO4k/mtOduJhmyPWkL3R/KMChXk0hu8xM2Orw1CpipzAX+
35
+ Yot8KuDDSCrW7txuQr8nBdP8TtGBceStvkqoqSGvzsppfoAzykAkc8zujoN1s8d2
36
+ ioSUG4tmSnO/l+mykryWcbFA
33
37
  -----END CERTIFICATE-----
34
- date: 2018-10-27 00:00:00.000000000 Z
38
+ date: 2022-02-02 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.4'
63
64
  - - ">="
64
65
  - !ruby/object:Gem::Version
65
- version: 0.4.0
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.4'
73
74
  - - ">="
74
75
  - !ruby/object:Gem::Version
75
- version: 0.4.0
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,24 +101,24 @@ 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
- email: james@jamesrobertson.eu
121
+ email: digital.robertson@gmail.com
118
122
  executables: []
119
123
  extensions: []
120
124
  extra_rdoc_files: []
@@ -140,7 +144,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
140
144
  version: '0'
141
145
  requirements: []
142
146
  rubyforge_project:
143
- rubygems_version: 2.7.6
147
+ rubygems_version: 2.7.10
144
148
  signing_key:
145
149
  specification_version: 4
146
150
  summary: Converts a human-readable time (e.g. 10:15 daily) into a cron format (e,g,
metadata.gz.sig CHANGED
Binary file