delayed_job_extras 0.4.3 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,36 @@
1
+ if defined?(ActionMailer)
2
+ module ActionMailer
3
+ class Base
4
+
5
+ def self.inherited(klass)
6
+ super
7
+ eval %{
8
+ class ::#{klass}Worker < DJ::Worker
9
+
10
+ attr_accessor :called_method
11
+ attr_accessor :args
12
+
13
+ def initialize(called_method, *args)
14
+ self.called_method = called_method
15
+ self.args = args
16
+ end
17
+
18
+ def perform
19
+ ::#{klass}.send(self.called_method, *self.args)
20
+ end
21
+
22
+ class << self
23
+
24
+ def method_missing(sym, *args)
25
+ ::#{klass}Worker.enqueue(sym, *args)
26
+ end
27
+
28
+ end
29
+
30
+ end
31
+ }
32
+ end
33
+
34
+ end # Base
35
+ end # ActionMailer
36
+ end
@@ -0,0 +1,107 @@
1
+ module Delayed
2
+ class Job
3
+ module Extras
4
+
5
+ PRIORITY_LEVELS = {:immediate => 10000, :high => 1000, :medium => 500, :normal => 0, :low => -100, :who_cares => -1000}
6
+
7
+ def self.included(klass)
8
+ klass.send(:include, Delayed::Job::Extras::InstanceMethods)
9
+ klass.extend(Delayed::Job::Extras::ClassMethods)
10
+ klass.class_eval do
11
+ class << self
12
+ def new_with_extras(*args)
13
+ klass = new_without_extras(*args)
14
+ klass.__original_args = *args
15
+ return klass
16
+ end
17
+
18
+ alias_method_chain :new, :extras
19
+ end
20
+ end
21
+ end
22
+
23
+ module InstanceMethods
24
+
25
+ attr_accessor :dj_object
26
+ attr_accessor :run_at
27
+ attr_accessor :priority
28
+ attr_accessor :logger
29
+ attr_accessor :worker_class_name
30
+ attr_accessor :__original_args
31
+ attr_accessor :__re_enqueue_block
32
+ attr_accessor :re_enqueuable
33
+
34
+ def priority
35
+ case @priority
36
+ when Symbol
37
+ Delayed::Job::Extras::PRIORITY_LEVELS[@priority] ||= 0
38
+ when Fixnum
39
+ @priority
40
+ else
41
+ 0
42
+ end
43
+ end
44
+
45
+ def run_at
46
+ return @run_at ||= Time.now
47
+ end
48
+
49
+ def logger
50
+ @logger ||= self.class.logger
51
+ end
52
+
53
+ def worker_class_name
54
+ @worker_class_name ||= self.class.to_s.underscore
55
+ end
56
+
57
+ def enqueue(priority = self.priority, run_at = self.run_at)
58
+ Delayed::Job.enqueue(self, priority, run_at)
59
+ end
60
+
61
+ alias_method :save, :enqueue
62
+
63
+ def unique?
64
+ false
65
+ end
66
+
67
+ end # InstanceMethods
68
+
69
+ module ClassMethods
70
+
71
+ @@logger = SplitLogger.new
72
+
73
+ def logger
74
+ @@logger
75
+ end
76
+
77
+ def logger=(logger)
78
+ @@logger = logger
79
+ end
80
+
81
+ def priority(level = 0)
82
+ define_method('priority') do
83
+ if level.is_a?(Symbol)
84
+ level = Delayed::Job::Extras::PRIORITY_LEVELS[level] ||= 0
85
+ end
86
+ return @priority ||= level
87
+ end
88
+ end
89
+
90
+ def enqueue(*args)
91
+ self.new(*args).enqueue
92
+ end
93
+
94
+ def re_enqueue(&block)
95
+ define_method('re_enqueuable') do
96
+ true
97
+ end
98
+ define_method('__re_enqueue_block') do
99
+ block
100
+ end
101
+ end
102
+
103
+ end # ClassMethods
104
+
105
+ end # Extras
106
+ end # Job
107
+ end # Delayed
@@ -0,0 +1,28 @@
1
+ begin
2
+ # If the hoptoad_notifier gem is available
3
+ # let's use it so we can get some good notifications
4
+ # when an exception is raised.
5
+ require 'hoptoad_notifier'
6
+
7
+ DJ::Worker.logger.info "Adding Hoptoad support to Delayed::Job"
8
+
9
+ module Delayed
10
+ class Job
11
+ include HoptoadNotifier::Catcher
12
+
13
+ def invoke_job_with_hoptoad
14
+ begin
15
+ invoke_job_without_hoptoad
16
+ rescue Exception => e
17
+ notify_hoptoad(exception_to_data(e).merge(:dj => self.inspect))
18
+ raise e
19
+ end
20
+ end
21
+
22
+ alias_method_chain :invoke_job, :hoptoad
23
+
24
+ end # Job
25
+ end # Delayed
26
+
27
+ rescue Exception => e
28
+ end
@@ -0,0 +1,19 @@
1
+ begin
2
+ # If the is_paranoid gem is available
3
+ # let's use it so we can have a record of the
4
+ # tasks that have been performed.
5
+ require 'is_paranoid'
6
+
7
+ DJ::Worker.logger.info "Adding is_paranoid support to Delayed::Job"
8
+
9
+ module Delayed
10
+ class Job
11
+ include HoptoadNotifier::Catcher
12
+
13
+ is_paranoid
14
+
15
+ end # Job
16
+ end # Delayed
17
+
18
+ rescue Exception => e
19
+ end
@@ -1,41 +1,40 @@
1
1
  module Delayed
