resque-multi-step 1.0.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,81 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{resque-multi-step}
8
+ s.version = "1.0.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Peter Williams", "Morgan Whitney"]
12
+ s.date = %q{2010-10-04}
13
+ s.description = %q{Provides multi-step tasks with finalization and progress tracking}
14
+ s.email = %q{pezra@barelyenough.org}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.md"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ ".gitignore",
22
+ "LICENSE",
23
+ "README.md",
24
+ "Rakefile",
25
+ "VERSION",
26
+ "lib/resque-multi-step.rb",
27
+ "lib/resque/plugins/multi_step_task.rb",
28
+ "lib/resque/plugins/multi_step_task/assure_finalization.rb",
29
+ "lib/resque/plugins/multi_step_task/atomic_counters.rb",
30
+ "lib/resque/plugins/multi_step_task/constantization.rb",
31
+ "lib/resque/plugins/multi_step_task/finalization_job.rb",
32
+ "lib/resque_mutli_step.rb",
33
+ "resque-multi-step-task.gemspec",
34
+ "resque-multi-step.gemspec",
35
+ "spec/acceptance/acceptance_jobs.rb",
36
+ "spec/acceptance/job_handling_spec.rb",
37
+ "spec/acceptance/spec_helper.rb",
38
+ "spec/resque-multi-step_spec.rb",
39
+ "spec/resque/plugins/multi_step_task/finalization_job_spec.rb",
40
+ "spec/resque/plugins/multi_step_task_spec.rb",
41
+ "spec/spec.opts",
42
+ "spec/spec_helper.rb"
43
+ ]
44
+ s.homepage = %q{http://github.com/pezra/resque-multi-step}
45
+ s.rdoc_options = ["--charset=UTF-8"]
46
+ s.require_paths = ["lib"]
47
+ s.rubygems_version = %q{1.3.6}
48
+ s.summary = %q{Provides multi-step tasks with finalization and progress tracking}
49
+ s.test_files = [
50
+ "spec/acceptance/acceptance_jobs.rb",
51
+ "spec/acceptance/job_handling_spec.rb",
52
+ "spec/acceptance/spec_helper.rb",
53
+ "spec/resque/plugins/multi_step_task/finalization_job_spec.rb",
54
+ "spec/resque/plugins/multi_step_task_spec.rb",
55
+ "spec/resque-multi-step_spec.rb",
56
+ "spec/spec_helper.rb"
57
+ ]
58
+
59
+ if s.respond_to? :specification_version then
60
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
61
+ s.specification_version = 3
62
+
63
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
64
+ s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
65
+ s.add_runtime_dependency(%q<redis-namespace>, ["~> 0.8.0"])
66
+ s.add_runtime_dependency(%q<resque>, ["~> 1.10"])
67
+ s.add_runtime_dependency(%q<resque-fairly>, ["~> 1.0"])
68
+ else
69
+ s.add_dependency(%q<rspec>, [">= 1.2.9"])
70
+ s.add_dependency(%q<redis-namespace>, ["~> 0.8.0"])
71
+ s.add_dependency(%q<resque>, ["~> 1.10"])
72
+ s.add_dependency(%q<resque-fairly>, ["~> 1.0"])
73
+ end
74
+ else
75
+ s.add_dependency(%q<rspec>, [">= 1.2.9"])
76
+ s.add_dependency(%q<redis-namespace>, ["~> 0.8.0"])
77
+ s.add_dependency(%q<resque>, ["~> 1.10"])
78
+ s.add_dependency(%q<resque-fairly>, ["~> 1.0"])
79
+ end
80
+ end
81
+
@@ -0,0 +1,31 @@
1
+ module MultiStepAcceptance
2
+ class WaitJob
3
+ def self.perform(duration)
4
+ sleep duration
5
+ end
6
+ end
7
+
8
+ class CounterJob
9
+ def self.perform(key)
10
+ Resque.redis.incr key
11
+ end
12
+ end
13
+
14
+ class FailJob
15
+ def self.perform
16
+ raise "boom"
17
+ end
18
+ end
19
+
20
+ class FailOnceJob
21
+ def self.perform(key)
22
+ if Resque.redis.exists(key)
23
+ return
24
+ else
25
+ Resque.redis.set(key, 'was here')
26
+ raise "boom"
27
+ end
28
+ end
29
+ end
30
+
31
+ end
@@ -0,0 +1,121 @@
1
+ require File.expand_path("spec_helper", File.dirname(__FILE__))
2
+ require 'resque/plugins/multi_step_task'
3
+
4
+ # These tests are inherently sensitive to timing. There are sleeps a
5
+ # the appropriate places to reduce/eliminate false failures where
6
+ # possible. However, a failure does not always indicate a bug. Run
7
+ # the test multiple times before accepting failures at face value.
8
+
9
+ describe "Acceptance: Successful task" do
10
+ let(:task) {
11
+ Resque::Plugins::MultiStepTask.create("testing") do |task|
12
+ task.add_job MultiStepAcceptance::CounterJob, "testing counter"
13
+ end
14
+ }
15
+
16
+ before do
17
+ Resque.redis.del "testing counter"
18
+ task
19
+ sleep 1
20
+ end
21
+
22
+ it "processes its job" do
23
+ Resque.redis.get("testing counter").to_i.should == 1
24
+ end
25
+
26
+ it "removes queue when done" do
27
+ Resque.queues.should_not include(task.queue_name)
28
+ end
29
+ end
30
+
31
+ describe "Acceptance: Successful tasks" do
32
+ let(:task) {
33
+ Resque::Plugins::MultiStepTask.create("testing") do |task|
34
+ task.add_job MultiStepAcceptance::WaitJob, 1
35
+ end
36
+ }
37
+
38
+ before {task}
39
+
40
+ it "create queue" do
41
+ Resque.queues.should include(task.queue_name)
42
+ end
43
+
44
+ it "queues jobs in its queue" do
45
+ Resque.peek(task.queue_name).should_not be_nil
46
+ end
47
+
48
+ end
49
+
50
+ describe "Acceptance: Task with step failure" do
51
+ let(:task) {
52
+ Resque::Plugins::MultiStepTask.create("testing") do |task|
53
+ task.add_job MultiStepAcceptance::FailJob
54
+ end
55
+ }
56
+
57
+ before do
58
+ Resque::Failure.clear
59
+ task
60
+ sleep 1
61
+ end
62
+
63
+ it "put job in fail list" do
64
+ Resque::Failure.count.should == 1
65
+ end
66
+
67
+ end
68
+
69
+ describe "Acceptance: Task with finalization failure" do
70
+ let(:task) {
71
+ Resque.redis.del "testing counter"
72
+ Resque::Plugins::MultiStepTask.create("testing") do |task|
73
+ task.add_finalization_job MultiStepAcceptance::FailJob
74
+ end
75
+ }
76
+
77
+ before do
78
+ Resque::Failure.clear
79
+ task
80
+ sleep 1
81
+ end
82
+
83
+ it "put job in fail list" do
84
+ 5.times {sleep 1 if Resque::Failure.count < 1}
85
+
86
+ Resque::Failure.count.should == 1
87
+ end
88
+ end
89
+
90
+ describe "Acceptance: Task with retried finalization failure" do
91
+ let(:task) {
92
+ Resque.redis.del "testing counter"
93
+ Resque::Plugins::MultiStepTask.create("testing") do |task|
94
+ task.add_finalization_job MultiStepAcceptance::FailOnceJob, "fin-job"
95
+ task.add_finalization_job MultiStepAcceptance::CounterJob,"testing counter"
96
+ end
97
+ }
98
+
99
+ before do
100
+ Resque::Failure.clear
101
+ Resque.redis.del "testing counter"
102
+
103
+ task
104
+ sleep 1
105
+
106
+ Resque::Failure.requeue 0
107
+ sleep 1
108
+ end
109
+
110
+ it "completes task" do
111
+ lambda {
112
+ Resque::Plugins::MultiStepTask.find(task.task_id)
113
+ }.should raise_error(Resque::Plugins::MultiStepTask::NoSuchMultiStepTask)
114
+ end
115
+
116
+
117
+ it "runs following finalization jobs" do
118
+ Resque.redis.get("testing counter").to_i.should == 1
119
+ end
120
+
121
+ end
@@ -0,0 +1,13 @@
1
+ require File.expand_path("../spec_helper", File.dirname(__FILE__))
2
+
3
+ $LOAD_PATH << File.dirname(__FILE__)
4
+ require 'acceptance_jobs'
5
+
6
+ $worker_pid = fork
7
+ if $worker_pid.nil?
8
+ # in child
9
+ exec "rake resque:work 'QUEUES=*' 'NAMESPACE=resque-multi-step-task-testing' INTERVAL=1 VERBOSE=1"
10
+ end
11
+
12
+ # wait for worker to come up
13
+ sleep 4
@@ -0,0 +1,34 @@
1
+ require File.expand_path("../../../spec_helper", File.dirname(__FILE__))
2
+
3
+ module Resque::Plugins
4
+ class MultiStepTask
5
+ describe FinalizationJob do
6
+ let(:task){MultiStepTask.create("some-task")}
7
+
8
+ before do
9
+ task.finalizable!
10
+ end
11
+
12
+ it "queues next finalization job when done" do
13
+ Resque::Job.should_receive(:create).with(anything, Resque::Plugins::MultiStepTask::FinalizationJob, task.task_id, 'TestJob', 42)
14
+
15
+ task.add_finalization_job(TestJob, 42)
16
+
17
+ FinalizationJob.perform(task.task_id, 'TestJob', 0)
18
+ end
19
+
20
+ it "cleans up on the last job" do
21
+ task.should_receive(:nuke)
22
+ MultiStepTask.stub!(:find).and_return(task)
23
+
24
+ FinalizationJob.perform(task.task_id, 'TestJob', 0)
25
+ end
26
+ end
27
+ end
28
+ end
29
+
30
+ module ::TestJob
31
+ def self.perform(*args)
32
+ # no op
33
+ end
34
+ end
@@ -0,0 +1,235 @@
1
+ require File.expand_path("../../spec_helper", File.dirname(__FILE__))
2
+
3
+ module Resque::Plugins
4
+ describe MultiStepTask, "class" do
5
+ it "allows creating new tasks" do
6
+ MultiStepTask.create("brand-new-task").should be_kind_of(MultiStepTask)
7
+ end
8
+
9
+ it "allows creating new tasks with job specification block" do
10
+ MultiStepTask.create("brand-new-task") do |task|
11
+ task.add_job(TestJob)
12
+ end.should be_kind_of(MultiStepTask)
13
+ end
14
+
15
+ it "uniquifies task queues when creating new task with same slug as and existing one" do
16
+ a = MultiStepTask.create("some-task")
17
+ b = MultiStepTask.create("some-task")
18
+
19
+ a.queue_name.should_not == b.queue_name
20
+ end
21
+
22
+ it "allows finding existing tasks" do
23
+ task_id = MultiStepTask.create("some-task").task_id
24
+
25
+ MultiStepTask.find(task_id).should be_kind_of(MultiStepTask)
26
+ MultiStepTask.find(task_id).task_id.should == task_id
27
+ end
28
+
29
+ it "raises exception on #find for non-existent task" do
30
+ lambda{
31
+ MultiStepTask.find('nonexistent-task')
32
+ }.should raise_error(MultiStepTask::NoSuchMultiStepTask)
33
+ end
34
+
35
+ it "allows mode to be set to :sync" do
36
+ MultiStepTask.mode = :sync
37
+ MultiStepTask.should be_synchronous
38
+ end
39
+
40
+ it "allows mode to be set to :async" do
41
+ MultiStepTask.mode = :async
42
+ MultiStepTask.should_not be_synchronous
43
+ end
44
+ end
45
+
46
+ describe MultiStepTask do
47
+ let(:task) {MultiStepTask.create("some-task")}
48
+
49
+ it "allows jobs to be added to task" do
50
+ lambda {
51
+ task.add_job(TestJob)
52
+ }.should_not raise_error
53
+ end
54
+
55
+ it "queues added job" do
56
+ Resque::Job.should_receive(:create).with(task.queue_name, Resque::Plugins::MultiStepTask, task.task_id, 'TestJob')
57
+ task.add_job(TestJob)
58
+ end
59
+
60
+ it "allows finalization jobs to be added" do
61
+ task.add_finalization_job(TestJob)
62
+ end
63
+
64
+ it "allows itself to become finalizable" do
65
+ task.finalizable!
66
+ task.should be_finalizable
67
+ end
68
+
69
+ it "queues assure finalization job when it becomes finalizable" do
70
+ Resque::Job.should_receive(:create).with(task.queue_name, ::Resque::Plugins::MultiStepTask::AssureFinalization, task.task_id)
71
+ task.finalizable!
72
+ end
73
+
74
+ it "knows total job count" do
75
+ task.add_job(TestJob)
76
+
77
+ task.total_job_count.should == 1
78
+ end
79
+
80
+ it "includes finalization jobs in total job count" do
81
+ task.add_job(TestJob)
82
+ task.add_finalization_job(TestJob, "my", "args")
83
+
84
+ task.total_job_count.should == 2
85
+ end
86
+ end
87
+
88
+ describe MultiStepTask, "synchronous mode" do
89
+ let(:task){MultiStepTask.create("some-task")}
90
+
91
+ before do
92
+ MultiStepTask.mode = :sync
93
+ end
94
+
95
+ after do
96
+ MultiStepTask.mode = :async
97
+ end
98
+
99
+ it "runs job when added" do
100
+ TestJob.should_receive(:perform).with("my", "args")
101
+ task.add_job(TestJob, "my", "args")
102
+ end
103
+
104
+ it "runs finalization job when added" do
105
+ TestJob.should_receive(:perform).with("my", "args")
106
+ task.add_finalization_job(TestJob, "my", "args")
107
+ task.finalizable!
108
+ end
109
+
110
+ it "runs finalization jobs last" do
111
+ TestJob.should_receive(:perform).with("my", "args").ordered
112
+ MyFinalJob.should_receive(:perform).with("final", "args").ordered
113
+
114
+ task.add_finalization_job(MyFinalJob, "final", "args")
115
+ task.add_job(TestJob, "my", "args")
116
+ task.finalizable!
117
+ end
118
+ end
119
+
120
+ describe MultiStepTask, "finalization" do
121
+ let(:task){MultiStepTask.create("some-task")}
122
+
123
+ before do
124
+ task.finalizable!
125
+ end
126
+
127
+ it "queue finalization jobs" do
128
+ Resque::Job.should_receive(:create).with(anything, Resque::Plugins::MultiStepTask::FinalizationJob, task.task_id, 'TestJob', 42)
129
+
130
+ task.add_finalization_job(TestJob, 42)
131
+ task.finalize!
132
+ end
133
+
134
+ it "initiates finalization at end of last job" do
135
+ task.add_finalization_job(TestJob, 42)
136
+
137
+ Resque::Job.should_receive(:create).with(anything, Resque::Plugins::MultiStepTask::FinalizationJob, task.task_id, 'TestJob', 42)
138
+ Resque::Job.reserve(task.queue_name).perform
139
+ end
140
+
141
+ it "removes queue from resque" do
142
+ task.add_job(TestJob) # creates queue
143
+ MultiStepTask.perform(task.task_id, 'TestJob') # simulate runing final job
144
+
145
+ Resque.queues.should_not include(task.task_id)
146
+ end
147
+
148
+ it "fails if finalization has already been run" do
149
+ task.finalize!
150
+ lambda{task.finalize!}.should raise_error(::Resque::Plugins::MultiStepTask::FinalizationAlreadyBegun)
151
+ end
152
+
153
+ it "fails if task is not yet finalizable" do
154
+ task = MultiStepTask.create("some-task")
155
+ lambda{task.finalize!}.should raise_error(::Resque::Plugins::MultiStepTask::NotReadyForFinalization)
156
+ end
157
+
158
+ it "fails if task has errors" do
159
+ TestJob.should_receive(:perform).and_raise('boo')
160
+ task = MultiStepTask.create("some-task")
161
+ MultiStepTask.perform(task.task_id, 'TestJob') rescue nil
162
+
163
+ lambda{task.finalize!}.should raise_error(::Resque::Plugins::MultiStepTask::NotReadyForFinalization)
164
+ end
165
+
166
+ end
167
+
168
+ describe MultiStepTask, "performing job" do
169
+ let(:task){MultiStepTask.create("some-task")}
170
+
171
+ it "invokes specified job when #perform is called" do
172
+ TestJob.should_receive(:perform).with(42, 'aaa')
173
+
174
+ MultiStepTask.perform(task.task_id, 'TestJob', 42, 'aaa')
175
+ end
176
+
177
+ it "increments completed count on job success" do
178
+ lambda{
179
+ MultiStepTask.perform(task.task_id, 'TestJob', 42, 'aaa')
180
+ }.should change(task, :completed_count).by(1)
181
+ end
182
+ end
183
+
184
+ describe MultiStepTask, "performing job that fails" do
185
+ let(:task){MultiStepTask.create("some-task")}
186
+
187
+ before do
188
+ TestJob.should_receive(:perform).and_raise('boo')
189
+ end
190
+
191
+ it "increments failed count" do
192
+ lambda{
193
+ MultiStepTask.perform(task.task_id, 'TestJob', 42, 'aaa') rescue nil
194
+ }.should change(task, :failed_count).by(1)
195
+ end
196
+
197
+ it "does not increment completed count" do
198
+ lambda{
199
+ MultiStepTask.perform(task.task_id, 'TestJob', 42, 'aaa') rescue nil
200
+ }.should_not change(task, :completed_count).by(1)
201
+ end
202
+
203
+ it "bubbles raised exception job up to resque" do
204
+ lambda{
205
+ MultiStepTask.perform(task.task_id, 'TestJob', 42, 'aaa')
206
+ }.should raise_exception("boo")
207
+ end
208
+
209
+ it "knows it is incomplete because of failures" do
210
+ task.increment_normal_job_count
211
+ MultiStepTask.perform(task.task_id, 'TestJob', 42, 'aaa') rescue nil
212
+
213
+ task.should be_incomplete_because_of_errors
214
+ end
215
+
216
+ it "knows it is complete when failures have occurred and have been retried successfully" do
217
+ MultiStepTask.perform(task.task_id, 'TestJob', 42, 'aaa') rescue nil
218
+
219
+ task.should_not be_incomplete_because_of_errors
220
+ end
221
+ end
222
+ end
223
+
224
+ module ::TestJob
225
+ def self.perform(*args)
226
+ # no op
227
+ end
228
+ end
229
+
230
+ module ::MyFinalJob
231
+ def self.perform(*args)
232
+ # no op
233
+ end
234
+ end
235
+
@@ -0,0 +1,7 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "ResqueMultiStepTask" do
4
+ it "defines MultiStepTask" do
5
+ defined?(Resque::Plugins::MultiStepTask).should be_true
6
+ end
7
+ end
data/spec/spec.opts ADDED
@@ -0,0 +1 @@
1
+ --format=specdoc
@@ -0,0 +1,16 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
+ require 'resque-multi-step'
4
+ require 'spec'
5
+ require 'spec/autorun'
6
+ require 'pp'
7
+
8
+ Spec::Runner.configure do |config|
9
+ config.before do
10
+ # Tests are jailed to a testing namespace and that space does
11
+ # contains in left over data from previous runs.
12
+ Resque.redis.namespace = "resque-multi-step-task-testing"
13
+ Resque.redis.keys('*').each{|k| Resque.redis.del k}
14
+
15
+ end
16
+ end
metadata ADDED
@@ -0,0 +1,145 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: resque-multi-step
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 1
7
+ - 0
8
+ - 0
9
+ version: 1.0.0
10
+ platform: ruby
11
+ authors:
12
+ - Peter Williams
13
+ - Morgan Whitney
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-10-04 00:00:00 -06:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: rspec
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ segments:
29
+ - 1
30
+ - 2
31
+ - 9
32
+ version: 1.2.9
33
+ type: :development
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: redis-namespace
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ~>
41
+ - !ruby/object:Gem::Version
42
+ segments:
43
+ - 0
44
+ - 8
45
+ - 0
46
+ version: 0.8.0
47
+ type: :runtime
48
+ version_requirements: *id002
49
+ - !ruby/object:Gem::Dependency
50
+ name: resque
51
+ prerelease: false
52
+ requirement: &id003 !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ~>
55
+ - !ruby/object:Gem::Version
56
+ segments:
57
+ - 1
58
+ - 10
59
+ version: "1.10"
60
+ type: :runtime
61
+ version_requirements: *id003
62
+ - !ruby/object:Gem::Dependency
63
+ name: resque-fairly
64
+ prerelease: false
65
+ requirement: &id004 !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ segments:
70
+ - 1
71
+ - 0
72
+ version: "1.0"
73
+ type: :runtime
74
+ version_requirements: *id004
75
+ description: Provides multi-step tasks with finalization and progress tracking
76
+ email: pezra@barelyenough.org
77
+ executables: []
78
+
79
+ extensions: []
80
+
81
+ extra_rdoc_files:
82
+ - LICENSE
83
+ - README.md
84
+ files:
85
+ - .document
86
+ - .gitignore
87
+ - LICENSE
88
+ - README.md
89
+ - Rakefile
90
+ - VERSION
91
+ - lib/resque-multi-step.rb
92
+ - lib/resque/plugins/multi_step_task.rb
93
+ - lib/resque/plugins/multi_step_task/assure_finalization.rb
94
+ - lib/resque/plugins/multi_step_task/atomic_counters.rb
95
+ - lib/resque/plugins/multi_step_task/constantization.rb
96
+ - lib/resque/plugins/multi_step_task/finalization_job.rb
97
+ - lib/resque_mutli_step.rb
98
+ - resque-multi-step-task.gemspec
99
+ - resque-multi-step.gemspec
100
+ - spec/acceptance/acceptance_jobs.rb
101
+ - spec/acceptance/job_handling_spec.rb
102
+ - spec/acceptance/spec_helper.rb
103
+ - spec/resque-multi-step_spec.rb
104
+ - spec/resque/plugins/multi_step_task/finalization_job_spec.rb
105
+ - spec/resque/plugins/multi_step_task_spec.rb
106
+ - spec/spec.opts
107
+ - spec/spec_helper.rb
108
+ has_rdoc: true
109
+ homepage: http://github.com/pezra/resque-multi-step
110
+ licenses: []
111
+
112
+ post_install_message:
113
+ rdoc_options:
114
+ - --charset=UTF-8
115
+ require_paths:
116
+ - lib
117
+ required_ruby_version: !ruby/object:Gem::Requirement
118
+ requirements:
119
+ - - ">="
120
+ - !ruby/object:Gem::Version
121
+ segments:
122
+ - 0
123
+ version: "0"
124
+ required_rubygems_version: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ segments:
129
+ - 0
130
+ version: "0"
131
+ requirements: []
132
+
133
+ rubyforge_project:
134
+ rubygems_version: 1.3.6
135
+ signing_key:
136
+ specification_version: 3
137
+ summary: Provides multi-step tasks with finalization and progress tracking
138
+ test_files:
139
+ - spec/acceptance/acceptance_jobs.rb
140
+ - spec/acceptance/job_handling_spec.rb
141
+ - spec/acceptance/spec_helper.rb
142
+ - spec/resque/plugins/multi_step_task/finalization_job_spec.rb
143
+ - spec/resque/plugins/multi_step_task_spec.rb
144
+ - spec/resque-multi-step_spec.rb
145
+ - spec/spec_helper.rb