zk 0.8.6 → 0.8.7

Sign up to get free protection for your applications and to get access to all the features.
data/.dotfiles/rvmrc CHANGED
@@ -1 +1 @@
1
- rvm jruby-1.6.5@zk --create
1
+ rvm jruby-1.6.7@zk --create
data/Gemfile CHANGED
@@ -1,15 +1,9 @@
1
+ # this is here for doing internal builds in our environment
2
+ source ENV['MBOX_BUNDLER_SOURCE'] if ENV['MBOX_BUNDLER_SOURCE']
1
3
  source "http://rubygems.org"
2
- source "http://rubygems"
3
- source "http://localhost:50000"
4
4
 
5
5
  # Specify your gem's dependencies in zk.gemspec
6
6
  gemspec
7
7
 
8
- gem 'ruby-debug', :platforms => [:mri_18, :jruby]
9
-
10
- if RUBY_VERSION < '1.9.3'
11
- gem 'ruby-debug19', :platforms => :mri_19
12
- end
13
-
14
8
 
15
9
  # vim:ft=ruby
data/Rakefile CHANGED
@@ -1,13 +1,28 @@
1
- require 'bundler'
2
- Bundler::GemHelper.install_tasks
1
+ # require 'rubygems'
2
+ # gem 'rdoc', '~> 2.5'
3
+ # require 'rdoc/task'
3
4
 
4
- require 'rubygems'
5
- gem 'rdoc', '~> 2.5'
6
- require 'rdoc/task'
5
+ # RDoc::Task.new do |rd|
6
+ # rd.title = 'ZK Documentation'
7
+ # rd.rdoc_files.include("lib/**/*.rb")
8
+ # end
7
9
 
8
- RDoc::Task.new do |rd|
9
- rd.title = 'ZK Documentation'
10
- rd.rdoc_files.include("lib/**/*.rb")
11
- end
10
+ gemset_name = 'zk'
11
+
12
+ %w[1.9.3 jruby].each do |rvm_ruby|
13
+ ruby_with_gemset = "#{rvm_ruby}@#{gemset_name}"
14
+ bundle_task_name = "mb:#{rvm_ruby}:bundle_install"
15
+ rspec_task_name = "mb:#{rvm_ruby}:run_rspec"
16
+
17
+ task bundle_task_name do
18
+ rm_f 'Gemfile.lock'
19
+ sh "rvm #{ruby_with_gemset} do bundle install"
20
+ end
12
21
 
22
+ task rspec_task_name => bundle_task_name do
23
+ sh "rvm #{ruby_with_gemset} do bundle exec rspec spec --fail-fast"
24
+ end
25
+
26
+ task "mb:test_all_rubies" => rspec_task_name
27
+ end
13
28
 
data/lib/z_k/locker.rb CHANGED
@@ -1,12 +1,11 @@
1
1
  module ZK
2
- # Implements locking primitives {described here}[http://hadoop.apache.org/zookeeper/docs/current/recipes.html#sc_recipes_Locks]
2
+ # Implements locking primitives [described here](http://hadoop.apache.org/zookeeper/docs/current/recipes.html#sc_recipes_Locks)
3
3
  #
4
4
  # There are both shared and exclusive lock implementations.
5
5
  #
6
- #
7
- # NOTE: These locks are _not_ safe for use across threads. If you want to use
8
- # the same Locker class between threads, it is your responsibility to
9
- # synchronize operations.
6
+ # NOTE: These lock instances are _not_ safe for use across threads. If you
7
+ # want to use the same Locker instance between threads, it is your
8
+ # responsibility to synchronize operations.
10
9
  #
11
10
  module Locker
12
11
  SHARED_LOCK_PREFIX = 'sh'.freeze
data/lib/z_k/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module ZK
2
- VERSION = "0.8.6"
2
+ VERSION = "0.8.7"
3
3
  end
@@ -74,313 +74,352 @@ describe 'ZK::Client#locker' do
74
74
  end
75
75
  end
76
76
 
77
- describe ZK::Locker do
77
+ shared_examples_for 'SharedLocker' do
78
78
  before do
