lowang-whenever 0.7.0.1
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/.gitignore +5 -0
- data/.travis.yml +5 -0
- data/CHANGELOG.md +187 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +165 -0
- data/Rakefile +17 -0
- data/VERSION +1 -0
- data/bin/whenever +38 -0
- data/bin/wheneverize +68 -0
- data/lib/whenever.rb +29 -0
- data/lib/whenever/capistrano.rb +62 -0
- data/lib/whenever/command_line.rb +133 -0
- data/lib/whenever/cron.rb +149 -0
- data/lib/whenever/job.rb +45 -0
- data/lib/whenever/job_list.rb +145 -0
- data/lib/whenever/output_redirection.rb +56 -0
- data/lib/whenever/setup.rb +24 -0
- data/lib/whenever/version.rb +3 -0
- data/test/functional/command_line_test.rb +322 -0
- data/test/functional/output_at_test.rb +268 -0
- data/test/functional/output_default_defined_jobs_test.rb +182 -0
- data/test/functional/output_defined_job_test.rb +111 -0
- data/test/functional/output_env_test.rb +33 -0
- data/test/functional/output_redirection_test.rb +307 -0
- data/test/test_helper.rb +18 -0
- data/test/unit/cron_test.rb +241 -0
- data/test/unit/job_test.rb +77 -0
- data/whenever.gemspec +31 -0
- metadata +172 -0
@@ -0,0 +1,268 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + "/../test_helper")
|
2
|
+
|
3
|
+
class OutputAtTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
context "weekday at a (single) given time" do
|
6
|
+
setup do
|
7
|
+
@output = Whenever.cron \
|
8
|
+
<<-file
|
9
|
+
set :job_template, nil
|
10
|
+
every "weekday", :at => '5:02am' do
|
11
|
+
command "blahblah"
|
12
|
+
end
|
13
|
+
file
|
14
|
+
end
|
15
|
+
|
16
|
+
should "output the command using that time" do
|
17
|
+
assert_match '2 5 * * 1-5 blahblah', @output
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
context "weekday at a multiple diverse times, via an array" do
|
22
|
+
setup do
|
23
|
+
@output = Whenever.cron \
|
24
|
+
<<-file
|
25
|
+
set :job_template, nil
|
26
|
+
every "weekday", :at => %w(5:02am 3:52pm) do
|
27
|
+
command "blahblah"
|
28
|
+
end
|
29
|
+
file
|
30
|
+
end
|
31
|
+
|
32
|
+
should "output the commands for both times given" do
|
33
|
+
assert_match '2 5 * * 1-5 blahblah', @output
|
34
|
+
assert_match '52 15 * * 1-5 blahblah', @output
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context "weekday at a multiple diverse times, comma separated" do
|
39
|
+
setup do
|
40
|
+
@output = Whenever.cron \
|
41
|
+
<<-file
|
42
|
+
set :job_template, nil
|
43
|
+
every "weekday", :at => '5:02am, 3:52pm' do
|
44
|
+
command "blahblah"
|
45
|
+
end
|
46
|
+
file
|
47
|
+
end
|
48
|
+
|
49
|
+
should "output the commands for both times given" do
|
50
|
+
assert_match '2 5 * * 1-5 blahblah', @output
|
51
|
+
assert_match '52 15 * * 1-5 blahblah', @output
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context "weekday at a multiple aligned times" do
|
56
|
+
setup do
|
57
|
+
@output = Whenever.cron \
|
58
|
+
<<-file
|
59
|
+
set :job_template, nil
|
60
|
+
every "weekday", :at => '5:02am, 3:02pm' do
|
61
|
+
command "blahblah"
|
62
|
+
end
|
63
|
+
file
|
64
|
+
end
|
65
|
+
|
66
|
+
should "output the command using one entry because the times are aligned" do
|
67
|
+
assert_match '2 5,15 * * 1-5 blahblah', @output
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
context "various days at a various aligned times" do
|
72
|
+
setup do
|
73
|
+
@output = Whenever.cron \
|
74
|
+
<<-file
|
75
|
+
set :job_template, nil
|
76
|
+
every "mon,wed,fri", :at => '5:02am, 3:02pm' do
|
77
|
+
command "blahblah"
|
78
|
+
end
|
79
|
+
file
|
80
|
+
end
|
81
|
+
|
82
|
+
should "output the command using one entry because the times are aligned" do
|
83
|
+
assert_match '2 5,15 * * 1,3,5 blahblah', @output
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
context "various days at a various aligned times using a runner" do
|
88
|
+
setup do
|
89
|
+
@output = Whenever.cron \
|
90
|
+
<<-file
|
91
|
+
set :job_template, nil
|
92
|
+
set :path, '/your/path'
|
93
|
+
every "mon,wed,fri", :at => '5:02am, 3:02pm' do
|
94
|
+
runner "blahblah"
|
95
|
+
end
|
96
|
+
file
|
97
|
+
end
|
98
|
+
|
99
|
+
should "output the runner using one entry because the times are aligned" do
|
100
|
+
assert_match %(2 5,15 * * 1,3,5 cd /your/path && script/runner -e production 'blahblah'), @output
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
context "various days at a various aligned times using a rake task" do
|
105
|
+
setup do
|
106
|
+
@output = Whenever.cron \
|
107
|
+
<<-file
|
108
|
+
set :job_template, nil
|
109
|
+
set :path, '/your/path'
|
110
|
+
every "mon,wed,fri", :at => '5:02am, 3:02pm' do
|
111
|
+
rake "blah:blah"
|
112
|
+
end
|
113
|
+
file
|
114
|
+
end
|
115
|
+
|
116
|
+
should "output the rake task using one entry because the times are aligned" do
|
117
|
+
assert_match '2 5,15 * * 1,3,5 cd /your/path && RAILS_ENV=production bundle exec rake blah:blah --silent', @output
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
context "A command every 1.month at very diverse times" do
|
122
|
+
setup do
|
123
|
+
@output = Whenever.cron \
|
124
|
+
<<-file
|
125
|
+
set :job_template, nil
|
126
|
+
every [1.month, 1.day], :at => 'january 5:02am, june 17th at 2:22pm, june 3rd at 3:33am' do
|
127
|
+
command "blahblah"
|
128
|
+
end
|
129
|
+
file
|
130
|
+
end
|
131
|
+
|
132
|
+
should "output 6 commands since none align" do
|
133
|
+
# The 1.month commands
|
134
|
+
assert_match '2 5 1 * * blahblah', @output
|
135
|
+
assert_match '22 14 17 * * blahblah', @output
|
136
|
+
assert_match '33 3 3 * * blahblah', @output
|
137
|
+
|
138
|
+
# The 1.day commands
|
139
|
+
assert_match '2 5 * * * blahblah', @output
|
140
|
+
assert_match '22 14 * * * blahblah', @output
|
141
|
+
assert_match '33 3 * * * blahblah', @output
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
context "Multiple commands output every :reboot" do
|
146
|
+
setup do
|
147
|
+
@output = Whenever.cron \
|
148
|
+
<<-file
|
149
|
+
set :job_template, nil
|
150
|
+
every :reboot do
|
151
|
+
command "command_1"
|
152
|
+
command "command_2"
|
153
|
+
end
|
154
|
+
file
|
155
|
+
end
|
156
|
+
|
157
|
+
should "output both commands @reboot" do
|
158
|
+
assert_match "@reboot command_1", @output
|
159
|
+
assert_match "@reboot command_2", @output
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
context "Many different job types output every :day" do
|
164
|
+
setup do
|
165
|
+
@output = Whenever.cron \
|
166
|
+
<<-file
|
167
|
+
set :job_template, nil
|
168
|
+
set :path, '/your/path'
|
169
|
+
every :daily do
|
170
|
+
rake "blah:blah"
|
171
|
+
runner "runner_1"
|
172
|
+
command "command_1"
|
173
|
+
runner "runner_2"
|
174
|
+
command "command_2"
|
175
|
+
end
|
176
|
+
file
|
177
|
+
end
|
178
|
+
|
179
|
+
should "output all of the commands @daily" do
|
180
|
+
assert_match '@daily cd /your/path && RAILS_ENV=production bundle exec rake blah:blah --silent', @output
|
181
|
+
assert_match %(@daily cd /your/path && script/runner -e production 'runner_1'), @output
|
182
|
+
assert_match '@daily command_1', @output
|
183
|
+
assert_match %(@daily cd /your/path && script/runner -e production 'runner_2'), @output
|
184
|
+
assert_match '@daily command_2', @output
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
context "every 5 minutes but but starting at 1" do
|
189
|
+
setup do
|
190
|
+
@output = Whenever.cron \
|
191
|
+
<<-file
|
192
|
+
set :job_template, nil
|
193
|
+
every 5.minutes, :at => 1 do
|
194
|
+
command "blahblah"
|
195
|
+
end
|
196
|
+
file
|
197
|
+
end
|
198
|
+
|
199
|
+
should "output the command using that time" do
|
200
|
+
assert_match '1,6,11,16,21,26,31,36,41,46,51,56 * * * * blahblah', @output
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
context "every 4 minutes but starting at 2" do
|
205
|
+
setup do
|
206
|
+
@output = Whenever.cron \
|
207
|
+
<<-file
|
208
|
+
set :job_template, nil
|
209
|
+
every 4.minutes, :at => 2 do
|
210
|
+
command "blahblah"
|
211
|
+
end
|
212
|
+
file
|
213
|
+
end
|
214
|
+
|
215
|
+
should "output the command using that time" do
|
216
|
+
assert_match '2,6,10,14,18,22,26,30,34,38,42,46,50,54,58 * * * * blahblah', @output
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
context "every 3 minutes but starting at 7" do
|
221
|
+
setup do
|
222
|
+
@output = Whenever.cron \
|
223
|
+
<<-file
|
224
|
+
set :job_template, nil
|
225
|
+
every 3.minutes, :at => 7 do
|
226
|
+
command "blahblah"
|
227
|
+
end
|
228
|
+
file
|
229
|
+
end
|
230
|
+
|
231
|
+
should "output the command using that time" do
|
232
|
+
assert_match '7,10,13,16,19,22,25,28,31,34,37,40,43,46,49,52,55,58 * * * * blahblah', @output
|
233
|
+
end
|
234
|
+
end
|
235
|
+
|
236
|
+
context "every 2 minutes but starting at 27" do
|
237
|
+
setup do
|
238
|
+
@output = Whenever.cron \
|
239
|
+
<<-file
|
240
|
+
set :job_template, nil
|
241
|
+
every 2.minutes, :at => 27 do
|
242
|
+
command "blahblah"
|
243
|
+
end
|
244
|
+
file
|
245
|
+
end
|
246
|
+
|
247
|
+
should "output the command using that time" do
|
248
|
+
assert_match '27,29,31,33,35,37,39,41,43,45,47,49,51,53,55,57,59 * * * * blahblah', @output
|
249
|
+
end
|
250
|
+
end
|
251
|
+
|
252
|
+
context "using raw cron syntax" do
|
253
|
+
setup do
|
254
|
+
@output = Whenever.cron \
|
255
|
+
<<-file
|
256
|
+
set :job_template, nil
|
257
|
+
every '0 0 27,31 * *' do
|
258
|
+
command "blahblah"
|
259
|
+
end
|
260
|
+
file
|
261
|
+
end
|
262
|
+
|
263
|
+
should "output the command using the same cron syntax" do
|
264
|
+
assert_match '0 0 27,31 * * blahblah', @output
|
265
|
+
end
|
266
|
+
end
|
267
|
+
|
268
|
+
end
|
@@ -0,0 +1,182 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + "/../test_helper")
|
2
|
+
|
3
|
+
class OutputDefaultDefinedJobsTest < Test::Unit::TestCase
|
4
|
+
|
5
|
+
# command
|
6
|
+
|
7
|
+
context "A plain command with the job template set to nil" do
|
8
|
+
setup do
|
9
|
+
@output = Whenever.cron \
|
10
|
+
<<-file
|
11
|
+
set :job_template, nil
|
12
|
+
every 2.hours do
|
13
|
+
command "blahblah"
|
14
|
+
end
|
15
|
+
file
|
16
|
+
end
|
17
|
+
|
18
|
+
should "output the command" do
|
19
|
+
assert_match /^.+ .+ .+ .+ blahblah$/, @output
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
context "A plain command with no job template set" do
|
24
|
+
setup do
|
25
|
+
@output = Whenever.cron \
|
26
|
+
<<-file
|
27
|
+
every 2.hours do
|
28
|
+
command "blahblah"
|
29
|
+
end
|
30
|
+
file
|
31
|
+
end
|
32
|
+
|
33
|
+
should "output the command with the default job template" do
|
34
|
+
assert_match /^.+ .+ .+ .+ \/bin\/bash -l -c 'blahblah'$/, @output
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context "A plain command that overrides the job_template set" do
|
39
|
+
setup do
|
40
|
+
@output = Whenever.cron \
|
41
|
+
<<-file
|
42
|
+
set :job_template, "/bin/bash -l -c ':job'"
|
43
|
+
every 2.hours do
|
44
|
+
command "blahblah", :job_template => "/bin/sh -l -c ':job'"
|
45
|
+
end
|
46
|
+
file
|
47
|
+
end
|
48
|
+
|
49
|
+
should "output the command using that job_template" do
|
50
|
+
assert_match /^.+ .+ .+ .+ \/bin\/sh -l -c 'blahblah'$/, @output
|
51
|
+
assert_no_match /bash/, @output
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context "A plain command that is conditional on default environent and path" do
|
56
|
+
setup do
|
57
|
+
Whenever.expects(:path).at_least_once.returns('/what/you/want')
|
58
|
+
@output = Whenever.cron \
|
59
|
+
<<-file
|
60
|
+
set :job_template, nil
|
61
|
+
if environment == 'production' && path == '/what/you/want'
|
62
|
+
every 2.hours do
|
63
|
+
command "blahblah"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
file
|
67
|
+
end
|
68
|
+
|
69
|
+
should "output the command" do
|
70
|
+
assert_match /blahblah/, @output
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
# runner
|
75
|
+
|
76
|
+
context "A runner with path set" do
|
77
|
+
setup do
|
78
|
+
@output = Whenever.cron \
|
79
|
+
<<-file
|
80
|
+
set :job_template, nil
|
81
|
+
set :path, '/my/path'
|
82
|
+
every 2.hours do
|
83
|
+
runner 'blahblah'
|
84
|
+
end
|
85
|
+
file
|
86
|
+
end
|
87
|
+
|
88
|
+
should "output the runner using that path" do
|
89
|
+
assert_match two_hours + %( cd /my/path && script/runner -e production 'blahblah'), @output
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
context "A runner that overrides the path set" do
|
94
|
+
setup do
|
95
|
+
@output = Whenever.cron \
|
96
|
+
<<-file
|
97
|
+
set :job_template, nil
|
98
|
+
set :path, '/my/path'
|
99
|
+
every 2.hours do
|
100
|
+
runner "blahblah", :path => '/some/other/path'
|
101
|
+
end
|
102
|
+
file
|
103
|
+
end
|
104
|
+
|
105
|
+
should "output the runner using that path" do
|
106
|
+
assert_match two_hours + %( cd /some/other/path && script/runner -e production 'blahblah'), @output
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
context "A runner for a Rails 3 app" do
|
111
|
+
setup do
|
112
|
+
Whenever.expects(:path).at_least_once.returns('/my/path')
|
113
|
+
Whenever.expects(:rails3?).returns(true)
|
114
|
+
@output = Whenever.cron \
|
115
|
+
<<-file
|
116
|
+
set :job_template, nil
|
117
|
+
every 2.hours do
|
118
|
+
runner 'blahblah'
|
119
|
+
end
|
120
|
+
file
|
121
|
+
end
|
122
|
+
|
123
|
+
should "use the Rails 3 runner job by default" do
|
124
|
+
assert_match two_hours + %( cd /my/path && script/rails runner -e production 'blahblah'), @output
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
# rake
|
129
|
+
|
130
|
+
context "A rake command with path set" do
|
131
|
+
setup do
|
132
|
+
@output = Whenever.cron \
|
133
|
+
<<-file
|
134
|
+
set :job_template, nil
|
135
|
+
set :path, '/my/path'
|
136
|
+
every 2.hours do
|
137
|
+
rake "blahblah"
|
138
|
+
end
|
139
|
+
file
|
140
|
+
end
|
141
|
+
|
142
|
+
should "output the rake command using that path" do
|
143
|
+
assert_match two_hours + ' cd /my/path && RAILS_ENV=production bundle exec rake blahblah --silent', @output
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
context "A rake for a non-bundler app" do
|
148
|
+
setup do
|
149
|
+
Whenever.expects(:path).at_least_once.returns('/my/path')
|
150
|
+
Whenever.expects(:bundler?).returns(false)
|
151
|
+
@output = Whenever.cron \
|
152
|
+
<<-file
|
153
|
+
set :job_template, nil
|
154
|
+
every 2.hours do
|
155
|
+
rake 'blahblah'
|
156
|
+
end
|
157
|
+
file
|
158
|
+
end
|
159
|
+
|
160
|
+
should "not use invoke through bundler" do
|
161
|
+
assert_match two_hours + ' cd /my/path && RAILS_ENV=production rake blahblah --silent', @output
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
context "A rake command that overrides the path set" do
|
166
|
+
setup do
|
167
|
+
@output = Whenever.cron \
|
168
|
+
<<-file
|
169
|
+
set :job_template, nil
|
170
|
+
set :path, '/my/path'
|
171
|
+
every 2.hours do
|
172
|
+
rake "blahblah", :path => '/some/other/path'
|
173
|
+
end
|
174
|
+
file
|
175
|
+
end
|
176
|
+
|
177
|
+
should "output the rake command using that path" do
|
178
|
+
assert_match two_hours + ' cd /some/other/path && RAILS_ENV=production bundle exec rake blahblah --silent', @output
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
end
|