inst-jobs 2.2.1 → 2.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (98) hide show
  1. checksums.yaml +4 -4
  2. data/db/migrate/20101216224513_create_delayed_jobs.rb +9 -7
  3. data/db/migrate/20110531144916_cleanup_delayed_jobs_indexes.rb +8 -13
  4. data/db/migrate/20110610213249_optimize_delayed_jobs.rb +8 -8
  5. data/db/migrate/20110831210257_add_delayed_jobs_next_in_strand.rb +25 -25
  6. data/db/migrate/20120510004759_delayed_jobs_delete_trigger_lock_for_update.rb +4 -8
  7. data/db/migrate/20120531150712_drop_psql_jobs_pop_fn.rb +1 -3
  8. data/db/migrate/20120607164022_delayed_jobs_use_advisory_locks.rb +11 -15
  9. data/db/migrate/20120607181141_index_jobs_on_locked_by.rb +1 -1
  10. data/db/migrate/20120608191051_add_jobs_run_at_index.rb +2 -2
  11. data/db/migrate/20120927184213_change_delayed_jobs_handler_to_text.rb +1 -1
  12. data/db/migrate/20140505215510_copy_failed_jobs_original_id.rb +2 -3
  13. data/db/migrate/20150807133223_add_max_concurrent_to_jobs.rb +9 -13
  14. data/db/migrate/20151210162949_improve_max_concurrent.rb +4 -8
  15. data/db/migrate/20161206323555_add_back_default_string_limits_jobs.rb +3 -2
  16. data/db/migrate/20181217155351_speed_up_max_concurrent_triggers.rb +13 -17
  17. data/db/migrate/20200330230722_add_id_to_get_delayed_jobs_index.rb +8 -8
  18. data/db/migrate/20200824222232_speed_up_max_concurrent_delete_trigger.rb +72 -77
  19. data/db/migrate/20200825011002_add_strand_order_override.rb +93 -97
  20. data/db/migrate/20210809145804_add_n_strand_index.rb +12 -0
  21. data/db/migrate/20210812210128_add_singleton_column.rb +203 -0
  22. data/exe/inst_jobs +3 -2
  23. data/lib/delayed/backend/active_record.rb +187 -159
  24. data/lib/delayed/backend/base.rb +80 -69
  25. data/lib/delayed/batch.rb +11 -9
  26. data/lib/delayed/cli.rb +98 -84
  27. data/lib/delayed/core_ext/kernel.rb +4 -2
  28. data/lib/delayed/daemon.rb +70 -74
  29. data/lib/delayed/job_tracking.rb +26 -25
  30. data/lib/delayed/lifecycle.rb +27 -24
  31. data/lib/delayed/log_tailer.rb +17 -17
  32. data/lib/delayed/logging.rb +13 -16
  33. data/lib/delayed/message_sending.rb +42 -51
  34. data/lib/delayed/performable_method.rb +5 -7
  35. data/lib/delayed/periodic.rb +66 -65
  36. data/lib/delayed/plugin.rb +2 -4
  37. data/lib/delayed/pool.rb +198 -192
  38. data/lib/delayed/server/helpers.rb +6 -6
  39. data/lib/delayed/server.rb +51 -54
  40. data/lib/delayed/settings.rb +93 -81
  41. data/lib/delayed/testing.rb +21 -22
  42. data/lib/delayed/version.rb +1 -1
  43. data/lib/delayed/work_queue/in_process.rb +21 -17
  44. data/lib/delayed/work_queue/parent_process/client.rb +55 -53
  45. data/lib/delayed/work_queue/parent_process/server.rb +215 -209
  46. data/lib/delayed/work_queue/parent_process.rb +52 -53
  47. data/lib/delayed/worker/consul_health_check.rb +21 -19
  48. data/lib/delayed/worker/health_check.rb +21 -12
  49. data/lib/delayed/worker/null_health_check.rb +3 -1
  50. data/lib/delayed/worker/process_helper.rb +8 -9
  51. data/lib/delayed/worker.rb +271 -261
  52. data/lib/delayed/yaml_extensions.rb +12 -10
  53. data/lib/delayed_job.rb +37 -37
  54. data/lib/inst-jobs.rb +1 -1
  55. data/spec/active_record_job_spec.rb +142 -138
  56. data/spec/delayed/cli_spec.rb +7 -7
  57. data/spec/delayed/daemon_spec.rb +8 -8
  58. data/spec/delayed/message_sending_spec.rb +8 -9
  59. data/spec/delayed/periodic_spec.rb +13 -12
  60. data/spec/delayed/server_spec.rb +38 -38
  61. data/spec/delayed/settings_spec.rb +26 -25
  62. data/spec/delayed/work_queue/in_process_spec.rb +7 -7
  63. data/spec/delayed/work_queue/parent_process/client_spec.rb +16 -12
  64. data/spec/delayed/work_queue/parent_process/server_spec.rb +43 -40
  65. data/spec/delayed/work_queue/parent_process_spec.rb +21 -21
  66. data/spec/delayed/worker/consul_health_check_spec.rb +22 -22
  67. data/spec/delayed/worker/health_check_spec.rb +51 -49
  68. data/spec/delayed/worker_spec.rb +28 -25
  69. data/spec/gemfiles/52.gemfile +5 -3
  70. data/spec/gemfiles/52.gemfile.lock +240 -0
  71. data/spec/gemfiles/60.gemfile +5 -3
  72. data/spec/gemfiles/60.gemfile.lock +246 -0
  73. data/spec/gemfiles/61.gemfile +9 -0
  74. data/spec/sample_jobs.rb +45 -15
  75. data/spec/shared/delayed_batch.rb +74 -67
  76. data/spec/shared/delayed_method.rb +143 -102
  77. data/spec/shared/performable_method.rb +39 -38
  78. data/spec/shared/shared_backend.rb +537 -437
  79. data/spec/shared/testing.rb +14 -14
  80. data/spec/shared/worker.rb +156 -148
  81. data/spec/shared_jobs_specs.rb +13 -13
  82. data/spec/spec_helper.rb +43 -51
  83. metadata +101 -70
  84. data/lib/delayed/backend/redis/bulk_update.lua +0 -50
  85. data/lib/delayed/backend/redis/destroy_job.lua +0 -2
  86. data/lib/delayed/backend/redis/enqueue.lua +0 -29
  87. data/lib/delayed/backend/redis/fail_job.lua +0 -5
  88. data/lib/delayed/backend/redis/find_available.lua +0 -3
  89. data/lib/delayed/backend/redis/functions.rb +0 -59
  90. data/lib/delayed/backend/redis/get_and_lock_next_available.lua +0 -17
  91. data/lib/delayed/backend/redis/includes/jobs_common.lua +0 -203
  92. data/lib/delayed/backend/redis/job.rb +0 -535
  93. data/lib/delayed/backend/redis/set_running.lua +0 -5
  94. data/lib/delayed/backend/redis/tickle_strand.lua +0 -2
  95. data/spec/gemfiles/42.gemfile +0 -7
  96. data/spec/gemfiles/50.gemfile +0 -7
  97. data/spec/gemfiles/51.gemfile +0 -7
  98. data/spec/redis_job_spec.rb +0 -148
