zk-eventmachine 0.1.11 → 0.1.12

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -7,3 +7,4 @@ pkg/*
7
7
  .rspec
8
8
  *.log
9
9
  .yardoc
10
+ doc
data/.yardopts ADDED
@@ -0,0 +1,8 @@
1
+ --protected
2
+ --no-private
3
+ --tag hidden_example:Hidden
4
+ --hide-tag hidden_example
5
+ -
6
+ LICENSE
7
+ README.markdown
8
+
data/Rakefile CHANGED
@@ -1,2 +1,37 @@
1
1
  require 'bundler'
2
2
  Bundler::GemHelper.install_tasks
3
+
4
+ task :yard do
5
+ Bundler.setup
6
+ require 'yard'
7
+
8
+ YARD::Rake::YardocTask.new(:run_yardoc) do |t|
9
+ t.files = ['lib/**/*.rb']
10
+ end
11
+
12
+ Rake::Task[:run_yardoc].invoke
13
+ end
14
+
15
+ %w[1.8.7 1.9.2 1.9.3 jruby].each do |rvm_ruby|
16
+ gemset_name = 'zk-em'
17
+ ruby_with_gemset = "#{rvm_ruby}@#{gemset_name}"
18
+ create_gemset_name = "mb:#{rvm_ruby}:create_gemset"
19
+ bundle_task_name = "mb:#{rvm_ruby}:bundle_install"
20
+ rspec_task_name = "mb:#{rvm_ruby}:run_rspec"
21
+
22
+ task create_gemset_name do
23
+ sh "rvm #{rvm_ruby} && rvm gemset create #{gemset_name}"
24
+ end
25
+
26
+ task bundle_task_name => create_gemset_name do
27
+ rm_f 'Gemfile.lock'
28
+ sh "rvm #{ruby_with_gemset} do bundle install"
29
+ end
30
+
31
+ task rspec_task_name => bundle_task_name do
32
+ sh "rvm #{ruby_with_gemset} do bundle exec rspec spec"
33
+ end
34
+
35
+ task 'mb:test_all' => rspec_task_name
36
+ end
37
+
@@ -4,7 +4,7 @@ require 'zookeeper'
4
4
  require 'zookeeper/em_client'
5
5
 
6
6
  require 'zk'
7
-
7
+ require 'deferred'
8
8
 
9
9
  module ZK
10
10
  module ZKEventMachine
@@ -15,7 +15,6 @@ end
15
15
  $LOAD_PATH.unshift(File.expand_path('../..', __FILE__)).uniq!
16
16
 
17
17
  require 'z_k/z_k_event_machine/iterator'
18
- require 'z_k/z_k_event_machine/deferred'
19
18
  require 'z_k/z_k_event_machine/callback'
20
19
  require 'z_k/z_k_event_machine/event_handler_e_m'
21
20
  require 'z_k/z_k_event_machine/unixisms'
@@ -70,7 +70,7 @@ module ZK
70
70
  #
71
71
  # @param [Hash] hash the result of the async call
72
72
  #
73
- # @returns [true, false] for success, failure
73
+ # @return [true, false] for success, failure
74
74
  def success?(hash)
75
75
  hash[:rc] == Zookeeper::ZOK
76
76
  end
@@ -1,22 +1,63 @@
1
1
  module ZK
2
2
  module ZKEventMachine
3
3
  class Client < ZK::Client::Base
4
+ include Deferred::Accessors
4
5
  include ZK::Logging
5
6
  include Unixisms
6
7
 
7
8
  DEFAULT_TIMEOUT = 10
8
9
 
