kronparser 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -1,3 +1,3 @@
1
1
  class KronParser
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -2,7 +2,7 @@ require 'spec_helper'
2
2
  require 'time'
3
3
 
4
4
  describe KronParser do
5
- it "could get next and last time" do
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
- version: 0.0.1
5
- prerelease:
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
- date: 2012-10-26 00:00:00.000000000 Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
15
- name: rspec
16
- requirement: &2160350020 !ruby/object:Gem::Requirement
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
- files:
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
- require_paths:
60
+
61
+ require_paths:
47
62
  - lib
48
- required_ruby_version: !ruby/object:Gem::Requirement
49
- none: false
50
- requirements:
51
- - - ! '>='
52
- - !ruby/object:Gem::Version
53
- version: '0'
54
- required_rubygems_version: !ruby/object:Gem::Requirement
55
- none: false
56
- requirements:
57
- - - ! '>='
58
- - !ruby/object:Gem::Version
59
- version: '0'
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.8.17
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