clockwork 0.6.2 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +59 -42
- data/bin/clockworkd +6 -0
- data/clockwork.gemspec +1 -1
- data/example.rb +11 -10
- data/lib/clockwork.rb +37 -23
- data/lib/clockwork/event.rb +1 -1
- data/test/clockwork_test.rb +13 -0
- data/test/manager_test.rb +17 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a05228ef038356c69ac45b0cd26eba0d9571905c
|
4
|
+
data.tar.gz: 1202fe6dfa6d4ed81a7850968f99d2512bf5dc5b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8353beebe55670202cce99d785d646bfe239e78271f1e211b0e9379d44c785e938f17004c18e8222ec0cad389bdc35b3f5633d767555e45900d9c24c5ba8ae9f
|
7
|
+
data.tar.gz: c0d61cafe0c731f02f6b9c4dde2786901cf3f0b11be6e1fd86d8fadb1f73cd14493120f1d805563322e35ece1b41587a7c3c2e472712cc1db45078ff729ec9cc
|
data/README.md
CHANGED
@@ -18,43 +18,16 @@ Create clock.rb:
|
|
18
18
|
|
19
19
|
```ruby
|
20
20
|
require 'clockwork'
|
21
|
-
include Clockwork
|
22
|
-
|
23
|
-
handler do |job|
|
24
|
-
puts "Running #{job}"
|
25
|
-
end
|
26
|
-
|
27
|
-
every(10.seconds, 'frequent.job')
|
28
|
-
every(3.minutes, 'less.frequent.job')
|
29
|
-
every(1.hour, 'hourly.job')
|
30
|
-
|
31
|
-
every(1.day, 'midnight.job', :at => '00:00')
|
32
|
-
```
|
33
|
-
|
34
|
-
Run it with the clockwork binary:
|
35
|
-
|
36
|
-
```
|
37
|
-
$ clockwork clock.rb
|
38
|
-
Starting clock for 4 events: [ frequent.job less.frequent.job hourly.job midnight.job ]
|
39
|
-
Triggering frequent.job
|
40
|
-
```
|
41
|
-
|
42
|
-
If you would not like to taint the namespace with `include Clockwork`, you can use
|
43
|
-
it as the module (thanks to [hoverlover](https://github.com/hoverlover/clockwork/)).
|
44
|
-
|
45
|
-
```ruby
|
46
|
-
require 'clockwork'
|
47
|
-
|
48
21
|
module Clockwork
|
49
|
-
|
50
|
-
configure do |config|
|
51
|
-
config[:tz] = "America/Chicago"
|
52
|
-
end
|
53
|
-
|
54
22
|
handler do |job|
|
55
23
|
puts "Running #{job}"
|
56
24
|
end
|
57
25
|
|
26
|
+
# handler receives the time when job is prepared to run in the 2nd argument
|
27
|
+
# handler do |job, time|
|
28
|
+
# puts "Running #{job}, at #{time}"
|
29
|
+
# end
|
30
|
+
|
58
31
|
every(10.seconds, 'frequent.job')
|
59
32
|
every(3.minutes, 'less.frequent.job')
|
60
33
|
every(1.hour, 'hourly.job')
|
@@ -63,6 +36,14 @@ module Clockwork
|
|
63
36
|
end
|
64
37
|
```
|
65
38
|
|
39
|
+
Run it with the clockwork binary:
|
40
|
+
|
41
|
+
```
|
42
|
+
$ clockwork clock.rb
|
43
|
+
Starting clock for 4 events: [ frequent.job less.frequent.job hourly.job midnight.job ]
|
44
|
+
Triggering frequent.job
|
45
|
+
```
|
46
|
+
|
66
47
|
If you need to load your entire environment for your jobs, simply add:
|
67
48
|
|
68
49
|
```ruby
|
@@ -100,10 +81,12 @@ For example, if you're using Beanstalk/Staker:
|
|
100
81
|
```ruby
|
101
82
|
require 'stalker'
|
102
83
|
|
103
|
-
|
84
|
+
module Clockwork
|
85
|
+
handler { |job| Stalker.enqueue(job) }
|
104
86
|
|
105
|
-
every(1.hour, 'feeds.refresh')
|
106
|
-
every(1.day, 'reminders.send', :at => '01:30')
|
87
|
+
every(1.hour, 'feeds.refresh')
|
88
|
+
every(1.day, 'reminders.send', :at => '01:30')
|
89
|
+
end
|
107
90
|
```
|
108
91
|
|
109
92
|
Using a queueing system which doesn't require that your full application be
|
@@ -221,11 +204,13 @@ jobs.
|
|
221
204
|
### Configuration example
|
222
205
|
|
223
206
|
```ruby
|
224
|
-
Clockwork
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
207
|
+
module Clockwork
|
208
|
+
configure do |config|
|
209
|
+
config[:sleep_timeout] = 5
|
210
|
+
config[:logger] = Logger.new(log_file_path)
|
211
|
+
config[:tz] = 'EST'
|
212
|
+
config[:max_threads] = 15
|
213
|
+
end
|
229
214
|
end
|
230
215
|
```
|
231
216
|
|
@@ -234,8 +219,10 @@ end
|
|
234
219
|
You can add error_handler to define your own logging or error rescue.
|
235
220
|
|
236
221
|
```ruby
|
237
|
-
Clockwork
|
238
|
-
|
222
|
+
module Clockwork
|
223
|
+
error_handler do |error|
|
224
|
+
Airbrake.notify_or_ignore(error)
|
225
|
+
end
|
239
226
|
end
|
240
227
|
```
|
241
228
|
|
@@ -246,6 +233,14 @@ Current specifications are as follows.
|
|
246
233
|
|
247
234
|
Any suggestion about these specifications is welcome.
|
248
235
|
|
236
|
+
Old style
|
237
|
+
---------
|
238
|
+
|
239
|
+
`include Clockwork` is old style.
|
240
|
+
That is still supported, but not recommended, because it taint global namespace.
|
241
|
+
|
242
|
+
|
243
|
+
|
249
244
|
Anatomy of a clock file
|
250
245
|
-----------------------
|
251
246
|
|
@@ -324,6 +319,28 @@ clockworkd -c YOUR_CLOCK.rb start
|
|
324
319
|
|
325
320
|
For more details, see help shown by `clockworkd`.
|
326
321
|
|
322
|
+
Issues and Pull requests
|
323
|
+
------------------------
|
324
|
+
|
325
|
+
Let us know bugs you found as an issue from [Issues · tomykaira/clockwork](https://github.com/tomykaira/clockwork/issues).
|
326
|
+
|
327
|
+
For a bug fix or a feature request, please send a pull-request.
|
328
|
+
Do not forget to add tests to show how your feature works, or what bug is fixed.
|
329
|
+
All existing tests and new tests must pass (TravisCI is watching).
|
330
|
+
|
331
|
+
We want to provide simple and customizable core, so superficial changes will not be merged (e.g. supporting new event registration style).
|
332
|
+
In most case, directly operating `Manager` realizes an idea, without touching the core.
|
333
|
+
If you get up with a new usage, please create a gist page or an article on your website, then add to the following "Use cases" section.
|
334
|
+
This tool is already used in various environment, so backward-incompatible requests will be mostly rejected.
|
335
|
+
|
336
|
+
Use cases
|
337
|
+
---------
|
338
|
+
|
339
|
+
Feel free to add your idea or experience and send a pull-request.
|
340
|
+
|
341
|
+
- [Sending errors to Airbrake](https://github.com/tomykaira/clockwork/issues/58)
|
342
|
+
- [Read events from a database](https://github.com/tomykaira/clockwork/issues/25)
|
343
|
+
|
327
344
|
Meta
|
328
345
|
----
|
329
346
|
|
data/bin/clockworkd
CHANGED
@@ -48,6 +48,9 @@ opts = OptionParser.new do |opts|
|
|
48
48
|
@options[:file] = "./#{@options[:file]}" unless @options[:file].match(/^[\/.]/)
|
49
49
|
@options[:file] = File.expand_path(@options[:file])
|
50
50
|
end
|
51
|
+
opts.on('-d', '--dir=DIR', 'Directory to change to once the process starts') do |dir|
|
52
|
+
@options[:current_dir] = File.expand_path(dir)
|
53
|
+
end
|
51
54
|
end
|
52
55
|
|
53
56
|
@args = opts.parse!(ARGV)
|
@@ -79,6 +82,9 @@ else
|
|
79
82
|
end
|
80
83
|
|
81
84
|
Daemons.run_proc(process_name, :dir => @options[:pid_dir], :dir_mode => :normal, :monitor => @options[:monitor], :log_dir => @options[:log_dir], :log_output => @options[:log_output], :ARGV => @args) do |*args|
|
85
|
+
# daemons changes the current working directory to '/' when a new process is
|
86
|
+
# forked. We change it back to the project root directory here.
|
87
|
+
Dir.chdir(@options[:current_dir]) if @options[:current_dir]
|
82
88
|
require @options[:file]
|
83
89
|
|
84
90
|
Clockwork::run
|
data/clockwork.gemspec
CHANGED
data/example.rb
CHANGED
@@ -1,16 +1,17 @@
|
|
1
1
|
require 'clockwork'
|
2
|
-
include Clockwork
|
3
2
|
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
module Clockwork
|
4
|
+
handler do |job|
|
5
|
+
puts "Queueing job: #{job}"
|
6
|
+
end
|
7
7
|
|
8
|
-
every(10.seconds, 'run.me.every.10.seconds')
|
9
|
-
every(1.minute, 'run.me.every.minute')
|
10
|
-
every(1.hour, 'run.me.every.hour')
|
8
|
+
every(10.seconds, 'run.me.every.10.seconds')
|
9
|
+
every(1.minute, 'run.me.every.minute')
|
10
|
+
every(1.hour, 'run.me.every.hour')
|
11
11
|
|
12
|
-
every(1.day, 'run.me.at.midnight', :at => '00:00')
|
12
|
+
every(1.day, 'run.me.at.midnight', :at => '00:00')
|
13
13
|
|
14
|
-
every(1.day, 'custom.event.handler', :at => '00:30') do
|
15
|
-
|
14
|
+
every(1.day, 'custom.event.handler', :at => '00:30') do
|
15
|
+
puts 'This event has its own handler'
|
16
|
+
end
|
16
17
|
end
|
data/lib/clockwork.rb
CHANGED
@@ -6,38 +6,52 @@ require 'clockwork/event'
|
|
6
6
|
require 'clockwork/manager'
|
7
7
|
|
8
8
|
module Clockwork
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
9
|
+
class << self
|
10
|
+
def included(klass)
|
11
|
+
klass.send "include", Methods
|
12
|
+
klass.extend Methods
|
13
|
+
end
|
14
|
+
|
15
|
+
def manager
|
16
|
+
@manager ||= Manager.new
|
17
|
+
end
|
18
|
+
|
19
|
+
def manager=(manager)
|
20
|
+
@manager = manager
|
21
|
+
end
|
15
22
|
end
|
16
23
|
|
17
|
-
|
18
|
-
|
19
|
-
|
24
|
+
module Methods
|
25
|
+
def configure(&block)
|
26
|
+
Clockwork.manager.configure(&block)
|
27
|
+
end
|
20
28
|
|
21
|
-
|
22
|
-
|
23
|
-
|
29
|
+
def handler(&block)
|
30
|
+
Clockwork.manager.handler(&block)
|
31
|
+
end
|
24
32
|
|
25
|
-
|
26
|
-
|
27
|
-
|
33
|
+
def error_handler(&block)
|
34
|
+
Clockwork.manager.error_handler(&block)
|
35
|
+
end
|
28
36
|
|
29
|
-
|
30
|
-
|
31
|
-
|
37
|
+
def on(event, options={}, &block)
|
38
|
+
Clockwork.manager.on(event, options, &block)
|
39
|
+
end
|
32
40
|
|
33
|
-
|
34
|
-
|
35
|
-
|
41
|
+
def every(period, job, options={}, &block)
|
42
|
+
Clockwork.manager.every(period, job, options, &block)
|
43
|
+
end
|
44
|
+
|
45
|
+
def run
|
46
|
+
Clockwork.manager.run
|
47
|
+
end
|
36
48
|
|
37
|
-
|
38
|
-
|
49
|
+
def clear!
|
50
|
+
Clockwork.manager = Manager.new
|
51
|
+
end
|
39
52
|
end
|
40
53
|
|
54
|
+
extend Methods
|
41
55
|
end
|
42
56
|
|
43
57
|
unless 1.respond_to?(:seconds)
|
data/lib/clockwork/event.rb
CHANGED
data/test/clockwork_test.rb
CHANGED
@@ -59,4 +59,17 @@ class ClockworkTest < Test::Unit::TestCase
|
|
59
59
|
assert string_io.string.include?('1 events')
|
60
60
|
assert !string_io.string.include?('Triggering')
|
61
61
|
end
|
62
|
+
|
63
|
+
test 'support module re-open style' do
|
64
|
+
$called = false
|
65
|
+
module ::Clockwork
|
66
|
+
every(1.second, 'myjob') { $called = true }
|
67
|
+
end
|
68
|
+
set_string_io_logger
|
69
|
+
runner = run_in_thread
|
70
|
+
sleep 1
|
71
|
+
runner.kill
|
72
|
+
|
73
|
+
assert $called
|
74
|
+
end
|
62
75
|
end
|
data/test/manager_test.rb
CHANGED
@@ -89,6 +89,23 @@ class ManagerTest < Test::Unit::TestCase
|
|
89
89
|
assert_equal 2, $set_me
|
90
90
|
end
|
91
91
|
|
92
|
+
test "should pass time to the general handler" do
|
93
|
+
received = nil
|
94
|
+
now = Time.now
|
95
|
+
@manager.handler { |job, time| received = time }
|
96
|
+
@manager.every(1.minute, 'myjob')
|
97
|
+
@manager.tick(now)
|
98
|
+
assert_equal now, received
|
99
|
+
end
|
100
|
+
|
101
|
+
test "should pass time to the event-specific handler" do
|
102
|
+
received = nil
|
103
|
+
now = Time.now
|
104
|
+
@manager.every(1.minute, 'myjob') { |job, time| received = time }
|
105
|
+
@manager.tick(now)
|
106
|
+
assert_equal now, received
|
107
|
+
end
|
108
|
+
|
92
109
|
test "exceptions are trapped and logged" do
|
93
110
|
@manager.handler { raise 'boom' }
|
94
111
|
@manager.every(1.minute, 'myjob')
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: clockwork
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adam Wiggins
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-10-
|
12
|
+
date: 2013-10-31 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: tzinfo
|