resque_unit 0.4.0 → 0.4.1
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/lib/resque_unit/plugin.rb +6 -1
- data/lib/resque_unit/resque.rb +24 -16
- data/test/resque_unit_test.rb +51 -0
- data/test/sample_jobs.rb +11 -0
- metadata +45 -53
data/lib/resque_unit/plugin.rb
CHANGED
@@ -51,6 +51,11 @@ unless defined?(Resque::Plugin)
|
|
51
51
|
def after_enqueue_hooks(job)
|
52
52
|
job.methods.grep(/^after_enqueue/).sort
|
53
53
|
end
|
54
|
+
|
55
|
+
# Given an object, returns a list `before_enqueue` hook names.
|
56
|
+
def before_enqueue_hooks(job)
|
57
|
+
job.methods.grep(/^before_enqueue/).sort
|
58
|
+
end
|
54
59
|
end
|
55
60
|
end
|
56
61
|
|
@@ -62,4 +67,4 @@ unless defined?(Resque::Job::DontPerform)
|
|
62
67
|
DontPerform = Class.new(StandardError)
|
63
68
|
end
|
64
69
|
end
|
65
|
-
end
|
70
|
+
end
|
data/lib/resque_unit/resque.rb
CHANGED
@@ -71,28 +71,25 @@ module Resque
|
|
71
71
|
|
72
72
|
# Executes all jobs in all queues in an undefined order.
|
73
73
|
def run!
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
old_queue.each do |queue_name, queue|
|
79
|
-
queue.each do |job_payload|
|
80
|
-
job_payload = decode(job_payload)
|
81
|
-
@hooks_enabled ? perform_with_hooks(job_payload) : perform_without_hooks(job_payload)
|
82
|
-
end
|
74
|
+
payloads = []
|
75
|
+
@queue.each do |queue_name, queue|
|
76
|
+
payloads.concat queue.slice!(0, queue.size)
|
83
77
|
end
|
78
|
+
exec_payloads payloads.shuffle
|
84
79
|
end
|
85
80
|
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
self.reset!(queue_name)
|
81
|
+
def run_for!(queue_name, limit=false)
|
82
|
+
queue = @queue[queue_name]
|
83
|
+
exec_payloads queue.slice!(0, ( limit ? limit : queue.size) ).shuffle
|
84
|
+
end
|
91
85
|
|
92
|
-
|
86
|
+
def exec_payloads(raw_payloads)
|
87
|
+
raw_payloads.each do |raw_payload|
|
88
|
+
job_payload = decode(raw_payload)
|
93
89
|
@hooks_enabled ? perform_with_hooks(job_payload) : perform_without_hooks(job_payload)
|
94
90
|
end
|
95
91
|
end
|
92
|
+
private :exec_payloads
|
96
93
|
|
97
94
|
# 1. Execute all jobs in all queues in an undefined order,
|
98
95
|
# 2. Check if new jobs were announced, and execute them.
|
@@ -112,7 +109,11 @@ module Resque
|
|
112
109
|
|
113
110
|
# :nodoc:
|
114
111
|
def enqueue(klass, *args)
|
115
|
-
|
112
|
+
enqueue_to( queue_for(klass), klass, *args)
|
113
|
+
end
|
114
|
+
|
115
|
+
# :nodoc:
|
116
|
+
def enqueue_to( queue_name, klass, *args )
|
116
117
|
# Behaves like Resque, raise if no queue was specifed
|
117
118
|
raise NoQueueError.new("Jobs must be placed onto a queue.") unless queue_name
|
118
119
|
enqueue_unit(queue_name, {"class" => klass.name, "args" => args })
|
@@ -122,6 +123,7 @@ module Resque
|
|
122
123
|
def queue_for(klass)
|
123
124
|
klass.instance_variable_get(:@queue) || (klass.respond_to?(:queue) && klass.queue)
|
124
125
|
end
|
126
|
+
alias :queue_from_class :queue_for
|
125
127
|
|
126
128
|
# :nodoc:
|
127
129
|
def empty_queues?
|
@@ -132,6 +134,12 @@ module Resque
|
|
132
134
|
|
133
135
|
def enqueue_unit(queue_name, hash)
|
134
136
|
klass = constantize(hash["class"])
|
137
|
+
if @hooks_enabled
|
138
|
+
before_hooks = Plugin.before_enqueue_hooks(klass).map do |hook|
|
139
|
+
klass.send(hook, *hash["args"])
|
140
|
+
end
|
141
|
+
return nil if before_hooks.any? { |result| result == false }
|
142
|
+
end
|
135
143
|
queue(queue_name) << encode(hash)
|
136
144
|
if @hooks_enabled
|
137
145
|
Plugin.after_enqueue_hooks(klass).each do |hook|
|
data/test/resque_unit_test.rb
CHANGED
@@ -17,6 +17,40 @@ class ResqueUnitTest < Test::Unit::TestCase
|
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
|
+
context "A task that explicitly is queued to a different queue" do
|
21
|
+
setup { Resque.enqueue_to(:a_non_class_determined_queue, MediumPriorityJob) }
|
22
|
+
should "not queue to the class-determined queue" do
|
23
|
+
assert_equal 0, Resque.queue(MediumPriorityJob.queue).length
|
24
|
+
end
|
25
|
+
should "queue to the explicly-stated queue" do
|
26
|
+
assert_equal 1, Resque.queue(:a_non_class_determined_queue).length
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
context "A task that spawns multiple jobs on a single queue" do
|
31
|
+
setup do
|
32
|
+
3.times {Resque.enqueue(HighPriorityJob)}
|
33
|
+
end
|
34
|
+
|
35
|
+
should "allow partial runs with explicit limit" do
|
36
|
+
assert_equal 3, Resque.queue(:high).length, 'failed setup'
|
37
|
+
Resque.run_for!( :high, 1 )
|
38
|
+
assert_equal 2, Resque.queue(:high).length, 'failed to run just single job'
|
39
|
+
end
|
40
|
+
|
41
|
+
should "allow full run with too-large explicit limit" do
|
42
|
+
assert_equal 3, Resque.queue(:high).length, 'failed setup'
|
43
|
+
Resque.run_for!( :high, 50 )
|
44
|
+
assert_equal 0, Resque.queue(:high).length, 'failed to run all jobs'
|
45
|
+
end
|
46
|
+
|
47
|
+
should "allow full run with implicit limit" do
|
48
|
+
assert_equal 3, Resque.queue(:high).length, 'failed setup'
|
49
|
+
Resque.run_for!( :high )
|
50
|
+
assert_equal 0, Resque.queue(:high).length, 'failed to run all jobs'
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
20
54
|
context "A task that schedules a resque job" do
|
21
55
|
setup do
|
22
56
|
@returned = Resque.enqueue(LowPriorityJob)
|
@@ -82,6 +116,11 @@ class ResqueUnitTest < Test::Unit::TestCase
|
|
82
116
|
assert(JobWithHooks.markers[:after_enqueue], 'no after_queue marker set')
|
83
117
|
end
|
84
118
|
|
119
|
+
should "have run the before_enqueue hook" do
|
120
|
+
assert(JobWithHooks.markers[:before_enqueue], 'no before_queue marker set')
|
121
|
+
assert_queued(JobWithHooks)
|
122
|
+
end
|
123
|
+
|
85
124
|
should "run the before and after hooks during a run" do
|
86
125
|
Resque.run!
|
87
126
|
assert(JobWithHooks.markers[:before], 'no before marker set')
|
@@ -125,6 +164,18 @@ class ResqueUnitTest < Test::Unit::TestCase
|
|
125
164
|
end
|
126
165
|
end
|
127
166
|
|
167
|
+
context "when before_enqueue returns false" do
|
168
|
+
setup do
|
169
|
+
JobWithHooksBeforeBlocks.clear_markers
|
170
|
+
end
|
171
|
+
|
172
|
+
should "not queue" do
|
173
|
+
Resque.enqueue JobWithHooksBeforeBlocks
|
174
|
+
assert_not_queued JobWithHooksBeforeBlocks
|
175
|
+
end
|
176
|
+
|
177
|
+
end
|
178
|
+
|
128
179
|
context "but without around" do
|
129
180
|
setup do
|
130
181
|
JobWithHooksWithoutAround.clear_markers
|
data/test/sample_jobs.rb
CHANGED
@@ -53,6 +53,10 @@ module HooksMethods
|
|
53
53
|
def after_enqueue_mark(*args)
|
54
54
|
markers[:after_enqueue] = true
|
55
55
|
end
|
56
|
+
|
57
|
+
def before_enqueue_mark(*args)
|
58
|
+
markers[:before_enqueue] = true
|
59
|
+
end
|
56
60
|
|
57
61
|
def after_perform_mark(*args)
|
58
62
|
markers[:after] = true
|
@@ -108,6 +112,13 @@ class JobWithHooks
|
|
108
112
|
end
|
109
113
|
end
|
110
114
|
|
115
|
+
class JobWithHooksBeforeBlocks < JobWithHooks
|
116
|
+
@queue = :with_hooks
|
117
|
+
def self.before_enqueue_block_enqueueing
|
118
|
+
return false
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
111
122
|
class JobWithHooksWithoutBefore
|
112
123
|
extend HooksMethods
|
113
124
|
|
metadata
CHANGED
@@ -1,60 +1,56 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: resque_unit
|
3
|
-
version: !ruby/object:Gem::Version
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.4.1
|
4
5
|
prerelease:
|
5
|
-
version: 0.4.0
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Justin Weiss
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
dependencies:
|
16
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2011-10-14 00:00:00.000000000Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
17
15
|
name: json
|
18
|
-
requirement: &
|
16
|
+
requirement: &70242270906860 !ruby/object:Gem::Requirement
|
19
17
|
none: false
|
20
|
-
requirements:
|
21
|
-
- -
|
22
|
-
- !ruby/object:Gem::Version
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
23
21
|
version: 1.4.6
|
24
22
|
type: :runtime
|
25
23
|
prerelease: false
|
26
|
-
version_requirements: *
|
27
|
-
- !ruby/object:Gem::Dependency
|
24
|
+
version_requirements: *70242270906860
|
25
|
+
- !ruby/object:Gem::Dependency
|
28
26
|
name: bundler
|
29
|
-
requirement: &
|
27
|
+
requirement: &70242270906100 !ruby/object:Gem::Requirement
|
30
28
|
none: false
|
31
|
-
requirements:
|
32
|
-
- -
|
33
|
-
- !ruby/object:Gem::Version
|
34
|
-
version:
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: '0'
|
35
33
|
type: :development
|
36
34
|
prerelease: false
|
37
|
-
version_requirements: *
|
38
|
-
- !ruby/object:Gem::Dependency
|
35
|
+
version_requirements: *70242270906100
|
36
|
+
- !ruby/object:Gem::Dependency
|
39
37
|
name: shoulda
|
40
|
-
requirement: &
|
38
|
+
requirement: &70242270904960 !ruby/object:Gem::Requirement
|
41
39
|
none: false
|
42
|
-
requirements:
|
43
|
-
- -
|
44
|
-
- !ruby/object:Gem::Version
|
45
|
-
version:
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
46
44
|
type: :development
|
47
45
|
prerelease: false
|
48
|
-
version_requirements: *
|
46
|
+
version_requirements: *70242270904960
|
49
47
|
description:
|
50
48
|
email: justin@uberweiss.org
|
51
49
|
executables: []
|
52
|
-
|
53
50
|
extensions: []
|
54
|
-
|
55
|
-
extra_rdoc_files:
|
51
|
+
extra_rdoc_files:
|
56
52
|
- README.md
|
57
|
-
files:
|
53
|
+
files:
|
58
54
|
- lib/resque_unit/assertions.rb
|
59
55
|
- lib/resque_unit/errors.rb
|
60
56
|
- lib/resque_unit/helpers.rb
|
@@ -70,41 +66,37 @@ files:
|
|
70
66
|
- test/sample_jobs.rb
|
71
67
|
- test/test_helper.rb
|
72
68
|
- README.md
|
73
|
-
has_rdoc: true
|
74
69
|
homepage: http://github.com/justinweiss/resque_unit
|
75
70
|
licenses: []
|
76
|
-
|
77
71
|
post_install_message:
|
78
72
|
rdoc_options: []
|
79
|
-
|
80
|
-
require_paths:
|
73
|
+
require_paths:
|
81
74
|
- lib
|
82
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
75
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
83
76
|
none: false
|
84
|
-
requirements:
|
85
|
-
- -
|
86
|
-
- !ruby/object:Gem::Version
|
87
|
-
|
88
|
-
segments:
|
77
|
+
requirements:
|
78
|
+
- - ! '>='
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: '0'
|
81
|
+
segments:
|
89
82
|
- 0
|
90
|
-
|
91
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
83
|
+
hash: -2544515951238107368
|
84
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
92
85
|
none: false
|
93
|
-
requirements:
|
94
|
-
- -
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
|
97
|
-
segments:
|
86
|
+
requirements:
|
87
|
+
- - ! '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
segments:
|
98
91
|
- 0
|
99
|
-
|
92
|
+
hash: -2544515951238107368
|
100
93
|
requirements: []
|
101
|
-
|
102
94
|
rubyforge_project:
|
103
|
-
rubygems_version: 1.
|
95
|
+
rubygems_version: 1.8.3
|
104
96
|
signing_key:
|
105
97
|
specification_version: 3
|
106
98
|
summary: Test::Unit support for resque job queueing
|
107
|
-
test_files:
|
99
|
+
test_files:
|
108
100
|
- test/resque_test.rb
|
109
101
|
- test/resque_unit_scheduler_test.rb
|
110
102
|
- test/resque_unit_test.rb
|