insrc-whenever 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.rdoc CHANGED
@@ -1,3 +1,30 @@
1
+ == 0.5.0 / June 28th, 2010
2
+
3
+ * New job_type API for writing custom jobs. Internals use this to define command, runner, and rake. [Javan Makhmali - inspired by idlefingers (Damien)]
4
+
5
+ * Jobs < 1.hour can specify an :at. [gorenje]
6
+
7
+ * --clear option to remove crontab entries for a specific [identifier]. [mraidel (Michael Raidel)]
8
+
9
+
10
+ == 0.4.2 / April 26th, 2010
11
+
12
+ * runners now cd into the app's directory and then execute. [Michael Guterl]
13
+
14
+ * Fix STDERR output redirection to file to append instead of overwrite. [weplay]
15
+
16
+ * Move require of tempfile lib to file that actually uses it. [Finn Smith]
17
+
18
+ * bugfix: comparison Time with 0 failed. #32 [Dan Hixon]
19
+
20
+
21
+ == 0.4.1 / November 30th, 2009
22
+
23
+ * exit(0) instead of just exit to make JRuby happy. [Elan Meng]
24
+
25
+ * Fixed activesupport deprecation warning by requiring active_support. #37 [Andrew Nesbitt]
26
+
27
+
1
28
  == 0.4.0 / October 20th, 2009
2
29
 
3
30
  * New output option replaces the old cron_log option for output redirection and is much more flexible. #31 [Peer Allan]
data/README.rdoc CHANGED
@@ -7,18 +7,8 @@ Ryan Bates created a great Railscast about Whenever: http://railscasts.com/episo
7
7
  Discussion: http://groups.google.com/group/whenever-gem
8
8
 
9
9
  == Installation
10
-
11
- If you haven't already, get set up with http://gemcutter.org
12
-
13
- $ sudo gem install whenever
14
-
15
- In a Rails (2.1 or greater) application:
16
10
 
17
- in your "config/environment.rb" file:
18
-
19
- Rails::Initializer.run do |config|
20
- config.gem 'whenever', :lib => false, :source => 'http://gemcutter.org/'
21
- end
11
+ $ sudo gem install whenever
22
12
 
23
13
  == Getting started
24
14
 
@@ -49,6 +39,28 @@ This will create an initial "config/schedule.rb" file you.
49
39
 
50
40
  More examples on the wiki: http://wiki.github.com/javan/whenever/instructions-and-examples
51
41
 
42
+ == Define your own job types
43
+
44
+ Whenever ships with three pre-defined job types: command, runner, and rake. You can define your own with <code>job_type</code>.
45
+
46
+ For example:
47
+
48
+ job_type :awesome, '/usr/local/bin/awesome :task :fun_level'
49
+
50
+ every 2.hours do
51
+ awesome "party", :fun_level => "extreme"
52
+ end
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>.
55
+
56
+ The default job types that ship with Whenever are defined like so:
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'
61
+
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'.
63
+
52
64
  == Cron output
53
65
 
54
66
  $ cd /my/rails/app
@@ -91,7 +103,7 @@ If you've found a genuine bug or issue, please use the Issues section on github:
91
103
 
92
104
  == License
93
105
 
94
- Copyright (c) 2009 Javan Makhmali
106
+ Copyright (c) 2009+ Javan Makhmali
95
107
 
96
108
  Permission is hereby granted, free of charge, to any person
97
109
  obtaining a copy of this software and associated documentation
data/bin/whenever CHANGED
@@ -2,8 +2,6 @@
2
2
 
3
3
  require 'rubygems'
4
4
  require 'optparse'
5
- require 'fileutils'
6
- require 'tempfile'
7
5
  require 'whenever'
8
6
 
9
7
  options = Hash.new
@@ -16,6 +14,10 @@ OptionParser.new do |opts|
16
14
  options[:update] = true
17
15
  options[:identifier] = identifier if identifier
18
16
  end
17
+ opts.on('-c', '--clear-crontab [identifier]') do |identifier|
18
+ options[:clear] = true
19
+ options[:identifier] = identifier if identifier
20
+ end
19
21
  opts.on('-f', '--load-file [schedule file]', 'Default: config/schedule.rb') do |file|
20
22
  options[:file] = file if file
21
23
  end
@@ -27,4 +29,4 @@ OptionParser.new do |opts|
27
29
  end
28
30
  end.parse!
29
31
 
30
- Whenever::CommandLine.execute(options)
32
+ Whenever::CommandLine.execute(options)
data/lib/whenever.rb CHANGED
@@ -1,30 +1,19 @@
1
1
  require 'chronic'
2
2
 
3
- # Hoping to load Rails' Rakefile
4
- begin
5
- load 'Rakefile'
6
- rescue LoadError
7
- nil
8
- end
9
-
10
- # If Rails' rakefile was loaded than so was activesupport, but
11
- # if this is being used in a non-rails enviroment we need to require it.
12
3
  # It was previously defined as a dependency of this gem, but that became
13
4
  # problematic. See: http://github.com/javan/whenever/issues#issue/1
14
5
  begin
15
- require 'activesupport'
6
+ require 'active_support/all'
16
7
  rescue LoadError
