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.
Files changed (43) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +6 -0
  3. data/.travis.yml +18 -0
  4. data/CHANGELOG.md +333 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE +22 -0
  7. data/README.md +260 -0
  8. data/Rakefile +10 -0
  9. data/bin/whenever +41 -0
  10. data/bin/wheneverize +68 -0
  11. data/gemfiles/activesupport4.1.gemfile +5 -0
  12. data/gemfiles/activesupport4.2.gemfile +5 -0
  13. data/lib/whenever.rb +34 -0
  14. data/lib/whenever/capistrano.rb +7 -0
  15. data/lib/whenever/capistrano/v2/hooks.rb +8 -0
  16. data/lib/whenever/capistrano/v2/recipes.rb +48 -0
  17. data/lib/whenever/capistrano/v2/support.rb +53 -0
  18. data/lib/whenever/capistrano/v3/tasks/whenever.rake +45 -0
  19. data/lib/whenever/command_line.rb +135 -0
  20. data/lib/whenever/cron.rb +153 -0
  21. data/lib/whenever/job.rb +54 -0
  22. data/lib/whenever/job_list.rb +155 -0
  23. data/lib/whenever/numeric.rb +13 -0
  24. data/lib/whenever/numeric_seconds.rb +48 -0
  25. data/lib/whenever/os.rb +7 -0
  26. data/lib/whenever/output_redirection.rb +57 -0
  27. data/lib/whenever/setup.rb +26 -0
  28. data/lib/whenever/tasks/whenever.rake +1 -0
  29. data/lib/whenever/version.rb +3 -0
  30. data/test/functional/command_line_test.rb +331 -0
  31. data/test/functional/output_at_test.rb +207 -0
  32. data/test/functional/output_default_defined_jobs_test.rb +296 -0
  33. data/test/functional/output_defined_job_test.rb +85 -0
  34. data/test/functional/output_env_test.rb +29 -0
  35. data/test/functional/output_jobs_for_roles_test.rb +65 -0
  36. data/test/functional/output_redirection_test.rb +248 -0
  37. data/test/test_case.rb +32 -0
  38. data/test/test_helper.rb +37 -0
  39. data/test/unit/capistrano_support_test.rb +147 -0
  40. data/test/unit/cron_test.rb +244 -0
  41. data/test/unit/job_test.rb +114 -0
  42. data/whenever.gemspec +27 -0
  43. metadata +167 -0
