zack 0.3.0 → 0.3.1

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 CHANGED
@@ -1,3 +1,7 @@
1
+ = 0.3.1 / 31Aug2011
2
+
3
+ . small refactorings
4
+
1
5
  = 0.3.0 / 20Jul2011
2
6
 
3
7
  + Channel names are generated using UUIDs. No duplicate detection yet.
data/lib/zack/client.rb CHANGED
@@ -1,67 +1,42 @@
1
1
 
2
- require 'uuid'
3
2
 
4
- # Client part of Zack RPC
5
- #
6
- class Zack::Client
7
- attr_reader :service
8
-
9
- def initialize(tube_name, opts={})
10
- server = opts[:server] || 'beanstalk:11300'
11
- # Only respond to these messages
12
- @only = opts[:only] || proc { true }
13
- # These have answers (wait for the server to answer)
14
- @with_answer = opts[:with_answer] || []
3
+ module Zack
4
+ # Client for a simple client-server RPC connection.
5
+ #
6
+ class Client
7
+ attr_reader :service
15
8
 
16
- @outgoing = Cod.beanstalk(server, tube_name)
17
- unless @with_answer.empty?
18
- @incoming = Cod.beanstalk(server,
19
- unique_tube_name(tube_name))
20
- end
9
+ # Constructs a client for the service given by tube_name. Optional
10
+ # arguments are:
11
+ #
12
+ # :server :: beanstalkd server location url
13
+ # :only :: ignores all messages not in this hash
14
+ # :with_answer :: these messages wait for an answer from the service
15
+ #
16
+ def initialize(tube_name, opts={})
17
+ server = opts[:server] || 'beanstalk:11300'
18
+ # Only respond to these messages
19
+ @only = opts[:only] || proc { true }
20
+ # These have answers (wait for the server to answer)
21
+ @with_answer = opts[:with_answer] || []
22
+
23
+ @outgoing = Cod.beanstalk(server, tube_name)
24
+ unless @with_answer.empty?
25
+ @incoming = Cod.beanstalk(server,
26
+ UniqueName.new(tube_name))
27
+ end
21
28
 
22
- @service = Cod::Client.new(@outgoing, @incoming, 1)
23
- end
29
+ @service = Cod::Client.new(@outgoing, @incoming, 1)
30
+ end
24
31
 
25
- def respond_to?(msg)
26
- !! @only[msg]
27
- end
28
- def method_missing(sym, *args, &block)
29
- super unless respond_to?(sym)
30
-
31
- raise ArgumentError, "Can't call methods remotely with a block" if block
32
+ def respond_to?(msg)
33
+ !! @only[msg]
34
+ end
32
35
 
33
- if has_answer?(sym)
34
- return service.call([sym, args])
35
- else
36
- service.notify [sym, args]
37
- return nil
36
+ def has_answer?(sym)
37
+ @with_answer.include?(sym.to_sym)
38
38
  end
39
- rescue Cod::Channel::TimeoutError
40
- raise Zack::ServiceTimeout, "No response from server in the allowed time."
41
- end
42
-
43
- def has_answer?(sym)
44
- @with_answer.include?(sym.to_sym)
45
- end
46
39
 
47
- private
48
- # Pretend that UUIDs don't collide for now.
49
- #
50
- def unique_tube_name(name)
51
- "name.#{uuid}"
52
- end
53
- def uuid
54
- uuid_generator.generate
55
- end
56
- def uuid_generator
57
- generator=Thread.current[:zack_uuid_generator]
58
- return generator if generator
59
-
60
- # assert: generator is nil
61
-
62
- # Pretend we've just forked, because that might be the case.
63
- UUID.generator.next_sequence
64
-
65
- Thread.current[:zack_uuid_generator]=generator=UUID.new
40
+ include TransparentProxy
66
41
  end
67
42
  end
data/lib/zack/server.rb CHANGED
@@ -1,61 +1,23 @@
1
1
 