17
- warn 'To user Whenever you need the activesupport gem:'
18
- warn '$ sudo gem install activesupport'
8
+ warn 'To use Whenever you need the active_support gem:'
9
+ warn '$ gem install activesupport'
19
10
  exit(1)
20
11
  end
21
12
 
22
13
  # Whenever files
23
14
  require 'whenever/base'
24
15
  require 'whenever/job_list'
25
- require 'whenever/job_types/default'
26
- require 'whenever/job_types/rake_task'
27
- require 'whenever/job_types/runner'
16
+ require 'whenever/job'
28
17
  require 'whenever/outputs/cron'
29
18
  require 'whenever/outputs/cron/output_redirection'
30
19
  require 'whenever/command_line'
data/lib/whenever/base.rb CHANGED
@@ -5,11 +5,7 @@ module Whenever
5
5
  end
6
6
 
7
7
  def self.path
8
- if defined?(RAILS_ROOT)
9
- RAILS_ROOT
10
- elsif defined?(::RAILS_ROOT)
11
- ::RAILS_ROOT
12
- end
8
+ Dir.pwd
13
9
  end
14
10
 
15
11
  end
@@ -1,3 +1,6 @@
1
+ require 'fileutils'
2
+ require 'tempfile'
3
+
1
4
  module Whenever
2
5
  class CommandLine
3
6
 
@@ -16,14 +19,14 @@ module Whenever
16
19
  exit(1)
17
20
  end
18
21
 
19
- if @options[:update] && @options[:write]
20
- warn("[fail] Can't update AND write. choose one.")
22
+ if [@options[:update], @options[:write], @options[:clear]].compact.length > 1
23
+ warn("[fail] Can only update, write or clear. Choose one.")
21
24
  exit(1)
22
25
  end
23
26
  end
24
27
 
25
28
  def run
26
- if @options[:update]
29
+ if @options[:update] || @options[:clear]
27
30
  write_crontab(updated_crontab)
28
31
  elsif @options[:write]
29
32
  write_crontab(whenever_cron)
@@ -40,7 +43,7 @@ module Whenever
40
43
  end
41
44
 
42
45
  def whenever_cron
43
- @whenever_cron ||= [comment_open, Whenever.cron(@options), comment_close].join("\n") + "\n"
46
+ @whenever_cron ||= [comment_open, (Whenever.cron(@options) unless @options[:clear]), comment_close].compact.join("\n") + "\n"
44
47
  end
45
48
 
46
49
  def read_crontab
@@ -105,4 +108,4 @@ module Whenever
105
108
  end
106
109
 
107
110
  end
108
- end
111
+ end
@@ -0,0 +1,22 @@
1
+ module Whenever
2
+ class Job
3
+
4
+ attr_accessor :at, :output_redirection
5
+
6
+ def initialize(options = {})
7
+ @options = options
8
+
9
+ @at = options[:at]
10
+ @output_redirection = options.has_key?(:output) ? options[:output] : :not_set
11
+ @options[:environment] ||= :production
12
+ @options[:path] ||= Whenever.path
13
+ end
14
+
15
+ def output
16
+ @options[:template].gsub(/:\w+/) do |key|
17
+ @options[key.sub(':', '').to_sym]
18
+ end
19
+ end
20
+
21
+ end
22
+ end
@@ -2,8 +2,7 @@ module Whenever
2
2
  class JobList
3
3
 
4
4
  def initialize(options)
5
- @jobs = Hash.new
6
- @env = Hash.new
5
+ @jobs, @env, @set_variables = {}, {}, {}
7
6
 
8
7
  case options
9
8
  when String
@@ -16,7 +15,12 @@ module Whenever
16
15
  end
17
16
  pre_set(options[:set])
18
17
  end
19
-
18
+
19
+ # Load all job type files.
20
+ Dir["#{File.expand_path(File.dirname(__FILE__))}/job_types/*.rb"].each do |file|
21
+ eval(File.read(file))
22
+ end
23
+
20
24
  eval(config)
21
25
  end
22
26
 
@@ -25,6 +29,7 @@ module Whenever
25
29
 
26
30
  instance_variable_set("@#{variable}".to_sym, value)
27
31
  self.class.send(:attr_reader, variable.to_sym)
32
+ @set_variables[variable] = value
28
33
  end
29
34
 
30
35
  def env(variable, value)
@@ -37,26 +42,21 @@ module Whenever
37
42
  yield
38
43
  end
39
44
 
