good_job 3.15.0 → 3.16.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +270 -0
  3. data/README.md +33 -13
  4. data/app/controllers/good_job/application_controller.rb +19 -10
  5. data/app/controllers/good_job/batches_controller.rb +1 -0
  6. data/app/controllers/good_job/cron_entries_controller.rb +2 -1
  7. data/app/controllers/good_job/frontends_controller.rb +1 -0
  8. data/app/controllers/good_job/jobs_controller.rb +1 -0
  9. data/app/controllers/good_job/processes_controller.rb +1 -0
  10. data/app/filters/good_job/base_filter.rb +1 -0
  11. data/app/filters/good_job/batches_filter.rb +1 -0
  12. data/app/filters/good_job/jobs_filter.rb +1 -0
  13. data/app/helpers/good_job/application_helper.rb +1 -1
  14. data/app/models/concerns/good_job/error_events.rb +45 -0
  15. data/app/models/concerns/good_job/filterable.rb +1 -0
  16. data/app/models/{good_job → concerns/good_job}/lockable.rb +3 -0
  17. data/app/models/concerns/good_job/reportable.rb +1 -0
  18. data/app/models/good_job/active_record_parent_class.rb +9 -0
  19. data/app/models/good_job/base_execution.rb +21 -1
  20. data/app/models/good_job/base_record.rb +6 -3
  21. data/app/models/good_job/cron_entry.rb +1 -0
  22. data/app/models/good_job/discrete_execution.rb +61 -0
  23. data/app/models/good_job/execution.rb +162 -25
  24. data/app/models/good_job/execution_result.rb +17 -2
  25. data/app/models/good_job/i18n_config.rb +25 -0
  26. data/app/models/good_job/job.rb +23 -7
  27. data/app/models/good_job/process.rb +66 -14
  28. data/app/views/good_job/batches/_jobs.erb +1 -1
  29. data/app/views/good_job/jobs/_executions.erb +1 -1
  30. data/app/views/good_job/jobs/_table.erb +18 -5
  31. data/app/views/good_job/jobs/show.html.erb +31 -5
  32. data/app/views/good_job/processes/index.html.erb +6 -2
  33. data/app/views/good_job/shared/_navbar.erb +1 -1
  34. data/config/locales/de.yml +9 -1
  35. data/config/locales/en.yml +9 -1
  36. data/config/locales/es.yml +9 -1
  37. data/config/locales/fr.yml +71 -63
  38. data/config/locales/ja.yml +227 -0
  39. data/config/locales/nl.yml +11 -3
  40. data/config/locales/ru.yml +9 -1
  41. data/config/locales/tr.yml +227 -0
  42. data/config/locales/{ua.yml → uk.yml} +34 -2
  43. data/config/routes.rb +1 -0
  44. data/exe/good_job +1 -0
  45. data/lib/active_job/queue_adapters/good_job_adapter.rb +1 -0
  46. data/lib/generators/good_job/install_generator.rb +1 -0
  47. data/lib/generators/good_job/templates/install/migrations/create_good_jobs.rb.erb +23 -1
  48. data/lib/generators/good_job/templates/update/migrations/01_create_good_jobs.rb.erb +3 -1
  49. data/lib/generators/good_job/templates/update/migrations/02_create_good_job_settings.rb.erb +1 -0
  50. data/lib/generators/good_job/templates/update/migrations/03_create_index_good_jobs_jobs_on_priority_created_at_when_unfinished.rb.erb +1 -0
  51. data/lib/generators/good_job/templates/update/migrations/04_create_good_job_batches.rb.erb +1 -0
  52. data/lib/generators/good_job/templates/update/migrations/05_create_good_job_executions.rb.erb +33 -0
  53. data/lib/generators/good_job/templates/update/migrations/06_create_good_jobs_error_event.rb.erb +16 -0
  54. data/lib/generators/good_job/update_generator.rb +1 -0
  55. data/lib/good_job/active_job_extensions/batches.rb +1 -0
  56. data/lib/good_job/active_job_extensions/concurrency.rb +2 -1
  57. data/lib/good_job/active_job_extensions/interrupt_errors.rb +1 -0
  58. data/lib/good_job/active_job_extensions/notify_options.rb +1 -0
  59. data/lib/good_job/adapter.rb +22 -8
  60. data/lib/good_job/assignable_connection.rb +1 -0
  61. data/lib/good_job/bulk.rb +1 -0
  62. data/lib/good_job/capsule.rb +22 -14
  63. data/lib/good_job/cleanup_tracker.rb +2 -1
  64. data/lib/good_job/cli.rb +2 -1
  65. data/lib/good_job/configuration.rb +13 -6
  66. data/lib/good_job/cron_manager.rb +3 -3
  67. data/lib/good_job/current_thread.rb +15 -0
  68. data/lib/good_job/daemon.rb +1 -0
  69. data/lib/good_job/dependencies.rb +5 -26
  70. data/lib/good_job/engine.rb +20 -12
  71. data/lib/good_job/interrupt_error.rb +1 -0
  72. data/lib/good_job/job_performer.rb +1 -0
  73. data/lib/good_job/log_subscriber.rb +1 -0
  74. data/lib/good_job/metrics.rb +57 -0
  75. data/lib/good_job/multi_scheduler.rb +1 -0
  76. data/lib/good_job/notifier/{process_registration.rb → process_heartbeat.rb} +12 -1
  77. data/lib/good_job/notifier.rb +18 -16
  78. data/lib/good_job/poller.rb +3 -3
  79. data/lib/good_job/scheduler.rb +30 -11
  80. data/lib/good_job/version.rb +5 -1
  81. data/lib/good_job.rb +67 -12
  82. metadata +15 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9aa61d924db48712cf404f47b7a6f5b977f1464a29b7e97f068b21422ac8261a