@@ -1,50 +1,50 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'spec_helper'
3
+ require "spec_helper"
4
4
 
5
5
  RSpec.describe Delayed::Worker::ConsulHealthCheck do
6
- let(:health_check) { Delayed::Worker::ConsulHealthCheck.new(worker_name: 'foobar') }
6
+ let(:health_check) { described_class.new(worker_name: "foobar") }
7
7
 
8
- describe '#initialize' do
9
- it 'must use a default service client when the config is mostly empty' do
10
- check = Delayed::Worker::ConsulHealthCheck.new(worker_name: 'foobar')
11
- expect(check.service_client.configuration.url.to_s).to eq 'http://localhost:8500'
8
+ describe "#initialize" do
9
+ it "must use a default service client when the config is mostly empty" do
10
+ check = described_class.new(worker_name: "foobar")
11
+ expect(check.service_client.configuration.url.to_s).to eq "http://localhost:8500"
12
12
  end
13
13
 
14
- it 'must create a new service API client when the config has relevant keys set' do
15
- check = Delayed::Worker::ConsulHealthCheck.new(worker_name: 'foobar', config: {url: 'http://consul.example.com:8500'})
14
+ it "must create a new service API client when the config has relevant keys set" do
15
+ check = described_class.new(worker_name: "foobar",
16
+ config: { url: "http://consul.example.com:8500" })
16
17
  service_client = check.service_client
17
- expect(service_client.configuration.url.to_s).to eq 'http://consul.example.com:8500'
18
+ expect(service_client.configuration.url.to_s).to eq "http://consul.example.com:8500"
18
19
  end
19
20
  end
20
21
 
