zk 0.9.1 → 1.0.0.rc.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (63) hide show
  1. data/.gitignore +2 -2
  2. data/Gemfile +3 -4
  3. data/README.markdown +14 -5
  4. data/RELEASES.markdown +69 -1
  5. data/Rakefile +50 -18
  6. data/docs/examples/block_until_node_deleted_ex.rb +63 -0
  7. data/docs/examples/events_01.rb +36 -0
  8. data/docs/examples/events_02.rb +41 -0
  9. data/lib/{z_k → zk}/client/base.rb +87 -30
  10. data/lib/{z_k → zk}/client/conveniences.rb +0 -1
  11. data/lib/{z_k → zk}/client/state_mixin.rb +0 -0
  12. data/lib/zk/client/threaded.rb +196 -0
  13. data/lib/{z_k → zk}/client/unixisms.rb +0 -0
  14. data/lib/zk/client.rb +59 -0
  15. data/lib/zk/core_ext.rb +75 -0
  16. data/lib/{z_k → zk}/election.rb +0 -0
  17. data/lib/zk/event.rb +168 -0
  18. data/lib/{z_k → zk}/event_handler.rb +53 -28
  19. data/lib/zk/event_handler_subscription.rb +68 -0
  20. data/lib/{z_k → zk}/exceptions.rb +38 -23
  21. data/lib/zk/extensions.rb +79 -0
  22. data/lib/{z_k → zk}/find.rb +0 -0
  23. data/lib/{z_k → zk}/locker.rb +0 -0
  24. data/lib/{z_k → zk}/logging.rb +0 -0
  25. data/lib/{z_k → zk}/message_queue.rb +8 -4
  26. data/lib/{z_k → zk}/mongoid.rb +0 -0
  27. data/lib/{z_k → zk}/pool.rb +0 -0
  28. data/lib/zk/stat.rb +115 -0
  29. data/lib/{z_k → zk}/threadpool.rb +52 -4
  30. data/lib/zk/version.rb +3 -0
  31. data/lib/zk.rb +238 -1
  32. data/spec/message_queue_spec.rb +2 -2
  33. data/spec/shared/client_contexts.rb +8 -20
  34. data/spec/shared/client_examples.rb +136 -2
  35. data/spec/spec_helper.rb +4 -2
  36. data/spec/support/event_catcher.rb +11 -0
  37. data/spec/support/exist_matcher.rb +6 -0
  38. data/spec/support/logging.rb +2 -1
  39. data/spec/watch_spec.rb +194 -10
  40. data/spec/{z_k → zk}/client/locking_and_session_death_spec.rb +0 -32
  41. data/spec/zk/client_spec.rb +23 -0
  42. data/spec/{z_k → zk}/election_spec.rb +0 -0
  43. data/spec/{z_k → zk}/extensions_spec.rb +0 -0
  44. data/spec/{z_k → zk}/locker_spec.rb +0 -40
  45. data/spec/zk/module_spec.rb +185 -0
  46. data/spec/{z_k → zk}/mongoid_spec.rb +0 -2
  47. data/spec/{z_k → zk}/pool_spec.rb +0 -2
  48. data/spec/{z_k → zk}/threadpool_spec.rb +32 -4
  49. data/spec/zookeeper_spec.rb +1 -6
  50. data/zk.gemspec +2 -2
  51. metadata +64 -56
  52. data/lib/z_k/client/continuation_proxy.rb +0 -109
  53. data/lib/z_k/client/drop_box.rb +0 -98
  54. data/lib/z_k/client/multiplexed.rb +0 -28
  55. data/lib/z_k/client/threaded.rb +0 -76
  56. data/lib/z_k/client.rb +0 -35
  57. data/lib/z_k/event_handler_subscription.rb +0 -36
  58. data/lib/z_k/extensions.rb +0 -155
  59. data/lib/z_k/version.rb +0 -3
  60. data/lib/z_k.rb +0 -97
  61. data/spec/z_k/client/drop_box_spec.rb +0 -90
  62. data/spec/z_k/client/multiplexed_spec.rb +0 -20
  63. data/spec/z_k/client_spec.rb +0 -7
data/spec/watch_spec.rb CHANGED
@@ -1,16 +1,16 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe ZK do
4
- describe do
4
+ describe 'watchers' do
5
5
  before do
6
- @cnx_str = "localhost:#{ZK_TEST_PORT}"
7
- @zk = ZK.new(@cnx_str)
8
-
9
- @path = "/_testWatch"
10
- wait_until { @zk.connected? }
6
+ mute_logger do
7
+ @cnx_str = "localhost:#{ZK_TEST_PORT}"
8
+ @zk = ZK.new(@cnx_str)
11
9
 
12
- # make sure we start w/ clean state
13
- @zk.rm_rf(@path)
10
+ @path = "/_testWatch"
11
+ wait_until { @zk.connected? }
12
+ @zk.rm_rf(@path)
13
+ end
14
14
  end
15
15
 
16
16
  after do
@@ -147,9 +147,193 @@ describe ZK do
147
147
  wait_while { events.empty? }
148
148
 
149
149
  events.should_not be_empty
150
+ end
151
+
152
+ describe ':all' do
153
+ before do
154
+ mute_logger do
155
+ @other_path = "#{@path}2"
156
+ @zk.rm_rf(@other_path)
157
+ end
158
+ end
159
+
160
+ after do
161
+ mute_logger do
162
+ @zk.rm_rf(@other_path)
163
+ end
164
+ end
165
+
166
+ it %[should receive all node events] do
167
+ events = []
168
+
169
+ sub = @zk.register(:all) do |ev|
170
+ logger.debug { "got event #{ev}" }
171
+ events << ev
172
+ end
150
173
 
174
+ @zk.stat(@path, :watch => true)
175
+ @zk.stat(@other_path, :watch => true)
176
+
177
+ @zk.create(@path)
178
+ @zk.create(@other_path, 'blah')
179
+
180
+ wait_until { events.length == 2 }.should be_true
181
+ end
151
182
  end
152
- end
183
+
184
+ describe %[event interest] do
185
+ context do # event catcher scope
186
+ before do
187
+ @events = EventCatcher.new
188
+
189
+ @zk.register(@path, :created) do |event|
190
+ @events.created << event
191
+ end
192
+
193
+ @zk.register(@path, :changed) do |event|
194
+ @events.changed << event
195
+ end
196
+
197
+ @zk.register(@path, :child) do |event|
198
+ @events.child << event
199
+ end
200
+
201
+ @zk.register(@path, :deleted) do |event|
202
+ @events.deleted << event
203
+ end
204
+
205
+ # this will catch all events, that way we don't have to wait for an
206
+ # event to *not* be delivered to one of the other callbacks (which is
207
+ # kinda stupid)
208
+ @zk.register(@path) do |event|
209
+ @events.all << event
210
+ end
211
+ end
212
+
213
+ it %[should deliver only the created event to the created block] do
214
+ @zk.stat(@path, :watch => true).should_not exist
215
+
216
+ @zk.create(@path)
217
+ wait_while { @events.created.empty? }.should be_false
218
+ @events.created.first.should be_node_created
219
+
220
+ @zk.stat(@path, :watch => true).should exist
221
+
222
+ @events.all.length.should == 1
223
+
224
+ @zk.delete(@path)
225
+
226
+ wait_until { @events.all.length > 1 }
227
+
228
+ # :deleted event was delivered, make sure it didn't get delivered to the :created block
229
+ @events.created.length.should == 1
230
+ end
231
+
232
+ it %[should deliver only the changed event to the changed block] do
233
+ @zk.create(@path)
234
+
235
+ @zk.stat(@path, :watch => true).should exist
236
+
237
+ @zk.set(@path, 'data')
238
+
239
+ wait_while { @events.changed.empty? }
240
+
241
+ @events.changed.first.should be_node_changed
242
+
243
+ @zk.stat(@path, :watch => true).should exist
244
+
245
+ @events.all.length.should == 1
246
+
247
+ @zk.delete(@path)
248
+
249
+ wait_until { @events.all.length > 1 }
250
+
251
+ # :deleted event was delivered, make sure it didn't get delivered to the :changed block
252
+ @events.changed.length.should == 1
253
+ end
254
+
255
+ it %[should deliver only the child event to the child block] do
256
+ @zk.create(@path)
257
+
258
+ @zk.children(@path, :watch => true).should be_empty
259
+
260
+ child_path = @zk.create("#{@path}/m", '', :sequence => true)
261
+
262
+ wait_while { @events.child.empty? }
263
+
264
+ @events.child.first.should be_node_child
265
+
266
+ @zk.stat(@path, :watch => true).should exist
267
+
268
+ @events.all.length.should == 1
269
+
270
+ @zk.set(@path, '') # equivalent to a 'touch'
271
+
272
+ wait_until { @events.all.length > 1 }
273
+
274
+ # :changed event was delivered, make sure it didn't get delivered to the :child block
275
+ @events.child.length.should == 1
276
+ end
277
+
278
+ it %[should deliver only the deleted event to the deleted block] do
279
+ @zk.create(@path)
280
+
281
+ @zk.stat(@path, :watch => true).should exist
282
+
283
+ @zk.delete(@path)
284
+
285
+ wait_while { @events.deleted.empty? }
286
+
287
+ @events.deleted.first.should be_node_deleted
288
+
289
+ @zk.stat(@path, :watch => true).should_not exist
290
+
291
+ @events.all.length.should == 1
292
+
293
+ @zk.create(@path)
294
+
295
+ wait_until { @events.all.length > 1 }
296
+
297
+ # :deleted event was delivered, make sure it didn't get delivered to the :created block
298
+ @events.deleted.length.should == 1
299
+ end
300
+ end # event catcher scope
301
+
302
+ it %[should deliver interested events to a block registered for multiple deliveries] do
303
+ @events = []
304
+
305
+ @zk.register(@path, [:created, :changed]) do |event|
306
+ @events << event
307
+ end
308
+
309
+ @zk.stat(@path, :watch => true).should_not exist
310
+
311
+ @zk.create(@path)
312
+
313
+ wait_while { @events.empty? }
314
+
315
+ @events.length.should == 1
316
+
317
+ @events.first.should be_node_created
318
+
319
+ @zk.stat(@path, :watch => true).should exist
320
+
321
+ @zk.set(@path, 'blah')
322
+
323
+ wait_until { @events.length > 1 }
324
+
325
+ @events.length.should == 2
326
+
327
+ @events.last.should be_node_changed
328
+ end
329
+
330
+ it %[should barf if an invalid event name is given] do
331
+ lambda do
332
+ @zk.register(@path, :tripping) { }
333
+ end.should raise_error(ArgumentError)
334
+ end
335
+ end # event interest
336
+ end # watchers
153
337
 
