inst-jobs 0.15.0 → 0.16.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/db/migrate/20181217155351_speed_up_max_concurrent_triggers.rb +95 -0
  3. data/db/migrate/20190726154743_make_critical_columns_not_null.rb +15 -0
  4. data/db/migrate/20200330230722_add_id_to_get_delayed_jobs_index.rb +25 -0
  5. data/db/migrate/20200824222232_speed_up_max_concurrent_delete_trigger.rb +95 -0
  6. data/db/migrate/20200825011002_add_strand_order_override.rb +126 -0
  7. data/lib/delayed/backend/active_record.rb +93 -14
  8. data/lib/delayed/backend/redis/job.rb +8 -2
  9. data/lib/delayed/batch.rb +1 -1
  10. data/lib/delayed/lifecycle.rb +1 -0
  11. data/lib/delayed/periodic.rb +7 -4
  12. data/lib/delayed/server.rb +19 -0
  13. data/lib/delayed/server/helpers.rb +1 -0
  14. data/lib/delayed/server/public/js/app.js +49 -1
  15. data/lib/delayed/server/views/index.erb +16 -1
  16. data/lib/delayed/server/views/layout.erb +5 -3
  17. data/lib/delayed/settings.rb +5 -1
  18. data/lib/delayed/version.rb +1 -1
  19. data/lib/delayed/work_queue/parent_process/server.rb +14 -4
  20. data/lib/delayed/worker.rb +28 -6
  21. data/lib/delayed/worker/consul_health_check.rb +1 -1
  22. data/lib/delayed/worker/health_check.rb +9 -5
  23. data/lib/delayed/worker/null_health_check.rb +7 -1
  24. data/spec/active_record_job_spec.rb +36 -35
  25. data/spec/delayed/server_spec.rb +43 -1
  26. data/spec/delayed/work_queue/parent_process/server_spec.rb +4 -1
  27. data/spec/delayed/worker/consul_health_check_spec.rb +2 -2
  28. data/spec/delayed/worker/health_check_spec.rb +2 -2
  29. data/spec/delayed/worker_spec.rb +67 -20
  30. data/spec/gemfiles/52.gemfile +7 -0
  31. data/spec/gemfiles/60.gemfile +7 -0
  32. data/spec/shared/delayed_batch.rb +11 -0
  33. data/spec/shared/shared_backend.rb +15 -0
  34. data/spec/shared/worker.rb +4 -0
  35. data/spec/spec_helper.rb +4 -1
  36. metadata +23 -27
  37. data/spec/gemfiles/42.gemfile.lock +0 -192
  38. data/spec/gemfiles/50.gemfile.lock +0 -187
  39. data/spec/gemfiles/51.gemfile.lock +0 -187
@@ -36,7 +36,7 @@ describe 'Delayed::Backed::ActiveRecord::Job' do
36
36
  end
37
37
 
38
38
  it "should not allow a second worker to get exclusive access if failed to be processed by worker1 and run_at time is now in future (due to backing off behaviour)" do
39
- @job.update_attributes(:attempts => 1, :run_at => 1.day.from_now)
39
+ @job.update(:attempts => 1, :run_at => 1.day.from_now)
40
40
  @job_copy_for_worker_2.send(:lock_exclusively!, 'worker2').should == false
41
41
  end
42
42
 
@@ -208,40 +208,6 @@ describe 'Delayed::Backed::ActiveRecord::Job' do
208
208
  job3.next_in_strand.should == true
209
209
  end
210
210
  end
211
-
212
- it "should set multiple jobs as next_in_strand at once if needed" do
213
- change_setting(Delayed::Settings, :num_strands, ->(strand_name) {
214
- case strand_name
215
- when "njobs"; 2
216
- else nil
217
- end
218
- }) do
219
- job1 = Delayed::Job.enqueue(SimpleJob.new, n_strand: ["njobs"])
220
- job1.reload
221
- job1.next_in_strand.should == true
222
- job2 = Delayed::Job.enqueue(SimpleJob.new, n_strand: ["njobs"])
223
- job2.reload
224
- job2.next_in_strand.should == true
225
-
226
- job3 = Delayed::Job.enqueue(SimpleJob.new, n_strand: ["njobs"])
227
- job3.reload
228
- job3.next_in_strand.should == false
229
-
230
- # manually unset next_in_strand
231
- Delayed::Job.where(:id => job2).update_all(:next_in_strand => false)
232
- job2.reload
233
- job2.next_in_strand.should == false
234
-
235
- run_job(job1) # should update both jobs
236
-
237
- job3.reload
238
- job3.next_in_strand.should == true
239
-
240
- job2.reload
241
- job2.next_in_strand.should == true
242
-
243
- end
244
- end
245
211
  end