21
- describe '#start' do
22
- it 'must register this process as a service with consul' do
22
+ describe "#start" do
23
+ it "must register this process as a service with consul" do
23
24
  stub = stub_request(:put, "localhost:8500/v1/agent/service/register")
24
- .with(body: hash_including({id: 'foobar' }))
25
+ .with(body: hash_including({ id: "foobar" }))
25
26
 
26
27
  health_check.start
27
28
 
28
29
  expect(stub).to have_been_requested
29
30
  end
30
31
 
31
-
32
- it 'must supply a args style check' do
32
+ it "must supply a args style check" do
33
33
  stub = stub_request(:put, "localhost:8500/v1/agent/service/register")
34
- .with(body: hash_including({check: WebMock::API.hash_including({args: anything})}))
34
+ .with(body: hash_including({ check: WebMock::API.hash_including({ args: anything }) }))
35
35
 
36
36
  health_check.start
37
37
 
38
38
  expect(stub).to have_been_requested
39
39
  end
40
40
 
41
- it 'must include the docker container id when the docker option is set to true' do
41
+ it "must include the docker container id when the docker option is set to true" do
42
42
  stub = stub_request(:put, "localhost:8500/v1/agent/service/register")
43
- .with(body: hash_including({check: WebMock::API.hash_including({docker_container_id: anything})}))
43
+ .with(body: hash_including({ check: WebMock::API.hash_including({ docker_container_id: anything }) }))
44
44
 
45
- local_health_check = Delayed::Worker::ConsulHealthCheck.new(
46
- worker_name: 'foobar',
47
- config: {docker: true}
45
+ local_health_check = described_class.new(
46
+ worker_name: "foobar",
47
+ config: { docker: true }
48
48
  )
49
49
  local_health_check.start
50
50
 
@@ -52,8 +52,8 @@ RSpec.describe Delayed::Worker::ConsulHealthCheck do
52
52
  end
53
53
  end
54
54
 
55
- describe '#stop' do
56
- it 'must deregister the service from consul' do
55
+ describe "#stop" do
56
+ it "must deregister the service from consul" do
57
57
  stub = stub_request(:put, "localhost:8500/v1/agent/service/deregister/foobar")
58
58
 
59
59
  health_check.stop
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'spec_helper'
3
+ require "spec_helper"
4
4
 
5
5
  RSpec.describe Delayed::Worker::HealthCheck do
6
6
  let(:klass) { Class.new(Delayed::Worker::HealthCheck) { self.type_name = :test } }
@@ -10,116 +10,118 @@ RSpec.describe Delayed::Worker::HealthCheck do
10
10
  end
11
11
 
12
12
  after do
13
- Delayed::Worker::HealthCheck.subclasses.delete(klass)
13
+ described_class.subclasses.delete(klass)
14
14
  end
15
15
 
16
16
  it "must maintain a list of its subclasses" do
17
17
  klass
18
- expect(Delayed::Worker::HealthCheck.subclasses).to include klass
18
+ expect(described_class.subclasses).to include klass
19
19
  end
20
20
 
21
- describe '.build(type:, config: {})' do
22
- it 'must select the concrete class to use by the type_name in the subclass' do
23
- check = Delayed::Worker::HealthCheck.build(type: 'test', worker_name: 'foobar')
21
+ describe ".build(type:, config: {})" do
22
+ it "must select the concrete class to use by the type_name in the subclass" do
23
+ check = described_class.build(type: "test", worker_name: "foobar")
24
24
  expect(check).to be_a(klass)
25
25
  end
26
26
 
27
27
  it "must raise ArgumentError when the specified type doesn't exist" do
28
- expect {
29
- Delayed::Worker::HealthCheck.build(type: 'nope', config: {worker_name: 'foobar'})
30
- }.to raise_error ArgumentError
28
+ expect do
29
+ described_class.build(type: "nope", config: { worker_name: "foobar" })
30
+ end.to raise_error ArgumentError
31
31
  end
32
32
 
33
- it 'must initiaize the specified class using the supplied config' do
34
- config = {foo: 'bar'}.with_indifferent_access
35
- check = Delayed::Worker::HealthCheck.build(type: 'test', worker_name: 'foobar', config: config)
33
+ it "must initiaize the specified class using the supplied config" do
34
+ config = { foo: "bar" }.with_indifferent_access
35
+ check = described_class.build(type: "test", worker_name: "foobar", config: config)
36
36
  expect(check.config).to eq config
37
37
  end
38
38
  end
39
39
 
40
- describe '.reschedule_abandoned_jobs' do
41
- let(:klass) { Class.new(Delayed::Worker::HealthCheck) {
42
- self.type_name = :fake
43
- class << self
44
- attr_accessor :live_workers
40
+ describe ".reschedule_abandoned_jobs" do
41
+ let(:klass) do
42
+ Class.new(Delayed::Worker::HealthCheck) do
43
+ self.type_name = :fake
44
+ class << self
45
+ attr_accessor :live_workers
46
+ end
47
+
48
+ def live_workers
49
+ self.class.live_workers
50
+ end
45
51
  end
46
-
47
- def live_workers
48
- self.class.live_workers
49
- end
50
- } }
52
+ end
51
53
 
52
54
  let(:initial_run_at) { Time.zone.now }
53
55
 
54
56
  before do
55
- klass.live_workers = %w{alive}
57
+ klass.live_workers = %w[alive]
56
58
  Delayed.select_backend(Delayed::Backend::ActiveRecord::Job)
57
59
 
58
60
  2.times { Delayed::Job.enqueue(SimpleJob.new, run_at: initial_run_at, max_attempts: 4) }
59
61
  @alive_job = Delayed::Job.first
60
62
  @alive_job.update!({
61
- locked_by: 'alive',
62
- locked_at: initial_run_at
63
- })
63
+ locked_by: "alive",
64
+ locked_at: initial_run_at
65
+ })
64
66
  @dead_job = Delayed::Job.last
