good_job 3.23.0 → 3.24.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +22 -0
- data/README.md +17 -4
- data/app/models/good_job/batch_record.rb +1 -1
- data/config/locales/pt-BR.yml +243 -0
- data/lib/good_job/active_job_extensions/concurrency.rb +8 -0
- data/lib/good_job/version.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5b464ea5a307aa615b5800649e4ff4083276900fe42bfb32edfc9ed66c470914
|
4
|
+
data.tar.gz: 7ff522ebb69f55a222a089ddc7c2b1fc2e0835603bcf515a630b2b27a2e90b7a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ae2eb90d2b35711d3d4ade8ed678bba89e36fa32eb36b6bb291a4b99fbe0d60b4ea2a143521f9b20b6d386b745d690f8e6b99467b0ec1b05d9e44709f71a6b7f
|
7
|
+
data.tar.gz: a695f55188543d9ea6d53f1f25c4e3cfb311d4a4d7dddbed342b8034e5d09cf911f212e57fe4fba0ab64c0cc8ce0f9dcb2529756dc9c701403e5e6ee1b8113e7
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,27 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## [v3.24.0](https://github.com/bensheldon/good_job/tree/v3.24.0) (2024-02-12)
|
4
|
+
|
5
|
+
[Full Changelog](https://github.com/bensheldon/good_job/compare/v3.23.0...v3.24.0)
|
6
|
+
|
7
|
+
**Fixed bugs:**
|
8
|
+
|
9
|
+
- Fix batches so that retried-and-successful jobs leave the batch succeeded [\#1243](https://github.com/bensheldon/good_job/pull/1243) ([bensheldon](https://github.com/bensheldon))
|
10
|
+
- Use the job class as the default concurrency key if none is provided [\#1145](https://github.com/bensheldon/good_job/pull/1145) ([Earlopain](https://github.com/Earlopain))
|
11
|
+
|
12
|
+
**Closed issues:**
|
13
|
+
|
14
|
+
- Batch callbacks not run when job fails, then succeeds [\#1239](https://github.com/bensheldon/good_job/issues/1239)
|
15
|
+
- Broken pipe @ io\_writev - \<STDERR\> \(Errno::EPIPE\) [\#1233](https://github.com/bensheldon/good_job/issues/1233)
|
16
|
+
- PG::UniqueViolation unique constraint "index\_good\_jobs\_on\_cron\_key\_and\_cron\_at\_cond" [\#1230](https://github.com/bensheldon/good_job/issues/1230)
|
17
|
+
- Default concurrency key [\#1110](https://github.com/bensheldon/good_job/issues/1110)
|
18
|
+
|
19
|
+
**Merged pull requests:**
|
20
|
+
|
21
|
+
- Use Ruby 3.3 for development; add Bootsnap; update to Rails 7.1.3 [\#1240](https://github.com/bensheldon/good_job/pull/1240) ([bensheldon](https://github.com/bensheldon))
|
22
|
+
- Tweak docs for new concurrency default [\#1229](https://github.com/bensheldon/good_job/pull/1229) ([Earlopain](https://github.com/Earlopain))
|
23
|
+
- Brazilian Portuguese locale [\#1226](https://github.com/bensheldon/good_job/pull/1226) ([hss-mateus](https://github.com/hss-mateus))
|
24
|
+
|
3
25
|
## [v3.23.0](https://github.com/bensheldon/good_job/tree/v3.23.0) (2024-01-23)
|
4
26
|
|
5
27
|
[Full Changelog](https://github.com/bensheldon/good_job/compare/v3.22.0...v3.23.0)
|
data/README.md
CHANGED
@@ -511,12 +511,25 @@ class MyJob < ApplicationJob
|
|
511
511
|
|
512
512
|
# A unique key to be globally locked against.
|
513
513
|
# Can be String or Lambda/Proc that is invoked in the context of the job.
|
514
|
+
#
|
515
|
+
# If a key is not provided GoodJob will use the job class name.
|
516
|
+
#
|
517
|
+
# To disable concurrency control, for example in a subclass, set the
|
518
|
+
# key explicitly to nil (e.g. `key: nil` or `key: -> { nil }`)
|
519
|
+
#
|
520
|
+
# If you provide a custom concurrency key (for example, if concurrency is supposed
|
521
|
+
# to be controlled by the first job argument) make sure that it is sufficiently unique across
|
522
|
+
# jobs and queues by adding the job class or queue to the key yourself, if needed.
|
523
|
+
#
|
524
|
+
# Note: When using a model instance as part of your custom concurrency key, make sure
|
525
|
+
# to explicitly use its `id` or `to_global_id` because otherwise it will not stringify as expected.
|
526
|
+
#
|
514
527
|
# Note: Arguments passed to #perform_later can be accessed through Active Job's `arguments` method
|
515
528
|
# which is an array containing positional arguments and, optionally, a kwarg hash.
|
516
|
-
key: -> { "
|
529
|
+
key: -> { "#{self.class.name}-#{queue_name}-#{arguments.first}-#{arguments.last[:version]}" } # MyJob.perform_later("Alice", version: 'v2') => "MyJob-default-Alice-v2"
|
517
530
|
)
|
518
531
|
|
519
|
-
def perform(first_name)
|
532
|
+
def perform(first_name, version:)
|
520
533
|
# do work
|
521
534
|
end
|
522
535
|
end
|
@@ -525,8 +538,8 @@ end
|
|
525
538
|
When testing, the resulting concurrency key value can be inspected:
|
526
539
|
|
527
540
|
```ruby
|
528
|
-
job = MyJob.perform_later("Alice")
|
529
|
-
job.good_job_concurrency_key #=> "MyJob-Alice"
|
541
|
+
job = MyJob.perform_later("Alice", version: 'v1')
|
542
|
+
job.good_job_concurrency_key #=> "MyJob-default-Alice-v1"
|
530
543
|
```
|
531
544
|
|
532
545
|
#### How concurrency controls work
|
@@ -46,7 +46,7 @@ module GoodJob
|
|
46
46
|
end
|
47
47
|
|
48
48
|
def _continue_discard_or_finish(execution = nil, lock: true)
|
49
|
-
execution_discarded = execution && execution.error.present? && execution.retried_good_job_id.nil?
|
49
|
+
execution_discarded = execution && execution.error.present? && execution.finished_at && execution.retried_good_job_id.nil?
|
50
50
|
take_advisory_lock(lock) do
|
51
51
|
Batch.within_thread(batch_id: nil, batch_callback_id: id) do
|
52
52
|
reload
|
@@ -0,0 +1,243 @@
|
|
1
|
+
---
|
2
|
+
pt-BR:
|
3
|
+
good_job:
|
4
|
+
actions:
|
5
|
+
destroy: Excluir
|
6
|
+
discard: Descartar
|
7
|
+
force_discard: Forçar descarte
|
8
|
+
inspect: Inspecionar
|
9
|
+
reschedule: Reagendar
|
10
|
+
retry: Tentar novamente
|
11
|
+
batches:
|
12
|
+
index:
|
13
|
+
older_batches: Lotes antigos
|
14
|
+
pending_migrations: O GoodJob tem migrações pendentes no banco de dados.
|
15
|
+
title: Lotes
|
16
|
+
jobs:
|
17
|
+
actions:
|
18
|
+
confirm_destroy: Tem certeza de que deseja excluir esta tarefa?
|
19
|
+
confirm_discard: Tem certeza de que deseja descartar esta tarefa?
|
20
|
+
confirm_reschedule: Tem certeza de que deseja reagendar esta tarefa?
|
21
|
+
confirm_retry: Tem certeza de que deseja tentar novamente esta tarefa?
|
22
|
+
destroy: Excluir Tarefa
|
23
|
+
discard: Descartar Tarefa
|
24
|
+
reschedule: Reagendar Tarefa
|
25
|
+
retry: Tentar Tarefa Novamente
|
26
|
+
title: Ações
|
27
|
+
no_jobs_found: Nenhuma tarefa encontrada.
|
28
|
+
show:
|
29
|
+
attributes: Atributos
|
30
|
+
batched_jobs: Tarefas em Lote
|
31
|
+
callback_jobs: Tarefas de Callback
|
32
|
+
table:
|
33
|
+
no_batches_found: Nenhum lote encontrado.
|
34
|
+
cron_entries:
|
35
|
+
actions:
|
36
|
+
confirm_disable: Tem certeza de que deseja desativar esta tarefa programada?
|
37
|
+
confirm_enable: Tem certeza de que deseja ativar esta tarefa programada?
|
38
|
+
confirm_enqueue: Tem certeza de que deseja enfileirar esta tarefa programada agora?
|
39
|
+
disable: Desativar tarefa programada
|
40
|
+
enable: Ativar tarefa programada
|
41
|
+
enqueue: Enfileirar tarefa programada agora
|
42
|
+
disable:
|
43
|
+
notice: A tarefa programada foi desativada.
|
44
|
+
enable:
|
45
|
+
notice: A tarefa programada foi ativada.
|
46
|
+
enqueue:
|
47
|
+
notice: A tarefa programada foi enfileirada.
|
48
|
+
index:
|
49
|
+
no_cron_schedules_found: Nenhuma tarefa programada encontrada.
|
50
|
+
title: Tarefas Programadas
|
51
|
+
pending_migrations: Requer migração pendente do GoodJob no banco de dados.
|
52
|
+
show:
|
53
|
+
cron_entry_key: Chave da Tarefa Programada
|
54
|
+
datetime:
|
55
|
+
distance_in_words:
|
56
|
+
about_x_hours:
|
57
|
+
one: cerca de 1 hora
|
58
|
+
other: cerca de %{count} horas
|
59
|
+
about_x_months:
|
60
|
+
one: cerca de 1 mês
|
61
|
+
other: cerca de %{count} meses
|
62
|
+
about_x_years:
|
63
|
+
one: cerca de 1 ano
|
64
|
+
other: cerca de %{count} anos
|
65
|
+
almost_x_years:
|
66
|
+
one: quase 1 ano
|
67
|
+
other: quase %{count} anos
|
68
|
+
half_a_minute: meio minuto
|
69
|
+
less_than_x_minutes:
|
70
|
+
one: menos de um minuto
|
71
|
+
other: menos de %{count} minutos
|
72
|
+
less_than_x_seconds:
|
73
|
+
one: menos de 1 segundo
|
74
|
+
other: menos de %{count} segundos
|
75
|
+
over_x_years:
|
76
|
+
one: mais de 1 ano
|
77
|
+
other: mais de %{count} anos
|
78
|
+
x_days:
|
79
|
+
one: 1 dia
|
80
|
+
other: "%{count} dias"
|
81
|
+
x_minutes:
|
82
|
+
one: 1 minuto
|
83
|
+
other: "%{count} minutos"
|
84
|
+
x_months:
|
85
|
+
one: 1 mês
|
86
|
+
other: "%{count} meses"
|
87
|
+
x_seconds:
|
88
|
+
one: 1 segundo
|
89
|
+
other: "%{count} segundos"
|
90
|
+
x_years:
|
91
|
+
one: 1 ano
|
92
|
+
other: "%{count} anos"
|
93
|
+
duration:
|
94
|
+
hours: "%{hour}h %{min}m"
|
95
|
+
less_than_10_seconds: "%{sec}s"
|
96
|
+
milliseconds: "%{ms}ms"
|
97
|
+
minutes: "%{min}m %{sec}s"
|
98
|
+
seconds: "%{sec}s"
|
99
|
+
error_event:
|
100
|
+
discarded: Descartado
|
101
|
+
handled: Tratado
|
102
|
+
interrupted: Interrompido
|
103
|
+
retried: Tentado novamente
|
104
|
+
retry_stopped: Tentativa de reexecução interrompida
|
105
|
+
unhandled: Não tratado
|
106
|
+
helpers:
|
107
|
+
relative_time:
|
108
|
+
future: em %{time}
|
109
|
+
past: "%{time} atrás"
|
110
|
+
jobs:
|
111
|
+
actions:
|
112
|
+
confirm_destroy: Tem certeza de que deseja excluir a tarefa?
|
113
|
+
confirm_discard: Tem certeza de que deseja descartar a tarefa?
|
114
|
+
confirm_force_discard: 'Tem certeza de que deseja forçar o descarte desta tarefa? A tarefa será marcada como descartada, mas a tarefa em execução não será interrompida - no entanto, ela não será tentada novamente em falhas.
|
115
|
+
|
116
|
+
'
|
117
|
+
confirm_reschedule: Tem certeza de que deseja reagendar a tarefa?
|
118
|
+
confirm_retry: Tem certeza de que deseja tentar novamente a tarefa?
|
119
|
+
destroy: Excluir tarefa
|
120
|
+
discard: Descartar tarefa
|
121
|
+
force_discard: Forçar descarte de tarefa
|
122
|
+
reschedule: Reagendar tarefa
|
123
|
+
retry: Tentar tarefa novamente
|
124
|
+
destroy:
|
125
|
+
notice: A tarefa foi excluida.
|
126
|
+
discard:
|
127
|
+
notice: A tarefa foi descartada.
|
128
|
+
executions:
|
129
|
+
in_queue: na fila
|
130
|
+
runtime: tempo de execução
|
131
|
+
title: Execuções
|
132
|
+
force_discard:
|
133
|
+
notice: A tarefa foi forçadamente descartada. Ela continuará a ser executada, mas não será tentada novamente em caso de falhas.
|
134
|
+
index:
|
135
|
+
job_pagination: Paginação de Tarefa
|
136
|
+
older_jobs: Tarefas antigas
|
137
|
+
reschedule:
|
138
|
+
notice: A tarefa foi reagendada.
|
139
|
+
retry:
|
140
|
+
notice: A tarefa foi tentada novamente.
|
141
|
+
show:
|
142
|
+
jobs: Tarefas
|
143
|
+
table:
|
144
|
+
actions:
|
145
|
+
apply_to_all:
|
146
|
+
one: Aplicar a todas 1 tarefa.
|
147
|
+
other: Aplicar a todas %{count} tarefas.
|
148
|
+
confirm_destroy_all: Tem certeza de que deseja excluir as tarefas selecionadas?
|
149
|
+
confirm_discard_all: Tem certeza de que deseja descartar as tarefas selecionadas?
|
150
|
+
confirm_reschedule_all: Tem certeza de que deseja reagendar as tarefas selecionadas?
|
151
|
+
confirm_retry_all: Tem certeza de que deseja tentar novamente as tarefas selecionadas?
|
152
|
+
destroy_all: Excluir tudo
|
153
|
+
discard_all: Descartar tudo
|
154
|
+
reschedule_all: Reagendar tudo
|
155
|
+
retry_all: Tentar novamente tudo
|
156
|
+
title: Ações
|
157
|
+
no_jobs_found: Nenhuma tarefa encontrada.
|
158
|
+
toggle_actions: Alternar Ações
|
159
|
+
toggle_all_jobs: Alternar todas as tarefas
|
160
|
+
models:
|
161
|
+
batch:
|
162
|
+
created: Criado
|
163
|
+
created_at: Criado em
|
164
|
+
discarded: Descartado
|
165
|
+
discarded_at: Descartado em
|
166
|
+
enqueued: Enfileirado
|
167
|
+
enqueued_at: Enfileirado em
|
168
|
+
finished: Concluído
|
169
|
+
finished_at: Concluído em
|
170
|
+
jobs: Tarefas
|
171
|
+
name: Nome
|
172
|
+
cron:
|
173
|
+
class: Classe
|
174
|
+
last_run: Última execução
|
175
|
+
next_scheduled: Próximo agendamento
|
176
|
+
schedule: Agendamento
|
177
|
+
job:
|
178
|
+
arguments: Argumentos
|
179
|
+
attempts: Tentativas
|
180
|
+
priority: Prioridade
|
181
|
+
queue: Fila
|
182
|
+
number:
|
183
|
+
format:
|
184
|
+
delimiter: "."
|
185
|
+
separator: ","
|
186
|
+
human:
|
187
|
+
decimal_units:
|
188
|
+
delimiter: "."
|
189
|
+
format: "%n%u"
|
190
|
+
precision: 3
|
191
|
+
separator: ","
|
192
|
+
units:
|
193
|
+
billion: B
|
194
|
+
million: M
|
195
|
+
quadrillion: Q
|
196
|
+
thousand: K
|
197
|
+
trillion: T
|
198
|
+
unit: ''
|
199
|
+
processes:
|
200
|
+
index:
|
201
|
+
cron_enabled: Agendamento ativado
|
202
|
+
no_good_job_processes_found: Nenhum processo do GoodJob encontrado.
|
203
|
+
process: Processo
|
204
|
+
schedulers: Agendadores
|
205
|
+
started: Iniciado
|
206
|
+
title: Processos
|
207
|
+
updated: Atualizado
|
208
|
+
shared:
|
209
|
+
boolean:
|
210
|
+
'false': Não
|
211
|
+
'true': Sim
|
212
|
+
error: Erro
|
213
|
+
filter:
|
214
|
+
all: Tudo
|
215
|
+
all_jobs: Todas as tarefas
|
216
|
+
all_queues: Todas as filas
|
217
|
+
clear: Limpar
|
218
|
+
job_name: Nome da Tarefa
|
219
|
+
placeholder: Pesquisar por classe, ID da tarefa, parâmetros da tarefa e texto de erro.
|
220
|
+
queue_name: Nome da Fila
|
221
|
+
search: Pesquisar
|
222
|
+
navbar:
|
223
|
+
batches: Lotes
|
224
|
+
cron_schedules: Agendamentos
|
225
|
+
jobs: Tarefas
|
226
|
+
live_poll: Acompanhamento ao Vivo
|
227
|
+
name: "GoodJob 👍"
|
228
|
+
processes: Processos
|
229
|
+
theme:
|
230
|
+
auto: Automático
|
231
|
+
dark: Escuro
|
232
|
+
light: Claro
|
233
|
+
theme: Tema
|
234
|
+
secondary_navbar:
|
235
|
+
inspiration: Lembre-se, você também está fazendo uma Boa Tarefa!
|
236
|
+
last_updated: Última atualização
|
237
|
+
status:
|
238
|
+
discarded: Descartado
|
239
|
+
queued: Enfileirado
|
240
|
+
retried: Tentado novamente
|
241
|
+
running: Em execução
|
242
|
+
scheduled: Agendado
|
243
|
+
succeeded: Concluído com sucesso
|
@@ -96,6 +96,8 @@ module GoodJob
|
|
96
96
|
# Generates the concurrency key from the configuration
|
97
97
|
# @return [Object] concurrency key
|
98
98
|
def _good_job_concurrency_key
|
99
|
+
return _good_job_default_concurrency_key unless self.class.good_job_concurrency_config.key?(:key)
|
100
|
+
|
99
101
|
key = self.class.good_job_concurrency_config[:key]
|
100
102
|
return if key.blank?
|
101
103
|
|
@@ -105,6 +107,12 @@ module GoodJob
|
|
105
107
|
key
|
106
108
|
end
|
107
109
|
|
110
|
+
# Generates the default concurrency key when the configuration doesn't provide one
|
111
|
+
# @return [String] concurrency key
|
112
|
+
def _good_job_default_concurrency_key
|
113
|
+
self.class.name.to_s
|
114
|
+
end
|
115
|
+
|
108
116
|
private
|
109
117
|
|
110
118
|
def good_job_enqueue_concurrency_check(job, on_abort:, on_enqueue:)
|
data/lib/good_job/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: good_job
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.24.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ben Sheldon
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-02-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activejob
|
@@ -347,6 +347,7 @@ files:
|
|
347
347
|
- config/locales/ja.yml
|
348
348
|
- config/locales/ko.yml
|
349
349
|
- config/locales/nl.yml
|
350
|
+
- config/locales/pt-BR.yml
|
350
351
|
- config/locales/ru.yml
|
351
352
|
- config/locales/tr.yml
|
352
353
|
- config/locales/uk.yml
|
@@ -436,7 +437,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
436
437
|
- !ruby/object:Gem::Version
|
437
438
|
version: '0'
|
438
439
|
requirements: []
|
439
|
-
rubygems_version: 3.
|
440
|
+
rubygems_version: 3.5.3
|
440
441
|
signing_key:
|
441
442
|
specification_version: 4
|
442
443
|
summary: A multithreaded, Postgres-based ActiveJob backend for Ruby on Rails
|