kronparser 0.0.1 → 0.0.2
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.
- data/lib/kronparser.rb +36 -0
- data/lib/kronparser/version.rb +1 -1
- data/spec/kronparser_spec.rb +115 -1
- metadata +54 -34
data/lib/kronparser.rb
CHANGED
@@ -10,6 +10,21 @@ class KronParser
|
|
10
10
|
:mon => 1..12,
|
11
11
|
:wday => 0..6,
|
12
12
|
}
|
13
|
+
|
14
|
+
MONTH_LAST_DATE = {
|
15
|
+
1 => 31,
|
16
|
+
2 => 29,
|
17
|
+
3 => 31,
|
18
|
+
4 => 30,
|
19
|
+
5 => 31,
|
20
|
+
6 => 30,
|
21
|
+
7 => 31,
|
22
|
+
8 => 31,
|
23
|
+
9 => 30,
|
24
|
+
10 => 31,
|
25
|
+
11 => 30,
|
26
|
+
12 => 31
|
27
|
+
}
|
13
28
|
|
14
29
|
def self.parse(cron_time_format)
|
15
30
|
return KronParser.new(cron_time_format)
|
@@ -17,6 +32,8 @@ class KronParser
|
|
17
32
|
|
18
33
|
def initialize(cron_time_format)
|
19
34
|
elems = cron_time_format.split
|
35
|
+
raise ArgumentError.new("invalid format #{cron_time_format}") if elems.size != 5
|
36
|
+
|
20
37
|
@data = {}
|
21
38
|
[:min, :hour, :day, :mon, :wday].each_with_index do |t, idx|
|
22
39
|
@data[t] = parse_elem(elems[idx], TIME_RANGE[t])
|
@@ -29,9 +46,13 @@ class KronParser
|
|
29
46
|
else
|
30
47
|
@day_type = :each
|
31
48
|
end
|
49
|
+
|
50
|
+
@is_time_exist = time_exist?
|
32
51
|
end
|
33
52
|
|
34
53
|
def next(time = Time.now)
|
54
|
+
return nil unless @is_time_exist
|
55
|
+
|
35
56
|
forward = 1
|
36
57
|
time_items = [:min, :hour, :day, :mon]
|
37
58
|
time_data = {}
|
@@ -71,6 +92,17 @@ class KronParser
|
|
71
92
|
|
72
93
|
private
|
73
94
|
|
95
|
+
def time_exist?
|
96
|
+
return true if @day_type != :day
|
97
|
+
@data[:mon].each do |mon|
|
98
|
+
last_date = MONTH_LAST_DATE[mon]
|
99
|
+
return true if last_date == 31
|
100
|
+
return true if @data[:day].find { |x| x <= last_date }
|
101
|
+
end
|
102
|
+
|
103
|
+
return false
|
104
|
+
end
|
105
|
+
|
74
106
|
def first_elem(type, options = {})
|
75
107
|
if (type != :day) || (@day_type == :day)
|
76
108
|
return @data[type].first
|
@@ -133,10 +165,12 @@ class KronParser
|
|
133
165
|
when "*"
|
134
166
|
return range.to_a
|
135
167
|
when /^\d+$/
|
168
|
+
raise ArgumentError.new("out of range #{format}") unless range.member?(format.to_i)
|
136
169
|
return [format.to_i]
|
137
170
|
when /^(\d+)-(\d+)$/
|
138
171
|
first = $1.to_i
|
139
172
|
last = $2.to_i
|
173
|
+
raise ArgumentError.new("out of range #{format}") unless range.member?(first) && range.member?(last)
|
140
174
|
if first <= last
|
141
175
|
return ($1.to_i..$2.to_i).to_a
|
142
176
|
else
|
@@ -154,6 +188,8 @@ class KronParser
|
|
154
188
|
end
|
155
189
|
|
156
190
|
return result
|
191
|
+
else
|
192
|
+
raise ArgumentError.new("invalid format #{format}")
|
157
193
|
end
|
158
194
|
end
|
159
195
|
end
|
data/lib/kronparser/version.rb
CHANGED
data/spec/kronparser_spec.rb
CHANGED
@@ -2,7 +2,7 @@ require 'spec_helper'
|
|
2
2
|
require 'time'
|
3
3
|
|
4
4
|
describe KronParser do
|
5
|
-
it "could get next
|
5
|
+
it "could get next time" do
|
6
6
|
test_data = [
|
7
7
|
["1 * * * *", :next, "2011/12/21 12:31:52", "2011/12/21 13:01:00"],
|
8
8
|
["* 1 * * *", :next, "2011/12/21 12:31:52", "2011/12/22 01:00:00"],
|
@@ -20,6 +20,21 @@ describe KronParser do
|
|
20
20
|
["41-43 * * * *", :next, "2011/12/21 12:41:52", "2011/12/21 12:42:00"],
|
21
21
|
["41-43 * * * *", :next, "2011/12/21 12:42:52", "2011/12/21 12:43:00"],
|
22
22
|
["41-43 * * * *", :next, "2011/12/21 12:43:52", "2011/12/21 13:41:00"],
|
23
|
+
["30-0 * * * *", :next, "2011/12/21 12:43:52", "2011/12/21 12:44:00"],
|
24
|
+
["30-0 * * * *", :next, "2011/12/21 12:15:52", "2011/12/21 12:30:00"],
|
25
|
+
["30-0 * * * *", :next, "2011/12/21 12:00:52", "2011/12/21 12:30:00"],
|
26
|
+
["30-0 * * * *", :next, "2011/12/21 11:59:52", "2011/12/21 12:00:00"],
|
27
|
+
["30-0 * * * *", :next, "2011/12/21 12:30:52", "2011/12/21 12:31:00"],
|
28
|
+
["30-10 * * * *", :next, "2011/12/21 12:15:52", "2011/12/21 12:30:00"],
|
29
|
+
["30-10 * * * *", :next, "2011/12/21 12:29:52", "2011/12/21 12:30:00"],
|
30
|
+
["30-10 * * * *", :next, "2011/12/21 12:30:52", "2011/12/21 12:31:00"],
|
31
|
+
["30-10 * * * *", :next, "2011/12/21 12:45:52", "2011/12/21 12:46:00"],
|
32
|
+
["30-10 * * * *", :next, "2011/12/21 12:03:52", "2011/12/21 12:04:00"],
|
33
|
+
["30-10 * * * *", :next, "2011/12/21 12:09:52", "2011/12/21 12:10:00"],
|
34
|
+
["30-10 * * * *", :next, "2011/12/21 12:10:52", "2011/12/21 12:30:00"],
|
35
|
+
["3-3 * * * *", :next, "2011/12/21 12:10:52", "2011/12/21 13:03:00"],
|
36
|
+
["3-3 * * * *", :next, "2011/12/21 12:03:52", "2011/12/21 13:03:00"],
|
37
|
+
["3-3 * * * *", :next, "2011/12/21 12:02:52", "2011/12/21 12:03:00"],
|
23
38
|
["15-30/7 * * * *", :next, "2011/12/21 12:04:52", "2011/12/21 12:15:00"],
|
24
39
|
["15-30/7 * * * *", :next, "2011/12/21 12:14:52", "2011/12/21 12:15:00"],
|
25
40
|
["15-30/7 * * * *", :next, "2011/12/21 12:15:52", "2011/12/21 12:22:00"],
|
@@ -119,4 +134,103 @@ describe KronParser do
|
|
119
134
|
result_date.should == Time.parse(get_date)
|
120
135
|
end
|
121
136
|
end
|
137
|
+
|
138
|
+
it "could get nil if next time is not exist" do
|
139
|
+
data = [
|
140
|
+
["* * 31 1 *", :next, "2012/01/31 23:59:59", "2013/01/31 00:00:00"],
|
141
|
+
["* * 31 2 *", :next, "2012/01/31 23:59:59", nil],
|
142
|
+
["* * 30 2 *", :next, "2012/01/31 23:59:59", nil],
|
143
|
+
["* * 29 2 *", :next, "2012/02/29 23:59:59", "2016/02/29 00:00:00"],
|
144
|
+
["* * 28 2 *", :next, "2012/02/29 23:59:59", "2013/02/28 00:00:00"],
|
145
|
+
["* * 31 3 *", :next, "2012/02/29 23:59:59", "2012/03/31 00:00:00"],
|
146
|
+
["* * 30 4 *", :next, "2012/02/29 23:59:59", "2012/04/30 00:00:00"],
|
147
|
+
["* * 31 4 *", :next, "2012/02/29 23:59:59", nil],
|
148
|
+
["* * 31 5 *", :next, "2012/02/29 23:59:59", "2012/05/31 00:00:00"],
|
149
|
+
["* * 30 6 *", :next, "2012/02/29 23:59:59", "2012/06/30 00:00:00"],
|
150
|
+
["* * 31 6 *", :next, "2012/02/29 23:59:59", nil],
|
151
|
+
["* * 31 7 *", :next, "2012/02/29 23:59:59", "2012/07/31 00:00:00"],
|
152
|
+
["* * 31 8 *", :next, "2012/02/29 23:59:59", "2012/08/31 00:00:00"],
|
153
|
+
["* * 30 9 *", :next, "2012/02/29 23:59:59", "2012/09/30 00:00:00"],
|
154
|
+
["* * 31 9 *", :next, "2012/02/29 23:59:59", nil],
|
155
|
+
["* * 31 10 *", :next, "2012/02/29 23:59:59", "2012/10/31 00:00:00"],
|
156
|
+
["* * 30 11 *", :next, "2012/02/29 23:59:59", "2012/11/30 00:00:00"],
|
157
|
+
["* * 31 11 *", :next, "2012/02/29 23:59:59", nil],
|
158
|
+
["* * 31 12 *", :next, "2012/02/29 23:59:59", "2012/12/31 00:00:00"],
|
159
|
+
["* * 31 2,4,6,9,11 *", :next, "2012/02/29 23:59:59", nil],
|
160
|
+
["* * 31 1,2,4,6,9,11 *", :next, "2012/02/29 23:59:59", "2013/01/31 00:00:00"],
|
161
|
+
["* * 31 2-3 *", :next, "2012/02/29 23:59:59", "2012/03/31 00:00:00"],
|
162
|
+
]
|
163
|
+
|
164
|
+
data.each do |cron_time_format, target_method, now_date, get_date|
|
165
|
+
result_date = KronParser.parse(cron_time_format).send(target_method, Time.parse(now_date))
|
166
|
+
result_date.should == (get_date ? Time.parse(get_date) : nil)
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
it "should raise ArgmentError when value is out of range" do
|
171
|
+
data = [
|
172
|
+
["-1 * * * *", false],
|
173
|
+
["0 * * * *", true],
|
174
|
+
["59 * * * *", true],
|
175
|
+
["60 * * * *", false],
|
176
|
+
["* -1 * * *", false],
|
177
|
+
["* 0 * * *", true],
|
178
|
+
["* 23 * * *", true],
|
179
|
+
["* 24 * * *", false],
|
180
|
+
["* * 0 * *", false],
|
181
|
+
["* * 1 * *", true],
|
182
|
+
["* * 31 * *", true],
|
183
|
+
["* * 32 * *", false],
|
184
|
+
["* * * 0 *", false],
|
185
|
+
["* * * 1 *", true],
|
186
|
+
["* * * 12 *", true],
|
187
|
+
["* * * 13 *", false],
|
188
|
+
["* * * * 0", true],
|
189
|
+
["* * * * 6", true],
|
190
|
+
["* * * * 7", false],
|
191
|
+
["9-60 * * * *", false],
|
192
|
+
["9-23 * * * *", true],
|
193
|
+
["-1-23 * * * *", false],
|
194
|
+
["* 22-24 * * *", false],
|
195
|
+
["* 22-23 * * *", true],
|
196
|
+
["* -1-23 * * *", false],
|
197
|
+
["* * 0-15 * *", false],
|
198
|
+
["* * 1-12 * *", true],
|
199
|
+
["* * 16-32 * *", false],
|
200
|
+
["* * 16-30 * *", true],
|
201
|
+
["* * * 0-5 *", false],
|
202
|
+
["* * * 2-5 *", true],
|
203
|
+
["* * * 5-13 *", false],
|
204
|
+
["* * * 5-11 *", true],
|
205
|
+
["* * * * 4-7", false],
|
206
|
+
["* * * * 4-4", true],
|
207
|
+
]
|
208
|
+
|
209
|
+
data.each do |time, is_range|
|
210
|
+
s = is_range ? :should_not : :should
|
211
|
+
lambda { KronParser.parse(time) }.send(s, raise_error(ArgumentError))
|
212
|
+
end
|
213
|
+
end
|
214
|
+
|
215
|
+
it "should raise ArgmentError by invalid format" do
|
216
|
+
data = [
|
217
|
+
["a * * * *", false],
|
218
|
+
["1-5/* * * * *", false],
|
219
|
+
["*/* * * * *", false],
|
220
|
+
["*/a * * * *", false],
|
221
|
+
["1-a * * * *", false],
|
222
|
+
["a-1 * * * *", false],
|
223
|
+
["3+5 * * * *", false],
|
224
|
+
["* * * * * *", false],
|
225
|
+
["* * * *", false],
|
226
|
+
["* * *", false],
|
227
|
+
["* *", false],
|
228
|
+
["*", false],
|
229
|
+
]
|
230
|
+
|
231
|
+
data.each do |time, is_range|
|
232
|
+
s = is_range ? :should_not : :should
|
233
|
+
lambda { KronParser.parse(time) }.send(s, raise_error(ArgumentError))
|
234
|
+
end
|
235
|
+
end
|
122
236
|
end
|
metadata
CHANGED
@@ -1,34 +1,46 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: kronparser
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 0
|
7
|
+
- 0
|
8
|
+
- 2
|
9
|
+
segments_generated: true
|
10
|
+
version: 0.0.2
|
6
11
|
platform: ruby
|
7
|
-
authors:
|
12
|
+
authors:
|
8
13
|
- mechamogera
|
9
14
|
autorequire:
|
10
15
|
bindir: bin
|
11
16
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
none: false
|
18
|
-
requirements:
|
19
|
-
- - ! '>='
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
version: '0'
|
17
|
+
|
18
|
+
date: 2012-10-27 00:00:00 +09:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
22
|
type: :development
|
23
|
+
version_requirements: &id001 !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ">="
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
segments:
|
28
|
+
- 0
|
29
|
+
segments_generated: true
|
30
|
+
version: "0"
|
31
|
+
name: rspec
|
32
|
+
requirement: *id001
|
23
33
|
prerelease: false
|
24
|
-
version_requirements: *2160350020
|
25
34
|
description: datermine next scheduled crontab run
|
26
|
-
email:
|
27
|
-
-
|
35
|
+
email:
|
36
|
+
- ""
|
28
37
|
executables: []
|
38
|
+
|
29
39
|
extensions: []
|
40
|
+
|
30
41
|
extra_rdoc_files: []
|
31
|
-
|
42
|
+
|
43
|
+
files:
|
32
44
|
- .gitignore
|
33
45
|
- Gemfile
|
34
46
|
- README.md
|
@@ -39,30 +51,38 @@ files:
|
|
39
51
|
- lib/kronparser/version.rb
|
40
52
|
- spec/kronparser_spec.rb
|
41
53
|
- spec/spec_helper.rb
|
54
|
+
has_rdoc: true
|
42
55
|
homepage: https://github.com/mechamogera/kronparser
|
43
56
|
licenses: []
|
57
|
+
|
44
58
|
post_install_message:
|
45
59
|
rdoc_options: []
|
46
|
-
|
60
|
+
|
61
|
+
require_paths:
|
47
62
|
- lib
|
48
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
63
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
segments:
|
68
|
+
- 0
|
69
|
+
segments_generated: true
|
70
|
+
version: "0"
|
71
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
segments:
|
76
|
+
- 0
|
77
|
+
segments_generated: true
|
78
|
+
version: "0"
|
60
79
|
requirements: []
|
80
|
+
|
61
81
|
rubyforge_project: kronparser
|
62
|
-
rubygems_version: 1.
|
82
|
+
rubygems_version: 1.3.6
|
63
83
|
signing_key:
|
64
84
|
specification_version: 3
|
65
85
|
summary: datermine next scheduled crontab run
|
66
|
-
test_files:
|
86
|
+
test_files:
|
67
87
|
- spec/kronparser_spec.rb
|
68
88
|
- spec/spec_helper.rb
|