pgbus 0.19.4 → 0.20.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +9 -0
  3. data/README.md +97 -7
  4. data/Rakefile +6 -1
  5. data/app/controllers/pgbus/dashboard_controller.rb +2 -0
  6. data/app/controllers/pgbus/workflow_definitions_controller.rb +28 -0
  7. data/app/controllers/pgbus/workflows_controller.rb +197 -0
  8. data/app/frontend/pgbus/modules/charts.js +148 -4
  9. data/app/frontend/pgbus/modules/charts.min.js +1 -1
  10. data/app/frontend/pgbus/modules/charts.min.js.map +1 -1
  11. data/app/frontend/pgbus/style.css +1 -1
  12. data/app/helpers/pgbus/button_helper.rb +4 -2
  13. data/app/helpers/pgbus/workflow_insights_helper.rb +129 -0
  14. data/app/helpers/pgbus/workflows_helper.rb +165 -0
  15. data/app/models/pgbus/blocked_execution.rb +12 -0
  16. data/app/models/pgbus/uniqueness_key.rb +88 -3
  17. data/app/models/pgbus/workflow_entry.rb +172 -0
  18. data/app/models/pgbus/workflow_event.rb +43 -0
  19. data/app/models/pgbus/workflow_signal.rb +77 -0
  20. data/app/models/pgbus/workflow_step.rb +149 -0
  21. data/app/views/layouts/pgbus/application.html.erb +2 -0
  22. data/app/views/pgbus/dashboard/_stats_cards.html.erb +17 -0
  23. data/app/views/pgbus/workflows/_actions.html.erb +59 -0
  24. data/app/views/pgbus/workflows/_events_table.html.erb +24 -0
  25. data/app/views/pgbus/workflows/_filters.html.erb +29 -0
  26. data/app/views/pgbus/workflows/_signal_form.html.erb +31 -0
  27. data/app/views/pgbus/workflows/_signals_table.html.erb +40 -0
  28. data/app/views/pgbus/workflows/_status_filter.html.erb +12 -0
  29. data/app/views/pgbus/workflows/_steps_table.html.erb +79 -0
  30. data/app/views/pgbus/workflows/_timeline.html.erb +49 -0
  31. data/app/views/pgbus/workflows/_workflows_table.html.erb +59 -0
  32. data/app/views/pgbus/workflows/attention.html.erb +88 -0
  33. data/app/views/pgbus/workflows/definitions/_by_revision.html.erb +52 -0
  34. data/app/views/pgbus/workflows/definitions/_duration_table.html.erb +18 -0
  35. data/app/views/pgbus/workflows/definitions/_funnel.html.erb +49 -0
  36. data/app/views/pgbus/workflows/definitions/_pipeline.html.erb +16 -0
  37. data/app/views/pgbus/workflows/definitions/_step_card.html.erb +31 -0
  38. data/app/views/pgbus/workflows/definitions/_throughput_table.html.erb +32 -0
  39. data/app/views/pgbus/workflows/definitions/_window.html.erb +17 -0
  40. data/app/views/pgbus/workflows/definitions/index.html.erb +71 -0
  41. data/app/views/pgbus/workflows/definitions/not_found.html.erb +5 -0
  42. data/app/views/pgbus/workflows/definitions/show.html.erb +80 -0
  43. data/app/views/pgbus/workflows/index.html.erb +15 -0
  44. data/app/views/pgbus/workflows/not_found.html.erb +5 -0
  45. data/app/views/pgbus/workflows/show.html.erb +93 -0
  46. data/config/i18n-tasks.yml +6 -0
  47. data/config/locales/da.yml +445 -0
  48. data/config/locales/de.yml +445 -0
  49. data/config/locales/en.yml +445 -0
  50. data/config/locales/es.yml +445 -0
  51. data/config/locales/fi.yml +445 -0
  52. data/config/locales/fr.yml +445 -0
  53. data/config/locales/it.yml +445 -0
  54. data/config/locales/ja.yml +445 -0
  55. data/config/locales/nb.yml +445 -0
  56. data/config/locales/nl.yml +445 -0
  57. data/config/locales/pt.yml +445 -0
  58. data/config/locales/sv.yml +445 -0
  59. data/config/routes.rb +26 -0
  60. data/lib/generators/pgbus/add_workflow_signals_generator.rb +56 -0
  61. data/lib/generators/pgbus/add_workflows_generator.rb +54 -0
  62. data/lib/generators/pgbus/templates/add_workflow_signals.rb.erb +51 -0
  63. data/lib/generators/pgbus/templates/add_workflows.rb.erb +150 -0
  64. data/lib/generators/pgbus/templates/migration.rb.erb +127 -0
  65. data/lib/pgbus/active_job/adapter.rb +81 -3
  66. data/lib/pgbus/active_job/delivery.rb +63 -0
  67. data/lib/pgbus/active_job/executor.rb +20 -8
  68. data/lib/pgbus/concurrency/blocked_execution.rb +14 -6
  69. data/lib/pgbus/configuration/workflow_settings.rb +99 -0
  70. data/lib/pgbus/configuration.rb +64 -4
  71. data/lib/pgbus/dead_letter_header.rb +9 -1
  72. data/lib/pgbus/generators/migration_detector.rb +40 -0
  73. data/lib/pgbus/instrumentation.rb +33 -0
  74. data/lib/pgbus/integrations/appsignal/dashboard.json +157 -1
  75. data/lib/pgbus/integrations/appsignal/subscriber.rb +16 -1
  76. data/lib/pgbus/mcp/rack_app.rb +7 -2
  77. data/lib/pgbus/mcp/runner.rb +2 -1
  78. data/lib/pgbus/mcp/serialization.rb +25 -0
  79. data/lib/pgbus/mcp/server.rb +53 -10
  80. data/lib/pgbus/mcp/tools/deploy_tasks_tool.rb +1 -10
  81. data/lib/pgbus/mcp/tools/workflow_cancel_tool.rb +23 -0
  82. data/lib/pgbus/mcp/tools/workflow_definitions_tool.rb +36 -0
  83. data/lib/pgbus/mcp/tools/workflow_detail_tool.rb +38 -0
  84. data/lib/pgbus/mcp/tools/workflow_resume_at_tool.rb +32 -0
  85. data/lib/pgbus/mcp/tools/workflow_resume_tool.rb +24 -0
  86. data/lib/pgbus/mcp/tools/workflow_run_now_tool.rb +23 -0
  87. data/lib/pgbus/mcp/tools/workflow_signal_tool.rb +77 -0
  88. data/lib/pgbus/mcp/tools/workflow_skip_step_tool.rb +23 -0
  89. data/lib/pgbus/mcp/tools/workflow_stats_tool.rb +42 -0
  90. data/lib/pgbus/mcp/tools/workflows_attention_tool.rb +42 -0
  91. data/lib/pgbus/mcp/tools/workflows_tool.rb +60 -0
  92. data/lib/pgbus/mcp/workflow_insights_payload.rb +15 -0
  93. data/lib/pgbus/mcp/workflow_payloads.rb +53 -0
  94. data/lib/pgbus/mcp/write_tool.rb +134 -0
  95. data/lib/pgbus/mcp.rb +15 -0
  96. data/lib/pgbus/metrics/backends/statsd.rb +6 -0
  97. data/lib/pgbus/metrics/subscriber.rb +14 -1
  98. data/lib/pgbus/metrics/workflow_metrics.rb +75 -0
  99. data/lib/pgbus/process/consumer.rb +2 -1
  100. data/lib/pgbus/process/dispatcher.rb +39 -3
  101. data/lib/pgbus/process/worker.rb +10 -1
  102. data/lib/pgbus/recurring/schedule.rb +1 -1
  103. data/lib/pgbus/streams/presence.rb +65 -36
  104. data/lib/pgbus/uniqueness.rb +23 -6
  105. data/lib/pgbus/version.rb +1 -1
  106. data/lib/pgbus/web/data_source/workflow_actions.rb +109 -0
  107. data/lib/pgbus/web/data_source/workflow_insights.rb +99 -0
  108. data/lib/pgbus/web/data_source/workflow_list.rb +291 -0
  109. data/lib/pgbus/web/data_source.rb +126 -15
  110. data/lib/pgbus/web/workflow_action_plan.rb +62 -0
  111. data/lib/pgbus/web/workflow_insights_queries.rb +250 -0
  112. data/lib/pgbus/web/workflow_insights_report.rb +171 -0
  113. data/lib/pgbus/web/workflow_payload.rb +36 -0
  114. data/lib/pgbus/web/workflow_query.rb +82 -0
  115. data/lib/pgbus/web/workflow_state.rb +89 -0
  116. data/lib/pgbus/web/workflow_timeline.rb +130 -0
  117. data/lib/pgbus/web/workflow_window.rb +51 -0
  118. data/lib/pgbus/workflow/batch_finished_job.rb +21 -0
  119. data/lib/pgbus/workflow/dsl.rb +105 -0
  120. data/lib/pgbus/workflow/error_capture.rb +63 -0
  121. data/lib/pgbus/workflow/exception_policy.rb +170 -0
  122. data/lib/pgbus/workflow/fan_out.rb +157 -0
  123. data/lib/pgbus/workflow/fan_out_definition.rb +41 -0
  124. data/lib/pgbus/workflow/flow_control.rb +94 -0
  125. data/lib/pgbus/workflow/instance.rb +183 -0
  126. data/lib/pgbus/workflow/outside_verbs.rb +138 -0
  127. data/lib/pgbus/workflow/payload.rb +53 -0
  128. data/lib/pgbus/workflow/registry.rb +53 -0
  129. data/lib/pgbus/workflow/removed_step.rb +14 -0
  130. data/lib/pgbus/workflow/runner.rb +218 -0
  131. data/lib/pgbus/workflow/signal_matcher.rb +53 -0
  132. data/lib/pgbus/workflow/signals.rb +132 -0
  133. data/lib/pgbus/workflow/states.rb +119 -0
  134. data/lib/pgbus/workflow/step_context.rb +58 -0
  135. data/lib/pgbus/workflow/step_definition.rb +133 -0
  136. data/lib/pgbus/workflow/step_execution.rb +242 -0
  137. data/lib/pgbus/workflow/step_job.rb +28 -0
  138. data/lib/pgbus/workflow/step_outcome.rb +151 -0
  139. data/lib/pgbus/workflow/steps.rb +103 -0
  140. data/lib/pgbus/workflow/sweep.rb +156 -0
  141. data/lib/pgbus/workflow/test_helpers.rb +152 -0
  142. data/lib/pgbus/workflow/wait_timeout.rb +94 -0
  143. data/lib/pgbus/workflow/waiting.rb +82 -0
  144. data/lib/pgbus/workflow.rb +183 -0
  145. data/sig/pgbus/configuration.rbs +23 -0
  146. metadata +92 -1
