dj_remixes 0.0.10 → 0.0.17

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,27 @@
1
+ module DJ
2
+ class Worker
3
+
4
+ attr_accessor :id
5
+ attr_accessor :attributes
6
+
7
+ def initialize(attributes = {})
8
+ self.attributes = attributes
9
+ self.attributes = self.attributes.stringify_keys
10
+ self.id = self.attributes['id']
11
+ end
12
+
13
+ def method_missing(sym, *args, &block)
14
+ attribute = sym.to_s
15
+ case attribute
16
+ when /(.+)\=$/
17
+ self.attributes[$1] = args.first
18
+ when /(.+)\?$/
19
+ # self.attributes.has_key?($1.to_sym)
20
+ return self.attributes[$1]
21
+ else
22
+ return self.attributes[attribute]
23
+ end
24
+ end
25
+
26
+ end # Worker
27
+ end # DJ
@@ -0,0 +1,22 @@
1
+ module DJ
2
+ class Worker
3
+
4
+ def before(job)
5
+ self.dj_object = job
6
+ job.touch(:started_at)
7
+ end
8
+
9
+ def after(job)
10
+ end
11
+
12
+ def success(job)
13
+ job.touch(:finished_at)
14
+ self.enqueue_again
15
+ end
16
+
17
+ def failure(job, error)
18
+ job.update_attributes(:started_at => nil)
19
+ end
20
+
21
+ end # Worker
22
+ end # DJ
@@ -2,10 +2,27 @@ module DJ
2
2
 
3
3
  class << self
4
4
 
5
+ # Pass off calls to the backend:
5
6
  def method_missing(sym, *args, &block)
6
7
  Delayed::Worker.backend.send(sym, *args, &block)
7
8
  end
8
9
 
9
10
  end
10
11
 
12
+ end
13
+
14
+ Delayed::Worker.backend.send(:class_eval) do
15
+ def invoke_job_with_callbacks
16
+ payload_object.before(self) if payload_object.respond_to?(:before)
17
+ begin
18
+ invoke_job_without_callbacks
19
+ payload_object.success(self) if payload_object.respond_to?(:success)
20
+ rescue Exception => e
21
+ payload_object.failure(self, e) if payload_object.respond_to?(:failure)
22
+ raise e
23
+ ensure
24
+ payload_object.after(self) if payload_object.respond_to?(:after)
25
+ end
26
+ end
27
+ alias_method_chain :invoke_job, :callbacks
11
28
  end
@@ -1,12 +1,15 @@
1
- module DJ
2
- class Worker
1
+ if Object.const_defined?(:HoptoadNotifier)
2
+ module DJ
3
+ class Worker
3
4
 
4
- def failure_with_hoptoad(job, error)
5
- HoptoadNotifier.notify_or_ignore(error, :cgi_data => self.attributes)
6
- failure_without_hoptoad(job, error)
7
- end
5
+ # Report Errors to Hoptoad:
6
+ def failure_with_hoptoad(job, error)
7
+ HoptoadNotifier.notify_or_ignore(error, :cgi_data => self.attributes)
8
+ failure_without_hoptoad(job, error)
9
+ end
8
10
 
9
- alias_method_chain :failure, :hoptoad
11
+ alias_method_chain :failure, :hoptoad
10
12
 
11
- end
12
- end
13
+ end # Worker
14
+ end # DJ
15
+ end # defined?
@@ -0,0 +1,34 @@
1
+ module DJ
2
+ class Worker
3
+
4
+ # A helpful list of symbols to priority levels
5
+ PRIORITY_LEVELS = {:urgent => -100000, :immediate => -10000, :high => -1000, :medium => -500, :normal => 0, :low => 100, :who_cares => 1000}
6
+
7
+ attr_accessor :priority
8
+
9
+ class << self
10
+
11
+ def priority(level = 0)
12
+ define_method('priority') do
13
+ if level.is_a?(Symbol)
14
+ level = DJ::Worker::PRIORITY_LEVELS[level] ||= 0
15
+ end
16
+ return @priority ||= level
17
+ end
18
+ end
19
+
20
+ end
21
+
22
+ def priority
23
+ case @priority
24
+ when Symbol
25
+ DJ::Worker::PRIORITY_LEVELS[@priority] ||= 0
26
+ when Fixnum
27
+ @priority
28
+ else
29
+ 0
30
+ end
31
+ end
32
+
33
+ end
34
+ end
@@ -2,7 +2,8 @@ module Mail
2
2
  class Message
