backburner 1.1.0 → 1.2.0.pre

Sign up to get free protection for your applications and to get access to all the features.
@@ -11,65 +11,72 @@ describe "Backburner::Worker module" do
11
11
  describe "for enqueue class method" do
12
12
  it "should support enqueuing plain job" do
13
13
  Backburner::Worker.enqueue TestPlainJob, [7, 9], :ttr => 100, :pri => 2000
14
- job, body = pop_one_job("test-plain")
15
- assert_equal "TestPlainJob", body["class"]
16
- assert_equal [7, 9], body["args"]
17
- assert_equal 100, job.ttr
18
- assert_equal 2000, job.pri
14
+ pop_one_job("test-plain") do |job, body|
15
+ assert_equal "TestPlainJob", body["class"]
16
+ assert_equal [7, 9], body["args"]
17
+ assert_equal 100, job.ttr
18
+ assert_equal 2000, job.pri
19
+ end
19
20
  end # plain
20
21
 
21
22
  it "should support enqueuing job with class queue priority" do
22
23
  Backburner::Worker.enqueue TestJob, [3, 4], :ttr => 100
23
- job, body = pop_one_job
24
- assert_equal "TestJob", body["class"]
25
- assert_equal [3, 4], body["args"]
26
- assert_equal 100, job.ttr
27
- assert_equal 100, job.pri
24
+ pop_one_job do |job, body|
25
+ assert_equal "TestJob", body["class"]
26
+ assert_equal [3, 4], body["args"]
27
+ assert_equal 100, job.ttr
28
+ assert_equal 100, job.pri
29
+ end
28
30
  end # queue priority
29
31
 
30
32
  it "should support enqueuing job with specified named priority" do
31
33
  Backburner::Worker.enqueue TestJob, [3, 4], :ttr => 100, :pri => 'high'
32
- job, body = pop_one_job
33
- assert_equal "TestJob", body["class"]
34
- assert_equal [3, 4], body["args"]
35
- assert_equal 100, job.ttr
36
- assert_equal 0, job.pri
34
+ pop_one_job do |job, body|
35
+ assert_equal "TestJob", body["class"]
36
+ assert_equal [3, 4], body["args"]
37
+ assert_equal 100, job.ttr
38
+ assert_equal 0, job.pri
39
+ end
37
40
  end # queue named priority
38
41
 
39
42
  it "should support enqueuing job with class queue respond_timeout" do
40
43
  Backburner::Worker.enqueue TestJob, [3, 4]
41
- job, body = pop_one_job
42
- assert_equal "TestJob", body["class"]
43
- assert_equal [3, 4], body["args"]
44
- assert_equal 300, job.ttr
45
- assert_equal 100, job.pri
44
+ pop_one_job do |job, body|
45
+ assert_equal "TestJob", body["class"]
46
+ assert_equal [3, 4], body["args"]
47
+ assert_equal 300, job.ttr
48
+ assert_equal 100, job.pri
49
+ end
46
50
  end # queue respond_timeout
47
51
 
48
52
  it "should support enqueuing job with custom queue" do
49
53
  Backburner::Worker.enqueue TestJob, [6, 7], :queue => "test.bar", :pri => 5000
50
- job, body = pop_one_job("test.bar")
51
- assert_equal "TestJob", body["class"]
52
- assert_equal [6, 7], body["args"]
53
- assert_equal 0, job.delay
54
- assert_equal 5000, job.pri
55
- assert_equal 300, job.ttr
54
+ pop_one_job("test.bar") do |job, body|
55
+ assert_equal "TestJob", body["class"]
56
+ assert_equal [6, 7], body["args"]
57
+ assert_equal 0, job.delay
58
+ assert_equal 5000, job.pri
59
+ assert_equal 300, job.ttr
60
+ end
56
61
  end # custom
57
62
 
58
63
  it "should support async job" do
59
64
  TestAsyncJob.async(:ttr => 100, :queue => "bar.baz.foo").foo(10, 5)
