inst-jobs 2.4.2 → 2.4.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 01775da114eba627cb910bdfeb9856bedc03ea0dabca5b66c4fe841022f9102e
4
- data.tar.gz: 0dfd89d95cec1fd67f37df9fafee7ba7bb880c3f60483467cbb2af8a3e9978e5
3
+ metadata.gz: ba509dbe247e504537397a8482595ee6dbeac623c69141a24aa56f753343484f
4
+ data.tar.gz: 69502011608a6ac485012dd8ebc5ed9e616b8643ed92a297778100f9ddf51e15
5
5
  SHA512:
6
- metadata.gz: 69268ba783f682b4e228eb9f26203e5f82b1584e77bd6c3d31a1a9bec17bda5aa3b7804516e09bf30fbba225d55c19b1d31bf4e848f03021e6fd87e76f16dfd2
7
- data.tar.gz: 418042945e1c4c92f534e0c287e2207ff63f748556b87a1039364e044a3923e00a3b9294a9033d5d2ddc386086ae002f4aa8dc26c855aad8b89a9bbfa3b17b00
6
+ metadata.gz: bba4b9a818f3ce3f0cae2f9d77a556c2d9770a47730328d7b3d6de5c8e5bc338ab24da4a4c5006d68375c9b8c24f24af04a0e711ee71d57b17526c0ca401e275
7
+ data.tar.gz: 8ccc1674c9d7f7b1caa27d759a34b9670bc298ece8d85472ba23b83e03cb672cff7372547a84d8c13363aa93447ff0249255f02e5353458d252ef77e1bc89b35
@@ -90,7 +90,6 @@ class AddSingletonColumn < ActiveRecord::Migration[5.2]
90
90
  execute(<<~SQL)
91
91
  CREATE OR REPLACE FUNCTION delayed_jobs_before_insert_row_tr_fn () RETURNS trigger AS $$
92
92
  BEGIN
93
- RAISE NOTICE 'inserting job';
94
93
  IF NEW.strand IS NOT NULL THEN
95
94
  PERFORM pg_advisory_xact_lock(half_md5_as_bigint(NEW.strand));
