creeper 0.0.1 → 0.0.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.
- data/.rspec +2 -0
- data/README.md +66 -16
- data/lib/creeper/version.rb +1 -1
- data/spec/creeper_spec.rb +141 -0
- data/spec/spec_helper.rb +9 -0
- data/spec/worker_spec.rb +16 -0
- metadata +9 -2
data/.rspec
ADDED
data/README.md
CHANGED
@@ -1,29 +1,79 @@
|
|
1
1
|
# Creeper
|
2
2
|
|
3
|
-
|
3
|
+
Can be used as an in place drop in for stalker but it is multi threaded so you can easily do more without using more memory
|
4
4
|
|
5
|
-
|
5
|
+
Creeper - an improvement on Stalker
|
6
|
+
==========================================
|
6
7
|
|
7
|
-
|
8
|
+
The big difference is how you "work" jobs
|
8
9
|
|
9
|
-
|
10
|
+
all you need is a thread count arguement :)
|
10
11
|
|
11
|
-
|
12
|
+
Creeper.work(<jobs>, <thread_count>)
|
12
13
|
|
13
|
-
|
14
|
+
[Beanstalkd](http://kr.github.com/beanstalkd/) is a fast, lightweight queueing backend inspired by mmemcached.
|
14
15
|
|
15
|
-
|
16
|
+
Queueing jobs
|
17
|
+
-------------
|
16
18
|
|
17
|
-
|
19
|
+
From anywhere in your app:
|
18
20
|
|
19
|
-
|
21
|
+
require 'creeper'
|
20
22
|
|
21
|
-
|
23
|
+
Creeper.enqueue('email.send', :to => 'joe@example.com')
|
24
|
+
Creeper.enqueue('post.cleanup.all')
|
25
|
+
Creeper.enqueue('post.cleanup', :id => post.id)
|
22
26
|
|
23
|
-
|
27
|
+
Working jobs
|
28
|
+
------------
|
24
29
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
+
In a standalone file, typically jobs.rb or worker.rb:
|
31
|
+
|
32
|
+
require 'creeper'
|
33
|
+
include Creeper
|
34
|
+
|
35
|
+
job 'email.send' do |args|
|
36
|
+
Pony.send(:to => args['to'], :subject => "Hello there")
|
37
|
+
end
|
38
|
+
|
39
|
+
job 'post.cleanup.all' do |args|
|
40
|
+
Post.all.each do |post|
|
41
|
+
enqueue('post.cleanup', :id => post.id)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
job 'post.cleanup' do |args|
|
46
|
+
Post.find(args['id']).cleanup
|
47
|
+
end
|
48
|
+
|
49
|
+
Creeper.work(<jobs>, <thread_count>)
|
50
|
+
|
51
|
+
Running
|
52
|
+
-------
|
53
|
+
|
54
|
+
First, make sure you have Beanstalkd installed and running:
|
55
|
+
|
56
|
+
$ sudo brew install beanstalkd
|
57
|
+
$ beanstalkd
|
58
|
+
|
59
|
+
Creeper:
|
60
|
+
|
61
|
+
$ sudo gem install creeper
|
62
|
+
|
63
|
+
Error Handling
|
64
|
+
-------------
|
65
|
+
|
66
|
+
If you include an `error` block in your jobs definition, that block will be invoked when a worker encounters an error. You might use this to report errors to an external monitoring service:
|
67
|
+
|
68
|
+
error do |e, job, args|
|
69
|
+
Exceptional.handle(e)
|
70
|
+
end
|
71
|
+
|
72
|
+
Before filter
|
73
|
+
-------------
|
74
|
+
|
75
|
+
If you wish to run a block of code prior to any job:
|
76
|
+
|
77
|
+
before do |job|
|
78
|
+
puts "About to work #{job}"
|
79
|
+
end
|
data/lib/creeper/version.rb
CHANGED
@@ -0,0 +1,141 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Creeper do
|
4
|
+
|
5
|
+
after :each do
|
6
|
+
Creeper.clear!
|
7
|
+
end
|
8
|
+
|
9
|
+
it "work a job and do it up" do
|
10
|
+
val = rand(999999)
|
11
|
+
Creeper.job('my.job') { |args| $result = args['val'] }
|
12
|
+
Creeper.enqueue('my.job', :val => val)
|
13
|
+
w = Creeper::Worker.new
|
14
|
+
w.stub(:exception_message)
|
15
|
+
w.stub(:log)
|
16
|
+
w.prep
|
17
|
+
w.work_one_job
|
18
|
+
val.should == $result
|
19
|
+
end
|
20
|
+
|
21
|
+
it "invoke error handler when defined" do
|
22
|
+
with_an_error_handler
|
23
|
+
Creeper.job('my.job') { |args| fail }
|
24
|
+
Creeper.enqueue('my.job', :foo => 123)
|
25
|
+
w = Creeper::Worker.new
|
26
|
+
w.stub(:exception_message)
|
27
|
+
w.stub(:log)
|
28
|
+
w.prep
|
29
|
+
w.work_one_job
|
30
|
+
$handled.should_not == nil
|
31
|
+
'my.job'.should == $job_name
|
32
|
+
{'foo' => 123}.should == $job_args
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should be compatible with legacy error handlers" do
|
36
|
+
exception = StandardError.new("Oh my, the job has failed!")
|
37
|
+
Creeper.error { |e| $handled = e }
|
38
|
+
Creeper.job('my.job') { |args| raise exception }
|
39
|
+
Creeper.enqueue('my.job')
|
40
|
+
w = Creeper::Worker.new
|
41
|
+
w.stub(:exception_message)
|
42
|
+
w.stub(:log)
|
43
|
+
w.prep
|
44
|
+
w.work_one_job
|
45
|
+
exception.should == $handled
|
46
|
+
end
|
47
|
+
|
48
|
+
it "continue working when error handler not defined" do
|
49
|
+
Creeper.error { |e| $handled = false }
|
50
|
+
Creeper.job('my.job') { fail }
|
51
|
+
Creeper.enqueue('my.job')
|
52
|
+
w = Creeper::Worker.new
|
53
|
+
w.stub(:exception_message)
|
54
|
+
w.stub(:log)
|
55
|
+
w.prep
|
56
|
+
w.work_one_job
|
57
|
+
false.should == $handled
|
58
|
+
end
|
59
|
+
|
60
|
+
it "exception raised one second before beanstalk ttr reached" do
|
61
|
+
with_an_error_handler
|
62
|
+
Creeper.job('my.job') { sleep(3); $handled = "didn't time out" }
|
63
|
+
Creeper.enqueue('my.job', {}, :ttr => 2)
|
64
|
+
w = Creeper::Worker.new
|
65
|
+
w.stub(:exception_message)
|
66
|
+
w.stub(:log)
|
67
|
+
w.prep
|
68
|
+
w.work_one_job
|
69
|
+
$handled.should == "didn't time out"
|
70
|
+
end
|
71
|
+
|
72
|
+
it "before filter gets run first" do
|
73
|
+
Creeper.before { |name| $flag = "i_was_here" }
|
74
|
+
Creeper.job('my.job') { |args| $handled = ($flag == 'i_was_here') }
|
75
|
+
Creeper.enqueue('my.job')
|
76
|
+
w = Creeper::Worker.new
|
77
|
+
w.stub(:exception_message)
|
78
|
+
w.stub(:log)
|
79
|
+
w.prep
|
80
|
+
w.work_one_job
|
81
|
+
true.should == $handled
|
82
|
+
end
|
83
|
+
|
84
|
+
it "before filter passes the name of the job" do
|
85
|
+
Creeper.before { |name| $jobname = name }
|
86
|
+
Creeper.job('my.job') { true }
|
87
|
+
Creeper.enqueue('my.job')
|
88
|
+
w = Creeper::Worker.new
|
89
|
+
w.stub(:exception_message)
|
90
|
+
w.stub(:log)
|
91
|
+
w.prep
|
92
|
+
w.work_one_job
|
93
|
+
'my.job'.should == $jobname
|
94
|
+
end
|
95
|
+
|
96
|
+
it "before filter can pass an instance var" do
|
97
|
+
Creeper.before { |name| @foo = "hello" }
|
98
|
+
Creeper.job('my.job') { |args| $handled = (@foo == "hello") }
|
99
|
+
Creeper.enqueue('my.job')
|
100
|
+
w = Creeper::Worker.new
|
101
|
+
w.stub(:exception_message)
|
102
|
+
w.stub(:log)
|
103
|
+
w.prep
|
104
|
+
w.work_one_job
|
105
|
+
true.should == $handled
|
106
|
+
end
|
107
|
+
|
108
|
+
it "before filter invokes error handler when defined" do
|
109
|
+
with_an_error_handler
|
110
|
+
Creeper.before { |name| fail }
|
111
|
+
Creeper.job('my.job') { }
|
112
|
+
Creeper.enqueue('my.job', :foo => 123)
|
113
|
+
w = Creeper::Worker.new
|
114
|
+
w.stub(:exception_message)
|
115
|
+
w.stub(:log)
|
116
|
+
w.prep
|
117
|
+
w.work_one_job
|
118
|
+
$handled.should_not == nil
|
119
|
+
'my.job'.should == $job_name
|
120
|
+
{'foo' => 123}.should == $job_args
|
121
|
+
end
|
122
|
+
|
123
|
+
it "parse BEANSTALK_URL" do
|
124
|
+
ENV['BEANSTALK_URL'] = "beanstalk://localhost:12300"
|
125
|
+
Creeper.beanstalk_addresses.should == ["localhost:12300"]
|
126
|
+
ENV['BEANSTALK_URL'] = "beanstalk://localhost:12300/, beanstalk://localhost:12301/"
|
127
|
+
Creeper.beanstalk_addresses.should == ["localhost:12300","localhost:12301"]
|
128
|
+
ENV['BEANSTALK_URL'] = "beanstalk://localhost:12300 beanstalk://localhost:12301"
|
129
|
+
Creeper.beanstalk_addresses.should == ["localhost:12300","localhost:12301"]
|
130
|
+
end
|
131
|
+
|
132
|
+
def with_an_error_handler
|
133
|
+
Creeper.error do |e, job_name, args|
|
134
|
+
$handled = e.class
|
135
|
+
$job_name = job_name
|
136
|
+
$job_args = args
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
|
141
|
+
end
|
data/spec/spec_helper.rb
ADDED
data/spec/worker_spec.rb
ADDED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: creeper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -67,6 +67,7 @@ extensions: []
|
|
67
67
|
extra_rdoc_files: []
|
68
68
|
files:
|
69
69
|
- .gitignore
|
70
|
+
- .rspec
|
70
71
|
- Gemfile
|
71
72
|
- LICENSE
|
72
73
|
- README.md
|
@@ -75,6 +76,9 @@ files:
|
|
75
76
|
- lib/creeper.rb
|
76
77
|
- lib/creeper/version.rb
|
77
78
|
- lib/creeper/worker.rb
|
79
|
+
- spec/creeper_spec.rb
|
80
|
+
- spec/spec_helper.rb
|
81
|
+
- spec/worker_spec.rb
|
78
82
|
homepage: https://github.com/lyondhill/creeper
|
79
83
|
licenses: []
|
80
84
|
post_install_message:
|
@@ -100,5 +104,8 @@ signing_key:
|
|
100
104
|
specification_version: 3
|
101
105
|
summary: A better solution for io bound jobs, same as stalker in functionality but
|
102
106
|
more threadie.
|
103
|
-
test_files:
|
107
|
+
test_files:
|
108
|
+
- spec/creeper_spec.rb
|
109
|
+
- spec/spec_helper.rb
|
110
|
+
- spec/worker_spec.rb
|
104
111
|
has_rdoc:
|