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.
Files changed (75) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +71 -0
  3. data/README.md +1 -1
  4. data/app/charts/good_job/base_chart.rb +25 -0
  5. data/app/charts/good_job/performance_index_chart.rb +69 -0
  6. data/app/charts/good_job/performance_show_chart.rb +71 -0
  7. data/app/charts/good_job/scheduled_by_queue_chart.rb +23 -28
  8. data/app/controllers/good_job/application_controller.rb +1 -1
  9. data/app/controllers/good_job/frontends_controller.rb +6 -2
  10. data/app/controllers/good_job/metrics_controller.rb +5 -15
  11. data/app/controllers/good_job/performance_controller.rb +6 -1
  12. data/app/frontend/good_job/icons.svg +79 -0
  13. data/app/frontend/good_job/modules/charts.js +5 -17
  14. data/app/frontend/good_job/style.css +5 -0
  15. data/app/helpers/good_job/application_helper.rb +9 -1
  16. data/app/helpers/good_job/icons_helper.rb +8 -5
  17. data/app/models/concerns/good_job/advisory_lockable.rb +17 -7
  18. data/app/models/concerns/good_job/error_events.rb +14 -35
  19. data/app/models/concerns/good_job/reportable.rb +8 -12
  20. data/app/models/good_job/batch.rb +10 -5
  21. data/app/models/good_job/batch_record.rb +18 -15
  22. data/app/models/good_job/discrete_execution.rb +6 -60
  23. data/app/models/good_job/execution.rb +59 -4
  24. data/app/models/good_job/execution_result.rb +6 -6
  25. data/app/models/good_job/job.rb +569 -14
  26. data/app/models/good_job/process.rb +13 -29
  27. data/app/views/good_job/batches/_jobs.erb +1 -1
  28. data/app/views/good_job/batches/_table.erb +1 -1
  29. data/app/views/good_job/jobs/index.html.erb +1 -1
  30. data/app/views/good_job/performance/index.html.erb +3 -1
  31. data/app/views/good_job/performance/show.html.erb +5 -0
  32. data/app/views/good_job/shared/_filter.erb +2 -2
  33. data/app/views/layouts/good_job/application.html.erb +7 -7
  34. data/config/brakeman.ignore +75 -0
  35. data/config/locales/de.yml +52 -48
  36. data/config/locales/en.yml +4 -0
  37. data/config/locales/es.yml +16 -12
  38. data/config/locales/fr.yml +4 -0
  39. data/config/locales/it.yml +4 -0
  40. data/config/locales/ja.yml +4 -0
  41. data/config/locales/ko.yml +4 -0
  42. data/config/locales/nl.yml +4 -0
  43. data/config/locales/pt-BR.yml +4 -0
  44. data/config/locales/ru.yml +4 -0
  45. data/config/locales/tr.yml +4 -0
  46. data/config/locales/uk.yml +4 -0
  47. data/config/routes.rb +4 -4
  48. data/lib/good_job/active_job_extensions/concurrency.rb +105 -98
  49. data/lib/good_job/adapter/inline_buffer.rb +73 -0
  50. data/lib/good_job/adapter.rb +59 -53
  51. data/lib/good_job/capsule_tracker.rb +1 -1
  52. data/lib/good_job/configuration.rb +3 -4
  53. data/lib/good_job/cron_manager.rb +1 -3
  54. data/lib/good_job/current_thread.rb +4 -4
  55. data/lib/good_job/notifier.rb +7 -0
  56. data/lib/good_job/version.rb +1 -1
  57. data/lib/good_job.rb +6 -5
  58. metadata +10 -20
  59. data/app/models/good_job/base_execution.rb +0 -609
  60. data/app/views/good_job/shared/icons/_arrow_clockwise.html.erb +0 -5
  61. data/app/views/good_job/shared/icons/_check.html.erb +0 -5
  62. data/app/views/good_job/shared/icons/_circle_half.html.erb +0 -4
  63. data/app/views/good_job/shared/icons/_clock.html.erb +0 -5
  64. data/app/views/good_job/shared/icons/_dash_circle.html.erb +0 -5
  65. data/app/views/good_job/shared/icons/_dots.html.erb +0 -3
  66. data/app/views/good_job/shared/icons/_eject.html.erb +0 -4
  67. data/app/views/good_job/shared/icons/_exclamation.html.erb +0 -5
  68. data/app/views/good_job/shared/icons/_globe.html.erb +0 -3
  69. data/app/views/good_job/shared/icons/_info.html.erb +0 -4
  70. data/app/views/good_job/shared/icons/_moon_stars_fill.html.erb +0 -5
  71. data/app/views/good_job/shared/icons/_pause.html.erb +0 -4
  72. data/app/views/good_job/shared/icons/_play.html.erb +0 -4
  73. data/app/views/good_job/shared/icons/_skip_forward.html.erb +0 -4
  74. data/app/views/good_job/shared/icons/_stop.html.erb +0 -4
  75. 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