65
67
  @dead_job.update!({
66
- locked_by: 'dead',
67
- locked_at: initial_run_at
68
- })
68
+ locked_by: "dead",
69
+ locked_at: initial_run_at
70
+ })
69
71
  Delayed::Settings.worker_health_check_type = :fake
70
72
  Delayed::Settings.worker_health_check_config = {}
71
73
  end
72
74
 
73
75
  after do
74
- Delayed::Worker::HealthCheck.subclasses.delete(klass)
76
+ described_class.subclasses.delete(klass)
75
77
  Delayed::Settings.worker_health_check_type = :none
76
78
  Delayed::Settings.worker_health_check_config = {}
77
79
  end
78
80
 
79
- it 'must leave jobs locked by live workers alone' do
80
- Delayed::Worker::HealthCheck.reschedule_abandoned_jobs
81
+ it "must leave jobs locked by live workers alone" do
82
+ described_class.reschedule_abandoned_jobs
81
83
  @alive_job.reload
82
84
  expect(@alive_job.run_at.to_i).to eq initial_run_at.to_i
83
85
  expect(@alive_job.locked_at.to_i).to eq initial_run_at.to_i
84
- expect(@alive_job.locked_by).to eq 'alive'
86
+ expect(@alive_job.locked_by).to eq "alive"
85
87
  end
86
88
 
87
- it 'must reschedule jobs locked by dead workers' do
88
- Delayed::Worker::HealthCheck.reschedule_abandoned_jobs
89
+ it "must reschedule jobs locked by dead workers" do
90
+ described_class.reschedule_abandoned_jobs
89
91
  @dead_job.reload
90
92
  expect(@dead_job.run_at).to be > initial_run_at
91
93
  expect(@dead_job.locked_at).to be_nil
92
94
  expect(@dead_job.locked_by).to be_nil
93
95
  end
94
96
 
95
- it 'ignores jobs that are re-locked after fetching from db' do
96
- Delayed::Job.where(id: @dead_job).update_all(locked_by: 'someone_else')
97
+ it "ignores jobs that are re-locked after fetching from db" do
98
+ Delayed::Job.where(id: @dead_job).update_all(locked_by: "someone_else")
97
99
  allow(Delayed::Job).to receive(:running_jobs).and_return([@dead_job])
98
- Delayed::Worker::HealthCheck.reschedule_abandoned_jobs
100
+ described_class.reschedule_abandoned_jobs
99
101
  @dead_job.reload
100
- expect(@dead_job.locked_by).to eq 'someone_else'
102
+ expect(@dead_job.locked_by).to eq "someone_else"
101
103
  end
102
104
 
103
- it 'ignores jobs that are prefetched' do
104
- Delayed::Job.where(id: @dead_job).update_all(locked_by: 'prefetch:some_node')
105
+ it "ignores jobs that are prefetched" do
106
+ Delayed::Job.where(id: @dead_job).update_all(locked_by: "prefetch:some_node")
105
107
  allow(Delayed::Job).to receive(:running_jobs).and_return([@dead_job])