10
+ # If we get a ZK::Exceptions::ConnectionLoss exeption back from any call,
11
+ # or a EXPIRED_SESSION_STATE event, we will call back any handlers registered
12
+ # here with the exception instance as the argument.
13
+ #
14
+ # once this deferred has been fired, it will be replaced with a new
15
+ # deferred, so callbacks must be re-registered, and *should* be
16
+ # re-registered *within* the callback to avoid missing events
17
+ #
18
+ # @method on_connection_lost
19
+ # @return [Deferred::Default]
20
+ deferred_event :connection_lost
21
+
22
+
23
+ # Registers a one-shot callback for the ZOO_CONNECTED_STATE event.
24
+ #
25
+ # @note this is experimental currently. This may or may not fire for the *initial* connection.
26
+ # it's purpose is to warn an already-existing client with watches that a connection has been
27
+ # re-established (with session information saved). From the ZooKeeper Programmers' Guide:
28
+ #
29
+ # If you are using watches, you must look for the connected watch event.
30
+ # When a ZooKeeper client disconnects from a server, you will not receive
31
+ # notification of changes until reconnected. If you are watching for a
32
+ # znode to come into existance, you will miss the event if the znode is
33
+ # created and deleted while you are disconnected.
34
+ #
35
+ # once this deferred has been fired, it will be replaced with a new
36
+ # deferred, so callbacks must be re-registered, and *should* be
37
+ # re-registered *within* the callback to avoid missing events
38
+ #
39
+ # @method on_connected
40
+ # @return [Deferred::Default]
41
+ deferred_event :connected
42
+
43
+ # Registers a one-shot callback for the ZOO_CONNECTING_STATE event
44
+ #
45
+ # This event is triggered when we have become disconnected from the
46
+ # cluster and are in the process of reconnecting.
47
+ deferred_event :connecting
48
+
49
+ # called back once the connection has been closed.
50
+ #
51
+ # @method on_close
52
+ # @return [Deferred::Default]
53
+ deferred_event :close
54
+
9
55
  # Takes same options as ZK::Client::Base
10
56
  def initialize(host, opts={})
11
57
  @host = host
12
- @close_deferred = Deferred::Default.new
13
- @connection_lost_deferred = Deferred::Default.new
14
- @event_handler = EventHandlerEM.new(self)
15
- end
16
-
17
- def on_close(&blk)
18
- @close_deferred.callback(&blk) if blk
19
- @close_deferred
58
+ @event_handler = EventHandlerEM.new(self)
59
+ @closing = false
60
+ register_default_event_handlers!
20
61
  end
21
62
 
22
63
  # open a ZK connection, attach it to the reactor.
@@ -25,30 +66,20 @@ module ZK
25
66
  def connect(&blk)
26
67
  # XXX: maybe move this into initialize, need to figure out how to schedule it properly
27
68
  @cnx ||= (
28
- event_handler.register_state_handler(Zookeeper::ZOO_EXPIRED_SESSION_STATE, &method(:handle_expired_session_state_event!))
29
69
  ZookeeperEM::Client.new(@host, DEFAULT_TIMEOUT, event_handler.get_default_watcher_block)
30
70
  )
31
71
  @cnx.on_attached(&blk)
32
72
  end
33
73
 
34
- # If we get a ZK::Exceptions::ConnectionLoss exeption back from any call,
35
- # we will call back any handlers registered here with the exception
36
- # instance as the argument
37
- #
38
- # once this deferred has been fired, it will be replaced with a new
39
- # deferred, so callbacks must be re-registered
40
- #
41
- def on_connection_lost(&blk)
42
- @connection_lost_deferred.callback(&blk) if blk
43
- @connection_lost_deferred
44
- end
45
-
74
+ # @private
46
75
  def reopen(*a)
47
76
  raise NotImplementedError, "reoopen is not implemented for the eventmachine version of the client"
48
77
  end
49
78
 
50
79
  def close!(&blk)
51
80
  on_close(&blk)
81
+ return on_close if @closing
82
+ @closing = true
52
83
 
53
84
  if @cnx
54
85
  logger.debug { "#{self.class.name}: in close! clearing event_handler" }
@@ -70,7 +101,7 @@ module ZK
70
101
 
71
102
  # get data at path, optionally enabling a watch on the node
72
103
  #
73
- # @returns [Callback] returns a Callback which is an EM::Deferred (so you
104
+ # @return [Callback] returns a Callback which is an EM::Deferred (so you
74
105
  # can assign callbacks/errbacks) see Callback::Base for discussion
75
106
  #
76
107
  def get(path, opts={}, &block)
@@ -137,27 +168,47 @@ module ZK
137
168
  end
138
169
  end
139
170
 
171
+ # @return [Fixnum] The underlying connection's session_id
140
172
  def session_id
141
173
  return nil unless @cnx
142
174
  @cnx.session_id
143
175
  end
