delayed 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 (55) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +20 -0
  3. data/README.md +560 -0
  4. data/Rakefile +35 -0
  5. data/lib/delayed.rb +72 -0
  6. data/lib/delayed/active_job_adapter.rb +65 -0
  7. data/lib/delayed/backend/base.rb +166 -0
  8. data/lib/delayed/backend/job_preparer.rb +43 -0
  9. data/lib/delayed/exceptions.rb +14 -0
  10. data/lib/delayed/job.rb +250 -0
  11. data/lib/delayed/lifecycle.rb +85 -0
  12. data/lib/delayed/message_sending.rb +65 -0
  13. data/lib/delayed/monitor.rb +134 -0
  14. data/lib/delayed/performable_mailer.rb +22 -0
  15. data/lib/delayed/performable_method.rb +47 -0
  16. data/lib/delayed/plugin.rb +15 -0
  17. data/lib/delayed/plugins/connection.rb +13 -0
  18. data/lib/delayed/plugins/instrumentation.rb +39 -0
  19. data/lib/delayed/priority.rb +164 -0
  20. data/lib/delayed/psych_ext.rb +135 -0
  21. data/lib/delayed/railtie.rb +7 -0
  22. data/lib/delayed/runnable.rb +46 -0
  23. data/lib/delayed/serialization/active_record.rb +18 -0
  24. data/lib/delayed/syck_ext.rb +42 -0
  25. data/lib/delayed/tasks.rb +40 -0
  26. data/lib/delayed/worker.rb +233 -0
  27. data/lib/delayed/yaml_ext.rb +10 -0
  28. data/lib/delayed_job.rb +1 -0
  29. data/lib/delayed_job_active_record.rb +1 -0
  30. data/lib/generators/delayed/generator.rb +7 -0
  31. data/lib/generators/delayed/migration_generator.rb +28 -0
  32. data/lib/generators/delayed/next_migration_version.rb +14 -0
  33. data/lib/generators/delayed/templates/migration.rb +22 -0
  34. data/spec/autoloaded/clazz.rb +6 -0
  35. data/spec/autoloaded/instance_clazz.rb +5 -0
  36. data/spec/autoloaded/instance_struct.rb +6 -0
  37. data/spec/autoloaded/struct.rb +7 -0
  38. data/spec/database.yml +25 -0
  39. data/spec/delayed/active_job_adapter_spec.rb +267 -0
  40. data/spec/delayed/job_spec.rb +953 -0
  41. data/spec/delayed/monitor_spec.rb +276 -0
  42. data/spec/delayed/plugins/instrumentation_spec.rb +49 -0
  43. data/spec/delayed/priority_spec.rb +154 -0
  44. data/spec/delayed/serialization/active_record_spec.rb +15 -0
  45. data/spec/delayed/tasks_spec.rb +116 -0
  46. data/spec/helper.rb +196 -0
  47. data/spec/lifecycle_spec.rb +77 -0
  48. data/spec/message_sending_spec.rb +149 -0
  49. data/spec/performable_mailer_spec.rb +68 -0
  50. data/spec/performable_method_spec.rb +123 -0
  51. data/spec/psych_ext_spec.rb +94 -0
  52. data/spec/sample_jobs.rb +117 -0
  53. data/spec/worker_spec.rb +235 -0
  54. data/spec/yaml_ext_spec.rb +48 -0
  55. metadata +326 -0
