Skip to content

Commit b31e2a7

Browse files
committed
Fix minute approximation
1 parent feae0d6 commit b31e2a7

File tree

2 files changed

+104
-101
lines changed

2 files changed

+104
-101
lines changed

lib/cron_parser.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,7 @@ def nudge_hour(t, dir = :next)
235235

236236
def nudge_minute(t, dir = :next)
237237
spec = time_specs[:minute][1]
238+
t.min = t.min + 1 unless dir == :next
238239
next_value = find_best_next(t.min, spec, dir)
239240
t.min = next_value || (dir == :next ? spec.first : spec.last)
240241

spec/cron_parser_spec.rb

Lines changed: 103 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -26,58 +26,58 @@ def parse_date(str)
2626

2727
describe "CronParser#next" do
2828
[
29-
["* * * * *", "2011-08-15 12:00", "2011-08-15 12:01", 1],
30-
["* * * * *", "2011-08-15 02:25", "2011-08-15 02:26", 1],
31-
["* * * * *", "2011-08-15 02:59", "2011-08-15 03:00", 1],
32-
["*/15 * * * *", "2011-08-15 02:02", "2011-08-15 02:15", 1],
33-
["*/15,25 * * * *", "2011-08-15 02:15", "2011-08-15 02:25", 1],
34-
["30 3,6,9 * * *", "2011-08-15 02:15", "2011-08-15 03:30", 1],
35-
["30 9 * * *", "2011-08-15 10:15", "2011-08-16 09:30", 1],
36-
["30 9 * * *", "2011-08-31 10:15", "2011-09-01 09:30", 1],
37-
["30 9 * * *", "2011-09-30 10:15", "2011-10-01 09:30", 1],
38-
["0 9 * * *", "2011-12-31 10:15", "2012-01-01 09:00", 1],
39-
["* * 12 * *", "2010-04-15 10:15", "2010-05-12 00:00", 1],
40-
["* * * * 1,3", "2010-04-15 10:15", "2010-04-19 00:00", 1],
41-
["* * * * MON,WED", "2010-04-15 10:15", "2010-04-19 00:00", 1],
42-
["0 0 1 1 *", "2010-04-15 10:15", "2011-01-01 00:00", 1],
43-
["0 0 * * 1", "2011-08-01 00:00", "2011-08-08 00:00", 1],
44-
["0 0 * * 1", "2011-07-25 00:00", "2011-08-01 00:00", 1],
45-
["45 23 7 3 *", "2011-01-01 00:00", "2011-03-07 23:45", 1],
46-
["0 0 1 jun *", "2013-05-14 11:20", "2013-06-01 00:00", 1],
47-
["0 0 1 may,jul *", "2013-05-14 15:00", "2013-07-01 00:00", 1],
48-
["0 0 1 MAY,JUL *", "2013-05-14 15:00", "2013-07-01 00:00", 1],
49-
["40 5 * * *", "2014-02-01 15:56", "2014-02-02 05:40", 1],
50-
["0 5 * * 1", "2014-02-01 15:56", "2014-02-03 05:00", 1],
51-
["10 8 15 * *", "2014-02-01 15:56", "2014-02-15 08:10", 1],
52-
["50 6 * * 1", "2014-02-01 15:56", "2014-02-03 06:50", 1],
53-
["1 2 * apr mOn", "2014-02-01 15:56", "2014-04-07 02:01", 1],
54-
["1 2 3 4 7", "2014-02-01 15:56", "2014-04-03 02:01", 1],
55-
["1 2 3 4 7", "2014-04-04 15:56", "2014-04-06 02:01", 1],
56-
["1-20/3 * * * *", "2014-02-01 15:56", "2014-02-01 16:01", 1],
57-
["1,2,3 * * * *", "2014-02-01 15:56", "2014-02-01 16:01", 1],
58-
["1-9,15-30 * * * *", "2014-02-01 15:56", "2014-02-01 16:01", 1],
59-
["1-9/3,15-30/4 * * * *", "2014-02-01 15:56", "2014-02-01 16:01", 1],
60-
["1 2 3 jan mon", "2014-02-01 15:56", "2015-01-03 02:01", 1],
61-
["1 2 3 4 mON", "2014-02-01 15:56", "2014-04-03 02:01", 1],
62-
["1 2 3 jan 5", "2014-02-01 15:56", "2015-01-02 02:01", 1],
63-
["@yearly", "2014-02-01 15:56", "2015-01-01 00:00", 1],
64-
["@annually", "2014-02-01 15:56", "2015-01-01 00:00", 1],
65-
["@monthly", "2014-02-01 15:56", "2014-03-01 00:00", 1],
66-
["@weekly", "2014-02-01 15:56", "2014-02-02 00:00", 1],
67-
["@daily", "2014-02-01 15:56", "2014-02-02 00:00", 1],
68-
["@midnight", "2014-02-01 15:56", "2014-02-02 00:00", 1],
69-
["@hourly", "2014-02-01 15:56", "2014-02-01 16:00", 1],
70-
["*/3 * * * *", "2014-02-01 15:56", "2014-02-01 15:57", 1],
71-
["0 5 * 2,3 *", "2014-02-01 15:56", "2014-02-02 05:00", 1],
72-
["15-59/15 * * * *", "2014-02-01 15:56", "2014-02-01 16:15", 1],
73-
["15-59/15 * * * *", "2014-02-01 15:00", "2014-02-01 15:15", 1],
74-
["15-59/15 * * * *", "2014-02-01 15:01", "2014-02-01 15:15", 1],
75-
["15-59/15 * * * *", "2014-02-01 15:16", "2014-02-01 15:30", 1],
76-
["15-59/15 * * * *", "2014-02-01 15:26", "2014-02-01 15:30", 1],
77-
["15-59/15 * * * *", "2014-02-01 15:36", "2014-02-01 15:45", 1],
78-
["15-59/15 * * * *", "2014-02-01 15:45", "2014-02-01 16:15", 4],
79-
["15-59/15 * * * *", "2014-02-01 15:46", "2014-02-01 16:15", 3],
80-
["15-59/15 * * * *", "2014-02-01 15:46", "2014-02-01 16:15", 2]
29+
["* * * * *", "2011-08-15 12:00:15", "2011-08-15 12:01:00", 1],
30+
["* * * * *", "2011-08-15 02:25:30", "2011-08-15 02:26:00", 1],
31+
["* * * * *", "2011-08-15 02:59:45", "2011-08-15 03:00:00", 1],
32+
["*/15 * * * *", "2011-08-15 02:02:55", "2011-08-15 02:15:00", 1],
33+
["*/15,25 * * * *", "2011-08-15 02:15:01", "2011-08-15 02:25:00", 1],
34+
["30 3,6,9 * * *", "2011-08-15 02:15:34", "2011-08-15 03:30:00", 1],
35+
["30 9 * * *", "2011-08-15 10:15:22", "2011-08-16 09:30:00", 1],
36+
["30 9 * * *", "2011-08-31 10:15:59", "2011-09-01 09:30:00", 1],
37+
["30 9 * * *", "2011-09-30 10:15:12", "2011-10-01 09:30:00", 1],
38+
["0 9 * * *", "2011-12-31 10:15:45", "2012-01-01 09:00:00", 1],
39+
["* * 12 * *", "2010-04-15 10:15:33", "2010-05-12 00:00:00", 1],
40+
["* * * * 1,3", "2010-04-15 10:15:12", "2010-04-19 00:00:00", 1],
41+
["* * * * MON,WED", "2010-04-15 10:15:00", "2010-04-19 00:00:00", 1],
42+
["0 0 1 1 *", "2010-04-15 10:15:21", "2011-01-01 00:00:00", 1],
43+
["0 0 * * 1", "2011-08-01 00:00:00", "2011-08-08 00:00:00", 1],
44+
["0 0 * * 1", "2011-07-25 00:00:19", "2011-08-01 00:00:00", 1],
45+
["45 23 7 3 *", "2011-01-01 00:00:11", "2011-03-07 23:45:00", 1],
46+
["0 0 1 jun *", "2013-05-14 11:20:32", "2013-06-01 00:00:00", 1],
47+
["0 0 1 may,jul *", "2013-05-14 15:00:00", "2013-07-01 00:00:00", 1],
48+
["0 0 1 MAY,JUL *", "2013-05-14 15:00:00", "2013-07-01 00:00:00", 1],
49+
["40 5 * * *", "2014-02-01 15:56:54", "2014-02-02 05:40:00", 1],
50+
["0 5 * * 1", "2014-02-01 15:56:34", "2014-02-03 05:00:00", 1],
51+
["10 8 15 * *", "2014-02-01 15:56:12", "2014-02-15 08:10:00", 1],
52+
["50 6 * * 1", "2014-02-01 15:56:43", "2014-02-03 06:50:00", 1],
53+
["1 2 * apr mOn", "2014-02-01 15:56:11", "2014-04-07 02:01:00", 1],
54+
["1 2 3 4 7", "2014-02-01 15:56:44", "2014-04-03 02:01:00", 1],
55+
["1 2 3 4 7", "2014-04-04 15:56:00", "2014-04-06 02:01:00", 1],
56+
["1-20/3 * * * *", "2014-02-01 15:56:44", "2014-02-01 16:01:00", 1],
57+
["1,2,3 * * * *", "2014-02-01 15:56:43", "2014-02-01 16:01:00", 1],
58+
["1-9,15-30 * * * *", "2014-02-01 15:56:12", "2014-02-01 16:01:00", 1],
59+
["1-9/3,15-30/4 * * * *", "2014-02-01 15:56:00", "2014-02-01 16:01:00", 1],
60+
["1 2 3 jan mon", "2014-02-01 15:56:13", "2015-01-03 02:01:00", 1],
61+
["1 2 3 4 mON", "2014-02-01 15:56:00", "2014-04-03 02:01:00", 1],
62+
["1 2 3 jan 5", "2014-02-01 15:56:26", "2015-01-02 02:01:00", 1],
63+
["@yearly", "2014-02-01 15:56:00", "2015-01-01 00:00:00", 1],
64+
["@annually", "2014-02-01 15:56:37", "2015-01-01 00:00:00", 1],
65+
["@monthly", "2014-02-01 15:56:14", "2014-03-01 00:00:00", 1],
66+
["@weekly", "2014-02-01 15:56:00", "2014-02-02 00:00:00", 1],
67+
["@daily", "2014-02-01 15:56:23", "2014-02-02 00:00:00", 1],
68+
["@midnight", "2014-02-01 15:56:17", "2014-02-02 00:00:00", 1],
69+
["@hourly", "2014-02-01 15:56:00", "2014-02-01 16:00:00", 1],
70+
["*/3 * * * *", "2014-02-01 15:56:00", "2014-02-01 15:57:00", 1],
71+
["0 5 * 2,3 *", "2014-02-01 15:56:19", "2014-02-02 05:00:00", 1],
72+
["15-59/15 * * * *", "2014-02-01 15:56:00", "2014-02-01 16:15:00", 1],
73+
["15-59/15 * * * *", "2014-02-01 15:00:00", "2014-02-01 15:15:00", 1],
74+
["15-59/15 * * * *", "2014-02-01 15:01:21", "2014-02-01 15:15:00", 1],
75+
["15-59/15 * * * *", "2014-02-01 15:16:22", "2014-02-01 15:30:00", 1],
76+
["15-59/15 * * * *", "2014-02-01 15:26:00", "2014-02-01 15:30:00", 1],
77+
["15-59/15 * * * *", "2014-02-01 15:36:38", "2014-02-01 15:45:00", 1],
78+
["15-59/15 * * * *", "2014-02-01 15:45:00", "2014-02-01 16:15:00", 4],
79+
["15-59/15 * * * *", "2014-02-01 15:46:36", "2014-02-01 16:15:00", 3],
80+
["15-59/15 * * * *", "2014-02-01 15:46:00", "2014-02-01 16:15:00", 2]
8181
].each do |line, now, expected_next, num|
8282
it "returns #{expected_next} for '#{line}' when now is #{now}" do
8383
parsed_now = parse_date(now)
@@ -112,55 +112,57 @@ def parse_date(str)
112112

