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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 14e517dfc5120f0566a60c0aa5a3b8e68d714dca
4
- data.tar.gz: d68e25c487348b2c473b854d3c2d70c31a17dc56
3
+ metadata.gz: b058d0c5b73a34aed14caeb7f42f28160211d85c
4
+ data.tar.gz: 63e67fe94aca427cb37924ef6510e255f3525a85
5
5
  SHA512:
6
- metadata.gz: f75f115a12fff61f49b0f5e659c61ddb32307f6cbcf95768b4264b036889897ece81084edc79cad35b8424eb5da8732e55ce40cc32eb85fedbf27134a1bc5150
7
- data.tar.gz: 1326115dd62fce5b842fed9fde09dcadc9fe917169a038c8309777524526dffc67d2945b36f6fadc72f965b0f312c62ad950c6016094cc535dd68e946d12ff66
6
+ metadata.gz: cbf9eb136c8490a8d8eabd88fd4709df9f157835bf5ca4decf8b847f458efed8fb148b296b268c051ad5679187f6cf70df5d6482e1c113a0ece9ad5214690a76
7
+ data.tar.gz: 64baadd70d279c95b8d2381b29cd4c0f9f9097166a47f0f1b4a9cac5130943ee8041ec34b2fcdc00608fa924dfa9c6b0c5f760b169315fb5039b2c8fd81c819e
data/.travis.yml CHANGED
@@ -1,8 +1,6 @@
1
1
  language: ruby
2
2
  rvm:
3
- - jruby-19mode
4
- - rbx-19mode
5
- - 2.0.0
3
+ - 2.3.1
6
4
  - 2.2.2
7
5
  services:
8
6
  - redis-server
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.5.1
1
+ 0.6.0
@@ -68,7 +68,7 @@ module Sidekiq
68
68
  end
69
69
  end
70
70
 
71
- save
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
@@ -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='span5 col-sm-5'>
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
- .span5
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 job = Sidekiq::Cron::Job.find(route_params[:name])
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 job = Sidekiq::Cron::Job.find(route_params[:name])
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 job = Sidekiq::Cron::Job.find(route_params[:name])
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 job = Sidekiq::Cron::Job.find(route_params[:name])
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.1 ruby lib
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.5.1"
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-13"
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.5.1
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-13 00:00:00.000000000 Z
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: redis-namespace
42
+ name: bundler
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: 1.5.2
48
- type: :runtime
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: 1.5.2
54
+ version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: bundler
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: simplecov
70
+ name: redis-namespace
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - ">="
74
74
  - !ruby/object:Gem::Version
75
- version: '0'
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: '0'
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