4
- data.tar.gz: 9701e674925f45189bb8763f31d35a11eeb8d1f02f132cd4cc7e3db1fa6221f7
3
+ metadata.gz: 3929d3de9d0c69de6aa34b238573dd19eabb0b6753b28a06b186cfc6972b621b
4
+ data.tar.gz: d927b1cc39f993f64a4b07594cb7215975e02d55cb212b420122b2c672d5f2d4
5
5
  SHA512:
6
- metadata.gz: 8a07c81b1a23c12b26c21c8d3316bc01ee931e0313d3f51d811564fe80dacf86efd8a1d37f693be0e4d893983ce9aaeeccbb5c0e523410815fea052287b56c3b
7
- data.tar.gz: 46e3e5a9fe2c7fd8e82a51494e4fac3c480f0e323db1aab57ea2291d7f7db39284f0a9da70692e5b160312894f69ec31453279f541f61cbec99bfb091012af26
6
+ metadata.gz: 34ac854233932322ad76eaea4d41879b9d97c08a204b6f689affedbe861b86bc5c83b6c02dd1132c267f7f9129d4e0ace042e9299f4fe522fdf9d590b6c0cf33
7
+ data.tar.gz: a8007ea55894eb72494935dff5269d1e54d157eab334b823769884cc3d83d1a37be3d9cb44e603ba5a132cb3993ba8dd8e306c4d3974f9a2bf4dc2603add5706
data/CHANGELOG.md CHANGED
@@ -1,5 +1,275 @@
1
1
  # Changelog
2
2
 
