whenever 0.8.2 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +1 -0
  3. data/.travis.yml +20 -7
  4. data/Appraisals +19 -0
  5. data/CHANGELOG.md +116 -3
  6. data/Gemfile +3 -3
  7. data/LICENSE +2 -2
  8. data/README.md +133 -32
  9. data/Rakefile +3 -10
  10. data/bin/whenever +3 -0
  11. data/bin/wheneverize +8 -5
  12. data/gemfiles/activesupport4.1.gemfile +7 -0
  13. data/gemfiles/activesupport4.2.gemfile +7 -0
  14. data/gemfiles/activesupport5.0.gemfile +7 -0
  15. data/gemfiles/activesupport5.1.gemfile +7 -0
  16. data/gemfiles/activesupport5.2.gemfile +7 -0
  17. data/lib/whenever/capistrano/v2/hooks.rb +8 -0
  18. data/lib/whenever/capistrano/{recipes.rb → v2/recipes.rb} +7 -13
  19. data/lib/whenever/capistrano/{support.rb → v2/support.rb} +12 -0
  20. data/lib/whenever/capistrano/v3/tasks/whenever.rake +56 -0
  21. data/lib/whenever/capistrano.rb +5 -6
  22. data/lib/whenever/command_line.rb +69 -48
  23. data/lib/whenever/cron.rb +54 -25
  24. data/lib/whenever/job.rb +13 -14
  25. data/lib/whenever/job_list.rb +54 -24
  26. data/lib/whenever/numeric.rb +13 -0
  27. data/lib/whenever/numeric_seconds.rb +48 -0
  28. data/lib/whenever/os.rb +7 -0
  29. data/lib/whenever/output_redirection.rb +1 -0
  30. data/lib/whenever/setup.rb +19 -15
  31. data/lib/whenever/version.rb +2 -2
  32. data/lib/whenever.rb +19 -14
  33. data/test/functional/command_line_test.rb +379 -243
  34. data/test/functional/output_at_test.rb +227 -249
  35. data/test/functional/output_default_defined_jobs_test.rb +251 -193
  36. data/test/functional/output_defined_job_test.rb +65 -91
  37. data/test/functional/output_env_test.rb +22 -26
  38. data/test/functional/output_jobs_for_roles_test.rb +46 -65
  39. data/test/functional/output_jobs_with_mailto_test.rb +168 -0
  40. data/test/functional/output_redirection_test.rb +232 -291
  41. data/test/test_case.rb +32 -0
  42. data/test/test_helper.rb +44 -15
  43. data/test/unit/capistrano_support_test.rb +128 -134
  44. data/test/unit/cron_test.rb +373 -208
  45. data/test/unit/executable_test.rb +142 -0
  46. data/test/unit/job_test.rb +111 -117
  47. data/whenever.gemspec +7 -4
  48. metadata +63 -44
