sidekiq-cron 2.0.0.rc1 → 2.0.0

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.
@@ -1,18 +1,22 @@
1
1
  ja:
2
- Job: ジョブ
2
+ AreYouSureDeleteCronJob: 本当に%{job}のcronジョブを削除しますか?
3
+ AreYouSureDeleteCronJobs: 本当にすべてのcronジョブを削除しますか?
4
+ AreYouSureEnqueueCronJob: %{job} の クロン ジョブをキューに入れてもよろしいですか?
5
+ AreYouSureEnqueueCronJobs: すべての クロン ジョブをキューに入れてもよろしいですか?
3
6
  Cron: Cron
4
7
  CronJobs: Cronジョブ
5
- EnqueueNow: すぐにキューに入れる
6
- EnableAll: すべて有効にする
8
+ CronString: Cron
9
+ DeleteAll: すべて削除
10
+ Description: 説明
11
+ Disable: 無効にする
7
12
  DisableAll: すべて無効にする
13
+ Enable: 有効にする
14
+ EnableAll: すべて有効にする
8
15
  EnqueueAll: すべてキューに入れる
9
- DeleteAll: すべて削除
10
- 'Cron string': Cron
11
- AreYouSureDeleteCronJobs: 本当にすべてのcronジョブを削除しますか?
12
- AreYouSureDeleteCronJob: 本当に%{job}のcronジョブを削除しますか?
16
+ EnqueueNow: すぐにキューに入れる
17
+ Job: ジョブ
18
+ LastEnqueued: 最後のキュー
13
19
  NoCronJobsWereFound: Cronジョブが見つかりませんでした
14
- Enable: 有効にする
15
- Disable: 無効にする
16
- 'Last enqueued': 最後のキュー
20
+ NoHistoryWereFound: 履歴が見つかりませんでした
17
21
  disabled: 無効
18
22
  enabled: 有効
@@ -1,22 +1,22 @@
1
1
  pt:
2
- Job: Tarefa
2
+ AreYouSureDeleteCronJob: Tem certeza de que deseja excluir a tarefa %{job}?
3
+ AreYouSureDeleteCronJobs: Tem certeza de que deseja excluir TODOS as tarefas?
4
+ AreYouSureEnqueueCronJob: Tem certeza de que deseja enfileirar a tarefa %{job}?
5
+ AreYouSureEnqueueCronJobs: Tem certeza de que deseja enfileirar TODOS as tarefas?
3
6
  Cron: Cron
4
7
  CronJobs: Tarefas do Cron
5
- EnqueueNow: Enfileirar agora
6
- EnableAll: Habilitar todos
8
+ CronString: Cron
9
+ DeleteAll: Excluir todos
10
+ Description: Descrição
11
+ Disable: Desabilitar
7
12
  DisableAll: Desabilitar todos
13
+ Enable: Habilitar
14
+ EnableAll: Habilitar todos
8
15
  EnqueueAll: Enfileirar todos
9
- DeleteAll: Excluir todos
10
- 'Cron string': Cron
11
- AreYouSureEnqueueCronJobs: Tem certeza de que deseja enfileirar TODOS as tarefas?
12
- AreYouSureEnqueueCronJob: Tem certeza de que deseja enfileirar a tarefa %{job}?
13
- AreYouSureDeleteCronJobs: Tem certeza de que deseja excluir TODOS as tarefas?
14
- AreYouSureDeleteCronJob: Tem certeza de que deseja excluir a tarefa %{job}?
16
+ EnqueueNow: Enfileirar agora
17
+ Job: Tarefa
18
+ LastEnqueued: Último enfileirado
15
19
  NoCronJobsWereFound: Nenhuma tarefa foi encontrada
16
- Enable: Habilitar
17
- Disable: Desabilitar
18
- 'Last enqueued': Último enfileirado
20
+ NoHistoryWereFound: Nenhum histórico foi encontrado
19
21
  disabled: desabilitado
20
22
  enabled: habilitado
21
- NoHistoryWereFound: Nenhum histórico foi encontrado
22
- Description: Descrição
@@ -1,14 +1,22 @@
1
1
  ru:
2
- Job: Задача
2
+ AreYouSureDeleteCronJob: Вы действительно хотите удалить задачу «%{job}»?
3
+ AreYouSureDeleteCronJobs: Вы уверены, что хотите удалить ВСЕ cron-задачи?
4
+ AreYouSureEnqueueCronJob: Вы уверены, что хотите добавить в очередь cron-задачу %{job}?
5
+ AreYouSureEnqueueCronJobs: Вы уверены, что хотите добавить в очередь ВСЕ cron-задачи?
3
6
  Cron: Cron
