sqeduler 0.2.0 → 0.2.2

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: 952cafb156a1da8df0f3bece128b8578e4f83e97
4
- data.tar.gz: 21f4293a4f7f5a5d03a316d29b6a483c6f0a9094
3
+ metadata.gz: 510d5754df3875e36f052b971668cf58ccdcdde1
4
+ data.tar.gz: dd0b216fe36b27a4df8f76dbd243e4f088b45fe8
5
5
  SHA512:
6
- metadata.gz: 0dcd6a303e7b45925f053f96a9ab12ce511d41309c5df2256e54bba1d9fb48b8184db844c72b0e61b910716a34d447bb14070e7eeeff8e069e676f42c730ca7c
7
- data.tar.gz: 5f97beb03984fafe2ab8e536f1e1d382f544f19908f6af8fd7ef4e42e41864ffd516a98bb8a484d611e9e4f9701253c28132ab08df5a4ac4bfef172f8e3b0e58
6
+ metadata.gz: 64eb353667433b507b725db2b9b92adc5dde0ec71a140ddc640a5c74a52f42dcbfa1dc63ddeba27b4c8ebd0b188711e5256cac9f89d2edd45cff0f5d635d1e7c
7
+ data.tar.gz: 1e7cde947da623040ee8f07218fc7b02be92b0c4bec6f54b9688068fc662b090eaadd8f6a3e8466493244aa43ed9e395f552be5443f3dee36bb13a19857c43e0
data/.rubocop.yml CHANGED
@@ -1,6 +1,10 @@
1
1
  Lint/EndAlignment:
2
2
  AlignWith: variable
3
3
 
4
+ # Setting off false-positives :(
5
+ Lint/UnneededDisable:
6
+ Enabled: false
7
+
4
8
  Metrics/AbcSize:
5
9
  Enabled: false
6
10
 
data/.travis.yml CHANGED
@@ -4,3 +4,4 @@ rvm:
4
4
  - 2.2
5
5
  services:
6
6
  - redis-server
7
+ before_install: gem update bundler
data/CHANGES.md CHANGED
@@ -1,4 +1,13 @@
1
- ### 0.1.0 / 2015-01-11
1
+ ### 0.2.2 / 2015-11-11
2
2
 
3
- * Initial release:
3
+ * Support ERB in job schedules
4
+ * Handle exceptions more gracefully in lock acquisition
4
5
 
6
+ ### 0.2.0 / 2015-04-18
7
+
8
+ * Add KillSwitch middleware
9
+ * Cleanup
10
+
11
+ ### 0.1.4 / 2015-03-26
12
+
13
+ * Initial release
data/Gemfile CHANGED
@@ -1,8 +1,6 @@
1
1
  # encoding: utf-8
2
2
  source "https://www.rubygems.org"
3
3
 
4
- gem "sidekiq-scheduler", :github => "ecin/sidekiq-scheduler", :branch => "ecin/redis-lock" # https://github.com/Moove-it/sidekiq-scheduler/pull/38
5
-
6
4
  gemspec
7
5
 
8
6
  group :development do
data/Rakefile CHANGED
@@ -1,5 +1,7 @@
1
1
  # encoding: utf-8
2
2
 
3
+ require "bundler/gem_tasks"
4
+
3
5
  require "rspec/core/rake_task"
4
6
  RSpec::Core::RakeTask.new
5
7
 
@@ -73,12 +73,18 @@ module Sqeduler
73
73
  ::Sidekiq::Scheduler.rufus_scheduler_options = {
74
74
  :trigger_lock => TriggerLock.new
75
75
  }
76
- ::Sidekiq.schedule = YAML.load_file(config.schedule_path)
76
+ ::Sidekiq.schedule = parse_schedule(config.schedule_path)
77
77
  else
78
78
  logger.warn "No schedule_path provided. Not starting Sidekiq::Scheduler."
79
79
  end
80
80
  end
81
81
 
82
+ def parse_schedule(path)
83
+ fail "Schedule file #{path} does not exist!" unless File.exist?(path)
84
+ file_contents = File.read(path)
85
+ YAML.load(ERB.new(file_contents).result)
86
+ end
87
+
82
88
  def scheduling?
83
89
  !config.schedule_path.to_s.empty?
84
90
  end
@@ -15,6 +15,8 @@ module Sqeduler
15
15
  # - return true if already acquired
16
16
  # - refresh the lock if already acquired
17
17
  refresh || super
18
+ rescue
19
+ false
18
20
  end
19
21
  end
20
22
  end
@@ -1,4 +1,4 @@
1
1
  # encoding: utf-8
2
2
  module Sqeduler
3
- VERSION = "0.2.0"
3
+ VERSION = "0.2.2"
4
4
  end