60
- job, body = pop_one_job("bar.baz.foo")
61
- assert_equal "TestAsyncJob", body["class"]
62
- assert_equal [nil, "foo", 10, 5], body["args"]
63
- assert_equal 100, job.ttr
64
- assert_equal Backburner.configuration.default_priority, job.pri
65
+ pop_one_job("bar.baz.foo") do |job, body|
66
+ assert_equal "TestAsyncJob", body["class"]
67
+ assert_equal [nil, "foo", 10, 5], body["args"]
68
+ assert_equal 100, job.ttr
69
+ assert_equal Backburner.configuration.default_priority, job.pri
70
+ end
65
71
  end # async
66
72
 
67
73
  it "should support enqueueing job with lambda queue" do
68
74
  expected_queue_name = TestLambdaQueueJob.calculated_queue_name
69
75
  Backburner::Worker.enqueue TestLambdaQueueJob, [6, 7], :queue => lambda { |klass| klass.calculated_queue_name }
70
- job, body = pop_one_job(expected_queue_name)
71
- assert_equal "TestLambdaQueueJob", body["class"]
72
- assert_equal [6, 7], body["args"]
76
+ pop_one_job(expected_queue_name) do |job, body|
77
+ assert_equal "TestLambdaQueueJob", body["class"]
78
+ assert_equal [6, 7], body["args"]
79
+ end
73
80
  end
74
81
  end # enqueue
75
82
 
@@ -82,13 +89,6 @@ describe "Backburner::Worker module" do
82
89
  end
83
90
  end # start
84
91
 
85
- describe "for connection class method" do
86
- it "should return the beanstalk connection" do
87
- assert_equal "beanstalk://localhost", Backburner::Worker.connection.url
88
- assert_kind_of Beaneater, Backburner::Worker.connection.beanstalk
89
- end
90
- end # connection
91
-
92
92
  describe "for tube_names accessor" do
93
93
  before do
94
94
  Backburner.default_queues << "baz"
@@ -19,7 +19,7 @@ describe "Backburner::Workers::Forking module" do
19
19
  worker = @worker_class.new(["foo", "bar"])
20
20
  out = capture_stdout { worker.prepare }
21
21
  assert_equal ["demo.test.foo", "demo.test.bar"], worker.tube_names
22
- assert_same_elements ["demo.test.foo", "demo.test.bar"], @worker_class.connection.tubes.watched.map(&:name)
22
+ assert_same_elements ["demo.test.foo", "demo.test.bar"], worker.connection.tubes.watched.map(&:name)
23
23
  assert_match(/demo\.test\.foo/, out)
24
24
  end # multiple
25
25
 
@@ -27,7 +27,7 @@ describe "Backburner::Workers::Forking module" do
27
27
  worker = @worker_class.new("foo")
28
28
  out = capture_stdout { worker.prepare }
29
29
  assert_equal ["demo.test.foo"], worker.tube_names
30
- assert_same_elements ["demo.test.foo"], @worker_class.connection.tubes.watched.map(&:name)
30
+ assert_same_elements ["demo.test.foo"], worker.connection.tubes.watched.map(&:name)
31
31
  assert_match(/demo\.test\.foo/, out)
32
32
  end # single
33
33
 
@@ -36,7 +36,7 @@ describe "Backburner::Workers::Forking module" do
36
36
  worker = @worker_class.new
37
37
  out = capture_stdout { worker.prepare }
38
38
  assert_equal ["demo.test.foo", "demo.test.bar"], worker.tube_names
39
- assert_same_elements ["demo.test.foo", "demo.test.bar"], @worker_class.connection.tubes.watched.map(&:name)
39
+ assert_same_elements ["demo.test.foo", "demo.test.bar"], worker.connection.tubes.watched.map(&:name)
40
40
  assert_match(/demo\.test\.foo/, out)
41
41
  end
42
42
 
@@ -45,7 +45,7 @@ describe "Backburner::Workers::Forking module" do
45
45
  worker = @worker_class.new
46
46
  out = capture_stdout { worker.prepare }
47
47
  assert_equal ["demo.test.bar"], worker.tube_names
