whenever-benlangfeld 0.9.5
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.
- checksums.yaml +7 -0
- data/.gitignore +6 -0
- data/.travis.yml +18 -0
- data/CHANGELOG.md +333 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +260 -0
- data/Rakefile +10 -0
- data/bin/whenever +41 -0
- data/bin/wheneverize +68 -0
- data/gemfiles/activesupport4.1.gemfile +5 -0
- data/gemfiles/activesupport4.2.gemfile +5 -0
- data/lib/whenever.rb +34 -0
- data/lib/whenever/capistrano.rb +7 -0
- data/lib/whenever/capistrano/v2/hooks.rb +8 -0
- data/lib/whenever/capistrano/v2/recipes.rb +48 -0
- data/lib/whenever/capistrano/v2/support.rb +53 -0
- data/lib/whenever/capistrano/v3/tasks/whenever.rake +45 -0
- data/lib/whenever/command_line.rb +135 -0
- data/lib/whenever/cron.rb +153 -0
- data/lib/whenever/job.rb +54 -0
- data/lib/whenever/job_list.rb +155 -0
- data/lib/whenever/numeric.rb +13 -0
- data/lib/whenever/numeric_seconds.rb +48 -0
- data/lib/whenever/os.rb +7 -0
- data/lib/whenever/output_redirection.rb +57 -0
- data/lib/whenever/setup.rb +26 -0
- data/lib/whenever/tasks/whenever.rake +1 -0
- data/lib/whenever/version.rb +3 -0
- data/test/functional/command_line_test.rb +331 -0
- data/test/functional/output_at_test.rb +207 -0
- data/test/functional/output_default_defined_jobs_test.rb +296 -0
- data/test/functional/output_defined_job_test.rb +85 -0
- data/test/functional/output_env_test.rb +29 -0
- data/test/functional/output_jobs_for_roles_test.rb +65 -0
- data/test/functional/output_redirection_test.rb +248 -0
- data/test/test_case.rb +32 -0
- data/test/test_helper.rb +37 -0
- data/test/unit/capistrano_support_test.rb +147 -0
- data/test/unit/cron_test.rb +244 -0
- data/test/unit/job_test.rb +114 -0
- data/whenever.gemspec +27 -0
- metadata +167 -0
@@ -0,0 +1,296 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class OutputDefaultDefinedJobsTest < Whenever::TestCase
|
4
|
+
|
5
|
+
# command
|
6
|
+
|
7
|
+
test "A plain command with the job template set to nil" do
|
8
|
+
output = Whenever.cron \
|
9
|
+
<<-file
|
10
|
+
set :job_template, nil
|
11
|
+
every 2.hours do
|
12
|
+
command "blahblah"
|
13
|
+
end
|
14
|
+
file
|
15
|
+
|
16
|
+
assert_match(/^.+ .+ .+ .+ blahblah$/, output)
|
17
|
+
end
|
18
|
+
|
19
|
+
test "A plain command with no job template set" do
|
20
|
+
output = Whenever.cron \
|
21
|
+
<<-file
|
22
|
+
every 2.hours do
|
23
|
+
command "blahblah"
|
24
|
+
end
|
25
|
+
file
|
26
|
+
|
27
|
+
assert_match(/^.+ .+ .+ .+ \/bin\/bash -l -c 'blahblah'$/, output)
|
28
|
+
end
|
29
|
+
|
30
|
+
test "A plain command with a job_template using a normal parameter" do
|
31
|
+
output = Whenever.cron \
|
32
|
+
<<-file
|
33
|
+
set :job_template, "/bin/bash -l -c 'cd :path && :job'"
|
34
|
+
every 2.hours do
|
35
|
+
set :path, "/tmp"
|
36
|
+
command "blahblah"
|
37
|
+
end
|
38
|
+
file
|
39
|
+
|
40
|
+
assert_match(/^.+ .+ .+ .+ \/bin\/bash -l -c 'cd \/tmp \&\& blahblah'$/, output)
|
41
|
+
end
|
42
|
+
|
43
|
+
test "A plain command that overrides the job_template set" do
|
44
|
+
output = Whenever.cron \
|
45
|
+
<<-file
|
46
|
+
set :job_template, "/bin/bash -l -c ':job'"
|
47
|
+
every 2.hours do
|
48
|
+
command "blahblah", :job_template => "/bin/sh -l -c ':job'"
|
49
|
+
end
|
50
|
+
file
|
51
|
+
|
52
|
+
|
53
|
+
assert_match(/^.+ .+ .+ .+ \/bin\/sh -l -c 'blahblah'$/, output)
|
54
|
+
assert_no_match(/bash/, output)
|
55
|
+
end
|
56
|
+
|
57
|
+
test "A plain command that overrides the job_template set using a parameter" do
|
58
|
+
output = Whenever.cron \
|
59
|
+
<<-file
|
60
|
+
set :job_template, "/bin/bash -l -c 'cd :path && :job'"
|
61
|
+
every 2.hours do
|
62
|
+
set :path, "/tmp"
|
63
|
+
command "blahblah", :job_template => "/bin/sh -l -c 'cd :path && :job'"
|
64
|
+
end
|
65
|
+
file
|
66
|
+
|
67
|
+
|
68
|
+
assert_match(/^.+ .+ .+ .+ \/bin\/sh -l -c 'cd \/tmp && blahblah'$/, output)
|
69
|
+
assert_no_match(/bash/, output)
|
70
|
+
end
|
71
|
+
|
72
|
+
test "A plain command that is conditional on default environent and path" do
|
73
|
+
Whenever.expects(:path).at_least_once.returns('/what/you/want')
|
74
|
+
output = Whenever.cron \
|
75
|
+
<<-file
|
76
|
+
set :job_template, nil
|
77
|
+
if environment == 'production' && path == '/what/you/want'
|
78
|
+
every 2.hours do
|
79
|
+
command "blahblah"
|
80
|
+
end
|
81
|
+
end
|
82
|
+
file
|
83
|
+
|
84
|
+
assert_match(/blahblah/, output)
|
85
|
+
end
|
86
|
+
|
87
|
+
# runner
|
88
|
+
|
89
|
+
test "A runner with path set" do
|
90
|
+
output = Whenever.cron \
|
91
|
+
<<-file
|
92
|
+
set :job_template, nil
|
93
|
+
set :path, '/my/path'
|
94
|
+
every 2.hours do
|
95
|
+
runner 'blahblah'
|
96
|
+
end
|
97
|
+
file
|
98
|
+
|
99
|
+
assert_match two_hours + %( cd /my/path && bundle exec script/runner -e production 'blahblah'), output
|
100
|
+
end
|
101
|
+
|
102
|
+
test "A runner that overrides the path set" do
|
103
|
+
output = Whenever.cron \
|
104
|
+
<<-file
|
105
|
+
set :job_template, nil
|
106
|
+
set :path, '/my/path'
|
107
|
+
every 2.hours do
|
108
|
+
runner "blahblah", :path => '/some/other/path'
|
109
|
+
end
|
110
|
+
file
|
111
|
+
|
112
|
+
assert_match two_hours + %( cd /some/other/path && bundle exec script/runner -e production 'blahblah'), output
|
113
|
+
end
|
114
|
+
|
115
|
+
test "A runner for a non-bundler app" do
|
116
|
+
Whenever.expects(:bundler?).returns(false)
|
117
|
+
output = Whenever.cron \
|
118
|
+
<<-file
|
119
|
+
set :job_template, nil
|
120
|
+
set :path, '/my/path'
|
121
|
+
every 2.hours do
|
122
|
+
runner 'blahblah'
|
123
|
+
end
|
124
|
+
file
|
125
|
+
|
126
|
+
assert_match two_hours + %( cd /my/path && script/runner -e production 'blahblah'), output
|
127
|
+
end
|
128
|
+
|
129
|
+
test "A runner for an app with bin/rails" do
|
130
|
+
Whenever.expects(:path).at_least_once.returns('/my/path')
|
131
|
+
Whenever.expects(:bin_rails?).returns(true)
|
132
|
+
output = Whenever.cron \
|
133
|
+
<<-file
|
134
|
+
set :job_template, nil
|
135
|
+
every 2.hours do
|
136
|
+
runner 'blahblah'
|
137
|
+
end
|
138
|
+
file
|
139
|
+
|
140
|
+
assert_match two_hours + %( cd /my/path && bin/rails runner -e production 'blahblah'), output
|
141
|
+
end
|
142
|
+
|
143
|
+
test "A runner for an app with script/rails" do
|
144
|
+
Whenever.expects(:path).at_least_once.returns('/my/path')
|
145
|
+
Whenever.expects(:script_rails?).returns(true)
|
146
|
+
output = Whenever.cron \
|
147
|
+
<<-file
|
148
|
+
set :job_template, nil
|
149
|
+
every 2.hours do
|
150
|
+
runner 'blahblah'
|
151
|
+
end
|
152
|
+
file
|
153
|
+
|
154
|
+
assert_match two_hours + %( cd /my/path && script/rails runner -e production 'blahblah'), output
|
155
|
+
end
|
156
|
+
|
157
|
+
# rake
|
158
|
+
|
159
|
+
test "A rake command with path set" do
|
160
|
+
output = Whenever.cron \
|
161
|
+
<<-file
|
162
|
+
set :job_template, nil
|
163
|
+
set :path, '/my/path'
|
164
|
+
every 2.hours do
|
165
|
+
rake "blahblah"
|
166
|
+
end
|
167
|
+
file
|
168
|
+
|
169
|
+
assert_match two_hours + ' cd /my/path && RAILS_ENV=production bundle exec rake blahblah --silent', output
|
170
|
+
end
|
171
|
+
|
172
|
+
test "A rake command with arguments" do
|
173
|
+
output = Whenever.cron \
|
174
|
+
<<-file
|
175
|
+
set :job_template, nil
|
176
|
+
set :path, '/my/path'
|
177
|
+
every 2.hours do
|
178
|
+
rake "blahblah[foobar]"
|
179
|
+
end
|
180
|
+
file
|
181
|
+
|
182
|
+
assert_match two_hours + ' cd /my/path && RAILS_ENV=production bundle exec rake blahblah[foobar] --silent', output
|
183
|
+
end
|
184
|
+
|
185
|
+
test "A rake for a non-bundler app" do
|
186
|
+
Whenever.expects(:path).at_least_once.returns('/my/path')
|
187
|
+
Whenever.expects(:bundler?).returns(false)
|
188
|
+
output = Whenever.cron \
|
189
|
+
<<-file
|
190
|
+
set :job_template, nil
|
191
|
+
every 2.hours do
|
192
|
+
rake 'blahblah'
|
193
|
+
end
|
194
|
+
file
|
195
|
+
|
196
|
+
assert_match two_hours + ' cd /my/path && RAILS_ENV=production rake blahblah --silent', output
|
197
|
+
end
|
198
|
+
|
199
|
+
test "A rake command that overrides the path set" do
|
200
|
+
output = Whenever.cron \
|
201
|
+
<<-file
|
202
|
+
set :job_template, nil
|
203
|
+
set :path, '/my/path'
|
204
|
+
every 2.hours do
|
205
|
+
rake "blahblah", :path => '/some/other/path'
|
206
|
+
end
|
207
|
+
file
|
208
|
+
|
209
|
+
assert_match two_hours + ' cd /some/other/path && RAILS_ENV=production bundle exec rake blahblah --silent', output
|
210
|
+
end
|
211
|
+
|
212
|
+
test "A rake command that sets the environment variable" do
|
213
|
+
output = Whenever.cron \
|
214
|
+
<<-file
|
215
|
+
set :job_template, nil
|
216
|
+
set :path, '/my/path'
|
217
|
+
set :environment_variable, 'RAKE_ENV'
|
218
|
+
every 2.hours do
|
219
|
+
rake "blahblah"
|
220
|
+
end
|
221
|
+
file
|
222
|
+
|
223
|
+
assert_match two_hours + ' cd /my/path && RAKE_ENV=production bundle exec rake blahblah --silent', output
|
224
|
+
end
|
225
|
+
|
226
|
+
test "A rake command that overrides the environment variable" do
|
227
|
+
output = Whenever.cron \
|
228
|
+
<<-file
|
229
|
+
set :job_template, nil
|
230
|
+
set :path, '/my/path'
|
231
|
+
set :environment_variable, 'RAKE_ENV'
|
232
|
+
every 2.hours do
|
233
|
+
rake "blahblah", :environment_variable => 'SOME_ENV'
|
234
|
+
end
|
235
|
+
file
|
236
|
+
|
237
|
+
assert_match two_hours + ' cd /my/path && SOME_ENV=production bundle exec rake blahblah --silent', output
|
238
|
+
end
|
239
|
+
|
240
|
+
# script
|
241
|
+
|
242
|
+
test "A script command with path set" do
|
243
|
+
output = Whenever.cron \
|
244
|
+
<<-file
|
245
|
+
set :job_template, nil
|
246
|
+
set :path, '/my/path'
|
247
|
+
every 2.hours do
|
248
|
+
script "blahblah"
|
249
|
+
end
|
250
|
+
file
|
251
|
+
|
252
|
+
assert_match two_hours + ' cd /my/path && RAILS_ENV=production bundle exec script/blahblah', output
|
253
|
+
end
|
254
|
+
|
255
|
+
test "A script command for a non-bundler app" do
|
256
|
+
Whenever.expects(:path).at_least_once.returns('/my/path')
|
257
|
+
Whenever.expects(:bundler?).returns(false)
|
258
|
+
output = Whenever.cron \
|
259
|
+
<<-file
|
260
|
+
set :job_template, nil
|
261
|
+
every 2.hours do
|
262
|
+
script 'blahblah'
|
263
|
+
end
|
264
|
+
file
|
265
|
+
|
266
|
+
assert_match two_hours + ' cd /my/path && RAILS_ENV=production script/blahblah', output
|
267
|
+
end
|
268
|
+
|
269
|
+
test "A script command that uses output" do
|
270
|
+
output = Whenever.cron \
|
271
|
+
<<-file
|
272
|
+
set :job_template, nil
|
273
|
+
set :output, '/log/file'
|
274
|
+
set :path, '/my/path'
|
275
|
+
every 2.hours do
|
276
|
+
script "blahblah", :path => '/some/other/path'
|
277
|
+
end
|
278
|
+
file
|
279
|
+
|
280
|
+
assert_match two_hours + ' cd /some/other/path && RAILS_ENV=production bundle exec script/blahblah >> /log/file 2>&1', output
|
281
|
+
end
|
282
|
+
|
283
|
+
test "A script command that uses an environment variable" do
|
284
|
+
output = Whenever.cron \
|
285
|
+
<<-file
|
286
|
+
set :job_template, nil
|
287
|
+
set :environment_variable, 'RAKE_ENV'
|
288
|
+
set :path, '/my/path'
|
289
|
+
every 2.hours do
|
290
|
+
script "blahblah"
|
291
|
+
end
|
292
|
+
file
|
293
|
+
|
294
|
+
assert_match two_hours + ' cd /my/path && RAKE_ENV=production bundle exec script/blahblah', output
|
295
|
+
end
|
296
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class OutputDefinedJobTest < Whenever::TestCase
|
4
|
+
test "defined job with a :task" do
|
5
|
+
output = Whenever.cron \
|
6
|
+
<<-file
|
7
|
+
set :job_template, nil
|
8
|
+
job_type :some_job, "before :task after"
|
9
|
+
every 2.hours do
|
10
|
+
some_job "during"
|
11
|
+
end
|
12
|
+
file
|
13
|
+
|
14
|
+
assert_match(/^.+ .+ .+ .+ before during after$/, output)
|
15
|
+
end
|
16
|
+
|
17
|
+
test "defined job with a :task and some options" do
|
18
|
+
output = Whenever.cron \
|
19
|
+
<<-file
|
20
|
+
set :job_template, nil
|
21
|
+
job_type :some_job, "before :task after :option1 :option2"
|
22
|
+
every 2.hours do
|
23
|
+
some_job "during", :option1 => 'happy', :option2 => 'birthday'
|
24
|
+
end
|
25
|
+
file
|
26
|
+
|
27
|
+
assert_match(/^.+ .+ .+ .+ before during after happy birthday$/, output)
|
28
|
+
end
|
29
|
+
|
30
|
+
test "defined job with a :task and an option where the option is set globally" do
|
31
|
+
output = Whenever.cron \
|
32
|
+
<<-file
|
33
|
+
set :job_template, nil
|
34
|
+
job_type :some_job, "before :task after :option1"
|
35
|
+
set :option1, 'happy'
|
36
|
+
every 2.hours do
|
37
|
+
some_job "during"
|
38
|
+
end
|
39
|
+
file
|
40
|
+
|
41
|
+
assert_match(/^.+ .+ .+ .+ before during after happy$/, output)
|
42
|
+
end
|
43
|
+
|
44
|
+
test "defined job with a :task and an option where the option is set globally and locally" do
|
45
|
+
output = Whenever.cron \
|
46
|
+
<<-file
|
47
|
+
set :job_template, nil
|
48
|
+
job_type :some_job, "before :task after :option1"
|
49
|
+
set :option1, 'global'
|
50
|
+
every 2.hours do
|
51
|
+
some_job "during", :option1 => 'local'
|
52
|
+
end
|
53
|
+
file
|
54
|
+
|
55
|
+
assert_match(/^.+ .+ .+ .+ before during after local$/, output)
|
56
|
+
end
|
57
|
+
|
58
|
+
test "defined job with a :task and an option that is not set" do
|
59
|
+
output = Whenever.cron \
|
60
|
+
<<-file
|
61
|
+
set :job_template, nil
|
62
|
+
job_type :some_job, "before :task after :option1"
|
63
|
+
every 2.hours do
|
64
|
+
some_job "during", :option2 => 'happy'
|
65
|
+
end
|
66
|
+
file
|
67
|
+
|
68
|
+
assert_match(/^.+ .+ .+ .+ before during after :option1$/, output)
|
69
|
+
end
|
70
|
+
|
71
|
+
test "defined job that uses a :path where none is explicitly set" do
|
72
|
+
Whenever.stubs(:path).returns('/my/path')
|
73
|
+
|
74
|
+
output = Whenever.cron \
|
75
|
+
<<-file
|
76
|
+
set :job_template, nil
|
77
|
+
job_type :some_job, "cd :path && :task"
|
78
|
+
every 2.hours do
|
79
|
+
some_job 'blahblah'
|
80
|
+
end
|
81
|
+
file
|
82
|
+
|
83
|
+
assert_match two_hours + %( cd /my/path && blahblah), output
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class OutputEnvTest < Whenever::TestCase
|
4
|
+
setup do
|
5
|
+
@output = Whenever.cron \
|
6
|
+
<<-file
|
7
|
+
env :MYVAR, 'blah'
|
8
|
+
env 'MAILTO', "someone@example.com"
|
9
|
+
env :BLANKVAR, ''
|
10
|
+
env :NILVAR, nil
|
11
|
+
file
|
12
|
+
end
|
13
|
+
|
14
|
+
should "output MYVAR environment variable" do
|
15
|
+
assert_match "MYVAR=blah", @output
|
16
|
+
end
|
17
|
+
|
18
|
+
should "output MAILTO environment variable" do
|
19
|
+
assert_match "MAILTO=someone@example.com", @output
|
20
|
+
end
|
21
|
+
|
22
|
+
should "output BLANKVAR environment variable" do
|
23
|
+
assert_match "BLANKVAR=\"\"", @output
|
24
|
+
end
|
25
|
+
|
26
|
+
should "output NILVAR environment variable" do
|
27
|
+
assert_match "NILVAR=\"\"", @output
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class OutputJobsForRolesTest < Whenever::TestCase
|
4
|
+
test "one role requested and specified on the job" do
|
5
|
+
output = Whenever.cron :roles => [:role1], :string => \
|
6
|
+
<<-file
|
7
|
+
every 2.hours, :roles => [:role1] do
|
8
|
+
command "blahblah"
|
9
|
+
end
|
10
|
+
file
|
11
|
+
|
12
|
+
assert_equal two_hours + " /bin/bash -l -c 'blahblah'\n\n", output
|
13
|
+
end
|
14
|
+
|
15
|
+
test "one role requested but none specified on the job" do
|
16
|
+
output = Whenever.cron :roles => [:role1], :string => \
|
17
|
+
<<-file
|
18
|
+
every 2.hours do
|
19
|
+
command "blahblah"
|
20
|
+
end
|
21
|
+
file
|
22
|
+
|
23
|
+
# this should output the job because not specifying a role means "all roles"
|
24
|
+
assert_equal two_hours + " /bin/bash -l -c 'blahblah'\n\n", output
|
25
|
+
end
|
26
|
+
|
27
|
+
test "no roles requested but one specified on the job" do
|
28
|
+
output = Whenever.cron \
|
29
|
+
<<-file
|
30
|
+
every 2.hours, :roles => [:role1] do
|
31
|
+
command "blahblah"
|
32
|
+
end
|
33
|
+
file
|
34
|
+
|
35
|
+
# this should output the job because not requesting roles means "all roles"
|
36
|
+
assert_equal two_hours + " /bin/bash -l -c 'blahblah'\n\n", output
|
37
|
+
end
|
38
|
+
|
39
|
+
test "a different role requested than the one specified on the job" do
|
40
|
+
output = Whenever.cron :roles => [:role1], :string => \
|
41
|
+
<<-file
|
42
|
+
every 2.hours, :roles => [:role2] do
|
43
|
+
command "blahblah"
|
44
|
+
end
|
45
|
+
file
|
46
|
+
|
47
|
+
assert_equal "", output
|
48
|
+
end
|
49
|
+
|
50
|
+
test "with 2 roles requested and a job defined for each" do
|
51
|
+
output = Whenever.cron :roles => [:role1, :role2], :string => \
|
52
|
+
<<-file
|
53
|
+
every 2.hours, :roles => [:role1] do
|
54
|
+
command "role1_cmd"
|
55
|
+
end
|
56
|
+
|
57
|
+
every :hour, :roles => [:role2] do
|
58
|
+
command "role2_cmd"
|
59
|
+
end
|
60
|
+
file
|
61
|
+
|
62
|
+
assert_match two_hours + " /bin/bash -l -c 'role1_cmd'", output
|
63
|
+
assert_match "0 * * * * /bin/bash -l -c 'role2_cmd'", output
|
64
|
+
end
|
65
|
+
end
|