whenever 0.5.3 → 0.6.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,12 @@
1
+ == 0.6.1 / October 20th, 2010
2
+
3
+ * Detect script/rails file and change runner to Rails 3 style if found. [Javan Makhmali]
4
+
5
+ * Created a new :job_template system that can be applied to all commands. Wraps all in bash -l -c 'command..' by default now for better RVM support. Stopped automatically setting the PATH too. [Javan Makhmali]
6
+
7
+ * Added a built-in Capistrano recipe. [Javan Makhmali]
8
+
9
+
1
10
  == 0.5.3 / September 24th, 2010
2
11
 
3
12
  * Better regexes for replacing Whenever blocks in the crontab. #45 [Javan Makhmali]
@@ -1,15 +1,15 @@
1
1
  == Introduction
2
2
 
3
- Whenever is a Ruby gem that provides a clear syntax for defining cron jobs. It outputs valid cron syntax and can even write your crontab file for you. It is designed to work well with Rails applications and can be deployed with Capistrano. Whenever works fine independently as well.
4
-
5
- Ryan Bates created a great Railscast about Whenever: http://railscasts.com/episodes/164-cron-in-ruby
6
-
7
- Discussion: http://groups.google.com/group/whenever-gem
3
+ Whenever is a Ruby gem that provides a clear syntax for writing and deploying cron jobs.
8
4
 
9
5
  == Installation
10
6
 
11
- $ sudo gem install whenever
7
+ $ gem install whenever
12
8
 
9
+ Or with Bundler in your Gemfile.
10
+
11
+ gem 'whenever', :require => false
12
+
13
13
  == Getting started
14
14
 
15
15
  $ cd /my/rails/app
@@ -41,7 +41,7 @@ More examples on the wiki: http://wiki.github.com/javan/whenever/instructions-an
41
41
 
42
42
  == Define your own job types
43
43
 
44
- Whenever ships with three pre-defined job types: command, runner, and rake. You can define your own with <code>job_type</code>.
44
+ Whenever ships with three pre-defined job types: command, runner, and rake. You can define your own with `job_type`.
45
45
 
46
46
  For example:
47
47
 
@@ -51,43 +51,52 @@ For example:
51
51
  awesome "party", :fun_level => "extreme"
52
52
  end
53
53
 
54
- Would run <code>/usr/local/bin/awesome party extreme</code> every two hours. <code>:task</code> is always replaced with the first argument, and any additional <code>:whatevers</code> are replaced with the options passed in or by variables that have been defined with <code>set</code>.
54
+ Would run `/usr/local/bin/awesome party extreme` every two hours. `:task` is always replaced with the first argument, and any additional `:whatevers` are replaced with the options passed in or by variables that have been defined with `set`.
55
55
 
56
56
  The default job types that ship with Whenever are defined like so:
57
57
 
58
- job_type :command, ":task"
59
- job_type :runner, "cd :path && script/runner -e :environment ':task'"
60
- job_type :rake, "cd :path && RAILS_ENV=:environment /usr/bin/env rake :task"
58
+ job_type :command, ":task :output"
59
+ job_type :rake, "cd :path && RAILS_ENV=:environment rake :task :output"
60
+ job_type :runner, "cd :path && script/runner -e :environment ':task' :output"
61
+
62
+ If a script/rails file is detected (like in a Rails 3 app), runner will be defined to fit:
61
63
 
62
- If a <code>:path</code> is not set it will default to the directory in which <code>whenever</code> was executed. <code>:environment</code> will default to 'production'.
64
+ job_type :runner, "cd :path && script/rails runner -e :environment ':task' :output"
63
65
 
64
- == Cron output
66
+ If a `:path` is not set it will default to the directory in which `whenever` was executed. `:environment` will default to 'production'. `:output` will be replaced with your output redirection settings which you can read more about here: http://github.com/javan/whenever/wiki/Output-redirection-(logging-your-cron-jobs)
65
67
 
66
- $ cd /my/rails/app
67
- $ whenever
68
+ All jobs are by default run with `bash -l -c 'command...'`. Among other things, this allows your cron jobs to play nice with RVM by loading the entire environment instead of cron's somewhat limited environment. Read more: http://blog.scoutapp.com/articles/2010/09/07/rvm-and-cron-in-production
68
69
 
69
- And you'll see your schedule.rb converted to cron sytax. Note: running `whenever' with no options does not display your current crontab file, it simply shows you the output of converting your schedule.rb file.
70
+ You can change this by setting your own job_template.
71
+
72
+ set :job_template, "bash -l -c ':job'"
73
+
74
+ Or set the job_template to nil to have your jobs execute normally.
75
+
76
+ set :job_template, nil
77
+
78
+ And you'll see your schedule.rb converted to cron sytax. Note: running `whenever` with no options does not display your current crontab file, it simply shows you the output of converting your schedule.rb file.
70
79
 
71
80
  == Capistrano integration
72
81
 
73
- In your "config/deploy.rb" file do something like:
82
+ Use the built-in Capistrano recipe for easy crontab updates with deploys.
74
83
 
75
- after "deploy:symlink", "deploy:update_crontab"
84
+ In your "config/deploy.rb" file:
76
85
 
77
- namespace :deploy do
78
- desc "Update the crontab file"
79
- task :update_crontab, :roles => :db do
80
- run "cd #{release_path} && whenever --update-crontab #{application}"
81
- end
82
- end
86
+ require "whenever/capistrano"
83
87
 
84
- This will update your crontab file, leaving any existing entries unharmed. When using the <code>--update-crontab</code> option, Whenever will only update the entries in your crontab file related to the current schedule.rb file. You can replace the <code>#{application}</code> with any identifying string you'd like. You can have any number of apps deploy to the same crontab file peacefully given they each use a different identifier.
88
+ Take a look at the recipe for options you can set. http://github.com/javan/whenever/blob/master/lib/whenever/capistrano.rb
89
+ For example, if you're using bundler do this:
85
90
 
