cron-spec 0.1.0

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.
@@ -0,0 +1,16 @@
1
+ module CronSpec
2
+
3
+ class MinuteFactory < CronSpecificationFactory
4
+
5
+ MinuteLowerLimit = 0
6
+ MinuteUpperLimit = 59
7
+
8
+ def initialize
9
+ super
10
+ @lower_limit = MinuteLowerLimit
11
+ @upper_limit = MinuteUpperLimit
12
+ end
13
+
14
+ end
15
+
16
+ end
@@ -0,0 +1,32 @@
1
+ module CronSpec
2
+ class MonthFactory < CronSpecificationFactory
3
+
4
+ MonthLowerLimit = 1
5
+ MonthUpperLimit = 12
6
+
7
+ Months = %w{ jan feb mar apr may jun jul aug sep oct nov dec }
8
+
9
+ MonthExpression = Months.join('|')
10
+
11
+ MonthSingleValuePattern = /\A(#{MonthExpression}|\d+)\z/
12
+
13
+ MonthRangePattern = /\A(#{MonthExpression}|\d+)-(#{MonthExpression}|\d+)\z/
14
+
15
+ NamedMonthPattern = /\A(#{MonthExpression})\z/
16
+
17
+ def initialize
18
+ super
19
+ @lower_limit = MonthLowerLimit
20
+ @upper_limit = MonthUpperLimit
21
+ @single_value_pattern = MonthSingleValuePattern
22
+ @range_pattern = MonthRangePattern
23
+ end
24
+
25
+ private
26
+
27
+ def convert_value(value)
28
+ (value =~ NamedMonthPattern) ? Months.index(value) + 1 : value.to_i
29
+ end
30
+
31
+ end
32
+ end
@@ -0,0 +1,23 @@
1
+ module CronSpec
2
+
3
+ class RangeCronValue < CronValueBase
4
+
5
+ attr_reader :range_lower, :range_upper
6
+
7
+ def initialize(lower_limit, upper_limit, range_lower, range_upper)
8
+ super(lower_limit, upper_limit)
9
+ @range_lower = range_lower
10
+ @range_upper = range_upper
11
+
12
+ raise "Invalid lower range value: #{@range_lower}" unless is_value_within_limits?(@range_lower)
13
+ raise "Invalid upper range value: #{@range_upper}" unless is_value_within_limits?(@range_upper)
14
+ raise "Lower limit must be less than or equal to the upper limit" if @range_lower > @range_upper
15
+ end
16
+
17
+ def is_effective?(value)
18
+ @range_lower <= value && value <= @range_upper
19
+ end
20
+
21
+ end
22
+
23
+ end
@@ -0,0 +1,21 @@
1
+ module CronSpec
2
+
3
+ class SingleValueCronValue < CronValueBase
4
+
5
+ attr_reader :single_value
6
+
7
+ def initialize(lower_limit, upper_limit, single_value)
8
+ super(lower_limit, upper_limit)
9
+
10
+ @single_value = single_value
11
+
12
+ raise "Value is out of range: #{@single_value}" unless is_value_within_limits?(@single_value)
13
+ end
14
+
15
+ def is_effective?(value)
16
+ @single_value == value
17
+ end
18
+
19
+ end
20
+
21
+ end
@@ -0,0 +1,21 @@
1
+ module CronSpec
2
+
3
+ class StepCronValue < CronValueBase
4
+
5
+ attr_reader :step_value
6
+
7
+ def initialize(lower_limit, upper_limit, step_value)
8
+ super(lower_limit, upper_limit)
9
+
10
+ @step_value = step_value
11
+
12
+ raise "Invalid step value: #{@step_value}" if step_value == 0 || step_value > upper_limit
13
+ end
14
+
15
+ def is_effective?(value)
16
+ value % @step_value == 0
17
+ end
18
+
19
+ end
20
+
21
+ end
@@ -0,0 +1,15 @@
1
+ module CronSpec
2
+
3
+ class WildcardCronValue < CronValueBase
4
+
5
+ def initialize(lower_limit, upper_limit)
6
+ super(lower_limit, upper_limit)
7
+ end
8
+
9
+ def is_effective?(value)
10
+ true
11
+ end
12
+
13
+ end
14
+
15
+ end
@@ -0,0 +1,119 @@
1
+ require 'spec_helper'
2
+
3
+ describe CronSpec::CronSpecification do
4
+
5
+ it "should honor the yearly shortcut value" do
6
+ cs = CronSpec::CronSpecification.new("@yearly")
7
+
8
+ # Verify that we will match if at midnight january 1st
9
+ jan_1_00_00 = Time.new(2011, 1, 1, 0, 0, 0)
10
+ cs.is_specification_in_effect?(jan_1_00_00).should be true
11
+
12
+ # Verify that nothing else matches
13
+ jan_1_00_10 = Time.new(2011, 1, 1, 0, 10, 0)
14
+ cs.is_specification_in_effect?(jan_1_00_10).should be false
15
+ end
16
+
17
+ it "should honor the annually shortcut value" do
18
+ cs = CronSpec::CronSpecification.new("@annually")
19
+
20
+ # Verify that we will match if at midnight january 1st
21
+ jan_1_00_00 = Time.new(2011, 1, 1, 0, 0, 0)
22
+ cs.is_specification_in_effect?(jan_1_00_00).should be true
23
+
24
+ # Verify that nothing else matches
25
+ jan_1_00_10 = Time.new(2011, 1, 1, 0, 10, 0)
26
+ cs.is_specification_in_effect?(jan_1_00_10).should be false
27
+ end
28
+
29
+ it "should honor the monthly shortcut value" do
30
+ cs = CronSpec::CronSpecification.new("@monthly")
31
+
32
+ # Verify that we will match if at midnight january 1st
33
+ (1..12).each do |month|
34
+ any_month_at_midnight = Time.new(2011, month, 1, 0, 0, 0)
35
+ cs.is_specification_in_effect?(any_month_at_midnight).should be true
36
+ end
37
+
38
+ # Verify that nothing else matches
39
+ jan_1_00_10 = Time.new(2011, 1, 2, 0, 10, 0)
40
+ cs.is_specification_in_effect?(jan_1_00_10).should be false
41
+ end
42
+
43
+ it "should honor the weekly shortcut value" do
44
+ cs = CronSpec::CronSpecification.new("@weekly")
45
+
46
+ # It should honor every sunday
47
+ (0..3).each do |week|
48
+ sunday = Time.new(2011, 1, 2 + (week * 7), 0, 0, 0)
49
+ cs.is_specification_in_effect?(sunday).should be true
50
+ end
51
+ # It should ignore every monday
52
+ (0..3).each do |week|
53
+ sunday = Time.new(2011, 1, 3 + (week * 7), 0, 0, 0)
54
+ cs.is_specification_in_effect?(sunday).should be false
55
+ end
56
+ end
57
+
58
+ it "should honor the daily shortcut value" do
59
+ cs = CronSpec::CronSpecification.new("@daily")
60
+
61
+ # It should honor every day of the week at midnight
62
+ (1..20).each do |day|
63
+ sunday = Time.new(2011, 1, day, 0, 0, 0)
64
+ cs.is_specification_in_effect?(sunday).should be true
65
+ end
66
+ # It should ignore every day of the week at times other than midnight
67
+ (1..20).each do |day|
68
+ sunday = Time.new(2011, 1, day, 8, 0, 0)
69
+ cs.is_specification_in_effect?(sunday).should be false
70
+ end
71
+ end
72
+
73
+ it "should honor the midnight shortcut value" do
74
+ cs = CronSpec::CronSpecification.new("@midnight")
75
+
76
+ # It should honor every day of the week at midnight
77
+ (1..20).each do |day|
78
+ sunday = Time.new(2011, 1, day, 0, 0, 0)
79
+ cs.is_specification_in_effect?(sunday).should be true
80
+ end
81
+ # It should ignore every day of the week at times other than midnight
82
+ (1..20).each do |day|
83
+ sunday = Time.new(2011, 1, day, 8, 0, 0)
84
+ cs.is_specification_in_effect?(sunday).should be false
85
+ end
86
+ end
87
+
88
+ it "should honor the hourly shortcut value" do
89
+ cs = CronSpec::CronSpecification.new("@hourly")
90
+
91
+ # It should honor every day of the week at midnight
92
+ (0..23).each do |hour|
93
+ sunday = Time.new(2011, 1, 1, hour, 0, 0)
94
+ cs.is_specification_in_effect?(sunday).should be true
95
+ end
96
+ # It should ignore every day of the week at times other than midnight
97
+ (0..23).each do |hour|
98
+ sunday = Time.new(2011, 1, 1, hour, 10, 0)
99
+ cs.is_specification_in_effect?(sunday).should be false
100
+ end
101
+ end
102
+
103
+ it "should honor named days of the week" do
104
+ cs = CronSpec::CronSpecification.new("* * * * mon,tue,thu-sat")
105
+
106
+ # Make sure the correct days are honored
107
+ [1, 2, 4, 5, 6].each do |dow|
108
+ # next if dow == 4
109
+ day = Time.new(2011, 1, 2 + dow, 11, 0, 0)
110
+ cs.is_specification_in_effect?(day).should be true
111
+ end
112
+
113
+ # Make sure the bad days are ignored.
114
+ [0, 3].each do |dow|
115
+ day = Time.new(2011, 1, 2 + dow, 11, 0, 0)
116
+ cs.is_specification_in_effect?(day).should be false
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+
3
+ describe CronSpec::RangeCronValue do
4
+
5
+ before(:each) do
6
+ @cv = CronSpec::RangeCronValue.new(0, 16, 2, 12)
7
+ end
8
+
9
+ it "should indicate effective if value is within range" do
10
+ (2..12).each { | value | @cv.is_effective?(value).should be true }
11
+ end
12
+
13
+ it "should indicate not effective if value is not within range" do
14
+ (-1..1).each { | value | @cv.is_effective?(value).should be false }
15
+ (13..16).each { | value | @cv.is_effective?(value).should be false }
16
+ end
17
+
18
+ end
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+
3
+ describe CronSpec::SingleValueCronValue do
4
+
5
+ before(:each) do
6
+ @cv = CronSpec::SingleValueCronValue.new(0, 32, 8)
7
+ end
8
+
9
+ it "should indicate effective if the value matches" do
10
+ @cv.is_effective?(8).should be true
11
+ end
12
+
13
+ it "should indicate not effective if value does not match" do
14
+ (-1..7).each { | value | @cv.is_effective?(value).should be false }
15
+ (9..32).each { | value | @cv.is_effective?(value).should be false }
16
+ end
17
+
18
+ end
@@ -0,0 +1,12 @@
1
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
3
+ require 'rspec'
4
+ require 'cron-spec'
5
+
6
+ # Requires supporting files with custom matchers and macros, etc,
7
+ # in ./support/ and its subdirectories.
8
+ Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
9
+
10
+ RSpec.configure do |config|
11
+
12
+ end
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+
3
+ describe CronSpec::StepCronValue do
4
+
5
+ before(:each) do
6
+ @cv = CronSpec::StepCronValue.new(0, 32, 2)
7
+ end
8
+
9
+ it "should indicate effective if the values match the step" do
10
+ (0..32).each { | value | next unless (value % 2 == 0); @cv.is_effective?(value).should be true }
11
+ end
12
+
13
+ it "should indicate not effective if the values do not match the step" do
14
+ (0..32).each { | value | next if (value % 2 == 0); @cv.is_effective?(value).should be false }
15
+ end
16
+
17
+ end
@@ -0,0 +1,13 @@
1
+ require 'spec_helper'
2
+
3
+ describe CronSpec::WildcardCronValue do
4
+
5
+ before(:each) do
6
+ @cv = CronSpec::WildcardCronValue.new(0, 32)
7
+ end
8
+
9
+ it "should indicate effective for all values within limits" do
10
+ (0..32).each { | value | @cv.is_effective?(value).should be true }
11
+ end
12
+
13
+ end
metadata ADDED
@@ -0,0 +1,164 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cron-spec
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 1
8
+ - 0
9
+ version: 0.1.0
10
+ platform: ruby
11
+ authors:
12
+ - Dave Sieh
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2011-02-27 00:00:00 -07:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: rspec
22
+ requirement: &id001 !ruby/object:Gem::Requirement
23
+ none: false
24
+ requirements:
25
+ - - ~>
26
+ - !ruby/object:Gem::Version
27
+ segments:
28
+ - 2
29
+ - 1
30
+ - 0
31
+ version: 2.1.0
32
+ type: :development
33
+ prerelease: false
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: bundler
37
+ requirement: &id002 !ruby/object:Gem::Requirement
38
+ none: false
39
+ requirements:
40
+ - - ~>
41
+ - !ruby/object:Gem::Version
42
+ segments:
43
+ - 1
44
+ - 0
45
+ - 0
46
+ version: 1.0.0
47
+ type: :development
48
+ prerelease: false
49
+ version_requirements: *id002
50
+ - !ruby/object:Gem::Dependency
51
+ name: jeweler
52
+ requirement: &id003 !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ~>
56
+ - !ruby/object:Gem::Version
57
+ segments:
58
+ - 1
59
+ - 5
60
+ - 2
61
+ version: 1.5.2
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: *id003
65
+ - !ruby/object:Gem::Dependency
66
+ name: rcov
67
+ requirement: &id004 !ruby/object:Gem::Requirement
68
+ none: false
69
+ requirements:
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ segments:
73
+ - 0
74
+ version: "0"
75
+ type: :development
76
+ prerelease: false
77
+ version_requirements: *id004
78
+ description: Cron specification implementation
79
+ email: dave.sieh@nursinghomequality.com
80
+ executables: []
81
+
82
+ extensions: []
83
+
84
+ extra_rdoc_files:
85
+ - LICENSE.txt
86
+ - README.rdoc
87
+ files:
88
+ - .document
89
+ - .idea/.name
90
+ - .idea/.rakeTasks
91
+ - .idea/cron-spec.iml
92
+ - .idea/encodings.xml
93
+ - .idea/misc.xml
94
+ - .idea/modules.xml
95
+ - .idea/vcs.xml
96
+ - .idea/workspace.xml
97
+ - .rspec
98
+ - .rvmrc
99
+ - Gemfile
100
+ - Gemfile.lock
101
+ - LICENSE.txt
102
+ - README.rdoc
103
+ - Rakefile
104
+ - VERSION
105
+ - cron-spec.gemspec
106
+ - lib/cron-spec.rb
107
+ - lib/cron-spec/cron_specification.rb
108
+ - lib/cron-spec/cron_specification_factory.rb
109
+ - lib/cron-spec/cron_value_base.rb
110
+ - lib/cron-spec/day_factory.rb
111
+ - lib/cron-spec/dow_factory.rb
112
+ - lib/cron-spec/hour_factory.rb
113
+ - lib/cron-spec/minute_factory.rb
114
+ - lib/cron-spec/month_factory.rb
115
+ - lib/cron-spec/range_cron_value.rb
116
+ - lib/cron-spec/single_value_cron_value.rb
117
+ - lib/cron-spec/step_cron_value.rb
118
+ - lib/cron-spec/wildcard_cron_value.rb
119
+ - spec/cron_specification_spec.rb
120
+ - spec/range_cron_value_spec.rb
121
+ - spec/single_value_cron_value_spec.rb
122
+ - spec/spec_helper.rb
123
+ - spec/step_cron_value_spec.rb
124
+ - spec/wildcard_cron_value_spec.rb
125
+ has_rdoc: true
126
+ homepage: http://github.com/j0hnds/cron-spec
127
+ licenses:
128
+ - MIT
129
+ post_install_message:
130
+ rdoc_options: []
131
+
132
+ require_paths:
133
+ - lib
134
+ required_ruby_version: !ruby/object:Gem::Requirement
135
+ none: false
136
+ requirements:
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ hash: 3189745320292493514
140
+ segments:
141
+ - 0
142
+ version: "0"
143
+ required_rubygems_version: !ruby/object:Gem::Requirement
144
+ none: false
145
+ requirements:
146
+ - - ">="
147
+ - !ruby/object:Gem::Version
148
+ segments:
149
+ - 0
150
+ version: "0"
151
+ requirements: []
152
+
153
+ rubyforge_project:
154
+ rubygems_version: 1.3.7
155
+ signing_key:
156
+ specification_version: 3
157
+ summary: Cron specification implementation
158
+ test_files:
159
+ - spec/cron_specification_spec.rb
160
+ - spec/range_cron_value_spec.rb
161
+ - spec/single_value_cron_value_spec.rb
162
+ - spec/spec_helper.rb
163
+ - spec/step_cron_value_spec.rb
164
+ - spec/wildcard_cron_value_spec.rb