144
176
 
177
+ # @return [String] The underlying connection's session passwd (an opaque value)
145
178
  def session_passwd
146
179
  return nil unless @cnx
147
180
  @cnx.session_passwd
148
181
  end
149
182
 
150
183
  protected
184
+ # @private
185
+ def register_default_event_handlers!
186
+ @event_handler.register_state_handler(Zookeeper::ZOO_EXPIRED_SESSION_STATE, &method(:handle_expired_session_state_event!))
187
+ @event_handler.register_state_handler(Zookeeper::ZOO_CONNECTED_STATE, &method(:handle_connected_state_event!))
188
+ @event_handler.register_state_handler(Zookeeper::ZOO_CONNECTING_STATE, &method(:handle_connecting_state_event!))
189
+ end
190
+
191
+ # @private
192
+ def handle_connected_state_event!(event)
193
+ reset_connected_event.succeed(event)
194
+ end
195
+
196
+ # @private
197
+ def handle_connecting_state_event!(event)
198
+ reset_connecting_event.succeed(event)
199
+ end
200
+
201
+ # @private
151
202
  def handle_expired_session_state_event!(event)
152
203
  exc = ZK::Exceptions::ConnectionLoss.new("Received EXPIRED_SESSION_STATE event: #{event.inspect}")
153
204
  exc.set_backtrace(caller)
154
205
  connection_lost_hook(exc)
155
206
  end
156
207
 
208
+ # @private
157
209
  def connection_lost_hook(exc)
158
210
  if exc and exc.kind_of?(ZK::Exceptions::ConnectionLoss)
159
- dfr, @connection_lost_deferred = @connection_lost_deferred, Deferred::Default.new
160
- dfr.succeed(exc)
211
+ reset_connection_lost_event.succeed(exc)
161
212
  end
162
213
  end
163
214
  end
@@ -31,15 +31,18 @@ module ZK
31
31
  _handle_calling_convention(dfr, &blk)
32
32
  end
33
33
 
34
+ # @private
34
35
  def find(*paths, &block)
35
36
  raise NotImplementedError, "Coming soon"
36
37
  end
37
38
 
39
+ # @private
38
40
  def block_until_node_deleted(abs_node_path)
39
41
  raise NotImplementedError, "blocking does not make sense in EventMachine-land"
40
42
  end
41
43
 
42
44
  protected
45
+ # @private
43
46
  def _handle_calling_convention(dfr, &blk)
44
47
  return dfr unless blk
45
48
  dfr.callback { |*a| blk.call(nil, *a) }
@@ -47,6 +50,7 @@ module ZK
47
50
  dfr
48
51
  end
49
52
 
53
+ # @private
50
54
  def _rm_rf_dfr(path)
51
55
  Deferred::Default.new.tap do |my_dfr|
52
56
  delete(path) do |exc|
@@ -85,6 +89,7 @@ module ZK
85
89
  end
86
90
  end
87
91
 
92
+ # @private
88
93
  def _mkdir_p_dfr(path)
89
94
  Deferred::Default.new.tap do |my_dfr|
90
95
  d = create(path, '')
@@ -1,5 +1,5 @@
1
1
  module ZK
2
2
  module ZKEventMachine
3
- VERSION = "0.1.11"
3
+ VERSION = "0.1.12"
4
4
  end
5
5
  end
@@ -18,6 +18,15 @@ module ZK::ZKEventMachine
18
18
  @zk.close!
19
19
  end
20
20
 
21
+ def event_mock(name=:event)
22
+ flexmock(name).tap do |ev|
23
+ ev.should_receive(:node_event?).and_return(false)
24
+ ev.should_receive(:state_event?).and_return(true)
25
+ ev.should_receive(:zk=).with_any_args
26
+ yield ev if block_given?
27
+ end
28
+ end
29
+
21
30
  describe 'connect' do
22
31
  it %[should return a deferred that fires when connected and then close] do
23
32
  em do
@@ -45,64 +54,6 @@ module ZK::ZKEventMachine
45
54
  end
46
55
  end
47
56
 
