joblin 0.1.0

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.
Files changed (111) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +1 -0
  3. data/app/models/joblin/background_task/api_access.rb +148 -0
  4. data/app/models/joblin/background_task/attachments.rb +47 -0
  5. data/app/models/joblin/background_task/executor.rb +63 -0
  6. data/app/models/joblin/background_task/options.rb +75 -0
  7. data/app/models/joblin/background_task/retention_policy.rb +28 -0
  8. data/app/models/joblin/background_task.rb +72 -0
  9. data/app/models/joblin/concerns/job_working_dirs.rb +21 -0
  10. data/db/migrate/20250903184852_create_background_tasks.rb +12 -0
  11. data/joblin.gemspec +35 -0
  12. data/lib/joblin/batching/batch.rb +537 -0
  13. data/lib/joblin/batching/callback.rb +135 -0
  14. data/lib/joblin/batching/chain_builder.rb +247 -0
  15. data/lib/joblin/batching/compat/active_job.rb +108 -0
  16. data/lib/joblin/batching/compat/sidekiq/web/batches_assets/css/styles.less +182 -0
  17. data/lib/joblin/batching/compat/sidekiq/web/batches_assets/js/batch_tree.js +108 -0
  18. data/lib/joblin/batching/compat/sidekiq/web/batches_assets/js/util.js +2 -0
  19. data/lib/joblin/batching/compat/sidekiq/web/helpers.rb +41 -0
  20. data/lib/joblin/batching/compat/sidekiq/web/views/_batch_tree.erb +6 -0
  21. data/lib/joblin/batching/compat/sidekiq/web/views/_batches_table.erb +44 -0
  22. data/lib/joblin/batching/compat/sidekiq/web/views/_common.erb +13 -0
  23. data/lib/joblin/batching/compat/sidekiq/web/views/_jobs_table.erb +21 -0
  24. data/lib/joblin/batching/compat/sidekiq/web/views/_pagination.erb +26 -0
  25. data/lib/joblin/batching/compat/sidekiq/web/views/batch.erb +81 -0
  26. data/lib/joblin/batching/compat/sidekiq/web/views/batches.erb +23 -0
  27. data/lib/joblin/batching/compat/sidekiq/web/views/pool.erb +137 -0
  28. data/lib/joblin/batching/compat/sidekiq/web/views/pools.erb +47 -0
  29. data/lib/joblin/batching/compat/sidekiq/web.rb +218 -0
  30. data/lib/joblin/batching/compat/sidekiq.rb +149 -0
  31. data/lib/joblin/batching/compat.rb +20 -0
  32. data/lib/joblin/batching/context_hash.rb +157 -0
  33. data/lib/joblin/batching/hier_batch_ids.lua +25 -0
  34. data/lib/joblin/batching/jobs/base_job.rb +7 -0
  35. data/lib/joblin/batching/jobs/concurrent_batch_job.rb +20 -0
  36. data/lib/joblin/batching/jobs/managed_batch_job.rb +175 -0
  37. data/lib/joblin/batching/jobs/serial_batch_job.rb +20 -0
  38. data/lib/joblin/batching/pool.rb +254 -0
  39. data/lib/joblin/batching/pool_refill.lua +47 -0
  40. data/lib/joblin/batching/schedule_callback.lua +14 -0
  41. data/lib/joblin/batching/status.rb +89 -0
  42. data/lib/joblin/engine.rb +15 -0
  43. data/lib/joblin/lazy_access.rb +72 -0
  44. data/lib/joblin/uniqueness/compat/active_job.rb +75 -0
  45. data/lib/joblin/uniqueness/compat/sidekiq.rb +135 -0
  46. data/lib/joblin/uniqueness/compat.rb +20 -0
  47. data/lib/joblin/uniqueness/configuration.rb +25 -0
  48. data/lib/joblin/uniqueness/job_uniqueness.rb +49 -0
  49. data/lib/joblin/uniqueness/lock_context.rb +199 -0
  50. data/lib/joblin/uniqueness/locksmith.rb +92 -0
  51. data/lib/joblin/uniqueness/on_conflict/base.rb +32 -0
  52. data/lib/joblin/uniqueness/on_conflict/log.rb +13 -0
  53. data/lib/joblin/uniqueness/on_conflict/null_strategy.rb +9 -0
  54. data/lib/joblin/uniqueness/on_conflict/raise.rb +11 -0
  55. data/lib/joblin/uniqueness/on_conflict/reject.rb +21 -0
  56. data/lib/joblin/uniqueness/on_conflict/reschedule.rb +20 -0
  57. data/lib/joblin/uniqueness/on_conflict.rb +62 -0
  58. data/lib/joblin/uniqueness/strategy/base.rb +107 -0
  59. data/lib/joblin/uniqueness/strategy/until_and_while_executing.rb +35 -0
  60. data/lib/joblin/uniqueness/strategy/until_executed.rb +20 -0
  61. data/lib/joblin/uniqueness/strategy/until_executing.rb +20 -0
  62. data/lib/joblin/uniqueness/strategy/until_expired.rb +16 -0
  63. data/lib/joblin/uniqueness/strategy/while_executing.rb +26 -0
  64. data/lib/joblin/uniqueness/strategy.rb +27 -0
  65. data/lib/joblin/uniqueness/unique_job_common.rb +79 -0
  66. data/lib/joblin/version.rb +3 -0
  67. data/lib/joblin.rb +37 -0
  68. data/spec/batching/batch_spec.rb +493 -0
  69. data/spec/batching/callback_spec.rb +38 -0
  70. data/spec/batching/compat/active_job_spec.rb +107 -0
  71. data/spec/batching/compat/sidekiq_spec.rb +127 -0
  72. data/spec/batching/context_hash_spec.rb +54 -0
  73. data/spec/batching/flow_spec.rb +82 -0
  74. data/spec/batching/integration/fail_then_succeed.rb +42 -0
  75. data/spec/batching/integration/integration.rb +57 -0
  76. data/spec/batching/integration/nested.rb +88 -0
  77. data/spec/batching/integration/simple.rb +47 -0
  78. data/spec/batching/integration/workflow.rb +134 -0
  79. data/spec/batching/integration_helper.rb +50 -0
  80. data/spec/batching/pool_spec.rb +161 -0
  81. data/spec/batching/status_spec.rb +76 -0
  82. data/spec/batching/support/base_job.rb +19 -0
  83. data/spec/batching/support/sample_callback.rb +2 -0
  84. data/spec/internal/config/database.yml +5 -0
  85. data/spec/internal/config/routes.rb +5 -0
  86. data/spec/internal/config/storage.yml +3 -0
  87. data/spec/internal/db/combustion_test.sqlite +0 -0
  88. data/spec/internal/db/schema.rb +6 -0
  89. data/spec/internal/log/test.log +48200 -0
  90. data/spec/internal/public/favicon.ico +0 -0
  91. data/spec/models/background_task_spec.rb +41 -0
  92. data/spec/spec_helper.rb +29 -0
  93. data/spec/uniqueness/compat/active_job_spec.rb +49 -0
  94. data/spec/uniqueness/compat/sidekiq_spec.rb +68 -0
  95. data/spec/uniqueness/lock_context_spec.rb +106 -0
  96. data/spec/uniqueness/on_conflict/log_spec.rb +11 -0
  97. data/spec/uniqueness/on_conflict/raise_spec.rb +10 -0
  98. data/spec/uniqueness/on_conflict/reschedule_spec.rb +63 -0
  99. data/spec/uniqueness/on_conflict_spec.rb +16 -0
  100. data/spec/uniqueness/spec_helper.rb +19 -0
  101. data/spec/uniqueness/strategy/base_spec.rb +100 -0
  102. data/spec/uniqueness/strategy/until_and_while_executing_spec.rb +48 -0
  103. data/spec/uniqueness/strategy/until_executed_spec.rb +23 -0
  104. data/spec/uniqueness/strategy/until_executing_spec.rb +23 -0
  105. data/spec/uniqueness/strategy/until_expired_spec.rb +23 -0
  106. data/spec/uniqueness/strategy/while_executing_spec.rb +33 -0
  107. data/spec/uniqueness/support/lock_strategy.rb +28 -0
  108. data/spec/uniqueness/support/on_conflict.rb +24 -0
  109. data/spec/uniqueness/support/test_worker.rb +19 -0
  110. data/spec/uniqueness/unique_job_common_spec.rb +45 -0
  111. metadata +308 -0