79
- @zk = ZK.new("localhost:#{ZK_TEST_PORT}", :watcher => :default)
80
- @zk2 = ZK.new("localhost:#{ZK_TEST_PORT}", :watcher => :default)
81
- @zk3 = ZK.new("localhost:#{ZK_TEST_PORT}")
82
- @connections = [@zk, @zk2, @zk3]
83
-
84
- wait_until{ @connections.all? {|c| c.connected?} }
85
-
86
- @path = "shlock"
87
- @root_lock_path = "/_zklocking/#{@path}"
79
+ @shared_locker = ZK::Locker.shared_locker(zk, path)
80
+ @shared_locker2 = ZK::Locker.shared_locker(zk2, path)
88
81
  end
89
82
 
90
- after do
91
- @connections.each { |c| c.close! }
92
- wait_until { @connections.all? { |c| !c.connected? } }
93
- end
83
+ describe :lock! do
84
+ describe 'non-blocking success' do
85
+ before do
86
+ @rval = @shared_locker.lock!
87
+ @rval2 = @shared_locker2.lock!
88
+ end
94
89
 
90
+ it %[should acquire the first lock] do
91
+ @rval.should be_true
92
+ @shared_locker.should be_locked
93
+ end
95
94
 
96
- describe :SharedLocker do
97
- before do
98
- @shared_locker = ZK::Locker.shared_locker(@zk, @path)
99
- @shared_locker2 = ZK::Locker.shared_locker(@zk2, @path)
95
+ it %[should acquire the second lock] do
96
+ @rval2.should be_true
97
+ @shared_locker2.should be_locked
98
+ end
100
99
  end
101
100
 
102
- describe :lock! do
103
- describe 'non-blocking success' do
104
- before do
105
- @rval = @shared_locker.lock!
106
- @rval2 = @shared_locker2.lock!
107
- end
101
+ describe 'non-blocking failure' do
102
+ before do
103
+ zk.mkdir_p(root_lock_path)
104
+ @write_lock_path = zk.create("#{root_lock_path}/#{ZK::Locker::EXCLUSIVE_LOCK_PREFIX}", '', :mode => :ephemeral_sequential)
105
+ @rval = @shared_locker.lock!
106
+ end
108
107
 
109
- it %[should acquire the first lock] do
110
- @rval.should be_true
111
- @shared_locker.should be_locked
112
- end
108
+ after do
109
+ zk.rm_rf('/_zklocking')
110
+ end
113
111
 
114
- it %[should acquire the second lock] do
115
- @rval2.should be_true
116
- @shared_locker2.should be_locked
117
- end
112
+ it %[should return false] do
113
+ @rval.should be_false
118
114
  end
119
115
 
120
- describe 'non-blocking failure' do
121
- before do
122
- @zk.mkdir_p(@root_lock_path)
123
- @write_lock_path = @zk.create("#{@root_lock_path}/#{ZK::Locker::EXCLUSIVE_LOCK_PREFIX}", '', :mode => :ephemeral_sequential)
124
- @rval = @shared_locker.lock!
125
- end
116
+ it %[should not be locked] do
117
+ @shared_locker.should_not be_locked
118
+ end
119
+ end
126
120
 
127
- after do
128
- @zk.rm_rf('/_zklocking')
129
- end
121
+ describe 'blocking success' do
122
+ before do
123
+ zk.mkdir_p(root_lock_path)
124
+ @write_lock_path = zk.create("#{root_lock_path}/#{ZK::Locker::EXCLUSIVE_LOCK_PREFIX}", '', :mode => :ephemeral_sequential)
125
+ $stderr.sync = true
126
+ end
130
127
 
131
- it %[should return false] do
132
- @rval.should be_false
133
- end
128
+ it %[should acquire the lock after the write lock is released] do
129
+ ary = []
134
130
 
135
- it %[should not be locked] do
136
- @shared_locker.should_not be_locked
137
- end
138
- end
131
+ @shared_locker.lock!.should be_false
139
132
 
140
- describe 'blocking success' do
141
- before do
142
- @zk.mkdir_p(@root_lock_path)
143
- @write_lock_path = @zk.create("#{@root_lock_path}/#{ZK::Locker::EXCLUSIVE_LOCK_PREFIX}", '', :mode => :ephemeral_sequential)
144
- $stderr.sync = true
133
+ th = Thread.new do
134
+ @shared_locker.lock!(true)
135
+ ary << :locked
145
136
  end
146
137
 
147
- it %[should acquire the lock after the write lock is released] do
148
- ary = []
138
+ ary.should be_empty
139
+ @shared_locker.should_not be_locked
149
140
 