48
- describe 'on_connection_loss' do
49
- before do
50
- @path = [@base_path, 'foo'].join('/')
51
- @data = 'this is data'
52
- @zk.create(@path, @data)
53
- end
54
-
55
- it %[should be called back if the connection is lost] do
56
- em do
57
- @zkem.on_connection_lost do |exc|
58
- logger.debug { "WIN!" }
59
- exc.should be_kind_of(ZK::Exceptions::ConnectionLoss)
60
- @zkem.close! { done }
61
- end
62
-
63
- @zkem.connect do
64
- flexmock(@zkem.cnx) do |m|
65
- m.should_receive(:get).with(Hash).and_return do |hash|
66
- logger.debug { "client received :get wtih #{hash.inspect}" }
67
- @user_cb = hash[:callback]
68
-
69
- EM.next_tick do
70
- logger.debug { "calling back user cb with connection loss" }
71
- @user_cb.call(:rc => ZK::Exceptions::CONNECTIONLOSS)
72
- end
73
-
74
- { :rc => Zookeeper::ZOK }
75
- end
76
- end
77
-
78
- @zkem.get(@path) do |exc,data|
79
- exc.should be_kind_of(ZK::Exceptions::ConnectionLoss)
80
- end
81
- end
82
- end
83
- end
84
-
85
- it %[should be called if we get a session expired event] do
86
- @zkem.on_connection_lost do |exc|
87
- logger.debug { "WIN!" }
88
- exc.should be_kind_of(ZK::Exceptions::ConnectionLoss)
89
- @zkem.close! { done }
90
- end
91
-
92
- em do
93
- @zkem.connect do
94
- event = flexmock(:event).tap do |ev|
95
- ev.should_receive(:node_event?).and_return(false)
96
- ev.should_receive(:state_event?).and_return(true)
97
- ev.should_receive(:zk=).with_any_args
98
- ev.should_receive(:state).and_return(Zookeeper::ZOO_EXPIRED_SESSION_STATE)
99
- end
100
-
101
- EM.next_tick { @zkem.event_handler.process(event) }
102
- end
103
- end
104
- end
105
- end
106
57
 
107
58
  describe 'get' do
108
59
  describe 'success' do
@@ -288,7 +239,6 @@ module ZK::ZKEventMachine
288
239
  end # failure
289
240
  end # create
290
241
 
291
-
292
242
  describe 'set' do
293
243
  describe 'success' do
294
244
  before do
@@ -775,6 +725,96 @@ module ZK::ZKEventMachine
775
725
  end
776
726
  end
777
727
  end
728
+
729
+ describe 'on_connection_lost' do
730
+ before do
731
+ @path = [@base_path, 'foo'].join('/')
732
+ @data = 'this is data'
733
+ @zk.create(@path, @data)
734
+ end
735
+
736
+ it %[should be called back if the connection is lost] do
737
+ em do
738
+ @zkem.on_connection_lost do |exc|
739
+ logger.debug { "WIN!" }
740
+ exc.should be_kind_of(ZK::Exceptions::ConnectionLoss)
741
+ @zkem.close! { done }
742
+ end
743
+
744
+ @zkem.connect do
745
+ flexmock(@zkem.cnx) do |m|
746
+ m.should_receive(:get).with(Hash).and_return do |hash|
747
+ logger.debug { "client received :get wtih #{hash.inspect}" }
748
+ @user_cb = hash[:callback]
749
+
750
+ EM.next_tick do
751
+ logger.debug { "calling back user cb with connection loss" }
752
+ @user_cb.call(:rc => ZK::Exceptions::CONNECTIONLOSS)
753
+ end
754
+
755
+ { :rc => Zookeeper::ZOK }
756
+ end
757
+ end
758
+
759
+ @zkem.get(@path) do |exc,data|
760
+ exc.should be_kind_of(ZK::Exceptions::ConnectionLoss)
761
+ end
762
+ end
763
+ end
764
+ end
765
+
766
+ it %[should be called if we get a session expired event] do
767
+ @zkem.on_connection_lost do |exc|
768
+ logger.debug { "WIN!" }
769
+ exc.should be_kind_of(ZK::Exceptions::ConnectionLoss)
770
+ @zkem.close! { done }
771
+ end
772
+
773
+ em do
774
+ @zkem.connect do
775
+ event = event_mock(:connection_loss_event).tap do |ev|
776
+ ev.should_receive(:state).and_return(Zookeeper::ZOO_EXPIRED_SESSION_STATE)
777
+ end
778
+
779
+ EM.next_tick { @zkem.event_handler.process(event) }
780
+ end
781
+ end
782
+ end
783
+ end # on_connection_lost
784
+
785
+ describe 'on_connected' do
786
+ it %[should be called back when a ZOO_CONNECTED_STATE event is received] do
787
+ em do
788
+ @zkem.on_connected do |event|
789
+ logger.debug { "WIN!" }
790
+ @zkem.close! { done }
791
+ end
792
+
793
+ @zkem.connect do
794
+ logger.debug { "we connected" }
795
+ end
796
+ end
797
+ end
798
+ end # on_connected
799
+
800
+ describe 'on_connecting' do
801
+ it %[should be called back when a ZOO_CONNECTING_STATE event is received] do
802
+ @zkem.on_connecting do |event|
803
+ logger.debug { "WIN!" }
804
+ @zkem.close! { done }
805
+ end
806
+
807
+ em do
808
+ @zkem.connect do
809
+ event = event_mock(:connecting_event).tap do |ev|
810
+ ev.should_receive(:state).and_return(Zookeeper::ZOO_CONNECTING_STATE)
811
+ end
812
+
813
+ EM.next_tick { @zkem.event_handler.process(event) }
814
+ end
815
+ end
816
+ end
817
+ end # on_connecting
778
818
  end # Client