@@ -140,6 +140,11 @@ fr:
140
140
  throughput: Débit
141
141
  throughput_detail: tâches/min sur les %{minutes} dernières min
142
142
  throughput_unavailable: nécessite les statistiques de jobs (rails g pgbus:add_job_stats)
143
+ workflows: Workflows
144
+ workflows_attention:
145
+ one: "%{count} requiert votre attention"
146
+ other: "%{count} requièrent votre attention"
147
+ workflows_detail: en cours (%{paused} en pause)
143
148
  verdict:
144
149
  links:
145
150
  dlq: Dead letters
@@ -723,6 +728,7 @@ fr:
723
728
  processes: Processus
724
729
  queues: Files d'attente
725
730
  recurring: Récurrent
731
+ workflows: Workflows
726
732
  return_to_app: Retour à l'application
727
733
  title: Tableau de bord Pgbus
728
734
  toggle_dark_mode: Basculer en mode sombre
@@ -1023,3 +1029,442 @@ fr:
1023
1029
  disabled: Tâche désactivée
1024
1030
  enabled: Tâche activée
1025
1031
  failed: Impossible de basculer la tâche
1032
+ workflow_insights:
1033
+ back_to_classes: Toutes les classes de workflow
1034
+ back_to_runs: Toutes les exécutions de workflow
1035
+ bad_request: 'Requête invalide : %{reason}'
1036
+ capped: 'Limité à workflow_retention (%{retention}) : les exécutions terminées et annulées plus anciennes sont supprimées.'
1037
+ few_samples:
1038
+ one: n=%{count}, peu d'échantillons
1039
+ other: n=%{count}, peu d'échantillons
1040
+ index:
1041
+ description: 'Comment chaque classe de workflow s''est comportée sur %{window} : les exécutions en cours, celles qui se sont terminées et la durée d''une exécution du début à la fin.'
1042
+ empty_hint: 'Définissez une sous-classe de Pgbus::Workflow et démarrez une exécution : YourWorkflow.start!(subject, **arguments).'
1043
+ empty_title: Aucune classe de workflow n'a encore tourné.
1044
+ headers:
1045
+ attention: À traiter
1046
+ cancelled: Annulées
1047
+ duration_p50: Durée p50
1048
+ duration_p95: Durée p95
1049
+ finished: Terminées
1050
+ ongoing: En cours
1051
+ paused: En pause
1052
+ workflow_class: Classe de workflow
1053
+ title: Analyse des workflows
1054
+ links:
1055
+ at_step: "%{status} exécutions à %{step}"
1056
+ attention: exécutions de %{workflow} à traiter
1057
+ cancelled: exécutions de %{workflow} annulées dans la fenêtre
1058
+ cancelled_bucket: exécutions annulées sur cette période
1059
+ finished: exécutions de %{workflow} terminées dans la fenêtre
1060
+ finished_bucket: exécutions terminées sur cette période
1061
+ ongoing: exécutions en cours de %{workflow}
1062
+ paused: exécutions en pause de %{workflow}
1063
+ started: exécutions de %{workflow} démarrées dans la fenêtre
1064
+ started_bucket: exécutions démarrées sur cette période
1065
+ not_found:
1066
+ hint: Aucune sous-classe de Pgbus::Workflow ni aucune exécution ne s'appelle %{workflow} (ou la lecture a échoué, voir le journal).
1067
+ title: Classe de workflow inconnue
1068
+ not_loaded: Définition non chargée
1069
+ not_loaded_hint: 'Cette classe ne se charge plus dans l''application : ses étapes viennent des lignes de ses exécutions, dans l''ordre où les exécutions les ont atteintes.'
1070
+ percentile: "%{name} %{value}"
1071
+ removed_in_flight:
1072
+ one: "%{count} exécution sur l'étape supprimée %{step}"
1073
+ other: "%{count} exécutions sur l'étape supprimée %{step}"
1074
+ show:
1075
+ by_revision:
1076
+ all_steps: Toutes les étapes
1077
+ caption: 'Les mêmes chiffres pour les cinq dernières révisions de l''application qui ont terminé une tentative dans la fenêtre, la plus récente d''abord : une régression après un déploiement apparaît comme une ligne.'
1078
+ empty: Aucune tentative dans cette fenêtre n'a enregistré de révision de l'application (config.app_revision).
1079
+ headers:
1080
+ attempts: Tentatives
1081
+ failed: Échouées
1082
+ reattempted: Relancées
1083
+ revision: Révision
1084
+ run_time: Durée d'exécution
1085
+ skipped: Ignorées
1086
+ step: Étape
1087
+ seen_html: vue de %{from} à %{to}
1088
+ title: Par révision de l'application
1089
+ worse: en hausse depuis %{rate} sur %{revision}
1090
+ charts:
1091
+ durations:
1092
+ between: "%{from}–%{to}"
1093
+ caption:
1094
+ one: Combien de temps a pris l'exécution (%{count}) terminée dans la fenêtre, du début à la fin.
1095
+ other: Combien de temps ont pris les %{count} exécutions terminées dans la fenêtre, du début à la fin.
1096
+ headers:
1097
+ range: Durée
1098
+ runs: Exécutions
1099
+ over: "%{from} ou plus"
1100
+ title: Durée de bout en bout
1101
+ under: moins de %{to}
1102
+ series:
1103
+ cancelled: Annulées
1104
+ finished: Terminées
1105
+ runs: Exécutions
1106
+ started: Démarrées
1107
+ throughput:
1108
+ caption: 'Exécutions démarrées, terminées et annulées par %{bucket} sur %{window} : %{started} démarrées, %{finished} terminées, %{cancelled} annulées.'
1109
+ headers:
1110
+ cancelled: Annulées
1111
+ finished: Terminées
1112
+ from: Depuis
1113
+ started: Démarrées
1114
+ title: Exécutions par %{bucket}
1115
+ description: 'Sur %{window} : où en sont ses exécutions, comment chaque étape se comporte et où les exécutions s''arrêtent.'
1116
+ funnel:
1117
+ caption:
1118
+ one: 'Sur l''exécution (%{count}) démarrée dans la fenêtre : combien ont atteint chaque étape, et où elle en est.'
1119
+ other: 'Sur les %{count} exécutions démarrées dans la fenêtre : combien ont atteint chaque étape, et où chacune en est.'
1120
+ empty: Aucune exécution n'a démarré dans cette fenêtre.
1121
+ headers:
1122
+ now_here: Maintenant à cette étape
1123
+ reached: Atteinte
1124
+ share: Des démarrées
1125
+ step: Étape
1126
+ here:
1127
+ cancelled:
1128
+ one: "%{count} annulée"
1129
+ other: "%{count} annulées"
1130
+ finished:
1131
+ one: "%{count} terminée"
1132
+ other: "%{count} terminées"
1133
+ paused:
1134
+ one: "%{count} en pause"
1135
+ other: "%{count} en pause"
1136
+ performing:
1137
+ one: "%{count} en exécution"
1138
+ other: "%{count} en exécution"
1139
+ ready:
1140
+ one: "%{count} planifiée"
1141
+ other: "%{count} planifiées"
1142
+ waiting:
1143
+ one: "%{count} en attente"
1144
+ other: "%{count} en attente"
1145
+ title: Entonnoir
1146
+ pipeline:
1147
+ attempts:
1148
+ one: "%{count} tentative"
1149
+ other: "%{count} tentatives"
1150
+ caption: 'Chaque étape dans l''ordre : les exécutions qui s''y trouvent maintenant, et comment se sont passées ses tentatives terminées dans la fenêtre.'
1151
+ empty: 'Aucune étape pour l''instant : aucune exécution de cette classe n''a d''étape dans la fenêtre et aucune n''est en cours.'
1152
+ failed: Échouées
1153
+ kinds:
1154
+ fan_out: Fan-out
1155
+ removed: Supprimée
1156
+ signal: Attend un signal
1157
+ undeclared: Absente de la définition
1158
+ live:
1159
+ paused: En pause
1160
+ performing: En exécution
1161
+ ready: Planifiées
1162
+ waiting: En attente
1163
+ now_label: Exécutions à cette étape maintenant
1164
+ pickup: Prise en charge
1165
+ reattempted: Relancées
1166
+ run_time: Durée d'exécution
1167
+ skipped: Ignorées
1168
+ step_link: Exécutions en cours à %{step}
1169
+ title: Pipeline
1170
+ window_label: Tentatives terminées dans la fenêtre
1171
+ summary:
1172
+ attention: À traiter
1173
+ cancelled: Annulées
1174
+ duration: Durée p50
1175
+ finished: Terminées
1176
+ ongoing: En cours
1177
+ started: Démarrées
1178
+ window_label: Fenêtre de temps
1179
+ windows:
1180
+ 1h: la dernière heure
1181
+ 24h: les dernières 24 heures
1182
+ 30d: les 30 derniers jours
1183
+ 7d: les 7 derniers jours
1184
+ workflows:
1185
+ actions:
1186
+ bulk_cancel: Tout annuler
1187
+ bulk_resume: Tout reprendre
1188
+ cancel: Annuler
1189
+ rerun: Relancer
1190
+ resume: Reprendre
1191
+ resume_at: Reprendre à l'étape
1192
+ run_now: Exécuter maintenant
1193
+ signal: Envoyer un signal
1194
+ skip_step: Ignorer l'étape
1195
+ attempt: tentative %{attempt}
1196
+ attention:
1197
+ at_step_html: à %{step}
1198
+ back: "← Workflows"
1199
+ cancel_all:
1200
+ one: Annuler %{count}
1201
+ other: Tout annuler (%{count})
1202
+ confirm:
1203
+ cancel:
1204
+ one: Annuler l'exécution bloquée à %{step} ?
1205
+ other: Annuler les %{count} exécutions bloquées à %{step} ?
1206
+ cancel_error:
1207
+ one: Annuler l'exécution bloquée à %{step} sur %{error} ?
1208
+ other: Annuler les %{count} exécutions bloquées à %{step} sur %{error} ?
1209
+ resume:
1210
+ one: Reprendre l'exécution en pause à %{step} ?
1211
+ other: Reprendre les %{count} exécutions en pause à %{step} ?
1212
+ resume_error:
1213
+ one: Reprendre l'exécution en pause à %{step} sur %{error} ?
1214
+ other: Reprendre les %{count} exécutions en pause à %{step} sur %{error} ?
1215
+ description: Exécutions en cours qui attendent une personne, regroupées selon ce qui les a arrêtées. Une fois la cause corrigée, agissez sur tout le groupe.
1216
+ empty_hint: Aucune exécution en cours n'est en pause, bloquée, en retard ou en attente au-delà de workflow_waiting_visibility_threshold.
1217
+ empty_title: Rien à traiter.
1218
+ first_seen_html: première fois %{time}
1219
+ headers:
1220
+ actions: Actions
1221
+ reason: Raison
1222
+ runs: Exécutions
1223
+ seen: Vu
1224
+ workflow: Workflow
1225
+ last_seen_html: dernière fois %{time}
1226
+ only_class_html: "%{workflow} uniquement."
1227
+ reasons:
1228
+ overdue: 'En retard : dû, mais pas pris en charge'
1229
+ paused_error: En pause sur une erreur
1230
+ paused_manual: Mis en pause manuellement
1231
+ stalled: 'Bloqué : son worker ne répond plus'
1232
+ waiting_overdue: Attente trop longue
1233
+ resume_all:
1234
+ one: Reprendre %{count}
1235
+ other: Tout reprendre (%{count})
1236
+ show_all: Afficher toutes les classes
1237
+ show_runs: Afficher les exécutions
1238
+ title: À traiter
1239
+ audit:
1240
+ by: "%{event} par %{actor}"
1241
+ empty: Aucun événement enregistré.
1242
+ headers:
1243
+ what: Ce qui s'est passé
1244
+ when: Quand
1245
+ title: Journal d'audit
1246
+ with_reason: "%{sentence} : %{reason}"
1247
+ with_step: "%{sentence} (%{step} #%{attempt})"
1248
+ bad_request: 'Requête invalide : %{reason}'
1249
+ confirm:
1250
+ cancel: Annuler ce workflow ? Ses étapes ouvertes sont annulées et il ne s'exécutera plus.
1251
+ rerun: Relancer ce workflow comme nouvelle exécution, avec le même sujet et les mêmes arguments ?
1252
+ resume: Reprendre ce workflow ?
1253
+ resume_at: Reprendre ce workflow à l'étape choisie ? Ses étapes ouvertes sont d'abord annulées.
1254
+ run_now: Exécuter maintenant l'étape planifiée au lieu d'attendre ?
1255
+ signal: Envoyer ce signal au workflow ?
1256
+ skip_step: Ignorer l'étape attendue par ce workflow et passer à la suivante ?
1257
+ events:
1258
+ cancelled: Annulé
1259
+ fan_out_finished: Fan-out terminé
1260
+ fan_out_opened: Fan-out ouvert
1261
+ finished: Terminé
1262
+ late_completion_ignored: Fin tardive ignorée
1263
+ paused: Mis en pause
1264
+ rerun: Relancé
1265
+ rescheduled: Replanifié
1266
+ resumed: Repris
1267
+ run_now: Exécuter maintenant
1268
+ signal_claimed: Signal pris en charge
1269
+ signal_received: Signal reçu
1270
+ stall_detected: Blocage détecté
1271
+ started: Démarré
1272
+ step_completed: Étape terminée
1273
+ step_failed: Étape échouée
1274
+ step_reattempted: Étape réessayée
1275
+ step_scheduled: Étape planifiée
1276
+ step_skipped: Étape ignorée
1277
+ step_started: Étape démarrée
1278
+ step_waiting: Étape en attente
1279
+ wait_timed_out: Attente expirée
1280
+ filters:
1281
+ apply: Appliquer les filtres
1282
+ clear: Effacer
1283
+ created_from: Créé à partir du
1284
+ created_to: Créé jusqu'au
1285
+ ended_from: Terminé depuis
1286
+ ended_to: Terminé jusqu'au
1287
+ error_class: Classe d'erreur
1288
+ step: Étape en cours
1289
+ subject_id: ID du sujet
1290
+ subject_type: Type de sujet
1291
+ workflow_class: Classe du workflow
1292
+ workflow_id: ID du workflow
1293
+ flash:
1294
+ bad_group: Ce groupe n'est pas valide.
1295
+ bulk_cancel:
1296
+ one: "%{count} annulé."
1297
+ other: "%{count} annulés."
1298
+ bulk_cancel_skipped: "%{count} annulés ; %{skipped} avaient déjà avancé."
1299
+ bulk_failed: "%{count} n'ont pas pu être modifiés : %{reason}"
1300
+ bulk_more: 'D''autres exécutions attendent peut-être : appuyez à nouveau pour les %{cap} suivantes.'
1301
+ bulk_resume:
1302
+ one: "%{count} repris."
1303
+ other: "%{count} repris."
1304
+ bulk_resume_skipped: "%{count} repris ; %{skipped} avaient déjà avancé."
1305
+ cancel: Workflow annulé.
1306
+ choose_step: Choisissez une étape de reprise.
1307
+ failed:
1308
+ not_allowed: 'Non effectué : l''exécution est maintenant %{status}.'
1309
+ not_found: Ce workflow n'existe plus.
1310
+ other: "%{action} a échoué : %{reason}"
1311
+ payload_not_object: 'Non envoyé : la charge utile n''est pas un objet JSON.'
1312
+ payload_too_large: 'Non envoyé : la charge utile dépasse %{limit} octets.'
1313
+ rerun: Nouvelle exécution démarrée.
1314
+ resume: Workflow repris.
1315
+ resume_at: Workflow repris à l'étape %{step}.
1316
+ run_now: L'étape planifiée s'exécute maintenant.
1317
+ signal: Signal %{name} envoyé.
1318
+ signal_duplicate: Le signal %{name} a déjà été remis avec cette clé ; rien de nouveau n'a été envoyé.
1319
+ signal_name_missing: 'Non envoyé : le signal doit avoir un nom.'
1320
+ skip_step: Étape ignorée.
1321
+ headers:
1322
+ current_step: Étape en cours
1323
+ last_activity: Dernière activité
1324
+ started: Démarré
1325
+ status: Statut
1326
+ subject: Sujet
1327
+ workflow: Workflow
1328
+ index:
1329
+ attention_link:
1330
+ one: À traiter (%{count})
1331
+ other: À traiter (%{count})
1332
+ description: 'Exécutions durables en plusieurs étapes : ce que fait chacune et ce qui se passe ensuite.'
1333
+ empty_hint: Choisissez un autre statut ou effacez les filtres. Une exécution démarre avec YourWorkflow.start!(subject, **arguments).
1334
+ empty_title: Aucun workflow ne correspond.
1335
+ insights_link: Analyse par classe
1336
+ status_label: Filtrer par statut
1337
+ title: Workflows
1338
+ next:
1339
+ cancelled_html: Annulé %{ago}.
1340
+ due_html: 'Prêt : %{step} était dû %{ago} et attend un worker.'
1341
+ finished_html: Terminé %{ago}.
1342
+ overdue_html: 'En retard : %{step} était dû %{ago} ; le balayage le renvoie.'
1343
+ paused_error_html: 'En pause sur %{step} : %{error} — reprenez ou annulez.'
1344
+ paused_manual_html: En pause sur %{step} — reprenez ou annulez.
1345
+ performing_attempt_html: Exécution de %{step} (tentative %{attempt}).
1346
+ performing_html: Exécution de %{step}.
1347
+ ready_html: 'Prêt : %{step} s''exécute ensuite.'
1348
+ scheduled_html: 'Planifié : %{step} s''exécute %{time}.'
1349
+ unknown_html: 'Statut : %{status}.'
1350
+ waiting_batch_html: En attente du lot %{batch} (%{done} travaux sur %{total} terminés).
1351
+ waiting_signal_html: En attente du signal %{signal} depuis %{ago}.
1352
+ waiting_signal_late_html: En attente du signal %{signal} depuis %{ago} (en retard depuis %{late}). Le prochain avis de retard part %{time}.
1353
+ waiting_signal_notify_html: En attente du signal %{signal} depuis %{ago}. Un avis de retard part %{time} et l'attente continue.
1354
+ waiting_signal_timeout_html: En attente du signal %{signal} depuis %{ago}. L'attente expire %{time}.
1355
+ waiting_step_html: En attente de %{step}.
1356
+ not_found:
1357
+ hint: Il est peut-être terminé et supprimé après workflow_retention, ou la base de données n'a pas pu être lue (voir le journal).
1358
+ title: Workflow introuvable
1359
+ outcomes:
1360
+ cancelled: annulé
1361
+ completed: terminé
1362
+ finished_early: a terminé l'exécution plus tôt
1363
+ paused: a mis l'exécution en pause
1364
+ reattempted: réessayé
1365
+ skipped: ignoré
1366
+ resume:
1367
+ carry_on: 'Reprendre : poursuivre avec %{step}'
1368
+ continue: 'Reprendre : continuer avec %{step}'
1369
+ finish: 'Reprendre : terminer l''exécution'
1370
+ resend: 'Reprendre : renvoyer %{step}'
1371
+ retry: 'Reprendre : réessayer %{step}'
1372
+ rewait: 'Reprendre : attendre à nouveau %{step}'
1373
+ show:
1374
+ actions: Actions
1375
+ arguments: Arguments
1376
+ back: "← Workflows"
1377
+ cancelled_at: Annulé
1378
+ class_missing: "%{workflow_class} n'est pas chargé dans ce processus : l'exécution peut encore être annulée, mais pas reprise."
1379
+ definition_outdated: 'Cette exécution a démarré avec une ancienne définition de %{workflow_class} : ses étapes ont changé depuis.'
1380
+ details: Détails
1381
+ finished_at: Terminé
1382
+ no_arguments: Cette exécution n'a pas d'arguments.
1383
+ paused_at: Mis en pause
1384
+ reason_hint: Consigné dans le journal d'audit, avec l'auteur de l'action.
1385
+ reason_label: Motif (facultatif)
1386
+ rerun_of: Relance de
1387
+ reruns: Relancé en
1388
+ resume_at_label: Étape de reprise
1389
+ signal:
1390
+ hint: Une étape qui l'attend se réveille aussitôt ; sinon il reste en attente jusqu'à ce qu'une étape le prenne.
1391
+ name: Nom du signal
1392
+ payload: Charge utile (JSON)
1393
+ send: Envoyer le signal
1394
+ title: Envoyer un signal
1395
+ signal_statuses:
1396
+ claimed: Pris en charge
1397
+ consumed: Consommé
1398
+ pending: En attente
1399
+ signals:
1400
+ empty: Aucun signal remis à cette exécution.
1401
+ headers:
1402
+ claimed: Pris en charge
1403
+ consumed: Consommé
1404
+ idempotency_key: Clé d'idempotence
1405
+ name: Signal
1406
+ received: Reçu
1407
+ status: Statut
1408
+ payload: Charge utile
1409
+ title: Signaux
1410
+ statuses:
1411
+ cancelled: Annulé
1412
+ finished: Terminé
1413
+ gone: disparu
1414
+ paused: En pause
1415
+ performing: En exécution
1416
+ ready: Prêt
1417
+ scheduled: Planifié
1418
+ waiting: En attente
1419
+ step_statuses:
1420
+ cancelled: Annulée
1421
+ completed: Terminée
1422
+ failed: Échouée
1423
+ in_progress: En cours
1424
+ scheduled: Planifiée
1425
+ skipped: Ignorée
1426
+ waiting: En attente
1427
+ steps:
1428
+ batch: lot %{batch}
1429
+ caused_by: Causé par %{error}
1430
+ empty: Aucune tentative pour l'instant.
1431
+ headers:
1432
+ finished: Terminée
1433
+ queued: En file
1434
+ ran: Exécution
1435
+ scheduled: Planifiée
1436
+ started: Démarrée
1437
+ status: Statut
1438
+ step: Étape
1439
+ waited: Attente
1440
+ worker: Worker
1441
+ revision: révision %{revision}
1442
+ show_backtrace: Afficher la trace
1443
+ title: Tentatives
1444
+ waiting_for: puis attente de %{duration}
1445
+ waits_for_html: attend %{signal}
1446
+ tabs:
1447
+ all: Tous
1448
+ cancelled: Annulés
1449
+ finished: Terminés
1450
+ ongoing: En cours
1451
+ paused: En pause
1452
+ performing: En exécution
1453
+ ready: Prêts
1454
+ waiting: En attente
1455
+ timeline:
1456
+ caption: 'Chaque tentative, la plus ancienne en haut : attente (son délai), en file (due, pas encore prise), exécution (colorée selon son issue) et en attente (d''un signal ou de son lot), avec les pauses sur leur propre ligne. Le tableau des tentatives ci-dessous donne les mêmes durées. Une ligne pointillée marque chaque fois qu''une attente a dépassé son échéance.'
1457
+ empty: Aucune tentative pour l'instant.
1458
+ paused_period_html: En pause à %{from} pendant %{duration}
1459
+ paused_row: En pause
1460
+ series:
1461
+ paused: En pause
1462
+ queued: En file
1463
+ ran_cancelled: Exécuté, annulé
1464
+ ran_failed: Exécuté, échoué
1465
+ ran_ok: Exécuté
1466
+ ran_open: En cours
1467
+ waited: Attendu
1468
+ waiting: En attente
1469
+ title: Chronologie
1470
+ wait_timeout_html: 'L''attente de %{step} a dépassé son échéance à %{time} (on_timeout: %{action}).'