48
- assert_same_elements ["demo.test.bar"], @worker_class.connection.tubes.watched.map(&:name)
48
+ assert_same_elements ["demo.test.bar"], worker.connection.tubes.watched.map(&:name)
49
49
  assert_match(/demo\.test\.bar/, out)
50
50
  end # all assign
51
51
 
@@ -53,24 +53,21 @@ describe "Backburner::Workers::Forking module" do
53
53
  worker = @worker_class.new
54
54
  out = capture_stdout { worker.prepare }
55
55
  assert_contains worker.tube_names, "demo.test.backburner-jobs"
56
- assert_contains @worker_class.connection.tubes.watched.map(&:name), "demo.test.backburner-jobs"
57
- assert_match(/demo\.test\.test-job/, out)
56
+ assert_contains worker.connection.tubes.watched.map(&:name), "demo.test.backburner-jobs"
57
+ assert_match(/demo\.test\.backburner-jobs/, out)
58
58
  end # all read
59
59
  end # prepare
60
60
 
61
61
  describe "for fork_one_job method" do
62
62
 
63
- it "should fork, reconnect, work job, and exit" do
63
+ it "should fork, work job, and exit" do
64
64
  clear_jobs!("bar.foo")
65
65
  @worker_class.enqueue TestJobForking, [1, 2], :queue => "bar.foo"
66
66
 
67
67
  fake_pid = 45
68
- Process.expects(:fork).returns(fake_pid) do |&block|
69
- Connection.expects(:new).with(Backburner.configuration.beanstalk_url)
70
- @worker_class.any_instance.expects(:work_one_job)
71
- @worker_class.any_instance.expects(:coolest_exit)
72
- block.call
73
- end
68
+ Process.expects(:fork).returns(fake_pid).yields
69
+ @worker_class.any_instance.expects(:work_one_job)
70
+ @worker_class.any_instance.expects(:coolest_exit)
74
71
  Process.expects(:wait).with(fake_pid)
75
72
 
76
73
  silenced(2) do
@@ -19,7 +19,7 @@ describe "Backburner::Workers::Basic module" do
19
19
  worker = @worker_class.new(["foo", "bar"])
20
20
  out = capture_stdout { worker.prepare }
21
21
  assert_equal ["demo.test.foo", "demo.test.bar"], worker.tube_names
22
- assert_same_elements ["demo.test.foo", "demo.test.bar"], @worker_class.connection.tubes.watched.map(&:name)
22
+ assert_same_elements ["demo.test.foo", "demo.test.bar"], worker.connection.tubes.watched.map(&:name)
23
23
  assert_match(/demo\.test\.foo/, out)
24
24
  end # multiple
25
25
 
@@ -27,7 +27,7 @@ describe "Backburner::Workers::Basic module" do
27
27
  worker = @worker_class.new("foo")
28
28
  out = capture_stdout { worker.prepare }
29
29
  assert_equal ["demo.test.foo"], worker.tube_names
30
- assert_same_elements ["demo.test.foo"], @worker_class.connection.tubes.watched.map(&:name)
30
+ assert_same_elements ["demo.test.foo"], worker.connection.tubes.watched.map(&:name)
31
31
  assert_match(/demo\.test\.foo/, out)
32
32
  end # single
33
33
 
@@ -36,7 +36,7 @@ describe "Backburner::Workers::Basic module" do
36
36
  worker = @worker_class.new
37
37
  out = capture_stdout { worker.prepare }
38
38
  assert_equal ["demo.test.foo", "demo.test.bar"], worker.tube_names
39
- assert_same_elements ["demo.test.foo", "demo.test.bar"], @worker_class.connection.tubes.watched.map(&:name)
39
+ assert_same_elements ["demo.test.foo", "demo.test.bar"], worker.connection.tubes.watched.map(&:name)
40
40
  assert_match(/demo\.test\.foo/, out)
41
41
  end
42
42
 
@@ -45,7 +45,7 @@ describe "Backburner::Workers::Basic module" do
45
45
  worker = @worker_class.new