40
- def command(task, options = {})
41
- # :cron_log was an old option for output redirection, it remains for backwards compatibility
42
- options[:output] = (options[:cron_log] || @cron_log) if defined?(@cron_log) || options.has_key?(:cron_log)
43
- # :output is the newer, more flexible option.
44
- options[:output] = @output if defined?(@output) && !options.has_key?(:output)
45
- options[:class] ||= Whenever::Job::Default
46
- @jobs[@current_time_scope] ||= []
47
- @jobs[@current_time_scope] << options[:class].new(@options.merge(:task => task).merge(options))
48
- end
49
-
50
- def runner(task, options = {})
51
- options.reverse_merge!(:environment => @environment, :path => @path)
52
- options[:class] = Whenever::Job::Runner
53
- command(task, options)
54
- end
55
-
56
- def rake(task, options = {})
57
- options.reverse_merge!(:environment => @environment, :path => @path)
58
- options[:class] = Whenever::Job::RakeTask
59
- command(task, options)
45
+ def job_type(name, template)
46
+ class_eval do
47
+ define_method(name) do |task, *args|
48
+ options = { :task => task, :template => template }
49
+ options.merge!(args[0]) if args[0].is_a? Hash
50
+
51
+ # :cron_log was an old option for output redirection, it remains for backwards compatibility
52
+ options[:output] = (options[:cron_log] || @cron_log) if defined?(@cron_log) || options.has_key?(:cron_log)
53
+ # :output is the newer, more flexible option.
54
+ options[:output] = @output if defined?(@output) && !options.has_key?(:output)
55
+
56
+ @jobs[@current_time_scope] ||= []
57
+ @jobs[@current_time_scope] << Whenever::Job.new(@options.merge(@set_variables).merge(options))
58
+ end
59
+ end
60
60
  end
61
61
 
62
62
  def generate_cron_output
@@ -79,7 +79,7 @@ module Whenever
79
79
  pairs.each do |pair|
80
80
  next unless pair.index('=')
81
81
  variable, value = *pair.split('=')
82
- set(variable.strip, value.strip) unless variable.blank? || value.blank?
82
+ set(variable.strip.to_sym, value.strip) unless variable.blank? || value.blank?
83
83
  end
84
84
  end
85
85
 
@@ -1,27 +1,3 @@
1
- module Whenever
2
- module Job
3
- class Default
4
-
5
- attr_accessor :task, :at, :output, :output_redirection
6
-
7
- def initialize(options = {})
8
- @task = options[:task]
9
- @at = options[:at]
10
- @output_redirection = options.has_key?(:output) ? options[:output] : :not_set
11
- @environment = options[:environment] || :production
12
- @path = options[:path] || Whenever.path
13
- end
14
-
15
- def output
16
- task
17
- end
18
-
19
- protected
20
-
21
- def path_required
22
- raise ArgumentError, "No path available; set :path, '/your/path' in your schedule file" if @path.blank?
23
- end
24
-
25
- end
26
- end
27
- end
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'
@@ -60,7 +60,7 @@ module Whenever
60
60
  end
61
61
 
62
62
  if shortcut
63
- if @at > 0
63
+ if @at.is_a?(Time) || (@at.is_a?(Numeric) && @at>0)
64
64
  raise ArgumentError, "You cannot specify an ':at' when using the shortcuts for times."
65
65
  else
66
66
  return shortcut
@@ -77,7 +77,7 @@ module Whenever
77
77
  raise ArgumentError, "Time must be in minutes or higher"
78
78
  when 1.minute...1.hour
79
79
  minute_frequency = @time / 60
80
- timing[0] = comma_separated_timing(minute_frequency, 59)
80
+ timing[0] = comma_separated_timing(minute_frequency, 59, @at || 0)
81
81
  when 1.hour...1.day
82
82
  hour_frequency = (@time / 60 / 60).round
83
83
  timing[0] = @at.is_a?(Time) ? @at.min : @at
@@ -32,11 +32,17 @@ module Whenever
32
32
  def redirect_from_hash
33
33
  case
34
34
  when stdout == '/dev/null' && stderr == '/dev/null'
35
- ">> /dev/null 2>&1"
35
+ "> /dev/null 2>&1"
36
+ when stdout && stderr == '/dev/null'
37
+ ">> #{stdout} 2> /dev/null"
36
38
  when stdout && stderr
37
- ">> #{stdout} 2> #{stderr}"
39
+ ">> #{stdout} 2>> #{stderr}"
40
+ when stderr == '/dev/null'
41
+ "2> /dev/null"
38
42
  when stderr
39
- "2> #{stderr}"
43
+ "2>> #{stderr}"
44
+ when stdout == '/dev/null'
45
+ "> /dev/null"
40
46
  when stdout
41
47
  ">> #{stdout}"
42
48
  else
@@ -1,3 +1,3 @@
1
1
  module Whenever
2
- VERSION = '0.4.0'
2
+ VERSION = '0.5.0'
3
3
  end unless defined?(Whenever::VERSION)
@@ -74,6 +74,63 @@ EXISTING_CRON
74
74
  #{@task}
75
75
  # End Whenever generated tasks for: My identifier
76
76
 