150
- @shared_locker.lock!.should be_false
141
+ zk.delete(@write_lock_path)
151
142
 
152
- th = Thread.new do
153
- @shared_locker.lock!(true)
154
- ary << :locked
155
- end
143
+ th.join(2)
156
144
 
157
- ary.should be_empty
158
- @shared_locker.should_not be_locked
145
+ wait_until(2) { !ary.empty? }
146
+ ary.length.should == 1
159
147
 
160
- @zk.delete(@write_lock_path)
148
+ @shared_locker.should be_locked
149
+ end
150
+ end
151
+ end
152
+ end # SharedLocker
161
153
 
162
- th.join(2)
154
+ shared_examples_for 'ExclusiveLocker' do
155
+ before do
156
+ @ex_locker = ZK::Locker.exclusive_locker(zk, path)
157
+ @ex_locker2 = ZK::Locker.exclusive_locker(zk2, path)
158
+ end
163
159
 
164
- wait_until(2) { !ary.empty? }
165
- ary.length.should == 1
160
+ describe :lock! do
161
+ describe 'non-blocking' do
162
+ before do
163
+ @rval = @ex_locker.lock!
164
+ @rval2 = @ex_locker2.lock!
165
+ end
166
166
 
167
- @shared_locker.should be_locked
168
- end
167
+ it %[should acquire the first lock] do
168
+ @rval.should be_true
169
169
  end
170
- end
171
- end # SharedLocker
172
170
 
173
- describe :ExclusiveLocker do
174
- before do
175
- @ex_locker = ZK::Locker.exclusive_locker(@zk, @path)
176
- @ex_locker2 = ZK::Locker.exclusive_locker(@zk2, @path)
171
+ it %[should not acquire the second lock] do
172
+ @rval2.should be_false
173
+ end
174
+
175
+ it %[should acquire the second lock after the first lock is released] do
176
+ @ex_locker.unlock!.should be_true
177
+ @ex_locker2.lock!.should be_true
178
+ end
177
179
  end
178
180
 
179
- describe :lock! do
180
- describe 'non-blocking' do
181
- before do
182
- @rval = @ex_locker.lock!
183
- @rval2 = @ex_locker2.lock!
184
- end
181
+ describe 'blocking' do
182
+ before do
183
+ zk.mkdir_p(root_lock_path)
184
+ @read_lock_path = zk.create('/_zklocking/shlock/read', '', :mode => :ephemeral_sequential)
185
+ end
185
186
 
186
- it %[should acquire the first lock] do
187
- @rval.should be_true
188
- end
187
+ it %[should block waiting for the lock] do
188
+ ary = []
189
+
190
+ @ex_locker.lock!.should be_false
189
191
 
190
- it %[should not acquire the second lock] do
191
- @rval2.should be_false
192
+ th = Thread.new do
193
+ @ex_locker.lock!(true)
194
+ ary << :locked
192
195
  end
193
196
 
194
- it %[should acquire the second lock after the first lock is released] do
195
- @ex_locker.unlock!.should be_true
196
- @ex_locker2.lock!.should be_true
197
+ th.run
198
+
199
+ ary.should be_empty
200
+ @ex_locker.should_not be_locked
201
+
202
+ zk.delete(@read_lock_path)
203
+
204
+ th.join(2)
205
+
206
+ ary.length.should == 1
207
+ @ex_locker.should be_locked
208
+ end
209
+ end
210
+ end
211
+ end # ExclusiveLocker
212
+
213
+ shared_examples_for 'shared-exclusive interaction' do
214
+ before do
215
+ @sh_lock = ZK::Locker.shared_locker(zk, path)
216
+ @ex_lock = ZK::Locker.exclusive_locker(zk2, path)
217
+ end
218
+
219
+ describe 'shared lock acquired first' do
220
+ it %[should block exclusive locks from acquiring until released] do
221
+ q1 = Queue.new
222
+ q2 = Queue.new
223
+
224
+ th1 = Thread.new do
225
+ @sh_lock.with_lock do
226
+ q1.enq(:got_lock)
227
+ Thread.current[:got_lock] = true
228
+ q2.pop
197
229
  end
198
230
  end
199
231
 