46
46
  out = capture_stdout { worker.prepare }
47
47
  assert_equal ["demo.test.bar"], worker.tube_names
48
- assert_same_elements ["demo.test.bar"], @worker_class.connection.tubes.watched.map(&:name)
48
+ assert_same_elements ["demo.test.bar"], worker.connection.tubes.watched.map(&:name)
49
49
  assert_match(/demo\.test\.bar/, out)
50
50
  end # all assign
51
51
 
@@ -53,7 +53,7 @@ describe "Backburner::Workers::Basic module" do
53
53
  worker = @worker_class.new
54
54
  out = capture_stdout { worker.prepare }
55
55
  assert_contains worker.tube_names, "demo.test.backburner-jobs"
56
- assert_contains @worker_class.connection.tubes.watched.map(&:name), "demo.test.backburner-jobs"
56
+ assert_contains worker.connection.tubes.watched.map(&:name), "demo.test.backburner-jobs"
57
57
  assert_match(/demo\.test\.backburner-jobs/, out)
58
58
  end # all read
59
59
  end # prepare
@@ -99,11 +99,16 @@ describe "Backburner::Workers::Basic module" do
99
99
  end # fail, argument
100
100
 
101
101
  it "should work an enqueued failing job" do
102
- clear_jobs!("foo.bar")
103
- @worker_class.enqueue TestFailJob, [1, 2], :queue => "foo.bar"
102
+ # NB: The #bury expectation below leaves the job in the queue (as reserved!)
103
+ # since bury is never actually called on the task. Therefore, clear_jobs!()
104
+ # can't remove it which can break a lot of things depending on the order the
105
+ # tests are run. So we ensure that it's using a unique queue name. Mocha
106
+ # lacks expectations with proxies (where we could actually call bury)
107
+ clear_jobs!('foo.bar.failed')
108
+ @worker_class.enqueue TestFailJob, [1, 2], :queue => 'foo.bar.failed'
104
109
  Backburner::Job.any_instance.expects(:bury).once
105
110
  out = silenced(2) do
106
- worker = @worker_class.new('foo.bar')
111
+ worker = @worker_class.new('foo.bar.failed')
107
112
  worker.prepare
108
113
  worker.work_one_job
109
114
  end
@@ -275,12 +280,13 @@ describe "Backburner::Workers::Basic module" do
275
280
 
276
281
  it "should support event hooks with stopping enqueue" do
277
282
  $hooked_fail_count = 0
283
+ worker = @worker_class.new('foo.bar.events.retry2')
278
284
  clear_jobs!('foo.bar.events.retry2')
279
285
  silenced(2) do
280
286
  HookedObjectBeforeEnqueueFail.async(:queue => 'foo.bar.events.retry2').foo(5)
281
287
  end
282
288
  expanded_tube = [Backburner.configuration.tube_namespace, 'foo.bar.events.retry2'].join(".")
283
- assert_nil @worker_class.connection.tubes[expanded_tube].peek(:ready)
289
+ assert_nil worker.connection.tubes[expanded_tube].peek(:ready)
284
290
  end # stopping enqueue
285
291
 
286
292
  it "should support event hooks with stopping perform" do
@@ -299,11 +305,18 @@ describe "Backburner::Workers::Basic module" do
299
305
  refute_match(/HookFailError/, out)
300
306
  end # stopping perform
301
307
 
308
+ it "should use the connection given as an argument" do
309
+ worker = @worker_class.new('foo.bar')
310
+ connection = mock('connection')
311
+ worker.expects(:reserve_job).with(connection).returns(stub_everything('job'))
312
+ worker.work_one_job(connection)
313
+ end
314
+
302
315
  after do
303
316
  Backburner.configure do |config|
304
317
  config.max_job_retries = 0
305
318
  config.retry_delay = 5
306
- config.retry_delay_proc = lambda { |min_retry_delay, num_retries| min_retry_delay + (num_retries ** 3) }
319
+ config.retry_delay_proc = lambda { |min_retry_delay, num_retries| min_retry_delay + (num_retries ** 3) }
307
320
  end
