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 +4 -4
- checksums.yaml.gz.sig +0 -0
- data/lib/chronic_cron.rb +192 -137
- data.tar.gz.sig +0 -0
- metadata +42 -38
- 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: 71cb9fbaff016e7cf04a40aa56dedba54844753254825889c6e1525aa680be7b
|
4
|
+
data.tar.gz: e5b614c4fdd6c3935eb7276387206c6b1e5ed90cf84c18c1a16ef8819fd6c318
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
|
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
|
-
|
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
|
-
|
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:
|
302
|
-
|
303
|
-
puts 'ChronicCron#expressions
|
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
|
-
|
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
|
-
|
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.
|
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
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
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:
|
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.
|
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.
|
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:
|
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.
|
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
|