106
- Delayed::Worker::HealthCheck.reschedule_abandoned_jobs
108
+ described_class.reschedule_abandoned_jobs
107
109
  @dead_job.reload
108
- expect(@dead_job.locked_by).to eq 'prefetch:some_node'
110
+ expect(@dead_job.locked_by).to eq "prefetch:some_node"
109
111
  end
110
112
 
111
113
  it "bails immediately if advisory lock already taken" do
112
- allow(Delayed::Worker::HealthCheck).to receive(:attempt_advisory_lock).and_return(false)
113
- Delayed::Worker::HealthCheck.reschedule_abandoned_jobs
114
+ allow(described_class).to receive(:attempt_advisory_lock).and_return(false)
115
+ described_class.reschedule_abandoned_jobs
114
116
  @dead_job.reload
115
117
  expect(@dead_job.run_at.to_i).to eq(initial_run_at.to_i)
116
- expect(@dead_job.locked_at).to_not be_nil
117
- expect(@dead_job.locked_by).to_not be_nil
118
+ expect(@dead_job.locked_at).not_to be_nil
119
+ expect(@dead_job.locked_by).not_to be_nil
118
120
  end
119
121
  end
120
122
 
121
- describe '#initialize' do
122
- it 'must raise ArgumentError when the worker name is not supplied' do
123
+ describe "#initialize" do
124
+ it "must raise ArgumentError when the worker name is not supplied" do
123
125
  expect { klass.new }.to raise_error ArgumentError
124
126
  end
125
127
  end
@@ -3,22 +3,27 @@
3
3
  require_relative "../spec_helper"
4
4
 
5
5
  describe Delayed::Worker do
6
- let(:worker_config) { {
7
- queue: "test", min_priority: 1, max_priority: 2, stuff: "stuff",
8
- }.freeze }
9
- let(:job_attrs) { {
10
- id: 42, name: "testjob", full_name: "testfullname", :last_error= => nil,
11
- attempts: 1, reschedule: nil, :expired? => false,
12
- payload_object: {}, priority: 25
13
- }.freeze }
14
6
  subject { described_class.new(worker_config.dup) }
15
7
 
16
- after { Delayed::Worker.lifecycle.reset! }
8
+ let(:worker_config) do
9
+ {
10
+ queue: "test", min_priority: 1, max_priority: 2, stuff: "stuff"
11
+ }.freeze
12
+ end
13
+ let(:job_attrs) do
14
+ {
15
+ id: 42, name: "testjob", full_name: "testfullname", :last_error= => nil,
16
+ attempts: 1, reschedule: nil, :expired? => false,
17
+ payload_object: {}, priority: 25
18
+ }.freeze
19
+ end
20
+
21
+ after { described_class.lifecycle.reset! }
17
22
 
18
23
  describe "#perform" do
19
24
  it "fires off an error callback when a job raises an exception" do
20
25
  fired = false
21
- Delayed::Worker.lifecycle.before(:error) {|worker, exception| fired = true}
26
+ described_class.lifecycle.before(:error) { |_worker, _exception| fired = true }
22
27
  job = double(job_attrs)
23
28
  output_count = subject.perform(job)
24
29
  expect(fired).to be_truthy
@@ -27,8 +32,8 @@ describe Delayed::Worker do
27
32
 
28
33
  it "uses the retry callback for a retriable exception" do
29
34
  error_fired = retry_fired = false
30
- Delayed::Worker.lifecycle.before(:error) {|worker, exception| error_fired = true }
31
- Delayed::Worker.lifecycle.before(:retry) {|worker, exception| retry_fired = true}
35
+ described_class.lifecycle.before(:error) { |_worker, _exception| error_fired = true }
36
+ described_class.lifecycle.before(:retry) { |_worker, _exception| retry_fired = true }
32
37
  job = Delayed::Job.new(payload_object: {}, priority: 25, strand: "test_jobs", max_attempts: 3)
33
38
  expect(job).to receive(:invoke_job) do
34
39
  raise Delayed::RetriableError, "that's all this job does"
@@ -40,15 +45,13 @@ describe Delayed::Worker do
40
45
  end
41
46
 
42
47
  it "reloads" do
43
- fakeApplication = double('Rails.application',
44
- config: double('Rails.application.config',
45
- cache_classes: false,
46
- reload_classes_only_on_change: false
47
- ),
48
- reloader: double()
49
- )
48
+ fake_application = double("Rails.application",
49
+ config: double("Rails.application.config",
50
+ cache_classes: false,
51
+ reload_classes_only_on_change: false),
52
+ reloader: double)
50
53
 