4
7
  CronJobs: Периодические задачи
5
- Name: Название
6
- 'Cron string': Периодичность (синтаксис Cron)
8
+ CronString: Периодичность (синтаксис Cron)
9
+ DeleteAll: Удалить все
10
+ Description: Описание
11
+ Disable: Отключить
12
+ DisableAll: Отключить все
13
+ Enable: Включить
14
+ EnableAll: Включить все
15
+ EnqueueAll: Добавить все в очередь
7
16
  EnqueueNow: Запустить
8
- AreYouSureDeleteCronJob: Вы действительно хотите удалить задачу «%{job}»?
17
+ Job: Задача
18
+ LastEnqueued: Последний запуск
9
19
  NoCronJobsWereFound: Не найдено периодических задач
10
- Enable: Включить
11
- Disable: Отключить
12
- 'Last enqueued': Последний запуск
20
+ NoHistoryWereFound: История не найдена
13
21
  disabled: отключено
14
22
  enabled: включено
@@ -1,19 +1,22 @@
1
1
  zh-CN:
2
- Job: 任务
2
+ AreYouSureDeleteCronJob: 你确定删除定时任务(%{job})吗?
3
+ AreYouSureDeleteCronJobs: 你确定删除所有的定时任务吗?
4
+ AreYouSureEnqueueCronJob: 您确定要将 %{job} 的 定时任务 任务加入队列吗?
5
+ AreYouSureEnqueueCronJobs: 您确定要将所有 定时任务 任务加入队列吗?
3
6
  Cron: 定时任务
4
7
  CronJobs: 定时任务列表
5
- EnqueueNow: 立刻执行
6
- EnableAll: 启用所有
8
+ CronString: 定时策略
9
+ DeleteAll: 删除所有
10
+ Description: 描述
11
+ Disable: 禁用
7
12
  DisableAll: 禁用所有
13
+ Enable: 启用
14
+ EnableAll: 启用所有
8
15
  EnqueueAll: 执行所有
9
- DeleteAll: 删除所有
10
- 'Cron string': 定时策略
11
- AreYouSureDeleteCronJobs: 你确定删除所有的定时任务吗?
12
- AreYouSureDeleteCronJob: 你确定删除定时任务(%{job})吗?
16
+ EnqueueNow: 立刻执行
17
+ Job: 任务
18
+ LastEnqueued: 放入队列时间
13
19
  NoCronJobsWereFound: 没有定时任务
14
- Enable: 启用
15
- Disable: 禁用
16
- 'Last enqueued': 放入队列时间
20
+ NoHistoryWereFound: 未找到历史记录
17
21
  disabled: 已禁用
18
22
  enabled: 已启用
19
-
@@ -1,5 +1,3 @@
1
- require 'sidekiq'
2
-
3
1
  module Sidekiq
4
2
  module Cron
5
3
  class Namespace
@@ -1,20 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'sidekiq'
4
- require 'sidekiq/cron'
5
3
  require 'sidekiq/scheduled'
6
- require 'sidekiq/options'
7
4
 
8
5
  module Sidekiq
9
6
  module Cron
10
7
  # The Poller checks Redis every N seconds for scheduled cron jobs.
11
8
  class Poller < Sidekiq::Scheduled::Poller
12
9
  def initialize(config = nil)
13
- if Gem::Version.new(Sidekiq::VERSION) < Gem::Version.new('6.5.0')
14
- # Old version of Sidekiq does not accept a config argument.
15
- @config = config
16
- end
17
-
18
10
  super
19
11
  end
20
12
 
@@ -40,7 +32,7 @@ module Sidekiq
40
32
  private
41
33
 
42
34
  def enqueue_job(job, time = Time.now.utc)
43
- job.test_and_enque_for_time! time if job && job.valid?
35
+ job.test_and_enqueue_for_time! time if job && job.valid?
44
36
  rescue => ex
45
37
  # Problem somewhere in one job.
46
38
  Sidekiq.logger.error "CRON JOB: #{ex.message}"
@@ -1,9 +1,5 @@
1
- require 'sidekiq'
2
- require 'sidekiq/cron/job'
3
- require 'sidekiq/options'
4
-
5
1
  Sidekiq.configure_server do |config|
