clockwork 0.6.2 → 0.7.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/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
|