2
2
  class Job < ActiveRecord::Base
3
3
 
4
- if (self.respond_to?(:is_paranoid))
5
- is_paranoid
6
- else
7
- alias_method :count_with_destroyed, :count
8
- alias_method :find_with_destroyed, :find
9
- end
10
-
11
- def payload_object=(object)
12
- self.worker_class_name = object.worker_class_name if object.respond_to?(:worker_class_name)
13
- @payload_object = object
14
- self['handler'] = object.to_yaml
15
- end
16
-
17
- def invoke_job_with_dj
18
- payload_object.dj_object = self if payload_object.respond_to?(:dj_object)
19
- invoke_job_without_dj
4
+ def invoke_job_with_extras
5
+ begin
6
+ self.payload_object.dj_object = self
7
+ self.touch(:started_at)
8
+ DJ::Worker.logger.info("Starting #{self.payload_object.class.name}#perform (DJ.id = '#{self.id}')")
9
+
10
+ invoke_job_without_extras
11
+
12
+ DJ::Worker.logger.info("Completed #{self.payload_object.class.name}#perform (DJ.id = '#{self.id}') [SUCCESS]")
13
+ self.touch(:finished_at)
14
+ rescue Exception => e
15
+ DJ::Worker.logger.error("Halted #{self.payload_object.class.name}#perform (DJ.id = '#{self.id}') [FAILURE]")
16
+ self.update_attributes(:started_at => nil)
17
+ raise e
18
+ end
19
+ enqueue_again
20
20
  end
21
21
 
22
- alias_method_chain :invoke_job, :dj
23
-
24
- def pending?
25
- self.started_at.nil? && self.finished_at.nil?
26
- end
22
+ alias_method_chain :invoke_job, :extras
27
23
 
28
- def running?
29
- !self.started_at.nil? && self.finished_at.nil?
30
- end
31
24
 
32
- def finished?
33
- !self.started_at.nil? && !self.finished_at.nil?
25
+ def enqueue_again
26
+ if self.payload_object.re_enqueuable
27
+ new_worker = self.payload_object.class.new(*self.payload_object.__original_args)
28
+ if self.payload_object.__re_enqueue_block
29
+ self.payload_object.__re_enqueue_block.call(self.payload_object, new_worker)
30
+ end
31
+ new_worker.enqueue
32
+ end
34
33
  end
35
34
 
36
35
  def validate_with_unique
37
36
  validate_without_unique
38
- if self['handler'] && self.payload_object && self.payload_object.is_a?(DJ::Worker) && self.new_record?
37
+ if self.payload_object.respond_to?(:unique?) && self.new_record?
39
38
  if self.payload_object.unique?
40
39
  if Delayed::Job.count(:all, :conditions => {:worker_class_name => self.worker_class_name, :finished_at => nil}) > 0
41
40
  self.errors.add_to_base("Only one #{self.worker_class_name} can be queued at a time!")
@@ -46,33 +45,21 @@ module Delayed
46
45
 
47
46
  alias_method_chain :validate, :unique
48
47
 