2
- # Server side for RPC calls.
3
- #
4
- class Zack::Server
5
- class SimpleFactory < Struct.new(:implementation_klass)
6
- def produce; implementation_klass.new; end
7
- end
8
-
9
- attr_reader :service
2
+ module Zack
3
+ # Server side for RPC calls.
4
+ #
5
+ class Server < Target
6
+ attr_reader :service
10
7
 
11
- def initialize(tube_name, opts={})
12
- server = opts[:server] || 'beanstalk:11300'
13
-
14
- if opts.has_key? :factory
15
- @factory = opts[:factory]
16
- elsif opts.has_key? :simple
17
- @factory = SimpleFactory.new(opts[:simple])
18
- else
19
- raise ArgumentError, "Either :factory or :simple argument must be given."
20
- end
8
+ def initialize(tube_name, opts={})
9
+ super
21
10
 
22
- channel = Cod.beanstalk(server, tube_name)
23
- @service = Cod::Service.new(channel)
24
- end
25
-
26
- # Handles exactly one request.
27
- #
28
- def handle_request
29
- service.one { |(sym, args)|
30
- instance = @factory.produce
31
-
32
- instance.send(sym, *args)
33
- }
34
- end
35
-
36
- # Runs the server and keeps running until the world ends (or the process,
37
- # whichever comes first).
38
- #
39
- def run(&block)
40
- loop do
41
- exception_handling(block) do
42
- handle_request
43
- end
11
+ channel = Cod.beanstalk(server, tube_name)
12
+ @service = Cod::Service.new(channel)
44
13
  end
45
- end
46
14
 
47
- private
48
- # Defines how the server handles exception.
49
- #
50
- def exception_handling(exception_handler)
51
- if exception_handler
52
- begin
53
- yield
54
- rescue => exception
55
- exception_handler.call(exception)
56
- end
57
- else
58
- yield
15
+ # Handles exactly one request.
16
+ #
17
+ def handle_request
18
+ service.one { |(sym, args)|
19
+ process_request(sym, args)
20
+ }
59
21
  end
60
22
  end
61
23
  end
data/lib/zack.rb CHANGED
@@ -2,11 +2,16 @@
2
2
  require 'cod'
3
3
 
4
4
  module Zack
5
- autoload :Server, 'zack/server'
6
- autoload :Client, 'zack/client'
7
-
8
5
  # Gets raised when the server doesn't answer within the currently configured
9
6
  # timeout for a message that waits for an answer.
10
7
  #
11
8
  class ServiceTimeout < StandardError; end
12
9
  end
10
+
11
+ require 'zack/transparent_proxy'
12
+ require 'zack/unique_name'
13
+
14
+ require 'zack/target'
15
+
16
+ require 'zack/server'
17
+ require 'zack/client'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zack
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,12 +10,12 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2011-07-20 00:00:00.000000000 +02:00
13
+ date: 2011-08-31 00:00:00.000000000 +02:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: cod
18
- requirement: &2157732620 !ruby/object:Gem::Requirement
18
+ requirement: &2166707740 !ruby/object:Gem::Requirement
19
19
  none: false
20
20
  requirements:
21
21
  - - ~>
@@ -23,10 +23,10 @@ dependencies:
23
23
  version: '0.3'
24
24
  type: :runtime
25
25
  prerelease: false
26
- version_requirements: *2157732620
26
+ version_requirements: *2166707740
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: beanstalk-client
29
- requirement: &2157731840 !ruby/object:Gem::Requirement
29
+ requirement: &2166707260 !ruby/object:Gem::Requirement
30
30
  none: false
31
31
  requirements:
32
32
  - - ~>
@@ -34,7 +34,18 @@ dependencies:
34
34
  version: '1.0'
35
35
  type: :runtime
36
36
  prerelease: false
37
- version_requirements: *2157731840
37
+ version_requirements: *2166707260
38
+ - !ruby/object:Gem::Dependency
39
+ name: uuid
40
+ requirement: &2166706800 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: '2.3'
46
+ type: :runtime
47
+ prerelease: false
48
+ version_requirements: *2166706800
38
49
  description:
39
50
  email:
40
51
  - kaspar.schiess@absurd.li