308
321
  end
309
322
  end # work_one_job
@@ -176,7 +176,7 @@ describe "Backburner::Workers::ThreadsOnFork module" do
176
176
  worker.prepare
177
177
  worker.fork_inner('demo.test.bar')
178
178
  end
179
- assert_same_elements %W(demo.test.bar), @worker_class.connection.tubes.watched.map(&:name)
179
+ assert_same_elements %W(demo.test.bar), worker.connection.tubes.watched.map(&:name)
180
180
  end
181
181
 
182
182
  it "should not create threads if the number of threads is 1" do
@@ -204,7 +204,6 @@ describe "Backburner::Workers::ThreadsOnFork module" do
204
204
  worker = @worker_class.new(%(foo))
205
205
  @worker_class.expects(:threads_number).returns(5)
206
206
  worker.expects(:run_while_can).times(5)
207
- # TODO
208
207
  def worker.create_thread(*args, &block); block.call(*args) end
209
208
  silenced do
210
209
  worker.prepare
@@ -218,17 +217,19 @@ describe "Backburner::Workers::ThreadsOnFork module" do
218
217
 
219
218
  worker = @worker_class.new(%(foo))
220
219
  @worker_class.expects(:threads_number).returns(num_threads)
221
- invocations = Array(1..num_threads).map { |i|
220
+
221
+ invocations = Array(1..num_threads).map do |i|
222
222
  conn = OpenStruct.new(:num => i)
223
223
  conn.expects(:close)
224
224
  conn
225
- }
225
+ end
226
226
  Backburner::Connection.expects(:new).times(num_threads).returns(*invocations)
227
227
 
228
228
  # ensure each invocation of run_while_can is with a different connection
229
229
  num_conns = states('num_conns').starts_as(0)
230
230
  invocations.each do |conn|
231
- worker.expects(:run_while_can).with(name, conn).when(num_conns.is(conn.num-1)).then(num_conns.is(conn.num))
231
+ worker.expects(:watch_tube).with(name, conn)
232
+ worker.expects(:run_while_can).with(conn).when(num_conns.is(conn.num-1)).then(num_conns.is(conn.num))
232
233
  end
233
234
 
234
235
  def worker.create_thread(*args, &block); block.call(*args) end
@@ -236,6 +237,7 @@ describe "Backburner::Workers::ThreadsOnFork module" do
236
237
  worker.prepare
237
238
  worker.fork_inner(name)
238
239
  end
240
+
239
241
  assert_equal(num_threads, num_conns.current_state)
240
242
  end
241
243
 
@@ -374,20 +376,22 @@ describe "Backburner::Workers::ThreadsOnFork module" do
374
376
  $worker_success = false
375
377
  $worker_raise = false
376
378
  clear_jobs!('response')
377
- clear_jobs!('foo.bar.1', 'foo.bar.2', 'foo.bar.3', 'foo.bar.4', 'foo.bar.5', 'foo.bar.6')
379
+ clear_jobs!('foo.bar.1', 'foo.bar.2', 'foo.bar.3', 'foo.bar.4', 'foo.bar.5', 'foo.bar.6', 'foo.bar.7')
378
380
  @worker_class.threads_number = 1
379
381
  @worker_class.garbage_after = 10
382
+
380
383
  silenced do
381
384
  @response_worker = @worker_class.new('response')
382
385
  @response_worker.watch_tube('demo.test.response')
383
386
  end
387
+
384
388
  @ignore_forks = true
385
389
  end
386
390
 
387
391
  after do
388
392
  @templogger.close
389
393
  clear_jobs!('response')
390
- clear_jobs!('foo.bar.1', 'foo.bar.2', 'foo.bar.3', 'foo.bar.4', 'foo.bar.5', 'foo.bar.6')
394
+ clear_jobs!('foo.bar.1', 'foo.bar.2', 'foo.bar.3', 'foo.bar.4', 'foo.bar.5', 'foo.bar.6', 'foo.bar.7')
391
395
  @worker_class.threads_number = 1