@@ -93,7 +93,7 @@ module Sqeduler
93
93
 
94
94
  # rubocop:disable Metrics/AbcSize
95
95
  def time_duration(timespan)
96
- rest, secs = timespan.divmod(60) # self is the time difference t2 - t1
96
+ rest, secs = timespan.divmod(60) # self is the time difference t2 - t1
97
97
  rest, mins = rest.divmod(60)
98
98
  days, hours = rest.divmod(24)
99
99
 
@@ -1,2 +1,2 @@
1
1
  FakeWorker:
2
- every: 5s
2
+ every: <%=5%>s
data/spec/service_spec.rb CHANGED
@@ -55,7 +55,11 @@ RSpec.describe Sqeduler::Service do
55
55
 
56
56
  context "a schedule_path is provided" do
57
57
  it "starts the scheduler" do
58
- expect(Sidekiq).to receive(:"schedule=").with(YAML.load_file(schedule_filepath))
58
+ expect(Sidekiq).to receive(:"schedule=").with(
59
+ "FakeWorker" => {
60
+ "every" => "5s"
61
+ }
62
+ )
59
63
  subject
60
64
  expect(Sidekiq::Scheduler.rufus_scheduler_options).to have_key(:trigger_lock)
61
65
  expect(Sidekiq::Scheduler.rufus_scheduler_options[:trigger_lock]).to be_kind_of(
@@ -67,7 +71,11 @@ RSpec.describe Sqeduler::Service do
67
71
  let(:schedule_filepath) { "./spec/fixtures/schedule.yaml" }
68
72
 
69
73
  it "starts the scheduler" do
70
- expect(Sidekiq).to receive(:"schedule=").with(YAML.load_file(schedule_filepath))
74
+ expect(Sidekiq).to receive(:"schedule=").with(
75
+ "FakeWorker" => {
76
+ "every" => "5s"
77
+ }
78
+ )
71
79
  subject
72
80
  expect(Sidekiq::Scheduler.rufus_scheduler_options).to have_key(:trigger_lock)
73
81
  expect(Sidekiq::Scheduler.rufus_scheduler_options[:trigger_lock]).to be_kind_of(
@@ -76,5 +76,11 @@ RSpec.describe Sqeduler::TriggerLock do
76
76
  expect(trigger_lock_2.locked?).to be(true)
77
77
  expect(trigger_lock_1.unlock).to be(false)
78
78
  end
79
+
80
+ it "should not acquire the lock if there is an error" do
81
+ allow(trigger_lock_1).to receive(:refresh_lock).and_raise("boom")
82
+ expect(trigger_lock_1.lock).to be false
83
+ expect(trigger_lock_1.locked?).to be false
84
+ end
79
85
  end
80
86
  end
data/spec/worker_spec.rb CHANGED
@@ -43,14 +43,15 @@ RSpec.describe Sqeduler::Worker do
43
43
  let(:expiration) { work_time * 4 }
44
44
  let(:work_time) { 0.1 }
45
45
 
46
- subject do
47
- threads = []
48
- threads << Thread.new { FakeWorker.new.perform(work_time) }
49
- threads << Thread.new do
46
+ def run_synchronized_workers
47
+ worker1 = Thread.new do
48
+ FakeWorker.new.perform(work_time)
49
+ end
50
+ worker2 = Thread.new do
50
51
  sleep wait_time
51
52
  FakeWorker.new.perform(work_time)
52
53
  end
53
- threads.each(&:join)
54
+ worker1.join && worker2.join
54
55
  end
55
56
 
56
57
  context "overlapping schedule" do
@@ -60,32 +61,32 @@ RSpec.describe Sqeduler::Worker do
60
61
  let(:timeout) { work_time / 2 }
61
62
 
62
63
  it "one worker should be blocked" do
63
- subject
64
+ run_synchronized_workers
64
65
  verify_callback_occured(FakeWorker::JOB_LOCK_FAILURE_PATH)
65
66
  end
66
67
 
67
68
  it "only one worker should run" do
68
- subject
69
+ run_synchronized_workers
69
70
  verify_callback_occured(FakeWorker::JOB_RUN_PATH)
70
71
  end
71
72
 
72
73
  it "one worker should succeed" do
73
- subject
74
+ run_synchronized_workers
74
75
  verify_callback_occured(FakeWorker::JOB_SUCCESS_PATH, 2)
75
76
  end
76
77
 
77
78
  it "no worker should fail" do
78
- subject
79
+ run_synchronized_workers
79
80
  verify_callback_skipped(FakeWorker::JOB_FAILURE_PATH)
80
81
  end
81
82
 
82
83
  it "all workers should have received before_start" do
83
- subject
84
+ run_synchronized_workers
84
85
  verify_callback_occured(FakeWorker::JOB_BEFORE_START_PATH, 2)
85
86
  end
86
87
 
87
88
  it "a schedule collision should not have occurred" do
88
- subject
89
+ run_synchronized_workers
89
90
  verify_callback_skipped(FakeWorker::SCHEDULE_COLLISION_PATH)
90
91
  end
91
92
  end
@@ -94,27 +95,27 @@ RSpec.describe Sqeduler::Worker do
94
95
  let(:timeout) { work_time * 4 }
95
96
 
96
97
  it "no worker should be blocked" do
97
- subject
98
+ run_synchronized_workers
98
99
  verify_callback_skipped(FakeWorker::JOB_LOCK_FAILURE_PATH)
99
100
  end
100
101
 
101
102
  it "both workers should succeed" do
102
- subject
103
+ run_synchronized_workers
103
104
  verify_callback_occured(FakeWorker::JOB_SUCCESS_PATH, 2)
104
105
  end
105
106
 
106
107
  it "no worker should fail" do
107
- subject
108
+ run_synchronized_workers
108
109
  verify_callback_skipped(FakeWorker::JOB_FAILURE_PATH)
109
110
  end
110
111
 
111
112
  it "all workers should have received before_start" do
112
- subject
113
+ run_synchronized_workers
113
114
  verify_callback_occured(FakeWorker::JOB_BEFORE_START_PATH, 2)
114
115
  end
115
116
 
116
117
  it "a schedule collision should not have occurred" do
117
- subject
118
+ run_synchronized_workers
118
119
  verify_callback_skipped(FakeWorker::SCHEDULE_COLLISION_PATH)
119
120
  end
120
121
 
@@ -122,28 +123,28 @@ RSpec.describe Sqeduler::Worker do
122
123
  let(:expiration) { work_time / 2 }
123
124
 
124
125
  it "no worker should be blocked" do
125
- subject
126
+ run_synchronized_workers
126
127
  verify_callback_skipped(FakeWorker::JOB_LOCK_FAILURE_PATH)
127
128
  end
128
129
 
129
130
  it "all workers should run" do
130
- subject
131
+ run_synchronized_workers
131
132
  verify_callback_occured(FakeWorker::JOB_RUN_PATH, 2)
132
133
  end
133
134
 
134
135
  it "all workers should have received before_start" do
135
- subject
136
+ run_synchronized_workers
136
137
  verify_callback_occured(FakeWorker::JOB_BEFORE_START_PATH, 2)
137
138
  end
138
139
 
139
140
  it "no worker should fail" do
140
- subject
141
+ run_synchronized_workers
141
142
  verify_callback_occured(FakeWorker::JOB_SUCCESS_PATH, 2)
142
143
  verify_callback_skipped(FakeWorker::JOB_FAILURE_PATH)
143
144
  end
144
145
 
145
146
  it "a schedule collision should occur" do
146
- subject
147
+ run_synchronized_workers
147
148
  verify_callback_occured(FakeWorker::SCHEDULE_COLLISION_PATH, 2)
148
149
  end
149
150
  end
@@ -157,28 +158,28 @@ RSpec.describe Sqeduler::Worker do
157
158
  let(:timeout) { work_time }
158
159
 
159
160
  it "no workers should be blocked" do
160
- subject
161
+ run_synchronized_workers
161
162
  verify_callback_skipped(FakeWorker::JOB_LOCK_FAILURE_PATH)
162
163
  end
163
164
 
164
165
  it "all workers should run" do
165
- subject
166
+ run_synchronized_workers
166
167
  verify_callback_occured(FakeWorker::JOB_RUN_PATH, 2)
167
168
  end
168
169
 
169
170
  it "no worker should fail" do
170
- subject
171
+ run_synchronized_workers
171
172
  verify_callback_occured(FakeWorker::JOB_SUCCESS_PATH, 2)
172
173
  verify_callback_skipped(FakeWorker::JOB_FAILURE_PATH)
173
174
  end
174
175
 
175
176
  it "all workers should have received before_start" do
176
- subject
177
+ run_synchronized_workers
177
178
  verify_callback_occured(FakeWorker::JOB_BEFORE_START_PATH, 2)
178
179
  end
179
180
 
180
181
  it "a schedule collision should not have occurred" do
181
- subject
182
+ run_synchronized_workers
182
183
  verify_callback_skipped(FakeWorker::SCHEDULE_COLLISION_PATH)
183
184
  end
184
185
  end
@@ -187,22 +188,22 @@ RSpec.describe Sqeduler::Worker do
187
188
  let(:timeout) { work_time * 2 }
188
189
 
189
190
  it "no worker should be blocked" do
190
- subject
191
+ run_synchronized_workers
191
192
  verify_callback_skipped(FakeWorker::JOB_LOCK_FAILURE_PATH)
192
193
  end
193
194
 
194
195
  it "both workers should succeed" do
195
- subject
196
+ run_synchronized_workers
196
197
  verify_callback_occured(FakeWorker::JOB_SUCCESS_PATH, 2)
197
198
  end
198
199
 
199
200
  it "no worker should fail" do
200
- subject
201
+ run_synchronized_workers
201
202
  verify_callback_skipped(FakeWorker::JOB_FAILURE_PATH)
202
203
  end
203
204
 
204
205
  it "all workers should have received before_start" do
205
- subject
206
+ run_synchronized_workers
206
207
  verify_callback_occured(FakeWorker::JOB_BEFORE_START_PATH, 2)
207
208
  end
208
209
 
@@ -210,28 +211,28 @@ RSpec.describe Sqeduler::Worker do
210
211
  let(:expiration) { work_time / 2 }
211
212
 
212
213
  it "no worker should be blocked" do
213
- subject
214
+ run_synchronized_workers
214
215
  verify_callback_skipped(FakeWorker::JOB_LOCK_FAILURE_PATH)
215
216
  end
216
217
 
217
218
  it "all workers should run" do
218
- subject
219
+ run_synchronized_workers
219
220
  verify_callback_occured(FakeWorker::JOB_RUN_PATH, 2)
220
221
  end
221
222
 
222
223
  it "all workers should have received before_start" do
223
- subject
224
+ run_synchronized_workers
224
225
  verify_callback_occured(FakeWorker::JOB_BEFORE_START_PATH, 2)
225
226
  end
226
227
 
227
228
  it "no worker should fail" do
228
- subject
229
+ run_synchronized_workers
229
230
  verify_callback_occured(FakeWorker::JOB_SUCCESS_PATH, 2)
230
231
  verify_callback_skipped(FakeWorker::JOB_FAILURE_PATH)
231
232
  end
232
233
 
233
234
  it "a schedule collision should occur" do
234
- subject
235
+ run_synchronized_workers
235
236
  verify_callback_occured(FakeWorker::SCHEDULE_COLLISION_PATH, 2)
236
237
  end
237
238
  end
data/sqeduler.gemspec CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |gem|
10
10
  multiple hosts. Also provides a convenient abstract class for Sidekiq workers.
11
11
  DESC
12
12
  gem.license = "Apache"
13
- gem.authors = '["Jared Jenkins"]'
13
+ gem.authors = ["Jared Jenkins"]
14
14
  gem.email = "jaredjenkins@squareup.com"
15
15
  gem.homepage = "https://rubygems.org/gems/sqeduler"
16
16
 
@@ -20,13 +20,13 @@ Gem::Specification.new do |gem|
20
20
  gem.require_paths = ["lib"]
21
21
 
22
22
  gem.add_runtime_dependency "sidekiq"
23
- gem.add_runtime_dependency "sidekiq-scheduler"
23
+ gem.add_runtime_dependency "sidekiq-scheduler", "~> 1.1"
24
24
  gem.add_runtime_dependency "activesupport"
25
25
 
26
- gem.add_development_dependency "bundler", "~> 1.7"
26
+ gem.add_development_dependency "bundler", "~> 1.10"
27
27
  gem.add_development_dependency "pry", "~> 0"
28
28
  gem.add_development_dependency "rake", "~> 10"
29
- gem.add_development_dependency "rspec", "~> 3"
29
+ gem.add_development_dependency "rspec", "~> 3.3"
30
30
  gem.add_development_dependency "rubocop", "~> 0.24"
31
31
  gem.add_development_dependency "timecop", "~> 0"
32
32
  gem.add_development_dependency "yard", "~> 0"
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.2.0
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
- - '["Jared Jenkins"]'
7
+ - Jared Jenkins
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-23 00:00:00.000000000 Z
11
+ date: 2015-11-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sidekiq
@@ -28,16 +28,16 @@ dependencies:
28
28
  name: sidekiq-scheduler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: '1.1'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
38
+ - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '0'
40
+ version: '1.1'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: activesupport
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -58,14 +58,14 @@ dependencies:
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '1.7'
61
+ version: '1.10'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: '1.7'
68
+ version: '1.10'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: pry
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -100,14 +100,14 @@ dependencies:
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: '3'
103
+ version: '3.3'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: '3'
110
+ version: '3.3'
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: rubocop
113
113
  requirement: !ruby/object:Gem::Requirement
@@ -216,7 +216,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
216
216
  version: '0'
217
217
  requirements: []
218
218
  rubyforge_project:
219
- rubygems_version: 2.4.5
219
+ rubygems_version: 2.5.0
220
220
  signing_key:
221
221
  specification_version: 4
222
222
  summary: Common Sidekiq infrastructure for multi-host applications.