zack 0.3.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
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