6
- schedule_file = Sidekiq::Options[:cron_schedule_file] || 'config/schedule.yml'
2
+ schedule_file = Sidekiq::Cron.configuration.cron_schedule_file
7
3
 
8
4
  if File.exist?(schedule_file)
9
5
  config.on(:startup) do
@@ -1,8 +1,7 @@
1
- # https://github.com/rails/rails/blob/352865d0f835c24daa9a2e9863dcc9dde9e5371a/activesupport/lib/active_support/inflector/methods.rb#L270
2
-
3
1
  module Sidekiq
4
2
  module Cron
5
3
  module Support
4
+ # Inspired by Active Support Inflector
6
5
  def self.constantize(camel_cased_word)
7
6
  names = camel_cased_word.split("::".freeze)
8
7
 
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Sidekiq
4
4
  module Cron
5
- VERSION = "2.0.0.rc1"
5
+ VERSION = "2.0.0"
6
6
  end
7
7
  end
@@ -5,23 +5,23 @@
5
5
  <small><%= @current_namespace %></small>
6
6
  </h3>
7
7
  </div>
8
- <div class='col-sm-7 pull-right' style="margin-top: 20px; margin-bottom: 10px;">
8
+ <div class='col-sm-7 pull-right h2'>
9
9
  <% if @cron_jobs.size > 0 %>
10
10
  <form action="<%= root_path %>cron/namespaces/<%= @current_namespace %>/all/delete" method="post" class="pull-right">
11
- <%= csrf_tag if respond_to?(:csrf_tag) %>
11
+ <%= csrf_tag %>
12
12
  <input class="btn btn-danger" type="submit" name="delete" value="<%= t('DeleteAll') %>" data-confirm="<%= t('AreYouSureDeleteCronJobs') %>" />
13
13
  </form>
14
14
  <form action="<%= root_path %>cron/namespaces/<%= @current_namespace %>/all/disable" method="post" class="pull-right">
15
- <%= csrf_tag if respond_to?(:csrf_tag) %>
16
- <input class="btn btn-warn" type="submit" name="enque" value="<%= t('DisableAll') %>" />
15
+ <%= csrf_tag %>
16
+ <input class="btn btn-warn" type="submit" name="enqueue" value="<%= t('DisableAll') %>" />
17
17
  </form>
18
18
  <form action="<%= root_path %>cron/namespaces/<%= @current_namespace %>/all/enable" method="post" class="pull-right">
19
- <%= csrf_tag if respond_to?(:csrf_tag) %>
20
- <input class="btn btn-warn" type="submit" name="enque" value="<%= t('EnableAll') %>" />
19
+ <%= csrf_tag %>
20
+ <input class="btn btn-warn" type="submit" name="enqueue" value="<%= t('EnableAll') %>" />
21
21
  </form>
22
- <form action="<%= root_path %>cron/namespaces/<%= @current_namespace %>/all/enque" method="post" class="pull-right">
23
- <%= csrf_tag if respond_to?(:csrf_tag) %>
24
- <input class="btn btn-warn" type="submit" name="enque" value="<%= t('EnqueueAll') %>" data-confirm="<%= t('AreYouSureEnqueueCronJobs') %>" />
22
+ <form action="<%= root_path %>cron/namespaces/<%= @current_namespace %>/all/enqueue" method="post" class="pull-right">
23
+ <%= csrf_tag %>
24
+ <input class="btn btn-warn" type="submit" name="enqueue" value="<%= t('EnqueueAll') %>" data-confirm="<%= t('AreYouSureEnqueueCronJobs') %>" />
25
25
  </form>
26
26
  <% end %>
27
27
  </div>
@@ -31,7 +31,7 @@
31
31
  <div class='row'>
32
32
  <div class="col-sm-12 summary_bar">
33
33
  <ul class="list-unstyled summary row">
34
- <% @namespaces.sort_by { |namespace| namespace[:name] } .each do |namespace| %>
34
+ <% Sidekiq::Cron::Namespace.all_with_count.sort_by { |namespace| namespace[:name] }.each do |namespace| %>
35
35
  <li class="col-sm-1">
36
36
  <a href="<%= root_path %>cron/namespaces/<%= namespace[:name] %>">
37
37
  <span class="count"><%= namespace[:count] %></span>
@@ -47,63 +47,59 @@
47
47
  <% if @cron_jobs.size > 0 %>