200
- describe 'blocking' do
201
- before do
202
- @zk.mkdir_p(@root_lock_path)
203
- @read_lock_path = @zk.create('/_zklocking/shlock/read', '', :mode => :ephemeral_sequential)
232
+ th2 = Thread.new do
233
+ q1.pop # wait for th1 to get the shared lock
234
+
235
+ Thread.current[:acquiring_lock] = true
236
+
237
+ @ex_lock.with_lock do
238
+ Thread.current[:got_lock] = true
204
239
  end
240
+ end
205
241
 
206
- it %[should block waiting for the lock] do
207
- ary = []
242
+ th1.join_until { th1[:got_lock] }
243
+ th1[:got_lock].should be_true
208
244
 
209
- @ex_locker.lock!.should be_false
245
+ th2.join_until { th2[:acquiring_lock] }
246
+ th2[:acquiring_lock].should be_true
210
247
 
211
- th = Thread.new do
212
- @ex_locker.lock!(true)
213
- ary << :locked
214
- end
248
+ q2.num_waiting.should > 0
249
+ q2.enq(:release)
215
250
 
216
- th.run
217
-
218
- ary.should be_empty
219
- @ex_locker.should_not be_locked
251
+ th1.join_until { q2.size == 0 }
252
+ q2.size.should == 0
220
253
 
221
- @zk.delete(@read_lock_path)
254
+ th1.join(2).should == th1
222
255
 
223
- th.join(2)
256
+ th2.join_until { th2[:got_lock] }
257
+ th2[:got_lock].should be_true
224
258
 
225
- ary.length.should == 1
226
- @ex_locker.should be_locked
227
- end
228
- end
259
+ th2.join(2).should == th2
229
260
  end
230
- end # WriteLocker
261
+ end
231
262
 
232
- describe 'read/write interaction' do
233
- before do
234
- @sh_lock = ZK::Locker.shared_locker(@zk, @path)
235
- @ex_lock = ZK::Locker.exclusive_locker(@zk2, @path)
236
- end
263
+ describe 'exclusive lock acquired first' do
264
+ it %[should block shared lock from acquiring until released] do
265
+ # same test as above but with the thread's locks switched,
266
+ # th1 is the exclusive locker
267
+
268
+ q1 = Queue.new
269
+ q2 = Queue.new
237
270
 
238
- describe 'shared lock acquired first' do
239
- it %[should block exclusive locks from acquiring until released] do
240
- q1 = Queue.new
241
- q2 = Queue.new
242
-
243
- th1 = Thread.new do
244
- @sh_lock.with_lock do
245
- q1.enq(:got_lock)
246
- Thread.current[:got_lock] = true
247
- q2.pop
248
- end
271
+ th1 = Thread.new do
272
+ @ex_lock.with_lock do
273
+ q1.enq(:got_lock)
274
+ Thread.current[:got_lock] = true
275
+ q2.pop
249
276
  end
277
+ end
250
278
 
251
- th2 = Thread.new do
252
- q1.pop # wait for th1 to get the shared lock
279
+ th2 = Thread.new do
280
+ q1.pop # wait for th1 to get the shared lock
253
281
 
254
- Thread.current[:acquiring_lock] = true
282
+ Thread.current[:acquiring_lock] = true
255
283
 
256
- @ex_lock.with_lock do
257
- Thread.current[:got_lock] = true
258
- end
284
+ @sh_lock.with_lock do
285
+ Thread.current[:got_lock] = true
259
286
  end
287
+ end
260
288
 
261
- th1.join_until { th1[:got_lock] }
262
- th1[:got_lock].should be_true
289
+ th1.join_until { th1[:got_lock] }
290
+ th1[:got_lock].should be_true
263
291
 
264
- th2.join_until { th2[:acquiring_lock] }
265
- th2[:acquiring_lock].should be_true
292
+ th2.join_until { th2[:acquiring_lock] }
293
+ th2[:acquiring_lock].should be_true
266
294
 
267
- q2.num_waiting.should > 0
268
- q2.enq(:release)
295
+ q2.num_waiting.should > 0
296
+ q2.enq(:release)
269
297
 
270
- th1.join_until { q2.size == 0 }
271
- q2.size.should == 0
298
+ th1.join_until { q2.size == 0 }
299
+ q2.size.should == 0
272
300
 
273
- th1.join(2).should == th1
301
+ th1.join(2).should == th1
274
302
 
275
- th2.join_until { th2[:got_lock] }
276
- th2[:got_lock].should be_true
303
+ th2.join_until { th2[:got_lock] }
304
+ th2[:got_lock].should be_true
277
305
 