392
396
  @worker_class.shutdown = true
393
397
  silenced do
@@ -402,7 +406,8 @@ describe "Backburner::Workers::ThreadsOnFork module" do
402
406
  @worker = @worker_class.new('foo.bar.1')
403
407
  @worker.start(false)
404
408
  @worker_class.enqueue TestJobFork, [1, 2], :queue => "foo.bar.1"
405
- silenced(2) do
409
+
410
+ silenced do
406
411
  @templogger.wait_for_match(/Completed TestJobFork/m)
407
412
  @response_worker.work_one_job
408
413
  end
@@ -458,23 +463,22 @@ describe "Backburner::Workers::ThreadsOnFork module" do
458
463
  end # retrying, succeeds
459
464
 
460
465
  it "should support a multithreaded worker without deadlocks" do
461
- num_threads = 5
466
+ num_threads = 15
462
467
  num_jobs = 8
463
- num_jobs.times do
464
- @worker_class.enqueue TestJobFork, [6,2], :queue => 'foo.bar.6'
468
+ num_jobs.times do |i|
469
+ @worker_class.enqueue TestJobMultithreadFork, [6,2], :queue => 'foo.bar.6'
465
470
  end
471
+
466
472
  @worker_class.threads_number = num_threads
467
473
  @worker = @worker_class.new('foo.bar.6')
468
474
  @worker.start(false)
469
- silenced(2) do
470
- @templogger.wait_for_match(/Completed TestJobFork/m)
475
+
476
+ silenced do
477
+ @templogger.wait_for_match(/Completed TestJobMultithreadFork/m)
471
478
  num_jobs.times { @response_worker.work_one_job }
472
479
  end
473
480
  assert_equal num_jobs, $worker_test_count
474
481
  end # multithreaded
475
-
476
482
  end # practical tests
477
-
478
483
  end # forking and threading
479
-
480
484
  end # Backburner::Workers::ThreadsOnFork module
metadata CHANGED
@@ -1,55 +1,55 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: backburner
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.0.pre
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nathan Esquenazi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-09-14 00:00:00.000000000 Z
11
+ date: 2015-10-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: beaneater
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ~>
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ~>
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: dante
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">"
31
+ - - '>'
32
32
  - !ruby/object:Gem::Version
33
33
  version: 0.1.5
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">"
38
+ - - '>'
39
39
  - !ruby/object:Gem::Version
40
40
  version: 0.1.5
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ">="
45
+ - - '>='
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ">="
52
+ - - '>='
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
@@ -70,14 +70,14 @@ dependencies:
70
70
  name: mocha
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ">="
73
+ - - '>='
74
74
  - !ruby/object:Gem::Version
75
75
  version: '0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ">="
80
+ - - '>='
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  description: Beanstalk background job processing made easy
@@ -88,9 +88,8 @@ executables:
88
88
  extensions: []
89
89
  extra_rdoc_files: []
90
90
  files:
91
- - ".DS_Store"
92
- - ".gitignore"
93
- - ".travis.yml"
91
+ - .gitignore
92
+ - .travis.yml
94
93
  - CHANGELOG.md
95
94
  - CONTRIBUTING.md
96
95
  - Gemfile
@@ -156,17 +155,17 @@ require_paths:
156
155
  - lib
157
156
  required_ruby_version: !ruby/object:Gem::Requirement
158
157
  requirements:
159
- - - ">="
158
+ - - '>='
160
159
  - !ruby/object:Gem::Version
161
160
  version: '0'
162
161
  required_rubygems_version: !ruby/object:Gem::Requirement
163
162
  requirements:
164
- - - ">="
163
+ - - '>'
165
164
  - !ruby/object:Gem::Version
166
- version: '0'
165
+ version: 1.3.1
167
166
  requirements: []
168
167
  rubyforge_project:
169
- rubygems_version: 2.2.2
168
+ rubygems_version: 2.4.8
170
169
  signing_key:
171
170
  specification_version: 4
172
171
  summary: Reliable beanstalk background job processing made easy for Ruby and Sinatra