@@ -1,307 +1,248 @@
1
- require File.expand_path(File.dirname(__FILE__) + "/../test_helper")
2
-
3
- class OutputRedirectionTest < Test::Unit::TestCase
4
-
5
- context "A command when the output is set to nil" do
6
- setup do
7
- @output = Whenever.cron \
8
- <<-file
9
- set :job_template, nil
10
- set :output, nil
11
- every 2.hours do
12
- command "blahblah"
13
- end
14
- file
15
- end
16
-
17
- should "output the command with the log syntax appended" do
18
- assert_match /^.+ .+ .+ .+ blahblah >> \/dev\/null 2>&1$/, @output
19
- end
20
- end
21
-
1
+ require 'test_helper'
2
+
3
+ class OutputRedirectionTest < Whenever::TestCase
4
+ test "command when the output is set to nil" do
5
+ output = Whenever.cron \
6
+ <<-file
7
+ set :job_template, nil
8
+ set :output, nil
9
+ every 2.hours do
10
+ command "blahblah"
11
+ end
12
+ file
13
+
14
+ assert_match(/^.+ .+ .+ .+ blahblah >> \/dev\/null 2>&1$/, output)
15
+ end
16
+
17
+
18
+ test "command when the output is set" do
19
+ output = Whenever.cron \
20
+ <<-file
21
+ set :job_template, nil
22
+ set :output, 'logfile.log'
23
+ every 2.hours do
24
+ command "blahblah"
25
+ end
26
+ file
27
+
28
+ assert_match(/^.+ .+ .+ .+ blahblah >> logfile.log 2>&1$/, output)
29
+ end
30
+
31
+ test "command when the error and standard output is set by the command" do
32
+ output = Whenever.cron \
33
+ <<-file
34
+ set :job_template, nil
35
+ every 2.hours do
36
+ command "blahblah", :output => {:standard => 'dev_null', :error => 'dev_err'}
37
+ end
38
+ file
39
+
40
+ assert_match(/^.+ .+ .+ .+ blahblah >> dev_null 2>> dev_err$/, output)
41
+ end
42
+
43
+ test "command when the output is set and the comand overrides it" do
44
+ output = Whenever.cron \
45
+ <<-file
46
+ set :job_template, nil
47
+ set :output, 'logfile.log'
48
+ every 2.hours do
49
+ command "blahblah", :output => 'otherlog.log'
50
+ end
51
+ file
52
+
53
+ assert_no_match(/.+ .+ .+ .+ blahblah >> logfile.log 2>&1/, output)
54
+ assert_match(/^.+ .+ .+ .+ blahblah >> otherlog.log 2>&1$/, output)
55
+ end
56
+
57
+ test "command when the output is set and the comand overrides with standard and error" do
58
+ output = Whenever.cron \
59
+ <<-file
60
+ set :job_template, nil
61
+ set :output, 'logfile.log'
62
+ every 2.hours do
63
+ command "blahblah", :output => {:error => 'dev_err', :standard => 'dev_null' }
64
+ end
65
+ file
66
+
67
+ assert_no_match(/.+ .+ .+ .+ blahblah >> logfile.log 2>&1/, output)
68
+ assert_match(/^.+ .+ .+ .+ blahblah >> dev_null 2>> dev_err$/, output)
69
+ end
70
+
71
+ test "command when the output is set and the comand rejects it" do
72
+ output = Whenever.cron \
73
+ <<-file
74
+ set :job_template, nil
75
+ set :output, 'logfile.log'
76
+ every 2.hours do
77
+ command "blahblah", :output => false
78
+ end
79
+ file
80
+
81
+ assert_no_match(/.+ .+ .+ .+ blahblah >> logfile.log 2>&1/, output)
82
+ assert_match(/^.+ .+ .+ .+ blahblah$/, output)
83
+ end
84
+
85
+ test "command when the output is set and is overridden by the :set option" do
86
+ output = Whenever.cron :set => 'output=otherlog.log', :string => \
87
+ <<-file
88
+ set :job_template, nil
89
+ set :output, 'logfile.log'
90
+ every 2.hours do
91
+ command "blahblah"
92
+ end
93
+ file
94
+
95
+ assert_no_match(/.+ .+ .+ .+ blahblah >> logfile.log 2>&1/, output)
96
+ assert_match(/^.+ .+ .+ .+ blahblah >> otherlog.log 2>&1/, output)
97
+ end
98
+
99
+ test "command when the error and standard output is set" do
100
+ output = Whenever.cron \
101
+ <<-file
102
+ set :job_template, nil
103
+ set :output, {:error => 'dev_err', :standard => 'dev_null' }
104
+ every 2.hours do
105
+ command "blahblah"
106
+ end
107
+ file
108
+
109
+ assert_match(/^.+ .+ .+ .+ blahblah >> dev_null 2>> dev_err$/, output)
110
+ end
111
+
112
+ test "command when error output is set" do
113
+ output = Whenever.cron \
114
+ <<-file
115
+ set :job_template, nil
116
+ set :output, {:error => 'dev_null'}
117
+ every 2.hours do
118
+ command "blahblah"
119
+ end
120
+ file
121
+
122
+ assert_match(/^.+ .+ .+ .+ blahblah 2>> dev_null$/, output)
123
+ end
124
+
125
+ test "command when the standard output is set" do
126
+ output = Whenever.cron \
127
+ <<-file
128
+ set :job_template, nil
129
+ set :output, {:standard => 'dev_out'}
130
+ every 2.hours do
131
+ command "blahblah"
132
+ end
133
+ file
134
+
135
+ assert_match(/^.+ .+ .+ .+ blahblah >> dev_out$/, output)
136
+ end
137
+
138
+ test "command when error output is set by the command" do
139
+ output = Whenever.cron \
140
+ <<-file
141
+ set :job_template, nil
142
+ every 2.hours do
143
+ command "blahblah", :output => {:error => 'dev_err'}
144
+ end
145
+ file
146
+
147
+ assert_match(/^.+ .+ .+ .+ blahblah 2>> dev_err$/, output)
148
+ end
149
+
150
+ test "command when standard output is set by the command" do
151
+ output = Whenever.cron \
152
+ <<-file
153
+ set :job_template, nil
154
+ every 2.hours do
155
+ command "blahblah", :output => {:standard => 'dev_out'}
156
+ end
157
+ file
158
+
159
+ assert_match(/^.+ .+ .+ .+ blahblah >> dev_out$/, output)
160
+ end
161
+
162
+ test "command when standard output is set to nil" do
163
+ output = Whenever.cron \
164
+ <<-file
165
+ set :job_template, nil
166
+ every 2.hours do
167
+ command "blahblah", :output => {:standard => nil}
168
+ end
169
+ file
170
+
171
+ assert_match(/^.+ .+ .+ .+ blahblah > \/dev\/null$/, output)
172
+ end
173
+
174
+ test "command when standard error is set to nil" do
175
+ output = Whenever.cron \
176
+ <<-file
177
+ set :job_template, nil
178
+ every 2.hours do
179
+ command "blahblah", :output => {:error => nil}
180
+ end
181
+ file
182
+
183
+ assert_match(/^.+ .+ .+ .+ blahblah 2> \/dev\/null$/, output)
184
+ end
185
+
186
+ test "command when standard output and standard error is set to nil" do
187
+ output = Whenever.cron \
188
+ <<-file
189
+ set :job_template, nil
190
+ every 2.hours do
191
+ command "blahblah", :output => {:error => nil, :standard => nil}
192
+ end
193
+ file
22
194
 
