sidetiq 0.3.7 → 0.4.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -0
  3. data/CHANGELOG.md +16 -0
  4. data/LICENSE +2 -2
  5. data/README.md +9 -16
  6. data/Rakefile +2 -7
  7. data/examples/Procfile +2 -0
  8. data/examples/config.ru +15 -0
  9. data/examples/server.rb +17 -0
  10. data/examples/workers/failing.rb +13 -0
  11. data/examples/workers/simple.rb +10 -0
  12. data/lib/sidetiq/actor/clock.rb +31 -0
  13. data/lib/sidetiq/actor/handler.rb +7 -0
  14. data/lib/sidetiq/actor.rb +38 -0
  15. data/lib/sidetiq/api.rb +109 -0
  16. data/lib/sidetiq/clock.rb +3 -118
  17. data/lib/sidetiq/config.rb +8 -0
  18. data/lib/sidetiq/handler.rb +50 -0
  19. data/lib/sidetiq/lock/meta_data.rb +53 -0
  20. data/lib/sidetiq/lock/redis.rb +115 -0
  21. data/lib/sidetiq/lock/watcher.rb +41 -0
  22. data/lib/sidetiq/logging.rb +12 -0
  23. data/lib/sidetiq/middleware/history.rb +58 -0
  24. data/lib/sidetiq/schedulable.rb +6 -7
  25. data/lib/sidetiq/supervisor.rb +50 -0
  26. data/lib/sidetiq/version.rb +6 -3
  27. data/lib/sidetiq/views/_home_nav.erb +16 -0
  28. data/lib/sidetiq/views/_worker_nav.erb +22 -0
  29. data/lib/sidetiq/views/assets/styles.css +36 -0
  30. data/lib/sidetiq/views/history.erb +48 -0
  31. data/lib/sidetiq/views/locks.erb +48 -0
  32. data/lib/sidetiq/views/schedule.erb +59 -0
  33. data/lib/sidetiq/views/sidetiq.erb +39 -28
  34. data/lib/sidetiq/web.rb +36 -16
  35. data/lib/sidetiq.rb +34 -114
  36. data/sidetiq.gemspec +5 -2
  37. data/tasks/bundler.task +1 -0
  38. data/tasks/minitest.task +6 -0
  39. data/test/fixtures/optional_arguments_worker.rb +8 -0
  40. data/test/helper.rb +21 -6
  41. data/test/test_clock.rb +16 -24
  42. data/test/test_history.rb +60 -0
  43. data/test/test_lock_meta_data.rb +90 -0
  44. data/test/test_lock_redis.rb +63 -0
  45. data/test/test_version.rb +2 -1
  46. data/test/test_watcher.rb +24 -0
  47. data/test/test_web.rb +26 -2
  48. metadata +80 -12
  49. data/examples/simple.rb +0 -22
  50. data/lib/sidetiq/lock.rb +0 -63
  51. data/lib/sidetiq/middleware.rb +0 -23
  52. data/lib/sidetiq/views/sidetiq_details.erb +0 -49
  53. data/test/test_lock.rb +0 -30
  54. data/test/test_middleware.rb +0 -18
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sidetiq
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.7
4
+ version: 0.4.0.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tobias Svensson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-08-27 00:00:00.000000000 Z
11
+ date: 2013-09-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sidekiq
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ~>
25
25
  - !ruby/object:Gem::Version
26
26
  version: 2.14.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: celluloid
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: 0.14.1
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: 0.14.1
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: ice_cube
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -38,6 +52,20 @@ dependencies:
38
52
  - - ~>
39
53
  - !ruby/object:Gem::Version
40
54
  version: 0.11.0
55
+ - !ruby/object:Gem::Dependency
56
+ name: json
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
41
69
  - !ruby/object:Gem::Dependency
42
70
  name: rake
43
71
  requirement: !ruby/object:Gem::Requirement
@@ -94,6 +122,20 @@ dependencies:
94
122
  - - '>='
95
123
  - !ruby/object:Gem::Version
96
124
  version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: minitest
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ~>
130
+ - !ruby/object:Gem::Version
131
+ version: 5.0.7
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ~>
137
+ - !ruby/object:Gem::Version
138
+ version: 5.0.7
97
139
  - !ruby/object:Gem::Dependency
98
140
  name: coveralls
99
141
  requirement: !ruby/object:Gem::Requirement
@@ -122,33 +164,56 @@ files:
122
164
  - LICENSE
123
165
  - README.md
124
166
  - Rakefile
125
- - examples/simple.rb
167
+ - examples/Procfile
168
+ - examples/config.ru
169
+ - examples/server.rb
170
+ - examples/workers/failing.rb
171
+ - examples/workers/simple.rb
126
172
  - lib/sidetiq.rb
173
+ - lib/sidetiq/actor.rb
174
+ - lib/sidetiq/actor/clock.rb
175
+ - lib/sidetiq/actor/handler.rb
176
+ - lib/sidetiq/api.rb
127
177
  - lib/sidetiq/clock.rb
128
178
  - lib/sidetiq/config.rb