48
48
  <table class="table table-hover table-bordered table-striped table-white">
49
49
  <thead>
50
+ <tr>
50
51
  <th><%= t('Status') %></th>
51
- <th><%= t('Name') %></th>
52
- <th><%= t('Cron string') %></th>
53
- <th><%= t('Last enqueued') %></th>
54
- <th width="180"><%= t('Actions')%></th>
52
+ <th width="50%"><%= t('Name') %></th>
53
+ <th><%= t('CronString') %></th>
54
+ <th><%= t('LastEnqueued') %></th>
55
+ <th width="180"><%= t('Actions') %></th>
56
+ </tr>
55
57
  </thead>
56
58
 
57
59
  <tbody>
58
- <% @cron_jobs.sort{|a,b| a.sort_name <=> b.sort_name }.each_with_index do |job, index| %>
59
- <% style = "#{job.status == 'disabled' ? "background: #ecc; color: #585454;": ""}" %>
60
+ <% @cron_jobs.sort{ |a,b| a.sort_name <=> b.sort_name }.each do |job| %>
61
+ <% klass = (job.status == 'disabled') ? 'bg-danger text-muted' : '' %>
62
+ <% escaped_job_name = CGI.escape(job.name).gsub('+', '%20') %>
60
63
  <tr>
61
- <td style="<%= style %>"><%= t job.status %></td>
62
- <td style="<%= style %>">
63
- <a href="<%= root_path %>cron/namespaces/<%= @current_namespace %>/jobs/<%= CGI.escape(job.name).gsub('+', '%20') %>" title="<%= job.description %>">
64
- <b style="<%= style %>"><%= job.name %></b>
64
+ <td class="<%= klass %>"><%= t job.status %></td>
65
+ <td class="<%= klass %>">
66
+ <a href="<%= root_path %>cron/namespaces/<%= job.namespace %>/jobs/<%= escaped_job_name %>" title="<%= job.description %>">
67
+ <b class="<%= klass %>"><%= job.name %></b>
65
68
  </a>
66
- <hr style="margin:3px;border:0;">
67
- <small>
69
+ <br/>
68
70
  <% if job.message and job.message.to_s.size > 100 %>
69
- <% if Gem::Version.new(Sidekiq::VERSION) >= Gem::Version.new("6.3.0") %>
70
- <button data-toggle="job_<%= index %>" class="btn btn-warn btn-xs"><%= t('ShowAll')%></button>
71
- <div class="toggle" id="job_<%= index %>" style="display: inline;"><%= job.message[0..100] + "... " %></div>
72
- <div class="toggle" id="job_<%= index %>_full" style="display: none;"><%= job.message %></div>
73
- <% else %>
74
- <button data-toggle="collapse" data-target=".worker_<%= index %>" class="btn btn-warn btn-xs"><%= t('ShowAll')%></button>
75
- <div class="toggle worker_<%= index %>" style="display: inline;"><%= job.message[0..100] + "... " %></div>
76
- <div class="toggle worker_<%= index %>" style="display: none;"><%= job.message %></div>
77
- <% end %>
71
+ <details>
72
+ <summary class="btn btn-warn btn-xs">Show message</summary>
73
+ <p><small><%= job.message %></small></p>
74
+ </details>
78
75
  <% else %>
79
- <%= job.message %>
76
+ <small><%= job.message %></small>
80
77
  <% end %>
81
- </small>
82
78
  </td>
83
- <td style="<%= style %>"><b><%= job.human_cron %><br/><small><%= job.cron.gsub(" ", "&nbsp;") %></small></b></td>
84
- <td style="<%= style %>"><%= job.last_enqueue_time ? relative_time(job.last_enqueue_time) : "-" %></td>
85
- <td style="<%= style %>">
79
+ <td class="<%= klass %>"><b><%= job.human_cron %><br/><small><%= job.cron.gsub(" ", "&nbsp;") %></small></b></td>
80
+ <td class="<%= klass %>"><%= job.last_enqueue_time ? relative_time(job.last_enqueue_time) : "-" %></td>
81
+ <td class="<%= klass %>">
86
82
  <% if job.status == 'enabled' %>
