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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a64cee1c9810e71e1f579df8e1a6a57b2f6b3f63
4
- data.tar.gz: d1b27b846003b95fbc8d46cca571ea84f4924e1a
3
+ metadata.gz: 952cafb156a1da8df0f3bece128b8578e4f83e97
4
+ data.tar.gz: 21f4293a4f7f5a5d03a316d29b6a483c6f0a9094
5
5
  SHA512:
6
- metadata.gz: 68767817edc816cbe2f72cc09b1df71e6df7700be3c9de3946d4cc39a47cef0d2b9f7b0bfb7fae1708dd653deb9d94ca287aadd2b294e5159fedc010d9f40bb6
7
- data.tar.gz: 7c2980641c62840d39711f9a98c09aa60f81aa8ab43357ae3ae6c9a4fa7e39e168ddef7602cde5ede14d1e10b231fb512096b367c2f4b4eb640bda103fe9f682
6
+ metadata.gz: 0dcd6a303e7b45925f053f96a9ab12ce511d41309c5df2256e54bba1d9fb48b8184db844c72b0e61b910716a34d447bb14070e7eeeff8e069e676f42c730ca7c
7
+ data.tar.gz: 5f97beb03984fafe2ab8e536f1e1d382f544f19908f6af8fd7ef4e42e41864ffd516a98bb8a484d611e9e4f9701253c28132ab08df5a4ac4bfef172f8e3b0e58
data/.gitignore CHANGED
@@ -3,4 +3,4 @@
3
3
  /Gemfile.lock
4
4
  /doc/
5
5
  /pkg/
6
- /vendor/cache/*.gem
6
+ *.gem
data/.rubocop.yml CHANGED
@@ -1,10 +1,9 @@
1
- AllCops:
2
- RunRailsCops: true
3
- DisplayCopNames: true
4
-
5
1
  Lint/EndAlignment:
6
2
  AlignWith: variable
7
3
 
4
+ Metrics/AbcSize:
5
+ Enabled: false
6
+
8
7
  Metrics/ClassLength:
9
8
  Max: 150
10
9
 
@@ -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
@@ -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
 
@@ -1,4 +1,4 @@
1
1
  # encoding: utf-8
2
2
  module Sqeduler
3
- VERSION = "0.1.4"
3
+ VERSION = "0.2.0"
4
4
  end
@@ -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.new.utc} in process ID #{Process.pid}"
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.new.utc}. Total time #{total_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
@@ -3,7 +3,8 @@ require_relative "fake_worker"
3
3
 
4
4
  REDIS_CONFIG = {
5
5
  :host => "localhost",
6
- :db => 1
6
+ :db => 1,
7
+ :namespace => "sqeduler-tests"
7
8
  }
8
9
  Sidekiq.logger = Logger.new(STDOUT).tap { |l| l.level = Logger::DEBUG }
9
10
 
@@ -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.new
24
- while (Time.new - start) < timeout
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
@@ -15,7 +15,7 @@ Timecop.safe_mode = true
15
15
  RSpec.configure do |config|
16
16
  config.before(:each) do
17
17
  TEST_REDIS.flushdb
18
+ Sqeduler::Service.config = nil
18
19
  end
19
-
20
20
  config.disable_monkey_patching!
21
21
  end
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
- def verify_callback_occured(file_path, times = 1)
6
- expect(File).to exist(file_path)
7
- expect(File.read(file_path).length).to eq(times)
8
- end
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
- expect(File).to_not exist(file_path)
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
- File.delete(file_path) if File.exist?(file_path)
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(/^bin\//).map { |f| File.basename(f) }
19
- gem.test_files = gem.files.grep(/^(test|spec|features)\//)
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.1.4
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-03-27 00:00:00.000000000 Z
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.6
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