278
- th2.join(2).should == th2
279
- end
306
+ th2.join(2).should == th2
307
+ end
308
+ end
309
+
310
+ describe 'shared-exclusive-shared' do
311
+ before do
312
+ zk3.should_not be_nil
313
+ @sh_lock2 = ZK::Locker.shared_locker(zk3, path)
280
314
  end
281
315
 
282
- describe 'exclusive lock acquired first' do
283
- it %[should block shared lock from acquiring until released] do
284
- # same test as above but with the thread's locks switched,
285
- # th1 is the exclusive locker
316
+ it %[should act something like a queue] do
317
+ @array = []
286
318
 
287
- q1 = Queue.new
288
- q2 = Queue.new
319
+ @sh_lock.lock!.should be_true
320
+ @sh_lock.should be_locked
289
321
 
290
- th1 = Thread.new do
291
- @ex_lock.with_lock do
292
- q1.enq(:got_lock)
293
- Thread.current[:got_lock] = true
294
- q2.pop
295
- end
322
+ ex_th = Thread.new do
323
+ begin
324
+ @ex_lock.lock!(true) # blocking lock
325
+ Thread.current[:got_lock] = true
326
+ @array << :ex_lock
327
+ ensure
328
+ @ex_lock.unlock!
296
329
  end
330
+ end
297
331
 
298
- th2 = Thread.new do
299
- q1.pop # wait for th1 to get the shared lock
332
+ ex_th.join_until { @ex_lock.waiting? }
333
+ @ex_lock.should be_waiting
334
+ @ex_lock.should_not be_locked
335
+
336
+ # this is the important one, does the second shared lock get blocked by
337
+ # the exclusive lock
338
+ @sh_lock2.lock!.should_not be_true
339
+
340
+ sh2_th = Thread.new do
341
+ begin
342
+ @sh_lock2.lock!(true)
343
+ Thread.current[:got_lock] = true
344
+ @array << :sh_lock2
345
+ ensure
346
+ @sh_lock2.unlock!
347
+ end
348
+ end
300
349
 
301
- Thread.current[:acquiring_lock] = true
350
+ sh2_th.join_until { @sh_lock2.waiting? }
351
+ @sh_lock2.should be_waiting
302
352
 
303
- @sh_lock.with_lock do
304
- Thread.current[:got_lock] = true
305
- end
306
- end
353
+ @sh_lock.unlock!.should be_true
307
354
 
308
- th1.join_until { th1[:got_lock] }
309
- th1[:got_lock].should be_true
355
+ ex_th.join_until { ex_th[:got_lock] }
356
+ ex_th[:got_lock].should be_true
310
357
 
311
- th2.join_until { th2[:acquiring_lock] }
312
- th2[:acquiring_lock].should be_true
358
+ sh2_th.join_until { sh2_th[:got_lock] }
359
+ sh2_th[:got_lock].should be_true
313
360
 
314
- q2.num_waiting.should > 0
315
- q2.enq(:release)
361
+ @array.length.should == 2
362
+ @array.should == [:ex_lock, :sh_lock2]
363
+ end
364
+ end
365
+ end # shared-exclusive interaction
316
366
 
317
- th1.join_until { q2.size == 0 }
318
- q2.size.should == 0
319
367
 
320
- th1.join(2).should == th1
368
+ describe ZK::Locker do
369
+ let(:zk) { ZK.new("localhost:#{ZK_TEST_PORT}", :watcher => :default) }
370
+ let(:zk2) { ZK.new("localhost:#{ZK_TEST_PORT}", :watcher => :default) }
371
+ let(:zk3) { ZK.new("localhost:#{ZK_TEST_PORT}") }
321
372
 
322
- th2.join_until { th2[:got_lock] }
323
- th2[:got_lock].should be_true
373
+ let(:connections) { [zk, zk2, zk3] }
324
374
 
325
- th2.join(2).should == th2
326
- end
327
- end
375
+ let(:path) { "shlock" }
376
+ let(:root_lock_path) { "/_zklocking/#{path}" }
328
377
 
329
- describe 'shared-exclusive-shared' do
330
- before do
331
- @zk3.should_not be_nil
332
- @sh_lock2 = ZK::Locker.shared_locker(@zk3, @path)
333
- end
378
+ before do
379
+ wait_until{ connections.all?(&:connected?) }
380
+ end
381
+
382
+ after do
383
+ connections.each { |c| c.close! }
384
+ wait_until { !connections.any?(&:connected?) }
385
+ end
334
386
 