86
- If you wish to simply overwrite your crontab file each time you deploy, use the <code>--write-crontab</code> option. This is ideal if you are only working with one app and every crontab entry is contained in a single schedule.rb file.
91
+ set :whenever_command, "bundle exec whenever"
92
+ require "whenever/capistrano"
87
93
 
88
- By mixing and matching the <code>--load-file</code> and <code>--user</code> options with your various :roles in Capistrano it is entirely possible to deploy different crontab schedules under different users to all your various servers. Get creative!
94
+ == The `whenever` command
89
95
 
90
- If you want to override a variable (like your environment) at the time of deployment you can do so with the <code>--set</code> option: http://wiki.github.com/javan/whenever/setting-variables-on-the-fly
96
+ $ cd /my/rails/app
97
+ $ whenever
98
+
99
+ This will simply show you your schedule.rb file converted to cron syntax. It does not read or write your crontab file. Run `whenever --help` for a complete list of options.
91
100
 
92
101
  == Credit
93
102
 
@@ -101,6 +110,9 @@ For general discussion and questions, please use the google group: http://groups
101
110
 
102
111
  If you've found a genuine bug or issue, please use the Issues section on github: http://github.com/javan/whenever/issues
103
112
 
113
+ Ryan Bates created a great Railscast about Whenever: http://railscasts.com/episodes/164-cron-in-ruby
114
+ It's a little bit dated now, but remains a good introduction.
115
+
104
116
  == License
105
117
 
106
118
  Copyright (c) 2009+ Javan Makhmali
data/Rakefile CHANGED
@@ -8,8 +8,8 @@ begin
8
8
  Jeweler::Tasks.new do |gemspec|
9
9
  gemspec.name = "whenever"
10
10
  gemspec.version = Whenever::VERSION
11
- gemspec.summary = "Clean ruby syntax for defining and deploying messy cron jobs."
12
- gemspec.description = "Clean ruby syntax for defining and deploying messy cron jobs."
11
+ gemspec.summary = "Clean ruby syntax for writing and deploying cron jobs."
12
+ gemspec.description = "http://www.allyrics.net/Kid-Cudi/lyrics/Whenever/"
13
13
  gemspec.email = "javan@javan.us"
14
14
  gemspec.homepage = "http://github.com/javan/whenever"
15
15
  gemspec.authors = ["Javan Makhmali"]
@@ -4,32 +4,35 @@ require 'rubygems'
4
4
  require 'optparse'
5
5
  require 'whenever'
6
6
 
7
- options = Hash.new
7
+ options = {}
8
8
 
9
9
  OptionParser.new do |opts|
10
10
  opts.banner = "Usage: whenever [options]"
11
- opts.on('-v', '--version') { puts "Whenever v#{Whenever::VERSION}"; exit(0) }
12
- opts.on('-w', '--write-crontab') { options[:write] = true }
13
- opts.on('-c', '--cut [lines]', 'Cut lines from the top of the cronfile') do |lines|
14
- options[:cut] = lines.to_i if lines
15
- end
16
11
  opts.on('-i', '--update-crontab [identifier]', 'Default: full path to schedule.rb file') do |identifier|
17
12
  options[:update] = true
18
13
  options[:identifier] = identifier if identifier
19
14
  end
15
+ opts.on('-w', '--write-crontab [identifier]', 'Default: full path to schedule.rb file') do |identifier|
16
+ options[:write] = true
17
+ options[:identifier] = identifier if identifier
18
+ end
20
19
  opts.on('-c', '--clear-crontab [identifier]') do |identifier|
21
20
  options[:clear] = true
22
21
  options[:identifier] = identifier if identifier
23
22
  end
23
+ opts.on('-s', '--set [variables]', 'Example: --set environment=staging&path=/my/sweet/path') do |set|
24
+ options[:set] = set if set
25
+ end
24
26
  opts.on('-f', '--load-file [schedule file]', 'Default: config/schedule.rb') do |file|
25
27
  options[:file] = file if file
26
28
  end
27
29
  opts.on('-u', '--user [user]', 'Default: current user') do |user|
28
30
  options[:user] = user if user
29
31
  end
30
- opts.on('-s', '--set [variables]', 'Example: --set environment=staging&path=/my/sweet/path') do |set|
31
- options[:set] = set if set
32
+ opts.on('-k', '--cut [lines]', 'Cut lines from the top of the cronfile') do |lines|
33
+ options[:cut] = lines.to_i if lines
32
34
  end
35
+ opts.on('-v', '--version') { puts "Whenever v#{Whenever::VERSION}"; exit(0) }
33
36
  end.parse!
34
37
 
35
38
  Whenever::CommandLine.execute(options)
@@ -0,0 +1,31 @@
1
+ Capistrano::Configuration.instance(:must_exist).load do
2
+
3
+ _cset(:whenever_roles) { :db }
4
+ _cset(:whenever_command) { "whenever" }
5
+ _cset(:whenever_identifier) { application }
6
+ _cset(:whenever_update_flags) { "--update-crontab #{whenever_identifier}" }
7
+ _cset(:whenever_clear_flags) { "--clear-crontab #{whenever_identifier}" }
8
+
9
+ # Disable cron jobs at the begining of a deploy.
10
+ after "deploy:update_code", "whenever:clear_crontab"
11
+ # Write the new cron jobs near the end.
12
+ after "deploy:symlink", "whenever:update_crontab"
13
+ # If anything goes wrong, undo.
14
+ after "deploy:rollback", "whenever:update_crontab"
15
+
16
+ namespace :whenever do
17
+ desc "Update application's crontab entries using Whenever"
18
+ task :update_crontab, :roles => whenever_roles do
19
+ # Hack by Jamis to skip a task if the role has no servers defined. http://tinyurl.com/ckjgnz
20
+ next if find_servers_for_task(current_task).empty?
21
+ run "cd #{current_path} && #{whenever_command} #{whenever_update_flags}"
22
+ end
23
+
24
+ desc "Clear application's crontab entries using Whenever"
25
+ task :clear_crontab, :roles => whenever_roles do
26
+ next if find_servers_for_task(current_task).empty?
27
+ run "cd #{release_path} && #{whenever_command} #{whenever_clear_flags}"
28
+ end
29
+ end
30
+
31
+ end
@@ -4,11 +4,10 @@ module Whenever
4
4
 