23
- context "A command when the output is set" do
24
- setup do
25
- @output = Whenever.cron \
26
- <<-file
27
- set :job_template, nil
28
- set :output, 'logfile.log'
29
- every 2.hours do
30
- command "blahblah"
31
- end
32
- file
33
- end
34
-
35
- should "output the command with the log syntax appended" do
36
- assert_match /^.+ .+ .+ .+ blahblah >> logfile.log 2>&1$/, @output
37
- end
195
+ assert_match(/^.+ .+ .+ .+ blahblah > \/dev\/null 2>&1$/, output)
38
196
  end
39
197
 
40
- context "A command when the error and standard output is set by the command" do
41
- setup do
42
- @output = Whenever.cron \
43
- <<-file
44
- set :job_template, nil
45
- every 2.hours do
46
- command "blahblah", :output => {:standard => 'dev_null', :error => 'dev_err'}
47
- end
48
- file
49
- end
50
-
51
- should "output the command without the log syntax appended" do
52
- assert_match /^.+ .+ .+ .+ blahblah >> dev_null 2>> dev_err$/, @output
53
- end
54
- end
198
+ test "command when standard output is set and standard error is set to nil" do
199
+ output = Whenever.cron \
200
+ <<-file
201
+ set :job_template, nil
202
+ every 2.hours do
203
+ command "blahblah", :output => {:error => nil, :standard => 'my.log'}
204
+ end
205
+ file
55
206
 
56
- context "A command when the output is set and the comand overrides it" do
57
- setup do
58
- @output = Whenever.cron \
59
- <<-file
60
- set :job_template, nil
61
- set :output, 'logfile.log'
62
- every 2.hours do
63
- command "blahblah", :output => 'otherlog.log'
64
- end
65
- file
66
- end
67
-
68
- should "output the command with the command syntax appended" do
69
- assert_no_match /.+ .+ .+ .+ blahblah >> logfile.log 2>&1/, @output
70
- assert_match /^.+ .+ .+ .+ blahblah >> otherlog.log 2>&1$/, @output
71
- end
207
+ assert_match(/^.+ .+ .+ .+ blahblah >> my.log 2> \/dev\/null$/, output)
72
208
  end