49
- class << self
50
-
51
- def stats(start_date = 1.day.ago.beginning_of_day, end_date = Time.now.beginning_of_day)
52
- workers = {}
53
- Delayed::Job.find_with_destroyed(:all, :select => :worker_class_name, :group => :worker_class_name).each do |dj|
54
- dj.worker_class_name = 'UNKNOWN' if dj.worker_class_name.blank?
55
- workers[dj.worker_class_name] = {}
56
- end
57
- workers.each do |worker, stats|
58
- wname = (worker == 'UNKNOWN' ? nil : worker)
59
- stats[:total] = Delayed::Job.count_with_destroyed(:conditions => {:worker_class_name => wname})
60
- stats[:remaining] = Delayed::Job.count(:conditions => {:worker_class_name => wname})
61
- stats[:processed] = stats[:total] - stats[:remaining]
62
- stats[:failures] = Delayed::Job.count(:conditions => ['worker_class_name = ? and attempts > 1', wname])
63
- if start_date
64
- date_stats = {:start_date => start_date, :end_date => end_date}
65
- date_stats[:total] = Delayed::Job.count_with_destroyed(:conditions => ['worker_class_name = ? and (created_at > ? and created_at < ?)', wname, start_date, end_date])
66
- date_stats[:remaining] = Delayed::Job.count(:conditions => ['worker_class_name = ? and (created_at > ? and created_at < ?)', wname, start_date, end_date])
67
- date_stats[:processed] = date_stats[:total] - date_stats[:remaining]
68
- date_stats[:failures] = Delayed::Job.count(:conditions => ['worker_class_name = ? and attempts > 1 and (created_at > ? and created_at < ?)', wname, start_date, end_date])
69
- stats[:date_range] = date_stats
70
- end
71
- workers[worker] = stats
72
- end
73
- workers
74
- end
75
-
48
+ def payload_object=(payload)
49
+ self.worker_class_name = payload.respond_to?(:worker_class_name) ? payload.worker_class_name : 'unknown'
50
+ self['handler'] = payload.to_yaml
51
+ end
52
+
53
+ def pending?
54
+ self.started_at.nil? && self.finished_at.nil?
55
+ end
56
+
57
+ def running?
58
+ !self.started_at.nil? && self.finished_at.nil?
59
+ end
60
+
61
+ def finished?
62
+ !self.started_at.nil? && !self.finished_at.nil?
76
63
  end
77
64
 
78
65
  end # Job
@@ -1,41 +1,15 @@
1
1
  module Delayed
2
2
  class PerformableMethod
3
+ include Delayed::Job::Extras
3
4
 
4
5
  attr_accessor :worker_class_name
5
- attr_accessor :dj_object
6
6
 
7
- def initialize_with_worker_class_name(object, method, args)
8
- self.worker_class_name = "#{object.class}__#{method}".underscore
9
- initialize_without_worker_class_name(object, method, args)
7
+ def initialize_with_extras(object, method, args)
8
+ self.worker_class_name = "#{object.class.to_s.underscore}/#{method}"
9
+ initialize_without_extras(object, method, args)
10
10
  end
11
11
 
12
- alias_method_chain :initialize, :worker_class_name
13
-
14
- if Object.const_defined?(:HoptoadNotifier)
15
- include HoptoadNotifier::Catcher
16
-
17
- def perform_with_hoptoad
18
- dj_id = 'unknown'
19
- if self.dj_object
20
- dj_id = self.dj_object.id
21
- self.dj_object.touch(:started_at)
22
- end
23
- begin
24
- DJ::Worker.logger.info("Starting #{self.class.name}#perform (DJ.id = '#{dj_id}')")
25
- val = perform_without_hoptoad
26
- DJ::Worker.logger.info("Completed #{self.class.name}#perform (DJ.id = '#{dj_id}') [SUCCESS]")
27
- self.dj_object.touch(:finished_at) if self.dj_object
28
- return val
29
- rescue Exception => e
30
- notify_hoptoad(exception_to_data(e).merge(:dj => self.dj_object.inspect))
31
- DJ::Worker.logger.error("Halted #{self.class.name}#perform (DJ.id = '#{dj_id}') [FAILURE]")
32
- self.dj_object.update_attributes(:started_at => nil) if self.dj_object
33
- raise e
34
- end
35
- end
36
-
37
- alias_method_chain :perform, :hoptoad
38
- end
12
+ alias_method_chain :initialize, :extras
39
13
 
40
14
  end # PerformableMethod
41
15
  end # Delayed
@@ -1,131 +1,6 @@
1
1
  module DJ
2
2
  class Worker
3
-
4
- PRIORITY_LEVELS = {:immediate => 10000, :high => 1000, :medium => 500, :normal => 0, :low => -100, :who_cares => -1000}
5
-
6
- attr_accessor :dj_object
7
- attr_accessor :logger
8
- attr_accessor :__original_args
9
-
10
- def initialize(*args)
11
- self.__original_args = *args
12
- return self
13
- end
14
-
15
- def priority=(x)
16
- @priority = x
17
- end
18
-
19
- def priority
20
- return @priority ||= 0
21
- end
22
-
23
- def run_at=(x)
24
- @run_at = x
25
- end
26
-
27
- def run_at
28
- return @run_at ||= Time.now
29
- end
30
-
31
- if Object.const_defined?(:HoptoadNotifier)
32
- include HoptoadNotifier::Catcher
33
- else
34
- def notify_hoptoad(e)
35
- logger.error(e)
36
- end
37
- end
38
-
39
- def worker_class_name
40
- self.class.to_s.underscore
41
- end
42
-
43
- def logger
44
- @logger || DJ::Worker.logger
45
- end
46
-
47
- def enqueue(priority = self.priority, run_at = self.run_at)
48
- Delayed::Job.enqueue(self, priority, run_at)
49
- end
50
-
51
- def reenqueue
52
- job = self.class.new(*self.__original_args)
53
- yield job if block_given?
54
- self.dj_object.touch(:finished_at) if self.dj_object
55
- job.enqueue
56
- end
57
-
58
- def unique?
59
- false
60
- end
61
-
62
- def before_perform
63
- end
64
-
65
- def after_success
66
- end
67
-
68
- def after_failure
69
- end
70
-
71
- class << self
72
-
73
- @@logger = SplitLogger.new
74
-
75
- def logger
76
- @@logger
77
- end
78
-
79
- def logger=(logger)
80
- @@logger = logger
81
- end
82
-
83
- def priority(level = 0)
84
- define_method('priority') do
85
- if level.is_a?(Symbol)
86
- level = DJ::Worker::PRIORITY_LEVELS[level] ||= 0
87
- end
88
- return @priority ||= level
89
- end
90
- end
91
-
92
- # VideoWorker.encode(1) # => Delayed::Job.enqueue(VideoWorker.new(:encode, 1))
93
- def method_missing(sym, *args)
94
- self.enqueue(sym, *args)
95
- end
96
-
97
- # VideoWorker.enqueue(1) # => Delayed::Job.enqueue(VideoWorker.new(1))
98
- def enqueue(*args)
99
- self.new(*args).enqueue
100
- end
101
-
102
- def perform(&block)
103
- define_method(:perform) do
104
- dj_id = 'unknown'
105
- if self.dj_object
106
- dj_id = self.dj_object.id
107
- self.dj_object.touch(:started_at)
108
- end
109
- begin
110
- self.before_perform
111
- self.logger.info("Starting #{self.class.name}#perform (DJ.id = '#{dj_id}')")
112
- val = self.instance_eval(&block)
113
- self.logger.info("Completed #{self.class.name}#perform (DJ.id = '#{dj_id}') [SUCCESS]")
114
- self.dj_object.touch(:finished_at) if self.dj_object
115
- self.after_success
116
- return val
117
- rescue Exception => e
118
- # send to hoptoad!
119
- notify_hoptoad(exception_to_data(e).merge(:dj => self.dj_object.inspect))
120
- self.logger.error("Halted #{self.class.name}#perform (DJ.id = '#{dj_id}') [FAILURE]")
121
- self.dj_object.update_attributes(:started_at => nil) if self.dj_object
122
- self.after_failure
123
- raise e
124
- end
125
- end
126
- end
127
-
128
- end
3
+ include Delayed::Job::Extras
129
4
 
130
5
  end # Worker
131
- end # Delayed
6
+ end # DJ
@@ -1,21 +1,12 @@
1
- begin
2
- # If the hoptoad_notifier gem is available
3
- # let's use it so we can get some good notifications
4
- # when an exception is raised.
5
- require 'hoptoad_notifier'
6
- rescue Exception => e
7
- end
1
+ require 'split_logger'
8
2
 
9
- begin
10
- # If the is_paranoid gem is available
11
- # let's use it so we can have a record of the
12
- # tasks that have been performed.
13
- require 'is_paranoid'
14
- rescue Exception => e
15
- end
16
3
 
17
- require 'split_logger'
4
+ path = File.join(File.dirname(__FILE__), 'delayed_job_extras')
5
+ require File.join(path, 'extras')
6
+ require File.join(path, 'job')
7
+ require File.join(path, 'performable_method')
8
+ require File.join(path, 'worker')
9
+ require File.join(path, 'action_mailer')
18
10
 
19
- Dir.glob(File.join(File.dirname(__FILE__), 'delayed_job_extras', '**/*.rb')).each do |f|
20
- require File.expand_path(f)
21
- end
11
+ require File.join(path, 'hoptoad')
12
+ require File.join(path, 'is_paranoid')
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: delayed_job_extras
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.3
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - markbates
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-10-03 00:00:00 -04:00
12
+ date: 2009-10-04 00:00:00 -04:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -32,6 +32,10 @@ extra_rdoc_files:
32
32
  - README
33
33
  - LICENSE
34
34
  files:
35
+ - lib/delayed_job_extras/action_mailer.rb
36
+ - lib/delayed_job_extras/extras.rb
37
+ - lib/delayed_job_extras/hoptoad.rb
38
+ - lib/delayed_job_extras/is_paranoid.rb
35
39
  - lib/delayed_job_extras/job.rb
36
40
  - lib/delayed_job_extras/performable_method.rb
37
41
  - lib/delayed_job_extras/worker.rb