inst-jobs 2.4.2 → 2.4.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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"