zk-eventmachine 0.1.11 → 0.1.12

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/.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
-