@@ -0,0 +1,48 @@
1
+ require 'helper'
2
+
3
+ describe 'YAML' do
4
+ it 'autoloads classes' do
5
+ expect {
6
+ yaml = "--- !ruby/class Autoloaded::Clazz\n"
7
+ expect(load_with_delayed_visitor(yaml)).to eq(Autoloaded::Clazz)
8
+ }.not_to raise_error
9
+ end
10
+
11
+ it 'autoloads the class of a struct' do
12
+ expect {
13
+ yaml = "--- !ruby/class Autoloaded::Struct\n"
14
+ expect(load_with_delayed_visitor(yaml)).to eq(Autoloaded::Struct)
15
+ }.not_to raise_error
16
+ end
17
+
18
+ it 'autoloads the class for the instance of a struct' do
19
+ expect {
20
+ yaml = '--- !ruby/struct:Autoloaded::InstanceStruct {}'
21
+ expect(load_with_delayed_visitor(yaml).class).to eq(Autoloaded::InstanceStruct)
22
+ }.not_to raise_error
23
+ end
24
+
25
+ it 'autoloads the class of an anonymous struct' do
26
+ expect {
27
+ yaml = "--- !ruby/struct\nn: 1\n"
28
+ object = YAML.load(yaml)
29
+ expect(object).to be_kind_of(Struct)
30
+ expect(object.n).to eq(1)
31
+ }.not_to raise_error
32
+ end
33
+
34
+ it 'autoloads the class for the instance' do
35
+ expect {
36
+ yaml = "--- !ruby/object:Autoloaded::InstanceClazz {}\n"
37
+ expect(load_with_delayed_visitor(yaml).class).to eq(Autoloaded::InstanceClazz)
38
+ }.not_to raise_error
39
+ end
40
+
41
+ it 'does not throw an uninitialized constant Syck::Syck when using YAML.load with poorly formed yaml' do
42
+ expect { YAML.load(YAML.dump('foo: *bar')) }.not_to raise_error
43
+ end
44
+
45
+ def load_with_delayed_visitor(yaml)
46
+ YAML.load_dj(yaml)
47
+ end
48
+ end
metadata ADDED
@@ -0,0 +1,326 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: delayed
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Nathan Griffith
8
+ - Rowan McDonald
9
+ - Cyrus Eslami
10
+ - John Mileham
11
+ - Brandon Keepers
12
+ - Brian Ryckbost
13
+ - Chris Gaffney
14
+ - David Genord II
15
+ - Erik Michaels-Ober
16
+ - Matt Griffin
17
+ - Steve Richert
18
+ - Tobias Lütke
19
+ autorequire:
20
+ bindir: bin
21
+ cert_chain: []
22
+ date: 2021-08-17 00:00:00.000000000 Z
23
+ dependencies:
24
+ - !ruby/object:Gem::Dependency
25
+ name: activerecord
26
+ requirement: !ruby/object:Gem::Requirement
27
+ requirements:
28
+ - - ">="
29
+ - !ruby/object:Gem::Version
30
+ version: '5.2'
31
+ type: :runtime
32
+ prerelease: false
33
+ version_requirements: !ruby/object:Gem::Requirement
34
+ requirements:
35
+ - - ">="
36
+ - !ruby/object:Gem::Version
37
+ version: '5.2'
38
+ - !ruby/object:Gem::Dependency
39
+ name: concurrent-ruby
40
+ requirement: !ruby/object:Gem::Requirement
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ version: '0'
45
+ type: :runtime
46
+ prerelease: false
47
+ version_requirements: !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ">="
50
+ - !ruby/object:Gem::Version
51
+ version: '0'
52
+ - !ruby/object:Gem::Dependency
53
+ name: actionmailer
54
+ requirement: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ version: '0'
59
+ type: :development
60
+ prerelease: false
61
+ version_requirements: !ruby/object:Gem::Requirement
62
+ requirements:
63
+ - - ">="
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ - !ruby/object:Gem::Dependency
67
+ name: activejob
68
+ requirement: !ruby/object:Gem::Requirement
69
+ requirements:
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: '0'
73
+ type: :development
74
+ prerelease: false
75
+ version_requirements: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: '0'
80
+ - !ruby/object:Gem::Dependency
81
+ name: activerecord
82
+ requirement: !ruby/object:Gem::Requirement
83
+ requirements:
84
+ - - ">="
85
+ - !ruby/object:Gem::Version
86
+ version: '0'
87
+ type: :development
88
+ prerelease: false
89
+ version_requirements: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - ">="
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: appraisal
96
+ requirement: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ version: '0'
101
+ type: :development
102
+ prerelease: false
103
+ version_requirements: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - ">="
106
+ - !ruby/object:Gem::Version
107
+ version: '0'
108
+ - !ruby/object:Gem::Dependency
109
+ name: betterlint
110
+ requirement: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - ">="
113
+ - !ruby/object:Gem::Version
114
+ version: '0'
115
+ type: :development
116
+ prerelease: false
117
+ version_requirements: !ruby/object:Gem::Requirement
118
+ requirements:
119
+ - - ">="
120
+ - !ruby/object:Gem::Version
121
+ version: '0'
122
+ - !ruby/object:Gem::Dependency
123
+ name: mysql2
124
+ requirement: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ version: '0'
129
+ type: :development
130
+ prerelease: false
131
+ version_requirements: !ruby/object:Gem::Requirement
132
+ requirements:
133
+ - - ">="
134
+ - !ruby/object:Gem::Version
135
+ version: '0'
136
+ - !ruby/object:Gem::Dependency
137
+ name: pg
138
+ requirement: !ruby/object:Gem::Requirement
139
+ requirements:
140
+ - - ">="
141
+ - !ruby/object:Gem::Version
142
+ version: '0'
143
+ type: :development
144
+ prerelease: false
145
+ version_requirements: !ruby/object:Gem::Requirement
146
+ requirements:
147
+ - - ">="
148
+ - !ruby/object:Gem::Version
149
+ version: '0'
150
+ - !ruby/object:Gem::Dependency
151
+ name: rake
152
+ requirement: !ruby/object:Gem::Requirement
153
+ requirements:
154
+ - - ">="
155
+ - !ruby/object:Gem::Version
156
+ version: '0'
157
+ type: :development
158
+ prerelease: false
159
+ version_requirements: !ruby/object:Gem::Requirement
160
+ requirements:
161
+ - - ">="
162
+ - !ruby/object:Gem::Version
163
+ version: '0'
164
+ - !ruby/object:Gem::Dependency
165
+ name: rspec
166
+ requirement: !ruby/object:Gem::Requirement
167
+ requirements:
168
+ - - ">="
169
+ - !ruby/object:Gem::Version
170
+ version: '0'
171
+ type: :development
172
+ prerelease: false
173
+ version_requirements: !ruby/object:Gem::Requirement
174
+ requirements:
175
+ - - ">="
176
+ - !ruby/object:Gem::Version
177
+ version: '0'
178
+ - !ruby/object:Gem::Dependency
179
+ name: sqlite3
180
+ requirement: !ruby/object:Gem::Requirement
181
+ requirements:
182
+ - - ">="
183
+ - !ruby/object:Gem::Version
184
+ version: '0'
185
+ type: :development
186
+ prerelease: false
187
+ version_requirements: !ruby/object:Gem::Requirement
188
+ requirements:
189
+ - - ">="
190
+ - !ruby/object:Gem::Version
191
+ version: '0'
192
+ - !ruby/object:Gem::Dependency
193
+ name: timecop
194
+ requirement: !ruby/object:Gem::Requirement
195
+ requirements:
196
+ - - ">="
197
+ - !ruby/object:Gem::Version
198
+ version: '0'
199
+ type: :development
200
+ prerelease: false
201
+ version_requirements: !ruby/object:Gem::Requirement
202
+ requirements:
203
+ - - ">="
204
+ - !ruby/object:Gem::Version
205
+ version: '0'
206
+ description: |
207
+ ===== +Delayed+ is a multi-threaded, SQL-driven ActiveJob backend used at {Betterment}[https://betterment.com] to process millions of background jobs per day.
208
+
209
+ It supports *postgres*, *mysql*, and *sqlite*, and is designed to be:
210
+
211
+ - *Reliable*, with co-transactional job enqueues and guaranteed, at-least-once execution
212
+ - *Scalable*, with an optimized pickup query and concurrent job execution
213
+ - *Resilient*, with built-in retry mechanisms, exponential backoff, and failed job preservation
214
+ - *Maintainable*, with robust instrumentation, continuous monitoring, and priority-based alerting
215
+
216
+ For an overview of how Betterment uses +delayed+ to build resilience into distributed systems, check
217
+ out the talk ✨{Can I break this?}[https://www.youtube.com/watch?v=TuhS13rBoVY]✨ given at RailsConf
218
+ 2021!
219
+ email:
220
+ - nathan@betterment.com
221
+ executables: []
222
+ extensions: []
223
+ extra_rdoc_files: []
224
+ files:
225
+ - LICENSE
226
+ - README.md
227
+ - Rakefile
228
+ - lib/delayed.rb
229
+ - lib/delayed/active_job_adapter.rb
230
+ - lib/delayed/backend/base.rb
231
+ - lib/delayed/backend/job_preparer.rb
232
+ - lib/delayed/exceptions.rb
233
+ - lib/delayed/job.rb
234
+ - lib/delayed/lifecycle.rb
235
+ - lib/delayed/message_sending.rb
236
+ - lib/delayed/monitor.rb
237
+ - lib/delayed/performable_mailer.rb
238
+ - lib/delayed/performable_method.rb
239
+ - lib/delayed/plugin.rb
240
+ - lib/delayed/plugins/connection.rb
241
+ - lib/delayed/plugins/instrumentation.rb
242
+ - lib/delayed/priority.rb
243
+ - lib/delayed/psych_ext.rb
244
+ - lib/delayed/railtie.rb
245
+ - lib/delayed/runnable.rb
246
+ - lib/delayed/serialization/active_record.rb
247
+ - lib/delayed/syck_ext.rb
248
+ - lib/delayed/tasks.rb
249
+ - lib/delayed/worker.rb
250
+ - lib/delayed/yaml_ext.rb
251
+ - lib/delayed_job.rb
252
+ - lib/delayed_job_active_record.rb
253
+ - lib/generators/delayed/generator.rb
254
+ - lib/generators/delayed/migration_generator.rb
255
+ - lib/generators/delayed/next_migration_version.rb
256
+ - lib/generators/delayed/templates/migration.rb
257
+ - spec/autoloaded/clazz.rb
258
+ - spec/autoloaded/instance_clazz.rb
259
+ - spec/autoloaded/instance_struct.rb
260
+ - spec/autoloaded/struct.rb
261
+ - spec/database.yml
262
+ - spec/delayed/active_job_adapter_spec.rb
263
+ - spec/delayed/job_spec.rb
264
+ - spec/delayed/monitor_spec.rb
265
+ - spec/delayed/plugins/instrumentation_spec.rb
266
+ - spec/delayed/priority_spec.rb
267
+ - spec/delayed/serialization/active_record_spec.rb
268
+ - spec/delayed/tasks_spec.rb
269
+ - spec/helper.rb
270
+ - spec/lifecycle_spec.rb
271
+ - spec/message_sending_spec.rb
272
+ - spec/performable_mailer_spec.rb
273
+ - spec/performable_method_spec.rb
274
+ - spec/psych_ext_spec.rb
275
+ - spec/sample_jobs.rb
276
+ - spec/worker_spec.rb
277
+ - spec/yaml_ext_spec.rb
278
+ homepage: http://github.com/betterment/delayed
279
+ licenses:
280
+ - MIT
281
+ metadata:
282
+ changelog_uri: https://github.com/betterment/delayed/blob/main/CHANGELOG.md
283
+ bug_tracker_uri: https://github.com/betterment/delayed/issues
284
+ source_code_uri: https://github.com/betterment/delayed
285
+ post_install_message:
286
+ rdoc_options: []
287
+ require_paths:
288
+ - lib
289
+ required_ruby_version: !ruby/object:Gem::Requirement
290
+ requirements:
291
+ - - ">="
292
+ - !ruby/object:Gem::Version
293
+ version: '2.6'
294
+ required_rubygems_version: !ruby/object:Gem::Requirement
295
+ requirements:
296
+ - - ">="
297
+ - !ruby/object:Gem::Version
298
+ version: '0'
299
+ requirements: []
300
+ rubygems_version: 3.2.25
301
+ signing_key:
302
+ specification_version: 4
303
+ summary: a multi-threaded, SQL-driven ActiveJob backend used at Betterment to process
304
+ millions of background jobs per day
305
+ test_files:
306
+ - spec/sample_jobs.rb
307
+ - spec/lifecycle_spec.rb
308
+ - spec/performable_method_spec.rb
309
+ - spec/helper.rb
310
+ - spec/psych_ext_spec.rb
311
+ - spec/worker_spec.rb
312
+ - spec/autoloaded/struct.rb
313
+ - spec/autoloaded/clazz.rb
314
+ - spec/autoloaded/instance_clazz.rb
315
+ - spec/autoloaded/instance_struct.rb
316
+ - spec/database.yml
317
+ - spec/delayed/priority_spec.rb
318
+ - spec/delayed/plugins/instrumentation_spec.rb
319
+ - spec/delayed/monitor_spec.rb
320
+ - spec/delayed/serialization/active_record_spec.rb
321
+ - spec/delayed/tasks_spec.rb
322
+ - spec/delayed/job_spec.rb
323
+ - spec/delayed/active_job_adapter_spec.rb
324
+ - spec/message_sending_spec.rb
325
+ - spec/performable_mailer_spec.rb
326
+ - spec/yaml_ext_spec.rb