779
819
  end # ZK::ZKEventMachine
780
820
 
@@ -17,12 +17,14 @@ Gem::Specification.new do |s|
17
17
  # zk depends on slyphon-zookeeper, but we need at least this version
18
18
  s.add_dependency('slyphon-zookeeper', '~> 0.2.8')
19
19
  s.add_dependency('eventmachine', '~> 1.0.0.beta.3')
20
+ s.add_dependency('deferred', '~> 0.5.3')
20
21
 
21
22
  s.add_development_dependency('rspec', '~> 2.5.0')
22
23
  s.add_development_dependency('yard', '~> 0.7.0')
23
24
  s.add_development_dependency('autotest', '>= 4.4.0')
24
25
  s.add_development_dependency('flexmock', '~> 0.8.10')
25
26
  s.add_development_dependency('evented-spec', '~> 0.4.1')
27
+ s.add_development_dependency('redcarpet', '~> 2.1.0')
26
28
 
27
29
  s.files = `git ls-files`.split("\n")
28
30
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zk-eventmachine
3
3
  version: !ruby/object:Gem::Version
4
- hash: 13
4
+ hash: 3
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 11
10
- version: 0.1.11
9
+ - 12
10
+ version: 0.1.12
11
11
  platform: ruby
12
12
  authors:
13
13
  - Jonathan D. Simms
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-01-27 00:00:00 Z
18
+ date: 2012-02-01 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: zk
@@ -68,9 +68,25 @@ dependencies:
68
68
  type: :runtime
69
69
  version_requirements: *id003
70
70
  - !ruby/object:Gem::Dependency
71
- name: rspec
71
+ name: deferred
72
72
  prerelease: false
73
73
  requirement: &id004 !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ~>
77
+ - !ruby/object:Gem::Version
78
+ hash: 13
79
+ segments:
80
+ - 0
81
+ - 5
82
+ - 3
83
+ version: 0.5.3
84
+ type: :runtime
85
+ version_requirements: *id004
86
+ - !ruby/object:Gem::Dependency
87
+ name: rspec
88
+ prerelease: false
89
+ requirement: &id005 !ruby/object:Gem::Requirement
74
90
  none: false
75
91
  requirements:
76
92
  - - ~>
@@ -82,11 +98,11 @@ dependencies:
82
98
  - 0
83
99
  version: 2.5.0
84
100
  type: :development
85
- version_requirements: *id004
101
+ version_requirements: *id005
86
102
  - !ruby/object:Gem::Dependency
87
103
  name: yard
88
104
  prerelease: false
89
- requirement: &id005 !ruby/object:Gem::Requirement
105
+ requirement: &id006 !ruby/object:Gem::Requirement
90
106
  none: false
91
107
  requirements:
92
108
  - - ~>
@@ -98,11 +114,11 @@ dependencies:
98
114
  - 0