3
+ ## [v3.16.3](https://github.com/bensheldon/good_job/tree/v3.16.3) (2023-07-18)
4
+
5
+ [Full Changelog](https://github.com/bensheldon/good_job/compare/v3.16.2...v3.16.3)
6
+
7
+ **Fixed bugs:**
8
+
9
+ - Fix bulk enqueue for unmigrated 'error\_event'; add `GoodJob.migrated?` check method; use custom enum implementation [\#1011](https://github.com/bensheldon/good_job/pull/1011) ([bensheldon](https://github.com/bensheldon))
10
+
11
+ **Closed issues:**
12
+
13
+ - GoodJob::Bulk.enqueue not handling missing migrations [\#1010](https://github.com/bensheldon/good_job/issues/1010)
14
+
15
+ **Merged pull requests:**
16
+
17
+ - Move shared `BaseExecution` concerns into the base class. [\#1009](https://github.com/bensheldon/good_job/pull/1009) ([dixpac](https://github.com/dixpac))
18
+
19
+ ## [v3.16.2](https://github.com/bensheldon/good_job/tree/v3.16.2) (2023-07-13)
20
+
21
+ [Full Changelog](https://github.com/bensheldon/good_job/compare/v3.16.1...v3.16.2)
22
+
23
+ **Closed issues:**
24
+
25
+ - Support for customized job display name [\#956](https://github.com/bensheldon/good_job/issues/956)
26
+
27
+ **Merged pull requests:**
28
+
29
+ - Add `GoodJob::Job#display_name` to allow customizing dashboard job display [\#1008](https://github.com/bensheldon/good_job/pull/1008) ([paul](https://github.com/paul))
30
+
31
+ ## [v3.16.1](https://github.com/bensheldon/good_job/tree/v3.16.1) (2023-07-11)
32
+
33
+ [Full Changelog](https://github.com/bensheldon/good_job/compare/v3.16.0...v3.16.1)
34
+
35
+ **Fixed bugs:**
36
+
37
+ - Wrap Notifier's `refresh_process` with Rails executor [\#1007](https://github.com/bensheldon/good_job/pull/1007) ([bensheldon](https://github.com/bensheldon))
38
+
39
+ **Closed issues:**
40
+
41
+ - uninitialized constant GoodJob::Process [\#1006](https://github.com/bensheldon/good_job/issues/1006)
42
+
43
+ ## [v3.16.0](https://github.com/bensheldon/good_job/tree/v3.16.0) (2023-07-10)
44
+
45
+ [Full Changelog](https://github.com/bensheldon/good_job/compare/v3.15.14...v3.16.0)
46
+
47
+ **Implemented enhancements:**
48
+
49
+ - Add `GoodJob.configure_active_record` as alternative to `GoodJob.active_record_parent_class` [\#1004](https://github.com/bensheldon/good_job/pull/1004) ([bensheldon](https://github.com/bensheldon))
50
+ - Configure `dashboard_default_locale` using custom subclass of `I18n::Config` to isolate I18n configuration from parent application [\#1001](https://github.com/bensheldon/good_job/pull/1001) ([bensheldon](https://github.com/bensheldon))
51
+ - Create `error_event` column to track the context of an error \(discarded, retried, retry\_stopped, etc\) [\#995](https://github.com/bensheldon/good_job/pull/995) ([bensheldon](https://github.com/bensheldon))
52
+ - Added metrics to Scheduler and track in Process state [\#984](https://github.com/bensheldon/good_job/pull/984) ([AndersGM](https://github.com/AndersGM))
53
+
54
+ **Fixed bugs:**
55
+
56
+ - Use Concurrent::Array for class `instances` to avoid JRuby synchronization errors [\#1002](https://github.com/bensheldon/good_job/pull/1002) ([bensheldon](https://github.com/bensheldon))
57
+ - Add test to assert enqueuing behavior within transactions [\#998](https://github.com/bensheldon/good_job/pull/998) ([bensheldon](https://github.com/bensheldon))
58
+ - Fix Ukrainian language code [\#996](https://github.com/bensheldon/good_job/pull/996) ([bensheldon](https://github.com/bensheldon))
59
+
60
+ **Closed issues:**
61
+
62
+ - Is `pgcrypto` necessary? [\#805](https://github.com/bensheldon/good_job/issues/805)
63
+ - Integrate Sorbet type checking [\#404](https://github.com/bensheldon/good_job/issues/404)
64
+
65
+ **Merged pull requests:**
66
+
67
+ - Unify `frozen_string_literal` comment style [\#1003](https://github.com/bensheldon/good_job/pull/1003) ([dixpac](https://github.com/dixpac))
68
+ - Add more execution mode details and caveats to Readme Set Up section [\#997](https://github.com/bensheldon/good_job/pull/997) ([bensheldon](https://github.com/bensheldon))
69
+ - Add note in migrations that `pgcrypto` extension isn't necessary in PG 13+ [\#837](https://github.com/bensheldon/good_job/pull/837) ([bensheldon](https://github.com/bensheldon))
70
+ - Add Sorbet to linter [\#760](https://github.com/bensheldon/good_job/pull/760) ([sam1el](https://github.com/sam1el))
71
+
72
+ ## [v3.15.14](https://github.com/bensheldon/good_job/tree/v3.15.14) (2023-07-03)
73
+
74
+ [Full Changelog](https://github.com/bensheldon/good_job/compare/v3.15.13...v3.15.14)
75
+
76
+ **Implemented enhancements:**
77
+
78
+ - Add Process heartbeat that is updated inside of Notifier [\#977](https://github.com/bensheldon/good_job/pull/977) ([bensheldon](https://github.com/bensheldon))
79
+
80
+ **Fixed bugs:**
81
+
82
+ - Dashboard error when trying to display 0 running/queued/retried jobs due to missing 'zero' translation [\#990](https://github.com/bensheldon/good_job/issues/990)
83
+ - Add explicit namespace back to `GoodJob::DiscreteExecution` [\#983](https://github.com/bensheldon/good_job/pull/983) ([bensheldon](https://github.com/bensheldon))
84
+
85
+ **Closed issues:**
86
+
87
+ - Persisting ActiveSupport::CurrentAttributes [\#981](https://github.com/bensheldon/good_job/issues/981)
88
+ - uninitialized constant DiscreteExecution [\#962](https://github.com/bensheldon/good_job/issues/962)
89
+ - Hard kill resilience with execution counts [\#922](https://github.com/bensheldon/good_job/issues/922)
90
+
91
+ **Merged pull requests:**
92
+
93
+ - Bump rubocop from 1.53.0 to 1.54.0 [\#994](https://github.com/bensheldon/good_job/pull/994) ([dependabot[bot]](https://github.com/apps/dependabot))
94
+ - Bump rails from 7.0.5 to 7.0.6 [\#993](https://github.com/bensheldon/good_job/pull/993) ([dependabot[bot]](https://github.com/apps/dependabot))
95
+ - Fix CI: Lock traces version for Ruby 2.6 compatible version [\#987](https://github.com/bensheldon/good_job/pull/987) ([bensheldon](https://github.com/bensheldon))
96
+ - Turkish Language support [\#986](https://github.com/bensheldon/good_job/pull/986) ([SemihCag](https://github.com/SemihCag))
97
+ - Use generic error reporter in Readme examples [\#964](https://github.com/bensheldon/good_job/pull/964) ([shouichi](https://github.com/shouichi))
98
+
99
+ ## [v3.15.13](https://github.com/bensheldon/good_job/tree/v3.15.13) (2023-06-14)
100
+
101
+ [Full Changelog](https://github.com/bensheldon/good_job/compare/v3.15.12...v3.15.13)
102
+
103
+ **Fixed bugs:**
104
+
105
+ - Replace uncached table\_exists? with cached table\_exists? [\#979](https://github.com/bensheldon/good_job/pull/979) ([cmcinnes-mdsol](https://github.com/cmcinnes-mdsol))
106
+
107
+ ## [v3.15.12](https://github.com/bensheldon/good_job/tree/v3.15.12) (2023-06-11)
108
+
109
+ [Full Changelog](https://github.com/bensheldon/good_job/compare/v3.15.11...v3.15.12)
110
+
111
+ **Fixed bugs:**
112
+
113
+ - Do not allow GoodJob to automatically start after Rails initialization if previously shutdown [\#976](https://github.com/bensheldon/good_job/pull/976) ([bensheldon](https://github.com/bensheldon))
114
+
115
+ **Merged pull requests:**
116
+
117
+ - Fix Rubocop linting [\#975](https://github.com/bensheldon/good_job/pull/975) ([bensheldon](https://github.com/bensheldon))
118
+ - Bump capybara from 3.38.0 to 3.39.1 [\#970](https://github.com/bensheldon/good_job/pull/970) ([dependabot[bot]](https://github.com/apps/dependabot))
119
+ - Bump thor from 1.2.1 to 1.2.2 [\#967](https://github.com/bensheldon/good_job/pull/967) ([dependabot[bot]](https://github.com/apps/dependabot))
120
+
121
+ ## [v3.15.11](https://github.com/bensheldon/good_job/tree/v3.15.11) (2023-06-06)
122
+
123
+ [Full Changelog](https://github.com/bensheldon/good_job/compare/v3.15.10...v3.15.11)
124
+
125
+ **Fixed bugs:**
126
+
127
+ - Fix `discrete_executions` job re-enqueueing when `retry_job` is called directly [\#973](https://github.com/bensheldon/good_job/pull/973) ([bensheldon](https://github.com/bensheldon))
128
+
129
+ **Closed issues:**
130
+
131
+ - Unclear how discrete executions should work with reenqueued jobs \(leads to broken job-iteration\) [\#972](https://github.com/bensheldon/good_job/issues/972)
132
+ - `build_for_enqueue` discards `scheduled_at` values for bulk-enqueued jobs [\#966](https://github.com/bensheldon/good_job/issues/966)
133
+
134
+ ## [v3.15.10](https://github.com/bensheldon/good_job/tree/v3.15.10) (2023-05-22)
135
+
136
+ [Full Changelog](https://github.com/bensheldon/good_job/compare/v3.15.9...v3.15.10)
137
+
138
+ **Fixed bugs:**
139
+
140
+ - Ensure migration warning for `DiscreteExecution` constant is in explicit `GoodJob::` namespace [\#963](https://github.com/bensheldon/good_job/pull/963) ([bensheldon](https://github.com/bensheldon))
141
+
142
+ ## [v3.15.9](https://github.com/bensheldon/good_job/tree/v3.15.9) (2023-05-21)
143
+
144
+ [Full Changelog](https://github.com/bensheldon/good_job/compare/v3.15.8...v3.15.9)
145
+
146
+ **Fixed bugs:**
147
+
148
+ - Fix wait and wait\_until ignored in bulk enqueue [\#960](https://github.com/bensheldon/good_job/pull/960) ([bensheldon](https://github.com/bensheldon))
149
+
150
+ **Closed issues:**
151
+
152
+ - Does Bulk enqueue respect wait? [\#959](https://github.com/bensheldon/good_job/issues/959)
153
+ - BaseExecution::discrete\_support? hardcodes the DiscreteExecution table\_name [\#957](https://github.com/bensheldon/good_job/issues/957)
154
+
155
+ **Merged pull requests:**
156
+
157
+ - Fix flaky jruby test to widen time-based range [\#961](https://github.com/bensheldon/good_job/pull/961) ([bensheldon](https://github.com/bensheldon))
158
+ - Update README.md [\#953](https://github.com/bensheldon/good_job/pull/953) ([namiwang](https://github.com/namiwang))
159
+
160
+ ## [v3.15.8](https://github.com/bensheldon/good_job/tree/v3.15.8) (2023-05-19)
161
+
162
+ [Full Changelog](https://github.com/bensheldon/good_job/compare/v3.15.7...v3.15.8)
163
+
164
+ **Fixed bugs:**
165
+
166
+ - Fix hard-coded and duplicated table\_name [\#958](https://github.com/bensheldon/good_job/pull/958) ([gap777](https://github.com/gap777))
167
+
168
+ **Closed issues:**
169
+
170
+ - `active_job.enqueue` Performance Issue [\#939](https://github.com/bensheldon/good_job/issues/939)
171
+
172
+ **Merged pull requests:**
173
+
174
+ - Bump rubocop from 1.46.0 to 1.50.2 [\#949](https://github.com/bensheldon/good_job/pull/949) ([dependabot[bot]](https://github.com/apps/dependabot))
175
+ - Bump rubocop-rails from 2.18.0 to 2.19.1 [\#947](https://github.com/bensheldon/good_job/pull/947) ([dependabot[bot]](https://github.com/apps/dependabot))
176
+
177
+ ## [v3.15.7](https://github.com/bensheldon/good_job/tree/v3.15.7) (2023-04-30)
178
+
179
+ [Full Changelog](https://github.com/bensheldon/good_job/compare/v3.15.6...v3.15.7)
180
+
181
+ **Fixed bugs:**
182
+
183
+ - Fix Lockable's `SELECT 1 AS one` queries missing `LIMIT 1` [\#946](https://github.com/bensheldon/good_job/pull/946) ([bensheldon](https://github.com/bensheldon))
184
+
185
+ **Closed issues:**
186
+
187
+ - Issue with performing jobs that use ActionMailer::Parameterized [\#944](https://github.com/bensheldon/good_job/issues/944)
188
+ - Deprecation warning on the deprecation warning [\#943](https://github.com/bensheldon/good_job/issues/943)
189
+
190
+ **Merged pull requests:**
191
+
192
+ - Replace class usage of ActiveSupport::Deprecator with gem-specific instance [\#945](https://github.com/bensheldon/good_job/pull/945) ([bensheldon](https://github.com/bensheldon))
193
+
194
+ ## [v3.15.6](https://github.com/bensheldon/good_job/tree/v3.15.6) (2023-04-24)
195
+
196
+ [Full Changelog](https://github.com/bensheldon/good_job/compare/v3.15.5...v3.15.6)
197
+
198
+ **Merged pull requests:**
199
+
200
+ - Refine french translations [\#936](https://github.com/bensheldon/good_job/pull/936) ([francois-ferrandis](https://github.com/francois-ferrandis))
201
+ - feat: locales for ja [\#935](https://github.com/bensheldon/good_job/pull/935) ([aki77](https://github.com/aki77))
202
+
203
+ ## [v3.15.5](https://github.com/bensheldon/good_job/tree/v3.15.5) (2023-04-24)
204
+
205
+ [Full Changelog](https://github.com/bensheldon/good_job/compare/v3.15.4...v3.15.5)
206
+
207
+ **Fixed bugs:**
208
+
209
+ - Fix `GoodJob.cleanup_preserved_jobs` to add missing guard for unmigrated discrete executions [\#938](https://github.com/bensheldon/good_job/pull/938) ([bensheldon](https://github.com/bensheldon))
210
+
211
+ **Closed issues:**
212
+
213
+ - Update to 3.15.4 breaks cleanup\_preserved\_jobs [\#937](https://github.com/bensheldon/good_job/issues/937)
214
+
215
+ ## [v3.15.4](https://github.com/bensheldon/good_job/tree/v3.15.4) (2023-04-22)
216
+
217
+ [Full Changelog](https://github.com/bensheldon/good_job/compare/v3.15.3...v3.15.4)
218
+
219
+ **Merged pull requests:**
220
+
221
+ - Create "discrete" `good_job_executions` table to separate Job records from Execution records and have a 1-to-1 correspondence between `good_jobs` records and Active Job jobs [\#928](https://github.com/bensheldon/good_job/pull/928) ([bensheldon](https://github.com/bensheldon))
222
+
223
+ ## [v3.15.3](https://github.com/bensheldon/good_job/tree/v3.15.3) (2023-04-22)
224
+
225
+ [Full Changelog](https://github.com/bensheldon/good_job/compare/v3.15.2...v3.15.3)
226
+
227
+ **Merged pull requests:**
228
+
229
+ - Eagerly autoload `ActiveJob::Base`; clean up framework deferred-loading logic to use nested `on_load` blocks [\#931](https://github.com/bensheldon/good_job/pull/931) ([bensheldon](https://github.com/bensheldon))
230
+
231
+ ## [v3.15.2](https://github.com/bensheldon/good_job/tree/v3.15.2) (2023-04-19)
232
+
233
+ [Full Changelog](https://github.com/bensheldon/good_job/compare/v3.15.1...v3.15.2)
234
+
235
+ **Closed issues:**
236
+
237
+ - Cleaning up preserved jobs giving me timeout [\#933](https://github.com/bensheldon/good_job/issues/933)
238
+ - uninitialized constant GoodJob::ActiveJobJob \(NameError\) [\#932](https://github.com/bensheldon/good_job/issues/932)
239
+
240
+ **Merged pull requests:**
241
+
242
+ - Use batched queries in `GoodJob::self.cleanup_preserved_jobs` [\#934](https://github.com/bensheldon/good_job/pull/934) ([bensheldon](https://github.com/bensheldon))
243
+ - Bump nokogiri from 1.14.2 to 1.14.3 [\#926](https://github.com/bensheldon/good_job/pull/926) ([dependabot[bot]](https://github.com/apps/dependabot))
244
+
245
+ ## [v3.15.1](https://github.com/bensheldon/good_job/tree/v3.15.1) (2023-04-17)
246
+
247
+ [Full Changelog](https://github.com/bensheldon/good_job/compare/v3.15.0...v3.15.1)
248
+
249
+ **Implemented enhancements:**
250
+
251
+ - Support for Batches? [\#417](https://github.com/bensheldon/good_job/issues/417)
252
+
253
+ **Fixed bugs:**
254
+
255
+ - Fix setting of locale via routes `mount ... defaults: { locale: :en }` [\#923](https://github.com/bensheldon/good_job/pull/923) ([bensheldon](https://github.com/bensheldon))
256
+ - Set `successfully_enqueued?` when using `perform_all_later` [\#917](https://github.com/bensheldon/good_job/pull/917) ([bensheldon](https://github.com/bensheldon))
257
+
258
+ **Closed issues:**
259
+
260
+ - GoodJob has pending database migrations after v2 -\> v3 [\#920](https://github.com/bensheldon/good_job/issues/920)
261
+ - Batch docs in README suggest `Batch#add` is a class method, but it's not [\#912](https://github.com/bensheldon/good_job/issues/912)
262
+ - How do I clear queue during tests? [\#887](https://github.com/bensheldon/good_job/issues/887)
263
+ - Implement batch functionality [\#691](https://github.com/bensheldon/good_job/issues/691)
264
+
265
+ **Merged pull requests:**
266
+
267
+ - In tests, directly use `connection.truncate_tables` instead of `ActiveRecord::Tasks::DatabaseTasks.truncate_all` [\#918](https://github.com/bensheldon/good_job/pull/918) ([bensheldon](https://github.com/bensheldon))
268
+ - Use `GoodJob.capsule` in CLI instead of creating a new Capsule [\#916](https://github.com/bensheldon/good_job/pull/916) ([bensheldon](https://github.com/bensheldon))
269
+ - Fix lint: missing fr and nl translations; readme whitespace [\#914](https://github.com/bensheldon/good_job/pull/914) ([bensheldon](https://github.com/bensheldon))
270
+ - Switches from Chrome to Chromium to support Apple M1/Arm CPUs [\#910](https://github.com/bensheldon/good_job/pull/910) ([ckdake](https://github.com/ckdake))
271
+ - Bump erb\_lint from 0.3.1 to 0.4.0 [\#906](https://github.com/bensheldon/good_job/pull/906) ([dependabot[bot]](https://github.com/apps/dependabot))
272
+
3
273
  ## [v3.15.0](https://github.com/bensheldon/good_job/tree/v3.15.0) (2023-04-02)
4
274
 
5
275
  [Full Changelog](https://github.com/bensheldon/good_job/compare/v3.14.2...v3.15.0)
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # GoodJob
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/good_job.svg)](https://rubygems.org/gems/good_job)
4
- [![Test Status](https://github.com/bensheldon/good_job/workflows/Test/badge.svg)](https://github.com/bensheldon/good_job/actions)
4
+ [![Test Status](https://github.com/bensheldon/good_job/actions/workflows/test.yml/badge.svg?branch=main)](https://github.com/bensheldon/good_job/actions/workflows/test.yml?query=branch%3Amain)
5
5
  [![Ruby Toolbox](https://img.shields.io/badge/dynamic/json?color=blue&label=Ruby%20Toolbox&query=%24.projects%5B0%5D.score&url=https%3A%2F%2Fwww.ruby-toolbox.com%2Fapi%2Fprojects%2Fcompare%2Fgood_job&logo=data:image/svg+xml;base64,PHN2ZyBhcmlhLWhpZGRlbj0idHJ1ZSIgZm9jdXNhYmxlPSJmYWxzZSIgZGF0YS1wcmVmaXg9ImZhcyIgZGF0YS1pY29uPSJmbGFzayIgY2xhc3M9InN2Zy1pbmxpbmUtLWZhIGZhLWZsYXNrIGZhLXctMTQiIHJvbGU9ImltZyIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2aWV3Qm94PSIwIDAgNDQ4IDUxMiI+PHBhdGggZmlsbD0id2hpdGUiIGQ9Ik00MzcuMiA0MDMuNUwzMjAgMjE1VjY0aDhjMTMuMyAwIDI0LTEwLjcgMjQtMjRWMjRjMC0xMy4zLTEwLjctMjQtMjQtMjRIMTIwYy0xMy4zIDAtMjQgMTAuNy0yNCAyNHYxNmMwIDEzLjMgMTAuNyAyNCAyNCAyNGg4djE1MUwxMC44IDQwMy41Qy0xOC41IDQ1MC42IDE1LjMgNTEyIDcwLjkgNTEyaDMwNi4yYzU1LjcgMCA4OS40LTYxLjUgNjAuMS0xMDguNXpNMTM3LjkgMzIwbDQ4LjItNzcuNmMzLjctNS4yIDUuOC0xMS42IDUuOC0xOC40VjY0aDY0djE2MGMwIDYuOSAyLjIgMTMuMiA1LjggMTguNGw0OC4yIDc3LjZoLTE3MnoiPjwvcGF0aD48L3N2Zz4=)](https://www.ruby-toolbox.com/projects/good_job)
6
6
 
7
7
  GoodJob is a multithreaded, Postgres-based, ActiveJob backend for Ruby on Rails.
@@ -121,8 +121,13 @@ For more of the story of GoodJob, read the [introductory blog post](https://isla
121
121
  YourJob.set(queue: :some_queue, wait: 5.minutes, priority: 10).perform_later
122
122
  ```
123
123
 
124
- 1. In development, GoodJob executes jobs immediately in a separate thread ("async" mode). In production, GoodJob provides different options:
125
-
124
+ 1. **In Rails' development environment**, by default, GoodJob's Adapter executes jobs `async` in a background thread pool in `rails server`.
125
+ - Because of Rails deferred autoloading, jobs enqueued via the `rails console` may not begin executing on a separate server process until the Rails application is fully initialized by loading a web page once.
126
+ - Remember, only Active Job's `perform_later` sends jobs to the queue adapter; Active Job's `perform_now` executes the job immediately and does not invoke the queue adapter. GoodJob is not involved in `perform_now` jobs.
127
+ 1. **In Rails' test environment**, by default, GoodJob's Adapter executes jobs `inline` immediately in the current thread.
128
+ - Future-scheduled jobs can be executed with `GoodJob.perform_inline` using using a tool like Timecop or `ActiveSupport::Testing::TimeHelpers`.
129
+ - Note that Active Job's TestAdapter, which powers test helpers (e.g. `assert_enqueued_with`), may override GoodJob's Adapter in [some configurations](https://github.com/rails/rails/issues/37270).
130
+ 1. **In Rails' production environment**, by default, GoodJob's Adapter enqueues jobs in `external` mode to be executed by a separate execution process:
126
131
  - By default, GoodJob separates job enqueuing from job execution so that jobs can be scaled independently of the web server. Use the GoodJob command-line tool to execute jobs:
127
132
 
128
133
  ```bash
@@ -231,7 +236,7 @@ Rails.application.configure do
231
236
  # Configure options individually...
232
237
  config.good_job.preserve_job_records = true
233
238
  config.good_job.retry_on_unhandled_error = false
234
- config.good_job.on_thread_error = -> (exception) { Sentry.capture_exception(exception) }
239
+ config.good_job.on_thread_error = -> (exception) { Rails.error.report(exception) }
235
240
  config.good_job.execution_mode = :async
236
241
  config.good_job.queues = '*'
237
242
  config.good_job.max_threads = 5
@@ -239,12 +244,13 @@ Rails.application.configure do
239
244
  config.good_job.shutdown_timeout = 25 # seconds
240
245
  config.good_job.enable_cron = true
241
246
  config.good_job.cron = { example: { cron: '0 * * * *', class: 'ExampleJob' } }
247
+ config.good_job.dashboard_default_locale = :en
242
248
 
243
249
  # ...or all at once.
244
250
  config.good_job = {
245
251
  preserve_job_records: true,
246
252
  retry_on_unhandled_error: false,
247
- on_thread_error: -> (exception) { Sentry.capture_exception(exception) },
253
+ on_thread_error: -> (exception) { Rails.error.report(exception) },
248
254
  execution_mode: :async,
249
255
  queues: '*',
250
256
  max_threads: 5,
@@ -257,6 +263,7 @@ Rails.application.configure do
257
263
  class: 'ExampleJob'
258
264
  },
259
265
  },
266
+ dashboard_default_locale: :en,
260
267
  }
261
268
  end
262
269
  ```
@@ -287,7 +294,7 @@ Available configuration options are:
287
294
  - `on_thread_error` (proc, lambda, or callable) will be called when there is an Exception. It can be useful for logging errors to bug tracking services, like Sentry or Airbrake. Example:
288
295
 
289
296
  ```ruby
290
- config.good_job.on_thread_error = -> (exception) { Sentry.capture_exception(exception) }
297
+ config.good_job.on_thread_error = -> (exception) { Rails.error.report(exception) }
291
298
  ```
292
299
 
293
300
  By default, GoodJob configures the following execution modes per environment:
@@ -311,7 +318,17 @@ config.good_job.execution_mode = :external
311
318
 
312
319
  Good Job’s general behavior can also be configured via attributes directly on the `GoodJob` module:
313
320
 
314
- - **`GoodJob.active_record_parent_class`** (string) The ActiveRecord parent class inherited by GoodJob's ActiveRecord model `GoodJob::Job` (defaults to `"ActiveRecord::Base"`). Configure this when using [multiple databases with ActiveRecord](https://guides.rubyonrails.org/active_record_multiple_databases.html) or when other custom configuration is necessary for the ActiveRecord model to connect to the Postgres database. _The value must be a String to avoid premature initialization of ActiveRecord._
321
+ - **`GoodJob.configure_active_record { ... }`** Inject Active Record configuration into GoodJob's base model, for example, when using [multiple databases with ActiveRecord](https://guides.rubyonrails.org/active_record_multiple_databases.html) or when other custom configuration is necessary for the ActiveRecord model to connect to the Postgres database. Example:
322
+
323
+ ```ruby
324
+ # config/initializers/good_job.rb
325
+ GoodJob.configure_active_record do
326
+ connects_to database: :special_database
327
+ self.table_name_prefix = "special_application_"
328
+ end
329
+ ```
330
+
331
+ - **`GoodJob.active_record_parent_class`** (string) Alternatively, modify the ActiveRecord parent class inherited by GoodJob's Active Record model `GoodJob::Job` (defaults to `"ActiveRecord::Base"`). Configure this _The value must be a String to avoid premature initialization of ActiveRecord._
315
332
 
316
333
  You’ll generally want to configure these in `config/initializers/good_job.rb`, like so:
317
334
 
@@ -472,7 +489,7 @@ config.good_job.enable_cron = ENV['DYNO'] == 'worker.1' # or `true` or via $GOOD
472
489
 
473
490
  # Configure cron with a hash that has a unique key for each recurring job
474
491
  config.good_job.cron = {
475
- # Every 15 minutes, enqueue `ExampleJob.set(priority: -10).perform_later(42, name: "Alice")`
492
+ # Every 15 minutes, enqueue `ExampleJob.set(priority: -10).perform_later(42, "life", name: "Alice")`
476
493
  frequent_task: { # each recurring job must have a unique key
477
494
  cron: "*/15 * * * *", # cron-style scheduling format by fugit gem
478
495
  class: "ExampleJob", # reference the Job class with a string
@@ -537,6 +554,7 @@ Batches track a set of jobs, and enqueue an optional callback job when all of th
537
554
  - Jobs can be added to an existing batch. Jobs in a batch are enqueued and performed immediately/asynchronously. The final callback job will not be enqueued until `GoodJob::Batch#enqueue` is called.
538
555
 
539
556
  ```ruby
557
+ batch = GoodJob::Batch.new
540
558
  batch = GoodJob::Batch.add do
541
559
  10.times { MyJob.perform_later }
542
560
  end
@@ -685,7 +703,9 @@ GoodJob follows semantic versioning, though updates may be encouraged through de
685
703
 
686
704
  #### Upgrading minor versions
687
705
 
688
- Upgrading between minor versions (e.g. v1.4 to v1.5) should not introduce breaking changes, but can introduce new deprecation warnings and database migration notices.
706
+ Upgrading between minor versions (e.g. v1.4 to v1.5) should not introduce breaking changes, but can introduce new deprecation warnings and database migration warnings.
707
+
708
+ Database migrations introduced in minor releases are _not required_ to be applied until the next major release. If you would like apply newly introduced migrations immediately, assert `GoodJob.migrated?` in your application's test suite.
689
709
 
690
710
  To perform upgrades to the GoodJob database tables:
691
711
 
@@ -759,7 +779,7 @@ If errors do reach GoodJob, you can assign a callable to `GoodJob.on_thread_erro
759
779
 
760
780
  ```ruby
761
781
  # config/initializers/good_job.rb
762
- GoodJob.on_thread_error = -> (exception) { Sentry.capture_exception(exception) }
782
+ GoodJob.on_thread_error = -> (exception) { Rails.error.report(exception) }
763
783
  ```
764
784
 
765
785
  #### Retries
@@ -793,13 +813,13 @@ class ApplicationJob < ActiveJob::Base
793
813
  retry_on StandardError, wait: :exponentially_longer, attempts: Float::INFINITY
794
814
 
795
815
  retry_on SpecialError, attempts: 5 do |_job, exception|
796
- Sentry.capture_exception(exception)
816
+ Rails.error.report(exception)
797
817
  end
798
818
 
799
819
  around_perform do |_job, block|
800
820
  block.call
801
821
  rescue StandardError => e
802
- Sentry.capture_exception(e)
822
+ Rails.error.report(e)
803
823
  raise
804
824
  end
805
825
  # ...
@@ -822,7 +842,7 @@ ActionMailer::MailDeliveryJob.retry_on StandardError, wait: :exponentially_longe
822
842
  ActionMailer::MailDeliveryJob.around_perform do |_job, block|
823
843
  block.call
824
844
  rescue StandardError => e
825
- Sentry.capture_exception(e)
845
+ Rails.error.report(e)
826
846
  raise
827
847
  end
828
848
  ```
@@ -1,9 +1,10 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module GoodJob
3
4
  class ApplicationController < ActionController::Base
4
5
  protect_from_forgery with: :exception
5
6
 
6
- around_action :switch_locale
7
+ around_action :use_good_job_locale
7
8
 
8
9
  content_security_policy do |policy|
9
10
  policy.default_src(:none) if policy.default_src(*policy.default_src).blank?
@@ -30,23 +31,31 @@ module GoodJob
30
31
  { locale: I18n.locale }.merge(options)
31
32
  end
32
33
 
33
- def switch_locale(&action)
34
+ def use_good_job_locale(&action)
35
+ @original_i18n_config = I18n.config
36
+ I18n.config = ::GoodJob::I18nConfig.new
34
37
  I18n.with_locale(current_locale, &action)
38
+ ensure
39
+ I18n.config = @original_i18n_config
40
+ @original_i18n_config = nil
41
+ end
42
+
43
+ def use_original_locale
44
+ prev_config = I18n.config
45
+ I18n.config = @original_i18n_config if @original_i18n_config
46
+ yield
47
+ ensure
48
+ I18n.config = prev_config
35
49
  end
36
50
 
37
51
  def current_locale
38
- if params[:locale]
52
+ if request.GET['locale']
53
+ request.GET['locale']
54
+ elsif params[:locale]
39
55
  params[:locale]
40
- elsif good_job_available_locales.exclude?(I18n.default_locale) && I18n.available_locales.include?(:en)
41
- :en
42
56
  else
43
57
  I18n.default_locale
44
58
  end
45
59
  end
46
-
47
- def good_job_available_locales
48
- @_good_job_available_locales ||= GoodJob::Engine.root.join("config/locales").glob("*.yml").map { |path| File.basename(path, ".yml").to_sym }.uniq
49
- end
50
- helper_method :good_job_available_locales
51
60
  end
52
61
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module GoodJob
3
4
  class BatchesController < GoodJob::ApplicationController
4
5
  def index
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module GoodJob
3
4
  class CronEntriesController < GoodJob::ApplicationController
4
5
  before_action :check_settings_migration!, only: [:enable, :disable]
@@ -14,7 +15,7 @@ module GoodJob
14
15
 
15
16
  def enqueue
16
17
  @cron_entry = CronEntry.find(params[:cron_key])
17
- @cron_entry.enqueue(Time.current)
18
+ use_original_locale { @cron_entry.enqueue(Time.current) }
18
19
  redirect_back(fallback_location: cron_entries_path, notice: t(".notice"))
19
20
  end
20
21
 
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module GoodJob
3
4
  class FrontendsController < ActionController::Base # rubocop:disable Rails/ApplicationController
4
5
  skip_after_action :verify_same_origin_request, raise: false
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module GoodJob
3
4
  class JobsController < GoodJob::ApplicationController
4
5
  DISCARD_MESSAGE = "Discarded through dashboard"
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module GoodJob
3
4
  class ProcessesController < GoodJob::ApplicationController
4
5
  def index
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module GoodJob
3
4
  class BaseFilter
4
5
  DEFAULT_LIMIT = 25
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module GoodJob
3
4
  class BatchesFilter < BaseFilter
4
5
  def records
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module GoodJob
3
4
  class JobsFilter < BaseFilter
4
5
  def states
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module GoodJob
3
4
  module ApplicationHelper
4
5
  def format_duration(sec)
@@ -63,7 +64,6 @@ module GoodJob
63
64
  end
64
65
 
65
66
  def translation_exists?(key, **options)
66
- true if good_job_available_locales.include?(I18n.locale)
67
67
  I18n.exists?(scope_key_by_partial(key), **options)
68
68
  end
69
69
  end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module GoodJob
4
+ # Shared methods for filtering Execution/Job records from the +good_jobs+ table.
5
+ module ErrorEvents
6
+ extend ActiveSupport::Concern
7
+
8
+ ERROR_EVENTS = [
9
+ ERROR_EVENT_INTERRUPTED = 'interrupted',
10
+ ERROR_EVENT_UNHANDLED = 'unhandled',
11
+ ERROR_EVENT_HANDLED = 'handled',
12
+ ERROR_EVENT_RETRIED = 'retried',
13
+ ERROR_EVENT_RETRY_STOPPED = 'retry_stopped',
14
+ ERROR_EVENT_DISCARDED = 'discarded',
15
+ ].freeze
16
+
17
+ ERROR_EVENT_ENUMS = {
18
+ ERROR_EVENT_INTERRUPTED => 0,
19
+ ERROR_EVENT_UNHANDLED => 1,
20
+ ERROR_EVENT_HANDLED => 2,
21
+ ERROR_EVENT_RETRIED => 3,
22
+ ERROR_EVENT_RETRY_STOPPED => 4,
23
+ ERROR_EVENT_DISCARDED => 5,
24
+ }.freeze
25
+
26
+ # TODO: GoodJob v4 can make this an `enum` once migrations are guaranteed.
27
+ def error_event
28
+ return unless self.class.columns_hash['error_event']
29
+
30
+ enum = super
31
+ return unless enum
32
+
33
+ ERROR_EVENT_ENUMS.key(enum)
34
+ end
35
+
36
+ def error_event=(event)
37
+ return unless self.class.columns_hash['error_event']
38
+
39
+ enum = ERROR_EVENT_ENUMS[event]
40
+ raise(ArgumentError, "Invalid error_event: #{event}") if event && !enum
41
+
42
+ super(enum)
43
+ end
44
+ end
45
+ end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module GoodJob
3
4
  # Shared methods for filtering Execution/Job records from the +good_jobs+ table.
4
5
  module Filterable
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module GoodJob
3
4
  #
4
5
  # Adds Postgres advisory locking capabilities to an ActiveRecord record.
@@ -324,6 +325,7 @@ module GoodJob
324
325
  AND pg_locks.objsubid = 1
325
326
  AND pg_locks.classid = ('x' || substr(md5($1::text), 1, 16))::bit(32)::int
326
327
  AND pg_locks.objid = (('x' || substr(md5($2::text), 1, 16))::bit(64) << 32)::bit(32)::int
328
+ LIMIT 1
327
329
  SQL
328
330
  binds = [
329
331
  ActiveRecord::Relation::QueryAttribute.new('key', key, ActiveRecord::Type::String.new),
@@ -351,6 +353,7 @@ module GoodJob
351
353
  AND pg_locks.classid = ('x' || substr(md5($1::text), 1, 16))::bit(32)::int
352
354
  AND pg_locks.objid = (('x' || substr(md5($2::text), 1, 16))::bit(64) << 32)::bit(32)::int
353
355
  AND pg_locks.pid = pg_backend_pid()
356
+ LIMIT 1
354
357
  SQL
355
358
  binds = [
356
359
  ActiveRecord::Relation::QueryAttribute.new('key', key, ActiveRecord::Type::String.new),
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module GoodJob
3
4
  module Reportable
4
5
  # There are 3 buckets of non-overlapping statuses: