delayed_job_extras 0.4.3 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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