parse-cron 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/.gitignore +1 -0
- data/lib/cron_parser.rb +36 -8
- data/lib/parse-cron/version.rb +1 -1
- data/spec/cron_parser_spec.rb +100 -38
- metadata +5 -9
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
NDU3MTY0MGQ1YWE1YTlmNjVhODMzZDk2MjgxMzFiMDNhOGE2OWNmNA==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
OGQ0ZmJlMTZlNTU0MDk1YmY4YjFhMzBhNWE4YTM2N2VjNDg2Yjc3MA==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
Mzg4N2NiZTNhNWI2NDcwYTEwNTJkMGU5NDI3ZGRmMmVmOTkwY2E4ZGZmOGY5
|
10
|
+
MjQ0NDI2YTA5N2Y2YWUzNmRlZTNjOGM3NmUyMmIzY2YxOWRlZWJiMGIwYmQ1
|
11
|
+
YzE5YmIzMDc0NGM4ZTYzZWJiYWQ3MWM1NTA4NWIzN2U4MGQ3NDM=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
ODRhNDM0ZTUyOTBlN2ZhNzkzNjc0NzdhYTA2NTMzY2ZjZTQ0MTVjZTE4ZDM4
|
14
|
+
YTBjNWQ2MzFkMmFmYjk0YjdmZjA3NzlmZWUxYzIyNGQyNWRhNDUyMDk4NGY4
|
15
|
+
NDQzNTMxMThlMDllYzgzODJjMmNkYTkxZDc1MTFiMDk3OTg0OTc=
|
data/.gitignore
CHANGED
data/lib/cron_parser.rb
CHANGED
@@ -52,15 +52,34 @@ class CronParser
|
|
52
52
|
}
|
53
53
|
|
54
54
|
def initialize(source,time_source = Time)
|
55
|
-
@source = source
|
55
|
+
@source = interpret_vixieisms(source)
|
56
56
|
@time_source = time_source
|
57
57
|
validate_source
|
58
58
|
end
|
59
|
+
|
60
|
+
def interpret_vixieisms(spec)
|
61
|
+
case spec
|
62
|
+
when '@reboot'
|
63
|
+
raise ArgumentError, "Can't predict last/next run of @reboot"
|
64
|
+
when '@yearly', '@annually'
|
65
|
+
'0 0 1 1 *'
|
66
|
+
when '@monthly'
|
67
|
+
'0 0 1 * *'
|
68
|
+
when '@weekly'
|
69
|
+
'0 0 * * 0'
|
70
|
+
when '@daily', '@midnight'
|
71
|
+
'0 0 * * *'
|
72
|
+
when '@hourly'
|
73
|
+
'0 * * * *'
|
74
|
+
else
|
75
|
+
spec
|
76
|
+
end
|
77
|
+
end
|
59
78
|
|
60
79
|
|
61
80
|
# returns the next occurence after the given date
|
62
81
|
def next(now = @time_source.now)
|
63
|
-
t = InternalTime.new(now
|
82
|
+
t = InternalTime.new(now, @time_source)
|
64
83
|
|
65
84
|
unless time_specs[:month][0].include?(t.month)
|
66
85
|
nudge_month(t)
|
@@ -123,18 +142,18 @@ class CronParser
|
|
123
142
|
[$1.to_i]
|
124
143
|
end
|
125
144
|
else
|
126
|
-
raise "Bad Vixie-style specification #{subel}"
|
145
|
+
raise ArgumentError, "Bad Vixie-style specification #{subel}"
|
127
146
|
end
|
128
147
|
end
|
129
148
|
end.flatten.sort
|
130
149
|
|
131
|
-
[Set.new(values), values]
|
150
|
+
[Set.new(values), values, elem]
|
132
151
|
end
|
133
152
|
|
134
153
|
|
135
154
|
protected
|
136
155
|
|
137
|
-
# returns a list of days which do both match time_spec[:dom]
|
156
|
+
# returns a list of days which do both match time_spec[:dom] or time_spec[:dow]
|
138
157
|
def interpolate_weekdays(year, month)
|
139
158
|
@_interpolate_weekdays_cache ||= {}
|
140
159
|
@_interpolate_weekdays_cache["#{year}-#{month}"] ||= interpolate_weekdays_without_cache(year, month)
|
@@ -142,12 +161,21 @@ class CronParser
|
|
142
161
|
|
143
162
|
def interpolate_weekdays_without_cache(year, month)
|
144
163
|
t = Date.new(year, month, 1)
|
145
|
-
valid_mday = time_specs[:dom]
|
146
|
-
valid_wday = time_specs[:dow]
|
164
|
+
valid_mday, _, mday_field = time_specs[:dom]
|
165
|
+
valid_wday, _, wday_field = time_specs[:dow]
|
166
|
+
|
167
|
+
# Careful, if both DOW and DOM fields are non-wildcard,
|
168
|
+
# then we only need to match *one* for cron to run the job:
|
169
|
+
if not (mday_field == '*' and wday_field == '*')
|
170
|
+
valid_mday = [] if mday_field == '*'
|
171
|
+
valid_wday = [] if wday_field == '*'
|
172
|
+
end
|
173
|
+
# Careful: crontabs may use either 0 or 7 for Sunday:
|
174
|
+
valid_wday << 0 if valid_wday.include?(7)
|
147
175
|
|
148
176
|
result = []
|
149
177
|
while t.month == month
|
150
|
-
result << t.mday if valid_mday.include?(t.mday)
|
178
|
+
result << t.mday if valid_mday.include?(t.mday) || valid_wday.include?(t.wday)
|
151
179
|
t = t.succ
|
152
180
|
end
|
153
181
|
|
data/lib/parse-cron/version.rb
CHANGED
data/spec/cron_parser_spec.rb
CHANGED
@@ -26,26 +26,57 @@ end
|
|
26
26
|
|
27
27
|
describe "CronParser#next" do
|
28
28
|
[
|
29
|
-
["* * * * *",
|
30
|
-
["* * * * *",
|
31
|
-
["* * * * *",
|
32
|
-
["*/15 * * * *",
|
33
|
-
["*/15,25 * * * *",
|
34
|
-
["30 3,6,9 * * *",
|
35
|
-
["30 9 * * *",
|
36
|
-
["30 9 * * *",
|
37
|
-
["30 9 * * *",
|
38
|
-
["0 9 * * *",
|
39
|
-
["* * 12 * *",
|
40
|
-
["* * * * 1,3",
|
41
|
-
["* * * * MON,WED",
|
42
|
-
["0 0 1 1 *",
|
43
|
-
["0 0 * * 1",
|
44
|
-
["0 0 * * 1",
|
45
|
-
["45 23 7 3 *",
|
46
|
-
["0 0 1 jun *",
|
47
|
-
["0 0 1 may,jul *",
|
48
|
-
["0 0 1 MAY,JUL *",
|
29
|
+
["* * * * *", "2011-08-15 12:00", "2011-08-15 12:01"],
|
30
|
+
["* * * * *", "2011-08-15 02:25", "2011-08-15 02:26"],
|
31
|
+
["* * * * *", "2011-08-15 02:59", "2011-08-15 03:00"],
|
32
|
+
["*/15 * * * *", "2011-08-15 02:02", "2011-08-15 02:15"],
|
33
|
+
["*/15,25 * * * *", "2011-08-15 02:15", "2011-08-15 02:25"],
|
34
|
+
["30 3,6,9 * * *", "2011-08-15 02:15", "2011-08-15 03:30"],
|
35
|
+
["30 9 * * *", "2011-08-15 10:15", "2011-08-16 09:30"],
|
36
|
+
["30 9 * * *", "2011-08-31 10:15", "2011-09-01 09:30"],
|
37
|
+
["30 9 * * *", "2011-09-30 10:15", "2011-10-01 09:30"],
|
38
|
+
["0 9 * * *", "2011-12-31 10:15", "2012-01-01 09:00"],
|
39
|
+
["* * 12 * *", "2010-04-15 10:15", "2010-05-12 00:00"],
|
40
|
+
["* * * * 1,3", "2010-04-15 10:15", "2010-04-19 00:00"],
|
41
|
+
["* * * * MON,WED", "2010-04-15 10:15", "2010-04-19 00:00"],
|
42
|
+
["0 0 1 1 *", "2010-04-15 10:15", "2011-01-01 00:00"],
|
43
|
+
["0 0 * * 1", "2011-08-01 00:00", "2011-08-08 00:00"],
|
44
|
+
["0 0 * * 1", "2011-07-25 00:00", "2011-08-01 00:00"],
|
45
|
+
["45 23 7 3 *", "2011-01-01 00:00", "2011-03-07 23:45"],
|
46
|
+
["0 0 1 jun *", "2013-05-14 11:20", "2013-06-01 00:00"],
|
47
|
+
["0 0 1 may,jul *", "2013-05-14 15:00", "2013-07-01 00:00"],
|
48
|
+
["0 0 1 MAY,JUL *", "2013-05-14 15:00", "2013-07-01 00:00"],
|
49
|
+
["40 5 * * *", "2014-02-01 15:56", "2014-02-02 05:40"],
|
50
|
+
["0 5 * * 1", "2014-02-01 15:56", "2014-02-03 05:00"],
|
51
|
+
["10 8 15 * *", "2014-02-01 15:56", "2014-02-15 08:10"],
|
52
|
+
["50 6 * * 1", "2014-02-01 15:56", "2014-02-03 06:50"],
|
53
|
+
["1 2 * apr mOn", "2014-02-01 15:56", "2014-04-07 02:01"],
|
54
|
+
["1 2 3 4 7", "2014-02-01 15:56", "2014-04-03 02:01"],
|
55
|
+
["1 2 3 4 7", "2014-04-04 15:56", "2014-04-06 02:01"],
|
56
|
+
["1-20/3 * * * *", "2014-02-01 15:56", "2014-02-01 16:01"],
|
57
|
+
["1,2,3 * * * *", "2014-02-01 15:56", "2014-02-01 16:01"],
|
58
|
+
["1-9,15-30 * * * *", "2014-02-01 15:56", "2014-02-01 16:01"],
|
59
|
+
["1-9/3,15-30/4 * * * *", "2014-02-01 15:56", "2014-02-01 16:01"],
|
60
|
+
["1 2 3 jan mon", "2014-02-01 15:56", "2015-01-03 02:01"],
|
61
|
+
["1 2 3 4 mON", "2014-02-01 15:56", "2014-04-03 02:01"],
|
62
|
+
["1 2 3 jan 5", "2014-02-01 15:56", "2015-01-02 02:01"],
|
63
|
+
["@yearly", "2014-02-01 15:56", "2015-01-01 00:00"],
|
64
|
+
["@annually", "2014-02-01 15:56", "2015-01-01 00:00"],
|
65
|
+
["@monthly", "2014-02-01 15:56", "2014-03-01 00:00"],
|
66
|
+
["@weekly", "2014-02-01 15:56", "2014-02-02 00:00"],
|
67
|
+
["@daily", "2014-02-01 15:56", "2014-02-02 00:00"],
|
68
|
+
["@midnight", "2014-02-01 15:56", "2014-02-02 00:00"],
|
69
|
+
["@hourly", "2014-02-01 15:56", "2014-02-01 16:00"],
|
70
|
+
["*/3 * * * *", "2014-02-01 15:56", "2014-02-01 15:57"],
|
71
|
+
["0 5 * 2,3 *", "2014-02-01 15:56", "2014-02-02 05:00"],
|
72
|
+
["15-59/15 * * * *", "2014-02-01 15:56", "2014-02-01 16:15"],
|
73
|
+
["15-59/15 * * * *", "2014-02-01 15:00", "2014-02-01 15:15"],
|
74
|
+
["15-59/15 * * * *", "2014-02-01 15:01", "2014-02-01 15:15"],
|
75
|
+
["15-59/15 * * * *", "2014-02-01 15:16", "2014-02-01 15:30"],
|
76
|
+
["15-59/15 * * * *", "2014-02-01 15:26", "2014-02-01 15:30"],
|
77
|
+
["15-59/15 * * * *", "2014-02-01 15:36", "2014-02-01 15:45"],
|
78
|
+
["15-59/15 * * * *", "2014-02-01 15:45", "2014-02-01 16:15"],
|
79
|
+
["15-59/15 * * * *", "2014-02-01 15:46", "2014-02-01 16:15"],
|
49
80
|
].each do |line, now, expected_next|
|
50
81
|
it "should return #{expected_next} for '#{line}' when now is #{now}" do
|
51
82
|
now = parse_date(now)
|
@@ -60,24 +91,55 @@ end
|
|
60
91
|
|
61
92
|
describe "CronParser#last" do
|
62
93
|
[
|
63
|
-
["* * * * *",
|
64
|
-
["* * * * *",
|
65
|
-
["* * * * *",
|
66
|
-
["*/15 * * * *",
|
67
|
-
["*/15,45 * * * *",
|
68
|
-
["*/15,25 * * * *",
|
69
|
-
["30 3,6,9 * * *",
|
70
|
-
["30 9 * * *",
|
71
|
-
["30 9 * * *",
|
72
|
-
["30 9 * * *",
|
73
|
-
["0 9 * * *",
|
74
|
-
["* * 12 * *",
|
75
|
-
["* * * * 1,3",
|
76
|
-
["* * * * MON,WED",
|
77
|
-
["0 0 1 1 *",
|
78
|
-
["0 0 1 jun *",
|
79
|
-
["0 0 1 may,jul *",
|
80
|
-
["0 0 1 MAY,JUL *",
|
94
|
+
["* * * * *", "2011-08-15 12:00", "2011-08-15 11:59"],
|
95
|
+
["* * * * *", "2011-08-15 02:25", "2011-08-15 02:24"],
|
96
|
+
["* * * * *", "2011-08-15 03:00", "2011-08-15 02:59"],
|
97
|
+
["*/15 * * * *", "2011-08-15 02:02", "2011-08-15 02:00"],
|
98
|
+
["*/15,45 * * * *", "2011-08-15 02:55", "2011-08-15 02:45"],
|
99
|
+
["*/15,25 * * * *", "2011-08-15 02:35", "2011-08-15 02:30"],
|
100
|
+
["30 3,6,9 * * *", "2011-08-15 02:15", "2011-08-14 09:30"],
|
101
|
+
["30 9 * * *", "2011-08-15 10:15", "2011-08-15 09:30"],
|
102
|
+
["30 9 * * *", "2011-09-01 08:15", "2011-08-31 09:30"],
|
103
|
+
["30 9 * * *", "2011-10-01 08:15", "2011-09-30 09:30"],
|
104
|
+
["0 9 * * *", "2012-01-01 00:15", "2011-12-31 09:00"],
|
105
|
+
["* * 12 * *", "2010-04-15 10:15", "2010-04-12 23:59"],
|
106
|
+
["* * * * 1,3", "2010-04-15 10:15", "2010-04-14 23:59"],
|
107
|
+
["* * * * MON,WED", "2010-04-15 10:15", "2010-04-14 23:59"],
|
108
|
+
["0 0 1 1 *", "2010-04-15 10:15", "2010-01-01 00:00"],
|
109
|
+
["0 0 1 jun *", "2013-05-14 11:20", "2012-06-01 00:00"],
|
110
|
+
["0 0 1 may,jul *", "2013-05-14 15:00", "2013-05-01 00:00"],
|
111
|
+
["0 0 1 MAY,JUL *", "2013-05-14 15:00", "2013-05-01 00:00"],
|
112
|
+
["40 5 * * *", "2014-02-01 15:56", "2014-02-01 05:40"],
|
113
|
+
["0 5 * * 1", "2014-02-01 15:56", "2014-01-27 05:00"],
|
114
|
+
["10 8 15 * *", "2014-02-01 15:56", "2014-01-15 08:10"],
|
115
|
+
["50 6 * * 1", "2014-02-01 15:56", "2014-01-27 06:50"],
|
116
|
+
["1 2 * apr mOn", "2014-02-01 15:56", "2013-04-29 02:01"],
|
117
|
+
["1 2 3 4 7", "2014-02-01 15:56", "2013-04-28 02:01"],
|
118
|
+
["1 2 3 4 7", "2014-04-04 15:56", "2014-04-03 02:01"],
|
119
|
+
["1-20/3 * * * *", "2014-02-01 15:56", "2014-02-01 15:19"],
|
120
|
+
["1,2,3 * * * *", "2014-02-01 15:56", "2014-02-01 15:03"],
|
121
|
+
["1-9,15-30 * * * *", "2014-02-01 15:56", "2014-02-01 15:30"],
|
122
|
+
["1-9/3,15-30/4 * * * *", "2014-02-01 15:56", "2014-02-01 15:27"],
|
123
|
+
["1 2 3 jan mon", "2014-02-01 15:56", "2014-01-27 02:01"],
|
124
|
+
["1 2 3 4 mON", "2014-02-01 15:56", "2013-04-29 02:01"],
|
125
|
+
["1 2 3 jan 5", "2014-02-01 15:56", "2014-01-31 02:01"],
|
126
|
+
["@yearly", "2014-02-01 15:56", "2014-01-01 00:00"],
|
127
|
+
["@annually", "2014-02-01 15:56", "2014-01-01 00:00"],
|
128
|
+
["@monthly", "2014-02-01 15:56", "2014-02-01 00:00"],
|
129
|
+
["@weekly", "2014-02-01 15:56", "2014-01-26 00:00"],
|
130
|
+
["@daily", "2014-02-01 15:56", "2014-02-01 00:00"],
|
131
|
+
["@midnight", "2014-02-01 15:56", "2014-02-01 00:00"],
|
132
|
+
["@hourly", "2014-02-01 15:56", "2014-02-01 15:00"],
|
133
|
+
["*/3 * * * *", "2014-02-01 15:56", "2014-02-01 15:54"],
|
134
|
+
["0 5 * 2,3 *", "2014-02-01 15:56", "2014-02-01 05:00"],
|
135
|
+
["15-59/15 * * * *", "2014-02-01 15:56", "2014-02-01 15:45"],
|
136
|
+
["15-59/15 * * * *", "2014-02-01 15:00", "2014-02-01 14:45"],
|
137
|
+
["15-59/15 * * * *", "2014-02-01 15:01", "2014-02-01 14:45"],
|
138
|
+
["15-59/15 * * * *", "2014-02-01 15:16", "2014-02-01 15:15"],
|
139
|
+
["15-59/15 * * * *", "2014-02-01 15:26", "2014-02-01 15:15"],
|
140
|
+
["15-59/15 * * * *", "2014-02-01 15:36", "2014-02-01 15:30"],
|
141
|
+
["15-59/15 * * * *", "2014-02-01 15:45", "2014-02-01 15:30"],
|
142
|
+
["15-59/15 * * * *", "2014-02-01 15:46", "2014-02-01 15:45"],
|
81
143
|
].each do |line, now, expected_next|
|
82
144
|
it "should return #{expected_next} for '#{line}' when now is #{now}" do
|
83
145
|
now = parse_date(now)
|
metadata
CHANGED
@@ -1,20 +1,18 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: parse-cron
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
5
|
-
prerelease:
|
4
|
+
version: 0.1.4
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Michael Siebert
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2014-02-06 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: rspec
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
17
|
- - ~>
|
20
18
|
- !ruby/object:Gem::Version
|
@@ -22,7 +20,6 @@ dependencies:
|
|
22
20
|
type: :development
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
24
|
- - ~>
|
28
25
|
- !ruby/object:Gem::Version
|
@@ -49,26 +46,25 @@ files:
|
|
49
46
|
- spec/spec_helper.rb
|
50
47
|
homepage: https://github.com/siebertm/parse-cron
|
51
48
|
licenses: []
|
49
|
+
metadata: {}
|
52
50
|
post_install_message:
|
53
51
|
rdoc_options: []
|
54
52
|
require_paths:
|
55
53
|
- lib
|
56
54
|
required_ruby_version: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
55
|
requirements:
|
59
56
|
- - ! '>='
|
60
57
|
- !ruby/object:Gem::Version
|
61
58
|
version: '0'
|
62
59
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
63
|
-
none: false
|
64
60
|
requirements:
|
65
61
|
- - ! '>='
|
66
62
|
- !ruby/object:Gem::Version
|
67
63
|
version: '0'
|
68
64
|
requirements: []
|
69
65
|
rubyforge_project: parse-cron
|
70
|
-
rubygems_version: 1.
|
66
|
+
rubygems_version: 2.1.11
|
71
67
|
signing_key:
|
72
|
-
specification_version:
|
68
|
+
specification_version: 4
|
73
69
|
summary: Parses cron expressions and calculates the next occurence
|
74
70
|
test_files: []
|