129
- - lib/sidetiq/lock.rb
130
- - lib/sidetiq/middleware.rb
179
+ - lib/sidetiq/handler.rb
180
+ - lib/sidetiq/lock/meta_data.rb
181
+ - lib/sidetiq/lock/redis.rb
182
+ - lib/sidetiq/lock/watcher.rb
183
+ - lib/sidetiq/logging.rb
184
+ - lib/sidetiq/middleware/history.rb
131
185
  - lib/sidetiq/schedulable.rb
132
186
  - lib/sidetiq/schedule.rb
187
+ - lib/sidetiq/supervisor.rb
133
188
  - lib/sidetiq/version.rb
189
+ - lib/sidetiq/views/_home_nav.erb
190
+ - lib/sidetiq/views/_worker_nav.erb
191
+ - lib/sidetiq/views/assets/styles.css
192
+ - lib/sidetiq/views/history.erb
193
+ - lib/sidetiq/views/locks.erb
194
+ - lib/sidetiq/views/schedule.erb
134
195
  - lib/sidetiq/views/sidetiq.erb
135
- - lib/sidetiq/views/sidetiq_details.erb
136
196
  - lib/sidetiq/web.rb
137
197
  - sidetiq.gemspec
198
+ - tasks/bundler.task
199
+ - tasks/minitest.task
138
200
  - test/fixtures/backfill_worker.rb
139
201
  - test/fixtures/last_and_scheduled_ticks_worker.rb
140
202
  - test/fixtures/last_tick_worker.rb
203
+ - test/fixtures/optional_arguments_worker.rb
141
204
  - test/fixtures/scheduled_worker.rb
142
205
  - test/fixtures/simple_worker.rb
143
206
  - test/fixtures/splat_args_worker.rb
144
207
  - test/helper.rb
145
208
  - test/test_clock.rb
146
209
  - test/test_config.rb
147
- - test/test_lock.rb
148
- - test/test_middleware.rb
210
+ - test/test_history.rb
211
+ - test/test_lock_meta_data.rb
212
+ - test/test_lock_redis.rb
149
213
  - test/test_schedule.rb
150
214
  - test/test_sidetiq.rb
151
215
  - test/test_version.rb
216
+ - test/test_watcher.rb
152
217
  - test/test_web.rb
153
218
  - test/test_worker.rb
154
219
  homepage: http://github.com/tobiassvn/sidetiq
@@ -166,9 +231,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
166
231
  version: '0'
167
232
  required_rubygems_version: !ruby/object:Gem::Requirement
168
233
  requirements:
169
- - - '>='
234
+ - - '>'
170
235
  - !ruby/object:Gem::Version
171
- version: '0'
236
+ version: 1.3.1
172
237
  requirements: []
173
238
  rubyforge_project:
174
239
  rubygems_version: 2.0.3
@@ -179,16 +244,19 @@ test_files:
179
244
  - test/fixtures/backfill_worker.rb
180
245
  - test/fixtures/last_and_scheduled_ticks_worker.rb
181
246
  - test/fixtures/last_tick_worker.rb
247
+ - test/fixtures/optional_arguments_worker.rb
182
248
  - test/fixtures/scheduled_worker.rb
183
249
  - test/fixtures/simple_worker.rb
184
250
  - test/fixtures/splat_args_worker.rb
185
251
  - test/helper.rb
186
252
  - test/test_clock.rb
187
253
  - test/test_config.rb
188
- - test/test_lock.rb
189
- - test/test_middleware.rb
254
+ - test/test_history.rb
255
+ - test/test_lock_meta_data.rb
256
+ - test/test_lock_redis.rb
190
257
  - test/test_schedule.rb
191
258
  - test/test_sidetiq.rb
192
259
  - test/test_version.rb
260
+ - test/test_watcher.rb
193
261
  - test/test_web.rb
194
262
  - test/test_worker.rb