113113
describe "CronParser#last" do
114114
[
115-
["* * * * *", "2011-08-15 12:00", "2011-08-15 11:59"],
116-
["* * * * *", "2011-08-15 02:25", "2011-08-15 02:24"],
117-
["* * * * *", "2011-08-15 03:00", "2011-08-15 02:59"],
118-
["*/15 * * * *", "2011-08-15 02:02", "2011-08-15 02:00"],
119-
["*/15,45 * * * *", "2011-08-15 02:55", "2011-08-15 02:45"],
120-
["*/15,25 * * * *", "2011-08-15 02:35", "2011-08-15 02:30"],
121-
["30 3,6,9 * * *", "2011-08-15 02:15", "2011-08-14 09:30"],
122-
["30 9 * * *", "2011-08-15 10:15", "2011-08-15 09:30"],
123-
["30 9 * * *", "2011-09-01 08:15", "2011-08-31 09:30"],
124-
["30 9 * * *", "2011-10-01 08:15", "2011-09-30 09:30"],
125-
["0 9 * * *", "2012-01-01 00:15", "2011-12-31 09:00"],
126-
["* * 12 * *", "2010-04-15 10:15", "2010-04-12 23:59"],
127-
["* * * * 1,3", "2010-04-15 10:15", "2010-04-14 23:59"],
128-
["* * * * MON,WED", "2010-04-15 10:15", "2010-04-14 23:59"],
129-
["0 0 1 1 *", "2010-04-15 10:15", "2010-01-01 00:00"],
130-
["0 0 1 jun *", "2013-05-14 11:20", "2012-06-01 00:00"],
131-
["0 0 1 may,jul *", "2013-05-14 15:00", "2013-05-01 00:00"],
132-
["0 0 1 MAY,JUL *", "2013-05-14 15:00", "2013-05-01 00:00"],
133-
["40 5 * * *", "2014-02-01 15:56", "2014-02-01 05:40"],
134-
["0 5 * * 1", "2014-02-01 15:56", "2014-01-27 05:00"],
135-
["10 8 15 * *", "2014-02-01 15:56", "2014-01-15 08:10"],
136-
["50 6 * * 1", "2014-02-01 15:56", "2014-01-27 06:50"],
137-
["1 2 * apr mOn", "2014-02-01 15:56", "2013-04-29 02:01"],
138-
["1 2 3 4 7", "2014-02-01 15:56", "2013-04-28 02:01"],
139-
["1 2 3 4 7", "2014-04-04 15:56", "2014-04-03 02:01"],
140-
["1-20/3 * * * *", "2014-02-01 15:56", "2014-02-01 15:19"],
141-
["1,2,3 * * * *", "2014-02-01 15:56", "2014-02-01 15:03"],
142-
["1-9,15-30 * * * *", "2014-02-01 15:56", "2014-02-01 15:30"],
143-
["1-9/3,15-30/4 * * * *", "2014-02-01 15:56", "2014-02-01 15:27"],
144-
["1 2 3 jan mon", "2014-02-01 15:56", "2014-01-27 02:01"],
145-
["1 2 3 4 mON", "2014-02-01 15:56", "2013-04-29 02:01"],
146-
["1 2 3 jan 5", "2014-02-01 15:56", "2014-01-31 02:01"],
147-
["@yearly", "2014-02-01 15:56", "2014-01-01 00:00"],
148-
["@annually", "2014-02-01 15:56", "2014-01-01 00:00"],
149-
["@monthly", "2014-02-01 15:56", "2014-02-01 00:00"],
150-
["@weekly", "2014-02-01 15:56", "2014-01-26 00:00"],
151-
["@daily", "2014-02-01 15:56", "2014-02-01 00:00"],
152-
["@midnight", "2014-02-01 15:56", "2014-02-01 00:00"],
153-
["@hourly", "2014-02-01 15:56", "2014-02-01 15:00"],
154-
["*/3 * * * *", "2014-02-01 15:56", "2014-02-01 15:54"],
155-
["0 5 * 2,3 *", "2014-02-01 15:56", "2014-02-01 05:00"],
156-
["15-59/15 * * * *", "2014-02-01 15:56", "2014-02-01 15:45"],
157-
["15-59/15 * * * *", "2014-02-01 15:00", "2014-02-01 14:45"],
158-
["15-59/15 * * * *", "2014-02-01 15:01", "2014-02-01 14:45"],
159-
["15-59/15 * * * *", "2014-02-01 15:16", "2014-02-01 15:15"],
160-
["15-59/15 * * * *", "2014-02-01 15:26", "2014-02-01 15:15"],
161-
["15-59/15 * * * *", "2014-02-01 15:36", "2014-02-01 15:30"],
162-
["15-59/15 * * * *", "2014-02-01 15:45", "2014-02-01 15:30"],
163-
["15-59/15 * * * *", "2014-02-01 15:46", "2014-02-01 15:45"]
115+
["* * * * *", "2011-08-15 12:00:00", "2011-08-15 12:00:00"],
116+
["* * * * *", "2011-08-15 02:25:13", "2011-08-15 02:25:00"],
117+
["* * * * *", "2011-08-15 03:00:59", "2011-08-15 03:00:00"],
118+
["*/15 * * * *", "2011-08-15 02:02:00", "2011-08-15 02:00:00"],
119+
["*/15 * * * *", "2011-08-15 02:15:01", "2011-08-15 02:15:00"],
120+
["*/15,45 * * * *", "2011-08-15 02:55:00", "2011-08-15 02:45:00"],
121+
["*/15,25 * * * *", "2011-08-15 02:35:00", "2011-08-15 02:30:00"],
122+
["30 3,6,9 * * *", "2011-08-15 02:15:00", "2011-08-14 09:30:00"],
123+
["30 9 * * *", "2011-08-15 10:15:00", "2011-08-15 09:30:00"],
124+
["30 9 * * *", "2011-09-01 08:15:00", "2011-08-31 09:30:00"],
125+
["30 9 * * *", "2011-10-01 08:15:00", "2011-09-30 09:30:00"],
126+
["30 9 * * *", "2011-10-01 09:30:11", "2011-10-01 09:30:00"],
127+
["0 9 * * *", "2012-01-01 00:15:00", "2011-12-31 09:00:00"],
128+
["* * 12 * *", "2010-04-15 10:15:00", "2010-04-12 23:59:00"],
129+
["* * * * 1,3", "2010-04-15 10:15:00", "2010-04-14 23:59:00"],
130+
["* * * * MON,WED", "2010-04-15 10:15:00", "2010-04-14 23:59:00"],
131+
["0 0 1 1 *", "2010-04-15 10:15:00", "2010-01-01 00:00:00"],
132+
["0 0 1 jun *", "2013-05-14 11:20:00", "2012-06-01 00:00:00"],
133+
["0 0 1 may,jul *", "2013-05-14 15:00:00", "2013-05-01 00:00:00"],
134+
["0 0 1 MAY,JUL *", "2013-05-14 15:00:00", "2013-05-01 00:00:00"],
135+
["40 5 * * *", "2014-02-01 15:56:00", "2014-02-01 05:40:00"],
136+
["0 5 * * 1", "2014-02-01 15:56:00", "2014-01-27 05:00:00"],
137+
["10 8 15 * *", "2014-02-01 15:56:00", "2014-01-15 08:10:00"],
138+
["50 6 * * 1", "2014-02-01 15:56:00", "2014-01-27 06:50:00"],
139+
["1 2 * apr mOn", "2014-02-01 15:56:00", "2013-04-29 02:01:00"],
140+
["1 2 3 4 7", "2014-02-01 15:56:00", "2013-04-28 02:01:00"],
141+
["1 2 3 4 7", "2014-04-04 15:56:00", "2014-04-03 02:01:00"],
142+
["1-20/3 * * * *", "2014-02-01 15:56:00", "2014-02-01 15:19:00"],
143+
["1,2,3 * * * *", "2014-02-01 15:56:00", "2014-02-01 15:03:00"],
144+
["1-9,15-30 * * * *", "2014-02-01 15:56:00", "2014-02-01 15:30:00"],
145+
["1-9/3,15-30/4 * * * *", "2014-02-01 15:56:00", "2014-02-01 15:27:00"],
146+
["1 2 3 jan mon", "2014-02-01 15:56:00", "2014-01-27 02:01:00"],
147+
["1 2 3 4 mON", "2014-02-01 15:56:00", "2013-04-29 02:01:00"],
148+
["1 2 3 jan 5", "2014-02-01 15:56:00", "2014-01-31 02:01:00"],
149+
["@yearly", "2014-02-01 15:56:00", "2014-01-01 00:00:00"],
150+
["@annually", "2014-02-01 15:56:00", "2014-01-01 00:00:00"],
151+
["@monthly", "2014-02-01 15:56:00", "2014-02-01 00:00:00"],
152+
["@weekly", "2014-02-01 15:56:00", "2014-01-26 00:00:00"],
153+
["@daily", "2014-02-01 15:56:00", "2014-02-01 00:00:00"],
154+
["@midnight", "2014-02-01 15:56:00", "2014-02-01 00:00:00"],
155+
["@hourly", "2014-02-01 15:56:00", "2014-02-01 15:00:00"],
156+
["*/3 * * * *", "2014-02-01 15:56:00", "2014-02-01 15:54:00"],
157+
["0 5 * 2,3 *", "2014-02-01 15:56:00", "2014-02-01 05:00:00"],
158+
["15-59/15 * * * *", "2014-02-01 15:56:00", "2014-02-01 15:45:00"],
159+
["15-59/15 * * * *", "2014-02-01 15:00:00", "2014-02-01 14:45:00"],
160+
["15-59/15 * * * *", "2014-02-01 15:01:00", "2014-02-01 14:45:00"],
161+
["15-59/15 * * * *", "2014-02-01 15:16:00", "2014-02-01 15:15:00"],
162+
["15-59/15 * * * *", "2014-02-01 15:26:00", "2014-02-01 15:15:00"],
163+
["15-59/15 * * * *", "2014-02-01 15:36:00", "2014-02-01 15:30:00"],
164+
["15-59/15 * * * *", "2014-02-01 15:45:00", "2014-02-01 15:45:00"],
165+
["15-59/15 * * * *", "2014-02-01 15:46:00", "2014-02-01 15:45:00"]
164166
].each do |line, now, expected_last|
165167
it "should return #{expected_last} for '#{line}' when now is #{now}" do
166168
parsed_now = parse_date(now)

0 commit comments

Comments
 (0)