87
- <form action="<%= root_path %>cron/namespaces/<%= @current_namespace %>/jobs/<%= CGI.escape(job.name).gsub('+', '%20') %>/enque" method="post">
88
- <%= csrf_tag if respond_to?(:csrf_tag) %>
89
- <input class='btn btn-warn btn-xs pull-left' type="submit" name="enque" value="<%= t('EnqueueNow') %>" data-confirm="<%= t('AreYouSureEnqueueCronJob', :job => job.name) %>"/>
83
+ <form action="<%= root_path %>cron/namespaces/<%= job.namespace %>/jobs/<%= escaped_job_name %>/enqueue" method="post">
84
+ <%= csrf_tag %>
85
+ <input class='btn btn-warn btn-xs pull-left' type="submit" name="enqueue" value="<%= t('EnqueueNow') %>" data-confirm="<%= t('AreYouSureEnqueueCronJob', :job => job.name) %>"/>
90
86
  </form>
91
- <form action="<%= root_path %>cron/namespaces/<%= @current_namespace %>/jobs/<%= CGI.escape(job.name).gsub('+', '%20') %>/disable" method="post">
92
- <%= csrf_tag if respond_to?(:csrf_tag) %>
87
+ <form action="<%= root_path %>cron/namespaces/<%= job.namespace %>/jobs/<%= escaped_job_name %>/disable" method="post">
88
+ <%= csrf_tag %>
93
89
  <input class='btn btn-warn btn-xs pull-left' type="submit" name="disable" value="<%= t('Disable') %>"/>
94
90
  </form>
95
91
  <% else %>
96
- <form action="<%= root_path %>cron/namespaces/<%= @current_namespace %>/jobs/<%= CGI.escape(job.name).gsub('+', '%20') %>/enque" method="post">
97
- <%= csrf_tag if respond_to?(:csrf_tag) %>
98
- <input class='btn btn-warn btn-xs pull-left' type="submit" name="enque" value="<%= t('EnqueueNow') %>"/>
92
+ <form action="<%= root_path %>cron/namespaces/<%= job.namespace %>/jobs/<%= escaped_job_name %>/enqueue" method="post">
93
+ <%= csrf_tag %>
94
+ <input class='btn btn-warn btn-xs pull-left' type="submit" name="enqueue" value="<%= t('EnqueueNow') %>" data-confirm="<%= t('AreYouSureEnqueueCronJob', :job => job.name) %>"/>
99
95
  </form>
100
- <form action="<%= root_path %>cron/namespaces/<%= @current_namespace %>/jobs/<%= CGI.escape(job.name).gsub('+', '%20') %>/enable" method="post">
101
- <%= csrf_tag if respond_to?(:csrf_tag) %>
96
+ <form action="<%= root_path %>cron/namespaces/<%= job.namespace %>/jobs/<%= escaped_job_name %>/enable" method="post">
97
+ <%= csrf_tag %>
102
98
  <input class='btn btn-warn btn-xs pull-left' type="submit" name="enable" value="<%= t('Enable') %>"/>
103
99
  </form>
104
- <form action="<%= root_path %>cron/namespaces/<%= @current_namespace %>/jobs/<%= CGI.escape(job.name).gsub('+', '%20') %>/delete" method="post">
105
- <%= csrf_tag if respond_to?(:csrf_tag) %>
106
- <input class='btn btn-xs btn-danger pull-left' type="submit" name="delete" value="<%= t('Delete') %>" data-confirm="<%= t('AreYouSureDeleteCronJob', :job => job.name) %>"/>
100
+ <form action="<%= root_path %>cron/namespaces/<%= job.namespace %>/jobs/<%= escaped_job_name %>/delete" method="post">
101
+ <%= csrf_tag %>
102
+ <input class='btn btn-xs btn-danger pull-left help-block' type="submit" name="delete" value="<%= t('Delete') %>" data-confirm="<%= t('AreYouSureDeleteCronJob', :job => job.name) %>"/>
107
103
  </form>
108
104
  <% end %>
109
105
  </td>
@@ -5,25 +5,25 @@
5
5
  <small><%= @job.name %></small>
6
6
  </h3>
7
7
  </div>
8
- <div class="span col-sm-7 pull-right" style="margin-top: 20px; margin-bottom: 10px;">
8
+ <div class="span col-sm-7 pull-right h2">
9
9
  <% cron_job_path = "#{root_path}cron/namespaces/#{@current_namespace}/jobs/#{CGI.escape(@job.name).gsub('+', '%20')}" %>