51
- allow(Rails).to receive(:application).and_return(fakeApplication)
54
+ allow(Rails).to receive(:application).and_return(fake_application)
52
55
  if Rails::VERSION::MAJOR >= 5
53
56
  expect(Rails.application.reloader).to receive(:reload!).once
54
57
  else
@@ -61,7 +64,7 @@ describe Delayed::Worker do
61
64
  end
62
65
 
63
66
  describe "#log_job" do
64
- around(:each) do |block|
67
+ around do |block|
65
68
  prev_logger = Delayed::Settings.job_detailed_log_format
66
69
  block.call
67
70
  Delayed::Settings.job_detailed_log_format = prev_logger
@@ -73,11 +76,11 @@ describe Delayed::Worker do
73
76
  short_log_format = subject.log_job(job, :short)
74
77
  expect(short_log_format).to eq("RSpec::Mocks::Double")
75
78
  long_format = subject.log_job(job, :long)
76
- 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}")
79
+ 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}") # rubocop:disable Layout/LineLength
77
80
  end
78
81
 
79
82
  it "logging format can be changed with settings" do
80
- Delayed::Settings.job_detailed_log_format = ->(job){ "override format #{job.strand}"}
83
+ Delayed::Settings.job_detailed_log_format = ->(job) { "override format #{job.strand}" }
81
84
  payload = double(perform: nil)
82
85
  job = Delayed::Job.new(payload_object: payload, priority: 25, strand: "test_jobs")
83
86
  short_log_format = subject.log_job(job, :short)
@@ -89,8 +92,8 @@ describe Delayed::Worker do
89
92
 
90
93
  describe "#run" do
91
94
  it "passes extra config options through to the WorkQueue" do
92
- expect(subject.work_queue).to receive(:get_and_lock_next_available).
93
- with(subject.name, worker_config).and_return(nil)
95
+ expect(subject.work_queue).to receive(:get_and_lock_next_available)
96
+ .with(subject.name, worker_config).and_return(nil)
94
97
  subject.run
95
98
  end
96
99
  end
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source "https://rubygems.org"
2
4
 
3
- gemspec :path=>"../../"
5
+ gemspec path: "../../"
4
6
 
5
7
  gem "rails", "~> 5.2.0"