77
+ # Begin Whenever generated tasks for: Other identifier
78
+ This shouldn't get replaced
79
+ # End Whenever generated tasks for: Other identifier
80
+ NEW_CRON
81
+
82
+ assert_equal new_cron, @command.send(:updated_crontab)
83
+
84
+ @command.expects(:write_crontab).with(new_cron).returns(true)
85
+ assert @command.run
86
+ end
87
+ end
88
+
89
+ context "A command line delete" do
90
+ setup do
91
+ File.expects(:exists?).with('config/schedule.rb').returns(true)
92
+ @command = Whenever::CommandLine.new(:clear => true, :identifier => 'My identifier')
93
+ @task = "#{two_hours} /my/command"
94
+ end
95
+
96
+ should "add an empty identifier block if there is no existing one" do
97
+ existing = '# Existing crontab'
98
+ @command.expects(:read_crontab).at_least_once.returns(existing)
99
+
100
+ new_cron = <<-EXPECTED
101
+ #{existing}
102
+
103
+ # Begin Whenever generated tasks for: My identifier
104
+ # End Whenever generated tasks for: My identifier
105
+ EXPECTED
106
+
107
+ assert_equal new_cron, @command.send(:updated_crontab)
108
+
109
+ @command.expects(:write_crontab).with(new_cron).returns(true)
110
+ assert @command.run
111
+ end
112
+
113
+ should "delete an existing block if the identifier matches" do
114
+ existing = <<-EXISTING_CRON
115
+ # Something
116
+
117
+ # Begin Whenever generated tasks for: My identifier
118
+ My whenever job that was already here
119
+ # End Whenever generated tasks for: My identifier
120
+
121
+ # Begin Whenever generated tasks for: Other identifier
122
+ This shouldn't get replaced
123
+ # End Whenever generated tasks for: Other identifier
124
+ EXISTING_CRON
125
+
126
+ @command.expects(:read_crontab).at_least_once.returns(existing)
127
+
128
+ new_cron = <<-NEW_CRON
129
+ # Something
130
+
131
+ # Begin Whenever generated tasks for: My identifier
132
+ # End Whenever generated tasks for: My identifier
133
+
77
134
  # Begin Whenever generated tasks for: Other identifier
78
135
  This shouldn't get replaced
79
136
  # End Whenever generated tasks for: Other identifier
@@ -97,5 +154,24 @@ NEW_CRON
97
154
  assert_equal "Whenever generated tasks for: DEFAULT", @command.send(:comment_base)
98
155
  end
99
156
  end
100
-
101
- end
157
+
158
+ context "combined params" do
159
+ setup do
160
+ Whenever::CommandLine.any_instance.expects(:exit)
161
+ Whenever::CommandLine.any_instance.expects(:warn)
162
+ File.expects(:exists?).with('config/schedule.rb').returns(true)
163
+ end
164
+
165
+ should "exit with write and clear" do
166
+ @command = Whenever::CommandLine.new(:write => true, :clear => true)
167
+ end
168
+
169
+ should "exit with write and update" do
170
+ @command = Whenever::CommandLine.new(:write => true, :update => true)
171
+ end
172
+
173
+ should "exit with update and clear" do
174
+ @command = Whenever::CommandLine.new(:update => true, :clear => true)
175
+ end
176
+ end
177
+ end
@@ -91,7 +91,7 @@ class OutputAtTest < Test::Unit::TestCase
91
91
  end
92
92
 
93
93
  should "output the runner using one entry because the times are aligned" do
94
- assert_match '2 5,15 * * 1,3,5 /your/path/script/runner -e production "blahblah"', @output
94
+ assert_match '2 5,15 * * 1,3,5 cd /your/path && script/runner -e production "blahblah"', @output
95
95
  end
96
96
  end
97
97
 
@@ -115,7 +115,7 @@ class OutputAtTest < Test::Unit::TestCase
115
115
  setup do
116
116
  @output = Whenever.cron \
117
117
  <<-file
118
- every [1.month, 1.day], :at => 'beginning of the month at 5:02am, june 17th at 2:22pm, june 3rd at 3:33am' do
118
+ every [1.month, 1.day], :at => 'january 5:02am, june 17th at 2:22pm, june 3rd at 3:33am' do
119
119
  command "blahblah"
120
120
  end
121
121
  file
@@ -168,11 +168,70 @@ class OutputAtTest < Test::Unit::TestCase
168
168
 
169
169
  should "output all of the commands @daily" do
170
170
  assert_match '@daily cd /your/path && RAILS_ENV=production /usr/bin/env rake blah:blah', @output
171
- assert_match '@daily /your/path/script/runner -e production "runner_1"', @output
171
+ assert_match '@daily cd /your/path && script/runner -e production "runner_1"', @output
172
172
  assert_match '@daily command_1', @output
173
- assert_match '@daily /your/path/script/runner -e production "runner_2"', @output
173
+ assert_match '@daily cd /your/path && script/runner -e production "runner_2"', @output
174
174
  assert_match '@daily command_2', @output
175
175
  end
176
176
  end
177
177
 
