sidekiq-cron 1.2.0 → 1.7.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.
- checksums.yaml +5 -5
- data/CHANGELOG.md +122 -0
- data/Gemfile +1 -30
- data/README.md +151 -121
- data/Rakefile +3 -42
- data/lib/sidekiq/cron/job.rb +139 -104
- data/lib/sidekiq/cron/launcher.rb +7 -9
- data/lib/sidekiq/cron/locales/en.yml +2 -0
- data/lib/sidekiq/cron/locales/pt.yml +22 -0
- data/lib/sidekiq/cron/poller.rb +18 -9
- data/lib/sidekiq/cron/schedule_loader.rb +22 -0
- data/lib/sidekiq/cron/support.rb +0 -1
- data/lib/sidekiq/cron/version.rb +7 -0
- data/lib/sidekiq/cron/views/cron.erb +19 -13
- data/lib/sidekiq/cron/views/cron_show.erb +8 -8
- data/lib/sidekiq/cron/web.rb +1 -7
- data/lib/sidekiq/cron/web_extension.rb +8 -21
- data/lib/sidekiq/cron.rb +1 -0
- data/lib/sidekiq/options.rb +18 -0
- data/sidekiq-cron.gemspec +25 -115
- data/test/integration/performance_test.rb +4 -5
- data/test/test_helper.rb +11 -23
- data/test/unit/fixtures/schedule_array.yml +13 -0
- data/test/unit/fixtures/schedule_hash.yml +12 -0
- data/test/unit/fixtures/schedule_string.yml +1 -0
- data/test/unit/job_test.rb +227 -23
- data/test/unit/poller_test.rb +7 -9
- data/test/unit/schedule_loader_test.rb +45 -0
- data/test/unit/web_extension_test.rb +40 -40
- metadata +56 -197
- data/.document +0 -5
- data/.travis.yml +0 -18
- data/Changes.md +0 -82
- data/Dockerfile +0 -32
- data/VERSION +0 -1
- data/config.ru +0 -14
- data/docker-compose.yml +0 -23
- data/examples/web-cron-ui.png +0 -0
- data/lib/sidekiq/cron/views/cron.slim +0 -71
- data/lib/sidekiq/cron/views/cron_show.slim +0 -61
data/lib/sidekiq/cron/poller.rb
CHANGED
@@ -1,14 +1,27 @@
|
|
1
1
|
require 'sidekiq'
|
2
|
-
require 'sidekiq/util'
|
3
2
|
require 'sidekiq/cron'
|
4
3
|
require 'sidekiq/scheduled'
|
4
|
+
require 'sidekiq/options'
|
5
5
|
|
6
6
|
module Sidekiq
|
7
7
|
module Cron
|
8
|
-
POLL_INTERVAL = 30
|
8
|
+
POLL_INTERVAL = Sidekiq::Options[:average_scheduled_poll_interval] || 30
|
9
9
|
|
10
|
-
# The Poller checks Redis every N seconds for sheduled cron jobs
|
10
|
+
# The Poller checks Redis every N seconds for sheduled cron jobs.
|
11
11
|
class Poller < Sidekiq::Scheduled::Poller
|
12
|
+
def initialize
|
13
|
+
Sidekiq.configure_server do
|
14
|
+
Sidekiq::Options[:poll_interval_average] = POLL_INTERVAL
|
15
|
+
end
|
16
|
+
|
17
|
+
if Gem::Version.new(Sidekiq::VERSION) >= Gem::Version.new('6.5.0')
|
18
|
+
# Sidekiq Poller init requires a config argument.
|
19
|
+
super(Sidekiq)
|
20
|
+
else
|
21
|
+
super
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
12
25
|
def enqueue
|
13
26
|
time = Time.now.utc
|
14
27
|
Sidekiq::Cron::Job.all.each do |job|
|
@@ -16,7 +29,7 @@ module Sidekiq
|
|
16
29
|
end
|
17
30
|
rescue => ex
|
18
31
|
# Most likely a problem with redis networking.
|
19
|
-
# Punt and try again at the next interval
|
32
|
+
# Punt and try again at the next interval.
|
20
33
|
Sidekiq.logger.error ex.message
|
21
34
|
Sidekiq.logger.error ex.backtrace.first
|
22
35
|
handle_exception(ex) if respond_to?(:handle_exception)
|
@@ -27,15 +40,11 @@ module Sidekiq
|
|
27
40
|
def enqueue_job(job, time = Time.now.utc)
|
28
41
|
job.test_and_enque_for_time! time if job && job.valid?
|
29
42
|
rescue => ex
|
30
|
-
#
|
43
|
+
# Problem somewhere in one job.
|
31
44
|
Sidekiq.logger.error "CRON JOB: #{ex.message}"
|
32
45
|
Sidekiq.logger.error "CRON JOB: #{ex.backtrace.first}"
|
33
46
|
handle_exception(ex) if respond_to?(:handle_exception)
|
34
47
|
end
|
35
|
-
|
36
|
-
def poll_interval_average
|
37
|
-
Sidekiq.options[:poll_interval] || POLL_INTERVAL
|
38
|
-
end
|
39
48
|
end
|
40
49
|
end
|
41
50
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'sidekiq'
|
2
|
+
require 'sidekiq/cron/job'
|
3
|
+
require 'sidekiq/options'
|
4
|
+
|
5
|
+
if Sidekiq.server?
|
6
|
+
Sidekiq.configure_server do |config|
|
7
|
+
schedule_file = Sidekiq::Options[:cron_schedule_file] || 'config/schedule.yml'
|
8
|
+
|
9
|
+
if File.exist?(schedule_file)
|
10
|
+
config.on(:startup) do
|
11
|
+
schedule = YAML.load_file(schedule_file)
|
12
|
+
if schedule.kind_of?(Hash)
|
13
|
+
Sidekiq::Cron::Job.load_from_hash schedule
|
14
|
+
elsif schedule.kind_of?(Array)
|
15
|
+
Sidekiq::Cron::Job.load_from_array schedule
|
16
|
+
else
|
17
|
+
raise "Not supported schedule format. Confirm your #{schedule_file}"
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/sidekiq/cron/support.rb
CHANGED
@@ -1,24 +1,24 @@
|
|
1
1
|
<header class='row'>
|
2
2
|
<div class='col-sm-5 pull-left'>
|
3
|
-
<h3><%=t
|
3
|
+
<h3><%= t('CronJobs') %></h3>
|
4
4
|
</div>
|
5
5
|
<div class='col-sm-7 pull-right' style="margin-top: 20px; margin-bottom: 10px;">
|
6
6
|
<% if @cron_jobs.size > 0 %>
|
7
7
|
<form action="<%= root_path %>cron/__all__/delete" method="post" class="pull-right">
|
8
8
|
<%= csrf_tag if respond_to?(:csrf_tag) %>
|
9
|
-
<input class="btn btn-
|
9
|
+
<input class="btn btn-danger" type="submit" name="delete" value="<%= t('DeleteAll') %>" data-confirm="<%= t('AreYouSureDeleteCronJobs') %>" />
|
10
10
|
</form>
|
11
11
|
<form action="<%= root_path %>cron/__all__/disable" method="post" class="pull-right">
|
12
12
|
<%= csrf_tag if respond_to?(:csrf_tag) %>
|
13
|
-
<input class="btn btn-
|
13
|
+
<input class="btn btn-warn" type="submit" name="enque" value="<%= t('DisableAll') %>" />
|
14
14
|
</form>
|
15
15
|
<form action="<%= root_path %>cron/__all__/enable" method="post" class="pull-right">
|
16
16
|
<%= csrf_tag if respond_to?(:csrf_tag) %>
|
17
|
-
<input class="btn btn-
|
17
|
+
<input class="btn btn-warn" type="submit" name="enque" value="<%= t('EnableAll') %>" />
|
18
18
|
</form>
|
19
19
|
<form action="<%= root_path %>cron/__all__/enque" method="post" class="pull-right">
|
20
20
|
<%= csrf_tag if respond_to?(:csrf_tag) %>
|
21
|
-
<input class="btn btn-
|
21
|
+
<input class="btn btn-warn" type="submit" name="enque" value="<%= t('EnqueueAll') %>" data-confirm="<%= t('AreYouSureEnqueueCronJobs') %>" />
|
22
22
|
</form>
|
23
23
|
<% end %>
|
24
24
|
</div>
|
@@ -37,7 +37,7 @@
|
|
37
37
|
|
38
38
|
<tbody>
|
39
39
|
<% @cron_jobs.sort{|a,b| a.sort_name <=> b.sort_name }.each_with_index do |job, index| %>
|
40
|
-
<% style = "#{job.status == 'disabled' ? "background: #ecc": ""}" %>
|
40
|
+
<% style = "#{job.status == 'disabled' ? "background: #ecc; color: #585454;": ""}" %>
|
41
41
|
<tr>
|
42
42
|
<td style="<%= style %>"><%= t job.status %></td>
|
43
43
|
<td style="<%= style %>">
|
@@ -47,9 +47,15 @@
|
|
47
47
|
<hr style="margin:3px;border:0;">
|
48
48
|
<small>
|
49
49
|
<% if job.message and job.message.to_s.size > 100 %>
|
50
|
-
|
51
|
-
|
52
|
-
|
50
|
+
<% if Gem::Version.new(Sidekiq::VERSION) >= Gem::Version.new("6.3.0") %>
|
51
|
+
<button data-toggle="job_<%= index %>" class="btn btn-warn btn-xs"><%= t('ShowAll')%></button>
|
52
|
+
<div class="toggle" id="job_<%= index %>" style="display: inline;"><%= job.message[0..100] + "... " %></div>
|
53
|
+
<div class="toggle" id="job_<%= index %>_full" style="display: none;"><%= job.message %></div>
|
54
|
+
<% else %>
|
55
|
+
<button data-toggle="collapse" data-target=".worker_<%= index %>" class="btn btn-warn btn-xs"><%= t('ShowAll')%></button>
|
56
|
+
<div class="toggle worker_<%= index %>" style="display: inline;"><%= job.message[0..100] + "... " %></div>
|
57
|
+
<div class="toggle worker_<%= index %>" style="display: none;"><%= job.message %></div>
|
58
|
+
<% end %>
|
53
59
|
<% else %>
|
54
60
|
<%= job.message %>
|
55
61
|
<% end %>
|
@@ -61,20 +67,20 @@
|
|
61
67
|
<% if job.status == 'enabled' %>
|
62
68
|
<form action="<%= root_path %>cron/<%= CGI.escape(job.name).gsub('+', '%20') %>/enque" method="post">
|
63
69
|
<%= csrf_tag if respond_to?(:csrf_tag) %>
|
64
|
-
<input class='btn btn-xs pull-left' type="submit" name="enque" value="<%= t('EnqueueNow') %>"/>
|
70
|
+
<input class='btn btn-warn btn-xs pull-left' type="submit" name="enque" value="<%= t('EnqueueNow') %>" data-confirm="<%= t('AreYouSureEnqueueCronJob', :job => job.name) %>"/>
|
65
71
|
</form>
|
66
72
|
<form action="<%= root_path %>cron/<%= CGI.escape(job.name).gsub('+', '%20') %>/disable" method="post">
|
67
73
|
<%= csrf_tag if respond_to?(:csrf_tag) %>
|
68
|
-
<input class='btn btn-xs pull-left' type="submit" name="disable" value="<%= t('Disable') %>"/>
|
74
|
+
<input class='btn btn-warn btn-xs pull-left' type="submit" name="disable" value="<%= t('Disable') %>"/>
|
69
75
|
</form>
|
70
76
|
<% else %>
|
71
77
|
<form action="<%= root_path %>cron/<%= CGI.escape(job.name).gsub('+', '%20') %>/enque" method="post">
|
72
78
|
<%= csrf_tag if respond_to?(:csrf_tag) %>
|
73
|
-
<input class='btn btn-xs pull-left' type="submit" name="enque" value="<%= t('EnqueueNow') %>"/>
|
79
|
+
<input class='btn btn-warn btn-xs pull-left' type="submit" name="enque" value="<%= t('EnqueueNow') %>"/>
|
74
80
|
</form>
|
75
81
|
<form action="<%= root_path %>cron/<%= CGI.escape(job.name).gsub('+', '%20') %>/enable" method="post">
|
76
82
|
<%= csrf_tag if respond_to?(:csrf_tag) %>
|
77
|
-
<input class='btn btn-xs pull-left' type="submit" name="enable" value="<%= t('Enable') %>"/>
|
83
|
+
<input class='btn btn-warn btn-xs pull-left' type="submit" name="enable" value="<%= t('Enable') %>"/>
|
78
84
|
</form>
|
79
85
|
<form action="<%= root_path %>cron/<%= CGI.escape(job.name).gsub('+', '%20') %>/delete" method="post">
|
80
86
|
<%= csrf_tag if respond_to?(:csrf_tag) %>
|
@@ -7,23 +7,23 @@
|
|
7
7
|
</div>
|
8
8
|
<div class="span col-sm-7 pull-right" style="margin-top: 20px; margin-bottom: 10px;">
|
9
9
|
<% cron_job_path = "#{root_path}cron/#{CGI.escape(@job.name).gsub('+', '%20')}" %>
|
10
|
-
<form action="<%= cron_job_path %>/enque?redirect=<%= cron_job_path %>"
|
10
|
+
<form action="<%= cron_job_path %>/enque?redirect=<%= cron_job_path %>" method="post">
|
11
11
|
<%= csrf_tag if respond_to?(:csrf_tag) %>
|
12
|
-
<input class="btn btn-
|
12
|
+
<input class="btn btn-warn pull-left" name="enque" 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 %>"
|
15
|
+
<form action="<%= cron_job_path %>/disable?redirect=<%= cron_job_path %>" method="post">
|
16
16
|
<%= csrf_tag if respond_to?(:csrf_tag) %>
|
17
|
-
<input class="btn btn-
|
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 %>"
|
20
|
+
<form action="<%= cron_job_path %>/enable?redirect=<%= cron_job_path %>" method="post">
|
21
21
|
<%= csrf_tag if respond_to?(:csrf_tag) %>
|
22
|
-
<input class="btn btn-
|
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"
|
24
|
+
<form action="<%= cron_job_path %>/delete" method="post">
|
25
25
|
<%= csrf_tag if respond_to?(:csrf_tag) %>
|
26
|
-
<input class="btn btn-danger
|
26
|
+
<input class="btn btn-danger" data-confirm="<%= t('AreYouSureDeleteCronJob', :job => @job.name) %>" name="delete" type="submit" value="<%= t('Delete') %>" />
|
27
27
|
</form>
|
28
28
|
<% end %>
|
29
29
|
</div>
|
data/lib/sidekiq/cron/web.rb
CHANGED
@@ -3,11 +3,5 @@ require "sidekiq/cron/job"
|
|
3
3
|
|
4
4
|
if defined?(Sidekiq::Web)
|
5
5
|
Sidekiq::Web.register Sidekiq::Cron::WebExtension
|
6
|
-
|
7
|
-
if Sidekiq::Web.tabs.is_a?(Array)
|
8
|
-
# For sidekiq < 2.5
|
9
|
-
Sidekiq::Web.tabs << "cron"
|
10
|
-
else
|
11
|
-
Sidekiq::Web.tabs["Cron"] = "cron"
|
12
|
-
end
|
6
|
+
Sidekiq::Web.tabs["Cron"] = "cron"
|
13
7
|
end
|
@@ -1,43 +1,31 @@
|
|
1
1
|
module Sidekiq
|
2
2
|
module Cron
|
3
3
|
module WebExtension
|
4
|
-
|
5
4
|
def self.registered(app)
|
6
|
-
|
7
5
|
app.settings.locales << File.join(File.expand_path("..", __FILE__), "locales")
|
8
6
|
|
9
|
-
#
|
7
|
+
# Index page of cron jobs.
|
10
8
|
app.get '/cron' do
|
11
9
|
view_path = File.join(File.expand_path("..", __FILE__), "views")
|
12
10
|
|
13
11
|
@cron_jobs = Sidekiq::Cron::Job.all
|
14
12
|
|
15
|
-
|
16
|
-
if defined?(Slim) && File.exists?(File.join(settings.views,"layout.slim"))
|
17
|
-
render(:slim, File.read(File.join(view_path, "cron.slim")))
|
18
|
-
else
|
19
|
-
render(:erb, File.read(File.join(view_path, "cron.erb")))
|
20
|
-
end
|
13
|
+
render(:erb, File.read(File.join(view_path, "cron.erb")))
|
21
14
|
end
|
22
15
|
|
23
|
-
#
|
16
|
+
# Display job detail + jid history.
|
24
17
|
app.get '/cron/:name' do
|
25
18
|
view_path = File.join(File.expand_path("..", __FILE__), "views")
|
26
19
|
|
27
20
|
@job = Sidekiq::Cron::Job.find(route_params[:name])
|
28
21
|
if @job
|
29
|
-
|
30
|
-
if defined?(Slim) && File.exists?(File.join(settings.views,"layout.slim"))
|
31
|
-
render(:slim, File.read(File.join(view_path, "cron_show.slim")))
|
32
|
-
else
|
33
|
-
render(:erb, File.read(File.join(view_path, "cron_show.erb")))
|
34
|
-
end
|
22
|
+
render(:erb, File.read(File.join(view_path, "cron_show.erb")))
|
35
23
|
else
|
36
24
|
redirect "#{root_path}cron"
|
37
25
|
end
|
38
26
|
end
|
39
27
|
|
40
|
-
#
|
28
|
+
# Enqueue cron job.
|
41
29
|
app.post '/cron/:name/enque' do
|
42
30
|
if route_params[:name] === '__all__'
|
43
31
|
Sidekiq::Cron::Job.all.each(&:enque!)
|
@@ -47,7 +35,7 @@ module Sidekiq
|
|
47
35
|
redirect params['redirect'] || "#{root_path}cron"
|
48
36
|
end
|
49
37
|
|
50
|
-
#
|
38
|
+
# Delete schedule.
|
51
39
|
app.post '/cron/:name/delete' do
|
52
40
|
if route_params[:name] === '__all__'
|
53
41
|
Sidekiq::Cron::Job.all.each(&:destroy)
|
@@ -57,7 +45,7 @@ module Sidekiq
|
|
57
45
|
redirect "#{root_path}cron"
|
58
46
|
end
|
59
47
|
|
60
|
-
#
|
48
|
+
# Enable job.
|
61
49
|
app.post '/cron/:name/enable' do
|
62
50
|
if route_params[:name] === '__all__'
|
63
51
|
Sidekiq::Cron::Job.all.each(&:enable!)
|
@@ -67,7 +55,7 @@ module Sidekiq
|
|
67
55
|
redirect params['redirect'] || "#{root_path}cron"
|
68
56
|
end
|
69
57
|
|
70
|
-
#
|
58
|
+
# Disable job.
|
71
59
|
app.post '/cron/:name/disable' do
|
72
60
|
if route_params[:name] === '__all__'
|
73
61
|
Sidekiq::Cron::Job.all.each(&:disable!)
|
@@ -76,7 +64,6 @@ module Sidekiq
|
|
76
64
|
end
|
77
65
|
redirect params['redirect'] || "#{root_path}cron"
|
78
66
|
end
|
79
|
-
|
80
67
|
end
|
81
68
|
end
|
82
69
|
end
|
data/lib/sidekiq/cron.rb
CHANGED
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'sidekiq'
|
2
|
+
|
3
|
+
module Sidekiq
|
4
|
+
module Options
|
5
|
+
def self.[](key)
|
6
|
+
new_version? ? Sidekiq[key] : Sidekiq.options[key]
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.[]=(key, value)
|
10
|
+
new_version? ? Sidekiq[key] = value : Sidekiq.options[key] = value
|
11
|
+
end
|
12
|
+
|
13
|
+
# sidekiq --version >= 6.5.0
|
14
|
+
def self.new_version?
|
15
|
+
@new_version ||= Sidekiq.respond_to?(:[])
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/sidekiq-cron.gemspec
CHANGED
@@ -1,129 +1,39 @@
|
|
1
|
-
#
|
2
|
-
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
-
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: sidekiq-cron 1.2.0 ruby lib
|
1
|
+
# frozen_string_literal: true
|
6
2
|
|
7
|
-
|
8
|
-
s.name = "sidekiq-cron".freeze
|
9
|
-
s.version = "1.2.0"
|
3
|
+
require './lib/sidekiq/cron/version'
|
10
4
|
|
11
|
-
|
12
|
-
s.
|
13
|
-
s.
|
14
|
-
s.
|
15
|
-
s.description = "Enables to set jobs to be run in specified time (using CRON notation)"
|
16
|
-
s.
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "sidekiq-cron"
|
7
|
+
s.version = Sidekiq::Cron::VERSION
|
8
|
+
s.summary = "Scheduler/Cron for Sidekiq jobs"
|
9
|
+
s.description = "Enables to set jobs to be run in specified time (using CRON notation or natural language)"
|
10
|
+
s.homepage = "https://github.com/ondrejbartas/sidekiq-cron"
|
11
|
+
s.authors = ["Ondrej Bartas"]
|
12
|
+
s.email = "ondrej@bartas.cz"
|
13
|
+
s.licenses = ["MIT"]
|
17
14
|
s.extra_rdoc_files = [
|
18
15
|
"LICENSE.txt",
|
19
16
|
"README.md"
|
20
17
|
]
|
21
|
-
s.files = [
|
22
|
-
".
|
23
|
-
".travis.yml",
|
24
|
-
"Changes.md",
|
25
|
-
"Dockerfile",
|
18
|
+
s.files = Dir.glob('lib/**/*') + Dir.glob('test/**/*') + [
|
19
|
+
"CHANGELOG.md",
|
26
20
|
"Gemfile",
|
27
21
|
"LICENSE.txt",
|
28
|
-
"README.md",
|
29
22
|
"Rakefile",
|
30
|
-
"
|
31
|
-
"config.ru",
|
32
|
-
"docker-compose.yml",
|
33
|
-
"examples/web-cron-ui.png",
|
34
|
-
"lib/sidekiq-cron.rb",
|
35
|
-
"lib/sidekiq/cron.rb",
|
36
|
-
"lib/sidekiq/cron/job.rb",
|
37
|
-
"lib/sidekiq/cron/launcher.rb",
|
38
|
-
"lib/sidekiq/cron/locales/de.yml",
|
39
|
-
"lib/sidekiq/cron/locales/en.yml",
|
40
|
-
"lib/sidekiq/cron/locales/ja.yml",
|
41
|
-
"lib/sidekiq/cron/locales/ru.yml",
|
42
|
-
"lib/sidekiq/cron/locales/zh-CN.yml",
|
43
|
-
"lib/sidekiq/cron/poller.rb",
|
44
|
-
"lib/sidekiq/cron/support.rb",
|
45
|
-
"lib/sidekiq/cron/views/cron.erb",
|
46
|
-
"lib/sidekiq/cron/views/cron.slim",
|
47
|
-
"lib/sidekiq/cron/views/cron_show.erb",
|
48
|
-
"lib/sidekiq/cron/views/cron_show.slim",
|
49
|
-
"lib/sidekiq/cron/web.rb",
|
50
|
-
"lib/sidekiq/cron/web_extension.rb",
|
23
|
+
"README.md",
|
51
24
|
"sidekiq-cron.gemspec",
|
52
|
-
"test/integration/performance_test.rb",
|
53
|
-
"test/test_helper.rb",
|
54
|
-
"test/unit/job_test.rb",
|
55
|
-
"test/unit/poller_test.rb",
|
56
|
-
"test/unit/web_extension_test.rb"
|
57
25
|
]
|
58
|
-
s.homepage = "http://github.com/ondrejbartas/sidekiq-cron".freeze
|
59
|
-
s.licenses = ["MIT".freeze]
|
60
|
-
s.rubygems_version = "2.5.2.3".freeze
|
61
|
-
s.summary = "Sidekiq Cron helps to add repeated scheduled jobs".freeze
|
62
26
|
|
63
|
-
|
64
|
-
s.specification_version = 4
|
27
|
+
s.required_ruby_version = ">= 2.6"
|
65
28
|
|
66
|
-
|
67
|
-
|
68
|
-
s.add_runtime_dependency(%q<fugit>.freeze, ["~> 1.1"])
|
69
|
-
s.add_development_dependency(%q<bundler>.freeze, [">= 0"])
|
70
|
-
s.add_development_dependency(%q<simplecov>.freeze, [">= 0"])
|
71
|
-
s.add_development_dependency(%q<redis-namespace>.freeze, [">= 1.5.2"])
|
72
|
-
s.add_development_dependency(%q<shoulda-context>.freeze, [">= 0"])
|
73
|
-
s.add_development_dependency(%q<rack>.freeze, [">= 0"])
|
74
|
-
s.add_development_dependency(%q<rack-test>.freeze, [">= 0"])
|
75
|
-
s.add_development_dependency(%q<jeweler>.freeze, [">= 0"])
|
76
|
-
s.add_development_dependency(%q<minitest>.freeze, [">= 0"])
|
77
|
-
s.add_development_dependency(%q<test-unit>.freeze, [">= 0"])
|
78
|
-
s.add_development_dependency(%q<sdoc>.freeze, [">= 0"])
|
79
|
-
s.add_development_dependency(%q<slim>.freeze, [">= 0"])
|
80
|
-
s.add_development_dependency(%q<sinatra>.freeze, [">= 0"])
|
81
|
-
s.add_development_dependency(%q<mocha>.freeze, [">= 0"])
|
82
|
-
s.add_development_dependency(%q<coveralls>.freeze, [">= 0"])
|
83
|
-
s.add_development_dependency(%q<shotgun>.freeze, [">= 0"])
|
84
|
-
s.add_development_dependency(%q<guard>.freeze, [">= 0"])
|
85
|
-
s.add_development_dependency(%q<guard-minitest>.freeze, [">= 0"])
|
86
|
-
else
|
87
|
-
s.add_dependency(%q<sidekiq>.freeze, [">= 4.2.1"])
|
88
|
-
s.add_dependency(%q<fugit>.freeze, ["~> 1.1"])
|
89
|
-
s.add_dependency(%q<bundler>.freeze, [">= 0"])
|
90
|
-
s.add_dependency(%q<simplecov>.freeze, [">= 0"])
|
91
|
-
s.add_dependency(%q<redis-namespace>.freeze, [">= 1.5.2"])
|
92
|
-
s.add_dependency(%q<shoulda-context>.freeze, [">= 0"])
|
93
|
-
s.add_dependency(%q<rack>.freeze, [">= 0"])
|
94
|
-
s.add_dependency(%q<rack-test>.freeze, [">= 0"])
|
95
|
-
s.add_dependency(%q<jeweler>.freeze, [">= 0"])
|
96
|
-
s.add_dependency(%q<minitest>.freeze, [">= 0"])
|
97
|
-
s.add_dependency(%q<test-unit>.freeze, [">= 0"])
|
98
|
-
s.add_dependency(%q<sdoc>.freeze, [">= 0"])
|
99
|
-
s.add_dependency(%q<slim>.freeze, [">= 0"])
|
100
|
-
s.add_dependency(%q<sinatra>.freeze, [">= 0"])
|
101
|
-
s.add_dependency(%q<mocha>.freeze, [">= 0"])
|
102
|
-
s.add_dependency(%q<coveralls>.freeze, [">= 0"])
|
103
|
-
s.add_dependency(%q<shotgun>.freeze, [">= 0"])
|
104
|
-
s.add_dependency(%q<guard>.freeze, [">= 0"])
|
105
|
-
s.add_dependency(%q<guard-minitest>.freeze, [">= 0"])
|
106
|
-
end
|
107
|
-
else
|
108
|
-
s.add_dependency(%q<sidekiq>.freeze, [">= 4.2.1"])
|
109
|
-
s.add_dependency(%q<fugit>.freeze, ["~> 1.1"])
|
110
|
-
s.add_dependency(%q<bundler>.freeze, [">= 0"])
|
111
|
-
s.add_dependency(%q<simplecov>.freeze, [">= 0"])
|
112
|
-
s.add_dependency(%q<redis-namespace>.freeze, [">= 1.5.2"])
|
113
|
-
s.add_dependency(%q<shoulda-context>.freeze, [">= 0"])
|
114
|
-
s.add_dependency(%q<rack>.freeze, [">= 0"])
|
115
|
-
s.add_dependency(%q<rack-test>.freeze, [">= 0"])
|
116
|
-
s.add_dependency(%q<jeweler>.freeze, [">= 0"])
|
117
|
-
s.add_dependency(%q<minitest>.freeze, [">= 0"])
|
118
|
-
s.add_dependency(%q<test-unit>.freeze, [">= 0"])
|
119
|
-
s.add_dependency(%q<sdoc>.freeze, [">= 0"])
|
120
|
-
s.add_dependency(%q<slim>.freeze, [">= 0"])
|
121
|
-
s.add_dependency(%q<sinatra>.freeze, [">= 0"])
|
122
|
-
s.add_dependency(%q<mocha>.freeze, [">= 0"])
|
123
|
-
s.add_dependency(%q<coveralls>.freeze, [">= 0"])
|
124
|
-
s.add_dependency(%q<shotgun>.freeze, [">= 0"])
|
125
|
-
s.add_dependency(%q<guard>.freeze, [">= 0"])
|
126
|
-
s.add_dependency(%q<guard-minitest>.freeze, [">= 0"])
|
127
|
-
end
|
128
|
-
end
|
29
|
+
s.add_dependency("fugit", "~> 1")
|
30
|
+
s.add_dependency("sidekiq", ">= 4.2.1")
|
129
31
|
|
32
|
+
s.add_development_dependency("minitest", "~> 5.15")
|
33
|
+
s.add_development_dependency("mocha", "~> 1.14")
|
34
|
+
s.add_development_dependency("redis-namespace", "~> 1.8")
|
35
|
+
s.add_development_dependency("rack", "~> 2.2")
|
36
|
+
s.add_development_dependency("rack-test", "~> 1.1")
|
37
|
+
s.add_development_dependency("rake", "~> 13.0")
|
38
|
+
s.add_development_dependency("simplecov", "~> 0.21")
|
39
|
+
end
|
@@ -1,14 +1,13 @@
|
|
1
|
-
# -*- encoding : utf-8 -*-
|
2
1
|
require './test/test_helper'
|
3
2
|
require 'benchmark'
|
4
3
|
|
5
4
|
describe 'Performance Poller' do
|
6
5
|
X = 10000
|
7
6
|
before do
|
7
|
+
REDIS.with { |c| c.respond_to?(:redis) ? c.redis.flushdb : c.flushdb }
|
8
8
|
Sidekiq.redis = REDIS
|
9
|
-
Redis.current.flushdb
|
10
9
|
|
11
|
-
#
|
10
|
+
# Clear all previous saved data from Redis.
|
12
11
|
Sidekiq.redis do |conn|
|
13
12
|
conn.keys("cron_job*").each do |key|
|
14
13
|
conn.del(key)
|
@@ -31,7 +30,7 @@ describe 'Performance Poller' do
|
|
31
30
|
Time.stubs(:now).returns(enqueued_time)
|
32
31
|
end
|
33
32
|
|
34
|
-
it 'should enqueue 10000 jobs in less than
|
33
|
+
it 'should enqueue 10000 jobs in less than 50s' do
|
35
34
|
Sidekiq.redis do |conn|
|
36
35
|
assert_equal 0, conn.llen("queue:default"), 'Queue should be empty'
|
37
36
|
end
|
@@ -45,6 +44,6 @@ describe 'Performance Poller' do
|
|
45
44
|
end
|
46
45
|
|
47
46
|
puts "Performance test finished in #{bench.real}"
|
48
|
-
assert_operator bench.real, :<,
|
47
|
+
assert_operator bench.real, :<, 50
|
49
48
|
end
|
50
49
|
end
|
data/test/test_helper.rb
CHANGED
@@ -1,37 +1,22 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
begin
|
4
|
-
Bundler.setup(:default, :development)
|
5
|
-
rescue Bundler::BundlerError => e
|
6
|
-
$stderr.puts e.message
|
7
|
-
$stderr.puts "Run `bundle install` to install missing gems"
|
8
|
-
exit e.status_code
|
9
|
-
end
|
1
|
+
$TESTING = true
|
2
|
+
ENV['RACK_ENV'] = 'test'
|
10
3
|
|
11
4
|
require 'simplecov'
|
12
5
|
SimpleCov.start do
|
13
6
|
add_filter "/test/"
|
14
|
-
|
15
7
|
add_group 'SidekiqCron', 'lib/'
|
16
8
|
end
|
17
|
-
require 'coveralls'
|
18
|
-
Coveralls.wear!
|
19
9
|
|
20
10
|
require "minitest/autorun"
|
21
|
-
require 'shoulda-context'
|
22
11
|
require "rack/test"
|
23
12
|
require 'mocha/minitest'
|
24
|
-
|
25
|
-
ENV['RACK_ENV'] = 'test'
|
26
|
-
|
27
|
-
#SIDEKIQ Require - need to have sidekiq running!
|
28
13
|
require 'sidekiq'
|
29
|
-
require
|
14
|
+
require "sidekiq-pro" if ENV['SIDEKIQ_PRO_VERSION']
|
30
15
|
require 'sidekiq/web'
|
16
|
+
require "sidekiq/cli"
|
31
17
|
|
32
18
|
Sidekiq.logger.level = Logger::ERROR
|
33
19
|
|
34
|
-
require 'sidekiq/redis_connection'
|
35
20
|
redis_url = ENV['REDIS_URL'] || 'redis://0.0.0.0:6379'
|
36
21
|
REDIS = Sidekiq::RedisConnection.create(:url => redis_url, :namespace => 'testy')
|
37
22
|
|
@@ -39,12 +24,15 @@ Sidekiq.configure_client do |config|
|
|
39
24
|
config.redis = { :url => redis_url, :namespace => 'testy' }
|
40
25
|
end
|
41
26
|
|
42
|
-
|
43
|
-
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
44
|
-
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
45
27
|
require 'sidekiq-cron'
|
46
28
|
require 'sidekiq/cron/web'
|
47
|
-
|
29
|
+
|
30
|
+
# For testing os symbilize args!
|
31
|
+
class Hash
|
32
|
+
def symbolize_keys
|
33
|
+
transform_keys { |key| key.to_sym rescue key }
|
34
|
+
end
|
35
|
+
end
|
48
36
|
|
49
37
|
class CronTestClass
|
50
38
|
include Sidekiq::Worker
|
@@ -0,0 +1 @@
|
|
1
|
+
--- string
|