sidekiq-cron 0.5.1 → 0.6.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 +4 -4
- data/.travis.yml +1 -3
- data/Gemfile +1 -1
- data/README.md +4 -0
- data/VERSION +1 -1
- data/lib/sidekiq/cron/job.rb +8 -1
- data/lib/sidekiq/cron/locales/en.yml +5 -0
- data/lib/sidekiq/cron/poller.rb +6 -0
- data/lib/sidekiq/cron/views/cron.erb +20 -1
- data/lib/sidekiq/cron/views/cron.slim +16 -1
- data/lib/sidekiq/cron/web_extension.rb +12 -4
- data/sidekiq-cron.gemspec +7 -6
- data/test/integration/performance_test.rb +52 -0
- data/test/unit/web_extension_test.rb +27 -0
- metadata +11 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b058d0c5b73a34aed14caeb7f42f28160211d85c
|
4
|
+
data.tar.gz: 63e67fe94aca427cb37924ef6510e255f3525a85
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cbf9eb136c8490a8d8eabd88fd4709df9f157835bf5ca4decf8b847f458efed8fb148b296b268c051ad5679187f6cf70df5d6482e1c113a0ece9ad5214690a76
|
7
|
+
data.tar.gz: 64baadd70d279c95b8d2381b29cd4c0f9f9097166a47f0f1b4a9cac5130943ee8041ec34b2fcdc00608fa924dfa9c6b0c5f760b169315fb5039b2c8fd81c819e
|
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
@@ -2,12 +2,12 @@ source 'https://rubygems.org'
|
|
2
2
|
|
3
3
|
gem 'sidekiq', '>= 4.2.1'
|
4
4
|
gem 'rufus-scheduler', '>= 3.3.0'
|
5
|
-
gem 'redis-namespace', '>= 1.5.2'
|
6
5
|
|
7
6
|
group :development do
|
8
7
|
gem 'bundler'
|
9
8
|
gem 'simplecov'
|
10
9
|
|
10
|
+
gem 'redis-namespace', '>= 1.5.2'
|
11
11
|
gem 'shoulda-context'
|
12
12
|
|
13
13
|
gem 'rack'
|
data/README.md
CHANGED
@@ -281,6 +281,10 @@ When you start the Sidekiq process, it starts one thread with `Sidekiq::Poller`
|
|
281
281
|
|
282
282
|
Sidekiq-Cron adds itself into this start procedure and starts another thread with `Sidekiq::Cron::Poller` which checks all enabled Sidekiq cron jobs every 10 seconds, if they should be added to queue (their cronline matches time of check).
|
283
283
|
|
284
|
+
Sidekiq-Cron is checking jobs to be enqueued every 30s by default, you can change it by setting:
|
285
|
+
```
|
286
|
+
Sidekiq.options[:poll_interval] = 10
|
287
|
+
```
|
284
288
|
|
285
289
|
## Thanks to
|
286
290
|
* [@7korobi](https://github.com/7korobi)
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.6.0
|
data/lib/sidekiq/cron/job.rb
CHANGED
@@ -68,7 +68,7 @@ module Sidekiq
|
|
68
68
|
end
|
69
69
|
end
|
70
70
|
|
71
|
-
|
71
|
+
save_last_enqueue_time
|
72
72
|
logger.debug { "enqueued #{@name}: #{@message}" }
|
73
73
|
end
|
74
74
|
|
@@ -451,6 +451,13 @@ module Sidekiq
|
|
451
451
|
logger.info { "Cron Jobs - add job with name: #{@name}" }
|
452
452
|
end
|
453
453
|
|
454
|
+
def save_last_enqueue_time
|
455
|
+
Sidekiq.redis do |conn|
|
456
|
+
# update last enqueue time
|
457
|
+
conn.hset redis_key, 'last_enqueue_time', @last_enqueue_time
|
458
|
+
end
|
459
|
+
end
|
460
|
+
|
454
461
|
# remove job from cron jobs by name
|
455
462
|
# input:
|
456
463
|
# first arg: name (string) - name of job (must be same - case sensitive)
|
@@ -3,7 +3,12 @@ en:
|
|
3
3
|
Cron: Cron
|
4
4
|
CronJobs: Cron Jobs
|
5
5
|
EnqueueNow: Enqueue Now
|
6
|
+
EnableAll: Enable All
|
7
|
+
DisableAll: Disable All
|
8
|
+
EnqueueAll: Enqueue All
|
9
|
+
DeleteAll: Delete All
|
6
10
|
'Cron string': Cron
|
11
|
+
AreYouSureDeleteCronJobs: Are you sure you want to delete ALL cron jobs?
|
7
12
|
AreYouSureDeleteCronJob: Are you sure you want to delete the %{job} cron job?
|
8
13
|
NoCronJobsFound: "No cron jobs found"
|
9
14
|
Enable: Enable
|
data/lib/sidekiq/cron/poller.rb
CHANGED
@@ -5,6 +5,8 @@ require 'sidekiq/scheduled'
|
|
5
5
|
|
6
6
|
module Sidekiq
|
7
7
|
module Cron
|
8
|
+
POLL_INTERVAL = 30
|
9
|
+
|
8
10
|
# The Poller checks Redis every N seconds for sheduled cron jobs
|
9
11
|
class Poller < Sidekiq::Scheduled::Poller
|
10
12
|
def enqueue
|
@@ -28,6 +30,10 @@ module Sidekiq
|
|
28
30
|
logger.error "CRON JOB: #{ex.message}"
|
29
31
|
logger.error "CRON JOB: #{ex.backtrace.first}"
|
30
32
|
end
|
33
|
+
|
34
|
+
def poll_interval_average
|
35
|
+
Sidekiq.options[:poll_interval] || POLL_INTERVAL
|
36
|
+
end
|
31
37
|
end
|
32
38
|
end
|
33
39
|
end
|
@@ -1,8 +1,27 @@
|
|
1
1
|
<header class='row'>
|
2
|
-
<div class='
|
2
|
+
<div class='col-sm-5 pull-left'>
|
3
3
|
<h3><%=t 'CronJobs' %></h3>
|
4
4
|
</div>
|
5
|
+
<div class='col-sm-7 pull-right' style="margin-top: 20px; margin-bottom: 10px;">
|
6
|
+
<form action="<%= root_path %>cron/__all__/delete" method="post" class="pull-right">
|
7
|
+
<%= csrf_tag if respond_to?(:csrf_tag) %>
|
8
|
+
<input class="btn btn-small btn-danger" type="submit" name="delete" value="<%= t('DeleteAll') %>" data-confirm="<%= t('AreYouSureDeleteCronJobs') %>">
|
9
|
+
</form>
|
10
|
+
<form action="<%= root_path %>cron/__all__/disable" method="post" class="pull-right">
|
11
|
+
<%= csrf_tag if respond_to?(:csrf_tag) %>
|
12
|
+
<input class="btn btn-small" type="submit" name="enque" value="<%= t('DisableAll') %>" />
|
13
|
+
</form>
|
14
|
+
<form action="<%= root_path %>cron/__all__/enable" method="post" class="pull-right">
|
15
|
+
<%= csrf_tag if respond_to?(:csrf_tag) %>
|
16
|
+
<input class="btn btn-small" type="submit" name="enque" value="<%= t('EnableAll') %>" />
|
17
|
+
</form>
|
18
|
+
<form action="<%= root_path %>cron/__all__/enque" method="post" class="pull-right">
|
19
|
+
<%= csrf_tag if respond_to?(:csrf_tag) %>
|
20
|
+
<input class="btn btn-small" type="submit" name="enque" value="<%= t('EnqueueAll') %>" />
|
21
|
+
</form>
|
22
|
+
</div>
|
5
23
|
</header>
|
24
|
+
|
6
25
|
<% if @cron_jobs.size > 0 %>
|
7
26
|
|
8
27
|
<table class="table table-hover table-bordered table-striped table-white">
|
@@ -1,6 +1,21 @@
|
|
1
1
|
header.row
|
2
|
-
.
|
2
|
+
.span.col-sm-5.pull-left
|
3
3
|
h3 = t('CronJobs')
|
4
|
+
|
5
|
+
.span.col-sm-7.pull-right style="margin-top: 20px; margin-bottom: 10px;"
|
6
|
+
form.pull-right action="#{root_path}cron/__all__/delete" method="post"
|
7
|
+
= csrf_tag if respond_to?(:csrf_tag)
|
8
|
+
input.btn.btn-small.pull-left.btn-danger type="submit" name="enque" value="#{t('DeleteAll')}" data-confirm="#{t('AreYouSureDeleteCronJobs')}"
|
9
|
+
form.pull-right action="#{root_path}cron/__all__/disable" method="post"
|
10
|
+
= csrf_tag if respond_to?(:csrf_tag)
|
11
|
+
input.btn.btn-small.pull-left type="submit" name="enque" value="#{t('DisableAll')}"
|
12
|
+
form.pull-right action="#{root_path}cron/__all__/enable" method="post"
|
13
|
+
= csrf_tag if respond_to?(:csrf_tag)
|
14
|
+
input.btn.btn-small.pull-left type="submit" name="enque" value="#{t('EnableAll')}"
|
15
|
+
form.pull-right action="#{root_path}cron/__all__/enque" method="post"
|
16
|
+
= csrf_tag if respond_to?(:csrf_tag)
|
17
|
+
input.btn.btn-small.pull-left type="submit" name="enque" value="#{t('EnqueueAll')}"
|
18
|
+
|
4
19
|
- if @cron_jobs.size > 0
|
5
20
|
|
6
21
|
table class="table table-hover table-bordered table-striped"
|
@@ -22,7 +22,9 @@ module Sidekiq
|
|
22
22
|
|
23
23
|
#enque cron job
|
24
24
|
app.post '/cron/:name/enque' do
|
25
|
-
if
|
25
|
+
if route_params[:name] === '__all__'
|
26
|
+
Sidekiq::Cron::Job.all.each(&:enque!)
|
27
|
+
elsif job = Sidekiq::Cron::Job.find(route_params[:name])
|
26
28
|
job.enque!
|
27
29
|
end
|
28
30
|
redirect "#{root_path}cron"
|
@@ -30,7 +32,9 @@ module Sidekiq
|
|
30
32
|
|
31
33
|
#delete schedule
|
32
34
|
app.post '/cron/:name/delete' do
|
33
|
-
if
|
35
|
+
if route_params[:name] === '__all__'
|
36
|
+
Sidekiq::Cron::Job.all.each(&:destroy)
|
37
|
+
elsif job = Sidekiq::Cron::Job.find(route_params[:name])
|
34
38
|
job.destroy
|
35
39
|
end
|
36
40
|
redirect "#{root_path}cron"
|
@@ -38,7 +42,9 @@ module Sidekiq
|
|
38
42
|
|
39
43
|
#enable job
|
40
44
|
app.post '/cron/:name/enable' do
|
41
|
-
if
|
45
|
+
if route_params[:name] === '__all__'
|
46
|
+
Sidekiq::Cron::Job.all.each(&:enable!)
|
47
|
+
elsif job = Sidekiq::Cron::Job.find(route_params[:name])
|
42
48
|
job.enable!
|
43
49
|
end
|
44
50
|
redirect "#{root_path}cron"
|
@@ -46,7 +52,9 @@ module Sidekiq
|
|
46
52
|
|
47
53
|
#disable job
|
48
54
|
app.post '/cron/:name/disable' do
|
49
|
-
if
|
55
|
+
if route_params[:name] === '__all__'
|
56
|
+
Sidekiq::Cron::Job.all.each(&:disable!)
|
57
|
+
elsif job = Sidekiq::Cron::Job.find(route_params[:name])
|
50
58
|
job.disable!
|
51
59
|
end
|
52
60
|
redirect "#{root_path}cron"
|
data/sidekiq-cron.gemspec
CHANGED
@@ -2,16 +2,16 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: sidekiq-cron 0.
|
5
|
+
# stub: sidekiq-cron 0.6.0 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "sidekiq-cron"
|
9
|
-
s.version = "0.
|
9
|
+
s.version = "0.6.0"
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib"]
|
13
13
|
s.authors = ["Ondrej Bartas"]
|
14
|
-
s.date = "2017-04-
|
14
|
+
s.date = "2017-04-18"
|
15
15
|
s.description = "Enables to set jobs to be run in specified time (using CRON notation)"
|
16
16
|
s.email = "ondrej@bartas.cz"
|
17
17
|
s.extra_rdoc_files = [
|
@@ -44,6 +44,7 @@ Gem::Specification.new do |s|
|
|
44
44
|
"lib/sidekiq/cron/web.rb",
|
45
45
|
"lib/sidekiq/cron/web_extension.rb",
|
46
46
|
"sidekiq-cron.gemspec",
|
47
|
+
"test/integration/performance_test.rb",
|
47
48
|
"test/test_helper.rb",
|
48
49
|
"test/unit/job_test.rb",
|
49
50
|
"test/unit/poller_test.rb",
|
@@ -60,9 +61,9 @@ Gem::Specification.new do |s|
|
|
60
61
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
61
62
|
s.add_runtime_dependency(%q<sidekiq>, [">= 4.2.1"])
|
62
63
|
s.add_runtime_dependency(%q<rufus-scheduler>, [">= 3.3.0"])
|
63
|
-
s.add_runtime_dependency(%q<redis-namespace>, [">= 1.5.2"])
|
64
64
|
s.add_development_dependency(%q<bundler>, [">= 0"])
|
65
65
|
s.add_development_dependency(%q<simplecov>, [">= 0"])
|
66
|
+
s.add_development_dependency(%q<redis-namespace>, [">= 1.5.2"])
|
66
67
|
s.add_development_dependency(%q<shoulda-context>, [">= 0"])
|
67
68
|
s.add_development_dependency(%q<rack>, [">= 0"])
|
68
69
|
s.add_development_dependency(%q<rack-test>, [">= 0"])
|
@@ -78,9 +79,9 @@ Gem::Specification.new do |s|
|
|
78
79
|
else
|
79
80
|
s.add_dependency(%q<sidekiq>, [">= 4.2.1"])
|
80
81
|
s.add_dependency(%q<rufus-scheduler>, [">= 3.3.0"])
|
81
|
-
s.add_dependency(%q<redis-namespace>, [">= 1.5.2"])
|
82
82
|
s.add_dependency(%q<bundler>, [">= 0"])
|
83
83
|
s.add_dependency(%q<simplecov>, [">= 0"])
|
84
|
+
s.add_dependency(%q<redis-namespace>, [">= 1.5.2"])
|
84
85
|
s.add_dependency(%q<shoulda-context>, [">= 0"])
|
85
86
|
s.add_dependency(%q<rack>, [">= 0"])
|
86
87
|
s.add_dependency(%q<rack-test>, [">= 0"])
|
@@ -97,9 +98,9 @@ Gem::Specification.new do |s|
|
|
97
98
|
else
|
98
99
|
s.add_dependency(%q<sidekiq>, [">= 4.2.1"])
|
99
100
|
s.add_dependency(%q<rufus-scheduler>, [">= 3.3.0"])
|
100
|
-
s.add_dependency(%q<redis-namespace>, [">= 1.5.2"])
|
101
101
|
s.add_dependency(%q<bundler>, [">= 0"])
|
102
102
|
s.add_dependency(%q<simplecov>, [">= 0"])
|
103
|
+
s.add_dependency(%q<redis-namespace>, [">= 1.5.2"])
|
103
104
|
s.add_dependency(%q<shoulda-context>, [">= 0"])
|
104
105
|
s.add_dependency(%q<rack>, [">= 0"])
|
105
106
|
s.add_dependency(%q<rack-test>, [">= 0"])
|
@@ -0,0 +1,52 @@
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
2
|
+
require './test/test_helper'
|
3
|
+
require 'benchmark'
|
4
|
+
|
5
|
+
describe 'Perfromance Poller' do
|
6
|
+
X = 10000
|
7
|
+
before do
|
8
|
+
Sidekiq.redis = REDIS
|
9
|
+
Sidekiq.redis do |conn|
|
10
|
+
conn.flushdb
|
11
|
+
end
|
12
|
+
|
13
|
+
#clear all previous saved data from redis
|
14
|
+
Sidekiq.redis do |conn|
|
15
|
+
conn.keys("cron_job*").each do |key|
|
16
|
+
conn.del(key)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
args = {
|
21
|
+
queue: "default",
|
22
|
+
cron: "*/2 * * * *",
|
23
|
+
klass: "CronTestClass"
|
24
|
+
}
|
25
|
+
|
26
|
+
X.times do |i|
|
27
|
+
Sidekiq::Cron::Job.create(args.merge(name: "Test#{i}"))
|
28
|
+
end
|
29
|
+
|
30
|
+
@poller = Sidekiq::Cron::Poller.new
|
31
|
+
now = Time.now.utc
|
32
|
+
enqueued_time = Time.new(now.year, now.month, now.day, now.hour + 1, 10, 5)
|
33
|
+
Time.stubs(:now).returns(enqueued_time)
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'should enqueue 10000 jobs in less than 30s' do
|
37
|
+
Sidekiq.redis do |conn|
|
38
|
+
assert_equal 0, conn.llen("queue:default"), 'Queue should be empty'
|
39
|
+
end
|
40
|
+
|
41
|
+
bench = Benchmark.measure {
|
42
|
+
@poller.enqueue
|
43
|
+
}
|
44
|
+
|
45
|
+
Sidekiq.redis do |conn|
|
46
|
+
assert_equal X, conn.llen("queue:default"), 'Queue should be full'
|
47
|
+
end
|
48
|
+
|
49
|
+
puts "Perfomance test finished in #{bench.real}"
|
50
|
+
assert_operator 30, :>, bench.real
|
51
|
+
end
|
52
|
+
end
|
@@ -66,6 +66,14 @@ describe 'Cron web' do
|
|
66
66
|
@cron_job_name = "TesQueueNameOfCronJob"
|
67
67
|
end
|
68
68
|
|
69
|
+
it "disable and enable all cron jobs" do
|
70
|
+
post "/cron/__all__/disable"
|
71
|
+
assert_equal Sidekiq::Cron::Job.find(@name).status, "disabled"
|
72
|
+
|
73
|
+
post "/cron/__all__/enable"
|
74
|
+
assert_equal Sidekiq::Cron::Job.find(@name).status, "enabled"
|
75
|
+
end
|
76
|
+
|
69
77
|
it "disable and enable cron job" do
|
70
78
|
post "/cron/#{@name}/disable"
|
71
79
|
assert_equal Sidekiq::Cron::Job.find(@name).status, "disabled"
|
@@ -74,6 +82,19 @@ describe 'Cron web' do
|
|
74
82
|
assert_equal Sidekiq::Cron::Job.find(@name).status, "enabled"
|
75
83
|
end
|
76
84
|
|
85
|
+
it "enqueue all jobs" do
|
86
|
+
Sidekiq.redis do |conn|
|
87
|
+
assert_equal 0, conn.llen("queue:default"), "Queue should have no jobs"
|
88
|
+
end
|
89
|
+
|
90
|
+
post "/cron/__all__/enque"
|
91
|
+
|
92
|
+
Sidekiq.redis do |conn|
|
93
|
+
assert_equal 1, conn.llen("queue:default"), "Queue should have 1 job in default"
|
94
|
+
assert_equal 1, conn.llen("queue:cron"), "Queue should have 1 job in cron"
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
77
98
|
it "enqueue job" do
|
78
99
|
Sidekiq.redis do |conn|
|
79
100
|
assert_equal 0, conn.llen("queue:default"), "Queue should have no jobs"
|
@@ -106,5 +127,11 @@ describe 'Cron web' do
|
|
106
127
|
post "/cron/#{@cron_job_name}/delete"
|
107
128
|
assert_equal Sidekiq::Cron::Job.all.size, 0, "Should have zero jobs"
|
108
129
|
end
|
130
|
+
|
131
|
+
it "destroy all jobs" do
|
132
|
+
assert_equal Sidekiq::Cron::Job.all.size, 2, "Should have 2 job"
|
133
|
+
post "/cron/__all__/delete"
|
134
|
+
assert_equal Sidekiq::Cron::Job.all.size, 0, "Should have zero jobs"
|
135
|
+
end
|
109
136
|
end
|
110
137
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sidekiq-cron
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ondrej Bartas
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-04-
|
11
|
+
date: 2017-04-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sidekiq
|
@@ -39,21 +39,21 @@ dependencies:
|
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 3.3.0
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
|
-
name:
|
42
|
+
name: bundler
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
48
|
-
type: :
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
54
|
+
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
|
-
name:
|
56
|
+
name: simplecov
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - ">="
|
@@ -67,19 +67,19 @@ dependencies:
|
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
70
|
+
name: redis-namespace
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - ">="
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version:
|
75
|
+
version: 1.5.2
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - ">="
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version:
|
82
|
+
version: 1.5.2
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: shoulda-context
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -281,6 +281,7 @@ files:
|
|
281
281
|
- lib/sidekiq/cron/web.rb
|
282
282
|
- lib/sidekiq/cron/web_extension.rb
|
283
283
|
- sidekiq-cron.gemspec
|
284
|
+
- test/integration/performance_test.rb
|
284
285
|
- test/test_helper.rb
|
285
286
|
- test/unit/job_test.rb
|
286
287
|
- test/unit/poller_test.rb
|