178
+ context "every 5 minutes but but starting at 1" do
179
+ setup do
180
+ @output = Whenever.cron \
181
+ <<-file
182
+ every 5.minutes, :at => 1 do
183
+ command "blahblah"
184
+ end
185
+ file
186
+ end
187
+
188
+ should "output the command using that time" do
189
+ assert_match '1,6,11,16,21,26,31,36,41,46,51,56 * * * * blahblah', @output
190
+ end
191
+ end
192
+
193
+ context "every 4 minutes but starting at 2" do
194
+ setup do
195
+ @output = Whenever.cron \
196
+ <<-file
197
+ every 4.minutes, :at => 2 do
198
+ command "blahblah"
199
+ end
200
+ file
201
+ end
202
+
203
+ should "output the command using that time" do
204
+ assert_match '2,6,10,14,18,22,26,30,34,38,42,46,50,54,58 * * * * blahblah', @output
205
+ end
206
+ end
207
+
208
+ context "every 3 minutes but starting at 7" do
209
+ setup do
210
+ @output = Whenever.cron \
211
+ <<-file
212
+ every 3.minutes, :at => 7 do
213
+ command "blahblah"
214
+ end
215
+ file
216
+ end
217
+
218
+ should "output the command using that time" do
219
+ assert_match '7,10,13,16,19,22,25,28,31,34,37,40,43,46,49,52,55,58 * * * * blahblah', @output
220
+ end
221
+ end
222
+
223
+ context "every 2 minutes but starting at 27" do
224
+ setup do
225
+ @output = Whenever.cron \
226
+ <<-file
227
+ every 2.minutes, :at => 27 do
228
+ command "blahblah"
229
+ end
230
+ file
231
+ end
232
+
233
+ should "output the command using that time" do
234
+ assert_match '27,29,31,33,35,37,39,41,43,45,47,49,51,53,55,57,59 * * * * blahblah', @output
235
+ end
236
+ end
178
237
  end
@@ -0,0 +1,87 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/test_helper")
2
+
3
+ class OutputDefinedJobTest < Test::Unit::TestCase
4
+
5
+ context "A defined job with a :task" do
6
+ setup do
7
+ @output = Whenever.cron \
8
+ <<-file
9
+ job_type :some_job, "before :task after"
10
+ every 2.hours do
11
+ some_job "during"
12
+ end
13
+ file
14
+ end
15
+
16
+ should "output the defined job with the task" do
17
+ assert_match /^.+ .+ .+ .+ before during after$/, @output
18
+ end
19
+ end
20
+
21
+ context "A defined job with a :task and some options" do
22
+ setup do
23
+ @output = Whenever.cron \
24
+ <<-file
25
+ job_type :some_job, "before :task after :option1 :option2"
26
+ every 2.hours do
27
+ some_job "during", :option1 => 'happy', :option2 => 'birthday'
28
+ end
29
+ file
30
+ end
31
+
32
+ should "output the defined job with the task and options" do
33
+ assert_match /^.+ .+ .+ .+ before during after happy birthday$/, @output
34
+ end
35
+ end
36
+
37
+ context "A defined job with a :task and an option where the option is set globally" do
38
+ setup do
39
+ @output = Whenever.cron \
40
+ <<-file
41
+ job_type :some_job, "before :task after :option1"
42
+ set :option1, 'happy'
43
+ every 2.hours do
44
+ some_job "during"
45
+ end
46
+ file
47
+ end
48
+
49
+ should "output the defined job with the task and options" do
50
+ assert_match /^.+ .+ .+ .+ before during after happy$/, @output
51
+ end
52
+ end
53
+
54
+ context "A defined job with a :task and an option where the option is set globally and locally" do
55
+ setup do
56
+ @output = Whenever.cron \
57
+ <<-file
58
+ job_type :some_job, "before :task after :option1"
59
+ set :option1, 'global'
60
+ every 2.hours do
61
+ some_job "during", :option1 => 'local'
62
+ end
63
+ file
64
+ end
65
+
66
+ should "output the defined job using the local option" do
67
+ assert_match /^.+ .+ .+ .+ before during after local$/, @output
68
+ end
69
+ end
70
+
71
+ context "A defined job with a :task and an option that is not set" do
72
+ setup do
73
+ @output = Whenever.cron \
74
+ <<-file
75
+ job_type :some_job, "before :task after :option1"
76
+ every 2.hours do
77
+ some_job "during", :option2 => 'happy'
78
+ end
79
+ file
80
+ end
81
+
82
+ should "output the defined job with that option removed" do
83
+ assert_match /^.+ .+ .+ .+ before during after$/, @output
84
+ end
85
+ end
86
+
87
+ end
@@ -46,7 +46,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
46
46
  end
47
47
 
48
48
  should "output the command without the log syntax appended" do
49
- assert_match /^.+ .+ .+ .+ blahblah >> dev_null 2> dev_err$/, @output
49
+ assert_match /^.+ .+ .+ .+ blahblah >> dev_null 2>> dev_err$/, @output
50
50
  end
51
51
  end
52
52
 
@@ -80,7 +80,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
80
80
 
81
81
  should "output the command with the overridden redirection syntax appended" do
82
82
  assert_no_match /.+ .+ .+ .+ blahblah >> logfile.log 2>&1/, @output
83
- assert_match /^.+ .+ .+ .+ blahblah >> dev_null 2> dev_err$/, @output
83
+ assert_match /^.+ .+ .+ .+ blahblah >> dev_null 2>> dev_err$/, @output
84
84
  end
85
85
  end
86
86
 
@@ -130,7 +130,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
130
130
  end
131
131
 
132
132
  should "output the command without the redirection syntax appended" do
133
- assert_match /^.+ .+ .+ .+ blahblah >> dev_null 2> dev_err$/, @output
133
+ assert_match /^.+ .+ .+ .+ blahblah >> dev_null 2>> dev_err$/, @output
134
134
  end
135
135
  end
136
136
 
@@ -145,8 +145,8 @@ class OutputRedirectionTest < Test::Unit::TestCase
145
145
  file