5
5
  attr_accessor :time, :task
6
6
 
7
- def initialize(time = nil, task = nil, at = nil, output_redirection = nil)
7
+ def initialize(time = nil, task = nil, at = nil)
8
8
  @time = time
9
9
  @task = task
10
10
  @at = at.is_a?(String) ? (Chronic.parse(at) || 0) : (at || 0)
11
- @output_redirection = output_redirection
12
11
  end
13
12
 
14
13
  def self.enumerate(item)
@@ -24,13 +23,13 @@ module Whenever
24
23
  def self.output(times, job)
25
24
  enumerate(times).each do |time|
26
25
  enumerate(job.at).each do |at|
27
- yield new(time, job.output, at, job.output_redirection).output
26
+ yield new(time, job.output, at).output
28
27
  end
29
28
  end
30
29
  end
31
30
 
32
31
  def output
33
- [time_in_cron_syntax, task, output_redirection].compact.join(' ').strip
32
+ [time_in_cron_syntax, task].compact.join(' ').strip
34
33
  end
35
34
 
36
35
  def time_in_cron_syntax
@@ -40,10 +39,6 @@ module Whenever
40
39
  else parse_time
41
40
  end
42
41
  end
43
-
44
- def output_redirection
45
- Whenever::Output::Cron::OutputRedirection.new(@output_redirection).to_s unless @output_redirection == :not_set
46
- end
47
42
 
48
43
  protected
49
44
 
@@ -1,21 +1,29 @@
1
1
  module Whenever
2
2
  class Job
3
3
 
4
- attr_reader :at, :output_redirection
4
+ attr_reader :at
5
5
 
6
6
  def initialize(options = {})
7
7
  @options = options
8
-
9
- @at = options[:at]
10
- @output_redirection = options.has_key?(:output) ? options[:output] : :not_set
8
+ @at = options.delete(:at)
9
+ @template = options.delete(:template)
10
+ @job_template = options.delete(:job_template) || ":job"
11
+ @options[:output] = Whenever::Output::Redirection.new(options[:output]).to_s if options.has_key?(:output)
11
12
  @options[:environment] ||= :production
12
13
  @options[:path] ||= Whenever.path
13
14
  end
14
15
 
15
16
  def output