246
212
  end
247
213
 
@@ -288,4 +254,39 @@ describe 'Delayed::Backed::ActiveRecord::Job' do
288
254
  expect(locked_jobs['work_queue']).to eq jobs[1..2]
289
255
  jobs.map(&:reload).map(&:locked_by).should == ['worker1', 'work_queue', 'work_queue', nil, nil]
290
256
  end
257
+
258
+
259
+ it "should not find jobs scheduled for now when we have forced latency" do
260
+ job = create_job
261
+ Delayed::Job.get_and_lock_next_available('worker', forced_latency: 60.0).should be_nil
262
+ Delayed::Job.get_and_lock_next_available('worker').should eq job
263
+ end
264
+
265
+ context "non-transactional", non_transactional: true do
266
+ it "creates a stranded job in a single statement" do
267
+ skip "Requires Rails 5.2 or greater" unless Rails.version >= '5.2'
268
+
269
+ allow(Delayed::Job.connection).to receive(:prepared_statements).and_return(false)
270
+ allow(Delayed::Job.connection).to receive(:execute).with(be_include("pg_advisory_xact_lock"), anything).and_call_original.once
271
+ allow(Delayed::Job.connection).to receive(:insert).never
272
+ j = create_job(strand: "test1")
273
+ allow(Delayed::Job.connection).to receive(:execute).and_call_original
274
+ expect(Delayed::Job.find(j.id)).to eq j
275
+ end
276
+
277
+ it "creates a non-stranded job in a single statement" do
278
+ skip "Requires Rails 5.2 or greater" unless Rails.version >= '5.2'
279
+
280
+ allow(Delayed::Job.connection).to receive(:prepared_statements).and_return(false)
281
+ call_count = 0
282
+ allow(Delayed::Job.connection).to receive(:execute).and_wrap_original do |m, (arg1, arg2)|
283
+ call_count += 1
284
+ m.call(arg1, arg2)
285
+ end
286
+ allow(Delayed::Job.connection).to receive(:insert).never
287
+ j = create_job(strand: "test1")
288
+ expect(call_count).to eq 1
289
+ expect(Delayed::Job.find(j.id)).to eq j
290
+ end
291
+ end
291
292
  end
@@ -4,8 +4,10 @@ require 'delayed/server'
4
4
  RSpec.describe Delayed::Server, sinatra: true do
5
5
  include Rack::Test::Methods
6
6
 
7
+ @update = false
8
+
7
9
  def app
8
- described_class.new
10
+ described_class.new(update: @update)
9
11
  end
10
12
 
11
13
  def parsed_body
@@ -60,4 +62,44 @@ RSpec.describe Delayed::Server, sinatra: true do
60
62
  end
61
63
  end
62
64
  end
65
+
66
+ describe "post '/bulk_update'" do
67
+ let!(:job_1) { Delayed::Job.enqueue(SimpleJob.new, strand: 'strand-1') }
68
+ let!(:job_2) { Delayed::Job.enqueue(SimpleJob.new, strand: 'strand-2') }
69
+ let!(:job_3) { Delayed::Job.enqueue(SimpleJob.new, strand: 'strand-3') }
70
+
71
+ context 'with update enabled' do
72
+ before do
73
+ @update = true
74
+ post "/bulk_update", params=JSON.generate(action: 'destroy', ids: [job_1.id])
75
+ end
76
+
77
+ it 'must remove job_1' do
78
+ expect{ Delayed::Job.find(job_1.id) }.to raise_error(ActiveRecord::RecordNotFound)
79
+ expect(Delayed::Job.find(job_2.id)).to_not be_nil
80
+ expect(Delayed::Job.find(job_3.id)).to_not be_nil
81
+ end
82
+
83
+ it 'must return ok' do
84
+ expect(last_response.ok?).to be true
85
+ end
86
+ end
87
+
88
+ context 'with update disabled' do
89
+ before do
90
+ @update = false
91
+ post "/bulk_update", params=JSON.generate(action: 'destroy', ids: [job_1.id])
92
+ end
93
+
94
+ it 'must not remove job_1' do
95
+ expect(Delayed::Job.find(job_1.id)).to_not be_nil
96
+ expect(Delayed::Job.find(job_2.id)).to_not be_nil
97
+ expect(Delayed::Job.find(job_3.id)).to_not be_nil
98
+ end
99
+
100
+ it 'must return forbidden' do
101
+ expect(last_response.forbidden?).to be true
102
+ end
103
+ end
104
+ end
63
105
  end
