delayed_job_loner 0.0.3 → 0.0.4
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.
- data/README.md +9 -0
- data/delayed_job_loner.gemspec +1 -1
- data/lib/delayed_job_loner.rb +1 -1
- data/lib/delayed_job_loner/init.rb +16 -5
- data/lib/delayed_job_loner/version.rb +1 -1
- data/lib/generators/delayed_job_loner/delayed_job_loner_generator.rb +29 -0
- data/lib/generators/delayed_job_loner/templates/migration.rb +11 -0
- data/spec/delayed_job_loner_spec.rb +16 -3
- data/spec/story.rb +4 -2
- metadata +5 -3
data/README.md
CHANGED
@@ -16,6 +16,15 @@ Or install it yourself as:
|
|
16
16
|
|
17
17
|
$ gem install delayed_job_loner
|
18
18
|
|
19
|
+
### Migration
|
20
|
+
|
21
|
+
The jobs table requires a migration to add the loner_hash string field.
|
22
|
+
|
23
|
+
<pre>
|
24
|
+
$ script/rails generate delayed_job_loner
|
25
|
+
$ rake db:migrate
|
26
|
+
</pre>
|
27
|
+
|
19
28
|
## Usage
|
20
29
|
|
21
30
|
Pass the option `:unique_on` to any method that you would provide `:priority` or `:run_at`. `:unique_on` should be an array of attributes that you want to check the uniqueness of the job against.
|
data/delayed_job_loner.gemspec
CHANGED
@@ -18,7 +18,7 @@ Gem::Specification.new do |gem|
|
|
18
18
|
gem.add_dependency 'delayed_job'
|
19
19
|
|
20
20
|
gem.add_development_dependency 'rspec'
|
21
|
-
gem.add_development_dependency '
|
21
|
+
gem.add_development_dependency 'rails'
|
22
22
|
gem.add_development_dependency 'sqlite3-ruby'
|
23
23
|
gem.add_development_dependency 'sqlite3_ar_regexp'
|
24
24
|
gem.add_development_dependency 'delayed_job_active_record'
|
data/lib/delayed_job_loner.rb
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
require "delayed_job_loner/version"
|
2
|
-
require "delayed_job_loner/init"
|
2
|
+
require "delayed_job_loner/init"
|
@@ -1,22 +1,33 @@
|
|
1
|
+
require 'digest/md5'
|
2
|
+
|
1
3
|
module Delayed
|
2
4
|
module Backend
|
3
5
|
module ActiveRecord
|
4
6
|
class Job < ::ActiveRecord::Base
|
7
|
+
attr_accessor :loner
|
5
8
|
attr_accessor :unique_on
|
6
|
-
# attr_accessible :unique_on
|
7
9
|
|
8
10
|
validate :check_uniqueness
|
9
11
|
|
10
12
|
def check_uniqueness
|
13
|
+
self.loner_hash = generate_loner_hash
|
14
|
+
if loner || unique_on
|
15
|
+
self.errors.add(:base, "Job already exists") unless self.class.where(loner_hash: self.loner_hash, locked_by: nil).first.nil?
|
16
|
+
else
|
17
|
+
true
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def generate_loner_hash
|
11
22
|
if unique_on
|
12
|
-
|
23
|
+
hashable_string = "#{payload_object.method_name}"
|
13
24
|
unique_on.each do |attribute_name|
|
14
|
-
|
25
|
+
hashable_string += "::#{attribute_name}:#{payload_object.send(attribute_name)}"
|
15
26
|
end
|
16
|
-
self.errors.add(:base, "Job already exists") unless scope.first.nil?
|
17
27
|
else
|
18
|
-
|
28
|
+
hashable_string = "#{payload_object.method_name}::id:#{payload_object.id}"
|
19
29
|
end
|
30
|
+
Digest::MD5.base64digest(hashable_string)
|
20
31
|
end
|
21
32
|
|
22
33
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'rails/generators'
|
2
|
+
require 'rails/generators/migration'
|
3
|
+
|
4
|
+
class DelayedJobLonerGenerator < Rails::Generators::Base
|
5
|
+
|
6
|
+
include Rails::Generators::Migration
|
7
|
+
|
8
|
+
def self.source_root
|
9
|
+
@source_root ||= File.join(File.dirname(__FILE__), 'templates')
|
10
|
+
end
|
11
|
+
|
12
|
+
# Implement the required interface for Rails::Generators::Migration.
|
13
|
+
#
|
14
|
+
def self.next_migration_number(dirname) #:nodoc:
|
15
|
+
next_migration_number = current_migration_number(dirname) + 1
|
16
|
+
if ActiveRecord::Base.timestamped_migrations
|
17
|
+
[Time.now.utc.strftime("%Y%m%d%H%M%S"), "%.14d" % next_migration_number].max
|
18
|
+
else
|
19
|
+
"%.3d" % next_migration_number
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def create_migration_file
|
24
|
+
if defined?(ActiveRecord)
|
25
|
+
migration_template 'migration.rb', 'db/migrate/add_loner_hash_column_to_delayed_jobs.rb'
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
class AddLonerHashColumnToDelayedJobs < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
add_column :delayed_jobs, :loner_hash, :string
|
4
|
+
add_index :delayed_jobs, :loner_hash
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.down
|
8
|
+
remove_index :delayed_jobs, :loner_hash
|
9
|
+
remove_column :delayed_jobs, :loner_hash
|
10
|
+
end
|
11
|
+
end
|
@@ -21,15 +21,28 @@ describe DelayedJobLoner do
|
|
21
21
|
|
22
22
|
# This test is broken right now because of an issue with attr_accessor not being able to be set by mass assignment in my tests.
|
23
23
|
# It works in real life...
|
24
|
-
it "should not create a job if :
|
24
|
+
it "should not create a job if :loner is specified and a similar job exists" do
|
25
25
|
story = Story.create(:text => "foo")
|
26
26
|
story.reload
|
27
27
|
|
28
28
|
story.whatever.persisted?.should eql true
|
29
29
|
story.whatever.persisted?.should eql false
|
30
30
|
|
31
|
-
story.delay(:
|
32
|
-
story.delay(:
|
31
|
+
story.delay(:loner => true).tell.persisted?.should eql true
|
32
|
+
story.delay(:loner => true).tell.persisted?.should eql false
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should return a unique md5 hash" do
|
36
|
+
story = Story.create(:text => "foo")
|
37
|
+
story2 = Story.create(:text => "foo")
|
38
|
+
story.reload
|
39
|
+
story2.reload
|
40
|
+
|
41
|
+
dj_object = story.whatever
|
42
|
+
dj_object2 = story2.whatever
|
43
|
+
|
44
|
+
dj_object.generate_loner_hash.should_not eql dj_object2.generate_loner_hash
|
45
|
+
dj_object.loner_hash.should eql dj_object.generate_loner_hash
|
33
46
|
end
|
34
47
|
|
35
48
|
end
|
data/spec/story.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require 'rails'
|
2
2
|
require 'delayed_job'
|
3
3
|
require 'delayed_job_active_record'
|
4
4
|
require 'delayed_job_loner'
|
@@ -20,7 +20,9 @@ ActiveRecord::Schema.define do
|
|
20
20
|
table.datetime :locked_at
|
21
21
|
table.string :locked_by
|
22
22
|
table.datetime :failed_at
|
23
|
+
table.string :loner_hash
|
23
24
|
table.timestamps
|
25
|
+
|
24
26
|
end
|
25
27
|
|
26
28
|
create_table :stories, :force => true do |table|
|
@@ -40,6 +42,6 @@ class Story < ActiveRecord::Base
|
|
40
42
|
def whatever
|
41
43
|
tell
|
42
44
|
end
|
43
|
-
handle_asynchronously :whatever, :
|
45
|
+
handle_asynchronously :whatever, :loner => true, :priority => 10
|
44
46
|
|
45
47
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: delayed_job_loner
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-09-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: delayed_job
|
@@ -44,7 +44,7 @@ dependencies:
|
|
44
44
|
- !ruby/object:Gem::Version
|
45
45
|
version: '0'
|
46
46
|
- !ruby/object:Gem::Dependency
|
47
|
-
name:
|
47
|
+
name: rails
|
48
48
|
requirement: !ruby/object:Gem::Requirement
|
49
49
|
none: false
|
50
50
|
requirements:
|
@@ -125,6 +125,8 @@ files:
|
|
125
125
|
- lib/delayed_job_loner.rb
|
126
126
|
- lib/delayed_job_loner/init.rb
|
127
127
|
- lib/delayed_job_loner/version.rb
|
128
|
+
- lib/generators/delayed_job_loner/delayed_job_loner_generator.rb
|
129
|
+
- lib/generators/delayed_job_loner/templates/migration.rb
|
128
130
|
- spec/delayed_job_loner_spec.rb
|
129
131
|
- spec/spec_helper.rb
|
130
132
|
- spec/story.rb
|