99
115
  version: 0.7.0
100
116
  type: :development
101
- version_requirements: *id005
117
+ version_requirements: *id006
102
118
  - !ruby/object:Gem::Dependency
103
119
  name: autotest
104
120
  prerelease: false
105
- requirement: &id006 !ruby/object:Gem::Requirement
121
+ requirement: &id007 !ruby/object:Gem::Requirement
106
122
  none: false
107
123
  requirements:
108
124
  - - ">="
@@ -114,11 +130,11 @@ dependencies:
114
130
  - 0
115
131
  version: 4.4.0
116
132
  type: :development
117
- version_requirements: *id006
133
+ version_requirements: *id007
118
134
  - !ruby/object:Gem::Dependency
119
135
  name: flexmock
120
136
  prerelease: false
121
- requirement: &id007 !ruby/object:Gem::Requirement
137
+ requirement: &id008 !ruby/object:Gem::Requirement
122
138
  none: false
123
139
  requirements:
124
140
  - - ~>
@@ -130,11 +146,11 @@ dependencies:
130
146
  - 10
131
147
  version: 0.8.10
132
148
  type: :development
133
- version_requirements: *id007
149
+ version_requirements: *id008
134
150
  - !ruby/object:Gem::Dependency
135
151
  name: evented-spec
136
152
  prerelease: false
137
- requirement: &id008 !ruby/object:Gem::Requirement
153
+ requirement: &id009 !ruby/object:Gem::Requirement
138
154
  none: false
139
155
  requirements:
140
156
  - - ~>
@@ -146,7 +162,23 @@ dependencies:
146
162
  - 1
147
163
  version: 0.4.1
148
164
  type: :development
149
- version_requirements: *id008
165
+ version_requirements: *id009
166
+ - !ruby/object:Gem::Dependency
167
+ name: redcarpet
168
+ prerelease: false
169
+ requirement: &id010 !ruby/object:Gem::Requirement
170
+ none: false
171
+ requirements:
172
+ - - ~>
173
+ - !ruby/object:Gem::Version
174
+ hash: 11
175
+ segments:
176
+ - 2
177
+ - 1
178
+ - 0
179
+ version: 2.1.0
180
+ type: :development
181
+ version_requirements: *id010
150
182
  description: ""
151
183
  email:
152
184
  - slyphon@hp.com
@@ -162,6 +194,7 @@ files:
162
194
  - .dev_extras/rvmrc
163
195
  - .dev_extras/slyphon-project.vimrc
164
196
  - .gitignore
197
+ - .yardopts
165
198
  - Gemfile
166
199
  - LICENSE
167
200
  - README.markdown
@@ -169,7 +202,6 @@ files:
169
202
  - lib/z_k/z_k_event_machine.rb
170
203
  - lib/z_k/z_k_event_machine/callback.rb
171
204
  - lib/z_k/z_k_event_machine/client.rb
172
- - lib/z_k/z_k_event_machine/deferred.rb
173
205
  - lib/z_k/z_k_event_machine/event_handler_e_m.rb
174
206
  - lib/z_k/z_k_event_machine/iterator.rb
175
207
  - lib/z_k/z_k_event_machine/unixisms.rb
@@ -1,39 +0,0 @@
1
- module ZK
2
- module ZKEventMachine
3
- module Deferred
4
- include EM::Deferrable
5
-
6
- # slight modification to EM::Deferrable,
7
- #
8
- # @returns [self] to allow for chaining
9
- #
10
- def callback(&block)
11
- super(&block)
12
- self
13
- end
14
-
15
- # @see #callback
16
- def errback(&block)
17
- super(&block)
18
- self
19
- end
20
-
21
- # adds the block to both the callback and errback chains
22
- def ensure_that(&block)
23
- callback(&block)
24
- errback(&block)
25
- end
26
-
27
- def chain_to(other_dfr, opts={})
28
- other_dfr.callback { |*a| self.succeed(*a) }
29
- other_dfr.errback { |*a| self.fail(*a) } unless opts[:ignore_errors]
30
- self
31
- end
32
-
33
- class Default
34
- include ZK::ZKEventMachine::Deferred
35
- end
36
- end
37
- end
38
- end
39
-