@@ -77,7 +77,7 @@ RSpec.describe Delayed::WorkQueue::ParentProcess::Server do
77
77
  subject.run_once
78
78
 
79
79
  allow(subject).to receive(:prefetch_owner).and_return('work_queue:X')
80
- job_args = [["worker_name1"], "queue_name", 1, 2, prefetch: 4, prefetch_owner: 'work_queue:X']
80
+ job_args = [["worker_name1"], "queue_name", 1, 2, prefetch: 4, prefetch_owner: 'work_queue:X', forced_latency: 6.0]
81
81
  job2 = Delayed::Job.new(:tag => 'tag')
82
82
  job2.create_and_lock!('work_queue:X')
83
83
  job3 = Delayed::Job.new(:tag => 'tag')
@@ -87,9 +87,12 @@ RSpec.describe Delayed::WorkQueue::ParentProcess::Server do
87
87
  expect(Delayed::Job).to receive(:get_and_lock_next_available).once.with(*job_args).and_return(jobs)
88
88
  Marshal.dump(["worker_name1", worker_config], client)
89
89
  subject.run_once
90
+ expect(subject).to_not be_all_workers_idle
90
91
  expect(Marshal.load(client)).to eq(job)
92
+
91
93
  Marshal.dump(["worker_name1", worker_config], client)
92
94
  subject.run_once
95
+ expect(subject).to_not be_all_workers_idle
93
96
  expect(Marshal.load(client)).to eq(job2)
94
97
  end
95
98
 
@@ -37,11 +37,11 @@ RSpec.describe Delayed::Worker::ConsulHealthCheck do
37
37
  end
38
38
 
39
39
 
40
- it 'must supply a script style check' do
40
+ it 'must supply a args style check' do
41
41
  allow(response).to receive(:ok?).and_return(true)
42
42
  allow(agent_client).to receive(:register_service) { |service|
43
43
  check = service.checks.first
44
- expect(check.script).to_not be_nil
44
+ expect(check.args).to_not be_nil
45
45
  response
46
46
  }
47
47
  health_check.start
@@ -55,12 +55,12 @@ RSpec.describe Delayed::Worker::HealthCheck do
55
55
 
56
56
  2.times { Delayed::Job.enqueue(SimpleJob.new, run_at: initial_run_at, max_attempts: 4) }
57
57
  @alive_job = Delayed::Job.first