@@ -0,0 +1,28 @@
1
+ require 'uniqueness/spec_helper'
2
+
3
+ RSpec.shared_context "lock strategy specs" do |strategy:|
4
+ include_context 'with TestWorker'
5
+
6
+ before(:each) { TestWorker.unique_job_options[:strategy] = strategy }
7
+
8
+ let(:context1) { Joblin::Uniqueness::LockContext.new({ jid: 'j1', queue: 'default', job_clazz: 'TestWorker'}) }
9
+ let(:context2) { Joblin::Uniqueness::LockContext.new({ jid: 'j2', queue: 'default', job_clazz: 'TestWorker'}) }
10
+
11
+ let(:process_one) { described_class.new(context1) }
12
+ let(:process_two) { described_class.new(context2) }
13
+ end
14
+
15
+ RSpec.shared_examples "a lock implementation" do
16
+ it "is unlocked when done" do
17
+ process_one.on_enqueue {}
18
+ did_lock = process_one.locked?
19
+
20
+ process_one.on_perform {}
21
+ did_lock ||= process_one.locked?
22
+
23
+ expect(did_lock).to be_truthy
24
+
25
+ process_one.batch_callback(:success, nil)
26
+ expect(process_one).not_to be_locked
27
+ end
28
+ end
@@ -0,0 +1,24 @@
1
+
2
+ RSpec.shared_context "on_conflict specs" do
3
+ include_context 'with TestWorker'
4
+ let(:lock_context) { Joblin::Uniqueness::LockContext.new({ jid: 'j1', queue: 'default', job_clazz: 'TestWorker'}) }
5
+ let(:on_conflict) { described_class.new(lock_context)}
6
+ end
7
+
8
+ RSpec.shared_examples "OnConflict is compatible with" do |lock_strategies|
9
+ it "is compatible with the expected Lock Strategies" do
10
+ lock_strategies.each do |lock_strategy|
11
+ Joblin::Uniqueness::OnConflict.validate!(described_class, lock_strategy)
12
+ end
13
+ end
14
+ end
15
+
16
+ RSpec.shared_examples "OnConflict is incompatible with" do |lock_strategies|
17
+ it "is not compatible with the expected Lock Strategies" do
18
+ lock_strategies.each do |lock_strategy|
19
+ expect do
20
+ Joblin::Uniqueness::OnConflict.validate!(described_class, lock_strategy)
21
+ end.to raise_error(ArgumentError)
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,19 @@
1
+ require 'uniqueness/spec_helper'
2
+
3
+ RSpec.shared_context "with TestWorker" do
4
+ let!(:worker) do
5
+ Class.new do
6
+ include Sidekiq::Worker
7
+
8
+ ensure_uniqueness(
9
+ strategy: :until_executed,
10
+ )
11
+
12
+ def perform; end
13
+ end
14
+ end
15
+
16
+ before(:each) { stub_const('TestWorker', worker) }
17
+
18
+ let(:lock_context) { Joblin::Uniqueness::LockContext.new({ jid: 'j1', queue: 'default', job_clazz: 'TestWorker'}) }
19
+ end
@@ -0,0 +1,45 @@
1
+ require 'uniqueness/spec_helper'
2
+
3
+ RSpec.describe Joblin::Uniqueness::UniqueJobCommon do
4
+ describe ".unlock!" do
5
+ include_context "with TestWorker"
6
+
7
+ it "unlocks the lock with a specific JID" do
8
+ jid = TestWorker.perform_async
9
+ lctx = Joblin::Uniqueness::LockContext.new({ jid: jid, queue: 'default', job_clazz: 'TestWorker'})
10
+ lstrat = lctx.lock_strategy
11
+ lsmith = lstrat.send(:locksmith)
12
+ expect(lsmith.locked?).to be_truthy
13
+
14
+ TestWorker.unlock!(jid, queue: 'default')
15
+ expect(lsmith.locked?).to be_falsey
16
+ end
17
+
18
+ it "unlocks the lock without a specific JID" do
19
+ jid = TestWorker.perform_async
20
+ lctx = Joblin::Uniqueness::LockContext.new({ jid: jid, queue: 'default', job_clazz: 'TestWorker'})
21
+ lstrat = lctx.lock_strategy
22
+ lsmith = lstrat.send(:locksmith)
23
+ expect(lsmith.locked?).to be_truthy
24
+
25
+ TestWorker.unlock!(queue: 'default')
26
+ expect(lsmith.locked?).to be_falsey
27
+ end
28
+
29
+ it "unlocks the lock matching parameters" do
30
+ args = [1, 2, 3]
31
+ jid = TestWorker.perform_async(*args)
32
+
33
+ lctx = Joblin::Uniqueness::LockContext.new({ jid: jid, queue: 'default', job_clazz: 'TestWorker', args: args})
34
+ lstrat = lctx.lock_strategy
35
+ lsmith = lstrat.send(:locksmith)
36
+ expect(lsmith.locked?).to be_truthy
37
+
38
+ TestWorker.unlock!(queue: 'default')
39
+ expect(lsmith.locked?).to be_truthy
40
+
41
+ TestWorker.unlock!(queue: 'default', args: args)
42
+ expect(lsmith.locked?).to be_falsey
43
+ end
44
+ end
45
+ end
metadata ADDED
@@ -0,0 +1,308 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: joblin
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Ethan Knapp
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: rediconn
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: 0.1.0
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: 0.1.0
26
+ - !ruby/object:Gem::Dependency
27
+ name: rails
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '5'
33
+ - - "<"
34
+ - !ruby/object:Gem::Version
35
+ version: '9.0'
36
+ type: :runtime
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: '5'
43
+ - - "<"
44
+ - !ruby/object:Gem::Version
45
+ version: '9.0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: rspec
48
+ requirement: !ruby/object:Gem::Requirement
49
+ requirements:
50
+ - - "~>"
51
+ - !ruby/object:Gem::Version
52
+ version: '3'
53
+ type: :development
54
+ prerelease: false
55
+ version_requirements: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: '3'
60
+ - !ruby/object:Gem::Dependency
61
+ name: redis
62
+ requirement: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: '0'
67
+ type: :development
68
+ prerelease: false
69
+ version_requirements: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: '0'
74
+ - !ruby/object:Gem::Dependency
75
+ name: rspec-rails
76
+ requirement: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: '0'
81
+ type: :development
82
+ prerelease: false
83
+ version_requirements: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ - !ruby/object:Gem::Dependency
89
+ name: pg
90
+ requirement: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
95
+ type: :development
96
+ prerelease: false
97
+ version_requirements: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ - !ruby/object:Gem::Dependency
103
+ name: appraisal
104
+ requirement: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
109
+ type: :development
110
+ prerelease: false
111
+ version_requirements: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - ">="
114
+ - !ruby/object:Gem::Version
115
+ version: '0'
116
+ - !ruby/object:Gem::Dependency
117
+ name: combustion
118
+ requirement: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - "~>"
121
+ - !ruby/object:Gem::Version
122
+ version: '1.3'
123
+ type: :development
124
+ prerelease: false
125
+ version_requirements: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - "~>"
128
+ - !ruby/object:Gem::Version
129
+ version: '1.3'
130
+ email:
131
+ - eknapp@instructure.com
132
+ executables: []
133
+ extensions: []
134
+ extra_rdoc_files: []
135
+ files:
136
+ - README.md
137
+ - app/models/joblin/background_task.rb
138
+ - app/models/joblin/background_task/api_access.rb
139
+ - app/models/joblin/background_task/attachments.rb
140
+ - app/models/joblin/background_task/executor.rb
141
+ - app/models/joblin/background_task/options.rb
142
+ - app/models/joblin/background_task/retention_policy.rb
143
+ - app/models/joblin/concerns/job_working_dirs.rb
144
+ - db/migrate/20250903184852_create_background_tasks.rb
145
+ - joblin.gemspec
146
+ - lib/joblin.rb
147
+ - lib/joblin/batching/batch.rb
148
+ - lib/joblin/batching/callback.rb
149
+ - lib/joblin/batching/chain_builder.rb
150
+ - lib/joblin/batching/compat.rb
151
+ - lib/joblin/batching/compat/active_job.rb
152
+ - lib/joblin/batching/compat/sidekiq.rb
153
+ - lib/joblin/batching/compat/sidekiq/web.rb
154
+ - lib/joblin/batching/compat/sidekiq/web/batches_assets/css/styles.less
155
+ - lib/joblin/batching/compat/sidekiq/web/batches_assets/js/batch_tree.js
156
+ - lib/joblin/batching/compat/sidekiq/web/batches_assets/js/util.js
157
+ - lib/joblin/batching/compat/sidekiq/web/helpers.rb
158
+ - lib/joblin/batching/compat/sidekiq/web/views/_batch_tree.erb
159
+ - lib/joblin/batching/compat/sidekiq/web/views/_batches_table.erb
160
+ - lib/joblin/batching/compat/sidekiq/web/views/_common.erb
161
+ - lib/joblin/batching/compat/sidekiq/web/views/_jobs_table.erb
162
+ - lib/joblin/batching/compat/sidekiq/web/views/_pagination.erb
163
+ - lib/joblin/batching/compat/sidekiq/web/views/batch.erb
164
+ - lib/joblin/batching/compat/sidekiq/web/views/batches.erb
165
+ - lib/joblin/batching/compat/sidekiq/web/views/pool.erb
166
+ - lib/joblin/batching/compat/sidekiq/web/views/pools.erb
167
+ - lib/joblin/batching/context_hash.rb
168
+ - lib/joblin/batching/hier_batch_ids.lua
169
+ - lib/joblin/batching/jobs/base_job.rb
170
+ - lib/joblin/batching/jobs/concurrent_batch_job.rb
171
+ - lib/joblin/batching/jobs/managed_batch_job.rb
172
+ - lib/joblin/batching/jobs/serial_batch_job.rb
173
+ - lib/joblin/batching/pool.rb
174
+ - lib/joblin/batching/pool_refill.lua
175
+ - lib/joblin/batching/schedule_callback.lua
176
+ - lib/joblin/batching/status.rb
177
+ - lib/joblin/engine.rb
178
+ - lib/joblin/lazy_access.rb
179
+ - lib/joblin/uniqueness/compat.rb
180
+ - lib/joblin/uniqueness/compat/active_job.rb
181
+ - lib/joblin/uniqueness/compat/sidekiq.rb
182
+ - lib/joblin/uniqueness/configuration.rb
183
+ - lib/joblin/uniqueness/job_uniqueness.rb
184
+ - lib/joblin/uniqueness/lock_context.rb
185
+ - lib/joblin/uniqueness/locksmith.rb
186
+ - lib/joblin/uniqueness/on_conflict.rb
187
+ - lib/joblin/uniqueness/on_conflict/base.rb
188
+ - lib/joblin/uniqueness/on_conflict/log.rb
189
+ - lib/joblin/uniqueness/on_conflict/null_strategy.rb
190
+ - lib/joblin/uniqueness/on_conflict/raise.rb
191
+ - lib/joblin/uniqueness/on_conflict/reject.rb
192
+ - lib/joblin/uniqueness/on_conflict/reschedule.rb
193
+ - lib/joblin/uniqueness/strategy.rb
194
+ - lib/joblin/uniqueness/strategy/base.rb
195
+ - lib/joblin/uniqueness/strategy/until_and_while_executing.rb
196
+ - lib/joblin/uniqueness/strategy/until_executed.rb
197
+ - lib/joblin/uniqueness/strategy/until_executing.rb
198
+ - lib/joblin/uniqueness/strategy/until_expired.rb
199
+ - lib/joblin/uniqueness/strategy/while_executing.rb
200
+ - lib/joblin/uniqueness/unique_job_common.rb
201
+ - lib/joblin/version.rb
202
+ - spec/batching/batch_spec.rb
203
+ - spec/batching/callback_spec.rb
204
+ - spec/batching/compat/active_job_spec.rb
205
+ - spec/batching/compat/sidekiq_spec.rb
206
+ - spec/batching/context_hash_spec.rb
207
+ - spec/batching/flow_spec.rb
208
+ - spec/batching/integration/fail_then_succeed.rb
209
+ - spec/batching/integration/integration.rb
210
+ - spec/batching/integration/nested.rb
211
+ - spec/batching/integration/simple.rb
212
+ - spec/batching/integration/workflow.rb
213
+ - spec/batching/integration_helper.rb
214
+ - spec/batching/pool_spec.rb
215
+ - spec/batching/status_spec.rb
216
+ - spec/batching/support/base_job.rb
217
+ - spec/batching/support/sample_callback.rb
218
+ - spec/internal/config/database.yml
219
+ - spec/internal/config/routes.rb
220
+ - spec/internal/config/storage.yml
221
+ - spec/internal/db/combustion_test.sqlite
222
+ - spec/internal/db/schema.rb
223
+ - spec/internal/log/test.log
224
+ - spec/internal/public/favicon.ico
225
+ - spec/models/background_task_spec.rb
226
+ - spec/spec_helper.rb
227
+ - spec/uniqueness/compat/active_job_spec.rb
228
+ - spec/uniqueness/compat/sidekiq_spec.rb
229
+ - spec/uniqueness/lock_context_spec.rb
230
+ - spec/uniqueness/on_conflict/log_spec.rb
231
+ - spec/uniqueness/on_conflict/raise_spec.rb
232
+ - spec/uniqueness/on_conflict/reschedule_spec.rb
233
+ - spec/uniqueness/on_conflict_spec.rb
234
+ - spec/uniqueness/spec_helper.rb
235
+ - spec/uniqueness/strategy/base_spec.rb
236
+ - spec/uniqueness/strategy/until_and_while_executing_spec.rb
237
+ - spec/uniqueness/strategy/until_executed_spec.rb
238
+ - spec/uniqueness/strategy/until_executing_spec.rb
239
+ - spec/uniqueness/strategy/until_expired_spec.rb
240
+ - spec/uniqueness/strategy/while_executing_spec.rb
241
+ - spec/uniqueness/support/lock_strategy.rb
242
+ - spec/uniqueness/support/on_conflict.rb
243
+ - spec/uniqueness/support/test_worker.rb
244
+ - spec/uniqueness/unique_job_common_spec.rb
245
+ homepage: https://instructure.com
246
+ licenses: []
247
+ metadata: {}
248
+ rdoc_options: []
249
+ require_paths:
250
+ - lib
251
+ required_ruby_version: !ruby/object:Gem::Requirement
252
+ requirements:
253
+ - - ">="
254
+ - !ruby/object:Gem::Version
255
+ version: '0'
256
+ required_rubygems_version: !ruby/object:Gem::Requirement
257
+ requirements:
258
+ - - ">="
259
+ - !ruby/object:Gem::Version
260
+ version: '0'
261
+ requirements: []
262
+ rubygems_version: 3.6.9
263
+ specification_version: 4
264
+ summary: Gem for ActiveJob extensions
265
+ test_files:
266
+ - spec/batching/batch_spec.rb
267
+ - spec/batching/callback_spec.rb
268
+ - spec/batching/compat/active_job_spec.rb
269
+ - spec/batching/compat/sidekiq_spec.rb
270
+ - spec/batching/context_hash_spec.rb
271
+ - spec/batching/flow_spec.rb
272
+ - spec/batching/integration/fail_then_succeed.rb
273
+ - spec/batching/integration/integration.rb
274
+ - spec/batching/integration/nested.rb
275
+ - spec/batching/integration/simple.rb
276
+ - spec/batching/integration/workflow.rb
277
+ - spec/batching/integration_helper.rb
278
+ - spec/batching/pool_spec.rb
279
+ - spec/batching/status_spec.rb
280
+ - spec/batching/support/base_job.rb
281
+ - spec/batching/support/sample_callback.rb
282
+ - spec/internal/config/database.yml
283
+ - spec/internal/config/routes.rb
284
+ - spec/internal/config/storage.yml
285
+ - spec/internal/db/combustion_test.sqlite
286
+ - spec/internal/db/schema.rb
287
+ - spec/internal/log/test.log
288
+ - spec/internal/public/favicon.ico
289
+ - spec/models/background_task_spec.rb
290
+ - spec/spec_helper.rb
291
+ - spec/uniqueness/compat/active_job_spec.rb
292
+ - spec/uniqueness/compat/sidekiq_spec.rb
293
+ - spec/uniqueness/lock_context_spec.rb
294
+ - spec/uniqueness/on_conflict/log_spec.rb
295
+ - spec/uniqueness/on_conflict/raise_spec.rb
296
+ - spec/uniqueness/on_conflict/reschedule_spec.rb
297
+ - spec/uniqueness/on_conflict_spec.rb
298
+ - spec/uniqueness/spec_helper.rb
299
+ - spec/uniqueness/strategy/base_spec.rb
300
+ - spec/uniqueness/strategy/until_and_while_executing_spec.rb
301
+ - spec/uniqueness/strategy/until_executed_spec.rb
302
+ - spec/uniqueness/strategy/until_executing_spec.rb
303
+ - spec/uniqueness/strategy/until_expired_spec.rb
304
+ - spec/uniqueness/strategy/while_executing_spec.rb
305
+ - spec/uniqueness/support/lock_strategy.rb
306
+ - spec/uniqueness/support/on_conflict.rb
307
+ - spec/uniqueness/support/test_worker.rb
308
+ - spec/uniqueness/unique_job_common_spec.rb