sweat_shop 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -0,0 +1,4 @@
1
+ require 'test/unit'
2
+ require 'shoulda'
3
+ require 'pp'
4
+
@@ -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: sweat_shop
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