146
146
  end
147
147
 
148
- should "output the command without the standard errror syntax appended" do
149
- assert_match /^.+ .+ .+ .+ blahblah 2> dev_null$/, @output
148
+ should "output the command without the standard error syntax appended" do
149
+ assert_match /^.+ .+ .+ .+ blahblah 2>> dev_null$/, @output
150
150
  end
151
151
  end
152
152
 
@@ -177,7 +177,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
177
177
  end
178
178
 
179
179
  should "output the command without the log syntax appended" do
180
- assert_match /^.+ .+ .+ .+ blahblah 2> dev_err$/, @output
180
+ assert_match /^.+ .+ .+ .+ blahblah 2>> dev_err$/, @output
181
181
  end
182
182
  end
183
183
 
@@ -207,7 +207,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
207
207
  end
208
208
 
209
209
  should "output the command with stdout directed to /dev/null" do
210
- assert_match /^.+ .+ .+ .+ blahblah >> \/dev\/null$/, @output
210
+ assert_match /^.+ .+ .+ .+ blahblah > \/dev\/null$/, @output
211
211
  end
212
212
  end
213
213
 
@@ -237,7 +237,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
237
237
  end
238
238
 
239
239
  should "output the command with stderr directed to /dev/null" do
240
- assert_match /^.+ .+ .+ .+ blahblah >> \/dev\/null 2>&1$/, @output
240
+ assert_match /^.+ .+ .+ .+ blahblah > \/dev\/null 2>&1$/, @output
241
241
  end
242
242
  end
243
243
 
@@ -267,7 +267,7 @@ class OutputRedirectionTest < Test::Unit::TestCase
267
267
  end
268
268
 
269
269
  should "output the command with stderr directed to /dev/null" do
270
- assert_match /^.+ .+ .+ .+ blahblah >> \/dev\/null 2> my_error.log$/, @output
270
+ assert_match /^.+ .+ .+ .+ blahblah >> \/dev\/null 2>> my_error.log$/, @output
271
271
  end
272
272
  end
273
273
 
@@ -286,4 +286,4 @@ class OutputRedirectionTest < Test::Unit::TestCase
286
286
  assert_match /^.+ .+ .+ .+ blahblah >> cron.log 2>&1$/, @output
287
287
  end
288
288
  end
289
- end
289
+ end
@@ -14,7 +14,7 @@ class OutputRunnerTest < Test::Unit::TestCase
14
14
  end
15
15
 
16
16
  should "output the runner using that path" do
17
- assert_match two_hours + ' /my/path/script/runner -e production "blahblah"', @output
17
+ assert_match two_hours + ' cd /my/path && script/runner -e production "blahblah"', @output
18
18
  end
19
19
  end
20
20
 
@@ -30,7 +30,7 @@ class OutputRunnerTest < Test::Unit::TestCase
30
30
  end
31
31
 
32
32
  should "output the runner using that path" do
33
- assert_match two_hours + ' /some/other/path/script/runner -e production "blahblah"', @output
33
+ assert_match two_hours + ' cd /some/other/path && script/runner -e production "blahblah"', @output
34
34
  end
35
35
  end
36
36
 
@@ -47,7 +47,7 @@ class OutputRunnerTest < Test::Unit::TestCase
47
47
  end
48
48
 
49
49
  should "output the runner using that path" do
50
- assert_match two_hours + ' /my/path/script/runner -e production "blahblah"', @output
50
+ assert_match two_hours + ' cd /my/path && script/runner -e production "blahblah"', @output
51
51
  end
52
52
  end
53
53
 
@@ -65,29 +65,11 @@ class OutputRunnerTest < Test::Unit::TestCase
65
65
  end
66
66
 
67
67
  should "use the path" do
68
- assert_match two_hours + ' /my/path/script/runner -e production "blahblah"', @output
68
+ assert_match two_hours + ' cd /my/path && script/runner -e production "blahblah"', @output
69
69
  assert_no_match /\/rails\/path/, @output
70
70
  end
71
71
  end
72
72
 
73
- context "A runner with no path set and no RAILS_ROOT defined" do
74
- setup do
75
- Whenever.stubs(:path).returns(nil)
76
-
77
- @input = <<-file
78
- every 2.hours do
79
- runner "blahblah"
80
- end
81
- file
82
- end
83
-
84
- should "raise an exception" do
85
- assert_raises ArgumentError do
86
- Whenever.cron(@input)
87
- end
88
- end
89
- end
90
-
91
73
  context "A runner with an environment set" do
92
74
  setup do
93
75
  @output = Whenever.cron \
@@ -101,7 +83,7 @@ class OutputRunnerTest < Test::Unit::TestCase
101
83
  end
102
84
 
103
85
  should "output the runner using that environment" do
104
- assert_match two_hours + ' /my/path/script/runner -e silly "blahblah"', @output
86
+ assert_match two_hours + ' cd /my/path && script/runner -e silly "blahblah"', @output
105
87
  end
106
88
  end
107
89
 
@@ -118,7 +100,7 @@ class OutputRunnerTest < Test::Unit::TestCase
118
100
  end
119
101
 