10
- <form action="<%= cron_job_path %>/enque?redirect=<%= cron_job_path %>" class="pull-right" method="post">
11
- <%= csrf_tag if respond_to?(:csrf_tag) %>
12
- <input class="btn btn-warn pull-left" name="enque" type="submit" value="<%= t('EnqueueNow') %>" data-confirm="<%= t('AreYouSureEnqueueCronJob', :job => @job.name) %>" />
10
+ <form action="<%= cron_job_path %>/enqueue?redirect=<%= cron_job_path %>" class="pull-right" method="post">
11
+ <%= csrf_tag %>
12
+ <input class="btn btn-warn pull-left" name="enqueue" type="submit" value="<%= t('EnqueueNow') %>" data-confirm="<%= t('AreYouSureEnqueueCronJob', :job => @job.name) %>" />
13
13
  </form>
14
14
  <% if @job.status == 'enabled' %>
15
- <form action="<%= cron_job_path %>/disable?redirect=<%= cron_job_path %>" method="post">
16
- <%= csrf_tag if respond_to?(:csrf_tag) %>
15
+ <form action="<%= cron_job_path %>/disable?redirect=<%= cron_job_path %>" class="pull-right" method="post">
16
+ <%= csrf_tag %>
17
17
  <input class="btn btn-warn pull-left" name="disable" type="submit" value="<%= t('Disable') %>" />
18
18
  </form>
19
19
  <% else %>
20
- <form action="<%= cron_job_path %>/enable?redirect=<%= cron_job_path %>" method="post">
21
- <%= csrf_tag if respond_to?(:csrf_tag) %>
20
+ <form action="<%= cron_job_path %>/enable?redirect=<%= cron_job_path %>" class="pull-right" method="post">
21
+ <%= csrf_tag %>
22
22
  <input class="btn btn-warn pull-left" name="enable" type="submit" value="<%= t('Enable') %>" />
23
23
  </form>
24
- <form action="<%= cron_job_path %>/delete" method="post">
25
- <%= csrf_tag if respond_to?(:csrf_tag) %>
26
- <input class="btn btn-danger" data-confirm="<%= t('AreYouSureDeleteCronJob', :job => @job.name) %>" name="delete" type="submit" value="<%= t('Delete') %>" />
24
+ <form action="<%= cron_job_path %>/delete" class="pull-right" method="post">
25
+ <%= csrf_tag %>
26
+ <input class="btn btn-danger pull-left" data-confirm="<%= t('AreYouSureDeleteCronJob', :job => @job.name) %>" name="delete" type="submit" value="<%= t('Delete') %>" />
27
27
  </form>
28
28
  <% end %>
29
29
  </div>
@@ -1,7 +1,17 @@
1
1
  require "sidekiq/cron/web_extension"
2
2
  require "sidekiq/cron/job"
3
+ require "sidekiq/cron/namespace"
3
4
 
4
5
  if defined?(Sidekiq::Web)
5
- Sidekiq::Web.register Sidekiq::Cron::WebExtension
6
- Sidekiq::Web.tabs["Cron"] = "cron"
6
+ if Gem::Version.new(Sidekiq::VERSION) >= Gem::Version.new('7.3.0')
7
+ Sidekiq::Web.register(
8
+ Sidekiq::Cron::WebExtension, # Class which contains the HTTP actions, required
9
+ name: "cron", # the name of the extension, used to namespace assets
10
+ tab: "Cron", # labels(s) of the UI tabs
11
+ index: "cron", # index route(s) for each tab
12
+ )
13
+ else
14
+ Sidekiq::Web.register Sidekiq::Cron::WebExtension
15
+ Sidekiq::Web.tabs["Cron"] = "cron"
16
+ end
7
17
  end
@@ -4,68 +4,71 @@ module Sidekiq
4
4
  def self.registered(app)
5
5
  app.settings.locales << File.join(File.expand_path("..", __FILE__), "locales")
6
6
 
7
- # Index page of cron jobs.
8
- app.get '/cron' do
9
- view_path = File.join(File.expand_path("..", __FILE__), "views")
7
+ app.helpers do
8
+ # This method constructs the URL for the cron jobs page within the specified namespace.
9
+ def namespace_redirect_path
10
+ "#{root_path}cron/namespaces/#{route_params[:namespace]}"
11
+ end
10
12
 
11
- @current_namespace = 'default'
13
+ def redirect_to_previous_or_default
14
+ redirect params['redirect'] || namespace_redirect_path
15
+ end
12
16
 