3
3
 
4
4
  class MailmanWorker < DJ::Worker
5
- priority :immediate
5
+ priority :urgent
6
+ run_at {1.year.ago}
6
7
 
7
8
  def perform
8
9
  message = Marshal.load(self.mail)
@@ -0,0 +1,44 @@
1
+ module DJ
2
+ class Worker
3
+
4
+ class << self
5
+
6
+ # Class level accessor to let DJ know whether it
7
+ # should be enqueued again after it has successfully
8
+ # completed.
9
+ attr_accessor :re_enqueuable
10
+
11
+ # A convience method to tell DJ to re-enqueue this worker
12
+ # after it has successfully completely. NOTE: This will actually
13
+ # create a new DJ object in the database, not reuse the same one.
14
+ #
15
+ # Example:
16
+ # # Run every 30 days and charge a credit card.
17
+ # class SubscriptionWorker < DJ::Worker
18
+ # re_enqueue
19
+ #
20
+ # def run_at
21
+ # 30.days.from_now
22
+ # end
23
+ #
24
+ # def perform
25
+ # # charge the credit card...
26
+ # end
27
+ # end
28
+ def re_enqueue
29
+ self.re_enqueuable = true
30
+ end
31
+
32
+ end
33
+
34
+ protected
35
+ # clone and re-enqueue the worker.
36
+ def enqueue_again # :nodoc:
37
+ if self.class.re_enqueuable
38
+ new_worker = self.clone()
39
+ new_worker.enqueue
40
+ end
41
+ end
42
+
43
+ end # Worker
44
+ end # DJ
@@ -0,0 +1,19 @@
1
+ module DJ
2
+ class Worker
3
+
4
+ attr_accessor :run_at
5
+
6
+ class << self
7
+
8
+ def run_at(&block)
9
+ define_method('run_at', &block)
10
+ end
11
+
12
+ end
13
+
14
+ def run_at
15
+ return @run_at ||= Time.now
16
+ end
17
+
18
+ end # Worker
19
+ end # DJ
@@ -0,0 +1,36 @@
1
+ module DJ
2
+ class Worker
3
+
4
+ class << self
5
+
6
+ # Tell DJ to only allow one of this worker at a given time.
7
+ #
8
+ # Example:
9
+ # # We only want to charge the card once!
10
+ # class PurchaseWorker < DJ::Worker
11
+ # is_unique
12
+ #
13
+ # def perform
14
+ # # charge the credit card...
15
+ # end
16
+ # end
17
+ def is_unique
18
+ define_method('unique?') do
19
+ return true
20
+ end
21
+ end
22
+
23
+ end
24
+
25
+ # Returns true or false based on whether this should be the only
26
+ # worker that should be allowed in the system at any one time.
27
+ # If set to true, using the is_unique class method, then when a
28
+ # new job is enqueued it will be validated against the worker_class_name
29
+ # field in the database. If there is already a job with the same
30
+ # worker_class_name then the enqueing of the new job will fail.
31
+ def unique?
32
+ false
33
+ end
34
+
35
+ end # Worker
36
+ end # DJ
@@ -1,78 +1,17 @@
1
1
  module DJ
2
2
  class Worker
3
3
 
4
- PRIORITY_LEVELS = {:immediate => 10000, :high => 1000, :medium => 500, :normal => 0, :low => -100, :who_cares => -1000}
5
-
6
4
  attr_accessor :run_at
7
- attr_accessor :priority
8
5
  attr_accessor :worker_class_name
9
- attr_accessor :re_enqueuable
10
- attr_accessor :id
11
- attr_accessor :attributes
12
- attr_accessor :dj_object
13
6
 
14
7
  class << self
15
8
 
16
- def priority(level = 0)
17
- define_method('priority') do
18
- if level.is_a?(Symbol)
19
- level = DJ::Worker::PRIORITY_LEVELS[level] ||= 0
20
- end
21
- return @priority ||= level
22
- end
23
- end
24
-
25
- def is_unique
26
- define_method('unique?') do
27
- return true
28
- end
29
- end
30
-
31
9
  def enqueue(*args)
32
10
  self.new(*args).enqueue
33
11
  end
34
12
 
35
- def re_enqueue(&block)
36
- define_method('re_enqueuable') do
37
- true
38
- end
39
- define_method('__re_enqueue_block') do
40
- block
41
- end
42
- end
43
-
44
- end
45
-
46
- def initialize(attributes = {})
47
- self.attributes = attributes
48
- self.attributes = self.attributes.stringify_keys
49
- self.id = self.attributes['id']
50
13
  end
51
14
 
52
- def method_missing(sym, *args, &block)
53
- attribute = sym.to_s
54
- case attribute
55
- when /(.+)\=$/
56
- self.attributes[$1] = args.first
57
- when /(.+)\?$/
58
- # self.attributes.has_key?($1.to_sym)
59
- return self.attributes[$1]
60
- else
61
- return self.attributes[attribute]
62
- end
63
- end
64
-
65
- def priority
66
- case @priority
67
- when Symbol
68
- DJ::Worker::PRIORITY_LEVELS[@priority] ||= 0
69
- when Fixnum
70
- @priority
71
- else
72
- 0
73
- end
74
- end
75
-
76
15
  def run_at
77
16
  return @run_at ||= Time.now
78
17
  end
@@ -102,46 +41,17 @@ module DJ
102
41
 
103
42
  alias_method :save, :enqueue
104
43
 
105
- def unique?
106
- false
44
+ # Needs to be implemented by subclasses! It's only here
45
+ # so people can hook into it.
46
+ def perform
47
+ raise NoMethodError.new('perform')
107
48
  end
108
49
 
109
- def clone
50
+ def clone # :nodoc:
110
51
  cl = super
111
52
  cl.run_at = nil
112
53
  cl
113
54
  end
114
55
 
115
- def before(job)
116
- self.dj_object = job
117
- job.touch(:started_at)
118
- end
119
-
120
- def perform
121
- raise NoMethodError.new('perform')
122
- end
123
-
124
- def after(job)
125
- end
126
-
127
- def success(job)
128
- job.touch(:finished_at)
129
- enqueue_again
130
- end
131
-
132
- def failure(job, error)
133
- job.update_attributes(:started_at => nil)
134
- end
135
-
136
- def enqueue_again
137
- if self.re_enqueuable
138
- new_worker = self.clone()
139
- if self.__re_enqueue_block
140
- self.__re_enqueue_block.call(self, new_worker)
141
- end
142
- new_worker.enqueue
143
- end
144
- end
145
-
146
- end
147
- end
56
+ end # Worker
57
+ end # DJ
data/lib/dj_remixes.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  # Dir.glob(File.join(File.dirname(__FILE__), 'dj_remixes', '**/*.rb')).each do |f|
2
2
  # require File.expand_path(f)
3
3
  # end
4
- require 'delayed_job'
4
+ # require 'delayed_job'
5
5
 
6
6
  Delayed::Worker.guess_backend
7
7
 
@@ -9,11 +9,17 @@ path = File.join(File.dirname(__FILE__), 'dj_remixes')
9
9
 
10
10
  require File.join(path, 'dj_remixes')
11
11
  require File.join(path, 'worker')
12
+ require File.join(path, 'attributes')
13
+ require File.join(path, 'callbacks')
14
+ require File.join(path, 'priority')
15
+ require File.join(path, 'run_at')
16
+ require File.join(path, 'unique')
17
+ require File.join(path, 're_enqueue')
12
18
  require File.join(path, 'hoptoad')
13
19
 
14
20
  if Rails.version.match(/^2/)
15
- require File.join(path, 'rails2', 'action_mailer')
16
- require File.join(path, 'rails2', 'unique_validator')
21
+ # require File.join(path, 'rails2', 'action_mailer')
22
+ # require File.join(path, 'rails2', 'unique_validator')
17
23
  else
18
24
  require File.join(path, 'rails3', 'railtie')
19
25
  require File.join(path, 'rails3', 'unique_validator')
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 0
8
- - 10
9
- version: 0.0.10
8
+ - 17
9
+ version: 0.0.17
10
10
  platform: ruby
11
11
  authors:
12
12
  - markbates
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-06-14 00:00:00 -04:00
17
+ date: 2010-07-06 00:00:00 -04:00
18
18
  default_executable:
19
19
  dependencies: []
20
20
 
@@ -28,13 +28,17 @@ extra_rdoc_files:
28
28
  - README
29
29
  - LICENSE
30
30
  files:
31
+ - lib/dj_remixes/attributes.rb
32
+ - lib/dj_remixes/callbacks.rb
31
33
  - lib/dj_remixes/dj_remixes.rb
32
34
  - lib/dj_remixes/hoptoad.rb
33
- - lib/dj_remixes/rails2/action_mailer.rb
34
- - lib/dj_remixes/rails2/unique_validator.rb
35
+ - lib/dj_remixes/priority.rb
35
36
  - lib/dj_remixes/rails3/action_mailer.rb
36
37
  - lib/dj_remixes/rails3/railtie.rb
37
38
  - lib/dj_remixes/rails3/unique_validator.rb
39
+ - lib/dj_remixes/re_enqueue.rb
40
+ - lib/dj_remixes/run_at.rb
41
+ - lib/dj_remixes/unique.rb
38
42
  - lib/dj_remixes/worker.rb
39
43
  - lib/dj_remixes.rb
40
44
  - README
@@ -49,6 +53,7 @@ rdoc_options: []
49
53
  require_paths:
50
54
  - lib
51
55
  required_ruby_version: !ruby/object:Gem::Requirement
56
+ none: false
52
57
  requirements:
53
58
  - - ">="
54
59
  - !ruby/object:Gem::Version
@@ -56,6 +61,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
56
61
  - 0
57
62
  version: "0"
58
63
  required_rubygems_version: !ruby/object:Gem::Requirement
64
+ none: false
59
65
  requirements:
60
66
  - - ">="
61
67
  - !ruby/object:Gem::Version
@@ -65,7 +71,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
65
71
  requirements: []
66
72
 
67
73
  rubyforge_project:
68
- rubygems_version: 1.3.6
74
+ rubygems_version: 1.3.7
69
75
  signing_key:
70
76
  specification_version: 3
71
77
  summary: dj_remixes
@@ -1,62 +0,0 @@
1
- if defined?(ActionMailer)
2
- module ActionMailer
3
- class Base
4
-
5
- class << self
6
-
7
- def inherited(klass)
8
- super
9
- eval %{
10
- class ::#{klass}Worker < DJ::Worker
11
-
12
- priority :immediate
13
-
14
- attr_accessor :called_method
15
- attr_accessor :args
16
-
17
- def initialize(called_method, *args)
18
- self.called_method = called_method
19
- self.args = args
20
- end
21
-
22
- def perform
23
- # ::#{klass}.send(self.called_method, *self.args)
24
- ::#{klass}.send(:new, self.called_method, *self.args).deliver!
25
- end
26
-
27
- class << self
28
-
29
- def method_missing(sym, *args)
30
- ::#{klass}Worker.enqueue(sym, *args)
31
- end
32
-
33
- end
34
-
35
- end
36
- }
37
- end
38
-
39
- def method_missing_with_extras(method_symbol, *parameters) #:nodoc:
40
- if ActionMailer::Base.delivery_method == :test
41
- return method_missing_without_extras(method_symbol, *parameters)
42
- end
43
-
44
- if match = matches_dynamic_method?(method_symbol)
45
- case match[1]
46
- when 'deliver'# then new(match[2], *parameters).deliver!
47
- "#{self.name}Worker".constantize.enqueue(match[2], *parameters)
48
- else
49
- method_missing_without_extras(method_symbol, *parameters)
50
- end
51
- else
52
- super
53
- end
54
- end
55
-
56
- alias_method_chain :method_missing, :extras
57
-
58
- end # class << self
59
-
60
- end # Base
61
- end # ActionMailer
62
- end
@@ -1,14 +0,0 @@
1
- Delayed::Worker.backend.send(:class_eval) do
2
- def validate_with_unique
3
- validate_without_unique
4
- if self.payload_object.respond_to?(:unique?) && self.new_record?
5
- if self.payload_object.unique?
6
- if DJ.count(:all, :conditions => {:worker_class_name => self.payload_object.worker_class_name, :finished_at => nil}) > 0
7
- self.errors.add_to_base("Only one #{self.payload_object.worker_class_name} can be queued at a time!")
8
- end
9
- end
10
- end
11
- end
12
-
13
- alias_method_chain :validate, :unique
14
- end