job_hunter 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +2 -2
- data/README.md +79 -1
- data/job_hunter.gemspec +1 -1
- data/lib/job_hunter/defaults.rb +23 -0
- data/lib/job_hunter/dj_wrappers.rb +39 -7
- data/lib/job_hunter/version.rb +1 -1
- data/lib/job_hunter.rb +1 -3
- data/spec/job_hunter_spec.rb +77 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d2b4465adfe13c33ce17ab91820f12af51f646c6
|
4
|
+
data.tar.gz: 1895c7dfc3ea369904d621fce89cea593f96ff9d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 424a79f337a54bb1f8f68cd6f0a8d190dd06b3b86cc8b79a925567a589596401a3ba2a222e87a26386bdf4f1c744e8494cf80f0ad75a2b076348ded39ef224d0
|
7
|
+
data.tar.gz: 09e41ede15f6743e121c4b575f3dbce3a3996c4a3460e53cd5144e9c057e16925afe128bfba44b8e690260d6158097af1f8a1aa7284b13a1b0b805ef6f5e61ff
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -1,2 +1,80 @@
|
|
1
|
-
|
1
|
+
JobHunter
|
2
2
|
==========
|
3
|
+
|
4
|
+
JobHunter is a library that cuts down on boilerplate when creating and finding [Delayed::Job](https://github.com/collectiveidea/delayed_job) custom jobs.
|
5
|
+
|
6
|
+
Installation
|
7
|
+
-------
|
8
|
+
|
9
|
+
JobHunter supports DelayedJob 3.0+ with ActiveRecord as the backend. Just add `job_hunter` to your `Gemfile`.
|
10
|
+
|
11
|
+
Usage
|
12
|
+
-------
|
13
|
+
|
14
|
+
Add `extend JobHunter` at the top of a class you plan to use as a custom job. After this line, you can set defaults for this job with `run_at`, `priority`, `queue`, and `max_attempts`:
|
15
|
+
|
16
|
+
|
17
|
+
```ruby
|
18
|
+
class KustomJob < Struct.new(:model_id, :details)
|
19
|
+
extend JobHunter
|
20
|
+
|
21
|
+
run_at -> { 24.hours.from.now }
|
22
|
+
priority 37
|
23
|
+
queue :sugar_glider
|
24
|
+
max_attempts 4
|
25
|
+
|
26
|
+
def perform
|
27
|
+
# do amazing things
|
28
|
+
end
|
29
|
+
end
|
30
|
+
```
|
31
|
+
|
32
|
+
`run_at` accepts a Proc object. The value is evaluated when you enqueue a new custom job.
|
33
|
+
|
34
|
+
JobHunter also provides class methods to find, create, and destroy jobs:
|
35
|
+
|
36
|
+
```ruby
|
37
|
+
model_id = 22
|
38
|
+
details = "You seem to a have a squid on your head."
|
39
|
+
|
40
|
+
KustomJob.create(model_id, details)
|
41
|
+
|
42
|
+
KustomJob.find(model_id, details)
|
43
|
+
|
44
|
+
KustomJob.find_or_create(model_id, details)
|
45
|
+
|
46
|
+
KustomJob.delete(model_id, details)
|
47
|
+
|
48
|
+
```
|
49
|
+
|
50
|
+
Adding an index to `handler` in the `delayed_jobs` table is recommended if you plan on making regular use of `find` or `find_or_create`.
|
51
|
+
|
52
|
+
All of these methods will return a `Delayed::Job` if they find, create, or destroy a job and `nil` otherwise.
|
53
|
+
|
54
|
+
The `create` and `find_or_create` methods accept the same options hash as `Delayed::Job.enqueue`. Options passed in to these methods (`run_at`, `queue`, and `priority`) will override the defauls set in your custom job class. Options passed in to `find_or_create` will not affect a job already enqueued.
|
55
|
+
|
56
|
+
These class methods have corresponding instance methods:
|
57
|
+
|
58
|
+
```ruby
|
59
|
+
model_id = 22
|
60
|
+
details = "You seem to a have a squid on your head."
|
61
|
+
|
62
|
+
custom_job = KustomJob.new model_id, details
|
63
|
+
|
64
|
+
job.find
|
65
|
+
|
66
|
+
job.create
|
67
|
+
|
68
|
+
job.find_or_create
|
69
|
+
|
70
|
+
job.delete
|
71
|
+
```
|
72
|
+
|
73
|
+
Unlike the identically named class methods, `#create` and `#find_or_create` do not take an options hash. However, you can still override defaults by initializing your class by using `new_with_options`:
|
74
|
+
|
75
|
+
```ruby
|
76
|
+
super_custom_job = KustomJob.new_with_options model_id, details, run_at: 12.minutes.from.now
|
77
|
+
|
78
|
+
super_custom_job.create
|
79
|
+
```
|
80
|
+
|
data/job_hunter.gemspec
CHANGED
@@ -19,7 +19,7 @@ Gem::Specification.new do |gem|
|
|
19
19
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
20
20
|
gem.require_paths = ['lib']
|
21
21
|
|
22
|
-
gem.add_dependency '
|
22
|
+
gem.add_dependency 'delayed_job_active_record', ['>= 3.0', '< 5.0']
|
23
23
|
|
24
24
|
gem.add_development_dependency 'rake', '~> 10'
|
25
25
|
gem.add_development_dependency 'rspec', '~> 3'
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module JobHunter
|
2
|
+
def run_at(proc)
|
3
|
+
@run_at = proc
|
4
|
+
end
|
5
|
+
|
6
|
+
def priority(pri)
|
7
|
+
@priority = pri
|
8
|
+
end
|
9
|
+
|
10
|
+
def queue(queue)
|
11
|
+
@queue = queue
|
12
|
+
end
|
13
|
+
|
14
|
+
def max_attempts(value)
|
15
|
+
define_method(:max_attempts) { value }
|
16
|
+
end
|
17
|
+
|
18
|
+
def _defaults_
|
19
|
+
{ priority: @priority,
|
20
|
+
run_at: @run_at.try(:call),
|
21
|
+
queue: @queue }.select { |k, v| v }
|
22
|
+
end
|
23
|
+
end
|
@@ -1,20 +1,52 @@
|
|
1
1
|
module JobHunter
|
2
|
+
def self.extended(klass)
|
3
|
+
klass.include(InstanceMethods)
|
4
|
+
end
|
5
|
+
|
2
6
|
def create(*args)
|
3
|
-
|
4
|
-
Delayed::Job.enqueue(new(*args), options)
|
7
|
+
new_with_options(*args).create
|
5
8
|
end
|
6
9
|
|
7
10
|
def find(*args)
|
8
|
-
|
9
|
-
Delayed::Job.where(handler: handler).first
|
11
|
+
new_with_options(*args).find
|
10
12
|
end
|
11
13
|
|
12
14
|
def find_or_create(*args)
|
13
|
-
|
14
|
-
find(*job_args) or create(*args)
|
15
|
+
new_with_options(*args).find_or_create
|
15
16
|
end
|
16
17
|
|
17
18
|
def destroy(*args)
|
18
|
-
|
19
|
+
new_with_options(*args).destroy
|
20
|
+
end
|
21
|
+
|
22
|
+
def new_with_options(*args)
|
23
|
+
options = args.extract_options!
|
24
|
+
job = new(*args)
|
25
|
+
job.define_singleton_method :_options_,
|
26
|
+
-> { self.class._defaults_.merge(options) }
|
27
|
+
job
|
28
|
+
end
|
29
|
+
|
30
|
+
module InstanceMethods
|
31
|
+
def find
|
32
|
+
Delayed::Job.where(handler: to_yaml).first
|
33
|
+
end
|
34
|
+
|
35
|
+
def create
|
36
|
+
Delayed::Job.enqueue(self, _options_)
|
37
|
+
end
|
38
|
+
|
39
|
+
def find_or_create
|
40
|
+
find || create
|
41
|
+
end
|
42
|
+
|
43
|
+
def destroy
|
44
|
+
find.try(:destroy)
|
45
|
+
end
|
46
|
+
|
47
|
+
private
|
48
|
+
def _options_
|
49
|
+
{}
|
50
|
+
end
|
19
51
|
end
|
20
52
|
end
|
data/lib/job_hunter/version.rb
CHANGED
data/lib/job_hunter.rb
CHANGED
data/spec/job_hunter_spec.rb
CHANGED
@@ -5,6 +5,10 @@ class KustomJob < Struct.new(:model_id, :details)
|
|
5
5
|
|
6
6
|
def perform
|
7
7
|
end
|
8
|
+
|
9
|
+
def self.remove_method(sym)
|
10
|
+
define_method(name) { super }
|
11
|
+
end
|
8
12
|
end
|
9
13
|
|
10
14
|
describe JobHunter do
|
@@ -79,5 +83,77 @@ describe JobHunter do
|
|
79
83
|
it 'returns nil if there is nothing to destory' do
|
80
84
|
expect(KustomJob.destroy model_id, details).to be_nil
|
81
85
|
end
|
82
|
-
end
|
86
|
+
end
|
87
|
+
|
88
|
+
context '.max_attempts' do
|
89
|
+
let(:attempts) { 3 }
|
90
|
+
|
91
|
+
it 'sets max attempts in an instance method of the same name' do
|
92
|
+
kustom_job = KustomJob.new
|
93
|
+
expect {
|
94
|
+
KustomJob.max_attempts attempts
|
95
|
+
}.to change{kustom_job.try(:max_attempts)}.from(nil).to(attempts)
|
96
|
+
end
|
97
|
+
|
98
|
+
after do
|
99
|
+
KustomJob.remove_method :max_attempts
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
context '.run_at' do
|
104
|
+
let(:default_time) { -> { DateTime.parse('April 23, 2015 07:23') } }
|
105
|
+
let(:override) { 6.hours.from_now }
|
106
|
+
|
107
|
+
before do
|
108
|
+
KustomJob.run_at default_time
|
109
|
+
end
|
110
|
+
|
111
|
+
it 'gives jobs the default run_at time' do
|
112
|
+
job = KustomJob.create
|
113
|
+
expect(job.run_at).to eq(default_time.call)
|
114
|
+
end
|
115
|
+
|
116
|
+
it 'allows overriding the default time' do
|
117
|
+
job = KustomJob.create run_at: override
|
118
|
+
expect(job.run_at).to eq(override)
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
context '.priority' do
|
123
|
+
let(:default_priority) { 37 }
|
124
|
+
let(:override) { 13 }
|
125
|
+
|
126
|
+
before do
|
127
|
+
KustomJob.priority default_priority
|
128
|
+
end
|
129
|
+
|
130
|
+
it 'gives jobs the default priority' do
|
131
|
+
job = KustomJob.create
|
132
|
+
expect(job.priority).to eq(default_priority)
|
133
|
+
end
|
134
|
+
|
135
|
+
it 'allows overriding the default priority' do
|
136
|
+
job = KustomJob.create priority: override
|
137
|
+
expect(job.priority).to eq(override)
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
context '.queue' do
|
142
|
+
let(:default_queue) { 'sugar_glider' }
|
143
|
+
let(:override) { 'sugar_moo' }
|
144
|
+
|
145
|
+
before do
|
146
|
+
KustomJob.queue default_queue
|
147
|
+
end
|
148
|
+
|
149
|
+
it 'gives jobs the default queue' do
|
150
|
+
job = KustomJob.create
|
151
|
+
expect(job.queue).to eq(default_queue)
|
152
|
+
end
|
153
|
+
|
154
|
+
it 'allows overriding the default queue' do
|
155
|
+
job = KustomJob.create queue: override
|
156
|
+
expect(job.queue).to eq(override)
|
157
|
+
end
|
158
|
+
end
|
83
159
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: job_hunter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Moser
|
@@ -11,7 +11,7 @@ cert_chain: []
|
|
11
11
|
date: 2014-05-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: delayed_job_active_record
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
@@ -87,6 +87,7 @@ files:
|
|
87
87
|
- Rakefile
|
88
88
|
- job_hunter.gemspec
|
89
89
|
- lib/job_hunter.rb
|
90
|
+
- lib/job_hunter/defaults.rb
|
90
91
|
- lib/job_hunter/dj_wrappers.rb
|
91
92
|
- lib/job_hunter/version.rb
|
92
93
|
- spec/job_hunter_spec.rb
|