good_job 4.0.3 → 4.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +71 -0
- data/README.md +1 -1
- data/app/charts/good_job/base_chart.rb +25 -0
- data/app/charts/good_job/performance_index_chart.rb +69 -0
- data/app/charts/good_job/performance_show_chart.rb +71 -0
- data/app/charts/good_job/scheduled_by_queue_chart.rb +23 -28
- data/app/controllers/good_job/application_controller.rb +1 -1
- data/app/controllers/good_job/frontends_controller.rb +6 -2
- data/app/controllers/good_job/metrics_controller.rb +5 -15
- data/app/controllers/good_job/performance_controller.rb +6 -1
- data/app/frontend/good_job/icons.svg +79 -0
- data/app/frontend/good_job/modules/charts.js +5 -17
- data/app/frontend/good_job/style.css +5 -0
- data/app/helpers/good_job/application_helper.rb +9 -1
- data/app/helpers/good_job/icons_helper.rb +8 -5
- data/app/models/concerns/good_job/advisory_lockable.rb +17 -7
- data/app/models/concerns/good_job/error_events.rb +14 -35
- data/app/models/concerns/good_job/reportable.rb +8 -12
- data/app/models/good_job/batch.rb +10 -5
- data/app/models/good_job/batch_record.rb +18 -15
- data/app/models/good_job/discrete_execution.rb +6 -60
- data/app/models/good_job/execution.rb +59 -4
- data/app/models/good_job/execution_result.rb +6 -6
- data/app/models/good_job/job.rb +569 -14
- data/app/models/good_job/process.rb +13 -29
- data/app/views/good_job/batches/_jobs.erb +1 -1
- data/app/views/good_job/batches/_table.erb +1 -1
- data/app/views/good_job/jobs/index.html.erb +1 -1
- data/app/views/good_job/performance/index.html.erb +3 -1
- data/app/views/good_job/performance/show.html.erb +5 -0
- data/app/views/good_job/shared/_filter.erb +2 -2
- data/app/views/layouts/good_job/application.html.erb +7 -7
- data/config/brakeman.ignore +75 -0
- data/config/locales/de.yml +52 -48
- data/config/locales/en.yml +4 -0
- data/config/locales/es.yml +16 -12
- data/config/locales/fr.yml +4 -0
- data/config/locales/it.yml +4 -0
- data/config/locales/ja.yml +4 -0
- data/config/locales/ko.yml +4 -0
- data/config/locales/nl.yml +4 -0
- data/config/locales/pt-BR.yml +4 -0
- data/config/locales/ru.yml +4 -0
- data/config/locales/tr.yml +4 -0
- data/config/locales/uk.yml +4 -0
- data/config/routes.rb +4 -4
- data/lib/good_job/active_job_extensions/concurrency.rb +105 -98
- data/lib/good_job/adapter/inline_buffer.rb +73 -0
- data/lib/good_job/adapter.rb +59 -53
- data/lib/good_job/capsule_tracker.rb +1 -1
- data/lib/good_job/configuration.rb +3 -4
- data/lib/good_job/cron_manager.rb +1 -3
- data/lib/good_job/current_thread.rb +4 -4
- data/lib/good_job/notifier.rb +7 -0
- data/lib/good_job/version.rb +1 -1
- data/lib/good_job.rb +6 -5
- metadata +10 -20
- data/app/models/good_job/base_execution.rb +0 -609
- data/app/views/good_job/shared/icons/_arrow_clockwise.html.erb +0 -5
- data/app/views/good_job/shared/icons/_check.html.erb +0 -5
- data/app/views/good_job/shared/icons/_circle_half.html.erb +0 -4
- data/app/views/good_job/shared/icons/_clock.html.erb +0 -5
- data/app/views/good_job/shared/icons/_dash_circle.html.erb +0 -5
- data/app/views/good_job/shared/icons/_dots.html.erb +0 -3
- data/app/views/good_job/shared/icons/_eject.html.erb +0 -4
- data/app/views/good_job/shared/icons/_exclamation.html.erb +0 -5
- data/app/views/good_job/shared/icons/_globe.html.erb +0 -3
- data/app/views/good_job/shared/icons/_info.html.erb +0 -4
- data/app/views/good_job/shared/icons/_moon_stars_fill.html.erb +0 -5
- data/app/views/good_job/shared/icons/_pause.html.erb +0 -4
- data/app/views/good_job/shared/icons/_play.html.erb +0 -4
- data/app/views/good_job/shared/icons/_skip_forward.html.erb +0 -4
- data/app/views/good_job/shared/icons/_stop.html.erb +0 -4
- data/app/views/good_job/shared/icons/_sun_fill.html.erb +0 -4
@@ -15,18 +15,18 @@ module GoodJob # :nodoc:
|
|
15
15
|
|
16
16
|
self.table_name = 'good_job_processes'
|
17
17
|
self.implicit_order_column = 'created_at'
|
18
|
-
LOCK_TYPES = [
|
19
|
-
LOCK_TYPE_ADVISORY = 'advisory',
|
20
|
-
].freeze
|
21
18
|
|
22
|
-
|
23
|
-
|
24
|
-
}
|
25
|
-
|
26
|
-
|
19
|
+
lock_type_enum = {
|
20
|
+
advisory: 0,
|
21
|
+
}
|
22
|
+
if Gem::Version.new(Rails.version) >= Gem::Version.new('7.1.0.a')
|
23
|
+
enum :lock_type, lock_type_enum, validate: { allow_nil: true }
|
24
|
+
else
|
25
|
+
enum lock_type: lock_type_enum
|
26
|
+
end
|
27
27
|
|
28
28
|
has_many :locked_jobs, class_name: "GoodJob::Job", foreign_key: :locked_by_id, inverse_of: :locked_by_process, dependent: nil
|
29
|
-
after_destroy { locked_jobs.update_all(locked_by_id: nil)
|
29
|
+
after_destroy { locked_jobs.update_all(locked_by_id: nil) } # rubocop:disable Rails/SkipsModelValidations
|
30
30
|
|
31
31
|
# Processes that are active and locked.
|
32
32
|
# @!method active
|
@@ -34,7 +34,7 @@ module GoodJob # :nodoc:
|
|
34
34
|
# @return [ActiveRecord::Relation]
|
35
35
|
scope :active, (lambda do
|
36
36
|
query = joins_advisory_locks
|
37
|
-
query.where(lock_type:
|
37
|
+
query.where(lock_type: :advisory).advisory_locked
|
38
38
|
.or(query.where(lock_type: nil).where(arel_table[:updated_at].gt(EXPIRED_INTERVAL.ago)))
|
39
39
|
end)
|
40
40
|
|
@@ -44,14 +44,14 @@ module GoodJob # :nodoc:
|
|
44
44
|
# @return [ActiveRecord::Relation]
|
45
45
|
scope :inactive, (lambda do
|
46
46
|
query = joins_advisory_locks
|
47
|
-
query.where(lock_type:
|
47
|
+
query.where(lock_type: :advisory).advisory_unlocked
|
48
48
|
.or(query.where(lock_type: nil).where(arel_table[:updated_at].lt(EXPIRED_INTERVAL.ago)))
|
49
49
|
end)
|
50
50
|
|
51
51
|
# Deletes all inactive process records.
|
52
52
|
def self.cleanup
|
53
53
|
inactive.find_each do |process|
|
54
|
-
GoodJob::Job.where(locked_by_id: process.id).update_all(locked_by_id: nil, locked_at: nil)
|
54
|
+
GoodJob::Job.where(locked_by_id: process.id).update_all(locked_by_id: nil, locked_at: nil) # rubocop:disable Rails/SkipsModelValidations
|
55
55
|
process.delete
|
56
56
|
end
|
57
57
|
end
|
@@ -63,7 +63,7 @@ module GoodJob # :nodoc:
|
|
63
63
|
}
|
64
64
|
if with_advisory_lock
|
65
65
|
attributes[:create_with_advisory_lock] = true
|
66
|
-
attributes[:lock_type] =
|
66
|
+
attributes[:lock_type] = :advisory
|
67
67
|
end
|
68
68
|
create!(attributes)
|
69
69
|
end
|
@@ -124,21 +124,5 @@ module GoodJob # :nodoc:
|
|
124
124
|
def schedulers
|
125
125
|
state.fetch("schedulers", [])
|
126
126
|
end
|
127
|
-
|
128
|
-
def lock_type
|
129
|
-
return unless self.class.columns_hash['lock_type']
|
130
|
-
|
131
|
-
enum = super
|
132
|
-
LOCK_TYPE_ENUMS.key(enum) if enum
|
133
|
-
end
|
134
|
-
|
135
|
-
def lock_type=(value)
|
136
|
-
return unless self.class.columns_hash['lock_type']
|
137
|
-
|
138
|
-
enum = LOCK_TYPE_ENUMS[value]
|
139
|
-
raise(ArgumentError, "Invalid error_event: #{value}") if value && !enum
|
140
|
-
|
141
|
-
super(enum)
|
142
|
-
end
|
143
127
|
end
|
144
128
|
end
|
@@ -30,7 +30,7 @@
|
|
30
30
|
<span class="badge bg-primary text-dark font-monospace"><%= job.queue_name %></span>
|
31
31
|
</div>
|
32
32
|
<div class="col-4 col-lg-1 text-lg-end">
|
33
|
-
<div class="d-lg-none small text-muted mt-1"><%= t "good_job.models.job.priority"
|
33
|
+
<div class="d-lg-none small text-muted mt-1"><%= t "good_job.models.job.priority" %></div>
|
34
34
|
<span class="font-monospace fw-bold"><%= job.priority %></span>
|
35
35
|
</div>
|
36
36
|
<div class="col-4 col-lg-1 text-lg-end">
|
@@ -56,7 +56,7 @@
|
|
56
56
|
</div>
|
57
57
|
<div class="col-6 col-lg-1">
|
58
58
|
<div class="d-lg-none small text-muted mt-1"><%= t "good_job.models.batch.jobs" %></div>
|
59
|
-
<%= batch.jobs.
|
59
|
+
<%= batch.jobs.size %>
|
60
60
|
</div>
|
61
61
|
<div class="col text-end">
|
62
62
|
<%= tag.button type: "button", class: "btn btn-sm text-muted", role: "button",
|
@@ -7,7 +7,7 @@
|
|
7
7
|
<nav aria-label="<%= t ".job_pagination" %>" class="mt-3">
|
8
8
|
<ul class="pagination">
|
9
9
|
<li class="page-item">
|
10
|
-
<%= link_to(@filter.to_params(after_scheduled_at:
|
10
|
+
<%= link_to(@filter.to_params(after_scheduled_at: @filter.last.scheduled_at || @filter.last.created_at, after_id: @filter.last.id), class: "page-link") do %>
|
11
11
|
<%= t ".older_jobs" %> <span aria-hidden="true">»</span>
|
12
12
|
<% end %>
|
13
13
|
</li>
|
@@ -2,6 +2,8 @@
|
|
2
2
|
<h2 class="pt-3 pb-2"><%= t ".title" %></h2>
|
3
3
|
</div>
|
4
4
|
|
5
|
+
<%= render 'good_job/shared/chart', chart_data: GoodJob::PerformanceIndexChart.new.data %>
|
6
|
+
|
5
7
|
<div class="my-3 card">
|
6
8
|
<div class="list-group list-group-flush text-nowrap" role="table">
|
7
9
|
<header class="list-group-item bg-body-tertiary">
|
@@ -18,7 +20,7 @@
|
|
18
20
|
<% @performances.each do |performance| %>
|
19
21
|
<div role="row" class="list-group-item py-3">
|
20
22
|
<div class="row align-items-center">
|
21
|
-
<div class="col-12 col-lg-4"><%= performance.job_class %></div>
|
23
|
+
<div class="col-12 col-lg-4"><%= link_to performance.job_class, performance_path(performance.job_class) %></div>
|
22
24
|
<div class="col-6 col-lg-2 text-wrap">
|
23
25
|
<div class="d-lg-none small text-muted mt-1"><%= t ".executions" %></div>
|
24
26
|
<%= performance.executions_count %>
|
@@ -15,7 +15,7 @@
|
|
15
15
|
<option value="" <%= "selected='selected'" if params[:queue_name].blank? %>><%= t ".all_queues" %></option>
|
16
16
|
|
17
17
|
<% filter.queues.each do |name, count| %>
|
18
|
-
<option value="<%= name.to_param %>" <%= "selected='selected'" if params[:queue_name] == name %>><%= name %> (<%= number_with_delimiter(count
|
18
|
+
<option value="<%= name.to_param %>" <%= "selected='selected'" if params[:queue_name] == name %>><%= name %> (<%= number_with_delimiter(count) %>)</option>
|
19
19
|
<% end %>
|
20
20
|
</select>
|
21
21
|
</div>
|
@@ -26,7 +26,7 @@
|
|
26
26
|
<option value="" <%= "selected='selected'" if params[:job_class].blank? %>><%= t ".all_jobs" %></option>
|
27
27
|
|
28
28
|
<% filter.job_classes.each do |name, count| %>
|
29
|
-
<option value="<%= name.to_param %>" <%= "selected='selected'" if params[:job_class] == name %>><%= name %> (<%= number_with_delimiter(count
|
29
|
+
<option value="<%= name.to_param %>" <%= "selected='selected'" if params[:job_class] == name %>><%= name %> (<%= number_with_delimiter(count) %>)</option>
|
30
30
|
<% end %>
|
31
31
|
</select>
|
32
32
|
</div>
|
@@ -21,13 +21,13 @@
|
|
21
21
|
</script>
|
22
22
|
|
23
23
|
<%# Do not use asset tag helpers to avoid paths being overriden by config.asset_host %>
|
24
|
-
<%= tag.link rel: "stylesheet", href: frontend_static_path(:bootstrap, format: :css,
|
25
|
-
<%= tag.link rel: "stylesheet", href: frontend_static_path(:style, format: :css,
|
26
|
-
<%= tag.script "", src: frontend_static_path(:bootstrap, format: :js,
|
27
|
-
<%= tag.script "", src: frontend_static_path(:chartjs, format: :js,
|
28
|
-
<%= tag.script "", src: frontend_static_path(:rails_ujs, format: :js,
|
29
|
-
<%= tag.script "", src: frontend_static_path(:es_module_shims, format: :js,
|
30
|
-
<% importmaps = GoodJob::FrontendsController.js_modules.keys.index_with { |module_name| frontend_module_path(module_name, format: :js, locale: nil
|
24
|
+
<%= tag.link rel: "stylesheet", href: frontend_static_path(:bootstrap, format: :css, locale: nil), nonce: content_security_policy_nonce %>
|
25
|
+
<%= tag.link rel: "stylesheet", href: frontend_static_path(:style, format: :css, locale: nil), nonce: content_security_policy_nonce %>
|
26
|
+
<%= tag.script "", src: frontend_static_path(:bootstrap, format: :js, locale: nil), nonce: content_security_policy_nonce %>
|
27
|
+
<%= tag.script "", src: frontend_static_path(:chartjs, format: :js, locale: nil), nonce: content_security_policy_nonce %>
|
28
|
+
<%= tag.script "", src: frontend_static_path(:rails_ujs, format: :js, locale: nil), nonce: content_security_policy_nonce %>
|
29
|
+
<%= tag.script "", src: frontend_static_path(:es_module_shims, format: :js, locale: nil), async: true, nonce: content_security_policy_nonce %>
|
30
|
+
<% importmaps = GoodJob::FrontendsController.js_modules.keys.index_with { |module_name| frontend_module_path(module_name, format: :js, locale: nil) } %>
|
31
31
|
<%= tag.script({ imports: importmaps }.to_json.html_safe, type: "importmap", nonce: content_security_policy_nonce) %>
|
32
32
|
<%= tag.script "", type: "module", nonce: content_security_policy_nonce do %> import "application"; <% end %>
|
33
33
|
</head>
|
@@ -0,0 +1,75 @@
|
|
1
|
+
{
|
2
|
+
"ignored_warnings": [
|
3
|
+
{
|
4
|
+
"warning_type": "Dynamic Render Path",
|
5
|
+
"warning_code": 15,
|
6
|
+
"fingerprint": "041ae0dc908151bac0ef0952c625f0dce3a05d2c01a710397a613ef10083f7ae",
|
7
|
+
"check_name": "Render",
|
8
|
+
"message": "Render path contains parameter value",
|
9
|
+
"file": "app/controllers/good_job/frontends_controller.rb",
|
10
|
+
"line": 47,
|
11
|
+
"link": "https://brakemanscanner.org/docs/warning_types/dynamic_render_path/",
|
12
|
+
"code": "render(file => (self.class.js_modules[params[:id].to_sym] or raise(ActionController::RoutingError, \"Not Found\")), {})",
|
13
|
+
"render_path": null,
|
14
|
+
"location": {
|
15
|
+
"type": "method",
|
16
|
+
"class": "GoodJob::FrontendsController",
|
17
|
+
"method": "module"
|
18
|
+
},
|
19
|
+
"user_input": "params[:id].to_sym",
|
20
|
+
"confidence": "Weak",
|
21
|
+
"cwe_id": [
|
22
|
+
22
|
23
|
+
],
|
24
|
+
"note": "Files are explicitly enumerated in the array"
|
25
|
+
},
|
26
|
+
{
|
27
|
+
"warning_type": "Dynamic Render Path",
|
28
|
+
"warning_code": 15,
|
29
|
+
"fingerprint": "b0c2888c9b217671d90d0141b49b036af3b2a70c63b02968cc97ae2052c86272",
|
30
|
+
"check_name": "Render",
|
31
|
+
"message": "Render path contains parameter value",
|
32
|
+
"file": "app/controllers/good_job/frontends_controller.rb",
|
33
|
+
"line": 41,
|
34
|
+
"link": "https://brakemanscanner.org/docs/warning_types/dynamic_render_path/",
|
35
|
+
"code": "render(file => ({ :css => ({ :bootstrap => GoodJob::Engine.root.join(\"app\", \"frontend\", \"good_job\", \"vendor\", \"bootstrap\", \"bootstrap.min.css\"), :style => GoodJob::Engine.root.join(\"app\", \"frontend\", \"good_job\", \"style.css\") }), :js => ({ :bootstrap => GoodJob::Engine.root.join(\"app\", \"frontend\", \"good_job\", \"vendor\", \"bootstrap\", \"bootstrap.bundle.min.js\"), :chartjs => GoodJob::Engine.root.join(\"app\", \"frontend\", \"good_job\", \"vendor\", \"chartjs\", \"chart.min.js\"), :es_module_shims => GoodJob::Engine.root.join(\"app\", \"frontend\", \"good_job\", \"vendor\", \"es_module_shims.js\"), :rails_ujs => GoodJob::Engine.root.join(\"app\", \"frontend\", \"good_job\", \"vendor\", \"rails_ujs.js\") }), :svg => ({ :icons => GoodJob::Engine.root.join(\"app\", \"frontend\", \"good_job\", \"icons.svg\") }) }.dig(params[:format].to_sym, params[:id].to_sym) or raise(ActionController::RoutingError, \"Not Found\")), {})",
|
36
|
+
"render_path": null,
|
37
|
+
"location": {
|
38
|
+
"type": "method",
|
39
|
+
"class": "GoodJob::FrontendsController",
|
40
|
+
"method": "static"
|
41
|
+
},
|
42
|
+
"user_input": "params[:id].to_sym",
|
43
|
+
"confidence": "Weak",
|
44
|
+
"cwe_id": [
|
45
|
+
22
|
46
|
+
],
|
47
|
+
"note": "Files are explicitly enumerated in the array"
|
48
|
+
},
|
49
|
+
{
|
50
|
+
"warning_type": "SQL Injection",
|
51
|
+
"warning_code": 0,
|
52
|
+
"fingerprint": "c837568c590d9608a8bb9927b31b9597aaacc72053b6482e1a54bd02aa0dd2d7",
|
53
|
+
"check_name": "SQL",
|
54
|
+
"message": "Possible SQL injection",
|
55
|
+
"file": "app/models/good_job/job.rb",
|
56
|
+
"line": 140,
|
57
|
+
"link": "https://brakemanscanner.org/docs/warning_types/sql_injection/",
|
58
|
+
"code": "Arel.sql(\"(CASE #{queues.map.with_index do\n sanitize_sql_array([\"WHEN queue_name = ? THEN ?\", queue_name, index])\n end.join(\" \")} ELSE #{queues.size} END)\")",
|
59
|
+
"render_path": null,
|
60
|
+
"location": {
|
61
|
+
"type": "method",
|
62
|
+
"class": "Job",
|
63
|
+
"method": null
|
64
|
+
},
|
65
|
+
"user_input": "queues.map.with_index do\n sanitize_sql_array([\"WHEN queue_name = ? THEN ?\", queue_name, index])\n end.join(\" \")",
|
66
|
+
"confidence": "Medium",
|
67
|
+
"cwe_id": [
|
68
|
+
89
|
69
|
+
],
|
70
|
+
"note": "Developer provided value, queue_name, is sanitized."
|
71
|
+
}
|
72
|
+
],
|
73
|
+
"updated": "2024-07-18 18:05:56 -0700",
|
74
|
+
"brakeman_version": "6.1.2"
|
75
|
+
}
|
data/config/locales/de.yml
CHANGED
@@ -10,17 +10,17 @@ de:
|
|
10
10
|
retry: Wiederholen
|
11
11
|
batches:
|
12
12
|
index:
|
13
|
-
older_batches: Ältere
|
14
|
-
title:
|
13
|
+
older_batches: Ältere Batches
|
14
|
+
title: Batches
|
15
15
|
jobs:
|
16
16
|
actions:
|
17
|
-
confirm_destroy:
|
18
|
-
confirm_discard:
|
19
|
-
confirm_reschedule:
|
20
|
-
confirm_retry:
|
21
|
-
destroy:
|
22
|
-
discard:
|
23
|
-
reschedule:
|
17
|
+
confirm_destroy: Bist du sicher, dass du diesen Job zerstören wilst?
|
18
|
+
confirm_discard: Bist du sicher, dass du diesen Job verwerfen willst?
|
19
|
+
confirm_reschedule: Bist du sicher, dass du diesen Job verschieben willst?
|
20
|
+
confirm_retry: Bist du sicher, dass du diesen Job erneut versuchen willst?
|
21
|
+
destroy: Job zerstören
|
22
|
+
discard: Job verwerfen
|
23
|
+
reschedule: Job neu planen
|
24
24
|
retry: Job wiederholen
|
25
25
|
title: Aktionen
|
26
26
|
no_jobs_found: Keine Jobs gefunden.
|
@@ -29,12 +29,12 @@ de:
|
|
29
29
|
batched_jobs: Batch-Jobs
|
30
30
|
callback_jobs: Callback-Jobs
|
31
31
|
table:
|
32
|
-
no_batches_found: Keine
|
32
|
+
no_batches_found: Keine Batches gefunden.
|
33
33
|
cron_entries:
|
34
34
|
actions:
|
35
|
-
confirm_disable:
|
36
|
-
confirm_enable:
|
37
|
-
confirm_enqueue:
|
35
|
+
confirm_disable: Bist du sicher, dass du diesen Cron-Eintrag deaktivieren willst?
|
36
|
+
confirm_enable: Bist du sicher, dass du diesen Cron-Eintrag aktivieren willst?
|
37
|
+
confirm_enqueue: Bist du sicher, dass du diesen Cron-Eintrag in die Warteschlange stellen willst?
|
38
38
|
disable: Cron-Eintrag deaktivieren
|
39
39
|
enable: Cron-Eintrag aktivieren
|
40
40
|
enqueue: Cron-Eintrag jetzt einreihen
|
@@ -48,7 +48,7 @@ de:
|
|
48
48
|
no_cron_schedules_found: Keine Cron-Zeitpläne gefunden.
|
49
49
|
title: Cron-Zeitpläne
|
50
50
|
show:
|
51
|
-
cron_entry_key: Cron-
|
51
|
+
cron_entry_key: Cron-Schlüssel
|
52
52
|
datetime:
|
53
53
|
distance_in_words:
|
54
54
|
about_x_hours:
|
@@ -95,11 +95,11 @@ de:
|
|
95
95
|
minutes: "%{min}m %{sec}s"
|
96
96
|
seconds: "%{sec}s"
|
97
97
|
error_event:
|
98
|
-
discarded:
|
98
|
+
discarded: Verworfen
|
99
99
|
handled: Abgewickelt
|
100
100
|
interrupted: Unterbrochen
|
101
101
|
retried: Wiederholt
|
102
|
-
retry_stopped:
|
102
|
+
retry_stopped: Wiederholung gestoppt
|
103
103
|
unhandled: Unbehandelt
|
104
104
|
helpers:
|
105
105
|
relative_time:
|
@@ -107,20 +107,20 @@ de:
|
|
107
107
|
past: Vor %{time}
|
108
108
|
jobs:
|
109
109
|
actions:
|
110
|
-
confirm_destroy:
|
111
|
-
confirm_discard:
|
112
|
-
confirm_force_discard:
|
113
|
-
confirm_reschedule:
|
114
|
-
confirm_retry:
|
115
|
-
destroy:
|
116
|
-
discard:
|
110
|
+
confirm_destroy: Bist du sicher, dass du diesen Job zerstören willst?
|
111
|
+
confirm_discard: Bist du sicher, dass du diesen Job verwerfen willst?
|
112
|
+
confirm_force_discard: Bist du sicher, dass du das Verwerfen dieses Jobs erzwingen möchten? Der Job wird als verworfen markiert, aber der laufende Job wird nicht gestoppt – er wird jedoch bei Fehlern nicht erneut versucht.
|
113
|
+
confirm_reschedule: Bist du sicher, dass du diesen Job verschieben willst?
|
114
|
+
confirm_retry: Bist du sicher, dass du diesen Job wiederholen willst?
|
115
|
+
destroy: Job zerstören
|
116
|
+
discard: Job verwerfen
|
117
117
|
force_discard: Job verwerfen erzwingen
|
118
|
-
reschedule:
|
118
|
+
reschedule: Job neu planen
|
119
119
|
retry: Job wiederholen
|
120
120
|
destroy:
|
121
121
|
notice: Hiob wurde zerstört
|
122
122
|
discard:
|
123
|
-
notice:
|
123
|
+
notice: Job wurde verworfen
|
124
124
|
executions:
|
125
125
|
application_trace: Application Trace
|
126
126
|
full_trace: Full Trace
|
@@ -131,25 +131,25 @@ de:
|
|
131
131
|
notice: Der Job wurde zwangsweise verworfen. Die Ausführung wird fortgesetzt, bei Fehlern wird der Vorgang jedoch nicht wiederholt
|
132
132
|
index:
|
133
133
|
job_pagination: Job-Paginierung
|
134
|
-
older_jobs: Ältere
|
134
|
+
older_jobs: Ältere Jobs
|
135
135
|
reschedule:
|
136
|
-
notice:
|
136
|
+
notice: Job wurde neu planen
|
137
137
|
retry:
|
138
|
-
notice:
|
138
|
+
notice: Job wurde wiederholt
|
139
139
|
show:
|
140
|
-
jobs:
|
140
|
+
jobs: Jobs
|
141
141
|
table:
|
142
142
|
actions:
|
143
143
|
apply_to_all:
|
144
|
-
one:
|
145
|
-
other:
|
146
|
-
confirm_destroy_all:
|
147
|
-
confirm_discard_all:
|
148
|
-
confirm_reschedule_all:
|
149
|
-
confirm_retry_all:
|
150
|
-
destroy_all:
|
144
|
+
one: Auf einen Job anwenden.
|
145
|
+
other: Auf alle %{count} Jobs anwenden.
|
146
|
+
confirm_destroy_all: Bist du sicher, dass du die ausgewählten Jobs löschen willst?
|
147
|
+
confirm_discard_all: Bist du sicher, dass du die ausgewählten Jobs verferfen willst?
|
148
|
+
confirm_reschedule_all: Bist du sicher, dass du die ausgewählten Jobs neu planen willst?
|
149
|
+
confirm_retry_all: Bist du sicher, dass du die ausgewählten Jobs wiederholen willst?
|
150
|
+
destroy_all: Alle zerstören
|
151
151
|
discard_all: Alle verwerfen
|
152
|
-
reschedule_all:
|
152
|
+
reschedule_all: Alle neu planen
|
153
153
|
retry_all: Alle wiederholen
|
154
154
|
title: Aktionen
|
155
155
|
no_jobs_found: Keine Jobs gefunden.
|
@@ -165,7 +165,7 @@ de:
|
|
165
165
|
enqueued_at: Eingereiht bei
|
166
166
|
finished: Fertig
|
167
167
|
finished_at: Fertig um
|
168
|
-
jobs:
|
168
|
+
jobs: Jobs
|
169
169
|
name: Name
|
170
170
|
cron:
|
171
171
|
class: Klasse
|
@@ -197,17 +197,21 @@ de:
|
|
197
197
|
performance:
|
198
198
|
index:
|
199
199
|
average_duration: Durchschnittliche Dauer
|
200
|
-
|
201
|
-
|
200
|
+
chart_title: Gesamtdauer der Jobs in Sekunden
|
201
|
+
executions: Ausführungen
|
202
|
+
job_class: Job-Klasse
|
202
203
|
maximum_duration: Maximale Dauer
|
203
204
|
minimum_duration: Mindestdauer
|
204
205
|
title: Leistung
|
206
|
+
show:
|
207
|
+
slow: Langsam
|
208
|
+
title: Leistung
|
205
209
|
processes:
|
206
210
|
index:
|
207
211
|
cron_enabled: Cron aktiviert
|
208
212
|
no_good_job_processes_found: Keine GoodJob-Prozesse gefunden.
|
209
|
-
process:
|
210
|
-
schedulers:
|
213
|
+
process: Prozess
|
214
|
+
schedulers: Scheduler
|
211
215
|
started: Gestartet
|
212
216
|
title: Prozesse
|
213
217
|
updated: Aktualisiert
|
@@ -220,9 +224,9 @@ de:
|
|
220
224
|
all: Alle
|
221
225
|
all_jobs: Alle Jobs
|
222
226
|
all_queues: Alle Warteschlangen
|
223
|
-
clear:
|
224
|
-
job_name:
|
225
|
-
placeholder:
|
227
|
+
clear: Löschen
|
228
|
+
job_name: Job-Name
|
229
|
+
placeholder: Suche nach Klasse, Job-ID, Jobparameter und Fehlertext.
|
226
230
|
queue_name: Warteschlangenname
|
227
231
|
search: Suchen
|
228
232
|
navbar:
|
@@ -236,14 +240,14 @@ de:
|
|
236
240
|
theme:
|
237
241
|
auto: Auto
|
238
242
|
dark: Dunkel
|
239
|
-
light:
|
240
|
-
theme:
|
243
|
+
light: Hell
|
244
|
+
theme: Theme
|
241
245
|
pending_migrations: GoodJob hat ausstehende Datenbankmigrationen.
|
242
246
|
secondary_navbar:
|
243
247
|
inspiration: Denk daran, auch du machst einen guten Job!
|
244
248
|
last_updated: Zuletzt aktualisiert
|
245
249
|
status:
|
246
|
-
discarded:
|
250
|
+
discarded: Verworfen
|
247
251
|
queued: In der Warteschlange
|
248
252
|
retried: Wiederholt
|
249
253
|
running: Laufend
|
data/config/locales/en.yml
CHANGED
@@ -197,11 +197,15 @@ en:
|
|
197
197
|
performance:
|
198
198
|
index:
|
199
199
|
average_duration: Average duration
|
200
|
+
chart_title: Total job execution time in seconds
|
200
201
|
executions: Executions
|
201
202
|
job_class: Job class
|
202
203
|
maximum_duration: Maximum duration
|
203
204
|
minimum_duration: Minimum duration
|
204
205
|
title: Performance
|
206
|
+
show:
|
207
|
+
slow: Slow
|
208
|
+
title: Performance
|
205
209
|
processes:
|
206
210
|
index:
|
207
211
|
cron_enabled: Cron enabled
|
data/config/locales/es.yml
CHANGED
@@ -10,8 +10,8 @@ es:
|
|
10
10
|
retry: Reintentar
|
11
11
|
batches:
|
12
12
|
index:
|
13
|
-
older_batches:
|
14
|
-
title:
|
13
|
+
older_batches: Lotes anteriores
|
14
|
+
title: Lotes
|
15
15
|
jobs:
|
16
16
|
actions:
|
17
17
|
confirm_destroy: "¿Estás seguro que querés eliminar esta tarea?"
|
@@ -26,10 +26,10 @@ es:
|
|
26
26
|
no_jobs_found: No hay tareas.
|
27
27
|
show:
|
28
28
|
attributes: Atributos
|
29
|
-
batched_jobs:
|
29
|
+
batched_jobs: Tareas en lote
|
30
30
|
callback_jobs: Callback Jobs
|
31
31
|
table:
|
32
|
-
no_batches_found: No hay
|
32
|
+
no_batches_found: No hay lotes.
|
33
33
|
cron_entries:
|
34
34
|
actions:
|
35
35
|
confirm_disable: "¿Estás seguro que querés deshabilitar esta tarea programada?"
|
@@ -109,12 +109,12 @@ es:
|
|
109
109
|
actions:
|
110
110
|
confirm_destroy: "¿Estás seguro que querés eliminar esta tarea?"
|
111
111
|
confirm_discard: "¿Estás seguro que querés descartar esta tarea?"
|
112
|
-
confirm_force_discard: "¿Está seguro de que desea forzar el descarte de
|
112
|
+
confirm_force_discard: "¿Está seguro de que desea forzar el descarte de esta tarea? La tarea se marcará como descartada, pero la tarea en ejecución no se detendrá; sin embargo, no se volverá a intentar en caso de falla.\n"
|
113
113
|
confirm_reschedule: "¿Estás seguro que querés reprogramar esta tarea?"
|
114
114
|
confirm_retry: "¿Estás seguro que querés reintentar esta tarea?"
|
115
115
|
destroy: Eliminar tarea
|
116
116
|
discard: Descartar tarea
|
117
|
-
force_discard: Forzar el descarte
|
117
|
+
force_discard: Forzar el descarte de la tarea
|
118
118
|
reschedule: Reprogramar tarea
|
119
119
|
retry: Reiuntentar tarea
|
120
120
|
destroy:
|
@@ -122,13 +122,13 @@ es:
|
|
122
122
|
discard:
|
123
123
|
notice: La tarea ha sido descartada
|
124
124
|
executions:
|
125
|
-
application_trace:
|
126
|
-
full_trace:
|
125
|
+
application_trace: Traza de la aplicación
|
126
|
+
full_trace: Traza completa
|
127
127
|
in_queue: en cola
|
128
128
|
runtime: en ejecución
|
129
129
|
title: Ejecuciones
|
130
130
|
force_discard:
|
131
|
-
notice:
|
131
|
+
notice: La tarea ha sido descartada a la fuerza. Continuará ejecutándose pero no se volverá a intentar en caso de fallas.
|
132
132
|
index:
|
133
133
|
job_pagination: Paginación de tareas
|
134
134
|
older_jobs: Tareas anteriores
|
@@ -197,10 +197,14 @@ es:
|
|
197
197
|
performance:
|
198
198
|
index:
|
199
199
|
average_duration: Duración promedio
|
200
|
+
chart_title: Tiempo total de ejecución de la tarea en segundos
|
200
201
|
executions: Ejecuciones
|
201
|
-
job_class: clase de
|
202
|
+
job_class: clase de tarea
|
202
203
|
maximum_duration: Duración máxima
|
203
204
|
minimum_duration: Duración mínima
|
205
|
+
title: Rendimiento
|
206
|
+
show:
|
207
|
+
slow: Lento
|
204
208
|
title: Actuación
|
205
209
|
processes:
|
206
210
|
index:
|
@@ -226,12 +230,12 @@ es:
|
|
226
230
|
queue_name: Nombre de la cola
|
227
231
|
search: Buscar
|
228
232
|
navbar:
|
229
|
-
batches:
|
233
|
+
batches: Lotes
|
230
234
|
cron_schedules: Cron
|
231
235
|
jobs: Tareas
|
232
236
|
live_poll: En vivo
|
233
237
|
name: "GoodJob 👍"
|
234
|
-
performance:
|
238
|
+
performance: Rendimiento
|
235
239
|
processes: Procesos
|
236
240
|
theme:
|
237
241
|
auto: Auto
|
data/config/locales/fr.yml
CHANGED
@@ -197,11 +197,15 @@ fr:
|
|
197
197
|
performance:
|
198
198
|
index:
|
199
199
|
average_duration: Durée moyenne
|
200
|
+
chart_title: Durée totale d'exécution du travail en secondes
|
200
201
|
executions: Exécutions
|
201
202
|
job_class: Catégorie d'emplois
|
202
203
|
maximum_duration: Durée maximale
|
203
204
|
minimum_duration: Durée minimale
|
204
205
|
title: Performance
|
206
|
+
show:
|
207
|
+
slow: Lenteur
|
208
|
+
title: Performance
|
205
209
|
processes:
|
206
210
|
index:
|
207
211
|
cron_enabled: Cron activé
|
data/config/locales/it.yml
CHANGED
@@ -197,11 +197,15 @@ it:
|
|
197
197
|
performance:
|
198
198
|
index:
|
199
199
|
average_duration: Durata media
|
200
|
+
chart_title: Tempo totale di esecuzione del lavoro in secondi
|
200
201
|
executions: Esecuzioni
|
201
202
|
job_class: Classe di lavoro
|
202
203
|
maximum_duration: Durata massima
|
203
204
|
minimum_duration: Durata minima
|
204
205
|
title: Prestazione
|
206
|
+
show:
|
207
|
+
slow: Lento
|
208
|
+
title: Prestazione
|
205
209
|
processes:
|
206
210
|
index:
|
207
211
|
cron_enabled: Cron abilitato
|
data/config/locales/ja.yml
CHANGED
@@ -197,11 +197,15 @@ ja:
|
|
197
197
|
performance:
|
198
198
|
index:
|
199
199
|
average_duration: 平均所要時間
|
200
|
+
chart_title: ジョブの総実行時間(秒
|
200
201
|
executions: 処刑
|
201
202
|
job_class: 職種
|
202
203
|
maximum_duration: 最大持続時間
|
203
204
|
minimum_duration: 最小期間
|
204
205
|
title: パフォーマンス
|
206
|
+
show:
|
207
|
+
slow: 遅い
|
208
|
+
title: パフォーマンス
|
205
209
|
processes:
|
206
210
|
index:
|
207
211
|
cron_enabled: Cron が有効になっている
|
data/config/locales/ko.yml
CHANGED
@@ -197,11 +197,15 @@ ko:
|
|
197
197
|
performance:
|
198
198
|
index:
|
199
199
|
average_duration: 평균 지속 시간
|
200
|
+
chart_title: 총 작업 실행 시간(초)
|
200
201
|
executions: 처형
|
201
202
|
job_class: 직업군
|
202
203
|
maximum_duration: 최대 기간
|
203
204
|
minimum_duration: 최소 기간
|
204
205
|
title: 성능
|
206
|
+
show:
|
207
|
+
slow: 느림
|
208
|
+
title: 성능
|
205
209
|
processes:
|
206
210
|
index:
|
207
211
|
cron_enabled: Cron이 활성화되어 있음
|
data/config/locales/nl.yml
CHANGED
@@ -197,11 +197,15 @@ nl:
|
|
197
197
|
performance:
|
198
198
|
index:
|
199
199
|
average_duration: Gemiddelde duur
|
200
|
+
chart_title: Totale uitvoeringstijd van de taak in seconden
|
200
201
|
executions: Executies
|
201
202
|
job_class: Functie klasse
|
202
203
|
maximum_duration: Maximale duur
|
203
204
|
minimum_duration: Minimale duur
|
204
205
|
title: Prestatie
|
206
|
+
show:
|
207
|
+
slow: Langzaam
|
208
|
+
title: Prestatie
|
205
209
|
processes:
|
206
210
|
index:
|
207
211
|
cron_enabled: Cron ingeschakeld
|