120
102
  should "output the runner using that environment" do
121
- assert_match two_hours + ' /my/path/script/runner -e serious "blahblah"', @output
103
+ assert_match two_hours + ' cd /my/path && script/runner -e serious "blahblah"', @output
122
104
  end
123
105
  end
124
106
 
@@ -135,7 +117,7 @@ class OutputRunnerTest < Test::Unit::TestCase
135
117
  end
136
118
 
137
119
  should "output the runner using the override environment" do
138
- assert_match two_hours + ' /my/path/script/runner -e serious "blahblah"', @output
120
+ assert_match two_hours + ' cd /my/path && script/runner -e serious "blahblah"', @output
139
121
  end
140
122
  end
141
123
 
@@ -152,7 +134,7 @@ class OutputRunnerTest < Test::Unit::TestCase
152
134
  end
153
135
 
154
136
  should "output the runner using the overridden path and environment" do
155
- assert_match two_hours + ' /serious/path/script/runner -e serious "blahblah"', @output
137
+ assert_match two_hours + ' cd /serious/path && script/runner -e serious "blahblah"', @output
156
138
  end
157
139
  end
158
140
 
@@ -169,7 +151,7 @@ class OutputRunnerTest < Test::Unit::TestCase
169
151
  end
170
152
 
171
153
  should "output the runner using the overridden path and environment" do
172
- assert_match two_hours + ' /serious/path/script/runner -e serious "blahblah"', @output
154
+ assert_match two_hours + ' cd /serious/path && script/runner -e serious "blahblah"', @output
173
155
  end
174
156
  end
175
157
 
@@ -186,23 +168,7 @@ class OutputRunnerTest < Test::Unit::TestCase
186
168
  end
187
169
 
188
170
  should "output the runner using the original environmnet" do
189
- assert_match two_hours + ' /silly/path/script/runner -e silly "blahblah"', @output
190
- end
191
- end
192
-
193
- context "A runner which makes use of double quotes" do
194
- setup do
195
- @output = Whenever.cron \
196
- <<-file
197
- set :path, '/my/path'
198
- every 2.hours do
199
- runner 'Product.import("http://example.com/product.xml")'
200
- end
201
- file
202
- end
203
-
204
- should "output the runner using the original environmnet" do
205
- assert_match two_hours + ' /my/path/script/runner -e production "Product.import(\"http://example.com/product.xml\")"', @output
171
+ assert_match two_hours + ' cd /silly/path && script/runner -e silly "blahblah"', @output
206
172
  end
207
173
  end
208
174
 
data/whenever.gemspec CHANGED
@@ -5,13 +5,13 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{insrc-whenever}
8
- s.version = "0.4.0"
8
+ s.version = "0.5.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["In-Src Studio"]
12
- s.date = %q{2009-10-20}
13
- s.description = %q{Clean ruby syntax for defining and deploying messy cron jobs. In-Src fork fix the bug that cap recipe failed in jruby envionment.}
14
- s.email = %q{javan@javan.us}
11
+ s.authors = ["IN SRC Studio"]
12
+ s.date = %q{2010-06-28}
13
+ s.description = %q{Clean ruby syntax for defining and deploying messy cron jobs.}
14
+ s.email = %q{elanmeng@in-src.com}
15
15
  s.executables = ["whenever", "wheneverize"]
16
16
  s.extra_rdoc_files = [
17
17
  "README.rdoc"
@@ -26,10 +26,9 @@ Gem::Specification.new do |s|
26
26
  "lib/whenever.rb",
27
27
  "lib/whenever/base.rb",
28
28
  "lib/whenever/command_line.rb",
29
+ "lib/whenever/job.rb",
29
30
  "lib/whenever/job_list.rb",
30
31
  "lib/whenever/job_types/default.rb",
31
- "lib/whenever/job_types/rake_task.rb",
32
- "lib/whenever/job_types/runner.rb",
33
32
  "lib/whenever/outputs/cron.rb",
34
33
  "lib/whenever/outputs/cron/output_redirection.rb",
35
34
  "lib/whenever/version.rb",
@@ -37,6 +36,7 @@ Gem::Specification.new do |s|
37
36
  "test/cron_test.rb",
38
37
  "test/output_at_test.rb",
39
38
  "test/output_command_test.rb",
39
+ "test/output_defined_job_test.rb",
40
40
  "test/output_env_test.rb",
41
41
  "test/output_rake_test.rb",
42
42
  "test/output_redirection_test.rb",
@@ -44,16 +44,17 @@ Gem::Specification.new do |s|
44
44
  "test/test_helper.rb",
45
45
  "whenever.gemspec"
46
46
  ]