73
209
 
74
- context "A command when the output is set and the comand overrides with standard and error" do
75
- setup do
76
- @output = Whenever.cron \
77
- <<-file
78
- set :job_template, nil
79
- set :output, 'logfile.log'
80
- every 2.hours do
81
- command "blahblah", :output => {:error => 'dev_err', :standard => 'dev_null' }
82
- end
83
- file
84
- end
85
-
86
- should "output the command with the overridden redirection syntax appended" do
87
- assert_no_match /.+ .+ .+ .+ blahblah >> logfile.log 2>&1/, @output
88
- assert_match /^.+ .+ .+ .+ blahblah >> dev_null 2>> dev_err$/, @output
89
- end
90
- end
210
+ test "command when standard output is nil and standard error is set" do
211
+ output = Whenever.cron \
212
+ <<-file
213
+ set :job_template, nil
214
+ every 2.hours do
215
+ command "blahblah", :output => {:error => 'my_error.log', :standard => nil}
216
+ end
217
+ file
91
218
 
92
- context "A command when the output is set and the comand rejects it" do
93
- setup do
94
- @output = Whenever.cron \
95
- <<-file
96
- set :job_template, nil
97
- set :output, 'logfile.log'
98
- every 2.hours do
99
- command "blahblah", :output => false
100
- end
101
- file
102
- end
103
-
104
- should "output the command without the log syntax appended" do
105
- assert_no_match /.+ .+ .+ .+ blahblah >> logfile.log 2>&1/, @output
106
- assert_match /^.+ .+ .+ .+ blahblah$/, @output
107
- end
219
+ assert_match(/^.+ .+ .+ .+ blahblah >> \/dev\/null 2>> my_error.log$/, output)
108
220
  end
109
221
 
110
- context "A command when the output is set and is overridden by the :set option" do
111
- setup do
112
- @output = Whenever.cron :set => 'output=otherlog.log', :string => \
113
- <<-file
114
- set :job_template, nil
115
- set :output, 'logfile.log'
116
- every 2.hours do
117
- command "blahblah"
118
- end
119
- file
120
- end
121
-
122
- should "output the otherlog.log as the log file" do
123
- assert_no_match /.+ .+ .+ .+ blahblah >> logfile.log 2>&1/, @output
124
- assert_match /^.+ .+ .+ .+ blahblah >> otherlog.log 2>&1/, @output
125
- end
126
- end
222
+ test "command when the deprecated :cron_log is set" do
223
+ output = Whenever.cron \
224
+ <<-file
225
+ set :job_template, nil
226
+ set :cron_log, "cron.log"
227
+ every 2.hours do
228
+ command "blahblah"
229
+ end
230
+ file
127
231
 
128
- context "A command when the error and standard output is set" do
129
- setup do
130
- @output = Whenever.cron \
131
- <<-file
132
- set :job_template, nil
133
- set :output, {:error => 'dev_err', :standard => 'dev_null' }
134
- every 2.hours do
135
- command "blahblah"
136
- end
137
- file
138
- end
139
-
140
- should "output the command without the redirection syntax appended" do
141
- assert_match /^.+ .+ .+ .+ blahblah >> dev_null 2>> dev_err$/, @output
142
- end
232
+ assert_match(/^.+ .+ .+ .+ blahblah >> cron.log 2>&1$/, output)
143
233
  end
144
234
 
145
- context "A command when error output is set" do
146
- setup do
147
- @output = Whenever.cron \
148
- <<-file
149
- set :job_template, nil
150
- set :output, {:error => 'dev_null'}
151
- every 2.hours do
152
- command "blahblah"
153
- end
154
- file
155
- end
156
-
157
- should "output the command without the standard error syntax appended" do
158
- assert_match /^.+ .+ .+ .+ blahblah 2>> dev_null$/, @output
159
- end
160
- end
161
235
 
