created a new :job_template to wrap all commands with. using 'bash -l -c' by default now to load the entire enviroment which should help with RVM issues.

This commit is contained in:
Javan Makhmali 2010-10-20 17:12:00 -04:00
parent 2effe0b32d
commit e66226e3ae
11 changed files with 159 additions and 82 deletions

View File

@ -1,15 +1,15 @@
== Introduction == Introduction
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. Whenever is a Ruby gem that provides a clear syntax for writing and deploying cron jobs.
Ryan Bates created a great Railscast about Whenever: http://railscasts.com/episodes/164-cron-in-ruby
Discussion: http://groups.google.com/group/whenever-gem
== Installation == Installation
$ sudo gem install whenever $ gem install whenever
Or with Bundler in your Gemfile.
gem 'whenever', :require => false
== Getting started == Getting started
$ cd /my/rails/app $ cd /my/rails/app
@ -41,7 +41,7 @@ More examples on the wiki: http://wiki.github.com/javan/whenever/instructions-an
== Define your own job types == Define your own job types
Whenever ships with three pre-defined job types: command, runner, and rake. You can define your own with <code>job_type</code>. Whenever ships with three pre-defined job types: command, runner, and rake. You can define your own with `job_type`.
For example: For example:
@ -51,15 +51,29 @@ For example:
awesome "party", :fun_level => "extreme" awesome "party", :fun_level => "extreme"
end end
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>. 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`.
The default job types that ship with Whenever are defined like so: The default job types that ship with Whenever are defined like so:
job_type :command, ":task" job_type :command, ":task :output"
job_type :runner, "cd :path && script/runner -e :environment ':task'" job_type :rake, "cd :path && RAILS_ENV=:environment rake :task :output"
job_type :rake, "cd :path && RAILS_ENV=:environment /usr/bin/env rake :task" job_type :runner, "cd :path && script/runner -e :environment ':task' :output"
If a script/rails file is detected (like in a Rails 3 app), runner will be defined to fit:
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'. job_type :runner, "cd :path && script/rails runner -e :environment ':task' :output"
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)
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
You can change this by setting your own job_template.
set :job_template, "bash -l -c ':job'"
Or set the job_template to nil to have your jobs execute normally.
set :job_template, nil
== Cron output == Cron output
@ -81,19 +95,13 @@ In your "config/deploy.rb" file do something like:
end end
end end
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. This will update your crontab file, leaving any existing entries unharmed. When using the `--update-crontab` option, Whenever will only update the entries in your crontab file related to the current schedule.rb file. You can replace the `#{application}` 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.
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. If you wish to simply overwrite your crontab file each time you deploy, use the `--write-crontab` option. This is ideal if you are only working with one app and every crontab entry is contained in a single schedule.rb file.
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! By mixing and matching the `--load-file` and `--user` 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!
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 If you want to override a variable (like your environment) at the time of deployment you can do so with the `--set` option: http://wiki.github.com/javan/whenever/setting-variables-on-the-fly
== Credit
Whenever was created for use at Inkling (http://inklingmarkets.com) where I work. Their take on it: http://blog.inklingmarkets.com/2009/02/whenever-easy-way-to-do-cron-jobs-from.html
While building Whenever, I learned a lot by digging through the source code of Capistrano - http://github.com/jamis/capistrano
== Discussion / Feedback / Issues / Bugs == Discussion / Feedback / Issues / Bugs
@ -101,6 +109,13 @@ For general discussion and questions, please use the google group: http://groups
If you've found a genuine bug or issue, please use the Issues section on github: http://github.com/javan/whenever/issues If you've found a genuine bug or issue, please use the Issues section on github: http://github.com/javan/whenever/issues
Ryan Bates created a great Railscast about Whenever: http://railscasts.com/episodes/164-cron-in-ruby
It's a little bit dated now, but remains a good introduction.
== Credit
Whenever was created for use at Inkling (http://inklingmarkets.com) where I work. Their take on it: http://blog.inklingmarkets.com/2009/02/whenever-easy-way-to-do-cron-jobs-from.html
== License == License
Copyright (c) 2009+ Javan Makhmali Copyright (c) 2009+ Javan Makhmali

View File

@ -5,17 +5,25 @@ module Whenever
def initialize(options = {}) def initialize(options = {})
@options = options @options = options
@at = options.delete(:at)
@at = options[:at] @template = options.delete(:template)
@job_template = options.delete(:job_template) || ":job"
@options[:output] = Whenever::Output::Redirection.new(options[:output]).to_s if options.has_key?(:output) @options[:output] = Whenever::Output::Redirection.new(options[:output]).to_s if options.has_key?(:output)
@options[:environment] ||= :production @options[:environment] ||= :production
@options[:path] ||= Whenever.path @options[:path] ||= Whenever.path
end end
def output def output
@options[:template].dup.gsub(/:\w+/) do |key| job = process_template(@template, @options).strip
process_template(@job_template, { :job => job }).strip
end
protected
def process_template(template, options)
template.gsub(/:\w+/) do |key|
before_and_after = [$`[-1..-1], $'[0..0]] before_and_after = [$`[-1..-1], $'[0..0]]
option = @options[key.sub(':', '').to_sym] option = options[key.sub(':', '').to_sym]
if before_and_after.all? { |c| c == "'" } if before_and_after.all? { |c| c == "'" }
escape_single_quotes(option) escape_single_quotes(option)
@ -26,8 +34,6 @@ module Whenever
end end
end end
end end
protected
def escape_single_quotes(str) def escape_single_quotes(str)
str.gsub(/'/) { "'\\''" } str.gsub(/'/) { "'\\''" }

View File

@ -2,7 +2,7 @@ module Whenever
class JobList class JobList
def initialize(options) def initialize(options)
@jobs, @env, @set_variables = {}, {}, {} @jobs, @env, @set_variables, @pre_set_variables = {}, {}, {}, {}
case options case options
when String when String
@ -25,7 +25,8 @@ module Whenever
end end
def set(variable, value) def set(variable, value)
return if instance_variable_defined?("@#{variable}".to_sym) variable = variable.to_sym
return if @pre_set_variables[variable]
instance_variable_set("@#{variable}".to_sym, value) instance_variable_set("@#{variable}".to_sym, value)
self.class.send(:attr_reader, variable.to_sym) self.class.send(:attr_reader, variable.to_sym)
@ -59,9 +60,7 @@ module Whenever
end end
end end
def generate_cron_output def generate_cron_output
set_path_environment_variable
[environment_variables, cron_jobs].compact.join [environment_variables, cron_jobs].compact.join
end end
@ -79,22 +78,13 @@ module Whenever
pairs.each do |pair| pairs.each do |pair|
next unless pair.index('=') next unless pair.index('=')
variable, value = *pair.split('=') variable, value = *pair.split('=')
set(variable.strip.to_sym, value.strip) unless variable.blank? || value.blank? unless variable.blank? || value.blank?
variable = variable.strip.to_sym
set(variable, value.strip)
@pre_set_variables[variable] = value
end
end end
end end
def set_path_environment_variable
return if path_should_not_be_set_automatically?
@env[:PATH] = read_path unless read_path.blank?
end
def read_path
ENV['PATH'] if ENV
end
def path_should_not_be_set_automatically?
@set_path_automatically === false || @env[:PATH] || @env["PATH"]
end
def environment_variables def environment_variables
return if @env.empty? return if @env.empty?

View File

@ -1,3 +1,6 @@
# http://blog.scoutapp.com/articles/2010/09/07/rvm-and-cron-in-production
set :job_template, "/bin/bash -l -c ':job'"
job_type :command, ":task :output" job_type :command, ":task :output"
job_type :rake, "cd :path && RAILS_ENV=:environment rake :task --silent :output" job_type :rake, "cd :path && RAILS_ENV=:environment rake :task --silent :output"

View File

@ -217,6 +217,7 @@ NEW_CRON
setup do setup do
@output = Whenever.cron :set => 'environment=serious', :string => \ @output = Whenever.cron :set => 'environment=serious', :string => \
<<-file <<-file
set :job_template, nil
set :environment, :silly set :environment, :silly
set :path, '/my/path' set :path, '/my/path'
every 2.hours do every 2.hours do
@ -234,6 +235,7 @@ NEW_CRON
setup do setup do
@output = Whenever.cron :set => 'environment=serious&path=/serious/path', :string => \ @output = Whenever.cron :set => 'environment=serious&path=/serious/path', :string => \
<<-file <<-file
set :job_template, nil
set :environment, :silly set :environment, :silly
set :path, '/silly/path' set :path, '/silly/path'
every 2.hours do every 2.hours do
@ -251,6 +253,7 @@ NEW_CRON
setup do setup do
@output = Whenever.cron :set => ' environment = serious& path =/serious/path', :string => \ @output = Whenever.cron :set => ' environment = serious& path =/serious/path', :string => \
<<-file <<-file
set :job_template, nil
set :environment, :silly set :environment, :silly
set :path, '/silly/path' set :path, '/silly/path'
every 2.hours do every 2.hours do
@ -268,6 +271,7 @@ NEW_CRON
setup do setup do
@output = Whenever.cron :set => ' environment=', :string => \ @output = Whenever.cron :set => ' environment=', :string => \
<<-file <<-file
set :job_template, nil
set :environment, :silly set :environment, :silly
set :path, '/silly/path' set :path, '/silly/path'
every 2.hours do every 2.hours do

View File

@ -6,6 +6,7 @@ class OutputAtTest < Test::Unit::TestCase
setup do setup do
@output = Whenever.cron \ @output = Whenever.cron \
<<-file <<-file
set :job_template, nil
every "weekday", :at => '5:02am' do every "weekday", :at => '5:02am' do
command "blahblah" command "blahblah"
end end
@ -21,6 +22,7 @@ class OutputAtTest < Test::Unit::TestCase
setup do setup do
@output = Whenever.cron \ @output = Whenever.cron \
<<-file <<-file
set :job_template, nil
every "weekday", :at => %w(5:02am 3:52pm) do every "weekday", :at => %w(5:02am 3:52pm) do
command "blahblah" command "blahblah"
end end
@ -37,6 +39,7 @@ class OutputAtTest < Test::Unit::TestCase
setup do setup do
@output = Whenever.cron \ @output = Whenever.cron \
<<-file <<-file
set :job_template, nil
every "weekday", :at => '5:02am, 3:52pm' do every "weekday", :at => '5:02am, 3:52pm' do
command "blahblah" command "blahblah"
end end
@ -53,6 +56,7 @@ class OutputAtTest < Test::Unit::TestCase
setup do setup do
@output = Whenever.cron \ @output = Whenever.cron \
<<-file <<-file
set :job_template, nil
every "weekday", :at => '5:02am, 3:02pm' do every "weekday", :at => '5:02am, 3:02pm' do
command "blahblah" command "blahblah"
end end
@ -68,6 +72,7 @@ class OutputAtTest < Test::Unit::TestCase
setup do setup do
@output = Whenever.cron \ @output = Whenever.cron \
<<-file <<-file
set :job_template, nil
every "mon,wed,fri", :at => '5:02am, 3:02pm' do every "mon,wed,fri", :at => '5:02am, 3:02pm' do
command "blahblah" command "blahblah"
end end
@ -83,6 +88,7 @@ class OutputAtTest < Test::Unit::TestCase
setup do setup do
@output = Whenever.cron \ @output = Whenever.cron \
<<-file <<-file
set :job_template, nil
set :path, '/your/path' set :path, '/your/path'
every "mon,wed,fri", :at => '5:02am, 3:02pm' do every "mon,wed,fri", :at => '5:02am, 3:02pm' do
runner "blahblah" runner "blahblah"
@ -99,6 +105,7 @@ class OutputAtTest < Test::Unit::TestCase
setup do setup do
@output = Whenever.cron \ @output = Whenever.cron \
<<-file <<-file
set :job_template, nil
set :path, '/your/path' set :path, '/your/path'
every "mon,wed,fri", :at => '5:02am, 3:02pm' do every "mon,wed,fri", :at => '5:02am, 3:02pm' do
rake "blah:blah" rake "blah:blah"
@ -115,6 +122,7 @@ class OutputAtTest < Test::Unit::TestCase
setup do setup do
@output = Whenever.cron \ @output = Whenever.cron \
<<-file <<-file
set :job_template, nil
every [1.month, 1.day], :at => 'january 5:02am, june 17th at 2:22pm, june 3rd at 3:33am' do every [1.month, 1.day], :at => 'january 5:02am, june 17th at 2:22pm, june 3rd at 3:33am' do
command "blahblah" command "blahblah"
end end
@ -138,6 +146,7 @@ class OutputAtTest < Test::Unit::TestCase
setup do setup do
@output = Whenever.cron \ @output = Whenever.cron \
<<-file <<-file
set :job_template, nil
every :reboot do every :reboot do
command "command_1" command "command_1"
command "command_2" command "command_2"
@ -155,6 +164,7 @@ class OutputAtTest < Test::Unit::TestCase
setup do setup do
@output = Whenever.cron \ @output = Whenever.cron \
<<-file <<-file
set :job_template, nil
set :path, '/your/path' set :path, '/your/path'
every :day do every :day do
rake "blah:blah" rake "blah:blah"
@ -179,6 +189,7 @@ class OutputAtTest < Test::Unit::TestCase
setup do setup do
@output = Whenever.cron \ @output = Whenever.cron \
<<-file <<-file
set :job_template, nil
every 5.minutes, :at => 1 do every 5.minutes, :at => 1 do
command "blahblah" command "blahblah"
end end
@ -194,6 +205,7 @@ class OutputAtTest < Test::Unit::TestCase
setup do setup do
@output = Whenever.cron \ @output = Whenever.cron \
<<-file <<-file
set :job_template, nil
every 4.minutes, :at => 2 do every 4.minutes, :at => 2 do
command "blahblah" command "blahblah"
end end
@ -209,6 +221,7 @@ class OutputAtTest < Test::Unit::TestCase
setup do setup do
@output = Whenever.cron \ @output = Whenever.cron \
<<-file <<-file
set :job_template, nil
every 3.minutes, :at => 7 do every 3.minutes, :at => 7 do
command "blahblah" command "blahblah"
end end
@ -224,6 +237,7 @@ class OutputAtTest < Test::Unit::TestCase
setup do setup do
@output = Whenever.cron \ @output = Whenever.cron \
<<-file <<-file
set :job_template, nil
every 2.minutes, :at => 27 do every 2.minutes, :at => 27 do
command "blahblah" command "blahblah"
end end

View File

@ -4,10 +4,11 @@ class OutputDefaultDefinedJobsTest < Test::Unit::TestCase
# command # command
context "A plain command" do context "A plain command with the job template set to nil" do
setup do setup do
@output = Whenever.cron \ @output = Whenever.cron \
<<-file <<-file
set :job_template, nil
every 2.hours do every 2.hours do
command "blahblah" command "blahblah"
end end
@ -19,12 +20,45 @@ class OutputDefaultDefinedJobsTest < Test::Unit::TestCase
end end
end end
context "A plain command with no job template set" do
setup do
@output = Whenever.cron \
<<-file
every 2.hours do
command "blahblah"
end
file
end
should "output the command with the default job template" do
assert_match /^.+ .+ .+ .+ \/bin\/bash -l -c 'blahblah'$/, @output
end
end
context "A plain command that overrides the job_template set" do
setup do
@output = Whenever.cron \
<<-file
set :job_template, "/bin/bash -l -c ':job'"
every 2.hours do
command "blahblah", :job_template => "/bin/sh -l -c ':job'"
end
file
end
should "output the command using that job_template" do
assert_match /^.+ .+ .+ .+ \/bin\/sh -l -c 'blahblah'$/, @output
assert_no_match /bash/, @output
end
end
# runner # runner
context "A runner with path set" do context "A runner with path set" do
setup do setup do
@output = Whenever.cron \ @output = Whenever.cron \
<<-file <<-file
set :job_template, nil
set :path, '/my/path' set :path, '/my/path'
every 2.hours do every 2.hours do
runner 'blahblah' runner 'blahblah'
@ -41,6 +75,7 @@ class OutputDefaultDefinedJobsTest < Test::Unit::TestCase
setup do setup do
@output = Whenever.cron \ @output = Whenever.cron \
<<-file <<-file
set :job_template, nil
set :path, '/my/path' set :path, '/my/path'
every 2.hours do every 2.hours do
runner "blahblah", :path => '/some/other/path' runner "blahblah", :path => '/some/other/path'
@ -59,6 +94,7 @@ class OutputDefaultDefinedJobsTest < Test::Unit::TestCase
File.expects(:exists?).with('/my/path/script/rails').returns(true) File.expects(:exists?).with('/my/path/script/rails').returns(true)
@output = Whenever.cron \ @output = Whenever.cron \
<<-file <<-file
set :job_template, nil
every 2.hours do every 2.hours do
runner 'blahblah' runner 'blahblah'
end end
@ -76,6 +112,7 @@ class OutputDefaultDefinedJobsTest < Test::Unit::TestCase
setup do setup do
@output = Whenever.cron \ @output = Whenever.cron \
<<-file <<-file
set :job_template, nil
set :path, '/my/path' set :path, '/my/path'
every 2.hours do every 2.hours do
rake "blahblah" rake "blahblah"
@ -92,6 +129,7 @@ class OutputDefaultDefinedJobsTest < Test::Unit::TestCase
setup do setup do
@output = Whenever.cron \ @output = Whenever.cron \
<<-file <<-file
set :job_template, nil
set :path, '/my/path' set :path, '/my/path'
every 2.hours do every 2.hours do
rake "blahblah", :path => '/some/other/path' rake "blahblah", :path => '/some/other/path'

View File

@ -6,6 +6,7 @@ class OutputDefinedJobTest < Test::Unit::TestCase
setup do setup do
@output = Whenever.cron \ @output = Whenever.cron \
<<-file <<-file
set :job_template, nil
job_type :some_job, "before :task after" job_type :some_job, "before :task after"
every 2.hours do every 2.hours do
some_job "during" some_job "during"
@ -22,6 +23,7 @@ class OutputDefinedJobTest < Test::Unit::TestCase
setup do setup do
@output = Whenever.cron \ @output = Whenever.cron \
<<-file <<-file
set :job_template, nil
job_type :some_job, "before :task after :option1 :option2" job_type :some_job, "before :task after :option1 :option2"
every 2.hours do every 2.hours do
some_job "during", :option1 => 'happy', :option2 => 'birthday' some_job "during", :option1 => 'happy', :option2 => 'birthday'
@ -38,6 +40,7 @@ class OutputDefinedJobTest < Test::Unit::TestCase
setup do setup do
@output = Whenever.cron \ @output = Whenever.cron \
<<-file <<-file
set :job_template, nil
job_type :some_job, "before :task after :option1" job_type :some_job, "before :task after :option1"
set :option1, 'happy' set :option1, 'happy'
every 2.hours do every 2.hours do
@ -55,6 +58,7 @@ class OutputDefinedJobTest < Test::Unit::TestCase
setup do setup do
@output = Whenever.cron \ @output = Whenever.cron \
<<-file <<-file
set :job_template, nil
job_type :some_job, "before :task after :option1" job_type :some_job, "before :task after :option1"
set :option1, 'global' set :option1, 'global'
every 2.hours do every 2.hours do
@ -72,6 +76,7 @@ class OutputDefinedJobTest < Test::Unit::TestCase
setup do setup do
@output = Whenever.cron \ @output = Whenever.cron \
<<-file <<-file
set :job_template, nil
job_type :some_job, "before :task after :option1" job_type :some_job, "before :task after :option1"
every 2.hours do every 2.hours do
some_job "during", :option2 => 'happy' some_job "during", :option2 => 'happy'
@ -90,6 +95,7 @@ class OutputDefinedJobTest < Test::Unit::TestCase
@output = Whenever.cron \ @output = Whenever.cron \
<<-file <<-file
set :job_template, nil
job_type :some_job, "cd :path && :task" job_type :some_job, "cd :path && :task"
every 2.hours do every 2.hours do
some_job 'blahblah' some_job 'blahblah'

View File

@ -19,38 +19,5 @@ class OutputEnvTest < Test::Unit::TestCase
assert_match "MAILTO=someone@example.com", @output assert_match "MAILTO=someone@example.com", @output
end end
end end
context "No PATH environment variable set" do
setup do
Whenever::JobList.any_instance.expects(:read_path).at_least_once.returns('/usr/local/bin')
@output = Whenever.cron ""
end
should "add a PATH variable based on the user's PATH" do
assert_match "PATH=/usr/local/bin", @output
end
end
context "A PATH environment variable set" do
setup do
Whenever::JobList.stubs(:read_path).returns('/usr/local/bin')
@output = Whenever.cron "env :PATH, '/my/path'"
end
should "use that path and the user's PATH" do
assert_match "PATH=/my/path", @output
assert_no_match /local/, @output
end
end
context "No PATH set and instructed not to automatically load the user's path" do
setup do
@output = Whenever.cron "set :set_path_automatically, false"
end
should "not have a PATH set" do
assert_no_match /PATH/, @output
end
end
end end

View File

@ -6,6 +6,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
setup do setup do
@output = Whenever.cron \ @output = Whenever.cron \
<<-file <<-file
set :job_template, nil
set :output, nil set :output, nil
every 2.hours do every 2.hours do
command "blahblah" command "blahblah"
@ -23,6 +24,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
setup do setup do
@output = Whenever.cron \ @output = Whenever.cron \
<<-file <<-file
set :job_template, nil
set :output, 'logfile.log' set :output, 'logfile.log'
every 2.hours do every 2.hours do
command "blahblah" command "blahblah"
@ -39,6 +41,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
setup do setup do
@output = Whenever.cron \ @output = Whenever.cron \
<<-file <<-file
set :job_template, nil
every 2.hours do every 2.hours do
command "blahblah", :output => {:standard => 'dev_null', :error => 'dev_err'} command "blahblah", :output => {:standard => 'dev_null', :error => 'dev_err'}
end end
@ -54,6 +57,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
setup do setup do
@output = Whenever.cron \ @output = Whenever.cron \
<<-file <<-file
set :job_template, nil
set :output, 'logfile.log' set :output, 'logfile.log'
every 2.hours do every 2.hours do
command "blahblah", :output => 'otherlog.log' command "blahblah", :output => 'otherlog.log'
@ -71,6 +75,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
setup do setup do
@output = Whenever.cron \ @output = Whenever.cron \
<<-file <<-file
set :job_template, nil
set :output, 'logfile.log' set :output, 'logfile.log'
every 2.hours do every 2.hours do
command "blahblah", :output => {:error => 'dev_err', :standard => 'dev_null' } command "blahblah", :output => {:error => 'dev_err', :standard => 'dev_null' }
@ -88,6 +93,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
setup do setup do
@output = Whenever.cron \ @output = Whenever.cron \
<<-file <<-file
set :job_template, nil
set :output, 'logfile.log' set :output, 'logfile.log'
every 2.hours do every 2.hours do
command "blahblah", :output => false command "blahblah", :output => false
@ -105,6 +111,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
setup do setup do
@output = Whenever.cron :set => 'output=otherlog.log', :string => \ @output = Whenever.cron :set => 'output=otherlog.log', :string => \
<<-file <<-file
set :job_template, nil
set :output, 'logfile.log' set :output, 'logfile.log'
every 2.hours do every 2.hours do
command "blahblah" command "blahblah"
@ -122,6 +129,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
setup do setup do
@output = Whenever.cron \ @output = Whenever.cron \
<<-file <<-file
set :job_template, nil
set :output, {:error => 'dev_err', :standard => 'dev_null' } set :output, {:error => 'dev_err', :standard => 'dev_null' }
every 2.hours do every 2.hours do
command "blahblah" command "blahblah"
@ -138,6 +146,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
setup do setup do
@output = Whenever.cron \ @output = Whenever.cron \
<<-file <<-file
set :job_template, nil
set :output, {:error => 'dev_null'} set :output, {:error => 'dev_null'}
every 2.hours do every 2.hours do
command "blahblah" command "blahblah"
@ -154,6 +163,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
setup do setup do
@output = Whenever.cron \ @output = Whenever.cron \
<<-file <<-file
set :job_template, nil
set :output, {:standard => 'dev_out'} set :output, {:standard => 'dev_out'}
every 2.hours do every 2.hours do
command "blahblah" command "blahblah"
@ -170,6 +180,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
setup do setup do
@output = Whenever.cron \ @output = Whenever.cron \
<<-file <<-file
set :job_template, nil
every 2.hours do every 2.hours do
command "blahblah", :output => {:error => 'dev_err'} command "blahblah", :output => {:error => 'dev_err'}
end end
@ -185,6 +196,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
setup do setup do
@output = Whenever.cron \ @output = Whenever.cron \
<<-file <<-file
set :job_template, nil
every 2.hours do every 2.hours do
command "blahblah", :output => {:standard => 'dev_out'} command "blahblah", :output => {:standard => 'dev_out'}
end end
@ -200,6 +212,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
setup do setup do
@output = Whenever.cron \ @output = Whenever.cron \
<<-file <<-file
set :job_template, nil
every 2.hours do every 2.hours do
command "blahblah", :output => {:standard => nil} command "blahblah", :output => {:standard => nil}
end end
@ -215,6 +228,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
setup do setup do
@output = Whenever.cron \ @output = Whenever.cron \
<<-file <<-file
set :job_template, nil
every 2.hours do every 2.hours do
command "blahblah", :output => {:error => nil} command "blahblah", :output => {:error => nil}
end end
@ -230,6 +244,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
setup do setup do
@output = Whenever.cron \ @output = Whenever.cron \
<<-file <<-file
set :job_template, nil
every 2.hours do every 2.hours do
command "blahblah", :output => {:error => nil, :standard => nil} command "blahblah", :output => {:error => nil, :standard => nil}
end end
@ -245,6 +260,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
setup do setup do
@output = Whenever.cron \ @output = Whenever.cron \
<<-file <<-file
set :job_template, nil
every 2.hours do every 2.hours do
command "blahblah", :output => {:error => nil, :standard => 'my.log'} command "blahblah", :output => {:error => nil, :standard => 'my.log'}
end end
@ -260,6 +276,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
setup do setup do
@output = Whenever.cron \ @output = Whenever.cron \
<<-file <<-file
set :job_template, nil
every 2.hours do every 2.hours do
command "blahblah", :output => {:error => 'my_error.log', :standard => nil} command "blahblah", :output => {:error => 'my_error.log', :standard => nil}
end end
@ -275,6 +292,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
setup do setup do
@output = Whenever.cron \ @output = Whenever.cron \
<<-file <<-file
set :job_template, nil
set :cron_log, "cron.log" set :cron_log, "cron.log"
every 2.hours do every 2.hours do
command "blahblah" command "blahblah"

View File

@ -24,7 +24,6 @@ class JobTest < Test::Unit::TestCase
context "A Job with quotes" do context "A Job with quotes" do
should "output the :task if it's in single quotes" do should "output the :task if it's in single quotes" do
job = new_job(:template => "':task'", :task => 'abc123') job = new_job(:template => "':task'", :task => 'abc123')
assert_equal %q('abc123'), job.output assert_equal %q('abc123'), job.output
@ -51,6 +50,23 @@ class JobTest < Test::Unit::TestCase
assert_equal %q(before "quote -> \" <- quote" after), job.output assert_equal %q(before "quote -> \" <- quote" after), job.output
end end
end end
context "A Job with a job_template" do
should "use the job template" do
job = new_job(:template => ':task', :task => 'abc123', :job_template => 'left :job right')
assert_equal 'left abc123 right', job.output
end
should "escape single quotes" do
job = new_job(:template => "before ':task' after", :task => "quote -> ' <- quote", :job_template => "left ':job' right")
assert_equal %q(left 'before '\''quote -> '\\''\\'\\'''\\'' <- quote'\'' after' right), job.output
end
should "escape double quotes" do
job = new_job(:template => 'before ":task" after', :task => 'quote -> " <- quote', :job_template => 'left ":job" right')
assert_equal %q(left "before \"quote -> \\\" <- quote\" after" right), job.output
end
end
private private