16
- @options[:template].dup.gsub(/:\w+/) do |key|
17
+ job = process_template(@template, @options).strip
18
+ process_template(@job_template, { :job => job }).strip
19
+ end
20
+
21
+ protected
22
+
23
+ def process_template(template, options)
24
+ template.gsub(/:\w+/) do |key|
17
25
  before_and_after = [$`[-1..-1], $'[0..0]]
18
- option = @options[key.sub(':', '').to_sym]
26
+ option = options[key.sub(':', '').to_sym]
19
27
 
20
28
  if before_and_after.all? { |c| c == "'" }
21
29
  escape_single_quotes(option)
@@ -26,8 +34,6 @@ module Whenever
26
34
  end
27
35
  end
28
36
  end
29
-
30
- protected
31
37
 
32
38
  def escape_single_quotes(str)
33
39
  str.gsub(/'/) { "'\\''" }
@@ -2,7 +2,7 @@ module Whenever
2
2
  class JobList
3
3
 
4
4
  def initialize(options)
5
- @jobs, @env, @set_variables = {}, {}, {}
5
+ @jobs, @env, @set_variables, @pre_set_variables = {}, {}, {}, {}
6
6
 
7
7
  case options
8
8
  when String
@@ -25,7 +25,8 @@ module Whenever
25
25
  end
26
26
 
27
27
  def set(variable, value)
28
- return if instance_variable_defined?("@#{variable}".to_sym)
28
+ variable = variable.to_sym
29
+ return if @pre_set_variables[variable]
29
30
 
30
31
  instance_variable_set("@#{variable}".to_sym, value)
31
32
  self.class.send(:attr_reader, variable.to_sym)
@@ -59,9 +60,7 @@ module Whenever
59
60
  end
60
61
  end
61
62
 
62
- def generate_cron_output
63
- set_path_environment_variable
64
-
63
+ def generate_cron_output
65
64
  [environment_variables, cron_jobs].compact.join
66
65
  end
67
66
 
@@ -79,22 +78,13 @@ module Whenever
79
78
  pairs.each do |pair|
80
79
  next unless pair.index('=')
81
80
  variable, value = *pair.split('=')
82
- set(variable.strip.to_sym, value.strip) unless variable.blank? || value.blank?
81
+ unless variable.blank? || value.blank?
82
+ variable = variable.strip.to_sym
83
+ set(variable, value.strip)
84
+ @pre_set_variables[variable] = value
85
+ end
83
86
  end
84
87
  end
85
-
86
- def set_path_environment_variable
87
- return if path_should_not_be_set_automatically?
88
- @env[:PATH] = read_path unless read_path.blank?
89
- end
90
-
91
- def read_path
92
- ENV['PATH'] if ENV
93
- end
94
-
95
- def path_should_not_be_set_automatically?
96
- @set_path_automatically === false || @env[:PATH] || @env["PATH"]
97
- end
98
88
 
99
89
  def environment_variables
100
90
  return if @env.empty?
@@ -1,3 +1,11 @@
1
- job_type :command, ":task"
2
- job_type :runner, "cd :path && script/runner -e :environment ':task'"
3
- job_type :rake, "cd :path && RAILS_ENV=:environment /usr/bin/env rake :task"
1
+ # http://blog.scoutapp.com/articles/2010/09/07/rvm-and-cron-in-production
2
+ set :job_template, "/bin/bash -l -c ':job'"
3
+
4
+ job_type :command, ":task :output"
5
+ job_type :rake, "cd :path && RAILS_ENV=:environment rake :task --silent :output"
6
+
7
+ if File.exists?(File.join(Whenever.path, 'script', 'rails'))
8
+ job_type :runner, "cd :path && script/rails runner -e :environment ':task' :output"
9
+ else
10
+ job_type :runner, "cd :path && script/runner -e :environment ':task' :output"
11
+ end
@@ -1,60 +1,58 @@
1
1
  module Whenever
2
2
  module Output
3
- class Cron
4
- class OutputRedirection
5
-
6
- def initialize(output)
7
- @output = output
8
- end
9
-
10
- def to_s
11
- return '' unless defined?(@output)
12
- case @output
13
- when String then redirect_from_string
14
- when Hash then redirect_from_hash
15
- when NilClass then ">> /dev/null 2>&1"
16
- else ''
17
- end
18
- end
19
-
20
- protected
21
-
22
- def stdout
23
- return unless @output.has_key?(:standard)
24
- @output[:standard].nil? ? '/dev/null' : @output[:standard]
25
- end
3
+ class Redirection
4
+
5
+ def initialize(output)
6
+ @output = output
7
+ end
8
+
9
+ def to_s
10
+ return '' unless defined?(@output)
11
+ case @output
12
+ when String then redirect_from_string
13
+ when Hash then redirect_from_hash
14
+ when NilClass then ">> /dev/null 2>&1"
15
+ else ''
16
+ end
17
+ end
18
+
19
+ protected
20
+
21
+ def stdout
22
+ return unless @output.has_key?(:standard)
23
+ @output[:standard].nil? ? '/dev/null' : @output[:standard]
24
+ end
26
25
 
27
- def stderr
28
- return unless @output.has_key?(:error)
29
- @output[:error].nil? ? '/dev/null' : @output[:error]
30
- end
26
+ def stderr
27
+ return unless @output.has_key?(:error)
28
+ @output[:error].nil? ? '/dev/null' : @output[:error]
29
+ end
31
30
 
32
- def redirect_from_hash
33
- case
34
- when stdout == '/dev/null' && stderr == '/dev/null'
35
- "> /dev/null 2>&1"
36
- when stdout && stderr == '/dev/null'
37
- ">> #{stdout} 2> /dev/null"
38
- when stdout && stderr
39
- ">> #{stdout} 2>> #{stderr}"
40
- when stderr == '/dev/null'
41
- "2> /dev/null"
42
- when stderr
43
- "2>> #{stderr}"
44
- when stdout == '/dev/null'
45
- "> /dev/null"
46
- when stdout
47
- ">> #{stdout}"
48
- else
49
- ''
50
- end
31
+ def redirect_from_hash
32
+ case
33
+ when stdout == '/dev/null' && stderr == '/dev/null'
34
+ "> /dev/null 2>&1"
35
+ when stdout && stderr == '/dev/null'
36
+ ">> #{stdout} 2> /dev/null"
37
+ when stdout && stderr
38
+ ">> #{stdout} 2>> #{stderr}"
39
+ when stderr == '/dev/null'
40
+ "2> /dev/null"
41
+ when stderr
42
+ "2>> #{stderr}"
43
+ when stdout == '/dev/null'
44
+ "> /dev/null"
45
+ when stdout
46
+ ">> #{stdout}"
47
+ else
48
+ ''
51
49
  end
50
+ end
52
51
 
53
- def redirect_from_string
54
- ">> #{@output} 2>&1"
55
- end
56
-
52
+ def redirect_from_string
53
+ ">> #{@output} 2>&1"
57
54
  end
55
+
58
56
  end
59
57
  end
60
58
  end
@@ -1,3 +1,3 @@
1
1
  module Whenever
2
- VERSION = '0.5.3'
2
+ VERSION = '0.6.1'
3
3
  end unless defined?(Whenever::VERSION)
@@ -217,6 +217,7 @@ NEW_CRON
217
217
  setup do
218
218
  @output = Whenever.cron :set => 'environment=serious', :string => \
219
219
  <<-file
220
+ set :job_template, nil
220
221
  set :environment, :silly
221
222
  set :path, '/my/path'
222
223
  every 2.hours do
@@ -234,6 +235,7 @@ NEW_CRON
234
235
  setup do
235
236
  @output = Whenever.cron :set => 'environment=serious&path=/serious/path', :string => \
236
237
  <<-file
238
+ set :job_template, nil
237
239
  set :environment, :silly
238
240
  set :path, '/silly/path'
239
241
  every 2.hours do
@@ -251,6 +253,7 @@ NEW_CRON
251
253
  setup do
252
254
  @output = Whenever.cron :set => ' environment = serious& path =/serious/path', :string => \
253
255
  <<-file
256
+ set :job_template, nil
254
257
  set :environment, :silly
255
258
  set :path, '/silly/path'
256
259
  every 2.hours do
@@ -268,6 +271,7 @@ NEW_CRON
268
271
  setup do
269
272
  @output = Whenever.cron :set => ' environment=', :string => \
270
273
  <<-file
274
+ set :job_template, nil
271
275
  set :environment, :silly
272
276
  set :path, '/silly/path'
273
277
  every 2.hours do
@@ -6,6 +6,7 @@ class OutputAtTest < Test::Unit::TestCase
6
6
  setup do
7
7
  @output = Whenever.cron \
8
8
  <<-file
9
+ set :job_template, nil
9
10
  every "weekday", :at => '5:02am' do
10
11
  command "blahblah"
11
12
  end
@@ -21,6 +22,7 @@ class OutputAtTest < Test::Unit::TestCase
21
22
  setup do
22
23
  @output = Whenever.cron \
23
24
  <<-file
25
+ set :job_template, nil
24
26
  every "weekday", :at => %w(5:02am 3:52pm) do
25
27
  command "blahblah"
26
28
  end
@@ -37,6 +39,7 @@ class OutputAtTest < Test::Unit::TestCase
37
39
  setup do
38
40
  @output = Whenever.cron \
39
41
  <<-file
42
+ set :job_template, nil
40
43
  every "weekday", :at => '5:02am, 3:52pm' do
41
44
  command "blahblah"
42
45
  end
@@ -53,6 +56,7 @@ class OutputAtTest < Test::Unit::TestCase
53
56
  setup do
54
57
  @output = Whenever.cron \
55
58
  <<-file
59
+ set :job_template, nil
56
60
  every "weekday", :at => '5:02am, 3:02pm' do
57
61
  command "blahblah"
58
62
  end
@@ -68,6 +72,7 @@ class OutputAtTest < Test::Unit::TestCase
68
72
  setup do
69
73
  @output = Whenever.cron \
70
74
  <<-file
75
+ set :job_template, nil
71
76
  every "mon,wed,fri", :at => '5:02am, 3:02pm' do
72
77
  command "blahblah"
73
78
  end
@@ -83,6 +88,7 @@ class OutputAtTest < Test::Unit::TestCase
83
88
  setup do
84
89
  @output = Whenever.cron \
85
90
  <<-file
91
+ set :job_template, nil
86
92
  set :path, '/your/path'
87
93
  every "mon,wed,fri", :at => '5:02am, 3:02pm' do
88
94
  runner "blahblah"
@@ -99,6 +105,7 @@ class OutputAtTest < Test::Unit::TestCase
99
105
  setup do
100
106
  @output = Whenever.cron \
101
107
  <<-file
108
+ set :job_template, nil
102
109
  set :path, '/your/path'
103
110
  every "mon,wed,fri", :at => '5:02am, 3:02pm' do
104
111
  rake "blah:blah"
@@ -107,7 +114,7 @@ class OutputAtTest < Test::Unit::TestCase
107
114
  end
108
115
 
109
116
  should "output the rake task using one entry because the times are aligned" do
110
- assert_match '2 5,15 * * 1,3,5 cd /your/path && RAILS_ENV=production /usr/bin/env rake blah:blah', @output
117
+ assert_match '2 5,15 * * 1,3,5 cd /your/path && RAILS_ENV=production rake blah:blah --silent', @output
111
118
  end
112
119
  end
113
120
 
@@ -115,6 +122,7 @@ class OutputAtTest < Test::Unit::TestCase
115
122
  setup do
116
123
  @output = Whenever.cron \
117
124
  <<-file
125
+ set :job_template, nil
118
126
  every [1.month, 1.day], :at => 'january 5:02am, june 17th at 2:22pm, june 3rd at 3:33am' do
119
127
  command "blahblah"
120
128
  end
@@ -138,6 +146,7 @@ class OutputAtTest < Test::Unit::TestCase
138
146
  setup do
139
147
  @output = Whenever.cron \
140
148
  <<-file
149
+ set :job_template, nil
141
150
  every :reboot do
142
151
  command "command_1"
143
152
  command "command_2"
@@ -155,6 +164,7 @@ class OutputAtTest < Test::Unit::TestCase
155
164
  setup do
156
165
  @output = Whenever.cron \
157
166
  <<-file
167
+ set :job_template, nil
158
168
  set :path, '/your/path'
159
169
  every :day do
160
170
  rake "blah:blah"
@@ -167,7 +177,7 @@ class OutputAtTest < Test::Unit::TestCase
167
177
  end
168
178
 
169
179
  should "output all of the commands @daily" do
170
- assert_match '@daily cd /your/path && RAILS_ENV=production /usr/bin/env rake blah:blah', @output
180
+ assert_match '@daily cd /your/path && RAILS_ENV=production rake blah:blah --silent', @output
171
181
  assert_match %(@daily cd /your/path && script/runner -e production 'runner_1'), @output
172
182
  assert_match '@daily command_1', @output
173
183
  assert_match %(@daily cd /your/path && script/runner -e production 'runner_2'), @output
@@ -179,6 +189,7 @@ class OutputAtTest < Test::Unit::TestCase
179
189
  setup do
180
190
  @output = Whenever.cron \
181
191
  <<-file
192
+ set :job_template, nil
182
193
  every 5.minutes, :at => 1 do
183
194
  command "blahblah"
184
195
  end
@@ -194,6 +205,7 @@ class OutputAtTest < Test::Unit::TestCase
194
205
  setup do
195
206
  @output = Whenever.cron \
196
207
  <<-file
208
+ set :job_template, nil
197
209
  every 4.minutes, :at => 2 do
198
210
  command "blahblah"
199
211
  end
@@ -209,6 +221,7 @@ class OutputAtTest < Test::Unit::TestCase
209
221
  setup do
210
222
  @output = Whenever.cron \
211
223
  <<-file
224
+ set :job_template, nil
212
225
  every 3.minutes, :at => 7 do
213
226
  command "blahblah"
214
227
  end
@@ -224,6 +237,7 @@ class OutputAtTest < Test::Unit::TestCase
224
237
  setup do
225
238
  @output = Whenever.cron \
226
239
  <<-file
240
+ set :job_template, nil
227
241
  every 2.minutes, :at => 27 do
228
242
  command "blahblah"
229
243
  end
@@ -4,10 +4,11 @@ class OutputDefaultDefinedJobsTest < Test::Unit::TestCase
4
4
 
5
5
  # command
6
6
 
7
- context "A plain command" do
7
+ context "A plain command with the job template set to nil" do
8
8
  setup do
9
9
  @output = Whenever.cron \
10
10
  <<-file
11
+ set :job_template, nil
11
12
  every 2.hours do
12
13
  command "blahblah"
13
14
  end
@@ -19,12 +20,45 @@ class OutputDefaultDefinedJobsTest < Test::Unit::TestCase
19
20
  end
20
21
  end
21
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
+
22
55
  # runner
23
56
 
24
57
  context "A runner with path set" do
25
58
  setup do
26
59
  @output = Whenever.cron \
27
60
  <<-file
61
+ set :job_template, nil
28
62
  set :path, '/my/path'
29
63
  every 2.hours do
30
64
  runner 'blahblah'
@@ -41,6 +75,7 @@ class OutputDefaultDefinedJobsTest < Test::Unit::TestCase
41
75
  setup do
42
76
  @output = Whenever.cron \
43
77
  <<-file
78
+ set :job_template, nil
44
79
  set :path, '/my/path'
45
80
  every 2.hours do
46
81
  runner "blahblah", :path => '/some/other/path'
@@ -53,12 +88,31 @@ class OutputDefaultDefinedJobsTest < Test::Unit::TestCase
53
88
  end
54
89
  end
55
90
 
91
+ context "A runner for a Rails 3 app" do
92
+ setup do
93
+ Whenever.expects(:path).at_least_once.returns('/my/path')
94
+ File.expects(:exists?).with('/my/path/script/rails').returns(true)
95
+ @output = Whenever.cron \
96
+ <<-file
97
+ set :job_template, nil
98
+ every 2.hours do
99
+ runner 'blahblah'
100
+ end
101
+ file
102
+ end
103
+
104
+ should "use the Rails 3 runner job by default" do
105
+ assert_match two_hours + %( cd /my/path && script/rails runner -e production 'blahblah'), @output
106
+ end
107
+ end
108
+
56
109
  # rake
57
110
 
58
111
  context "A rake command with path set" do
59
112
  setup do
60
113
  @output = Whenever.cron \
61
114
  <<-file
115
+ set :job_template, nil
62
116
  set :path, '/my/path'
63
117
  every 2.hours do
64
118
  rake "blahblah"
@@ -67,7 +121,7 @@ class OutputDefaultDefinedJobsTest < Test::Unit::TestCase
67
121
  end
68
122
 
69
123
  should "output the rake command using that path" do
70
- assert_match two_hours + ' cd /my/path && RAILS_ENV=production /usr/bin/env rake blahblah', @output
124
+ assert_match two_hours + ' cd /my/path && RAILS_ENV=production rake blahblah --silent', @output
71
125
  end
72
126
  end
73
127
 
@@ -75,6 +129,7 @@ class OutputDefaultDefinedJobsTest < Test::Unit::TestCase
75
129
  setup do
76
130
  @output = Whenever.cron \
77
131
  <<-file
132
+ set :job_template, nil
78
133
  set :path, '/my/path'
79
134
  every 2.hours do
80
135
  rake "blahblah", :path => '/some/other/path'
@@ -83,7 +138,7 @@ class OutputDefaultDefinedJobsTest < Test::Unit::TestCase
83
138
  end
84
139
 
85
140
  should "output the rake command using that path" do
86
- assert_match two_hours + ' cd /some/other/path && RAILS_ENV=production /usr/bin/env rake blahblah', @output
141
+ assert_match two_hours + ' cd /some/other/path && RAILS_ENV=production rake blahblah --silent', @output
87
142
  end
88
143
  end
89
144
 
@@ -6,6 +6,7 @@ class OutputDefinedJobTest < Test::Unit::TestCase
6
6
  setup do
7
7
  @output = Whenever.cron \
8
8
  <<-file
9
+ set :job_template, nil
9
10
  job_type :some_job, "before :task after"
10
11
  every 2.hours do
11
12
  some_job "during"
@@ -22,6 +23,7 @@ class OutputDefinedJobTest < Test::Unit::TestCase
22
23
  setup do
23
24
  @output = Whenever.cron \
24
25
  <<-file
26
+ set :job_template, nil
25
27
  job_type :some_job, "before :task after :option1 :option2"
26
28
  every 2.hours do
27
29
  some_job "during", :option1 => 'happy', :option2 => 'birthday'
@@ -38,6 +40,7 @@ class OutputDefinedJobTest < Test::Unit::TestCase
38
40
  setup do
39
41
  @output = Whenever.cron \
40
42
  <<-file
43
+ set :job_template, nil
41
44
  job_type :some_job, "before :task after :option1"
42
45
  set :option1, 'happy'
43
46
  every 2.hours do
@@ -55,6 +58,7 @@ class OutputDefinedJobTest < Test::Unit::TestCase
55
58
  setup do
56
59
  @output = Whenever.cron \
57
60
  <<-file
61
+ set :job_template, nil
58
62
  job_type :some_job, "before :task after :option1"
59
63
  set :option1, 'global'
60
64
  every 2.hours do
@@ -72,6 +76,7 @@ class OutputDefinedJobTest < Test::Unit::TestCase
72
76
  setup do
73
77
  @output = Whenever.cron \
74
78
  <<-file
79
+ set :job_template, nil
75
80
  job_type :some_job, "before :task after :option1"
76
81
  every 2.hours do
77
82
  some_job "during", :option2 => 'happy'
@@ -86,10 +91,11 @@ class OutputDefinedJobTest < Test::Unit::TestCase
86
91
 
87
92
  context "A defined job that uses a :path where none is explicitly set" do
88
93
  setup do
89
- Whenever.expects(:path).returns('/my/path')
94
+ Whenever.stubs(:path).returns('/my/path')
90
95
 
91
96
  @output = Whenever.cron \
92
97
  <<-file
98
+ set :job_template, nil
93
99
  job_type :some_job, "cd :path && :task"
94
100
  every 2.hours do
95
101
  some_job 'blahblah'
@@ -19,38 +19,5 @@ class OutputEnvTest < Test::Unit::TestCase
19
19
  assert_match "MAILTO=someone@example.com", @output
20
20
  end
21
21
  end
22
-
23
- context "No PATH environment variable set" do
24
- setup do
25
- Whenever::JobList.any_instance.expects(:read_path).at_least_once.returns('/usr/local/bin')
26
- @output = Whenever.cron ""
27
- end
28
-
29
- should "add a PATH variable based on the user's PATH" do
30
- assert_match "PATH=/usr/local/bin", @output
31
- end
32
- end
33
-
34
- context "A PATH environment variable set" do
35
- setup do
36
- Whenever::JobList.stubs(:read_path).returns('/usr/local/bin')
37
- @output = Whenever.cron "env :PATH, '/my/path'"
38
- end
39
-
40
- should "use that path and the user's PATH" do
41
- assert_match "PATH=/my/path", @output
42
- assert_no_match /local/, @output
43
- end
44
- end
45
-
46
- context "No PATH set and instructed not to automatically load the user's path" do
47
- setup do
48
- @output = Whenever.cron "set :set_path_automatically, false"
49
- end
50
-
51
- should "not have a PATH set" do
52
- assert_no_match /PATH/, @output
53
- end
54
- end
55
22
 
56
23
  end
@@ -6,6 +6,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
6
6
  setup do
7
7
  @output = Whenever.cron \
8
8
  <<-file
9
+ set :job_template, nil
9
10
  set :output, nil
10
11
  every 2.hours do
11
12
  command "blahblah"
@@ -23,6 +24,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
23
24
  setup do
24
25
  @output = Whenever.cron \
25
26
  <<-file
27
+ set :job_template, nil
26
28
  set :output, 'logfile.log'
27
29
  every 2.hours do
28
30
  command "blahblah"
@@ -39,6 +41,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
39
41
  setup do
40
42
  @output = Whenever.cron \
41
43
  <<-file
44
+ set :job_template, nil
42
45
  every 2.hours do
43
46
  command "blahblah", :output => {:standard => 'dev_null', :error => 'dev_err'}
44
47
  end
@@ -54,6 +57,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
54
57
  setup do
55
58
  @output = Whenever.cron \
56
59
  <<-file
60
+ set :job_template, nil
57
61
  set :output, 'logfile.log'
58
62
  every 2.hours do
59
63
  command "blahblah", :output => 'otherlog.log'
@@ -71,6 +75,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
71
75
  setup do
72
76
  @output = Whenever.cron \
73
77
  <<-file
78
+ set :job_template, nil
74
79
  set :output, 'logfile.log'
75
80
  every 2.hours do
76
81
  command "blahblah", :output => {:error => 'dev_err', :standard => 'dev_null' }
@@ -88,6 +93,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
88
93
  setup do
89
94
  @output = Whenever.cron \
90
95
  <<-file
96
+ set :job_template, nil
91
97
  set :output, 'logfile.log'
92
98
  every 2.hours do
93
99
  command "blahblah", :output => false
@@ -105,6 +111,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
105
111
  setup do
106
112
  @output = Whenever.cron :set => 'output=otherlog.log', :string => \
107
113
  <<-file
114
+ set :job_template, nil
108
115
  set :output, 'logfile.log'
109
116
  every 2.hours do
110
117
  command "blahblah"
@@ -122,6 +129,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
122
129
  setup do
123
130
  @output = Whenever.cron \
124
131
  <<-file
132
+ set :job_template, nil
125
133
  set :output, {:error => 'dev_err', :standard => 'dev_null' }
126
134
  every 2.hours do
127
135
  command "blahblah"
@@ -138,6 +146,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
138
146
  setup do
139
147
  @output = Whenever.cron \
140
148
  <<-file
149
+ set :job_template, nil
141
150
  set :output, {:error => 'dev_null'}
142
151
  every 2.hours do
143
152
  command "blahblah"
@@ -154,6 +163,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
154
163
  setup do
155
164
  @output = Whenever.cron \
156
165
  <<-file
166
+ set :job_template, nil
157
167
  set :output, {:standard => 'dev_out'}
158
168
  every 2.hours do
159
169
  command "blahblah"
@@ -170,6 +180,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
170
180
  setup do
171
181
  @output = Whenever.cron \
172
182
  <<-file
183
+ set :job_template, nil
173
184
  every 2.hours do
174
185
  command "blahblah", :output => {:error => 'dev_err'}
175
186
  end
@@ -185,6 +196,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
185
196
  setup do
186
197
  @output = Whenever.cron \
187
198
  <<-file
199
+ set :job_template, nil
188
200
  every 2.hours do
189
201
  command "blahblah", :output => {:standard => 'dev_out'}
190
202
  end
@@ -200,6 +212,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
200
212
  setup do
201
213
  @output = Whenever.cron \
202
214
  <<-file
215
+ set :job_template, nil
203
216
  every 2.hours do
204
217
  command "blahblah", :output => {:standard => nil}
205
218
  end
@@ -215,6 +228,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
215
228
  setup do
216
229
  @output = Whenever.cron \
217
230
  <<-file
231
+ set :job_template, nil
218
232
  every 2.hours do
219
233
  command "blahblah", :output => {:error => nil}
220
234
  end
@@ -230,6 +244,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
230
244
  setup do
231
245
  @output = Whenever.cron \
232
246
  <<-file
247
+ set :job_template, nil
233
248
  every 2.hours do
234
249
  command "blahblah", :output => {:error => nil, :standard => nil}
235
250
  end
@@ -245,6 +260,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
245
260
  setup do
246
261
  @output = Whenever.cron \
247
262
  <<-file
263
+ set :job_template, nil
248
264
  every 2.hours do
249
265
  command "blahblah", :output => {:error => nil, :standard => 'my.log'}
250
266
  end
@@ -260,6 +276,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
260
276
  setup do
261
277
  @output = Whenever.cron \
262
278
  <<-file
279
+ set :job_template, nil
263
280
  every 2.hours do
264
281
  command "blahblah", :output => {:error => 'my_error.log', :standard => nil}
265
282
  end
@@ -275,6 +292,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
275
292
  setup do
276
293
  @output = Whenever.cron \
277
294
  <<-file
295
+ set :job_template, nil
278
296
  set :cron_log, "cron.log"
279
297
  every 2.hours do
280
298
  command "blahblah"
@@ -7,14 +7,6 @@ class JobTest < Test::Unit::TestCase
7
7
  assert_equal 'foo', new_job(:at => 'foo').at
8
8
  end
9
9
 
10
- should "return :output when #output_redirection is called" do
11
- assert_equal 'foo', new_job(:output => 'foo').output_redirection
12
- end
13
-
14
- should "return :not_set when #output_redirection is called and no :output is set" do
15
- assert_equal :not_set, new_job.output_redirection
16
- end
17
-
18
10
  should "substitute the :task when #output is called" do
19
11
  job = new_job(:template => ":task", :task => 'abc123')
20
12
  assert_equal 'abc123', job.output
@@ -32,7 +24,6 @@ class JobTest < Test::Unit::TestCase
32
24
 
33
25
 
34
26
  context "A Job with quotes" do
35
-
36
27
  should "output the :task if it's in single quotes" do
37
28
  job = new_job(:template => "':task'", :task => 'abc123')
38
29
  assert_equal %q('abc123'), job.output
@@ -59,6 +50,23 @@ class JobTest < Test::Unit::TestCase
59
50
  assert_equal %q(before "quote -> \" <- quote" after), job.output
60
51
  end
61
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
62
70
 
63
71
  private
64
72
 
@@ -5,12 +5,12 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{whenever}
8
- s.version = "0.5.3"
8
+ s.version = "0.6.1"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Javan Makhmali"]
12
- s.date = %q{2010-09-24}
13
- s.description = %q{Clean ruby syntax for defining and deploying messy cron jobs.}
12
+ s.date = %q{2010-10-20}
13
+ s.description = %q{http://www.allyrics.net/Kid-Cudi/lyrics/Whenever/}
14
14
  s.email = %q{javan@javan.us}
15
15
  s.executables = ["whenever", "wheneverize"]
16
16
  s.extra_rdoc_files = [
@@ -25,6 +25,7 @@ Gem::Specification.new do |s|
25
25
  "bin/wheneverize",
26
26
  "lib/whenever.rb",
27
27
  "lib/whenever/base.rb",
28
+ "lib/whenever/capistrano.rb",
28
29
  "lib/whenever/command_line.rb",
29
30
  "lib/whenever/cron.rb",
30
31
  "lib/whenever/job.rb",
@@ -47,7 +48,7 @@ Gem::Specification.new do |s|
47
48
  s.rdoc_options = ["--charset=UTF-8"]
48
49
  s.require_paths = ["lib"]
49
50
  s.rubygems_version = %q{1.3.7}
50
- s.summary = %q{Clean ruby syntax for defining and deploying messy cron jobs.}
51
+ s.summary = %q{Clean ruby syntax for writing and deploying cron jobs.}
51
52
  s.test_files = [
52
53
  "test/functional/command_line_test.rb",
53
54
  "test/functional/output_at_test.rb",
metadata CHANGED
@@ -1,13 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: whenever
3
3
  version: !ruby/object:Gem::Version
4
- hash: 13
5
4
  prerelease: false
6
5
  segments:
7
6
  - 0
8
- - 5
9
- - 3
10
- version: 0.5.3
7
+ - 6
8
+ - 1
9
+ version: 0.6.1
11
10
  platform: ruby
12
11
  authors:
13
12
  - Javan Makhmali
@@ -15,7 +14,7 @@ autorequire:
15
14
  bindir: bin
16
15
  cert_chain: []
17
16
 
18
- date: 2010-09-24 00:00:00 -04:00
17
+ date: 2010-10-20 00:00:00 -04:00
19
18
  default_executable:
20
19
  dependencies:
21
20
  - !ruby/object:Gem::Dependency
@@ -26,7 +25,6 @@ dependencies:
26
25
  requirements:
27
26
  - - ">="
28
27
  - !ruby/object:Gem::Version
29
- hash: 1
30
28
  segments:
31
29
  - 0
32
30
  - 3
@@ -42,7 +40,6 @@ dependencies:
42
40
  requirements:
43
41
  - - ">="
44
42
  - !ruby/object:Gem::Version
45
- hash: 11
46
43
  segments:
47
44
  - 2
48
45
  - 3
@@ -58,7 +55,6 @@ dependencies:
58
55
  requirements:
59
56
  - - ">="
60
57
  - !ruby/object:Gem::Version
61
- hash: 9
62
58
  segments:
63
59
  - 2
64
60
  - 1
@@ -74,7 +70,6 @@ dependencies:
74
70
  requirements:
75
71
  - - ">="
76
72
  - !ruby/object:Gem::Version
77
- hash: 49
78
73
  segments:
79
74
  - 0
80
75
  - 9
@@ -82,7 +77,7 @@ dependencies:
82
77
  version: 0.9.5
83
78
  type: :development
84
79
  version_requirements: *id004
85
- description: Clean ruby syntax for defining and deploying messy cron jobs.
80
+ description: http://www.allyrics.net/Kid-Cudi/lyrics/Whenever/
86
81
  email: javan@javan.us
87
82
  executables:
88
83
  - whenever
@@ -100,6 +95,7 @@ files:
100
95
  - bin/wheneverize
101
96
  - lib/whenever.rb
102
97
  - lib/whenever/base.rb
98
+ - lib/whenever/capistrano.rb
103
99
  - lib/whenever/command_line.rb
104
100
  - lib/whenever/cron.rb
105
101
  - lib/whenever/job.rb
@@ -131,7 +127,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
131
127
  requirements:
132
128
  - - ">="
133
129
  - !ruby/object:Gem::Version
134
- hash: 3
135
130
  segments:
136
131
  - 0
137
132
  version: "0"
@@ -140,7 +135,6 @@ required_rubygems_version: !ruby/object:Gem::Requirement
140
135
  requirements:
141
136
  - - ">="
142
137
  - !ruby/object:Gem::Version
143
- hash: 3
144
138
  segments:
145
139
  - 0
146
140
  version: "0"
@@ -150,7 +144,7 @@ rubyforge_project:
150
144
  rubygems_version: 1.3.7
151
145
  signing_key:
152
146
  specification_version: 3
153
- summary: Clean ruby syntax for defining and deploying messy cron jobs.
147
+ summary: Clean ruby syntax for writing and deploying cron jobs.
154
148
  test_files:
155
149
  - test/functional/command_line_test.rb
156
150
  - test/functional/output_at_test.rb