96
95
  IF (SELECT COUNT(*) FROM (
@@ -100,10 +99,8 @@ class AddSingletonColumn < ActiveRecord::Migration[5.2]
100
99
  END IF;
101
100
  END IF;
102
101
  IF NEW.singleton IS NOT NULL THEN
103
- RAISE NOTICE 'inserting job that is a singleton';
104
102
  PERFORM 1 FROM delayed_jobs WHERE singleton = NEW.singleton;
105
103
  IF FOUND THEN
106
- RAISE NOTICE 'and not first';
107
104
  NEW.next_in_strand := false;
108
105
  END IF;
109
106
  END IF;
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ class AddDeleteConflictingSingletonsBeforeUnlockTrigger < ActiveRecord::Migration[5.2]
4
+ def up
5
+ execute(<<~SQL)
6
+ CREATE FUNCTION delayed_jobs_before_unlock_delete_conflicting_singletons_row_fn () RETURNS trigger AS $$
7
+ BEGIN
8
+ IF EXISTS (SELECT 1 FROM delayed_jobs j2 WHERE j2.singleton=OLD.singleton) THEN
9
+ DELETE FROM delayed_jobs WHERE id<>OLD.id AND singleton=OLD.singleton;
10
+ END IF;
11
+ RETURN NEW;
12
+ END;
13
+ $$ LANGUAGE plpgsql;
14
+ SQL
15
+ execute(<<~SQL)
16
+ CREATE TRIGGER delayed_jobs_before_unlock_delete_conflicting_singletons_row_tr BEFORE UPDATE ON delayed_jobs FOR EACH ROW WHEN (
17
+ OLD.singleton IS NOT NULL AND
18
+ OLD.singleton=NEW.singleton AND
19
+ OLD.locked_by IS NOT NULL AND
20
+ NEW.locked_by IS NULL) EXECUTE PROCEDURE delayed_jobs_before_unlock_delete_conflicting_singletons_row_fn();
21
+ SQL
22
+ end
23
+
24
+ def down
25
+ execute("DROP FUNCTION delayed_jobs_before_unlock_delete_conflicting_singletons_row_tr_fn()")
26
+ end
27
+ end
@@ -38,6 +38,11 @@ module Delayed
38
38
  job = new(attributes, &block)
39
39
  job.single_step_create(on_conflict: on_conflict)
40
40
  end
41
+
42
+ def attempt_advisory_lock(lock_name)
43
+ fn_name = connection.quote_table_name("half_md5_as_bigint")
44
+ connection.select_value("SELECT pg_try_advisory_xact_lock(#{fn_name}('#{lock_name}'));")
45
+ end
41
46
  end
42
47
 
43
48
  def single_step_create(on_conflict: nil)
@@ -98,11 +103,11 @@ module Delayed
98
103
  fn_name = connection.quote_table_name("half_md5_as_bigint")
99
104
  sql = "SELECT pg_advisory_xact_lock(#{fn_name}(#{connection.quote(values['strand'])})); #{sql}"
100
105
  end
101
- result = connection.execute(sql, "#{self} Create")
106
+ result = connection.execute(sql, "#{self.class} Create")
102
107
  self.id = result.values.first&.first
103
108
  result.clear
104
109
  else
105
- result = connection.exec_query(sql, "#{self} Create", binds)
110
+ result = connection.exec_query(sql, "#{self.class} Create", binds)
106
111
  self.id = connection.send(:last_inserted_id, result)
107
112
  end
108
113
 
@@ -458,9 +463,19 @@ module Delayed
458
463
  where("locked_by LIKE ?", "#{name}:%").pluck(:locked_by).map { |locked_by| locked_by.split(":").last.to_i }
459
464
  end
460
465
 
466
+ def self.prefetch_jobs_lock_name
467
+ "Delayed::Job.unlock_orphaned_prefetched_jobs"
468
+ end
469
+
461
470
  def self.unlock_orphaned_prefetched_jobs
462
- horizon = db_time_now - Settings.parent_process[:prefetched_jobs_timeout] * 4
463
- where("locked_by LIKE 'prefetch:%' AND locked_at<?", horizon).update_all(locked_at: nil, locked_by: nil)
471
+ transaction do
472
+ # for db performance reasons, we only need one process doing this at a time
473
+ # so if we can't get an advisory lock, just abort. we'll try again soon
474
+ return unless attempt_advisory_lock(prefetch_jobs_lock_name)
475
+
476
+ horizon = db_time_now - (Settings.parent_process[:prefetched_jobs_timeout] * 4)
477
+ where("locked_by LIKE 'prefetch:%' AND locked_at<?", horizon).update_all(locked_at: nil, locked_by: nil)
478
+ end
464
479
  end
465
480
 
466
481
  def self.unlock(jobs)
@@ -148,7 +148,7 @@ module Delayed
148
148
  end
149
149
 
150
150
  def unlock_orphaned_prefetched_jobs
151
- horizon = db_time_now - Settings.parent_process[:prefetched_jobs_timeout] * 4
151
+ horizon = db_time_now - (Settings.parent_process[:prefetched_jobs_timeout] * 4)
152
152
  orphaned_jobs = running_jobs.select do |job|
153
153
  job.locked_by.start_with?("prefetch:") && job.locked_at < horizon
154
154
  end
@@ -31,7 +31,7 @@ module Delayed
31
31
  end
32
32
 
33
33
  if @synchronous
34
- if @sender.nil? || sender_is_object || sender_is_class && @object.protected_methods.include?(method)
34
+ if @sender.nil? || sender_is_object || (sender_is_class && @object.protected_methods.include?(method))
35
35
  return @object.send(method, *args) if kwargs.empty?
36
36
 
37
37
  return @object.send(method, *args, **kwargs)
@@ -35,7 +35,7 @@ module Delayed
35
35
  sender_is_object = sender == object
36
36
  sender_is_class = sender.is_a?(object.class)
37
37
 
38
- if sender.nil? || sender_is_object || sender_is_class && object.protected_methods.include?(method)
38
+ if sender.nil? || sender_is_object || (sender_is_class && object.protected_methods.include?(method))
39
39
  if kwargs.empty?
40
40
  object.send(method, *args)
41
41
  else
@@ -33,7 +33,13 @@ module Delayed
33
33
  # we used to queue up a job in a strand here, and perform the audit inside that job
34
34
  # however, now that we're using singletons for scheduling periodic jobs,
35
35
  # it's fine to just do the audit in-line here without risk of creating duplicates
36
- perform_audit!
36
+ Delayed::Job.transaction do
37
+ # for db performance reasons, we only need one process doing this at a time
38
+ # so if we can't get an advisory lock, just abort. we'll try again soon
39
+ return unless Delayed::Job.attempt_advisory_lock("Delayed::Periodic#audit_queue")
40
+
41
+ perform_audit!
42
+ end
37
43
  end
38
44
 
39
45
  # make sure all periodic jobs are scheduled for their next run in the job queue
data/lib/delayed/pool.rb CHANGED
@@ -188,7 +188,7 @@ module Delayed
188
188
  end
189
189
 
190
190
  def pool_sleep
191
- IO.select([@self_pipe[0]], nil, nil, POOL_SLEEP_PERIOD)
191
+ @self_pipe[0].wait_readable(POOL_SLEEP_PERIOD)
192
192
  @self_pipe[0].read_nonblock(11, exception: false)
193
193
  end
194
194
 
@@ -101,7 +101,7 @@ module Delayed
101
101
  # Expands rails-relative paths, without depending on rails being loaded.
102
102
  def expand_rails_path(path)
103
103
  root = if defined?(Rails) && Rails.root
104
- "#{Rails.root}Gemfile".to_s
104
+ Rails.root.join("Gemfile")
105
105
  else
106
106
  ENV.fetch("BUNDLE_GEMFILE", "#{Dir.pwd}/Gemfile")
107
107
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Delayed
4
- VERSION = "2.4.2"
4
+ VERSION = "2.4.6"
5
5
  end
@@ -49,7 +49,7 @@ module Delayed
49
49
  last_orphaned_prefetched_jobs_purge = Job.db_time_now - rand(15 * 60)
50
50
  until exit?
51
51
  run_once
52
- if last_orphaned_prefetched_jobs_purge + 15 * 60 < Job.db_time_now
52
+ if last_orphaned_prefetched_jobs_purge + (15 * 60) < Job.db_time_now
53
53
  Job.unlock_orphaned_prefetched_jobs
54
54
  last_orphaned_prefetched_jobs_purge = Job.db_time_now
55
55
  end
@@ -68,7 +68,7 @@ module Delayed
68
68
  # if they're not keeping up, the jobs will slip back in time, and suddenly we'll become
69
69
  # active and quickly pick up all the jobs we can. The latency is calculated to ensure that
70
70
  # an active worker is guaranteed to have attempted to fetch new jobs in the meantime
71
- forced_latency = Settings.sleep_delay + Settings.sleep_delay_stagger * 2 if all_workers_idle?
71
+ forced_latency = Settings.sleep_delay + (Settings.sleep_delay_stagger * 2) if all_workers_idle?
72
72
  timeout = Settings.sleep_delay + (rand * Settings.sleep_delay_stagger)
73
73
  readable, = IO.select(handles, nil, nil, timeout)
74
74
  readable&.each { |s| handle_read(s) }
@@ -156,7 +156,7 @@ module Delayed
156
156
  worker_config[:queue],
157
157
  worker_config[:min_priority],
158
158
  worker_config[:max_priority],
159
- prefetch: Settings.fetch_batch_size * (worker_config[:workers] || 1) - recipients.length,
159
+ prefetch: (Settings.fetch_batch_size * (worker_config[:workers] || 1)) - recipients.length,
160
160
  prefetch_owner: prefetch_owner,
161
161
  forced_latency: forced_latency
162
162
  )
@@ -195,11 +195,13 @@ module Delayed
195
195
  def unlock_timed_out_prefetched_jobs
196
196
  @prefetched_jobs.each do |(worker_config, jobs)|
197
197
  next if jobs.empty?
198
+ next unless jobs.first.locked_at < Time.now.utc - Settings.parent_process[:prefetched_jobs_timeout]
198
199
 
199
- if jobs.first.locked_at < Time.now.utc - Settings.parent_process[:prefetched_jobs_timeout]
200
+ Delayed::Job.transaction do
201
+ Delayed::Job.connection.execute("SELECT pg_advisory_xact_lock('#{Delayed::Job.prefetch_jobs_lock_name}')")
200
202
  Delayed::Job.unlock(jobs)
201
- @prefetched_jobs[worker_config] = []
202
203
  end
204
+ @prefetched_jobs[worker_config] = []
203
205
  end
204
206
  end
205
207
 
@@ -207,7 +209,10 @@ module Delayed
207
209
  @prefetched_jobs.each do |(_worker_config, jobs)|
208
210
  next if jobs.empty?
209
211
 
210
- Delayed::Job.unlock(jobs)
212
+ Delayed::Job.transaction do
213
+ Delayed::Job.connection.execute("SELECT pg_advisory_xact_lock('#{Delayed::Job.prefetch_jobs_lock_name}')")
214
+ Delayed::Job.unlock(jobs)
215
+ end
211
216
  end
212
217
  @prefetched_jobs = {}
213
218
  end
@@ -33,7 +33,7 @@ module Delayed
33
33
  # and we try to get an advisory lock when it runs. If we succeed,
34
34
  # no other worker is trying to do this right now (and if we abandon the
35
35
  # operation, the transaction will end, releasing the advisory lock).
36
- result = attempt_advisory_lock
36
+ result = Delayed::Job.attempt_advisory_lock("Delayed::Worker::HealthCheck#reschedule_abandoned_jobs")
37
37
  return unless result
38
38
 
39
39
  checker = Worker::HealthCheck.build(
@@ -65,13 +65,6 @@ module Delayed
65
65
  end
66
66
  end
67
67
  end
68
-
69
- def attempt_advisory_lock
70
- lock_name = "Delayed::Worker::HealthCheck#reschedule_abandoned_jobs"
71
- conn = ActiveRecord::Base.connection
72
- fn_name = conn.quote_table_name("half_md5_as_bigint")
73
- conn.select_value("SELECT pg_try_advisory_xact_lock(#{fn_name}('#{lock_name}'));")
74
- end
75
68
  end
76
69
 
77
70
  attr_accessor :config, :worker_name
@@ -207,7 +207,7 @@ describe "Delayed::Backed::ActiveRecord::Job" do
207
207
  job2 = Delayed::Job.new(tag: "tag")
208
208
 
209
209
  job1.create_and_lock!("prefetch:a")
210
- job1.locked_at = Delayed::Job.db_time_now - 15 * 60
210
+ job1.locked_at = Delayed::Job.db_time_now - (15 * 60)
211
211
  job1.save!
212
212
  job2.create_and_lock!("prefetch:a")
213
213
 
@@ -111,7 +111,7 @@ RSpec.describe Delayed::Worker::HealthCheck do
111
111
  end
112
112
 
113
113
  it "bails immediately if advisory lock already taken" do
114
- allow(described_class).to receive(:attempt_advisory_lock).and_return(false)
114
+ allow(Delayed::Job).to receive(:attempt_advisory_lock).and_return(false)
115
115
  described_class.reschedule_abandoned_jobs
116
116
  @dead_job.reload
117
117
  expect(@dead_job.run_at.to_i).to eq(initial_run_at.to_i)
@@ -491,6 +491,19 @@ shared_examples_for "a backend" do
491
491
  expect(@job2).to be_new_record
492
492
  end
493
493
  end
494
+
495
+ context "when unlocking with another singleton pending" do
496
+ it "deletes the pending singleton" do
497
+ @job1 = create_job(singleton: "myjobs", max_attempts: 2)
498
+ expect(Delayed::Job.get_and_lock_next_available("w1")).to eq(@job1)
499
+
500
+ @job2 = create_job(singleton: "myjobs", max_attempts: 2)
501
+
502
+ @job1.reload.reschedule
503
+ expect { @job1.reload }.not_to raise_error
504
+ expect { @job2.reload }.to raise_error(ActiveRecord::RecordNotFound)
505
+ end
506
+ end
494
507
  end
495
508
  end
496
509
 
data/spec/spec_helper.rb CHANGED
@@ -4,6 +4,7 @@ require "delayed_job"
4
4
  require "delayed/testing"
5
5
 
6
6
  require "database_cleaner"
7
+ require "fileutils"
7
8
  require "rack/test"
8
9
  require "timecop"
9
10
  require "webmock/rspec"
@@ -80,7 +81,8 @@ Delayed::Backend::ActiveRecord::Job.reset_column_information
80
81
  Delayed::Backend::ActiveRecord::Job::Failed.reset_column_information
81
82
 
82
83
  Time.zone = "UTC" # rubocop:disable Rails/TimeZoneAssignment
83
- Rails.logger = Logger.new(nil)
84
+ FileUtils.mkdir_p("tmp")
85
+ ActiveRecord::Base.logger = Rails.logger = Logger.new("tmp/test.log")
84
86
 
85
87
  # Purely useful for test cases...
86
88
  class Story < ActiveRecord::Base
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: 2.4.2
4
+ version: 2.4.6
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: 2021-09-10 00:00:00.000000000 Z
12
+ date: 2021-09-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activerecord
@@ -101,6 +101,20 @@ dependencies:
101
101
  - - ">="
102
102
  - !ruby/object:Gem::Version
103
103
  version: '5.2'
104
+ - !ruby/object:Gem::Dependency
105
+ name: appraisal
106
+ requirement: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '2.4'
111
+ type: :development
112
+ prerelease: false
113
+ version_requirements: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '2.4'
104
118
  - !ruby/object:Gem::Dependency
105
119
  name: bump
106
120
  requirement: !ruby/object:Gem::Requirement
@@ -417,6 +431,7 @@ files:
417
431
  - db/migrate/20200825011002_add_strand_order_override.rb
418
432
  - db/migrate/20210809145804_add_n_strand_index.rb
419
433
  - db/migrate/20210812210128_add_singleton_column.rb
434
+ - db/migrate/20210917232626_add_delete_conflicting_singletons_before_unlock_trigger.rb
420
435
  - exe/inst_jobs
421
436
  - lib/delayed/backend/active_record.rb
422
437
  - lib/delayed/backend/base.rb
@@ -469,11 +484,6 @@ files:
469
484
  - spec/delayed/worker/consul_health_check_spec.rb
470
485
  - spec/delayed/worker/health_check_spec.rb
471
486
  - spec/delayed/worker_spec.rb
472
- - spec/gemfiles/52.gemfile
473
- - spec/gemfiles/52.gemfile.lock
474
- - spec/gemfiles/60.gemfile
475
- - spec/gemfiles/60.gemfile.lock
476
- - spec/gemfiles/61.gemfile
477
487
  - spec/migrate/20140924140513_add_story_table.rb
478
488
  - spec/sample_jobs.rb
479
489
  - spec/shared/delayed_batch.rb
@@ -509,11 +519,6 @@ summary: Instructure-maintained fork of delayed_job
509
519
  test_files:
510
520
  - spec/sample_jobs.rb
511
521
  - spec/spec_helper.rb
512
- - spec/gemfiles/60.gemfile.lock
513
- - spec/gemfiles/61.gemfile
514
- - spec/gemfiles/60.gemfile
515
- - spec/gemfiles/52.gemfile
516
- - spec/gemfiles/52.gemfile.lock
517
522
  - spec/shared_jobs_specs.rb
518
523
  - spec/shared/performable_method.rb
519
524
  - spec/shared/testing.rb
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- source "https://rubygems.org"
4
-
5
- gemspec path: "../../"
6
-
7
- gem "rails", "~> 5.2.0"
8
- gem "sinatra", "~> 2.0"
9
- gem "sinatra-contrib", "~> 2.0"
@@ -1,240 +0,0 @@
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,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- source "https://rubygems.org"
4
-
5
- gemspec path: "../../"
6
-
7
- gem "rails", "~> 6.0.0"
8
- gem "sinatra", "~> 2.0"
9
- gem "sinatra-contrib", "~> 2.0"
@@ -1,246 +0,0 @@
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 (6.0.3.7)
18
- actionpack (= 6.0.3.7)
19
- nio4r (~> 2.0)
20
- websocket-driver (>= 0.6.1)
21
- actionmailbox (6.0.3.7)
22
- actionpack (= 6.0.3.7)
23
- activejob (= 6.0.3.7)
24
- activerecord (= 6.0.3.7)
25
- activestorage (= 6.0.3.7)
26
- activesupport (= 6.0.3.7)
27
- mail (>= 2.7.1)
28
- actionmailer (6.0.3.7)
29
- actionpack (= 6.0.3.7)
30
- actionview (= 6.0.3.7)
31
- activejob (= 6.0.3.7)
32
- mail (~> 2.5, >= 2.5.4)
33
- rails-dom-testing (~> 2.0)
34
- actionpack (6.0.3.7)
35
- actionview (= 6.0.3.7)
36
- activesupport (= 6.0.3.7)
37
- rack (~> 2.0, >= 2.0.8)
38
- rack-test (>= 0.6.3)
39
- rails-dom-testing (~> 2.0)
40
- rails-html-sanitizer (~> 1.0, >= 1.2.0)
41
- actiontext (6.0.3.7)
42
- actionpack (= 6.0.3.7)
43
- activerecord (= 6.0.3.7)
44
- activestorage (= 6.0.3.7)
45
- activesupport (= 6.0.3.7)
46
- nokogiri (>= 1.8.5)
47
- actionview (6.0.3.7)
48
- activesupport (= 6.0.3.7)
49
- builder (~> 3.1)
50
- erubi (~> 1.4)
51
- rails-dom-testing (~> 2.0)
52
- rails-html-sanitizer (~> 1.1, >= 1.2.0)
53
- activejob (6.0.3.7)
54
- activesupport (= 6.0.3.7)
55
- globalid (>= 0.3.6)
56
- activemodel (6.0.3.7)
57
- activesupport (= 6.0.3.7)
58
- activerecord (6.0.3.7)
59
- activemodel (= 6.0.3.7)
60
- activesupport (= 6.0.3.7)
61
- activestorage (6.0.3.7)
62
- actionpack (= 6.0.3.7)
63
- activejob (= 6.0.3.7)
64
- activerecord (= 6.0.3.7)
65
- marcel (~> 1.0.0)
66
- activesupport (6.0.3.7)
67
- concurrent-ruby (~> 1.0, >= 1.0.2)
68
- i18n (>= 0.7, < 2)
69
- minitest (~> 5.1)
70
- tzinfo (~> 1.1)
71
- zeitwerk (~> 2.2, >= 2.2.2)
72
- addressable (2.7.0)
73
- public_suffix (>= 2.0.2, < 5.0)
74
- after_transaction_commit (2.2.2)
75
- activerecord (>= 5.2)
76
- builder (3.2.4)
77
- bump (0.10.0)
78
- byebug (11.1.3)
79
- coderay (1.1.3)
80
- concurrent-ruby (1.1.9)
81
- crack (0.4.5)
82
- rexml
83
- crass (1.0.6)
84
- database_cleaner (2.0.1)
85
- database_cleaner-active_record (~> 2.0.0)
86
- database_cleaner-active_record (2.0.0)
87
- activerecord (>= 5.a)
88
- database_cleaner-core (~> 2.0.0)
89
- database_cleaner-core (2.0.1)
90
- debug_inspector (1.1.0)
91
- deep_merge (1.2.1)
92
- diff-lcs (1.4.4)
93
- diplomat (2.5.1)
94
- deep_merge (~> 1.2)
95
- faraday (>= 0.9)
96
- erubi (1.10.0)
97
- et-orbi (1.2.4)
98
- tzinfo
99
- faraday (1.4.1)
100
- faraday-excon (~> 1.1)
101
- faraday-net_http (~> 1.0)
102
- faraday-net_http_persistent (~> 1.1)
103
- multipart-post (>= 1.2, < 3)
104
- ruby2_keywords (>= 0.0.4)
105
- faraday-excon (1.1.0)
106
- faraday-net_http (1.0.1)
107
- faraday-net_http_persistent (1.1.0)
108
- fugit (1.4.5)
109
- et-orbi (~> 1.1, >= 1.1.8)
110
- raabro (~> 1.4)
111
- globalid (0.4.2)
112
- activesupport (>= 4.2.0)
113
- hashdiff (1.0.1)
114
- i18n (1.8.10)
115
- concurrent-ruby (~> 1.0)
116
- loofah (2.10.0)
117
- crass (~> 1.0.2)
118
- nokogiri (>= 1.5.9)
119
- mail (2.7.1)
120
- mini_mime (>= 0.1.1)
121
- marcel (1.0.1)
122
- method_source (1.0.0)
123
- mini_mime (1.1.0)
124
- minitest (5.14.4)
125
- multi_json (1.15.0)
126
- multipart-post (2.1.1)
127
- mustermann (1.1.1)
128
- ruby2_keywords (~> 0.0.1)
129
- nio4r (2.5.7)
130
- nokogiri (1.11.7-x86_64-darwin)
131
- racc (~> 1.4)
132
- pg (1.2.3)
133
- pry (0.14.1)
134
- coderay (~> 1.1)
135
- method_source (~> 1.0)
136
- public_suffix (4.0.6)
137
- raabro (1.4.0)
138
- racc (1.5.2)
139
- rack (2.2.3)
140
- rack-protection (2.1.0)
141
- rack
142
- rack-test (1.1.0)
143
- rack (>= 1.0, < 3)
144
- rails (6.0.3.7)
145
- actioncable (= 6.0.3.7)
146
- actionmailbox (= 6.0.3.7)
147
- actionmailer (= 6.0.3.7)
148
- actionpack (= 6.0.3.7)
149
- actiontext (= 6.0.3.7)
150
- actionview (= 6.0.3.7)
151
- activejob (= 6.0.3.7)
152
- activemodel (= 6.0.3.7)
153
- activerecord (= 6.0.3.7)
154
- activestorage (= 6.0.3.7)
155
- activesupport (= 6.0.3.7)
156
- bundler (>= 1.3.0)
157
- railties (= 6.0.3.7)
158
- sprockets-rails (>= 2.0.0)
159
- rails-dom-testing (2.0.3)
160
- activesupport (>= 4.2.0)
161
- nokogiri (>= 1.6)
162
- rails-html-sanitizer (1.3.0)
163
- loofah (~> 2.3)
164
- railties (6.0.3.7)
165
- actionpack (= 6.0.3.7)
166
- activesupport (= 6.0.3.7)
167
- method_source
168
- rake (>= 0.8.7)
169
- thor (>= 0.20.3, < 2.0)
170
- rake (13.0.3)
171
- redis (4.2.5)
172
- redis-scripting (1.0.1)
173
- redis (>= 3.0)
174
- rexml (3.2.5)
175
- rspec (3.10.0)
176
- rspec-core (~> 3.10.0)
177
- rspec-expectations (~> 3.10.0)
178
- rspec-mocks (~> 3.10.0)
179
- rspec-core (3.10.1)
180
- rspec-support (~> 3.10.0)
181
- rspec-expectations (3.10.1)
182
- diff-lcs (>= 1.2.0, < 2.0)
183
- rspec-support (~> 3.10.0)
184
- rspec-mocks (3.10.2)
185
- diff-lcs (>= 1.2.0, < 2.0)
186
- rspec-support (~> 3.10.0)
187
- rspec-support (3.10.2)
188
- ruby2_keywords (0.0.4)
189
- sinatra (2.1.0)
190
- mustermann (~> 1.0)
191
- rack (~> 2.2)
192
- rack-protection (= 2.1.0)
193
- tilt (~> 2.0)
194
- sinatra-contrib (2.1.0)
195
- multi_json
196
- mustermann (~> 1.0)
197
- rack-protection (= 2.1.0)
198
- sinatra (= 2.1.0)
199
- tilt (~> 2.0)
200
- sprockets (4.0.2)
201
- concurrent-ruby (~> 1.0)
202
- rack (> 1, < 3)
203
- sprockets-rails (3.2.2)
204
- actionpack (>= 4.0)
205
- activesupport (>= 4.0)
206
- sprockets (>= 3.0.0)
207
- thor (1.1.0)
208
- thread_safe (0.3.6)
209
- tilt (2.0.10)
210
- timecop (0.9.4)
211
- tzinfo (1.2.9)
212
- thread_safe (~> 0.1)
213
- webmock (3.13.0)
214
- addressable (>= 2.3.6)
215
- crack (>= 0.3.2)
216
- hashdiff (>= 0.4.0, < 2.0.0)
217
- websocket-driver (0.7.5)
218
- websocket-extensions (>= 0.1.0)
219
- websocket-extensions (0.1.5)
220
- wwtd (1.4.1)
221
- zeitwerk (2.4.2)
222
-
223
- PLATFORMS
224
- x86_64-darwin-20
225
-
226
- DEPENDENCIES
227
- bump
228
- byebug
229
- database_cleaner (~> 2.0)
230
- database_cleaner-active_record (~> 2.0)
231
- diplomat (~> 2.5.1)
232
- inst-jobs!
233
- pg
234
- pry
235
- rack-test
236
- rails (~> 6.0.0)
237
- rake
238
- rspec (~> 3.10)
239
- sinatra (~> 2.0)
240
- sinatra-contrib (~> 2.0)
241
- timecop (= 0.9.4)
242
- webmock
243
- wwtd (~> 1.4.0)
244
-
245
- BUNDLED WITH
246
- 2.2.17
@@ -1,9 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- source "https://rubygems.org"
4
-
5
- gemspec path: "../../"
6
-
7
- gem "rails", "~> 6.1.0"
8
- gem "sinatra", "~> 2.0"
9
- gem "sinatra-contrib", "~> 2.0"