elecnix-workling 0.4.2 → 0.4.9

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.
Files changed (60) hide show
  1. data/CHANGES.markdown +10 -0
  2. data/README.markdown +161 -4
  3. data/bin/workling_client +28 -0
  4. metadata +3 -75
  5. data/lib/rude_q/client.rb +0 -11
  6. data/lib/workling.rb +0 -150
  7. data/lib/workling/base.rb +0 -71
  8. data/lib/workling/clients/amqp_client.rb +0 -56
  9. data/lib/workling/clients/base.rb +0 -57
  10. data/lib/workling/clients/memcache_queue_client.rb +0 -83
  11. data/lib/workling/discovery.rb +0 -14
  12. data/lib/workling/remote.rb +0 -42
  13. data/lib/workling/remote/invokers/base.rb +0 -124
  14. data/lib/workling/remote/invokers/basic_poller.rb +0 -41
  15. data/lib/workling/remote/invokers/eventmachine_subscriber.rb +0 -41
  16. data/lib/workling/remote/invokers/threaded_poller.rb +0 -140
  17. data/lib/workling/remote/runners/backgroundjob_runner.rb +0 -35
  18. data/lib/workling/remote/runners/base.rb +0 -42
  19. data/lib/workling/remote/runners/client_runner.rb +0 -45
  20. data/lib/workling/remote/runners/not_remote_runner.rb +0 -23
  21. data/lib/workling/remote/runners/rudeq_runner.rb +0 -23
  22. data/lib/workling/remote/runners/spawn_runner.rb +0 -38
  23. data/lib/workling/remote/runners/starling_runner.rb +0 -13
  24. data/lib/workling/return/store/base.rb +0 -42
  25. data/lib/workling/return/store/iterator.rb +0 -24
  26. data/lib/workling/return/store/memory_return_store.rb +0 -26
  27. data/lib/workling/return/store/rudeq_return_store.rb +0 -24
  28. data/lib/workling/return/store/starling_return_store.rb +0 -31
  29. data/lib/workling/routing/base.rb +0 -13
  30. data/lib/workling/routing/class_and_method_routing.rb +0 -55
  31. data/lib/workling/rudeq.rb +0 -7
  32. data/lib/workling/rudeq/client.rb +0 -17
  33. data/lib/workling/rudeq/poller.rb +0 -116
  34. data/test/class_and_method_routing_test.rb +0 -18
  35. data/test/clients/memory_queue_client.rb +0 -36
  36. data/test/discovery_test.rb +0 -13
  37. data/test/invoker_basic_poller_test.rb +0 -29
  38. data/test/invoker_eventmachine_subscription_test.rb +0 -26
  39. data/test/invoker_threaded_poller_test.rb +0 -34
  40. data/test/memcachequeue_client_test.rb +0 -36
  41. data/test/memory_return_store_test.rb +0 -32
  42. data/test/mocks/client.rb +0 -9
  43. data/test/mocks/logger.rb +0 -5
  44. data/test/mocks/rude_queue.rb +0 -9
  45. data/test/mocks/spawn.rb +0 -5
  46. data/test/not_remote_runner_test.rb +0 -11
  47. data/test/remote_runner_test.rb +0 -58
  48. data/test/rescue_test.rb +0 -24
  49. data/test/return_store_test.rb +0 -24
  50. data/test/rudeq_client_test.rb +0 -30
  51. data/test/rudeq_poller_test.rb +0 -14
  52. data/test/rudeq_return_store_test.rb +0 -20
  53. data/test/rudeq_runner_test.rb +0 -22
  54. data/test/runners/thread_runner.rb +0 -22
  55. data/test/spawn_runner_test.rb +0 -10
  56. data/test/starling_return_store_test.rb +0 -29
  57. data/test/starling_runner_test.rb +0 -8
  58. data/test/test_helper.rb +0 -50
  59. data/test/workers/analytics/invites.rb +0 -10
  60. data/test/workers/util.rb +0 -25
@@ -1,26 +0,0 @@
1
- require File.dirname(__FILE__) + '/test_helper.rb'
2
-
3
- context "the invoker 'eventmachine subscription'" do
4
- setup do
5
- routing = Workling::Routing::ClassAndMethodRouting.new
6
- @client_class = Workling::Clients::MemoryQueueClient
7
- @client = @client_class.new
8
- @client.connect
9
- @invoker = Workling::Remote::Invokers::EventmachineSubscriber.new(routing, @client_class)
10
- end
11
-
12
- specify "should invoke Util.echo with the arg 'hello' if the string 'hello' is set onto the queue utils__echo" do
13
-
14
- # make sure all new instances point to the same client. that way, state is shared
15
- Workling::Clients::MemoryQueueClient.expects(:new).at_least_once.returns @client
16
- Util.any_instance.expects(:echo).once.with({ :message => "hello" })
17
-
18
- # Don't take longer than 10 seconds to shut this down.
19
- Timeout::timeout(10) do
20
- listener = Thread.new { @invoker.listen }
21
- @client.request("utils__echo", { :message => "hello" })
22
- @invoker.stop
23
- listener.join
24
- end
25
- end
26
- end
@@ -1,34 +0,0 @@
1
- require File.dirname(__FILE__) + '/test_helper.rb'
2
-
3
- context "the invoker 'threaded poller'" do
4
- setup do
5
- routing = Workling::Routing::ClassAndMethodRouting.new
6
- @client = Workling::Clients::MemoryQueueClient.new
7
- @client.connect
8
- @invoker = Workling::Remote::Invokers::ThreadedPoller.new(routing, @client.class)
9
- end
10
-
11
- specify "should invoke Util.echo with the arg 'hello' if the string 'hello' is set onto the queue utils__echo" do
12
- Util.any_instance.stubs(:echo).with("hello")
13
- @client.request("utils__echo", "hello")
14
- @invoker.dispatch!(@client, Util)
15
- end
16
-
17
- specify "should not explode when listen is called, and stop nicely when stop is called. " do
18
- connection = mock()
19
- connection.expects(:active?).at_least_once.returns(true)
20
- ActiveRecord::Base.expects(:connection).at_least_once.returns(connection)
21
-
22
- client = mock()
23
- client.expects(:retrieve).at_least_once.returns("hi")
24
- client.expects(:connect).at_least_once.returns(true)
25
- Workling::Clients::MemoryQueueClient.expects(:new).at_least_once.returns(client)
26
-
27
- # Don't take longer than 10 seconds to shut this down.
28
- Timeout::timeout(10) do
29
- listener = Thread.new { @invoker.listen }
30
- @invoker.stop
31
- listener.join
32
- end
33
- end
34
- end
@@ -1,36 +0,0 @@
1
- require File.dirname(__FILE__) + '/test_helper'
2
-
3
- context "The memcachequeue client" do
4
- specify "should be able to connect to multiple queue instances" do
5
- Workling.send :class_variable_set, "@@config", { :listens_on => "localhost:12345, 127.0.0.1:12346", :memcache_options => { :namespace => "myapp_development" } }
6
- client = Workling::Clients::MemcacheQueueClient.new
7
- client.connect
8
-
9
- client.queueserver_urls.should.equal ["localhost:12345", "127.0.0.1:12346"]
10
- client.connection.servers.first.host.should == "localhost"
11
- client.connection.servers.first.port.should == 12345
12
- client.connection.servers[1].host.should == "127.0.0.1"
13
- client.connection.servers[1].port.should == 12346
14
- client.connection.namespace.should.equal "myapp_development"
15
- end
16
-
17
- specify "should load it's config as well as any given MemCache options from RAILS_ENV/config/workling.yml" do
18
- Workling.send :class_variable_set, "@@config", { :listens_on => "localhost:12345", :memcache_options => { :namespace => "myapp_development" } }
19
- client = Workling::Clients::MemcacheQueueClient.new
20
- client.connect
21
-
22
- client.queueserver_urls.should.equal ["localhost:12345"]
23
- client.connection.servers.first.host.should == "localhost"
24
- client.connection.servers.first.port.should == 12345
25
- client.connection.namespace.should.equal "myapp_development"
26
- end
27
-
28
-
29
- specify "should load it's config correctly if no memcache options are given" do
30
- Workling.send :class_variable_set, "@@config", { :listens_on => "localhost:12345" }
31
- client = Workling::Clients::MemcacheQueueClient.new
32
- client.connect
33
-
34
- client.queueserver_urls.should.equal ["localhost:12345"]
35
- end
36
- end
@@ -1,32 +0,0 @@
1
- require File.dirname(__FILE__) + '/test_helper.rb'
2
-
3
- context "the memory return store" do
4
- specify "should be able to store a value with a key, and then retrieve that same value with the same key." do
5
- store = Workling::Return::Store::MemoryReturnStore.new
6
- key, value = :gender, :undecided
7
- store.set(key, value)
8
- store.get(key).should.equal(value)
9
- end
10
-
11
- specify "should delete values in the store once they have been get()tted." do
12
- store = Workling::Return::Store::MemoryReturnStore.new
13
- key, value = :gender, :undecided
14
- store.set(key, value)
15
- store.get(key)
16
- store.get(key).should.equal nil
17
- end
18
-
19
- specify "should return nothing for a key that is not in the store" do
20
- store = Workling::Return::Store::MemoryReturnStore.new
21
- store.get(:bollocks).should.equal nil
22
- end
23
-
24
- specify "should be able to set and get two items into the same store" do
25
- store = Workling::Return::Store::MemoryReturnStore.new
26
- store.set(:gender, :male)
27
- store.set(:gender, :female)
28
- store.get(:key)
29
- store.get(:key).should.equal :female
30
- end
31
-
32
- end
data/test/mocks/client.rb DELETED
@@ -1,9 +0,0 @@
1
- require 'workling/clients/base'
2
-
3
- module Workling
4
- module Clients
5
- class MemcacheQueueClient < Workling::Clients::Base
6
- def raise_unless_connected!; end
7
- end
8
- end
9
- end
data/test/mocks/logger.rb DELETED
@@ -1,5 +0,0 @@
1
- class Logger
2
- def initialize(*args); end
3
- def log(str); end
4
- def error(str); end
5
- end
@@ -1,9 +0,0 @@
1
- class RudeQueue
2
- @@store = Hash.new(){ |hash, key| hash[key]=[] }
3
- def self.get(queue_name)
4
- @@store[queue_name.to_s].shift
5
- end
6
- def self.set(queue_name, value)
7
- @@store[queue_name.to_s] << value
8
- end
9
- end
data/test/mocks/spawn.rb DELETED
@@ -1,5 +0,0 @@
1
- module Spawn
2
- def spawn(*args)
3
- yield
4
- end
5
- end
@@ -1,11 +0,0 @@
1
- require File.dirname(__FILE__) + '/test_helper'
2
-
3
- context "The not remote runner" do
4
- specify "should swallow exceptions raised in the workling" do
5
- old_dispatcher = Workling::Remote.dispatcher
6
-
7
- Workling::Remote.dispatcher = Workling::Remote::Runners::NotRemoteRunner.new
8
- Workling::Remote.run(:util, :faulty)
9
- Workling::Remote.dispatcher = old_dispatcher # set back to whence we came
10
- end
11
- end
@@ -1,58 +0,0 @@
1
- require File.dirname(__FILE__) + '/test_helper.rb'
2
-
3
- context "the remote runner" do
4
- specify "should be able to invoke a task on a worker" do
5
- Util.any_instance.stubs(:echo).with("hello")
6
- Workling::Remote.run(:util, :echo, "hello")
7
- end
8
-
9
- specify "should invoke the dispatcher set up in Workling::Remote.dispatcher" do
10
- clazz, method, options = :util, :echo, { :message => "somebody_came@along.com" }
11
- old_dispatcher = Workling::Remote.dispatcher
12
- dispatcher = mock
13
- dispatcher.expects(:run).with(clazz, method, options)
14
- Workling::Remote.dispatcher = dispatcher
15
- Workling::Remote.run(clazz, method, options)
16
- Workling::Remote.dispatcher = old_dispatcher # set back to whence we came
17
- end
18
-
19
- specify "should, when being tested, use the default remote runner by when no runner was explicitly set. " do
20
- Workling::Remote.dispatcher.class.should.equal Workling.default_runner.class
21
- end
22
-
23
- specify "should raise a Workling::WorklingNotFoundError if it is invoked with a worker key that cannot be constantized" do
24
- should.raise Workling::WorklingNotFoundError do
25
- Workling::Remote.run(:quatsch_mit_sosse, :fiddle_di_liddle)
26
- end
27
- end
28
-
29
- specify "should raise a Workling::WorklingNotFoundError if it is invoked with a valid worker key but the method is not defined on that worker" do
30
- dispatcher = Workling::Remote.dispatcher
31
- Workling::Remote.dispatcher = Workling::Remote::Runners::ThreadRunner.new # simulates a remote runner (workling in another context)
32
-
33
- should.raise Workling::WorklingNotFoundError do
34
- Workling::Remote.run(:util, :sau_sack)
35
- end
36
-
37
- Workling::Remote.dispatcher = dispatcher
38
- end
39
-
40
- specify "should invoke work when called in this way: YourWorkling.asynch_your_method(options)" do
41
- Util.any_instance.expects(:echo).once
42
- Util.asynch_echo
43
- end
44
-
45
- specify "should invoke work with the arguments intact when called in this way: YourWorkling.asynch_your_method(options)" do
46
- stuffing = { :description => "toasted breadcrumbs with dill" }
47
- Util.any_instance.expects(:stuffing).with(stuffing).once
48
- Util.asynch_stuffing(stuffing)
49
- end
50
-
51
- specify "should use default arguments if they exist" do
52
- default_options = { :flavor => 'purple' }
53
- custom_options = { :color => 'purple' }
54
- Util.any_instance.expects(:default_options).returns(default_options)
55
- Util.any_instance.expects(:stuffing).with(all_of(has_entry(:flavor => 'purple'), has_entry(:color => 'purple'))).once
56
- Util.asynch_stuffing(custom_options)
57
- end
58
- end
data/test/rescue_test.rb DELETED
@@ -1,24 +0,0 @@
1
- require File.dirname(__FILE__) + '/test_helper.rb'
2
-
3
- context "Exceptions raised by worker" do
4
- before do
5
- @old_dispatcher = Workling::Remote.dispatcher
6
- Workling::Remote.dispatcher = Workling::Remote::Runners::NotRemoteRunner.new
7
- end
8
- after do
9
- Workling::Remote.dispatcher = @old_dispatcher # set back to whence we came
10
- end
11
-
12
- specify "should not escape dispatcher" do
13
- lambda {
14
- Workling::Remote.run(:util, :broken)
15
- }.should.not.raise
16
- end
17
-
18
- specify "should call on_error method" do
19
- count = Util.on_error_call_count
20
- Workling::Remote.run(:util, :broken)
21
-
22
- Util.on_error_call_count.should.equal(count + 1)
23
- end
24
- end
@@ -1,24 +0,0 @@
1
- require File.dirname(__FILE__) + '/test_helper'
2
-
3
- context "The return store" do
4
- specify "should set a value on the current store when invoked like this: Workling::Return::Store.set(:key, 'value')" do
5
- Workling::Return::Store.set(:key, :value)
6
- Workling::Return::Store.get(:key).should.equal :value
7
- end
8
-
9
- specify "should get a value on the current store when invoked like this: Workling::Return::Store.get(:key)" do
10
- Workling::Return::Store.set(:key, :value)
11
- Workling::Return::Store.get(:key).should.equal :value
12
- end
13
-
14
- specify "should set a value on the current store when invoked like this: Workling.return.set(:key, 'value')" do
15
- Workling.return.set(:key, :value)
16
- Workling.return.get(:key).should.equal :value
17
- end
18
-
19
- specify "should return an iterator for a specific key when invoked like this: Workling.return.iterator(key)" do
20
- Workling::Return::Store.set(:key, 1)
21
- Workling::Return::Store.set(:key, 2)
22
- Workling.return.iterator(:key).collect{ |item| item }.should.equal [1, 2]
23
- end
24
- end
@@ -1,30 +0,0 @@
1
- require File.dirname(__FILE__) + '/test_helper'
2
-
3
- context "The Rudeq client" do
4
- specify "should by default set a RudeQueue as its :queue" do
5
- client = Workling::Rudeq::Client.new
6
- client.queue.should == RudeQueue
7
- end
8
-
9
- specify "should user Rudeq.config[:queue_class] as the class" do
10
- before = Workling::Rudeq.config[:queue_class]
11
-
12
- Workling::Rudeq.config[:queue_class] = "String"
13
- client = Workling::Rudeq::Client.new
14
- client.queue.should == String
15
-
16
- Workling::Rudeq.config[:queue_class] = before
17
- end
18
-
19
- specify "should defer :get to the RudeQueue" do
20
- RudeQueue.expects(:get).with(:abc)
21
- client = Workling::Rudeq::Client.new
22
- client.get(:abc)
23
- end
24
-
25
- specify "should defer :set to the RudeQueue" do
26
- RudeQueue.expects(:set).with(:abc, "some value")
27
- client = Workling::Rudeq::Client.new
28
- client.set(:abc, "some value")
29
- end
30
- end
@@ -1,14 +0,0 @@
1
- require File.dirname(__FILE__) + '/test_helper.rb'
2
-
3
- context "the RudeQ poller" do
4
- setup do
5
- routing = Workling::Starling::Routing::ClassAndMethodRouting.new
6
- @client = Workling::Rudeq::Poller.new(routing)
7
- end
8
-
9
- specify "should invoke Util.echo with the arg 'hello' if the string 'hello' is set onto the queue utils__echo" do
10
- Util.any_instance.expects(:echo).with("hello")
11
- RudeQueue.set("utils__echo", "hello")
12
- @client.dispatch!(RudeQueue, Util)
13
- end
14
- end
@@ -1,20 +0,0 @@
1
- require File.dirname(__FILE__) + '/test_helper'
2
-
3
- context "the RudeQ return store" do
4
-
5
- def get_store
6
- Workling::Return::Store::RudeqReturnStore.new
7
- end
8
-
9
- specify "should defer :get to the RudeQueue" do
10
- RudeQueue.expects(:get).with(:abc)
11
- store = get_store
12
- store.get(:abc)
13
- end
14
-
15
- specify "should defer :set to the RudeQueue" do
16
- RudeQueue.expects(:set).with(:abc, "some value")
17
- store = get_store
18
- store.set(:abc, "some value")
19
- end
20
- end
@@ -1,22 +0,0 @@
1
- require File.dirname(__FILE__) + '/test_helper.rb'
2
-
3
- context "the RudeQ runner" do
4
- setup do
5
- @before = Workling::Remote.dispatcher
6
- end
7
-
8
- specify "should set up a RudeQ client" do
9
- Workling::Remote.dispatcher = Workling::Remote::Runners::RudeqRunner.new
10
- Workling::Remote.dispatcher.client.should.not.equal nil
11
- Workling::Remote.dispatcher.client.queue.should.equal RudeQueue
12
- end
13
-
14
- specify ":run should use Starling routing" do
15
- RudeQueue.expects(:set).with("utils__echo", "hello")
16
- Workling::Remote::Runners::RudeqRunner.new.run(Util, :echo, "hello")
17
- end
18
-
19
- teardown do
20
- Workling::Remote.dispatcher = @before
21
- end
22
- end
@@ -1,22 +0,0 @@
1
- require 'workling/remote/runners/base'
2
-
3
- #
4
- # Spawns a Thread. Used for Tests only, to simulate a remote runner more realistically.
5
- #
6
- module Workling
7
- module Remote
8
- module Runners
9
- class ThreadRunner < Workling::Remote::Runners::Base
10
-
11
- # spawns a thread.
12
- def run(clazz, method, options = {})
13
- Thread.new {
14
- dispatch!(clazz, method, options)
15
- }
16
-
17
- return nil
18
- end
19
- end
20
- end
21
- end
22
- end
@@ -1,10 +0,0 @@
1
- require File.dirname(__FILE__) + '/test_helper.rb'
2
-
3
- context "the spawn runner" do
4
- specify "should invoke work that is delegated to it" do
5
- old_dispatcher = Workling::Remote.dispatcher
6
- Workling::Remote.dispatcher = Workling::Remote::Runners::SpawnRunner.new
7
- Workling::Remote.run(:util, :echo)
8
- Workling::Remote.dispatcher = old_dispatcher
9
- end
10
- end
@@ -1,29 +0,0 @@
1
- require File.dirname(__FILE__) + '/test_helper'
2
-
3
- context "the starling return store" do
4
- setup do
5
- # the memoryreturnstore behaves exactly like memcache.
6
- MemCache.expects(:new).at_least(0).returns Workling::Return::Store::MemoryReturnStore.new
7
- Workling::Clients::MemcacheQueueClient.expects(:connection).at_least(0).returns Workling::Return::Store::MemoryReturnStore.new
8
- end
9
-
10
- specify "should be able to store a value with a key, and then retrieve that same value with the same key." do
11
- store = Workling::Return::Store::StarlingReturnStore.new
12
- key, value = :gender, :undecided
13
- store.set(key, value)
14
- store.get(key).should.equal(value)
15
- end
16
-
17
- specify "should delete values in the store once they have been get()tted." do
18
- store = Workling::Return::Store::StarlingReturnStore.new
19
- key, value = :gender, :undecided
20
- store.set(key, value)
21
- store.get(key)
22
- store.get(key).should.equal nil
23
- end
24
-
25
- specify "should return nothing for a key that is not in the store" do
26
- store = Workling::Return::Store::StarlingReturnStore.new
27
- store.get(:bollocks).should.equal nil
28
- end
29
- end