data/examples/simple.rb DELETED
@@ -1,22 +0,0 @@
1
- # Run with `sidekiq -r /path/to/simple.rb`
2
-
3
- require 'sidekiq'
4
- require 'sidetiq'
5
-
6
- Sidekiq.options[:poll_interval] = 1
7
-
8
- Sidekiq.configure_server do |config|
9
- Sidetiq::Clock.start!
10
- end
11
-
12
- class MyWorker
13
- include Sidekiq::Worker
14
- include Sidetiq::Schedulable
15
-
16
- recurrence { secondly }
17
-
18
- def perform(*args)
19
- Sidekiq.logger.info "#perform"
20
- end
21
- end
22
-
data/lib/sidetiq/lock.rb DELETED
@@ -1,63 +0,0 @@
1
- module Sidetiq
2
- class Lock # :nodoc: all
3
- attr_reader :key, :timeout
4
-
5
- OWNER = "#{Socket.gethostname}:#{Process.pid}"
6
-
7
- def initialize(key, timeout = Sidetiq.config.lock_expire)
8
- @key = key.kind_of?(Class) ? "sidetiq:#{key.name}:lock" : "sidetiq:#{key}:lock"
9
- @timeout = timeout
10
- end
11
-
12
- def synchronize
13
- Sidekiq.redis do |redis|
14
- if lock(redis)
15
- Sidetiq.logger.debug "Sidetiq::Clock lock #{key}"
16
-
17
- begin
18
- yield redis
19
- ensure
20
- unlock(redis)
21
- Sidetiq.logger.debug "Sidetiq::Clock unlock #{key}"
22
- end
23
- end
24
- end
25
- end
26
-
27
- private
28
-
29
- def lock(redis)
30
- acquired = false
31
-
32
- watch(redis, key) do
33
- if !redis.exists(key)
34
- acquired = !!redis.multi do |multi|
35
- multi.psetex(key, timeout, OWNER)
36
- end
37
- end
38
- end
39
-
40
- acquired
41
- end
42
-
43
- def unlock(redis)
44
- watch(redis, key) do
45
- if redis.get(key) == OWNER
46
- redis.multi do |multi|
47
- multi.del(key)
48
- end
49
- end
50
- end
51
- end
52
-
53
- def watch(redis, *args)
54
- redis.watch(*args)
55
-
56
- begin
57
- yield
58
- ensure
59
- redis.unwatch
60
- end
61
- end
62
- end
63
- end
@@ -1,23 +0,0 @@
1
- module Sidetiq
2
- class Middleware
3
- def initialize
4
- @clock = Sidetiq::Clock.instance
5
- end
6
-
7
- def call(*args)
8
- # Restart the clock if the thread died.
9
- if !@clock.ticking?
10
- Sidetiq.logger.warn "Sidetiq::Clock thread died. Restarting..."
11
- @clock.start!
12
- end
13
- yield
14
- end
15
- end
16
- end
17
-
18
- Sidekiq.configure_server do |config|
19
- config.server_middleware do |chain|
20
- chain.add Sidetiq::Middleware
21
- end
22
- end
23
-
@@ -1,49 +0,0 @@
1
- <header class="row">
2
- <div class="span5">
3
- <h3>Recurring Job: <%= @worker.name %></h3>
4
- </div>
5
- </header>
6
-
7
- <% if (recurrences = @schedule.recurrence_rules).length > 0 %>
8
- <table class="table table-striped table-bordered table-white" style="width: 100%; margin: 0; table-layout:fixed;">
9
- <thead>
10
- <th>Recurrences</th>
11
- </thead>
12
- <% recurrences.each do |rule| %>
13
- <tr>
14
- <td><%= rule.to_s %></td>
15
- </tr>
16
- <% end %>
17
- </table>
18
- <% end %>
19
-
20
- <br />
21
-
22
- <% if (exceptions = @schedule.exception_rules).length > 0 %>
23
- <table class="table table-striped table-bordered table-white" style="width: 100%; margin: 0; table-layout:fixed;">
24
- <thead>
25
- <th>Exceptions</th>
26
- </thead>
27
- <% exceptions.each do |rule| %>
28
- <tr>
29
- <td><%= rule.to_s %></td>
30
- </tr>
31
- <% end %>
32
- </table>
33
- <% end %>
34
-
35
- <br />
36
-
37
- <table class="table table-striped table-bordered table-white" style="width: 100%; margin: 0; table-layout:fixed;">
38
- <thead>
39
- <th style="width: 25%">Next 10 runs</th>
40
- <th style="width: 75%" />
41
- <% @schedule.next_occurrences(10, @time).each do |time| %>
42
- <tr>
43
- <td><time><%= time.getutc %></time></td>
44
- <td><%= relative_time(time) %></td>
45
- </tr>
46
- <% end %>
47
- </table>
48
-
49
- <br />
data/test/test_lock.rb DELETED
@@ -1,30 +0,0 @@
1
- require_relative 'helper'
2
-
3
- class TestLock < Sidetiq::TestCase
4
- def test_locking
5
- lock_name = SecureRandom.hex(8)
6
- key = SecureRandom.hex(8)
7
-
8
- Sidekiq.redis do |redis|
9
- redis.set(key, 0)
10
-
11
- 5.times.map do
12
- Thread.start do
13
- locked(lock_name) do |r|
14
- sleep 0.1
15
- r.incr(key)
16
- end
17
- end
18
- end.each(&:join)
19
-
20
- assert_equal "1", redis.get(key)
21
- end
22
- end
23
-
24
- def locked(lock_name)
25
- Sidetiq::Lock.new(lock_name).synchronize do |redis|
26
- yield redis
27
- end
28
- end
29
- end
30
-
@@ -1,18 +0,0 @@
1
- require_relative 'helper'
2
-
3
- class TestMiddleware < Sidetiq::TestCase
4
- def middleware
5
- Sidetiq::Middleware.new
6
- end
7
-
8
- def test_restarts_clock
9
- clock.stubs(:ticking?).returns(false)
10
- clock.expects(:start!).once
11
- middleware.call {}
12
-
13
- clock.stubs(:ticking?).returns(true)
14
- clock.expects(:start!).never
15
- middleware.call {}
16
- end
17
- end
18
-