- LOCK_TYPE_ENUMS = {
23
- LOCK_TYPE_ADVISORY => 1,
24
- }.freeze
25
-
26
- self.table_name = 'good_job_processes'
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) if GoodJob::Job.columns_hash.key?("locked_by_id") } # rubocop:disable Rails/SkipsModelValidations
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: LOCK_TYPE_ENUMS[LOCK_TYPE_ADVISORY]).advisory_locked
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: LOCK_TYPE_ENUMS[LOCK_TYPE_ADVISORY]).advisory_unlocked
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) if GoodJob::Job.columns_hash.key?("locked_by_id") # rubocop:disable Rails/SkipsModelValidations
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] = LOCK_TYPE_ADVISORY
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" %>Priority</div>
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.count %>
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: (@filter.last.scheduled_at || @filter.last.created_at), after_id: @filter.last.id), class: "page-link") do %>
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">&raquo;</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 %>
@@ -0,0 +1,5 @@
1
+ <div class="border-bottom">
2
+ <h2 class="pt-3 pb-2"><%= t ".title" %> - <%= @job_class %></h2>
3
+ </div>
4
+
5
+ <%= render 'good_job/shared/chart', chart_data: GoodJob::PerformanceShowChart.new(@job_class).data %>
@@ -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, translate_hash('good_job.number.format')) %>)</option>
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, translate_hash('good_job.number.format')) %>)</option>
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, v: GoodJob::VERSION, locale: nil), nonce: content_security_policy_nonce %>
25
- <%= tag.link rel: "stylesheet", href: frontend_static_path(:style, format: :css, v: GoodJob::VERSION, locale: nil), nonce: content_security_policy_nonce %>
26
- <%= tag.script "", src: frontend_static_path(:bootstrap, format: :js, v: GoodJob::VERSION, locale: nil), nonce: content_security_policy_nonce %>
27
- <%= tag.script "", src: frontend_static_path(:chartjs, format: :js, v: GoodJob::VERSION, locale: nil), nonce: content_security_policy_nonce %>
28
- <%= tag.script "", src: frontend_static_path(:rails_ujs, format: :js, v: GoodJob::VERSION, locale: nil), nonce: content_security_policy_nonce %>
29
- <%= tag.script "", src: frontend_static_path(:es_module_shims, format: :js, v: GoodJob::VERSION, 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, v: GoodJob::VERSION) } %>
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
+ }
@@ -10,17 +10,17 @@ de:
10
10
  retry: Wiederholen
11
11
  batches:
12
12
  index:
13
- older_batches: Ältere Chargen
14
- title: Chargen
13
+ older_batches: Ältere Batches
14
+ title: Batches
15
15
  jobs:
16
16
  actions:
17
- confirm_destroy: Sind Sie sicher, dass Sie diesen Job zerstören wollen?
18
- confirm_discard: Möchten Sie diesen Job wirklich verwerfen?
19
- confirm_reschedule: Möchten Sie diesen Auftrag wirklich verschieben?
20
- confirm_retry: Möchten Sie diesen Job wirklich wiederholen?
21
- destroy: Zerstöre Job
22
- discard: Auftrag verwerfen
23
- reschedule: Auftrag neu planen
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 Chargen gefunden.
32
+ no_batches_found: Keine Batches gefunden.
33
33
  cron_entries:
