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 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