delayed 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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