34
34
  actions:
35
- confirm_disable: Möchten Sie diesen Cron-Eintrag wirklich deaktivieren?
36
- confirm_enable: Möchten Sie diesen Cron-Eintrag wirklich aktivieren?
37
- confirm_enqueue: Möchten Sie diesen Cron-Eintrag wirklich in die Warteschlange stellen?
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-Eingabetaste
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: Weggeworfen
98
+ discarded: Verworfen
99
99
  handled: Abgewickelt
100
100
  interrupted: Unterbrochen
101
101
  retried: Wiederholt
102
- retry_stopped: Der Wiederholungsversuch wurde gestoppt
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: Sind Sie sicher, dass Sie den Job zerstören wollen?
111
- confirm_discard: Sind Sie sicher, dass Sie den Job verwerfen wollen?
112
- confirm_force_discard: Sind Sie sicher, dass Sie 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: Möchten Sie den Auftrag wirklich verschieben?
114
- confirm_retry: Möchten Sie den Job wirklich wiederholen?
115
- destroy: Arbeit vernichten
116
- discard: Auftrag verwerfen
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: Auftrag neu planen
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: Auftrag wurde verworfen
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 Berufe
134
+ older_jobs: Ältere Jobs
135
135
  reschedule:
136
- notice: Auftrag wurde verschoben
136
+ notice: Job wurde neu planen
137
137
  retry:
138
- notice: Auftrag wurde wiederholt
138
+ notice: Job wurde wiederholt
139
139
  show:
140
- jobs: Arbeitsplätze
140
+ jobs: Jobs
141
141
  table:
142
142
  actions:
143
143
  apply_to_all:
144
- one: Bewerben Sie sich auf alle 1 Stelle.
145
- other: Bewerben Sie sich auf alle %{count} Stellen.
146
- confirm_destroy_all: Möchten Sie die ausgewählten Jobs wirklich löschen?
147
- confirm_discard_all: Möchten Sie die ausgewählten Jobs wirklich verwerfen?
148
- confirm_reschedule_all: Möchten Sie die ausgewählten Jobs wirklich neu planen?
149
- confirm_retry_all: Möchten Sie die ausgewählten Jobs wirklich wiederholen?
150
- destroy_all: Zerstöre alle
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: Alles neu planen
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: Arbeitsplätze
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
- executions: Hinrichtungen
201
- job_class: Berufsklasse
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: Verfahren
210
- schedulers: Planer
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: Klar
224
- job_name: Berufsbezeichnung
225
- placeholder: Suchen Sie nach Klasse, Job-ID, Jobparametern und Fehlertext.
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: Licht
240
- theme: Thema
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: Ausrangiert
250
+ discarded: Verworfen
247
251
  queued: In der Warteschlange
248
252
  retried: Wiederholt
249
253
  running: Laufend
@@ -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
@@ -10,8 +10,8 @@ es:
10
10
  retry: Reintentar
11
11
  batches:
12
12
  index:
13
- older_batches: Batches anteriores
14
- title: Batches
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: Batched Jobs
29
+ batched_jobs: Tareas en lote
30
30
  callback_jobs: Callback Jobs
31
31
  table:
32
- no_batches_found: No hay batches.
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 este trabajo? El trabajo se marcará como descartado, pero el trabajo en ejecución no se detendrá; sin embargo, no se volverá a intentar en caso de falla.\n"
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 del trabajo
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: Application Trace
126
- full_trace: 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: Job ha sido descartado a la fuerza. Continuará ejecutándose pero no se volverá a intentar en caso de fallas.
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 trabajo
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: 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: Actuación
238
+ performance: Rendimiento
235
239
  processes: Procesos
236
240
  theme:
237
241
  auto: Auto
@@ -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é
@@ -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
@@ -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 が有効になっている
@@ -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이 활성화되어 있음
@@ -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