lowang-whenever 0.7.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,18 @@
1
+ # Want to test the files here, in lib, not in an installed version of the gem.
2
+ $:.unshift File.expand_path(File.dirname(__FILE__) + '/../lib')
3
+ require 'whenever'
4
+
5
+ require 'shoulda'
6
+ require 'mocha'
7
+
8
+ module TestExtensions
9
+
10
+ def two_hours
11
+ "0 0,2,4,6,8,10,12,14,16,18,20,22 * * *"
12
+ end
13
+
14
+ end
15
+
16
+ class Test::Unit::TestCase
17
+ include TestExtensions
18
+ end
@@ -0,0 +1,241 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../test_helper")
2
+
3
+ class CronTest < Test::Unit::TestCase
4
+
5
+ context "When parsing time in minutes" do
6
+ should "raise if less than 1 minute" do
7
+ assert_raises ArgumentError do
8
+ parse_time(59.seconds)
9
+ end
10
+
11
+ assert_raises ArgumentError do
12
+ parse_time(0.minutes)
13
+ end
14
+ end
15
+
16
+ # For santity, do some tests on straight String
17
+ should "parse correctly" do
18
+ assert_equal '* * * * *', parse_time(1.minute)
19
+ assert_equal '0,5,10,15,20,25,30,35,40,45,50,55 * * * *', parse_time(5.minutes)
20
+ assert_equal '7,14,21,28,35,42,49,56 * * * *', parse_time(7.minutes)
21
+ assert_equal '0,30 * * * *', parse_time(30.minutes)
22
+ assert_equal '32 * * * *', parse_time(32.minutes)
23
+ assert_not_equal '60 * * * *', parse_time(60.minutes) # 60 minutes bumps up into the hour range
24
+ end
25
+
26
+ # Test all minutes
27
+ (2..59).each do |num|
28
+ should "parse correctly for #{num} minutes" do
29
+ start = 0
30
+ start += num unless 60.modulo(num).zero?
31
+ minutes = (start..59).step(num).to_a
32
+
33
+ assert_equal "#{minutes.join(',')} * * * *", parse_time(num.minutes)
34
+ end
35
+ end
36
+ end
37
+
38
+ context "When parsing time in hours" do
39
+ should "parse correctly" do
40
+ assert_equal '0 * * * *', parse_time(1.hour)
41
+ assert_equal '0 0,2,4,6,8,10,12,14,16,18,20,22 * * *', parse_time(2.hours)
42
+ assert_equal '0 0,3,6,9,12,15,18,21 * * *', parse_time(3.hours)
43
+ assert_equal '0 5,10,15,20 * * *', parse_time(5.hours)
44
+ assert_equal '0 17 * * *', parse_time(17.hours)
45
+ assert_not_equal '0 24 * * *', parse_time(24.hours) # 24 hours bumps up into the day range
46
+ end
47
+
48
+ (2..23).each do |num|
49
+ should "parse correctly for #{num} hours" do
50
+ start = 0
51
+ start += num unless 24.modulo(num).zero?
52
+ hours = (start..23).step(num).to_a
53
+
54
+ assert_equal "0 #{hours.join(',')} * * *", parse_time(num.hours)
55
+ end
56
+ end
57
+
58
+ should "parse correctly when given an 'at' with minutes as an Integer" do
59
+ assert_minutes_equals "1", 1
60
+ assert_minutes_equals "14", 14
61
+ assert_minutes_equals "27", 27
62
+ assert_minutes_equals "55", 55
63
+ end
64
+
65
+ should "parse correctly when given an 'at' with minutes as a Time" do
66
+ # Basically just testing that Chronic parses some times and we get the minutes out of it
67
+ assert_minutes_equals "1", '3:01am'
68
+ assert_minutes_equals "1", 'January 21 2:01 PM'
69
+ assert_minutes_equals "0", 'midnight'
70
+ assert_minutes_equals "59", '13:59'
71
+ end
72
+ end
73
+
74
+ context "When parsing time in days (of month)" do
75
+ should "parse correctly" do
76
+ assert_equal '0 0 * * *', parse_time(1.days)
77
+ assert_equal '0 0 1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31 * *', parse_time(2.days)
78
+ assert_equal '0 0 1,5,9,13,17,21,25,29 * *', parse_time(4.days)
79
+ assert_equal '0 0 1,8,15,22 * *', parse_time(7.days)
80
+ assert_equal '0 0 1,17 * *', parse_time(16.days)
81
+ assert_equal '0 0 17 * *', parse_time(17.days)
82
+ assert_equal '0 0 29 * *', parse_time(29.days)
83
+ assert_not_equal '0 0 30 * *', parse_time(30.days) # 30 days bumps into the month range
84
+ end
85
+
86
+ should "parse correctly when given an 'at' with hours, minutes as a Time" do
87
+ # first param is an array with [hours, minutes]
88
+ assert_hours_and_minutes_equals %w(3 45), '3:45am'
89
+ assert_hours_and_minutes_equals %w(20 1), '8:01pm'
90
+ assert_hours_and_minutes_equals %w(0 0), 'midnight'
91
+ assert_hours_and_minutes_equals %w(1 23), '1:23 AM'
92
+ assert_hours_and_minutes_equals %w(23 59), 'March 21 11:59 pM'
93
+ end
94
+
95
+ should "parse correctly when given an 'at' with hours as an Integer" do
96
+ # first param is an array with [hours, minutes]
97
+ assert_hours_and_minutes_equals %w(1 0), 1
98
+ assert_hours_and_minutes_equals %w(3 0), 3
99
+ assert_hours_and_minutes_equals %w(15 0), 15
100
+ assert_hours_and_minutes_equals %w(19 0), 19
101
+ assert_hours_and_minutes_equals %w(23 0), 23
102
+ end
103
+ end
104
+
105
+ context "When parsing time in months" do
106
+ should "parse correctly" do
107
+ assert_equal '0 0 1 * *', parse_time(1.month)
108
+ assert_equal '0 0 1 1,3,5,7,9,11 *', parse_time(2.months)
109
+ assert_equal '0 0 1 1,4,7,10 *', parse_time(3.months)
110
+ assert_equal '0 0 1 1,5,9 *', parse_time(4.months)
111
+ assert_equal '0 0 1 1,6 *', parse_time(5.months)
112
+ assert_equal '0 0 1 7 *', parse_time(7.months)
113
+ assert_equal '0 0 1 8 *', parse_time(8.months)
114
+ assert_equal '0 0 1 9 *', parse_time(9.months)
115
+ assert_equal '0 0 1 10 *', parse_time(10.months)
116
+ assert_equal '0 0 1 11 *', parse_time(11.months)
117
+ assert_equal '0 0 1 12 *', parse_time(12.months)
118
+ end
119
+
120
+ should "parse correctly when given an 'at' with days, hours, minutes as a Time" do
121
+ # first param is an array with [days, hours, minutes]
122
+ assert_days_and_hours_and_minutes_equals %w(1 3 45), 'January 1st 3:45am'
123
+ assert_days_and_hours_and_minutes_equals %w(11 23 0), 'Feb 11 11PM'
124
+ assert_days_and_hours_and_minutes_equals %w(22 1 1), 'march 22nd at 1:01 am'
125
+ assert_days_and_hours_and_minutes_equals %w(23 0 0), 'march 22nd at midnight' # looks like midnight means the next day
126
+ end
127
+
128
+ should "parse correctly when given an 'at' with days as an Integer" do
129
+ # first param is an array with [days, hours, minutes]
130
+ assert_days_and_hours_and_minutes_equals %w(1 0 0), 1
131
+ assert_days_and_hours_and_minutes_equals %w(15 0 0), 15
132
+ assert_days_and_hours_and_minutes_equals %w(29 0 0), 29
133
+ end
134
+ end
135
+
136
+ context "When parsing time in days (of week)" do
137
+ should "parse days of the week correctly" do
138
+ {
139
+ '0' => %w(sun Sunday SUNDAY SUN),
140
+ '1' => %w(mon Monday MONDAY MON),
141
+ '2' => %w(tue tues Tuesday TUESDAY TUE),
142
+ '3' => %w(wed Wednesday WEDNESDAY WED),
143
+ '4' => %w(thu thurs thur Thursday THURSDAY THU),
144
+ '5' => %w(fri Friday FRIDAY FRI),
145
+ '6' => %w(sat Saturday SATURDAY SAT)
146
+ }.each do |day, day_tests|
147
+ day_tests.each do |day_test|
148
+ assert_equal "0 0 * * #{day}", parse_time(day_test)
149
+ end
150
+ end
151
+ end
152
+
153
+ should "allow additional directives" do
154
+ assert_equal '30 13 * * 5', parse_time('friday', nil, "1:30 pm")
155
+ assert_equal '22 2 * * 1', parse_time('Monday', nil, "2:22am")
156
+ assert_equal '55 17 * * 4', parse_time('THU', nil, "5:55PM")
157
+ end
158
+
159
+ should "parse weekday correctly" do
160
+ assert_equal '0 0 * * 1-5', parse_time('weekday')
161
+ assert_equal '0 0 * * 1-5', parse_time('Weekdays')
162
+ assert_equal '0 1 * * 1-5', parse_time('Weekdays', nil, "1:00 am")
163
+ assert_equal '59 5 * * 1-5', parse_time('Weekdays', nil, "5:59 am")
164
+ end
165
+
166
+ should "parse weekend correctly" do
167
+ assert_equal '0 0 * * 6,0', parse_time('weekend')
168
+ assert_equal '0 0 * * 6,0', parse_time('Weekends')
169
+ assert_equal '0 7 * * 6,0', parse_time('Weekends', nil, "7am")
170
+ assert_equal '2 18 * * 6,0', parse_time('Weekends', nil, "6:02PM")
171
+ end
172
+ end
173
+
174
+ context "When parsing time using the cron shortcuts" do
175
+ should "parse a :symbol into the correct shortcut" do
176
+ assert_equal '@reboot', parse_time(:reboot)
177
+ assert_equal '@annually', parse_time(:annually)
178
+ assert_equal '@annually', parse_time(:yearly)
179
+ assert_equal '@daily', parse_time(:daily)
180
+ assert_equal '@midnight', parse_time(:midnight)
181
+ assert_equal '@monthly', parse_time(:monthly)
182
+ assert_equal '@weekly', parse_time(:weekly)
183
+ assert_equal '@hourly', parse_time(:hourly)
184
+ end
185
+
186
+ should "convert time-based shortcuts to times" do
187
+ assert_equal '0 0 1 * *', parse_time(:month)
188
+ assert_equal '0 0 * * *', parse_time(:day)
189
+ assert_equal '0 * * * *', parse_time(:hour)
190
+ assert_equal '0 0 1 12 *', parse_time(:year)
191
+ assert_equal '0 0 1,8,15,22 * *', parse_time(:week)
192
+ end
193
+
194
+ should "raise an exception if a valid shortcut is given but also an :at" do
195
+ assert_raises ArgumentError do
196
+ parse_time(:hourly, nil, "1:00 am")
197
+ end
198
+
199
+ assert_raises ArgumentError do
200
+ parse_time(:reboot, nil, 5)
201
+ end
202
+
203
+ assert_raises ArgumentError do
204
+ parse_time(:daily, nil, '4:20pm')
205
+ end
206
+ end
207
+ end
208
+
209
+ context "When given raw cron sytax" do
210
+ should "return the same cron sytax" do
211
+ crons = ['0 0 27-31 * *', '* * * * *', '2/3 1,9,22 11-26 1-6 *']
212
+ crons.each do |cron|
213
+ assert_equal cron, parse_time(cron)
214
+ end
215
+ end
216
+ end
217
+
218
+ private
219
+
220
+ def assert_days_and_hours_and_minutes_equals(expected, time)
221
+ cron = parse_time(2.months, 'some task', time)
222
+ minutes, hours, days, *garbage = cron.split(' ')
223
+ assert_equal expected, [days, hours, minutes]
224
+ end
225
+
226
+ def assert_hours_and_minutes_equals(expected, time)
227
+ cron = parse_time(2.days, 'some task', time)
228
+ minutes, hours, *garbage = cron.split(' ')
229
+ assert_equal expected, [hours, minutes]
230
+ end
231
+
232
+ def assert_minutes_equals(expected, time)
233
+ cron = parse_time(2.hours, 'some task', time)
234
+ assert_equal expected, cron.split(' ')[0]
235
+ end
236
+
237
+ def parse_time(time = nil, task = nil, at = nil)
238
+ Whenever::Output::Cron.new(time, task, at).time_in_cron_syntax
239
+ end
240
+
241
+ end
@@ -0,0 +1,77 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../test_helper")
2
+
3
+ class JobTest < Test::Unit::TestCase
4
+
5
+ context "A Job" do
6
+ should "return the :at set when #at is called" do
7
+ assert_equal 'foo', new_job(:at => 'foo').at
8
+ end
9
+
10
+ should "substitute the :task when #output is called" do
11
+ job = new_job(:template => ":task", :task => 'abc123')
12
+ assert_equal 'abc123', job.output
13
+ end
14
+
15
+ should "substitute the :path when #output is called" do
16
+ assert_equal 'foo', new_job(:template => ':path', :path => 'foo').output
17
+ end
18
+
19
+ should "substitute the :path with the default Whenever.path if none is provided when #output is called" do
20
+ Whenever.expects(:path).returns('/my/path')
21
+ assert_equal '/my/path', new_job(:template => ':path').output
22
+ end
23
+ end
24
+
25
+
26
+ context "A Job with quotes" do
27
+ should "output the :task if it's in single quotes" do
28
+ job = new_job(:template => "':task'", :task => 'abc123')
29
+ assert_equal %q('abc123'), job.output
30
+ end
31
+
32
+ should "output the :task if it's in double quotes" do
33
+ job = new_job(:template => '":task"', :task => 'abc123')
34
+ assert_equal %q("abc123"), job.output
35
+ end
36
+
37
+ should "output escaped single quotes in when it's wrapped in them" do
38
+ job = new_job(
39
+ :template => "before ':foo' after",
40
+ :foo => "quote -> ' <- quote"
41
+ )
42
+ assert_equal %q(before 'quote -> '\'' <- quote' after), job.output
43
+ end
44
+
45
+ should "output escaped double quotes when it's wrapped in them" do
46
+ job = new_job(
47
+ :template => 'before ":foo" after',
48
+ :foo => 'quote -> " <- quote'
49
+ )
50
+ assert_equal %q(before "quote -> \" <- quote" after), job.output
51
+ end
52
+ end
53
+
54
+ context "A Job with a job_template" do
55
+ should "use the job template" do
56
+ job = new_job(:template => ':task', :task => 'abc123', :job_template => 'left :job right')
57
+ assert_equal 'left abc123 right', job.output
58
+ end
59
+
60
+ should "escape single quotes" do
61
+ job = new_job(:template => "before ':task' after", :task => "quote -> ' <- quote", :job_template => "left ':job' right")
62
+ assert_equal %q(left 'before '\''quote -> '\\''\\'\\'''\\'' <- quote'\'' after' right), job.output
63
+ end
64
+
65
+ should "escape double quotes" do
66
+ job = new_job(:template => 'before ":task" after', :task => 'quote -> " <- quote', :job_template => 'left ":job" right')
67
+ assert_equal %q(left "before \"quote -> \\\" <- quote\" after" right), job.output
68
+ end
69
+ end
70
+
71
+ private
72
+
73
+ def new_job(options={})
74
+ Whenever::Job.new(options)
75
+ end
76
+
77
+ end
data/whenever.gemspec ADDED
@@ -0,0 +1,31 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "whenever/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "lowang-whenever"
7
+ s.version = Whenever::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Javan Makhmali"]
10
+ s.email = ["javan@javan.us"]
11
+ s.homepage = ""
12
+ s.summary = %q{Cron jobs in ruby.}
13
+ s.description = %q{Clean ruby syntax for writing and deploying cron jobs.}
14
+ s.files = `git ls-files`.split("\n")
15
+ s.test_files = `git ls-files -- test/{functional,unit}/*`.split("\n")
16
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
17
+ s.require_paths = ["lib"]
18
+
19
+ s.add_dependency "chronic", "~> 0.6.3"
20
+ s.add_dependency "activesupport", ">= 2.3.2"
21
+
22
+ s.add_development_dependency "shoulda", ">= 2.1.1"
23
+ s.add_development_dependency "mocha", ">= 0.9.5"
24
+ s.add_development_dependency "rake"
25
+
26
+ # I'm not sure why this isn't installed along with activesupport,
27
+ # but for whatever reason running `bundle install` doesn't install
28
+ # i18n so I'm adding it here for now.
29
+ # https://github.com/rails/rails/blob/master/activesupport/activesupport.gemspec#L19 ?
30
+ s.add_development_dependency "i18n"
31
+ end
metadata ADDED
@@ -0,0 +1,172 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lowang-whenever
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 7
8
+ - 0
9
+ - 1
10
+ version: 0.7.0.1
11
+ platform: ruby
12
+ authors:
13
+ - Javan Makhmali
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2011-09-22 00:00:00 +02:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: chronic
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - ~>
27
+ - !ruby/object:Gem::Version
28
+ segments:
29
+ - 0
30
+ - 6
31
+ - 3
32
+ version: 0.6.3
33
+ type: :runtime
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: activesupport
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ segments:
43
+ - 2
44
+ - 3
45
+ - 2
46
+ version: 2.3.2
47
+ type: :runtime
48
+ version_requirements: *id002
49
+ - !ruby/object:Gem::Dependency
50
+ name: shoulda
51
+ prerelease: false
52
+ requirement: &id003 !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ segments:
57
+ - 2
58
+ - 1
59
+ - 1
60
+ version: 2.1.1
61
+ type: :development
62
+ version_requirements: *id003
63
+ - !ruby/object:Gem::Dependency
64
+ name: mocha
65
+ prerelease: false
66
+ requirement: &id004 !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ segments:
71
+ - 0
72
+ - 9
73
+ - 5
74
+ version: 0.9.5
75
+ type: :development
76
+ version_requirements: *id004
77
+ - !ruby/object:Gem::Dependency
78
+ name: rake
79
+ prerelease: false
80
+ requirement: &id005 !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ segments:
85
+ - 0
86
+ version: "0"
87
+ type: :development
88
+ version_requirements: *id005
89
+ - !ruby/object:Gem::Dependency
90
+ name: i18n
91
+ prerelease: false
92
+ requirement: &id006 !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ segments:
97
+ - 0
98
+ version: "0"
99
+ type: :development
100
+ version_requirements: *id006
101
+ description: Clean ruby syntax for writing and deploying cron jobs.
102
+ email:
103
+ - javan@javan.us
104
+ executables:
105
+ - whenever
106
+ - wheneverize
107
+ extensions: []
108
+
109
+ extra_rdoc_files: []
110
+
111
+ files:
112
+ - .gitignore
113
+ - .travis.yml
114
+ - CHANGELOG.md
115
+ - Gemfile
116
+ - LICENSE
117
+ - README.md
118
+ - Rakefile
119
+ - VERSION
120
+ - bin/whenever
121
+ - bin/wheneverize
122
+ - lib/whenever.rb
123
+ - lib/whenever/capistrano.rb
124
+ - lib/whenever/command_line.rb
125
+ - lib/whenever/cron.rb
126
+ - lib/whenever/job.rb
127
+ - lib/whenever/job_list.rb
128
+ - lib/whenever/output_redirection.rb
129
+ - lib/whenever/setup.rb
130
+ - lib/whenever/version.rb
131
+ - test/functional/command_line_test.rb
132
+ - test/functional/output_at_test.rb
133
+ - test/functional/output_default_defined_jobs_test.rb
134
+ - test/functional/output_defined_job_test.rb
135
+ - test/functional/output_env_test.rb
136
+ - test/functional/output_redirection_test.rb
137
+ - test/test_helper.rb
138
+ - test/unit/cron_test.rb
139
+ - test/unit/job_test.rb
140
+ - whenever.gemspec
141
+ has_rdoc: true
142
+ homepage: ""
143
+ licenses: []
144
+
145
+ post_install_message:
146
+ rdoc_options: []
147
+
148
+ require_paths:
149
+ - lib
150
+ required_ruby_version: !ruby/object:Gem::Requirement
151
+ requirements:
152
+ - - ">="
153
+ - !ruby/object:Gem::Version
154
+ segments:
155
+ - 0
156
+ version: "0"
157
+ required_rubygems_version: !ruby/object:Gem::Requirement
158
+ requirements:
159
+ - - ">="
160
+ - !ruby/object:Gem::Version
161
+ segments:
162
+ - 0
163
+ version: "0"
164
+ requirements: []
165
+
166
+ rubyforge_project:
167
+ rubygems_version: 1.3.6
168
+ signing_key:
169
+ specification_version: 3
170
+ summary: Cron jobs in ruby.
171
+ test_files: []
172
+