162
- context "A command when the standard output is set" do
163
- setup do
164
- @output = Whenever.cron \
165
- <<-file
166
- set :job_template, nil
167
- set :output, {:standard => 'dev_out'}
168
- every 2.hours do
169
- command "blahblah"
170
- end
171
- file
172
- end
173
-
174
- should "output the command with standard output syntax appended" do
175
- assert_match /^.+ .+ .+ .+ blahblah >> dev_out$/, @output
176
- end
177
- end
178
-
179
- context "A command when error output is set by the command" do
180
- setup do
181
- @output = Whenever.cron \
182
- <<-file
183
- set :job_template, nil
184
- every 2.hours do
185
- command "blahblah", :output => {:error => 'dev_err'}
186
- end
187
- file
188
- end
189
-
190
- should "output the command without the log syntax appended" do
191
- assert_match /^.+ .+ .+ .+ blahblah 2>> dev_err$/, @output
192
- end
193
- end
194
-
195
- context "A command when standard output is set by the command" do
196
- setup do
197
- @output = Whenever.cron \
198
- <<-file
199
- set :job_template, nil
200
- every 2.hours do
201
- command "blahblah", :output => {:standard => 'dev_out'}
202
- end
203
- file
204
- end
205
-
206
- should "output the command without the log syntax appended" do
207
- assert_match /^.+ .+ .+ .+ blahblah >> dev_out$/, @output
208
- end
209
- end
210
-
211
- context "A command when standard output is set to nil" do
212
- setup do
213
- @output = Whenever.cron \
214
- <<-file
215
- set :job_template, nil
216
- every 2.hours do
217
- command "blahblah", :output => {:standard => nil}
218
- end
219
- file
220
- end
221
-
222
- should "output the command with stdout directed to /dev/null" do
223
- assert_match /^.+ .+ .+ .+ blahblah > \/dev\/null$/, @output
224
- end
225
- end
226
-
227
- context "A command when standard error is set to nil" do
228
- setup do
229
- @output = Whenever.cron \
230
- <<-file
231
- set :job_template, nil
232
- every 2.hours do
233
- command "blahblah", :output => {:error => nil}
234
- end
235
- file
236
- end
237
-
238
- should "output the command with stderr directed to /dev/null" do
239
- assert_match /^.+ .+ .+ .+ blahblah 2> \/dev\/null$/, @output
240
- end
241
- end
242
-
243
- context "A command when standard output and standard error is set to nil" do
244
- setup do
245
- @output = Whenever.cron \
246
- <<-file
247
- set :job_template, nil
248
- every 2.hours do
249
- command "blahblah", :output => {:error => nil, :standard => nil}
250
- end
251
- file
252
- end
253
-
254
- should "output the command with stderr directed to /dev/null" do
255
- assert_match /^.+ .+ .+ .+ blahblah > \/dev\/null 2>&1$/, @output
256
- end
257
- end
258
-
259
- context "A command when standard output is set and standard error is set to nil" do
260
- setup do
261
- @output = Whenever.cron \
262
- <<-file
263
- set :job_template, nil
264
- every 2.hours do
265
- command "blahblah", :output => {:error => nil, :standard => 'my.log'}
266
- end
267
- file
268
- end
269
-
270
- should "output the command with stderr directed to /dev/null" do
271
- assert_match /^.+ .+ .+ .+ blahblah >> my.log 2> \/dev\/null$/, @output
272
- end
273
- end
274
-
275
- context "A command when standard output is nil and standard error is set" do
276
- setup do
277
- @output = Whenever.cron \
278
- <<-file
279
- set :job_template, nil
280
- every 2.hours do
281
- command "blahblah", :output => {:error => 'my_error.log', :standard => nil}
282
- end
283
- file
284
- end
285
-
286
- should "output the command with stderr directed to /dev/null" do
287
- assert_match /^.+ .+ .+ .+ blahblah >> \/dev\/null 2>> my_error.log$/, @output
288
- end
289
- end
236
+ test "a command when the standard output is set to a lambda" do
237
+ output = Whenever.cron \
238
+ <<-file
239
+ set :job_template, nil
240
+ set :output, lambda { "2>&1 | logger -t whenever_cron" }
241
+ every 2.hours do
242
+ command "blahblah"
243
+ end
244
+ file
290
245
 