6
- gem 'sinatra', "2.0.0.beta2"
7
- gem 'sinatra-contrib', "2.0.0.beta2"
8
+ gem "sinatra", "~> 2.0"
9
+ gem "sinatra-contrib", "~> 2.0"
@@ -0,0 +1,240 @@
1
+ PATH
2
+ remote: ../..
3
+ specs:
4
+ inst-jobs (2.3.3)
5
+ activerecord (>= 5.2)
6
+ activesupport (>= 5.2)
7
+ after_transaction_commit (>= 1.0, < 3)
8
+ debug_inspector (~> 1.0)
9
+ fugit (~> 1.3)
10
+ railties (>= 5.2)
11
+ redis (> 3.0)
12
+ redis-scripting (~> 1.0.1)
13
+
14
+ GEM
15
+ remote: https://rubygems.org/
16
+ specs:
17
+ actioncable (5.2.6)
18
+ actionpack (= 5.2.6)
19
+ nio4r (~> 2.0)
20
+ websocket-driver (>= 0.6.1)
21
+ actionmailer (5.2.6)
22
+ actionpack (= 5.2.6)
23
+ actionview (= 5.2.6)
24
+ activejob (= 5.2.6)
25
+ mail (~> 2.5, >= 2.5.4)
26
+ rails-dom-testing (~> 2.0)
27
+ actionpack (5.2.6)
28
+ actionview (= 5.2.6)
29
+ activesupport (= 5.2.6)
30
+ rack (~> 2.0, >= 2.0.8)
31
+ rack-test (>= 0.6.3)
32
+ rails-dom-testing (~> 2.0)
33
+ rails-html-sanitizer (~> 1.0, >= 1.0.2)
34
+ actionview (5.2.6)
35
+ activesupport (= 5.2.6)
36
+ builder (~> 3.1)
37
+ erubi (~> 1.4)
38
+ rails-dom-testing (~> 2.0)
39
+ rails-html-sanitizer (~> 1.0, >= 1.0.3)
40
+ activejob (5.2.6)
41
+ activesupport (= 5.2.6)
42
+ globalid (>= 0.3.6)
43
+ activemodel (5.2.6)
44
+ activesupport (= 5.2.6)
45
+ activerecord (5.2.6)
46
+ activemodel (= 5.2.6)
47
+ activesupport (= 5.2.6)
48
+ arel (>= 9.0)
49
+ activestorage (5.2.6)
50
+ actionpack (= 5.2.6)
51
+ activerecord (= 5.2.6)
52
+ marcel (~> 1.0.0)
53
+ activesupport (5.2.6)
54
+ concurrent-ruby (~> 1.0, >= 1.0.2)
55
+ i18n (>= 0.7, < 2)
56
+ minitest (~> 5.1)
57
+ tzinfo (~> 1.1)
58
+ addressable (2.8.0)
59
+ public_suffix (>= 2.0.2, < 5.0)
60
+ after_transaction_commit (2.2.2)
61
+ activerecord (>= 5.2)
62
+ arel (9.0.0)
63
+ builder (3.2.4)
64
+ bump (0.10.0)
65
+ byebug (11.1.3)
66
+ coderay (1.1.3)
67
+ concurrent-ruby (1.1.9)
68
+ crack (0.4.5)
69
+ rexml
70
+ crass (1.0.6)
71
+ database_cleaner (2.0.1)
72
+ database_cleaner-active_record (~> 2.0.0)
73
+ database_cleaner-active_record (2.0.1)
74
+ activerecord (>= 5.a)
75
+ database_cleaner-core (~> 2.0.0)
76
+ database_cleaner-core (2.0.1)
77
+ debug_inspector (1.1.0)
78
+ deep_merge (1.2.1)
79
+ diff-lcs (1.4.4)
80
+ diplomat (2.5.1)
81
+ deep_merge (~> 1.2)
82
+ faraday (>= 0.9)
83
+ erubi (1.10.0)
84
+ et-orbi (1.2.4)
85
+ tzinfo
86
+ faraday (1.7.0)
87
+ faraday-em_http (~> 1.0)
88
+ faraday-em_synchrony (~> 1.0)
89
+ faraday-excon (~> 1.1)
90
+ faraday-httpclient (~> 1.0.1)
91
+ faraday-net_http (~> 1.0)
92
+ faraday-net_http_persistent (~> 1.1)
93
+ faraday-patron (~> 1.0)
94
+ faraday-rack (~> 1.0)
95
+ multipart-post (>= 1.2, < 3)
96
+ ruby2_keywords (>= 0.0.4)
97
+ faraday-em_http (1.0.0)
98
+ faraday-em_synchrony (1.0.0)
99
+ faraday-excon (1.1.0)
100
+ faraday-httpclient (1.0.1)
101
+ faraday-net_http (1.0.1)
102
+ faraday-net_http_persistent (1.2.0)
103
+ faraday-patron (1.0.0)
104
+ faraday-rack (1.0.0)
105
+ fugit (1.5.0)
106
+ et-orbi (~> 1.1, >= 1.1.8)
107
+ raabro (~> 1.4)
108
+ globalid (0.5.2)
109
+ activesupport (>= 5.0)
110
+ hashdiff (1.0.1)
111
+ i18n (1.8.10)
112
+ concurrent-ruby (~> 1.0)
113
+ loofah (2.12.0)
114
+ crass (~> 1.0.2)
115
+ nokogiri (>= 1.5.9)
116
+ mail (2.7.1)
117
+ mini_mime (>= 0.1.1)
118
+ marcel (1.0.1)
119
+ method_source (1.0.0)
120
+ mini_mime (1.1.0)
121
+ minitest (5.14.4)
122
+ multi_json (1.15.0)
123
+ multipart-post (2.1.1)
124
+ mustermann (1.1.1)
125
+ ruby2_keywords (~> 0.0.1)
126
+ nio4r (2.5.8)
127
+ nokogiri (1.12.3-x86_64-darwin)
128
+ racc (~> 1.4)
129
+ pg (1.2.3)
130
+ pry (0.14.1)
131
+ coderay (~> 1.1)
132
+ method_source (~> 1.0)
133
+ public_suffix (4.0.6)
134
+ raabro (1.4.0)
135
+ racc (1.5.2)
136
+ rack (2.2.3)
137
+ rack-protection (2.1.0)
138
+ rack
139
+ rack-test (1.1.0)
140
+ rack (>= 1.0, < 3)
141
+ rails (5.2.6)
142
+ actioncable (= 5.2.6)
143
+ actionmailer (= 5.2.6)
144
+ actionpack (= 5.2.6)
145
+ actionview (= 5.2.6)
146
+ activejob (= 5.2.6)
147
+ activemodel (= 5.2.6)
148
+ activerecord (= 5.2.6)
149
+ activestorage (= 5.2.6)
150
+ activesupport (= 5.2.6)
151
+ bundler (>= 1.3.0)
152
+ railties (= 5.2.6)
153
+ sprockets-rails (>= 2.0.0)
154
+ rails-dom-testing (2.0.3)
155
+ activesupport (>= 4.2.0)
156
+ nokogiri (>= 1.6)
157
+ rails-html-sanitizer (1.3.0)
158
+ loofah (~> 2.3)
159
+ railties (5.2.6)
160
+ actionpack (= 5.2.6)
161
+ activesupport (= 5.2.6)
162
+ method_source
163
+ rake (>= 0.8.7)
164
+ thor (>= 0.19.0, < 2.0)
165
+ rake (13.0.6)
166
+ redis (4.4.0)
167
+ redis-scripting (1.0.1)
168
+ redis (>= 3.0)
169
+ rexml (3.2.5)
170
+ rspec (3.10.0)
171
+ rspec-core (~> 3.10.0)
172
+ rspec-expectations (~> 3.10.0)
173
+ rspec-mocks (~> 3.10.0)
174
+ rspec-core (3.10.1)
175
+ rspec-support (~> 3.10.0)
176
+ rspec-expectations (3.10.1)
177
+ diff-lcs (>= 1.2.0, < 2.0)
178
+ rspec-support (~> 3.10.0)
179
+ rspec-mocks (3.10.2)
180
+ diff-lcs (>= 1.2.0, < 2.0)
181
+ rspec-support (~> 3.10.0)
182
+ rspec-support (3.10.2)
183
+ ruby2_keywords (0.0.5)
184
+ sinatra (2.1.0)
185
+ mustermann (~> 1.0)
186
+ rack (~> 2.2)
187
+ rack-protection (= 2.1.0)
188
+ tilt (~> 2.0)
189
+ sinatra-contrib (2.1.0)
190
+ multi_json
191
+ mustermann (~> 1.0)
192
+ rack-protection (= 2.1.0)
193
+ sinatra (= 2.1.0)
194
+ tilt (~> 2.0)
195
+ sprockets (4.0.2)
196
+ concurrent-ruby (~> 1.0)
197
+ rack (> 1, < 3)
198
+ sprockets-rails (3.2.2)
199
+ actionpack (>= 4.0)
200
+ activesupport (>= 4.0)
201
+ sprockets (>= 3.0.0)
202
+ thor (1.1.0)
203
+ thread_safe (0.3.6)
204
+ tilt (2.0.10)
205
+ timecop (0.9.4)
206
+ tzinfo (1.2.9)
207
+ thread_safe (~> 0.1)
208
+ webmock (3.14.0)
209
+ addressable (>= 2.8.0)
210
+ crack (>= 0.3.2)
211
+ hashdiff (>= 0.4.0, < 2.0.0)
212
+ websocket-driver (0.7.5)
213
+ websocket-extensions (>= 0.1.0)
214
+ websocket-extensions (0.1.5)
215
+ wwtd (1.4.1)
216
+
217
+ PLATFORMS
218
+ x86_64-darwin-20
219
+
220
+ DEPENDENCIES
221
+ bump
222
+ byebug
223
+ database_cleaner (~> 2.0)
224
+ database_cleaner-active_record (~> 2.0)
225
+ diplomat (~> 2.5.1)
226
+ inst-jobs!
227
+ pg
228
+ pry
229
+ rack-test
230
+ rails (~> 5.2.0)
231
+ rake
232
+ rspec (~> 3.10)
233
+ sinatra (~> 2.0)
234
+ sinatra-contrib (~> 2.0)
235
+ timecop (= 0.9.4)
236
+ webmock
237
+ wwtd (~> 1.4.0)
238
+
239
+ BUNDLED WITH
240
+ 2.2.24
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  source "https://rubygems.org"
2
4
 
3
- gemspec :path=>"../../"
5
+ gemspec path: "../../"
4
6
 
5
7
  gem "rails", "~> 6.0.0"
6
- gem 'sinatra', "2.0.0.beta2"
7
- gem 'sinatra-contrib', "2.0.0.beta2"
8
+ gem "sinatra", "~> 2.0"
9
+ gem "sinatra-contrib", "~> 2.0"