whenever 0.4.2 → 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,12 @@
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
+
1
10
  == 0.4.2 / April 26th, 2010
2
11
 
3
12
  * runners now cd into the app's directory and then execute. [Michael Guterl]
data/README.rdoc CHANGED
@@ -39,6 +39,28 @@ This will create an initial "config/schedule.rb" file you.
39
39
 
40
40
  More examples on the wiki: http://wiki.github.com/javan/whenever/instructions-and-examples
41
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
+
42
64
  == Cron output
43
65
 
44
66
  $ cd /my/rails/app
data/bin/whenever CHANGED
@@ -14,6 +14,10 @@ OptionParser.new do |opts|
14
14
  options[:update] = true
15
15
  options[:identifier] = identifier if identifier
16
16
  end
17
+ opts.on('-c', '--clear-crontab [identifier]') do |identifier|
18
+ options[:clear] = true
19
+ options[:identifier] = identifier if identifier
20
+ end
17
21
  opts.on('-f', '--load-file [schedule file]', 'Default: config/schedule.rb') do |file|
18
22
  options[:file] = file if file
19
23
  end
data/lib/whenever.rb CHANGED
@@ -1,14 +1,5 @@
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 active_support, 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
@@ -22,9 +13,7 @@ end
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
@@ -19,14 +19,14 @@ module Whenever
19
19
  exit(1)
20
20
  end
21
21
 
22
- if @options[:update] && @options[:write]
23
- 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.")
24
24
  exit(1)
25
25
  end
26
26
  end
27
27
 
28
28
  def run
29
- if @options[:update]
29
+ if @options[:update] || @options[:clear]
30
30
  write_crontab(updated_crontab)
31
31
  elsif @options[:write]
32
32
  write_crontab(whenever_cron)
@@ -43,7 +43,7 @@ module Whenever
43
43
  end
44
44
 
45
45
  def whenever_cron
46
- @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"
47
47
  end
48
48
 
49
49
  def read_crontab
@@ -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'
@@ -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
@@ -1,3 +1,3 @@
1
1
  module Whenever
2
- VERSION = '0.4.2'
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
@@ -175,4 +175,63 @@ class OutputAtTest < Test::Unit::TestCase
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
@@ -70,24 +70,6 @@ class OutputRunnerTest < Test::Unit::TestCase
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 \
@@ -190,20 +172,4 @@ class OutputRunnerTest < Test::Unit::TestCase
190
172
  end
191
173
  end
192
174
 
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 + ' cd /my/path && script/runner -e production "Product.import(\"http://example.com/product.xml\")"', @output
206
- end
207
- end
208
-
209
175
  end
data/whenever.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{whenever}
8
- s.version = "0.4.2"
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
11
  s.authors = ["Javan Makhmali"]
12
- s.date = %q{2010-04-26}
12
+ s.date = %q{2010-06-28}
13
13
  s.description = %q{Clean ruby syntax for defining and deploying messy cron jobs.}
14
14
  s.email = %q{javan@javan.us}
15
15
  s.executables = ["whenever", "wheneverize"]
@@ -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",
@@ -54,6 +54,7 @@ Gem::Specification.new do |s|
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
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 4
8
- - 2
9
- version: 0.4.2
7
+ - 5
8
+ - 0
9
+ version: 0.5.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Javan Makhmali
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-04-26 00:00:00 -04:00
17
+ date: 2010-06-28 00:00:00 -04:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -50,10 +50,9 @@ files:
50
50
  - lib/whenever.rb
51
51
  - lib/whenever/base.rb
52
52
  - lib/whenever/command_line.rb
53
+ - lib/whenever/job.rb
53
54
  - lib/whenever/job_list.rb
54
55
  - lib/whenever/job_types/default.rb
55
- - lib/whenever/job_types/rake_task.rb
56
- - lib/whenever/job_types/runner.rb
57
56
  - lib/whenever/outputs/cron.rb
58
57
  - lib/whenever/outputs/cron/output_redirection.rb
59
58
  - lib/whenever/version.rb
@@ -61,6 +60,7 @@ files:
61
60
  - test/cron_test.rb
62
61
  - test/output_at_test.rb
63
62
  - test/output_command_test.rb
63
+ - test/output_defined_job_test.rb
64
64
  - test/output_env_test.rb
65
65
  - test/output_rake_test.rb
66
66
  - test/output_redirection_test.rb
@@ -102,6 +102,7 @@ test_files:
102
102
  - test/cron_test.rb
103
103
  - test/output_at_test.rb
104
104
  - test/output_command_test.rb
105
+ - test/output_defined_job_test.rb
105
106
  - test/output_env_test.rb
106
107
  - test/output_rake_test.rb
107
108
  - 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(cd #{File.join(@path)} && script/runner -e #{@environment} #{task.inspect})
8
- end
9
-
10
- end
11
- end
12
- end