335
- it %[should act something like a queue] do
336
- @array = []
387
+ it_should_behave_like 'SharedLocker'
388
+ it_should_behave_like 'ExclusiveLocker'
389
+ it_should_behave_like 'shared-exclusive interaction'
390
+ end # ZK::Locker
337
391
 
338
- @sh_lock.lock!.should be_true
339
- @sh_lock.should be_locked
392
+ describe "ZK::Locker chrooted" do
393
+ let(:chroot_path) { '/_zk_chroot_' }
340
394
 
341
- ex_th = Thread.new do
342
- begin
343
- @ex_lock.lock!(true) # blocking lock
344
- Thread.current[:got_lock] = true
345
- @array << :ex_lock
346
- ensure
347
- @ex_lock.unlock!
348
- end
349
- end
395
+ let(:zk) { ZK.new("localhost:#{ZK_TEST_PORT}#{chroot_path}") }
396
+ let(:zk2) { ZK.new("localhost:#{ZK_TEST_PORT}#{chroot_path}") }
397
+ let(:zk3) { ZK.new("localhost:#{ZK_TEST_PORT}#{chroot_path}") }
350
398
 
351
- ex_th.join_until { @ex_lock.waiting? }
352
- @ex_lock.should be_waiting
353
- @ex_lock.should_not be_locked
354
-
355
- # this is the important one, does the second shared lock get blocked by
356
- # the exclusive lock
357
- @sh_lock2.lock!.should_not be_true
358
-
359
- sh2_th = Thread.new do
360
- begin
361
- @sh_lock2.lock!(true)
362
- Thread.current[:got_lock] = true
363
- @array << :sh_lock2
364
- ensure
365
- @sh_lock2.unlock!
366
- end
367
- end
399
+ let(:connections) { [zk, zk2, zk3] }
368
400
 
369
- sh2_th.join_until { @sh_lock2.waiting? }
370
- @sh_lock2.should be_waiting
401
+ let(:path) { "shlock" }
402
+ let(:root_lock_path) { "/_zklocking/#{path}" }
371
403
 
372
- @sh_lock.unlock!.should be_true
404
+ before do
405
+ ZK.open("localhost:#{ZK_TEST_PORT}") do |zk|
406
+ zk.mkdir_p(chroot_path)
407
+ end
373
408
 
374
- ex_th.join_until { ex_th[:got_lock] }
375
- ex_th[:got_lock].should be_true
409
+ wait_until{ connections.all?(&:connected?) }
410
+ end
376
411
 
377
- sh2_th.join_until { sh2_th[:got_lock] }
378
- sh2_th[:got_lock].should be_true
412
+ after do
413
+ connections.each { |c| c.close! }
414
+ wait_until { !connections.any?(&:connected?) }
379
415
 
380
- @array.length.should == 2
381
- @array.should == [:ex_lock, :sh_lock2]
382
- end
416
+ ZK.open("localhost:#{ZK_TEST_PORT}") do |zk|
417
+ zk.rm_rf(chroot_path)
383
418
  end
384
419
  end
420
+
421
+ it_should_behave_like 'SharedLocker'
422
+ it_should_behave_like 'ExclusiveLocker'
423
+ it_should_behave_like 'shared-exclusive interaction'
385
424
  end
386
425
 
data/zk.gemspec CHANGED
@@ -8,16 +8,16 @@ Gem::Specification.new do |s|
8
8
  s.platform = Gem::Platform::RUBY
9
9
  s.authors = ["Jonathan D. Simms", "Topper Bowers"]
10
10
  s.email = ["simms@hp.com", "tobowers@hp.com"]
11
- s.homepage = ""
11
+ s.homepage = "https://github.com/slyphon/zk"
12
12
  s.summary = %q{A high-level wrapper around the zookeeper driver}
13
- s.description = s.summary
13
+ s.description = s.summary + "\n"
14
14
 
15
- s.add_runtime_dependency 'slyphon-zookeeper', '~> 0.2.8'
15
+ s.add_runtime_dependency 'slyphon-zookeeper', '~> 0.3.0'
16
16
 
