inst-jobs 2.4.1 → 2.4.5

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: e30b7bf2c44f2397ae1db0e70f1590db4f212e125df4b1e4649351f8f5c54a34
4
- data.tar.gz: 6fbefaef9136f3f7364c3fe12afe2be9010ea90a5a9571a4ff23cfdd41f74019
3
+ metadata.gz: 3fa880428987cbea8be8cb706b2b4d4fae3164a021107591e7e1f5724a88fc4b
4
+ data.tar.gz: f9feb618c4043c02ce428146d9bc1801884639d72867e23f21c5b39b546c6a7f
5
5
  SHA512:
6
- metadata.gz: 96816f9b736391a18cf292795c3b86cd3f255d4455cfbc9225d16876c64afa083206268f385b8abf7ab78c66165c40a7408f179034d19f5b5a9de101ad30f078
7
- data.tar.gz: 052c17277bca1edbc763aa0efbffed110898b4069c82fbd6242f7ca232b06e4d0deecc8a2a91e82b9876e4a50ba3ab0a6d7e9767a0c70c0a7aecb7ed224bb2c5
6
+ metadata.gz: 9328098d390744e089edb857db0f27d379f3696f66c8c549655e6a9a5ea331e7083dda3eb3203200fb00ca1edf121a1264b7ffb228ea075f43889c8a20f7d02c
7
+ data.tar.gz: f6dfe1ad5d03c525daf9e445764bb191cdd6075d0c36156d3ff1499c7fb149718b4d5bb689da16349e49e9b1c25bb1e468ceed7e7cfa30543ce831047a7bd954
@@ -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
 
@@ -459,7 +464,7 @@ module Delayed
459
464
  end
460
465
 
461
466
  def self.unlock_orphaned_prefetched_jobs
462
- horizon = db_time_now - Settings.parent_process[:prefetched_jobs_timeout] * 4
467
+ horizon = db_time_now - (Settings.parent_process[:prefetched_jobs_timeout] * 4)
463
468
  where("locked_by LIKE 'prefetch:%' AND locked_at<?", horizon).update_all(locked_at: nil, locked_by: nil)
464
469
  end
465
470
 
@@ -148,13 +148,19 @@ 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
152
- orphaned_jobs = running_jobs.select do |job|
153
- job.locked_by.start_with?("prefetch:") && job.locked_at < horizon
154
- end
155
- return 0 if orphaned_jobs.empty?
151
+ transaction do
152
+ # for db performance reasons, we only need one process doing this at a time
153
+ # so if we can't get an advisory lock, just abort. we'll try again soon
154
+ return unless attempt_advisory_lock("Delayed::Job.unlock_orphaned_prefetched_jobs")
155
+
156
+ horizon = db_time_now - (Settings.parent_process[:prefetched_jobs_timeout] * 4)
157
+ orphaned_jobs = running_jobs.select do |job|
158
+ job.locked_by.start_with?("prefetch:") && job.locked_at < horizon
159
+ end
160
+ return 0 if orphaned_jobs.empty?
156
161
 
157
- unlock(orphaned_jobs)
162
+ unlock(orphaned_jobs)
163
+ end
158
164
  end
159
165
 
160
166
  def unlock_orphaned_jobs(pid = nil, name = nil)
@@ -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)
@@ -39,7 +39,7 @@ module Delayed
39
39
 
40
40
  return @object.public_send(method, *args) if kwargs.empty?
41
41
 
42
- @object.public_send(method, *args, **kwargs)
42
+ return @object.public_send(method, *args, **kwargs)
43
43
  end
44
44
 
45
45
  ignore_transaction = @enqueue_args.delete(:ignore_transaction)
@@ -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.1"
4
+ VERSION = "2.4.5"
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
  )
@@ -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
 
@@ -20,6 +20,10 @@ RSpec.describe Delayed::MessageSending do
20
20
  other.delay(**enqueue_args).protected_method
21
21
  end
22
22
 
23
+ def call_public(**_kwargs)
24
+ 42
25
+ end
26
+
23
27
  private
24
28
 
25
29
  def private_method; end
@@ -74,6 +78,10 @@ RSpec.describe Delayed::MessageSending do
74
78
  klass.new.call_protected(synchronous: true)
75
79
  end
76
80
 
81
+ it "directly calls a public method on an object with kwargs" do
82
+ expect(klass.new.delay(synchronous: true).call_public(kwarg: 10)).to eq 42
83
+ end
84
+
77
85
  it "warns about directly sending a protected message asynchronously" do
78
86
  expect { klass.new.delay.protected_method }.to raise_error(NoMethodError)
79
87
  end
@@ -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.1
4
+ version: 2.4.5
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-20 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"