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
data/test/test_helper.rb
ADDED
@@ -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
|
+
|