17
- s.add_development_dependency 'rspec', '~> 2.4.0'
18
- s.add_development_dependency 'wirble'
17
+ s.add_development_dependency 'rspec', '~> 2.8.0'
19
18
  s.add_development_dependency 'flexmock', '~> 0.8.10'
20
19
  s.add_development_dependency 'ZenTest', '~> 4.5.0'
20
+ s.add_development_dependency 'pry'
21
21
 
22
22
  s.files = `git ls-files`.split("\n")
23
23
  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
3
3
  version: !ruby/object:Gem::Version
4
- hash: 51
4
+ hash: 49
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 8
9
- - 6
10
- version: 0.8.6
9
+ - 7
10
+ version: 0.8.7
11
11
  platform: ruby
12
12
  authors:
13
13
  - Jonathan D. Simms
@@ -16,7 +16,7 @@ autorequire:
16
16
  bindir: bin
17
17
  cert_chain: []
18
18
 
19
- date: 2012-01-27 00:00:00 Z
19
+ date: 2012-04-11 00:00:00 Z
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
22
22
  name: slyphon-zookeeper
@@ -26,12 +26,12 @@ dependencies:
26
26
  requirements:
27
27
  - - ~>
28
28
  - !ruby/object:Gem::Version
29
- hash: 7
29
+ hash: 19
30
30
  segments:
31
31
  - 0
32
- - 2
33
- - 8
34
- version: 0.2.8
32
+ - 3
33
+ - 0
34
+ version: 0.3.0
35
35
  type: :runtime
36
36
  version_requirements: *id001
37
37
  - !ruby/object:Gem::Dependency
@@ -42,30 +42,32 @@ dependencies:
42
42
  requirements:
43
43
  - - ~>
44
44
  - !ruby/object:Gem::Version
45
- hash: 31
45
+ hash: 47
46
46
  segments:
47
47
  - 2
48
- - 4
48
+ - 8
49
49
  - 0
50
- version: 2.4.0
50
+ version: 2.8.0
51
51
  type: :development
52
52
  version_requirements: *id002
53
53
  - !ruby/object:Gem::Dependency
54
- name: wirble
54
+ name: flexmock
55
55
  prerelease: false
56
56
  requirement: &id003 !ruby/object:Gem::Requirement
57
57
  none: false
58
58
  requirements:
59
- - - ">="
59
+ - - ~>
60
60
  - !ruby/object:Gem::Version
61
- hash: 3
61
+ hash: 43
62
62
  segments:
63
63
  - 0
64
- version: "0"
64
+ - 8
65
+ - 10
66
+ version: 0.8.10
65
67
  type: :development
66
68
  version_requirements: *id003
67
69
  - !ruby/object:Gem::Dependency
68
- name: flexmock
70
+ name: ZenTest
69
71
  prerelease: false
70
72
  requirement: &id004 !ruby/object:Gem::Requirement
71
73
  none: false
@@ -74,29 +76,29 @@ dependencies:
74
76
  - !ruby/object:Gem::Version
75
77
  hash: 43
76
78
  segments:
79
+ - 4
80
+ - 5
77
81
  - 0
78
- - 8
79
- - 10
80
- version: 0.8.10
82
+ version: 4.5.0
81
83
  type: :development
82
84
  version_requirements: *id004
83
85
  - !ruby/object:Gem::Dependency
84
- name: ZenTest
86
+ name: pry
85
87
  prerelease: false
86
88
  requirement: &id005 !ruby/object:Gem::Requirement
87
89
  none: false
88
90
  requirements:
89
- - - ~>
91
+ - - ">="
90
92
  - !ruby/object:Gem::Version
91
- hash: 43
93
+ hash: 3
92
94
  segments:
93
- - 4
94
- - 5
95
95
  - 0
96
- version: 4.5.0
96
+ version: "0"
97
97
  type: :development
98
98
  version_requirements: *id005
99
- description: A high-level wrapper around the zookeeper driver
99
+ description: |
100
+ A high-level wrapper around the zookeeper driver
101
+
100
102
  email:
101
103
  - simms@hp.com
102
104
  - tobowers@hp.com
@@ -153,7 +155,7 @@ files:
153
155
  - spec/z_k/threadpool_spec.rb
154
156
  - spec/zookeeper_spec.rb
155
157
  - zk.gemspec
156
- homepage: ""
158
+ homepage: https://github.com/slyphon/zk
157
159
  licenses: []
158
160
 
159
161
  post_install_message: