inst-jobs 2.3.3 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (95) 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 +3 -3
  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 +182 -148
  24. data/lib/delayed/backend/base.rb +79 -74
  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 -193
  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 -18
  44. data/lib/delayed/work_queue/parent_process/client.rb +54 -55
  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 -265
  52. data/lib/delayed/yaml_extensions.rb +12 -10
  53. data/lib/delayed_job.rb +37 -38
  54. data/lib/inst-jobs.rb +1 -1
  55. data/spec/active_record_job_spec.rb +128 -135
  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 +15 -11
  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 +1 -1
  73. data/spec/gemfiles/61.gemfile +5 -3
  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 +517 -441
  79. data/spec/shared/testing.rb +14 -14
  80. data/spec/shared/worker.rb +155 -147
  81. data/spec/shared_jobs_specs.rb +13 -13
  82. data/spec/spec_helper.rb +43 -40
  83. metadata +74 -56
  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 -528
  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/redis_job_spec.rb +0 -148
@@ -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"
7
- gem 'sinatra-contrib', "~> 2.0"
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"
7
- gem 'sinatra-contrib', "~> 2.0"
8
+ gem "sinatra", "~> 2.0"
9
+ gem "sinatra-contrib", "~> 2.0"
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: ../..
3
3
  specs:
4
- inst-jobs (2.3.1)
4
+ inst-jobs (2.3.3)
5
5
  activerecord (>= 5.2)
6
6
  activesupport (>= 5.2)
7
7
  after_transaction_commit (>= 1.0, < 3)
@@ -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.1.0"
6
- gem 'sinatra', "~> 2.0"
7
- gem 'sinatra-contrib', "~> 2.0"
8
+ gem "sinatra", "~> 2.0"
9
+ gem "sinatra-contrib", "~> 2.0"
data/spec/sample_jobs.rb CHANGED
@@ -1,49 +1,79 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class SimpleJob
4
- cattr_accessor :runs; self.runs = 0
5
- def perform; @@runs += 1; end
4
+ class << self
5
+ attr_accessor :runs
6
+ end
7
+
8
+ self.runs = 0
9
+
10
+ def perform
11
+ self.class.runs += 1
12
+ end
6
13
  end
7
14
 
8
15
  class ErrorJob
9
- cattr_accessor :runs; self.runs = 0
10
- def perform; raise 'did not work'; end
16
+ class << self
17
+ attr_accessor :runs, :last_error, :failure_runs, :permanent_failure_runs
18
+ end
11
19
 
12
- cattr_accessor :last_error; self.last_error = nil
20
+ self.runs = 0
21
+ def perform
22
+ raise "did not work"
23
+ end
13
24
 
14
- cattr_accessor :failure_runs; self.failure_runs = 0
15
- def on_failure(error); @@last_error = error; @@failure_runs += 1; end
25
+ self.last_error = nil
26
+ self.failure_runs = 0
27
+ def on_failure(error)
28
+ self.class.last_error = error
29
+ self.class.failure_runs += 1
30
+ end
16
31
 
17
- cattr_accessor :permanent_failure_runs; self.permanent_failure_runs = 0
18
- def on_permanent_failure(error); @@last_error = error; @@permanent_failure_runs += 1; end
32
+ self.permanent_failure_runs = 0
33
+ def on_permanent_failure(error)
34
+ self.class.last_error = error
35
+ self.class.permanent_failure_runs += 1
36
+ end
19
37
  end
20
38
 
21
39
  class UnlockJob
22
40
  attr_accessor :times_to_unlock
41
+
23
42
  def initialize(times_to_unlock)
24
43
  @times_to_unlock = times_to_unlock
25
44
  end
26
45
 
27
- def perform; raise SystemExit, 'raising to trigger on_failure'; end
46
+ def perform
47
+ raise SystemExit, "raising to trigger on_failure"
48
+ end
28
49
 
29
- def on_failure(error)
50
+ def on_failure(_error)
30
51
  times_to_unlock -= 1
31
52
  :unlock if times_to_unlock <= 0
32
53
  end
33
54
  end
34
55
 
35
56
  class LongRunningJob
36
- def perform; sleep 250; end
57
+ def perform
58
+ sleep 250
59
+ end
37
60
  end
38
61
 
39
62
  module M
40
63
  class ModuleJob
41
- cattr_accessor :runs; self.runs = 0
42
- def perform; @@runs += 1; end
64
+ class << self
65
+ attr_accessor :runs
66
+ end
67
+
68
+ cattr_accessor :runs
69
+ self.runs = 0
70
+ def perform
71
+ self.class.runs += 1
72
+ end
43
73
  end
44
74
  end
45
75
 
46
76
  class DeserializeErrorJob < SimpleJob; end
47
- Psych.add_domain_type("ruby/object", "DeserializeErrorJob") do |_type, val|
77
+ Psych.add_domain_type("ruby/object", "DeserializeErrorJob") do |_type, _val|
48
78
  raise "error deserializing"
49
79
  end