fugit 1.3.4 → 1.3.5
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of fugit might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/CREDITS.md +1 -1
- data/lib/fugit.rb +1 -1
- data/lib/fugit/cron.rb +1 -0
- data/lib/fugit/nat.rb +183 -94
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d2a28ef486584f37659fbcf4e6e4fecfc76aa2a4a6e1fc61d25dd3c44cd3a5c3
|
4
|
+
data.tar.gz: db726ca071f0f98d0f59c3054fca04a537ec2a17fd302013b354d90e1d7dc3c8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d1105627f83fd730a7826047679edfd38ad7deb19960715e93769d5c04e80e0079b02b9513f9e5d01614e2e70b75a016a2e16b7a72f568e2a5d3072c42e7e1dc
|
7
|
+
data.tar.gz: eb4b14f1f564bd89ae919c16d6c06ef180b725c81b8d78225661b0a0fb34dee067063de9f2b883e6361e51c0db323224b6ee0a80ab3ca80dd9091a0e872ceae4
|
data/CHANGELOG.md
CHANGED
data/CREDITS.md
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
* Dominik Sander https://github.com/dsander #rough_frequency 0, gh-36
|
5
5
|
* Milovan Zogovic https://github.com/assembler Cron#match? vs TZ, gh-31
|
6
6
|
* Jessica Stokes https://github.com/ticky 0-24 issue with cron, gh-30
|
7
|
-
* Shai Coleman https://github.com/shaicoleman parse_nat enhancements, gh-24, gh-25, and gh-
|
7
|
+
* Shai Coleman https://github.com/shaicoleman parse_nat enhancements, gh-24, gh-25, gh-28, and gh-37
|
8
8
|
* Jan Stevens https://github.com/JanStevens Fugit.parse('every 15 minutes') gh-22
|
9
9
|
* Fabio Pitino https://github.com/hspazio nil on February 30 gh-21
|
10
10
|
* Cristian Oneț https://github.com/conet #previous_time vs 1/-1 endless loop gh-15
|
data/lib/fugit.rb
CHANGED
data/lib/fugit/cron.rb
CHANGED
data/lib/fugit/nat.rb
CHANGED
@@ -15,6 +15,7 @@ module Fugit
|
|
15
15
|
return nil unless s.is_a?(String)
|
16
16
|
|
17
17
|
#p s; Raabro.pp(Parser.parse(s, debug: 3), colours: true)
|
18
|
+
#(p s; Raabro.pp(Parser.parse(s, debug: 1), colours: true)) rescue nil
|
18
19
|
a = Parser.parse(s)
|
19
20
|
|
20
21
|
return nil unless a
|
@@ -37,20 +38,16 @@ module Fugit
|
|
37
38
|
|
38
39
|
def parse_crons(s, a, opts)
|
39
40
|
|
40
|
-
|
41
|
-
.partition { |e| e[0] == :
|
42
|
-
ms =
|
43
|
-
.inject({}) { |h,
|
41
|
+
hms, aa = a
|
42
|
+
.partition { |e| e[0] == :point && e[1][0] == :hour }
|
43
|
+
ms = hms
|
44
|
+
.inject({}) { |h, e| (h[e[1][1]] ||= []) << e[1][2]; h }
|
44
45
|
.values
|
45
46
|
.uniq
|
46
|
-
|
47
47
|
crons =
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
else
|
52
|
-
dhs.collect { |dh| parse_cron([ dh ] + aa, opts) }
|
53
|
-
end
|
48
|
+
ms.size > 1 ?
|
49
|
+
hms.collect { |e| parse_cron([ e ] + aa, opts) } :
|
50
|
+
[ parse_cron(a, opts) ]
|
54
51
|
|
55
52
|
fail ArgumentError.new(
|
56
53
|
"multiple crons in #{s.inspect} " +
|
@@ -66,34 +63,36 @@ module Fugit
|
|
66
63
|
|
67
64
|
def parse_cron(a, opts)
|
68
65
|
|
69
|
-
h = { min: nil, hou:
|
66
|
+
h = { min: nil, hou: nil, dom: nil, mon: nil, dow: nil }
|
70
67
|
hkeys = h.keys
|
71
68
|
|
69
|
+
i0s, es = a.partition { |e| e[0] == :interval0 }
|
70
|
+
a = es + i0s
|
71
|
+
# interval0s are fallback
|
72
|
+
|
72
73
|
a.each do |key, val|
|
73
|
-
|
74
|
+
case key
|
75
|
+
when :biz_day
|
74
76
|
(h[:dow] ||= []) << '1-5'
|
75
|
-
|
76
|
-
h[:hou] << val
|
77
|
-
elsif key == :digital_hour
|
78
|
-
(h[:hou] ||= []) << val[0].to_i
|
79
|
-
(h[:min] ||= []) << val[1].to_i
|
80
|
-
elsif key == :name_day
|
77
|
+
when :name_day
|
81
78
|
(h[:dow] ||= []) << val
|
82
|
-
|
79
|
+
when :day_range
|
83
80
|
(h[:dow] ||= []) << val.collect { |v| v.to_s[0, 3] }.join('-')
|
84
|
-
|
81
|
+
when :tz
|
85
82
|
h[:tz] = val
|
86
|
-
|
87
|
-
|
83
|
+
when :point
|
84
|
+
process_point(h, *val)
|
85
|
+
when :interval1
|
86
|
+
process_interval1(h, *val[0].to_h.first)
|
87
|
+
when :interval0
|
88
|
+
process_interval0(h, val)
|
88
89
|
end
|
89
90
|
end
|
90
91
|
|
91
|
-
h[:
|
92
|
-
h[:min].uniq!
|
93
|
-
|
94
|
-
h[:hou].uniq!;
|
95
|
-
h[:hou].sort!
|
92
|
+
return nil if h[:fail]
|
96
93
|
|
94
|
+
h[:min] = (h[:min] || [ 0 ]).uniq
|
95
|
+
h[:hou] = (h[:hou] || []).uniq.sort
|
97
96
|
h[:dow].sort! if h[:dow]
|
98
97
|
|
99
98
|
a = hkeys
|
@@ -108,40 +107,92 @@ module Fugit
|
|
108
107
|
Fugit::Cron.parse(s)
|
109
108
|
end
|
110
109
|
|
111
|
-
def
|
112
|
-
|
113
|
-
send("process_duration_#{interval}", h, value)
|
114
|
-
end
|
115
|
-
|
116
|
-
def process_duration_mon(h, value)
|
110
|
+
def process_point(h, key, *value)
|
117
111
|
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
112
|
+
case key
|
113
|
+
when :hour
|
114
|
+
v0, v1 = value
|
115
|
+
v0 = v0.to_i if v0.is_a?(String) && v0.match(/^\d+$/)
|
116
|
+
(h[:hou] ||= []) << v0
|
117
|
+
(h[:min] ||= []) << v1.to_i if v1
|
118
|
+
when :sec, :min
|
119
|
+
(h[key] ||= []) << value[0]
|
120
|
+
end
|
127
121
|
end
|
128
122
|
|
129
|
-
def
|
130
|
-
|
131
|
-
|
123
|
+
def process_interval0(h, value)
|
124
|
+
|
125
|
+
case value
|
126
|
+
when 'sec', 'second'
|
127
|
+
h[:min] = [ '*' ]
|
128
|
+
h[:sec] = [ '*' ]
|
129
|
+
when 'min', 'minute'
|
130
|
+
h[:min] = [ '*' ]
|
131
|
+
when 'hour'
|
132
|
+
unless h[:min] || h[:hou]
|
133
|
+
h[:min] = [ 0 ]
|
134
|
+
h[:hou] = [ '*' ]
|
135
|
+
end
|
136
|
+
when 'day'
|
137
|
+
unless h[:min] || h[:hou]
|
138
|
+
h[:min] = [ 0 ]
|
139
|
+
h[:hou] = [ 0 ]
|
140
|
+
end
|
141
|
+
when 'week'
|
142
|
+
unless h[:min] || h[:hou] || h[:dow]
|
143
|
+
h[:min] = [ 0 ]
|
144
|
+
h[:hou] = [ 0 ]
|
145
|
+
h[:dow] = [ 0 ]
|
146
|
+
end
|
147
|
+
when 'month'
|
148
|
+
unless h[:min] || h[:hou]
|
149
|
+
h[:min] = [ 0 ]
|
150
|
+
h[:hou] = [ 0 ]
|
151
|
+
end
|
152
|
+
(h[:dom] ||= []) << 1
|
153
|
+
when 'year'
|
154
|
+
unless h[:min] || h[:hou]
|
155
|
+
h[:min] = [ 0 ]
|
156
|
+
h[:hou] = [ 0 ]
|
157
|
+
end
|
158
|
+
(h[:dom] ||= []) << 1
|
159
|
+
(h[:mon] ||= []) << 1
|
160
|
+
end
|
132
161
|
end
|
133
162
|
|
134
|
-
def
|
135
|
-
|
136
|
-
h[:hou] = [ '*' ]
|
137
|
-
h[:min] = [ value == 1 ? '*' : "*/#{value}" ]
|
138
|
-
end
|
163
|
+
def process_interval1(h, interval, value)
|
139
164
|
|
140
|
-
|
165
|
+
if value != 1 && [ :yea, :wee ].include?(interval)
|
166
|
+
int = interval == :year ? 'years' : 'weeks'
|
167
|
+
h[:fail] = "cannot cron for \"every #{value} #{int}\""
|
168
|
+
return
|
169
|
+
end
|
141
170
|
|
142
|
-
|
143
|
-
|
144
|
-
|
171
|
+
case interval
|
172
|
+
when :yea
|
173
|
+
h[:hou] = [ 0 ]
|
174
|
+
h[:mon] = [ 1 ]
|
175
|
+
h[:dom] = [ 1 ]
|
176
|
+
when :mon
|
177
|
+
h[:hou] = [ 0 ]
|
178
|
+
h[:dom] = [ 1 ]
|
179
|
+
h[:mon] = [ value == 1 ? '*' : "*/#{value}" ]
|
180
|
+
when :wee
|
181
|
+
h[:hou] = [ 0 ]
|
182
|
+
h[:dow] = [ 0 ] # Sunday
|
183
|
+
when :day
|
184
|
+
h[:hou] = [ 0 ]
|
185
|
+
h[:dom] = [ value == 1 ? '*' : "*/#{value}" ]
|
186
|
+
when :hou
|
187
|
+
h[:hou] = [ value == 1 ? '*' : "*/#{value}" ]
|
188
|
+
when :min
|
189
|
+
h[:hou] = [ '*' ]
|
190
|
+
h[:min] = [ value == 1 ? '*' : "*/#{value}" ]
|
191
|
+
when :sec
|
192
|
+
h[:hou] = [ '*' ]
|
193
|
+
h[:min] = [ '*' ]
|
194
|
+
h[:sec] = [ value == 1 ? '*' : "*/#{value}" ]
|
195
|
+
end
|
145
196
|
end
|
146
197
|
end
|
147
198
|
|
@@ -160,6 +211,11 @@ module Fugit
|
|
160
211
|
|
161
212
|
# piece parsers bottom to top
|
162
213
|
|
214
|
+
def interval0(i)
|
215
|
+
rex(:interval0, i,
|
216
|
+
/(year|month|week|day|hour|min(ute)?|sec(ond)?)(?![a-z])/i)
|
217
|
+
end
|
218
|
+
|
163
219
|
def am_pm(i)
|
164
220
|
rex(:am_pm, i, / *(am|pm)/i)
|
165
221
|
end
|
@@ -186,7 +242,6 @@ module Fugit
|
|
186
242
|
rex(:name_hour, i, /(#{NHOURS.keys.join('|')})/i)
|
187
243
|
end
|
188
244
|
|
189
|
-
def plain_day(i); rex(:plain_day, i, /day/i); end
|
190
245
|
def biz_day(i); rex(:biz_day, i, /(biz|business|week) *day/i); end
|
191
246
|
def name_day(i); rex(:name_day, i, /#{WEEKDAYS.reverse.join('|')}/i); end
|
192
247
|
|
@@ -204,26 +259,36 @@ module Fugit
|
|
204
259
|
end
|
205
260
|
def _tz(i); alt(:tz, i, :_tz_delta, :_tz_name); end
|
206
261
|
|
207
|
-
def
|
208
|
-
rex(
|
209
|
-
:duration, i,
|
262
|
+
def interval1(i)
|
263
|
+
rex(:interval1, i,
|
210
264
|
/
|
211
265
|
\d+
|
212
266
|
\s?
|
213
|
-
(
|
267
|
+
(y(ears?)?|months?|w(eeks?)?|d(ays?)?|
|
268
|
+
h(ours?)?|m(in(ute)?s?)?|s(ec(ond)?s?)?)
|
214
269
|
/ix)
|
215
270
|
end
|
216
271
|
|
272
|
+
def min_or_sec(i)
|
273
|
+
rex(:min_or_sec, i, /(min(ute)?|sec(ond)?)\s+\d+/i)
|
274
|
+
end
|
275
|
+
|
276
|
+
def point(i)
|
277
|
+
alt(:point, i,
|
278
|
+
:min_or_sec,
|
279
|
+
:name_hour, :numeral_hour, :digital_hour, :simple_hour)
|
280
|
+
end
|
281
|
+
|
217
282
|
def flag(i); rex(:flag, i, /(every|from|at|after|on|in)/i); end
|
218
283
|
|
219
284
|
def datum(i)
|
220
285
|
alt(nil, i,
|
221
|
-
:day_range,
|
222
|
-
:plain_day, :biz_day, :name_day,
|
223
|
-
:_tz,
|
224
286
|
:flag,
|
225
|
-
:
|
226
|
-
:
|
287
|
+
:interval1,
|
288
|
+
:point,
|
289
|
+
:interval0,
|
290
|
+
:day_range, :biz_day, :name_day,
|
291
|
+
:_tz)
|
227
292
|
end
|
228
293
|
|
229
294
|
def sugar(i); rex(nil, i, /(and|or|[, \t]+)/i); end
|
@@ -233,38 +298,62 @@ module Fugit
|
|
233
298
|
|
234
299
|
# rewrite parsed tree
|
235
300
|
|
301
|
+
def _rewrite(t)
|
302
|
+
[ t.name, t.string.downcase ]
|
303
|
+
end
|
304
|
+
alias rewrite_flag _rewrite
|
305
|
+
alias rewrite_interval0 _rewrite
|
306
|
+
alias rewrite_biz_day _rewrite
|
307
|
+
|
308
|
+
def rewrite_name_day(t)
|
309
|
+
[ :name_day, WEEKDAYS.index(t.string.downcase[0, 3]) ]
|
310
|
+
end
|
311
|
+
|
312
|
+
def rewrite_day_range(t)
|
313
|
+
[ :day_range, t.subgather(nil).collect { |st| st.string.downcase } ]
|
314
|
+
end
|
315
|
+
|
316
|
+
def rewrite_name_hour(t)
|
317
|
+
[ :hour, *NHOURS[t.string.strip.downcase] ]
|
318
|
+
end
|
319
|
+
def rewrite_numeral_hour(t)
|
320
|
+
vs = t.subgather(nil).collect { |st| st.string.downcase.strip }
|
321
|
+
v = NUMS.index(vs[0])
|
322
|
+
v += 12 if vs[1] == 'pm'
|
323
|
+
[ :hour, v, 0 ]
|
324
|
+
end
|
325
|
+
def rewrite_simple_hour(t)
|
326
|
+
vs = t.subgather(nil).collect { |st| st.string.downcase.strip }
|
327
|
+
v = vs[0].to_i
|
328
|
+
v += 12 if vs[1] == 'pm'
|
329
|
+
[ :hour, v, 0 ]
|
330
|
+
end
|
331
|
+
def rewrite_digital_hour(t)
|
332
|
+
v = t.string.gsub(/:/, '')
|
333
|
+
[ :hour, v[0, 2], v[2, 2] ]
|
334
|
+
end
|
335
|
+
|
336
|
+
def rewrite_min_or_sec(t)
|
337
|
+
unit, num = t.string.split(/\s+/)
|
338
|
+
[ unit[0, 3].to_sym, num.to_i ]
|
339
|
+
end
|
340
|
+
|
341
|
+
def rewrite_point(t)
|
342
|
+
[ :point, rewrite(t.sublookup) ]
|
343
|
+
end
|
344
|
+
|
345
|
+
def rewrite_tz(t)
|
346
|
+
[ :tz, [ t.string.strip, EtOrbi.get_tzone(t.string.strip) ] ]
|
347
|
+
end
|
348
|
+
|
349
|
+
def rewrite_interval1(t)
|
350
|
+
[ t.name, [ Fugit::Duration.parse(t.string.strip) ] ]
|
351
|
+
end
|
352
|
+
|
236
353
|
def rewrite_nat(t)
|
237
354
|
|
238
355
|
#Raabro.pp(t, colours: true)
|
239
|
-
t
|
240
|
-
.subgather(nil)
|
241
|
-
.collect { |tt|
|
242
|
-
|
243
|
-
k = tt.name
|
244
|
-
v = tt.string.downcase
|
245
|
-
|
246
|
-
case k
|
247
|
-
when :tz
|
248
|
-
[ k, [ tt.string.strip, EtOrbi.get_tzone(tt.string.strip) ] ]
|
249
|
-
when :duration
|
250
|
-
[ k, [ Fugit::Duration.parse(tt.string.strip) ] ]
|
251
|
-
when :digital_hour
|
252
|
-
v = v.gsub(/:/, '')
|
253
|
-
[ k, [ v[0, 2], v[2, 2] ] ]
|
254
|
-
when :name_hour
|
255
|
-
[ :digital_hour, NHOURS[v] ]
|
256
|
-
when :name_day
|
257
|
-
[ k, WEEKDAYS.index(v[0, 3]) ]
|
258
|
-
when :day_range
|
259
|
-
[ k, tt.subgather(nil).collect { |st| st.string.downcase } ]
|
260
|
-
when :numeral_hour, :simple_hour
|
261
|
-
vs = tt.subgather(nil).collect { |ttt| ttt.string.downcase.strip }
|
262
|
-
v = k == :simple_hour ? vs[0].to_i : NUMS.index(vs[0])
|
263
|
-
v += 12 if vs[1] == 'pm'
|
264
|
-
[ k, v ]
|
265
|
-
else
|
266
|
-
[ k, v ]
|
267
|
-
end }
|
356
|
+
t.subgather(nil).collect { |tt| rewrite(tt) }
|
268
357
|
end
|
269
358
|
end
|
270
359
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fugit
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Mettraux
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-05-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: raabro
|