47
- s.homepage = %q{http://github.com/dreamwords/whenever}
47
+ s.homepage = %q{http://github.com/javan/whenever}
48
48
  s.rdoc_options = ["--charset=UTF-8"]
49
49
  s.require_paths = ["lib"]
50
- s.rubygems_version = %q{1.3.5}
50
+ s.rubygems_version = %q{1.3.6}
51
51
  s.summary = %q{Clean ruby syntax for defining and deploying messy cron jobs.}
52
52
  s.test_files = [
53
53
  "test/command_line_test.rb",
54
54
  "test/cron_test.rb",
55
55
  "test/output_at_test.rb",
56
56
  "test/output_command_test.rb",
57
+ "test/output_defined_job_test.rb",
57
58
  "test/output_env_test.rb",
58
59
  "test/output_rake_test.rb",
59
60
  "test/output_redirection_test.rb",
metadata CHANGED
@@ -1,29 +1,41 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: insrc-whenever
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ hash: 11
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 5
9
+ - 0
10
+ version: 0.5.0
5
11
  platform: ruby
6
12
  authors:
7
- - In-Src Studio
13
+ - IN SRC Studio
8
14
  autorequire:
9
15
  bindir: bin
10
16
  cert_chain: []
11
17
 
12
- date: 2009-10-20 00:00:00 +08:00
18
+ date: 2010-06-28 00:00:00 +08:00
13
19
  default_executable:
14
20
  dependencies:
15
21
  - !ruby/object:Gem::Dependency
16
22
  name: chronic
17
- type: :runtime
18
- version_requirement:
19
- version_requirements: !ruby/object:Gem::Requirement
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
20
26
  requirements:
21
27
  - - ">="
22
28
  - !ruby/object:Gem::Version
29
+ hash: 17
30
+ segments:
31
+ - 0
32
+ - 2
33
+ - 3
23
34
  version: 0.2.3
24
- version:
25
- description: Clean ruby syntax for defining and deploying messy cron jobs. In-Src fork fix the bug that cap recipe failed in jruby envionment.
26
- email: javan@javan.us
35
+ type: :runtime
36
+ version_requirements: *id001
37
+ description: Clean ruby syntax for defining and deploying messy cron jobs.
38
+ email: elanmeng@in-src.com
27
39
  executables:
28
40
  - whenever
29
41
  - wheneverize
@@ -41,10 +53,9 @@ files:
41
53
  - lib/whenever.rb
42
54
  - lib/whenever/base.rb
43
55
  - lib/whenever/command_line.rb
56
+ - lib/whenever/job.rb
44
57
  - lib/whenever/job_list.rb
45
58
  - lib/whenever/job_types/default.rb
46
- - lib/whenever/job_types/rake_task.rb
47
- - lib/whenever/job_types/runner.rb
48
59
  - lib/whenever/outputs/cron.rb
49
60
  - lib/whenever/outputs/cron/output_redirection.rb
50
61
  - lib/whenever/version.rb
@@ -52,6 +63,7 @@ files:
52
63
  - test/cron_test.rb
53
64
  - test/output_at_test.rb
54
65
  - test/output_command_test.rb
66
+ - test/output_defined_job_test.rb
55
67
  - test/output_env_test.rb
56
68
  - test/output_rake_test.rb
57
69
  - test/output_redirection_test.rb
@@ -59,7 +71,7 @@ files:
59
71
  - test/test_helper.rb
60
72
  - whenever.gemspec
61
73
  has_rdoc: true
62
- homepage: http://github.com/dreamwords/whenever
74
+ homepage: http://github.com/javan/whenever
63
75
  licenses: []
64
76
 
65
77
  post_install_message:
@@ -68,21 +80,27 @@ rdoc_options:
68
80
  require_paths:
69
81
  - lib
70
82
  required_ruby_version: !ruby/object:Gem::Requirement
83
+ none: false
71
84
  requirements:
72
85
  - - ">="
73
86
  - !ruby/object:Gem::Version
87
+ hash: 3
88
+ segments:
89
+ - 0
74
90
  version: "0"
75
- version:
76
91
  required_rubygems_version: !ruby/object:Gem::Requirement
92
+ none: false
77
93
  requirements:
78
94
  - - ">="
79
95
  - !ruby/object:Gem::Version
96
+ hash: 3
97
+ segments:
98
+ - 0
80
99
  version: "0"
81
- version:
82
100
  requirements: []
83
101
 
84
102
  rubyforge_project:
85
- rubygems_version: 1.3.5
103
+ rubygems_version: 1.3.7
86
104
  signing_key:
87
105
  specification_version: 3
88
106
  summary: Clean ruby syntax for defining and deploying messy cron jobs.
@@ -91,6 +109,7 @@ test_files:
91
109
  - test/cron_test.rb
92
110
  - test/output_at_test.rb
93
111
  - test/output_command_test.rb
112
+ - test/output_defined_job_test.rb
94
113
  - test/output_env_test.rb
95
114
  - test/output_rake_test.rb
96
115
  - test/output_redirection_test.rb
@@ -1,12 +0,0 @@
1
- module Whenever
2
- module Job
3
- class RakeTask < Whenever::Job::Default
4
-
5
- def output
6
- path_required
7
- "cd #{@path} && RAILS_ENV=#{@environment} /usr/bin/env rake #{task}"
8
- end
9
-
10
- end
11
- end
12
- end
@@ -1,12 +0,0 @@
1
- module Whenever
2
- module Job
3
- class Runner < Whenever::Job::Default
4
-
5
- def output
6
- path_required
7
- %Q(#{File.join(@path, 'script', 'runner')} -e #{@environment} #{task.inspect})
8
- end
9
-
10
- end
11
- end
12
- end