13
- @namespaces = Sidekiq::Cron::Namespace.all_with_count
17
+ def render_erb(view)
18
+ views_path = File.join(File.expand_path("..", __FILE__), "views")
19
+ erb(File.read(File.join(views_path, "#{view}.erb")))
20
+ end
21
+ end
14
22
 
15
- # Not passing namespace takes all the jobs from the default one.
16
- @cron_jobs = Sidekiq::Cron::Job.all
23
+ # Index page.
24
+ app.get '/cron' do
25
+ @current_namespace = 'default'
26
+ @cron_jobs = Sidekiq::Cron::Job.all(@current_namespace)
17
27
 
18
- render(:erb, File.read(File.join(view_path, "cron.erb")))
28
+ render_erb(:cron)
19
29
  end
20
30
 
31
+ # Detail page for a specific namespace.
21
32
  app.get '/cron/namespaces/:name' do
22
- view_path = File.join(File.expand_path("..", __FILE__), "views")
23
-
24
33
  @current_namespace = route_params[:name]
25
-
26
- @namespaces = Sidekiq::Cron::Namespace.all_with_count
27
-
28
34
  @cron_jobs = Sidekiq::Cron::Job.all(@current_namespace)
29
35
 
30
- render(:erb, File.read(File.join(view_path, "cron.erb")))
36
+ render_erb(:cron)
31
37
  end
32
38
 
33
39
  # Display job detail + jid history.
34
40
  app.get '/cron/namespaces/:namespace/jobs/:name' do
35
- view_path = File.join(File.expand_path("..", __FILE__), "views")
36
-
37
41
  @current_namespace = route_params[:namespace]
38
- @job_name = route_params[:name]
39
-
40
- @namespaces = Sidekiq::Cron::Namespace.all_with_count
41
-
42
- @job = Sidekiq::Cron::Job.find(@job_name, @current_namespace)
42
+ @job = Sidekiq::Cron::Job.find(route_params[:name], @current_namespace)
43
43
 
44
44
  if @job
45
- render(:erb, File.read(File.join(view_path, "cron_show.erb")))
45
+ render_erb(:cron_show)
46
46
  else
47
- redirect "#{root_path}cron/namespaces/#{route_params[:namespace]}"
47
+ redirect namespace_redirect_path
48
48
  end
49
49
  end
50
50
 
51
- # Enque all cron jobs.
52
- app.post '/cron/namespaces/:namespace/all/enque' do
53
- Sidekiq::Cron::Job.all(route_params[:namespace]).each(&:enque!)
54
- redirect params['redirect'] || "#{root_path}cron/namespaces/#{route_params[:namespace]}"
51
+ # Enqueue all cron jobs.
52
+ app.post '/cron/namespaces/:namespace/all/enqueue' do
53
+ Sidekiq::Cron::Job.all(route_params[:namespace]).each(&:enqueue!)
54
+
55
+ redirect_to_previous_or_default
55
56
  end
56
57
 
57
58
  # Enqueue cron job.
58
- app.post '/cron/namespaces/:namespace/jobs/:name/enque' do
59
+ app.post '/cron/namespaces/:namespace/jobs/:name/enqueue' do
59
60
  if job = Sidekiq::Cron::Job.find(route_params[:name], route_params[:namespace])
60
- job.enque!
61
+ job.enqueue!
61
62
  end
62
- redirect params['redirect'] || "#{root_path}cron"
63
+
64
+ redirect_to_previous_or_default
63
65
  end
64
66
 
65
67
  # Delete all schedules.
66
68
  app.post '/cron/namespaces/:namespace/all/delete' do
67
69
  Sidekiq::Cron::Job.all(route_params[:namespace]).each(&:destroy)
68
- redirect "#{root_path}cron/namespaces/#{route_params[:namespace]}"
70
+
71
+ redirect_to_previous_or_default
69
72
  end
70
73
 
71
74
  # Delete schedule.
@@ -73,13 +76,15 @@ module Sidekiq
73
76
  if job = Sidekiq::Cron::Job.find(route_params[:name], route_params[:namespace])
74
77
  job.destroy
75
78
  end
76
- redirect "#{root_path}cron"
79
+
80
+ redirect_to_previous_or_default
77
81
  end
78
82
 
79
83
  # Enable all jobs.
80
84
  app.post '/cron/namespaces/:namespace/all/enable' do
81
85
  Sidekiq::Cron::Job.all(route_params[:namespace]).each(&:enable!)
82
- redirect params['redirect'] || "#{root_path}cron/namespaces/#{route_params[:namespace]}"
86
+
87
+ redirect_to_previous_or_default
83
88
  end