154
338
  describe 'state watcher' do
155
339
  describe 'live-fire test' do
@@ -178,7 +362,7 @@ describe ZK do
178
362
  m.should_receive(:state).and_return(ZookeeperConstants::ZOO_CONNECTED_STATE)
179
363
  end
180
364
  end
181
- end
365
+ end # registered listeners
182
366
  end
183
367
  end
184
368
 
@@ -73,36 +73,4 @@ shared_examples_for 'locking and session death' do
73
73
  end
74
74
  end
75
75
 
76
- describe 'threaded client and locking behavior' do
77
- include_context 'threaded client connection'
78
-
79
- before do
80
- @path = '/test'
81
- @zk.create('/test') rescue ZK::Exceptions::NodeExists
82
- end
83
-
84
- describe 'block_until_node_deleted' do
85
- it %[should raise an EventDispatchThreadException if called in the context of the event dispatch thread] do
86
- @exception = nil
87
-
88
- @zk.register(@path) do |event|
89
- @zk.event_dispatch_thread?.should be_true
90
-
91
- begin
92
- @zk.block_until_node_deleted(@path)
93
- rescue Exception => e
94
- @exception = e
95
- end
96
- end
97
-
98
- @zk.exists?(@path, :watch => true)
99
-
100
- @zk.set(@path, 'blah')
101
-
102
- wait_until(2) { @exception }.should be_kind_of(ZK::Exceptions::EventDispatchThreadException)
103
- end
104
- end
105
-
106
- it_should_behave_like 'locking and session death'
107
- end
108
76
 
@@ -0,0 +1,23 @@
1
+ require 'spec_helper'
2
+
3
+ describe ZK::Client::Threaded do
4
+ include_context 'threaded client connection'
5
+ it_should_behave_like 'client'
6
+
7
+ describe :close! do
8
+ describe 'from a threadpool thread' do
9
+ it %[should do the right thing and not fail] do
10
+ # this is an extra special case where the user obviously hates us
11
+
12
+ @zk.should be_kind_of(ZK::Client::Threaded) # yeah yeah, just be sure
13
+
14
+ @zk.defer do
15
+ @zk.close!
16
+ end
17
+
18
+ wait_until { @zk.closed? }.should be_true
19
+ end
20
+ end
21
+ end
22
+ end
23
+
File without changes
File without changes
@@ -464,46 +464,6 @@ describe "ZK::Locker chrooted" do
464
464
  it_should_behave_like 'ExclusiveLocker'
