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