sweatshop 1.4.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.
- data/History.txt +6 -0
- data/LICENSE +20 -0
- data/README.markdown +103 -0
- data/Rakefile +43 -0
- data/VERSION.yml +4 -0
- data/bin/sweatd +3 -0
- data/config/defaults.yml +8 -0
- data/config/sweatshop.yml +15 -0
- data/install.rb +20 -0
- data/lib/message_queue/base.rb +17 -0
- data/lib/message_queue/kestrel.rb +32 -0
- data/lib/message_queue/rabbit.rb +108 -0
- data/lib/sweat_shop.rb +179 -0
- data/lib/sweat_shop/daemoned.rb +405 -0
- data/lib/sweat_shop/metaid.rb +5 -0
- data/lib/sweat_shop/sweatd.rb +76 -0
- data/lib/sweat_shop/worker.rb +162 -0
- data/script/initd.sh +108 -0
- data/script/kestrel +93 -0
- data/script/kestrel.sh +93 -0
- data/script/sweatshop +17 -0
- data/test/hello_worker.rb +13 -0
- data/test/test_functional_worker.rb +72 -0
- data/test/test_helper.rb +4 -0
- data/test/test_sweatshop.rb +78 -0
- metadata +91 -0
data/script/sweatshop
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
if ARGV.include?('-d')
|
4
|
+
ARGV.delete('-d')
|
5
|
+
ARGV.unshift('start') unless ARGV.detect{|a| ['start', 'restart'].include?(a)}
|
6
|
+
|
7
|
+
root = File.expand_path(File.dirname(__FILE__) + '/..')
|
8
|
+
ARGV << "--rails=#{root}"
|
9
|
+
|
10
|
+
system("ruby #{root}/vendor/gems/sweat_shop/lib/sweat_shop/sweatd.rb #{ARGV.join(' ')}")
|
11
|
+
exit $?.exitstatus
|
12
|
+
else
|
13
|
+
puts "Loading Rails..."
|
14
|
+
require File.dirname(__FILE__) + '/../config/environment'
|
15
|
+
puts "Listening for new tasks..."
|
16
|
+
SweatShop.do_all_tasks
|
17
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../lib/sweat_shop'
|
2
|
+
class HelloWorker < SweatShop::Worker
|
3
|
+
TEST_FILE = File.dirname(__FILE__) + '/test.txt' unless defined?(TEST_FILE)
|
4
|
+
|
5
|
+
def hello(name)
|
6
|
+
puts name
|
7
|
+
"Hi, #{name}"
|
8
|
+
end
|
9
|
+
|
10
|
+
after_task do |task|
|
11
|
+
File.open(TEST_FILE, 'w'){|f| f << task[:result]}
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../lib/sweat_shop'
|
2
|
+
require File.dirname(__FILE__) + '/test_helper'
|
3
|
+
require File.dirname(__FILE__) + '/hello_worker'
|
4
|
+
|
5
|
+
class WorkerTest < Test::Unit::TestCase
|
6
|
+
|
7
|
+
def setup
|
8
|
+
File.delete(HelloWorker::TEST_FILE) if File.exist?(HelloWorker::TEST_FILE)
|
9
|
+
end
|
10
|
+
|
11
|
+
def teardown
|
12
|
+
SweatShop.instance_variable_set("@config", nil)
|
13
|
+
SweatShop.instance_variable_set("@queues", nil)
|
14
|
+
File.delete(HelloWorker::TEST_FILE) if File.exist?(HelloWorker::TEST_FILE)
|
15
|
+
end
|
16
|
+
|
17
|
+
should "daemonize" do
|
18
|
+
begin
|
19
|
+
SweatShop.config['enable'] = true
|
20
|
+
SweatShop.logger = :silent
|
21
|
+
|
22
|
+
HelloWorker.async_hello('Amos')
|
23
|
+
|
24
|
+
worker = File.expand_path(File.dirname(__FILE__) + '/hello_worker')
|
25
|
+
sweatd = "#{File.dirname(__FILE__)}/../lib/sweat_shop/sweatd.rb"
|
26
|
+
|
27
|
+
`ruby #{sweatd} --worker-file #{worker} start`
|
28
|
+
`ruby #{sweatd} stop`
|
29
|
+
|
30
|
+
File.delete('sweatd.log') if File.exist?('sweatd.log')
|
31
|
+
assert_equal 'Hi, Amos', File.read(HelloWorker::TEST_FILE)
|
32
|
+
|
33
|
+
rescue Exception => e
|
34
|
+
puts e.message
|
35
|
+
puts e.backtrace.join("\n")
|
36
|
+
fail "\n\n*** Functional test failed, is the rabbit server running on localhost? ***\n"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
should "connect to fallback servers if the default one is down" do
|
41
|
+
begin
|
42
|
+
SweatShop.logger = :silent
|
43
|
+
SweatShop.config['enable'] = true
|
44
|
+
SweatShop.config['default']['cluster'] =
|
45
|
+
[
|
46
|
+
'localhost:5671', # invalid
|
47
|
+
'localhost:5672' # valid
|
48
|
+
]
|
49
|
+
HelloWorker.async_hello('Amos')
|
50
|
+
|
51
|
+
assert_equal 'Amos', HelloWorker.dequeue[:args].first
|
52
|
+
|
53
|
+
HelloWorker.queue.client = nil
|
54
|
+
|
55
|
+
HelloWorker.stop
|
56
|
+
SweatShop.config['default']['cluster'] =
|
57
|
+
[
|
58
|
+
'localhost:5671',# valid
|
59
|
+
'localhost:5672' # invalid
|
60
|
+
]
|
61
|
+
|
62
|
+
HelloWorker.async_hello('Amos')
|
63
|
+
assert_equal 'Amos', HelloWorker.dequeue[:args].first
|
64
|
+
|
65
|
+
rescue Exception => e
|
66
|
+
puts e.message
|
67
|
+
puts e.backtrace.join("\n")
|
68
|
+
fail "\n\n*** Functional test failed, is the rabbit server running on localhost? ***\n"
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/test_helper'
|
2
|
+
require File.dirname(__FILE__) + '/../lib/sweat_shop'
|
3
|
+
|
4
|
+
class SweatShopTest < Test::Unit::TestCase
|
5
|
+
SweatShop.workers = []
|
6
|
+
|
7
|
+
class HelloWorker < SweatShop::Worker
|
8
|
+
def hello(name)
|
9
|
+
"Hi, #{name}"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class GroupedWorker < SweatShop::Worker
|
14
|
+
queue_group :foo
|
15
|
+
end
|
16
|
+
|
17
|
+
should "group workers" do
|
18
|
+
assert_equal [HelloWorker, GroupedWorker], SweatShop.workers_in_group(:all)
|
19
|
+
assert_equal [HelloWorker], SweatShop.workers_in_group(:default)
|
20
|
+
assert_equal [GroupedWorker], SweatShop.workers_in_group(:foo)
|
21
|
+
end
|
22
|
+
|
23
|
+
should "synch call" do
|
24
|
+
worker = HelloWorker.new
|
25
|
+
assert_equal "Hi, Amos", worker.hello('Amos')
|
26
|
+
end
|
27
|
+
|
28
|
+
should "assign a uid" do
|
29
|
+
SweatShop.logger = :silent
|
30
|
+
SweatShop.config['enable'] = false
|
31
|
+
uid = HelloWorker.async_hello('Amos')
|
32
|
+
assert_not_nil uid
|
33
|
+
end
|
34
|
+
|
35
|
+
should "have before task" do
|
36
|
+
HelloWorker.before_task do
|
37
|
+
"hello"
|
38
|
+
end
|
39
|
+
assert_equal "hello", HelloWorker.before_task.call
|
40
|
+
end
|
41
|
+
|
42
|
+
should "have after task" do
|
43
|
+
HelloWorker.after_task do
|
44
|
+
"goodbye"
|
45
|
+
end
|
46
|
+
assert_equal "goodbye", HelloWorker.after_task.call
|
47
|
+
end
|
48
|
+
|
49
|
+
should "exception handler" do
|
50
|
+
SweatShop.logger = :silent
|
51
|
+
|
52
|
+
exception = nil
|
53
|
+
HelloWorker.on_exception do |e|
|
54
|
+
exception = e
|
55
|
+
end
|
56
|
+
|
57
|
+
HelloWorker.do_task(nil)
|
58
|
+
assert_equal NoMethodError, exception.class
|
59
|
+
end
|
60
|
+
|
61
|
+
should "chain before tasks" do
|
62
|
+
MESSAGES = []
|
63
|
+
class BaseWorker < SweatShop::Worker
|
64
|
+
before_task do |task|
|
65
|
+
MESSAGES << 'base'
|
66
|
+
end
|
67
|
+
end
|
68
|
+
class SubWorker < BaseWorker
|
69
|
+
before_task do |task|
|
70
|
+
MESSAGES << 'sub'
|
71
|
+
end
|
72
|
+
end
|
73
|
+
SubWorker.call_before_task('foo')
|
74
|
+
assert_equal ['base', 'sub'], MESSAGES
|
75
|
+
SweatShop.workers.delete(BaseWorker)
|
76
|
+
SweatShop.workers.delete(SubWorker)
|
77
|
+
end
|
78
|
+
end
|
metadata
ADDED
@@ -0,0 +1,91 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sweatshop
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.4.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Amos Elliston
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-10-19 00:00:00 -07:00
|
13
|
+
default_executable: sweatd
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: famoseagle-carrot
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - "="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 0.7.0
|
24
|
+
version:
|
25
|
+
description: See summary
|
26
|
+
email: amos@geni.com
|
27
|
+
executables:
|
28
|
+
- sweatd
|
29
|
+
extensions: []
|
30
|
+
|
31
|
+
extra_rdoc_files:
|
32
|
+
- LICENSE
|
33
|
+
- README.markdown
|
34
|
+
files:
|
35
|
+
- History.txt
|
36
|
+
- LICENSE
|
37
|
+
- README.markdown
|
38
|
+
- Rakefile
|
39
|
+
- VERSION.yml
|
40
|
+
- config/defaults.yml
|
41
|
+
- config/sweatshop.yml
|
42
|
+
- install.rb
|
43
|
+
- lib/message_queue/base.rb
|
44
|
+
- lib/message_queue/kestrel.rb
|
45
|
+
- lib/message_queue/rabbit.rb
|
46
|
+
- lib/sweat_shop.rb
|
47
|
+
- lib/sweat_shop/daemoned.rb
|
48
|
+
- lib/sweat_shop/metaid.rb
|
49
|
+
- lib/sweat_shop/sweatd.rb
|
50
|
+
- lib/sweat_shop/worker.rb
|
51
|
+
- script/initd.sh
|
52
|
+
- script/kestrel
|
53
|
+
- script/kestrel.sh
|
54
|
+
- script/sweatshop
|
55
|
+
- test/hello_worker.rb
|
56
|
+
- test/test_functional_worker.rb
|
57
|
+
- test/test_helper.rb
|
58
|
+
- test/test_sweatshop.rb
|
59
|
+
has_rdoc: true
|
60
|
+
homepage: http://github.com/famoseagle/sweat-shop
|
61
|
+
licenses: []
|
62
|
+
|
63
|
+
post_install_message:
|
64
|
+
rdoc_options:
|
65
|
+
- --charset=UTF-8
|
66
|
+
require_paths:
|
67
|
+
- lib
|
68
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
69
|
+
requirements:
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: "0"
|
73
|
+
version:
|
74
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
75
|
+
requirements:
|
76
|
+
- - ">="
|
77
|
+
- !ruby/object:Gem::Version
|
78
|
+
version: "0"
|
79
|
+
version:
|
80
|
+
requirements: []
|
81
|
+
|
82
|
+
rubyforge_project:
|
83
|
+
rubygems_version: 1.3.5
|
84
|
+
signing_key:
|
85
|
+
specification_version: 3
|
86
|
+
summary: Sweatshop is a simple asynchronous worker queue build on top of rabbitmq/ampq
|
87
|
+
test_files:
|
88
|
+
- test/hello_worker.rb
|
89
|
+
- test/test_functional_worker.rb
|
90
|
+
- test/test_helper.rb
|
91
|
+
- test/test_sweatshop.rb
|