84
89
 
85
90
  # Enable job.
@@ -87,13 +92,15 @@ module Sidekiq
87
92
  if job = Sidekiq::Cron::Job.find(route_params[:name], route_params[:namespace])
88
93
  job.enable!
89
94
  end
90
- redirect params['redirect'] || "#{root_path}cron"
95
+
96
+ redirect_to_previous_or_default
91
97
  end
92
98
 
93
99
  # Disable all jobs.
94
100
  app.post '/cron/namespaces/:namespace/all/disable' do
95
101
  Sidekiq::Cron::Job.all(route_params[:namespace]).each(&:disable!)
96
- redirect params['redirect'] || "#{root_path}cron/namespaces/#{route_params[:namespace]}"
102
+
103
+ redirect_to_previous_or_default
97
104
  end
98
105
 
99
106
  # Disable job.
@@ -101,7 +108,8 @@ module Sidekiq
101
108
  if job = Sidekiq::Cron::Job.find(route_params[:name], route_params[:namespace])
102
109
  job.disable!
103
110
  end
104
- redirect params['redirect'] || "#{root_path}cron"
111
+
112
+ redirect_to_previous_or_default
105
113
  end
106
114
  end
107
115
  end
data/lib/sidekiq/cron.rb CHANGED
@@ -1,9 +1,3 @@
1
- require "sidekiq/cron/job"
2
- require "sidekiq/cron/namespace"
3
- require "sidekiq/cron/poller"
4
- require "sidekiq/cron/launcher"
5
- require "sidekiq/cron/schedule_loader"
6
-
7
1
  module Sidekiq
8
2
  module Cron
9
3
  class << self
@@ -15,7 +9,22 @@ module Sidekiq
15
9
  yield(configuration) if block_given?
16
10
  end
17
11
 
12
+ def self.reset!
13
+ self.configuration = Configuration.new
14
+ end
15
+
18
16
  class Configuration
17
+ # The interval, in seconds, at which to poll for scheduled cron jobs.
18
+ # This determines how frequently the scheduler checks for jobs to enqueue.
19
+ attr_accessor :cron_poll_interval
20
+
21
+ # The path to a YAML file containing multiple cron job schedules.
22
+ attr_accessor :cron_schedule_file
23
+
24
+ # The maximum number of recent cron job execution histories to retain.
25
+ # This value controls how many past job executions are stored.
26
+ attr_accessor :cron_history_size
27
+
19
28
  # The default namespace is used when no namespace is specified.
20
29
  attr_accessor :default_namespace
21
30
 
@@ -28,12 +37,15 @@ module Sidekiq
28
37
  # The poller will not enqueue jobs that are late by more than this amount of seconds.
29
38
  # Defaults to 60 seconds.
30
39
  #
31
- # This is useful when sidekiq (and sidekiq-cron) is not used in zero downtime deployments and
32
- # when the deployment is done and sidekiq-cron starts to catch up, it will consider older
40
+ # This is useful when Sidekiq (and Sidekiq-Cron) is not used in zero downtime deployments and
41
+ # when the deployment is done and Sidekiq-Cron starts to catch up, it will consider older
33
42
  # jobs that missed their schedules during the deployment. E.g., jobs that run once a day.
34
43
  attr_accessor :reschedule_grace_period
35
44
 
36
45
  def initialize
46
+ @cron_poll_interval = 30
47
+ @cron_schedule_file = 'config/schedule.yml'
48
+ @cron_history_size = 10
37
49
  @default_namespace = 'default'
38
50
  @natural_cron_parsing_mode = :single
39
51
  @reschedule_grace_period = 60
@@ -1,5 +1,4 @@
1
- require 'sidekiq'
2
-
1
+ # Module to access Sidekiq config
3
2
  module Sidekiq
4
3
  module Options
5
4
  def self.[](key)
@@ -16,13 +15,12 @@ module Sidekiq
16
15
 
17
16
  def self.options_field
18
17
  return @options_field unless @options_field.nil?
18
+
19
19
  sidekiq_version = Gem::Version.new(Sidekiq::VERSION)
20
20
  @options_field = if sidekiq_version >= Gem::Version.new('7.0')
21
21
  :default_configuration
22
- elsif sidekiq_version >= Gem::Version.new('6.5')
23
- false
24
22
  else
25
- :options
23
+ false
26
24
  end
27
25
  end
28
26
  end