sqeduler 0.1.4 → 0.2.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/.gitignore +1 -1
- data/.rubocop.yml +3 -4
- data/lib/sqeduler/middleware/kill_switch.rb +34 -0
- data/lib/sqeduler/service.rb +9 -0
- data/lib/sqeduler/version.rb +1 -1
- data/lib/sqeduler/worker/callbacks.rb +2 -2
- data/lib/sqeduler.rb +2 -0
- data/spec/fixtures/env.rb +2 -1
- data/spec/integration_spec.rb +6 -6
- data/spec/middleware/kill_switch_spec.rb +87 -0
- data/spec/spec_helper.rb +1 -1
- data/spec/worker_spec.rb +11 -11
- data/sqeduler.gemspec +2 -2
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 952cafb156a1da8df0f3bece128b8578e4f83e97
|
4
|
+
data.tar.gz: 21f4293a4f7f5a5d03a316d29b6a483c6f0a9094
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0dcd6a303e7b45925f053f96a9ab12ce511d41309c5df2256e54bba1d9fb48b8184db844c72b0e61b910716a34d447bb14070e7eeeff8e069e676f42c730ca7c
|
7
|
+
data.tar.gz: 5f97beb03984fafe2ab8e536f1e1d382f544f19908f6af8fd7ef4e42e41864ffd516a98bb8a484d611e9e4f9701253c28132ab08df5a4ac4bfef172f8e3b0e58
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
@@ -0,0 +1,34 @@
|
|
1
|
+
require "active_support/inflector/methods"
|
2
|
+
|
3
|
+
module Sqeduler
|
4
|
+
module Middleware
|
5
|
+
# Verifies that a worker class is enabled before pushing the job into Redis.
|
6
|
+
# Prevents disabled jobs from getting enqueued. To disable a worker, use
|
7
|
+
# Sqeduler::Worker::KillSwitch.
|
8
|
+
class KillSwitch
|
9
|
+
def call(worker, _msg, _queue, _redis_pool)
|
10
|
+
worker_klass = normalized_worker_klass(worker)
|
11
|
+
if worker_enabled?(worker_klass)
|
12
|
+
yield
|
13
|
+
else
|
14
|
+
Service.logger.warn "#{worker_klass.name} is currently disabled. Will not be enqueued."
|
15
|
+
false
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def normalized_worker_klass(worker)
|
20
|
+
# worker_class can be String or a Class
|
21
|
+
# SEE: https://github.com/mperham/sidekiq/wiki/Middleware
|
22
|
+
if worker.is_a?(String)
|
23
|
+
worker.constantize
|
24
|
+
else
|
25
|
+
worker
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def worker_enabled?(worker_klass)
|
30
|
+
!worker_klass.respond_to?(:enabled?) || worker_klass.enabled?
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/lib/sqeduler/service.rb
CHANGED
@@ -39,6 +39,11 @@ module Sqeduler
|
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
42
|
+
# the server can also enqueue jobs
|
43
|
+
config.client_middleware do |chain|
|
44
|
+
chain.add(Sqeduler::Middleware::KillSwitch)
|
45
|
+
end
|
46
|
+
|
42
47
|
Service.config.on_server_start.call(config) if Service.config.on_server_start
|
43
48
|
end
|
44
49
|
end
|
@@ -50,6 +55,10 @@ module Sqeduler
|
|
50
55
|
if Service.config.on_client_start
|
51
56
|
Service.config.on_client_start.call(config)
|
52
57
|
end
|
58
|
+
|
59
|
+
config.client_middleware do |chain|
|
60
|
+
chain.add(Sqeduler::Middleware::KillSwitch)
|
61
|
+
end
|
53
62
|
end
|
54
63
|
end
|
55
64
|
|
data/lib/sqeduler/version.rb
CHANGED
@@ -18,13 +18,13 @@ module Sqeduler
|
|
18
18
|
# provides an oppurtunity to log when the job has started (maybe create a
|
19
19
|
# stateful db record for this job run?)
|
20
20
|
def before_start
|
21
|
-
Service.logger.info "Starting #{self.class.name} at #{Time.
|
21
|
+
Service.logger.info "Starting #{self.class.name} at #{Time.now} in process ID #{Process.pid}"
|
22
22
|
super if defined?(super)
|
23
23
|
end
|
24
24
|
|
25
25
|
# callback for successful run of this job
|
26
26
|
def on_success(total_time)
|
27
|
-
Service.logger.info "#{self.class.name} completed at #{Time.
|
27
|
+
Service.logger.info "#{self.class.name} completed at #{Time.now}. Total time #{total_time}"
|
28
28
|
super if defined?(super)
|
29
29
|
end
|
30
30
|
|
data/lib/sqeduler.rb
CHANGED
@@ -1,10 +1,12 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
+
require "active_support"
|
2
3
|
require "sqeduler/version"
|
3
4
|
require "sqeduler/config"
|
4
5
|
require "sqeduler/redis_scripts"
|
5
6
|
require "sqeduler/lock_value"
|
6
7
|
require "sqeduler/redis_lock"
|
7
8
|
require "sqeduler/trigger_lock"
|
9
|
+
require "sqeduler/middleware/kill_switch"
|
8
10
|
require "sqeduler/service"
|
9
11
|
require "sqeduler/worker/callbacks"
|
10
12
|
require "sqeduler/worker/synchronization"
|
data/spec/fixtures/env.rb
CHANGED
data/spec/integration_spec.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
require "./spec/fixtures/fake_worker"
|
3
3
|
|
4
|
-
def maybe_cleanup_file(file_path)
|
5
|
-
File.delete(file_path) if File.exist?(file_path)
|
6
|
-
end
|
7
|
-
|
8
4
|
RSpec.describe "Sidekiq integration" do
|
5
|
+
def maybe_cleanup_file(file_path)
|
6
|
+
File.delete(file_path) if File.exist?(file_path)
|
7
|
+
end
|
8
|
+
|
9
9
|
before do
|
10
10
|
maybe_cleanup_file(FakeWorker::JOB_RUN_PATH)
|
11
11
|
maybe_cleanup_file(FakeWorker::JOB_SUCCESS_PATH)
|
@@ -20,8 +20,8 @@ RSpec.describe "Sidekiq integration" do
|
|
20
20
|
pid = Process.spawn "bundle exec sidekiq -r #{path}"
|
21
21
|
puts "Spawned process #{pid}"
|
22
22
|
timeout = 30
|
23
|
-
start = Time.
|
24
|
-
while (Time.
|
23
|
+
start = Time.now
|
24
|
+
while (Time.now - start) < timeout
|
25
25
|
break if File.exist?(FakeWorker::JOB_RUN_PATH)
|
26
26
|
sleep 0.5
|
27
27
|
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
RSpec.describe Sqeduler::Middleware::KillSwitch do
|
4
|
+
before do
|
5
|
+
Sqeduler::Service.config = Sqeduler::Config.new(
|
6
|
+
:redis_hash => REDIS_CONFIG,
|
7
|
+
:logger => Logger.new(STDOUT).tap { |l| l.level = Logger::DEBUG }
|
8
|
+
)
|
9
|
+
end
|
10
|
+
|
11
|
+
describe "#call" do
|
12
|
+
shared_examples_for "job is enqueued" do
|
13
|
+
it "should enqueue the job" do
|
14
|
+
expect do |b|
|
15
|
+
described_class.new.call(worker_klass, nil, nil, nil, &b)
|
16
|
+
end.to yield_control
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
shared_examples_for "job is not enqueued" do
|
21
|
+
it "should not enqueue the job" do
|
22
|
+
expect do |b|
|
23
|
+
described_class.new.call(worker_klass, nil, nil, nil, &b)
|
24
|
+
end.to_not yield_control
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
let(:worker_klass) { MyWorker }
|
29
|
+
|
30
|
+
context "job does not prepend KillSwitch" do
|
31
|
+
before do
|
32
|
+
stub_const(
|
33
|
+
"MyWorker",
|
34
|
+
Class.new do
|
35
|
+
include Sidekiq::Worker
|
36
|
+
def perform; end
|
37
|
+
end
|
38
|
+
)
|
39
|
+
end
|
40
|
+
|
41
|
+
it_behaves_like "job is enqueued"
|
42
|
+
|
43
|
+
context "worker_klass is a string" do
|
44
|
+
let(:worker_klass) { "MyWorker" }
|
45
|
+
|
46
|
+
it_behaves_like "job is enqueued"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
context "job prepends KillSwitch" do
|
51
|
+
before do
|
52
|
+
stub_const(
|
53
|
+
"MyWorker",
|
54
|
+
Class.new do
|
55
|
+
include Sidekiq::Worker
|
56
|
+
prepend Sqeduler::Worker::KillSwitch
|
57
|
+
def perform; end
|
58
|
+
end
|
59
|
+
)
|
60
|
+
end
|
61
|
+
|
62
|
+
context "job is disabled" do
|
63
|
+
before { MyWorker.disable }
|
64
|
+
|
65
|
+
it_behaves_like "job is not enqueued"
|
66
|
+
|
67
|
+
context "worker_klass is a string" do
|
68
|
+
let(:worker_klass) { "MyWorker" }
|
69
|
+
|
70
|
+
it_behaves_like "job is not enqueued"
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
context "job is enabled" do
|
75
|
+
before { MyWorker.enable }
|
76
|
+
|
77
|
+
it_behaves_like "job is enqueued"
|
78
|
+
|
79
|
+
context "worker_klass is a string" do
|
80
|
+
let(:worker_klass) { "MyWorker" }
|
81
|
+
|
82
|
+
it_behaves_like "job is enqueued"
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
data/spec/spec_helper.rb
CHANGED
data/spec/worker_spec.rb
CHANGED
@@ -2,20 +2,20 @@
|
|
2
2
|
require "spec_helper"
|
3
3
|
require "./spec/fixtures/fake_worker"
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
5
|
+
RSpec.describe Sqeduler::Worker do
|
6
|
+
def verify_callback_occured(file_path, times = 1)
|
7
|
+
expect(File).to exist(file_path)
|
8
|
+
expect(File.read(file_path).length).to eq(times)
|
9
|
+
end
|
9
10
|
|
10
|
-
def verify_callback_skipped(file_path)
|
11
|
-
|
12
|
-
end
|
11
|
+
def verify_callback_skipped(file_path)
|
12
|
+
expect(File).to_not exist(file_path)
|
13
|
+
end
|
13
14
|
|
14
|
-
def maybe_cleanup_file(file_path)
|
15
|
-
|
16
|
-
end
|
15
|
+
def maybe_cleanup_file(file_path)
|
16
|
+
File.delete(file_path) if File.exist?(file_path)
|
17
|
+
end
|
17
18
|
|
18
|
-
RSpec.describe Sqeduler::Worker do
|
19
19
|
before do
|
20
20
|
Sqeduler::Service.config = Sqeduler::Config.new(
|
21
21
|
:redis_hash => REDIS_CONFIG,
|
data/sqeduler.gemspec
CHANGED
@@ -15,8 +15,8 @@ Gem::Specification.new do |gem|
|
|
15
15
|
gem.homepage = "https://rubygems.org/gems/sqeduler"
|
16
16
|
|
17
17
|
gem.files = `git ls-files`.split($RS)
|
18
|
-
gem.executables = gem.files.grep(
|
19
|
-
gem.test_files = gem.files.grep(
|
18
|
+
gem.executables = gem.files.grep(%r{^bin/}).map { |f| File.basename(f) }
|
19
|
+
gem.test_files = gem.files.grep(%r{(test|spec|features)/})
|
20
20
|
gem.require_paths = ["lib"]
|
21
21
|
|
22
22
|
gem.add_runtime_dependency "sidekiq"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sqeduler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- '["Jared Jenkins"]'
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-04-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sidekiq
|
@@ -173,6 +173,7 @@ files:
|
|
173
173
|
- lib/sqeduler.rb
|
174
174
|
- lib/sqeduler/config.rb
|
175
175
|
- lib/sqeduler/lock_value.rb
|
176
|
+
- lib/sqeduler/middleware/kill_switch.rb
|
176
177
|
- lib/sqeduler/redis_lock.rb
|
177
178
|
- lib/sqeduler/redis_scripts.rb
|
178
179
|
- lib/sqeduler/service.rb
|
@@ -187,6 +188,7 @@ files:
|
|
187
188
|
- spec/fixtures/fake_worker.rb
|
188
189
|
- spec/fixtures/schedule.yaml
|
189
190
|
- spec/integration_spec.rb
|
191
|
+
- spec/middleware/kill_switch_spec.rb
|
190
192
|
- spec/service_spec.rb
|
191
193
|
- spec/spec_helper.rb
|
192
194
|
- spec/sqeduler_spec.rb
|
@@ -214,7 +216,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
214
216
|
version: '0'
|
215
217
|
requirements: []
|
216
218
|
rubyforge_project:
|
217
|
-
rubygems_version: 2.4.
|
219
|
+
rubygems_version: 2.4.5
|
218
220
|
signing_key:
|
219
221
|
specification_version: 4
|
220
222
|
summary: Common Sidekiq infrastructure for multi-host applications.
|
@@ -224,6 +226,7 @@ test_files:
|
|
224
226
|
- spec/fixtures/fake_worker.rb
|
225
227
|
- spec/fixtures/schedule.yaml
|
226
228
|
- spec/integration_spec.rb
|
229
|
+
- spec/middleware/kill_switch_spec.rb
|
227
230
|
- spec/service_spec.rb
|
228
231
|
- spec/spec_helper.rb
|
229
232
|
- spec/sqeduler_spec.rb
|