58
- @alive_job.update_attributes!({
58
+ @alive_job.update!({
59
59
  locked_by: 'alive',
60
60
  locked_at: initial_run_at
61
61
  })
62
62
  @dead_job = Delayed::Job.last
63
- @dead_job.update_attributes!({
63
+ @dead_job.update!({
64
64
  locked_by: 'dead',
65
65
  locked_at: initial_run_at
66
66
  })
@@ -1,28 +1,75 @@
1
1
  require_relative "../spec_helper"
2
2
 
3
- module Delayed
4
- describe Worker do
5
- let(:worker_config) { {
6
- queue: "test", min_priority: 1, max_priority: 2, stuff: "stuff",
7
- }.freeze }
8
- subject { described_class.new(worker_config.dup) }
9
-
10
- describe "#perform" do
11
- it "fires off an error callback when a job raises an exception" do
12
- fired = false
13
- Worker.lifecycle.before(:error) {|worker, exception| fired = true}
14
- job = double(:last_error= => nil, attempts: 1, reschedule: nil)
15
- subject.perform(job)
16
- expect(fired).to be_truthy
17
- end
3
+ describe Delayed::Worker do
4
+ let(:worker_config) { {
5
+ queue: "test", min_priority: 1, max_priority: 2, stuff: "stuff",
6
+ }.freeze }
7
+ subject { described_class.new(worker_config.dup) }
8
+
9
+ after { Delayed::Worker.lifecycle.reset! }
10
+
11
+ describe "#perform" do
12
+ it "fires off an error callback when a job raises an exception" do
13
+ fired = false
14
+ Delayed::Worker.lifecycle.before(:error) {|worker, exception| fired = true}
15
+ job = double(:last_error= => nil, attempts: 1, reschedule: nil)
16
+ subject.perform(job)
17
+ expect(fired).to be_truthy
18
18
  end
19
19
 
20
- describe "#run" do
21
- it "passes extra config options through to the WorkQueue" do
22
- expect(subject.work_queue).to receive(:get_and_lock_next_available).
23
- with(subject.name, worker_config).and_return(nil)
24
- subject.run
20
+ it "reloads" do
21
+ fakeApplication = double('Rails.application',
22
+ config: double('Rails.application.config',
23
+ cache_classes: false,
24
+ reload_classes_only_on_change: false
25
+ ),
26
+ reloader: double()
27
+ )
28
+
29
+ allow(Rails).to receive(:application).and_return(fakeApplication)
30
+ if Rails::VERSION::MAJOR >= 5
31
+ expect(Rails.application.reloader).to receive(:reload!).once
32
+ else
33
+ expect(ActionDispatch::Reloader).to receive(:prepare!).once
34
+ expect(ActionDispatch::Reloader).to receive(:cleanup!).once
25
35
  end
36
+ job = double(:last_error= => nil, attempts: 0, reschedule: nil, expired?: false)
37
+ subject.perform(job)
38
+ end
39
+ end
40
+
41
+ describe "#log_job" do
42
+ around(:each) do |block|
43
+ prev_logger = Delayed::Settings.job_detailed_log_format
44
+ block.call
45
+ Delayed::Settings.job_detailed_log_format = prev_logger
46
+ end
47
+
48
+ it "has a reasonable default format" do
49
+ payload = double(perform: nil)
50
+ job = Delayed::Job.new(payload_object: payload, priority: 25, strand: "test_jobs")
51
+ short_log_format = subject.log_job(job, :short)
52
+ expect(short_log_format).to eq("RSpec::Mocks::Double")
53
+ long_format = subject.log_job(job, :long)
54
+ expect(long_format).to eq("RSpec::Mocks::Double {\"priority\":25,\"attempts\":0,\"created_at\":null,\"tag\":\"RSpec::Mocks::Double#perform\",\"max_attempts\":null,\"strand\":\"test_jobs\",\"source\":null}")
55
+ end
56
+
57
+ it "logging format can be changed with settings" do
58
+ Delayed::Settings.job_detailed_log_format = ->(job){ "override format #{job.strand}"}
59
+ payload = double(perform: nil)
60
+ job = Delayed::Job.new(payload_object: payload, priority: 25, strand: "test_jobs")
61
+ short_log_format = subject.log_job(job, :short)
62
+ expect(short_log_format).to eq("RSpec::Mocks::Double")
63
+ long_format = subject.log_job(job, :long)
64
+ expect(long_format).to eq("RSpec::Mocks::Double override format test_jobs")
65
+ end
66
+ end
67
+
68
+ describe "#run" do
69
+ it "passes extra config options through to the WorkQueue" do
70
+ expect(subject.work_queue).to receive(:get_and_lock_next_available).
71
+ with(subject.name, worker_config).and_return(nil)
72
+ subject.run
26
73
  end
27
74
  end
28
75
  end
@@ -0,0 +1,7 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec :path=>"../../"
4
+
5
+ gem "rails", "~> 5.2.0"
6
+ gem 'sinatra', "2.0.0.beta2"
7
+ gem 'sinatra-contrib', "2.0.0.beta2"
@@ -0,0 +1,7 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec :path=>"../../"
4
+
5
+ gem "rails", "~> 6.0.0"
6
+ gem 'sinatra', "2.0.0.beta2"
7
+ gem 'sinatra-contrib', "2.0.0.beta2"
@@ -81,5 +81,16 @@ shared_examples_for 'Delayed::Batch' do
81
81
  Delayed::Job.find_available(1).first.tag.should == "String#size"
82
82
  Delayed::Job.find_available(1).first.priority.should == 11
83
83
  end
84
+
85
+ it "should list a job only once when the same call is made multiple times" do
86
+ Delayed::Batch.serial_batch(:priority => 11) {
87
+ "string".send_later_enqueue_args(:size, no_delay: true)
88
+ "string".send_later_enqueue_args(:gsub, { no_delay: true }, /./, "!")
89
+ "string".send_later_enqueue_args(:size, no_delay: true)
90
+ }
91
+ batch_job = Delayed::Job.find_available(1).first
92
+ jobs = batch_job.payload_object.jobs
93
+ jobs.size.should == 2
94
+ end
84
95
  end
85
96
  end
@@ -369,6 +369,21 @@ shared_examples_for 'a backend' do
369
369
  job3.should == job1
370
370
  job3.run_at.to_i.should == t2.to_i
371
371
  end
372
+
373
+ it "should update existing singleton job handler if requested" do
374
+ job1 = Delayed::Job.enqueue(SimpleJob.new, { :queue => nil, :singleton => 'myjobs', :on_conflict => :overwrite})
375
+ job2 = Delayed::Job.enqueue(ErrorJob.new, { :queue => nil, :singleton => 'myjobs', :on_conflict => :overwrite})
376
+ job2.should == job1
377
+ expect(job2.handler).to include("ErrorJob")
378
+ end
379
+
380
+ it "does not create even if it's earlier when in loose mode" do
381
+ t1 = 1.hour.from_now
382
+ job1 = create_job(singleton: 'myjobs', run_at: t1)
383
+ job2 = create_job(singleton: 'myjobs', on_conflict: :loose)
384
+ job1.should == job2
385
+ job2.run_at.to_i.should == t1.to_i
386
+ end
372
387
  end
373
388
  end
374
389
 
@@ -13,6 +13,10 @@ shared_examples_for 'Delayed::Worker' do
13
13
  Delayed::Settings.sleep_delay = ->{ 0.01 }
14
14
  end
15
15
 
16
+ after do
17
+ Delayed::Settings.sleep_delay = 2.0
18
+ end
19
+
16
20
  describe "running a job" do
17
21
  it "should not fail when running a job with a % in the name" do
18
22
  @job = "Some % Name here".send_later_enqueue_args(:starts_with?, { no_delay: true }, "Some % Name")
@@ -23,7 +23,8 @@ RSpec.configure do |config|
23
23
  if Delayed::Backend::Redis::Job.redis
24
24
  Delayed::Backend::Redis::Job.redis.flushdb
25
25
  end
26
- DatabaseCleaner.strategy = (example.metadata[:sinatra] ? :truncation : :transaction)
26
+ DatabaseCleaner.strategy = (example.metadata[:sinatra] || example.metadata[:non_transactional]) ?
27
+ :truncation : :transaction
27
28
  DatabaseCleaner.start
28
29
  end
29
30
 
@@ -59,6 +60,8 @@ end
59
60
  def migrate(file)
60
61
  if ::Rails.version < '5.2'
61
62
  ActiveRecord::Migrator.migrate(file)
63
+ elsif ::Rails.version >= '6'
64
+ ActiveRecord::MigrationContext.new(file, ActiveRecord::SchemaMigration).migrate
62
65
  else
63
66
  ActiveRecord::MigrationContext.new(file).migrate
64
67
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: inst-jobs
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.15.0
4
+ version: 0.16.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tobias Luetke
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2018-06-07 00:00:00.000000000 Z
12
+ date: 2020-08-25 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activerecord
@@ -102,25 +102,19 @@ dependencies:
102
102
  - !ruby/object:Gem::Version
103
103
  version: 1.0.1
104
104
  - !ruby/object:Gem::Dependency
105
- name: rufus-scheduler
105
+ name: fugit
106
106
  requirement: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: '3.4'
111
- - - "<"
112
- - !ruby/object:Gem::Version
113
- version: '3.5'
110
+ version: '1.3'
114
111
  type: :runtime
115
112
  prerelease: false
116
113
  version_requirements: !ruby/object:Gem::Requirement
117
114
  requirements:
118
115
  - - "~>"
119
116
  - !ruby/object:Gem::Version
120
- version: '3.4'
121
- - - "<"
122
- - !ruby/object:Gem::Version
123
- version: '3.5'
117
+ version: '1.3'
124
118
  - !ruby/object:Gem::Dependency
125
119
  name: bump
126
120
  requirement: !ruby/object:Gem::Requirement
@@ -169,14 +163,14 @@ dependencies:
169
163
  requirements:
170
164
  - - ">="
171
165
  - !ruby/object:Gem::Version
172
- version: 0.2.3
166
+ version: 0.5.2
173
167
  type: :development
174
168
  prerelease: false
175
169
  version_requirements: !ruby/object:Gem::Requirement
176
170
  requirements:
177
171
  - - ">="
178
172
  - !ruby/object:Gem::Version
179
- version: 0.2.3
173
+ version: 0.5.2
180
174
  - !ruby/object:Gem::Dependency
181
175
  name: pg
182
176
  requirement: !ruby/object:Gem::Requirement
@@ -251,16 +245,16 @@ dependencies:
251
245
  name: rspec
252
246
  requirement: !ruby/object:Gem::Requirement
253
247
  requirements:
254
- - - '='
248
+ - - "~>"
255
249
  - !ruby/object:Gem::Version
256
- version: 3.4.0
250
+ version: 3.8.0
257
251
  type: :development
258
252
  prerelease: false
259
253
  version_requirements: !ruby/object:Gem::Requirement
260
254
  requirements:
261
- - - '='
255
+ - - "~>"
262
256
  - !ruby/object:Gem::Version
263
- version: 3.4.0
257
+ version: 3.8.0
264
258
  - !ruby/object:Gem::Dependency
265
259
  name: sinatra
266
260
  requirement: !ruby/object:Gem::Requirement
@@ -309,14 +303,14 @@ dependencies:
309
303
  requirements:
310
304
  - - "~>"
311
305
  - !ruby/object:Gem::Version
312
- version: 1.3.0
306
+ version: 1.4.0
313
307
  type: :development
314
308
  prerelease: false
315
309
  version_requirements: !ruby/object:Gem::Requirement
316
310
  requirements:
317
311
  - - "~>"
318
312
  - !ruby/object:Gem::Version
319
- version: 1.3.0
313
+ version: 1.4.0
320
314
  description:
321
315
  email:
322
316
  - brianp@instructure.com
@@ -346,6 +340,11 @@ files:
346
340
  - db/migrate/20151123210429_add_expires_at_to_jobs.rb
347
341
  - db/migrate/20151210162949_improve_max_concurrent.rb
348
342
  - db/migrate/20161206323555_add_back_default_string_limits_jobs.rb
343
+ - db/migrate/20181217155351_speed_up_max_concurrent_triggers.rb
344
+ - db/migrate/20190726154743_make_critical_columns_not_null.rb
345
+ - db/migrate/20200330230722_add_id_to_get_delayed_jobs_index.rb
346
+ - db/migrate/20200824222232_speed_up_max_concurrent_delete_trigger.rb
347
+ - db/migrate/20200825011002_add_strand_order_override.rb
349
348
  - exe/inst_jobs
350
349
  - lib/delayed/backend/active_record.rb
351
350
  - lib/delayed/backend/base.rb
@@ -407,11 +406,10 @@ files:
407
406
  - spec/delayed/worker/health_check_spec.rb
408
407
  - spec/delayed/worker_spec.rb
409
408
  - spec/gemfiles/42.gemfile
410
- - spec/gemfiles/42.gemfile.lock
411
409
  - spec/gemfiles/50.gemfile
412
- - spec/gemfiles/50.gemfile.lock
413
410
  - spec/gemfiles/51.gemfile
414
- - spec/gemfiles/51.gemfile.lock
411
+ - spec/gemfiles/52.gemfile
412
+ - spec/gemfiles/60.gemfile
415
413
  - spec/migrate/20140924140513_add_story_table.rb
416
414
  - spec/redis_job_spec.rb
417
415
  - spec/sample_jobs.rb
@@ -441,8 +439,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
441
439
  - !ruby/object:Gem::Version
442
440
  version: '0'
443
441
  requirements: []
444
- rubyforge_project:
445
- rubygems_version: 2.7.6
442
+ rubygems_version: 3.0.3
446
443
  signing_key:
447
444
  specification_version: 4
448
445
  summary: Instructure-maintained fork of delayed_job
@@ -450,10 +447,9 @@ test_files:
450
447
  - spec/sample_jobs.rb
451
448
  - spec/spec_helper.rb
452
449
  - spec/redis_job_spec.rb
453
- - spec/gemfiles/51.gemfile.lock
454
- - spec/gemfiles/42.gemfile.lock
455
- - spec/gemfiles/50.gemfile.lock
450
+ - spec/gemfiles/60.gemfile
456
451
  - spec/gemfiles/42.gemfile
452
+ - spec/gemfiles/52.gemfile
457
453
  - spec/gemfiles/50.gemfile
458
454
  - spec/gemfiles/51.gemfile
459
455
  - spec/shared_jobs_specs.rb