465
465
  it_should_behave_like 'shared-exclusive interaction'
466
466
  end
467
-
468
- describe "when the root doesn't exist" do
469
- let(:lock_name) { 'master' }
470
-
471
- it %[should raise a NonExistentRootError] do
472
- @got_lock = false
473
-
474
- lambda do
475
- zk.with_lock(lock_name) do
476
- @got_lock = true
477
- end
478
- end.should raise_error(ZK::Exceptions::NonExistentRootError)
479
-
480
- @got_lock.should_not be_true
481
- end
482
- end
483
467
  end
484
468
 
485
- describe 'ZK::Locker Multiplexed client', :client => :multiplexed do
486
- let(:zk) { ZK::Client::Multiplexed.new("localhost:#{ZK_TEST_PORT}") }
487
- let(:zk2) { ZK::Client::Multiplexed.new("localhost:#{ZK_TEST_PORT}") }
488
- let(:zk3) { ZK::Client::Multiplexed.new("localhost:#{ZK_TEST_PORT}") }
489
-
490
- let(:connections) { [zk, zk2, zk3] }
491
-
492
- let(:path) { "shlock" }
493
- let(:root_lock_path) { "/_zklocking/#{path}" }
494
-
495
- before do
496
- wait_until{ connections.all?(&:connected?) }
497
- # pending "Mutliplexed client locking is broken"
498
- end
499
-
500
- after do
501
- connections.each { |c| c.close! }
502
- wait_until { !connections.any?(&:connected?) }
503
- end
504
-
505
- it_should_behave_like 'SharedLocker'
506
- it_should_behave_like 'ExclusiveLocker'
507
- it_should_behave_like 'shared-exclusive interaction'
508
- end # ZK::Locker
509
469
 
@@ -0,0 +1,185 @@
1
+ require 'spec_helper'
2
+
3
+ # tests for the top-level module methods of ZK
4
+
5
+ describe ZK do
6
+ describe :new do
7
+ let(:chroot_path) { '/zktest/path/to/chroot' }
8
+
9
+ after do
10
+ mute_logger do
11
+ @zk.close! if @zk and not @zk.closed?
12
+ end
13
+ end
14
+
15
+ describe %[with a chrooted connection string and a :chroot => '/path'] do
16
+ it %[should raise an ArgumentError] do
17
+ lambda { @zk = ZK.new('localhost:2181/zktest', :chroot => '/zktest') }.should raise_error(ArgumentError)
18
+ end
19
+ end
20
+
21
+ describe 'with no arguments' do
22
+ before { @zk = ZK.new }
23
+
24
+ it %[should create a default connection] do
25
+ @zk.should be_connected
26
+ end
27
+ end
28
+
29
+ describe %[with a chroot] do
30
+ before do
31
+ mute_logger do
32
+ @unchroot = ZK.new
33
+ end
34
+ end
35
+
36
+ after do
37
+ mute_logger do
38
+ @unchroot.rm_rf('/zktest')
39
+ @unchroot.close! if @unchroot and not @unchroot.closed?
40
+ end
41
+ end
42
+
43
+ describe %[that doesn't exist] do
44
+ before { @unchroot.rm_rf('/zktest') }
45
+
46
+ describe %[with no host and a :chroot => '/path' argument] do
47
+ before { @zk = ZK.new(:chroot => chroot_path) }
48
+
49
+ it %[should use the default connection string, create the chroot and return the connection] do
50
+ @zk.exists?('/').should be_true
51
+ @zk.create('/blah', 'data')
52
+
53
+ @unchroot.get("#{chroot_path}/blah").first.should == 'data'
54
+ end
55
+ end
56
+
57
+ describe %[as a connection string] do
58
+ describe %[and no explicit option] do
59
+ before do
60
+ @zk = ZK.new("localhost:2181#{chroot_path}") # implicit create
61
+ end
62
+
63
+ it %[should create the chroot path and then return the connection] do
64
+ @zk.exists?('/').should be_true
65
+ @zk.create('/blah', 'data')
66
+
67
+ @unchroot.get("#{chroot_path}/blah").first.should == 'data'
68
+ end
69
+ end
70
+
71
+ describe %[and an explicit :chroot => :create] do
72
+ before do
73
+ @zk = ZK.new("localhost:2181#{chroot_path}", :chroot => :create)
74
+ end
75
+
76
+ it %[should create the chroot path and then return the connection] do
77
+ @zk.exists?('/').should be_true
78
+ @zk.create('/blah', 'data')
79
+
80
+ @unchroot.get("#{chroot_path}/blah").first.should == 'data'
81
+ end
82
+ end
83
+
84
+ describe %[and :chroot => :check] do
85
+ it %[should barf with a ChrootPathDoesNotExistError] do
86
+ lambda do
87
+ # assign in case of a bug, that way this connection will get torn down
88
+ @zk = ZK.new("localhost:2181#{chroot_path}", :chroot => :check)
89
+ end.should raise_error(ZK::Exceptions::ChrootPathDoesNotExistError)
90
+ end
91
+ end
92
+
93
+ describe %[and :chroot => :do_nothing] do
94
+ it %[should return a connection in a weird state] do
95
+ @zk = ZK.new("localhost:2181#{chroot_path}", :chroot => :do_nothing)
96
+ lambda { @zk.get('/') }.should raise_error(ZK::Exceptions::NoNode)
97
+ end
98
+ end
99
+
100
+ describe %[and :chroot => '/path'] do
101
+ before { @zk = ZK.new("localhost:2181", :chroot => chroot_path) }
102
+
103
+ it %[should create the chroot path and then return the connection] do
104
+ @zk.exists?('/').should be_true
105
+ @zk.create('/blah', 'data')
106
+
107
+ @unchroot.get("#{chroot_path}/blah").first.should == 'data'
108
+ end
109
+ end
110
+ end # as a connection string
111
+ end # that doesn't exist
112
+
113
+ describe %[that exists] do
114
+ before { @unchroot.mkdir_p(chroot_path) }
115
+
116
+ describe %[with no host and a :chroot => '/path' argument] do
117
+ before { @zk = ZK.new(:chroot => chroot_path) }
118
+
119
+ it %[should use the default connection string and totally work] do
120
+ @zk.exists?('/').should be_true
121
+ @zk.create('/blah', 'data')
122
+
123
+ @unchroot.get("#{chroot_path}/blah").first.should == 'data'
124
+ end
125
+ end
126
+
127
+ describe %[as a connection string] do
128
+ describe %[and no explicit option] do
129
+ before do
130
+ @zk = ZK.new("localhost:2181#{chroot_path}") # implicit create
131
+ end
132
+
133
+ it %[should totally work] do
134
+ @zk.exists?('/').should be_true
135
+ @zk.create('/blah', 'data')
136
+
137
+ @unchroot.get("#{chroot_path}/blah").first.should == 'data'
138
+ end
139
+ end
140
+
141
+ describe %[and an explicit :chroot => :create] do
142
+ before do
143
+ @zk = ZK.new("localhost:2181#{chroot_path}", :chroot => :create)
144
+ end
145
+
146
+ it %[should totally work] do
147
+ @zk.exists?('/').should be_true
148
+ @zk.create('/blah', 'data')
149
+
150
+ @unchroot.get("#{chroot_path}/blah").first.should == 'data'
151
+ end
152
+ end
153
+
154
+ describe %[and :chroot => :check] do
155
+ it %[should totally work] do
156
+ lambda do
157
+ # assign in case of a bug, that way this connection will get torn down
158
+ @zk = ZK.new("localhost:2181#{chroot_path}", :chroot => :check)
159
+ end.should_not raise_error
160
+ end
161
+ end
162
+
163
+ describe %[and :chroot => :do_nothing] do
164
+ it %[should totally work] do
165
+ @zk = ZK.new("localhost:2181#{chroot_path}", :chroot => :do_nothing)
166
+ lambda { @zk.get('/') }.should_not raise_error
167
+ end
168
+ end
169
+
170
+ describe %[and :chroot => '/path'] do
171
+ before { @zk = ZK.new("localhost:2181", :chroot => chroot_path) }
172
+
173
+ it %[should totally work] do
174
+ @zk.exists?('/').should be_true
175
+ @zk.create('/blah', 'data')
176
+
177
+ @unchroot.get("#{chroot_path}/blah").first.should == 'data'
178
+ end
179
+ end
180
+ end # as a connection string
181
+ end # that exists
182
+ end # with a chroot
183
+ end # :new
184
+ end # ZK
185
+
@@ -1,7 +1,5 @@
1
1
  require 'spec_helper'
2
2
 
3
- require 'tracer'
4
-
5
3
  describe ZK::Mongoid::Locking do
6
4
  before do
7
5
  ZK::Mongoid::Locking.zk_lock_pool = ZK.new_pool('localhost:2181', :min_clients => 1, :max_clients => 5)
@@ -1,7 +1,5 @@
1
1
  require 'spec_helper'
2
2
 
3
- require 'tracer'
4
-
5
3
  describe ZK::Pool do
6
4
  describe :Simple do
7
5
 
@@ -1,7 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe ZK::Threadpool do
4
-
5
4
  before do
6
5
  @threadpool = ZK::Threadpool.new
7
6
  end
@@ -20,7 +19,6 @@ describe ZK::Threadpool do
20
19
  end
21
20
  end
22
21
 
23
-
24
22
  describe :defer do
25
23
  it %[should run the given block on a thread in the threadpool] do
26
24
  @th = nil
@@ -39,9 +37,28 @@ describe ZK::Threadpool do
39
37
  lambda { @threadpool.defer(bad_obj) }.should raise_error(ArgumentError)
40
38
  end
41
39
 
42
- it %[should barf if the threadpool is not running] do
40
+ it %[should not barf if the threadpool is not running] do
43
41
  @threadpool.shutdown
44
- lambda { @threadpool.defer { "hai!" } }.should raise_error(ZK::Exceptions::ThreadpoolIsNotRunningException)
42
+ lambda { @threadpool.defer { "hai!" } }.should_not raise_error
43
+ end
44
+ end
45
+
46
+ describe :on_exception do
47
+ it %[should register a callback that will be called if an exception is raised on the threadpool] do
48
+ @ary = []
49
+
50
+ @threadpool.on_exception { |exc| @ary << exc }
51
+
52
+ @threadpool.defer { raise "ZOMG!" }
53
+
54
+ wait_while(2) { @ary.empty? }
55
+
56
+ @ary.length.should == 1
57
+
58
+ e = @ary.shift
59
+
60
+ e.should be_kind_of(RuntimeError)
61
+ e.message.should == 'ZOMG!'
45
62
  end
46
63
  end
47
64
 
@@ -70,5 +87,16 @@ describe ZK::Threadpool do
70
87
  end
71
88
  end
72
89
 
90
+ describe :on_threadpool? do
91
+ it %[should return true if we're currently executing on one of the threadpool threads] do
92
+ @a = []
93
+ @threadpool.defer { @a << @threadpool.on_threadpool? }
94
+
95
+ wait_while(2) { @a.empty? }
96
+ @a.should_not be_empty
97
+
98
+ @a.first.should be_true
99
+ end
100
+ end
73
101
  end
74
102
 
@@ -117,12 +117,7 @@ shared_examples_for 'ZK basic' do
117
117
  end
118
118
  end
119
119
 
120
- describe 'basic multiplexed', :client => :multiplexed do
121
- include_context 'multiplexed client connection'
122
- it_should_behave_like 'ZK basic'
123
- end
124
-
125
- describe 'basic threaded', :client => :threaded do
120
+ describe 'basic threaded', :threaded => true do
126
121
  include_context 'threaded client connection'
127
122
  it_should_behave_like 'ZK basic'
128
123
  end
data/zk.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  $:.push File.expand_path("../lib", __FILE__)
3
- require "z_k/version"
3
+ require "zk/version"
4
4
 
5
5
  Gem::Specification.new do |s|
6
6
  s.name = "zk"
@@ -12,7 +12,7 @@ Gem::Specification.new do |s|
12
12
  s.summary = %q{A high-level wrapper around the zookeeper driver}
13
13
  s.description = s.summary + "\n"
14
14
 
15
- s.add_runtime_dependency 'slyphon-zookeeper', '~> 0.8.1'
15
+ s.add_runtime_dependency 'slyphon-zookeeper', '~> 0.9.2'
16
16
 
17
17
  s.files = `git ls-files`.split("\n")
18
18
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")