291
- context "A command when the deprecated :cron_log is set" do
292
- setup do
293
- @output = Whenever.cron \
294
- <<-file
295
- set :job_template, nil
296
- set :cron_log, "cron.log"
297
- every 2.hours do
298
- command "blahblah"
299
- end
300
- file
301
- end
302
-
303
- should "output the command with with the stdout and stderr going to the log" do
304
- assert_match /^.+ .+ .+ .+ blahblah >> cron.log 2>&1$/, @output
305
- end
246
+ assert_match(/^.+ .+ .+ .+ blahblah 2>&1 | logger -t whenever_cron$/, output)
306
247
  end
307
248
  end
data/test/test_case.rb ADDED
@@ -0,0 +1,32 @@
1
+ module Whenever
2
+ require 'minitest/autorun'
3
+ begin
4
+ # 2.0.0
5
+ class TestCase < MiniTest::Test; end
6
+ rescue NameError
7
+ # 1.9.3
8
+ class TestCase < MiniTest::Unit::TestCase; end
9
+ end
10
+
11
+
12
+ class TestCase
13
+ class << self
14
+ def setup(&block)
15
+ define_method(:setup) do
16
+ super()
17
+ instance_eval(&block)
18
+ end
19
+ end
20
+
21
+ def test(name, &block)
22
+ define_method("test_#{name}".to_sym, &block)
23
+ end
24
+ alias should test
25
+ end
26
+
27
+ def assert_no_match(regexp, string)
28
+ message = "<#{regexp}> expected to not match\n<#{string}>"
29
+ assert regexp !~ string, message
30
+ end
31
+ end
32
+ end
data/test/test_helper.rb CHANGED
@@ -1,18 +1,47 @@
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
1
  require 'whenever'
4
- require 'test/unit'
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
-
2
+ require 'test_case'
3
+ require 'mocha/setup'
4
+
5
+ module Whenever::TestHelpers
6
+ protected
7
+ def new_job(options={})
8
+ Whenever::Job.new(options)
9
+ end
10
+
11
+ def parse_time(time = nil, task = nil, at = nil, options = {})
12
+ Whenever::Output::Cron.new(time, task, at, options).time_in_cron_syntax
13
+ end
14
+
15
+ def two_hours
16
+ "0 0,2,4,6,8,10,12,14,16,18,20,22 * * *"
17
+ end
18
+
19
+ def assert_months_and_days_and_hours_and_minutes_equals(expected, time, options = {})
20
+ cron = parse_time(Whenever.seconds(1, :year), 'some task', time, options)
21
+ minutes, hours, days, months = cron.split(' ')
22
+ assert_equal expected, [months, days, hours, minutes]
23
+ end
24
+
25
+ def assert_days_and_hours_and_minutes_equals(expected, time, options = {})
26
+ cron = parse_time(Whenever.seconds(2, :months), 'some task', time, options)
27
+ minutes, hours, days, _ = cron.split(' ')
28
+ assert_equal expected, [days, hours, minutes]
29
+ end
30
+
31
+ def assert_hours_and_minutes_equals(expected, time, options = {})
32
+ cron = parse_time(Whenever.seconds(2, :days), 'some task', time, options)
33
+ minutes, hours, _ = cron.split(' ')
34
+ assert_equal expected, [hours, minutes]
35
+ end
36
+
37
+ def assert_minutes_equals(expected, time, options = {})
38
+ cron = parse_time(Whenever.seconds(2, :hours), 'some task', time, options)
39
+ assert_equal expected, cron.split(' ')[0]
40
+ end
41
+
42
+ def lines_without_empty_line(lines)
43
+ lines.map { |line| line.chomp }.reject { |line| line.empty? }
44
+ end
14
45
  end
15
46
 
16
- class Test::Unit::TestCase
17
- include TestExtensions
18
- end
47
+ Whenever::TestCase.send(:include, Whenever::TestHelpers)