@@ -0,0 +1,244 @@
1
+ require 'test_helper'
2
+
3
+ class CronTest < Whenever::TestCase
4
+ should "raise if less than 1 minute" do
5
+ assert_raises ArgumentError do
6
+ parse_time(Whenever.seconds(59, :seconds))
7
+ end
8
+
9
+ assert_raises ArgumentError do
10
+ parse_time(Whenever.seconds(0, :minutes))
11
+ end
12
+ end
13
+
14
+ # For sanity, do some tests on straight cron-syntax strings
15
+ should "parse correctly" do
16
+ assert_equal '* * * * *', parse_time(Whenever.seconds(1, :minute))
17
+ assert_equal '0,5,10,15,20,25,30,35,40,45,50,55 * * * *', parse_time(Whenever.seconds(5, :minutes))
18
+ assert_equal '7,14,21,28,35,42,49,56 * * * *', parse_time(Whenever.seconds(7, :minutes))
19
+ assert_equal '0,30 * * * *', parse_time(Whenever.seconds(30, :minutes))
20
+ assert_equal '32 * * * *', parse_time(Whenever.seconds(32, :minutes))
21
+ assert '60 * * * *' != parse_time(Whenever.seconds(60, :minutes)) # 60 minutes bumps up into the hour range
22
+ end
23
+
24
+ # Test all minutes
25
+ (2..59).each do |num|
26
+ should "parse correctly for #{num} minutes" do
27
+ start = 0
28
+ start += num unless 60.modulo(num).zero?
29
+ minutes = (start..59).step(num).to_a
30
+
31
+ assert_equal "#{minutes.join(',')} * * * *", parse_time(Whenever.seconds(num, :minutes))
32
+ end
33
+ end
34
+ end
35
+
36
+ class CronParseHoursTest < Whenever::TestCase
37
+ should "parse correctly" do
38
+ assert_equal '0 * * * *', parse_time(Whenever.seconds(1, :hour))
39
+ assert_equal '0 0,2,4,6,8,10,12,14,16,18,20,22 * * *', parse_time(Whenever.seconds(2, :hours))
40
+ assert_equal '0 0,3,6,9,12,15,18,21 * * *', parse_time(Whenever.seconds(3, :hours))
41
+ assert_equal '0 5,10,15,20 * * *', parse_time(Whenever.seconds(5, :hours))
42
+ assert_equal '0 17 * * *', parse_time(Whenever.seconds(17, :hours))
43
+ assert '0 24 * * *' != parse_time(Whenever.seconds(24, :hours)) # 24 hours bumps up into the day range
44
+ end
45
+
46
+ (2..23).each do |num|
47
+ should "parse correctly for #{num} hours" do
48
+ start = 0
49
+ start += num unless 24.modulo(num).zero?
50
+ hours = (start..23).step(num).to_a
51
+
52
+ assert_equal "0 #{hours.join(',')} * * *", parse_time(Whenever.seconds(num, :hours))
53
+ end
54
+ end
55
+
56
+ should "parse correctly when given an 'at' with minutes as an Integer" do
57
+ assert_minutes_equals "1", 1
58
+ assert_minutes_equals "14", 14
59
+ assert_minutes_equals "27", 27
60
+ assert_minutes_equals "55", 55
61
+ end
62
+
63
+ should "parse correctly when given an 'at' with minutes as a Time" do
64
+ # Basically just testing that Chronic parses some times and we get the minutes out of it
65
+ assert_minutes_equals "1", '3:01am'
66
+ assert_minutes_equals "1", 'January 21 2:01 PM'
67
+ assert_minutes_equals "0", 'midnight'
68
+ assert_minutes_equals "59", '13:59'
69
+ end
70
+ end
71
+
72
+ class CronParseDaysTest < Whenever::TestCase
73
+ should "parse correctly" do
74
+ assert_equal '0 0 * * *', parse_time(Whenever.seconds(1, :days))
75
+ assert_equal '0 0 1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31 * *', parse_time(Whenever.seconds(2, :days))
76
+ assert_equal '0 0 1,5,9,13,17,21,25,29 * *', parse_time(Whenever.seconds(4, :days))
77
+ assert_equal '0 0 1,8,15,22 * *', parse_time(Whenever.seconds(7, :days))
78
+ assert_equal '0 0 1,17 * *', parse_time(Whenever.seconds(16, :days))
79
+ assert_equal '0 0 17 * *', parse_time(Whenever.seconds(17, :days))
80
+ assert_equal '0 0 29 * *', parse_time(Whenever.seconds(29, :days))
81
+ assert '0 0 30 * *' != parse_time(Whenever.seconds(30, :days)) # 30 days bumps into the month range
82
+ end
83
+
84
+ should "parse correctly when given an 'at' with hours, minutes as a Time" do
85
+ # first param is an array with [hours, minutes]
86
+ assert_hours_and_minutes_equals %w(3 45), '3:45am'
87
+ assert_hours_and_minutes_equals %w(20 1), '8:01pm'
88
+ assert_hours_and_minutes_equals %w(0 0), 'midnight'
89
+ assert_hours_and_minutes_equals %w(1 23), '1:23 AM'
90
+ assert_hours_and_minutes_equals %w(23 59), 'March 21 11:59 pM'
91
+ end
92
+
93
+ should "parse correctly when given an 'at' with hours as an Integer" do
94
+ # first param is an array with [hours, minutes]
95
+ assert_hours_and_minutes_equals %w(1 0), 1
96
+ assert_hours_and_minutes_equals %w(3 0), 3
97
+ assert_hours_and_minutes_equals %w(15 0), 15
98
+ assert_hours_and_minutes_equals %w(19 0), 19
99
+ assert_hours_and_minutes_equals %w(23 0), 23
100
+ end
101
+ end
102
+
103
+ class CronParseMonthsTest < Whenever::TestCase
104
+ should "parse correctly" do
105
+ assert_equal '0 0 1 * *', parse_time(Whenever.seconds(1, :month))
106
+ assert_equal '0 0 1 1,3,5,7,9,11 *', parse_time(Whenever.seconds(2, :months))
107
+ assert_equal '0 0 1 1,4,7,10 *', parse_time(Whenever.seconds(3, :months))
108
+ assert_equal '0 0 1 1,5,9 *', parse_time(Whenever.seconds(4, :months))
109
+ assert_equal '0 0 1 1,6 *', parse_time(Whenever.seconds(5, :months))
110
+ assert_equal '0 0 1 7 *', parse_time(Whenever.seconds(7, :months))
111
+ assert_equal '0 0 1 8 *', parse_time(Whenever.seconds(8, :months))
112
+ assert_equal '0 0 1 9 *', parse_time(Whenever.seconds(9, :months))
113
+ assert_equal '0 0 1 10 *', parse_time(Whenever.seconds(10, :months))
114
+ assert_equal '0 0 1 11 *', parse_time(Whenever.seconds(11, :months))
115
+ assert_equal '0 0 1 12 *', parse_time(Whenever.seconds(12, :months))
116
+ end
117
+
118
+ should "parse months with a date and/or time" do
119
+ # should set the day to 1 if no date is given
120
+ assert_equal '0 17 1 * *', parse_time(Whenever.seconds(1, :month), nil, "5pm")
121
+ # should use the date if one is given
122
+ assert_equal '0 2 23 * *', parse_time(Whenever.seconds(1, :month), nil, "February 23rd at 2am")
123
+ # should use an iteger as the day
124
+ assert_equal '0 0 5 * *', parse_time(Whenever.seconds(1, :month), nil, 5)
125
+ end
126
+
127
+ should "parse correctly when given an 'at' with days, hours, minutes as a Time" do
128
+ # first param is an array with [days, hours, minutes]
129
+ assert_days_and_hours_and_minutes_equals %w(1 3 45), 'January 1st 3:45am'
130
+ assert_days_and_hours_and_minutes_equals %w(11 23 0), 'Feb 11 11PM'
131
+ assert_days_and_hours_and_minutes_equals %w(22 1 1), 'march 22nd at 1:01 am'
132
+ assert_days_and_hours_and_minutes_equals %w(23 0 0), 'march 22nd at midnight' # looks like midnight means the next day
133
+ end
134
+
135
+ should "parse correctly when given an 'at' with days as an Integer" do
136
+ # first param is an array with [days, hours, minutes]
137
+ assert_days_and_hours_and_minutes_equals %w(1 0 0), 1
138
+ assert_days_and_hours_and_minutes_equals %w(15 0 0), 15
139
+ assert_days_and_hours_and_minutes_equals %w(29 0 0), 29
140
+ end
141
+ end
142
+
143
+ class CronParseDaysOfWeekTest < Whenever::TestCase
144
+ should "parse days of the week correctly" do
145
+ {
146
+ '0' => %w(sun Sunday SUNDAY SUN),
147
+ '1' => %w(mon Monday MONDAY MON),
148
+ '2' => %w(tue tues Tuesday TUESDAY TUE),
149
+ '3' => %w(wed Wednesday WEDNESDAY WED),
150
+ '4' => %w(thu thurs thur Thursday THURSDAY THU),
151
+ '5' => %w(fri Friday FRIDAY FRI),
152
+ '6' => %w(sat Saturday SATURDAY SAT)
153
+ }.each do |day, day_tests|
154
+ day_tests.each do |day_test|
155
+ assert_equal "0 0 * * #{day}", parse_time(day_test)
156
+ end
157
+ end
158
+ end
159
+
160
+ should "allow additional directives" do
161
+ assert_equal '30 13 * * 5', parse_time('friday', nil, "1:30 pm")
162
+ assert_equal '22 2 * * 1', parse_time('Monday', nil, "2:22am")
163
+ assert_equal '55 17 * * 4', parse_time('THU', nil, "5:55PM")
164
+ end
165
+
166
+ should "parse weekday correctly" do
167
+ assert_equal '0 0 * * 1-5', parse_time('weekday')
168
+ assert_equal '0 0 * * 1-5', parse_time('Weekdays')
169
+ assert_equal '0 1 * * 1-5', parse_time('Weekdays', nil, "1:00 am")
170
+ assert_equal '59 5 * * 1-5', parse_time('Weekdays', nil, "5:59 am")
171
+ end
172
+
173
+ should "parse weekend correctly" do
174
+ assert_equal '0 0 * * 6,0', parse_time('weekend')
175
+ assert_equal '0 0 * * 6,0', parse_time('Weekends')
176
+ assert_equal '0 7 * * 6,0', parse_time('Weekends', nil, "7am")
177
+ assert_equal '2 18 * * 6,0', parse_time('Weekends', nil, "6:02PM")
178
+ end
179
+ end
180
+
181
+ class CronParseShortcutsTest < Whenever::TestCase
182
+ should "parse a :symbol into the correct shortcut" do
183
+ assert_equal '@reboot', parse_time(:reboot)
184
+ assert_equal '@annually', parse_time(:annually)
185
+ assert_equal '@yearly', parse_time(:yearly)
186
+ assert_equal '@daily', parse_time(:daily)
187
+ assert_equal '@midnight', parse_time(:midnight)
188
+ assert_equal '@monthly', parse_time(:monthly)
189
+ assert_equal '@weekly', parse_time(:weekly)
190
+ assert_equal '@hourly', parse_time(:hourly)
191
+ end
192
+
193
+ should "convert time-based shortcuts to times" do
194
+ assert_equal '0 0 1 * *', parse_time(:month)
195
+ assert_equal '0 0 * * *', parse_time(:day)
196
+ assert_equal '0 * * * *', parse_time(:hour)
197
+ assert_equal '0 0 1 12 *', parse_time(:year)
198
+ assert_equal '0 0 1,8,15,22 * *', parse_time(:week)
199
+ end
200
+
201
+ should "raise an exception if a valid shortcut is given but also an :at" do
202
+ assert_raises ArgumentError do
203
+ parse_time(:hourly, nil, "1:00 am")
204
+ end
205
+
206
+ assert_raises ArgumentError do
207
+ parse_time(:reboot, nil, 5)
208
+ end
209
+
210
+ assert_raises ArgumentError do
211
+ parse_time(:daily, nil, '4:20pm')
212
+ end
213
+ end
214
+ end
215
+
216
+ class CronParseRubyTimeTest < Whenever::TestCase
217
+ should "process things like `1.day` correctly" do
218
+ assert_equal "0 0 * * *", parse_time(1.day)
219
+ end
220
+ end
221
+
222
+ class CronParseRawTest < Whenever::TestCase
223
+ should "raise if cron-syntax string is too long" do
224
+ assert_raises ArgumentError do
225
+ parse_time('* * * * * *')
226
+ end
227
+ end
228
+
229
+ should "raise if cron-syntax string is invalid" do
230
+ assert_raises ArgumentError do
231
+ parse_time('** * * * *')
232
+ end
233
+ end
234
+
235
+ should "return the same cron sytax" do
236
+ crons = ['0 0 27-31 * *', '* * * * *', '2/3 1,9,22 11-26 1-6 *', '*/5 6-23 * * *',
237
+ "*\t*\t*\t*\t*",
238
+ '@reboot', '@yearly', '@annually', '@monthly', '@weekly',
239
+ '@daily', '@midnight', '@hourly']
240
+ crons.each do |cron|
241
+ assert_equal cron, parse_time(cron)
242
+ end
243
+ end
244
+ end
@@ -0,0 +1,114 @@
1
+ require 'test_helper'
2
+
3
+ class JobTest < Whenever::TestCase
4
+ should "return the :at set when #at is called" do
5
+ assert_equal 'foo', new_job(:at => 'foo').at
6
+ end
7
+
8
+ should "return the :roles set when #roles is called" do
9
+ assert_equal ['foo', 'bar'], new_job(:roles => ['foo', 'bar']).roles
10
+ end
11
+
12
+ should "return whether it has a role from #has_role?" do
13
+ assert new_job(:roles => 'foo').has_role?('foo')
14
+ assert_equal false, new_job(:roles => 'bar').has_role?('foo')
15
+ end
16
+
17
+ should "substitute the :task when #output is called" do
18
+ job = new_job(:template => ":task", :task => 'abc123')
19
+ assert_equal 'abc123', job.output
20
+ end
21
+
22
+ should "substitute the :path when #output is called" do
23
+ assert_equal 'foo', new_job(:template => ':path', :path => 'foo').output
24
+ end
25
+
26
+ should "substitute the :path with the default Whenever.path if none is provided when #output is called" do
27
+ Whenever.expects(:path).returns('/my/path')
28
+ assert_equal '/my/path', new_job(:template => ':path').output
29
+ end
30
+
31
+ should "not substitute parameters for which no value is set" do
32
+ assert_equal 'Hello :world', new_job(:template => ':matching :world', :matching => 'Hello').output
33
+ end
34
+
35
+ should "escape the :path" do
36
+ assert_equal '/my/spacey\ path', new_job(:template => ':path', :path => '/my/spacey path').output
37
+ end
38
+
39
+ should "escape percent signs" do
40
+ job = new_job(
41
+ :template => "before :foo after",
42
+ :foo => "percent -> % <- percent"
43
+ )
44
+ assert_equal %q(before percent -> \% <- percent after), job.output
45
+ end
46
+
47
+ should "assume percent signs are not already escaped" do
48
+ job = new_job(
49
+ :template => "before :foo after",
50
+ :foo => %q(percent preceded by a backslash -> \% <-)
51
+ )
52
+ assert_equal %q(before percent preceded by a backslash -> \\\% <- after), job.output
53
+ end
54
+
55
+ should "squish spaces and newlines" do
56
+ job = new_job(
57
+ :template => "before :foo after",
58
+ :foo => "newline -> \n <- newline space -> <- space"
59
+ )
60
+
61
+ assert_equal "before newline -> <- newline space -> <- space after", job.output
62
+ end
63
+ end
64
+
65
+
66
+ class JobWithQuotesTest < Whenever::TestCase
67
+ should "output the :task if it's in single quotes" do
68
+ job = new_job(:template => "':task'", :task => 'abc123')
69
+ assert_equal %q('abc123'), job.output
70
+ end
71
+
72
+ should "output the :task if it's in double quotes" do
73
+ job = new_job(:template => '":task"', :task => 'abc123')
74
+ assert_equal %q("abc123"), job.output
75
+ end
76
+
77
+ should "output escaped single quotes in when it's wrapped in them" do
78
+ job = new_job(
79
+ :template => "before ':foo' after",
80
+ :foo => "quote -> ' <- quote"
81
+ )
82
+ assert_equal %q(before 'quote -> '\'' <- quote' after), job.output
83
+ end
84
+
85
+ should "output escaped double quotes when it's wrapped in them" do
86
+ job = new_job(
87
+ :template => 'before ":foo" after',
88
+ :foo => 'quote -> " <- quote'
89
+ )
90
+ assert_equal %q(before "quote -> \" <- quote" after), job.output
91
+ end
92
+ end
93
+
94
+ class JobWithJobTemplateTest < Whenever::TestCase
95
+ should "use the job template" do
96
+ job = new_job(:template => ':task', :task => 'abc123', :job_template => 'left :job right')
97
+ assert_equal 'left abc123 right', job.output
98
+ end
99
+
100
+ should "reuse parameter in the job template" do
101
+ job = new_job(:template => ':path :task', :path => 'path', :task => "abc123", :job_template => ':path left :job right')
102
+ assert_equal 'path left path abc123 right', job.output
103
+ end
104
+
105
+ should "escape single quotes" do
106
+ job = new_job(:template => "before ':task' after", :task => "quote -> ' <- quote", :job_template => "left ':job' right")
107
+ assert_equal %q(left 'before '\''quote -> '\\''\\'\\'''\\'' <- quote'\'' after' right), job.output
108
+ end
109
+
110
+ should "escape double quotes" do
111
+ job = new_job(:template => 'before ":task" after', :task => 'quote -> " <- quote', :job_template => 'left ":job" right')
112
+ assert_equal %q(left "before \"quote -> \\\" <- quote\" after" right), job.output
113
+ end
114
+ end
@@ -0,0 +1,27 @@
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 = "whenever-benlangfeld"
7
+ s.version = Whenever::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Javan Makhmali"]
10
+ s.email = ["javan@javan.us"]
11
+ s.license = "MIT"
12
+ s.homepage = ""
13
+ s.summary = %q{Cron jobs in ruby.}
14
+ s.description = %q{Clean ruby syntax for writing and deploying cron jobs.}
15
+ s.files = `git ls-files`.split("\n")
16
+ s.test_files = `git ls-files -- test/{functional,unit}/*`.split("\n")
17
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
18
+ s.require_paths = ["lib"]
19
+ s.required_ruby_version = ">= 1.9.3"
20
+
21
+ s.add_dependency "chronic", ">= 0.6.3"
22
+
23
+ s.add_development_dependency "bundler"
24
+ s.add_development_dependency "rake"
25
+ s.add_development_dependency "mocha", ">= 0.9.5"
26
+ s.add_development_dependency "minitest"
27
+ end
metadata ADDED
@@ -0,0 +1,167 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: whenever-benlangfeld
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.9.5
5
+ platform: ruby
6
+ authors:
7
+ - Javan Makhmali
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-06-13 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: chronic
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 0.6.3
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 0.6.3
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: mocha
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: 0.9.5
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: 0.9.5
69
+ - !ruby/object:Gem::Dependency
70
+ name: minitest
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description: Clean ruby syntax for writing and deploying cron jobs.
84
+ email:
85
+ - javan@javan.us
86
+ executables:
87
+ - whenever
88
+ - wheneverize
89
+ extensions: []
90
+ extra_rdoc_files: []
91
+ files:
92
+ - ".gitignore"
93
+ - ".travis.yml"
94
+ - CHANGELOG.md
95
+ - Gemfile
96
+ - LICENSE
97
+ - README.md
98
+ - Rakefile
99
+ - bin/whenever
100
+ - bin/wheneverize
101
+ - gemfiles/activesupport4.1.gemfile
102
+ - gemfiles/activesupport4.2.gemfile
103
+ - lib/whenever.rb
104
+ - lib/whenever/capistrano.rb
105
+ - lib/whenever/capistrano/v2/hooks.rb
106
+ - lib/whenever/capistrano/v2/recipes.rb
107
+ - lib/whenever/capistrano/v2/support.rb
108
+ - lib/whenever/capistrano/v3/tasks/whenever.rake
109
+ - lib/whenever/command_line.rb
110
+ - lib/whenever/cron.rb
111
+ - lib/whenever/job.rb
112
+ - lib/whenever/job_list.rb
113
+ - lib/whenever/numeric.rb
114
+ - lib/whenever/numeric_seconds.rb
115
+ - lib/whenever/os.rb
116
+ - lib/whenever/output_redirection.rb
117
+ - lib/whenever/setup.rb
118
+ - lib/whenever/tasks/whenever.rake
119
+ - lib/whenever/version.rb
120
+ - test/functional/command_line_test.rb
121
+ - test/functional/output_at_test.rb
122
+ - test/functional/output_default_defined_jobs_test.rb
123
+ - test/functional/output_defined_job_test.rb
124
+ - test/functional/output_env_test.rb
125
+ - test/functional/output_jobs_for_roles_test.rb
126
+ - test/functional/output_redirection_test.rb
127
+ - test/test_case.rb
128
+ - test/test_helper.rb
129
+ - test/unit/capistrano_support_test.rb
130
+ - test/unit/cron_test.rb
131
+ - test/unit/job_test.rb
132
+ - whenever.gemspec
133
+ homepage: ''
134
+ licenses:
135
+ - MIT
136
+ metadata: {}
137
+ post_install_message:
138
+ rdoc_options: []
139
+ require_paths:
140
+ - lib
141
+ required_ruby_version: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: 1.9.3
146
+ required_rubygems_version: !ruby/object:Gem::Requirement
147
+ requirements:
148
+ - - ">="
149
+ - !ruby/object:Gem::Version
150
+ version: '0'
151
+ requirements: []
152
+ rubyforge_project:
153
+ rubygems_version: 2.5.1
154
+ signing_key:
155
+ specification_version: 4
156
+ summary: Cron jobs in ruby.
157
+ test_files:
158
+ - test/functional/command_line_test.rb
159
+ - test/functional/output_at_test.rb
160
+ - test/functional/output_default_defined_jobs_test.rb
161
+ - test/functional/output_defined_job_test.rb
162
+ - test/functional/output_env_test.rb
163
+ - test/functional/output_jobs_for_roles_test.rb
164
+ - test/functional/output_redirection_test.rb
165
+ - test/unit/capistrano_support_test.rb
166
+ - test/unit/cron_test.rb
167
+ - test/unit/job_test.rb