slyphon-zookeeper 0.2.5 → 0.2.7
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/ext/dbg.h +37 -0
- data/ext/depend +4 -0
- data/ext/extconf.rb +11 -3
- data/ext/zookeeper_base.rb +1 -0
- data/ext/zookeeper_c.c +32 -19
- data/ext/zookeeper_lib.c +5 -6
- data/lib/zookeeper/em_client.rb +1 -0
- data/slyphon-zookeeper.gemspec +1 -1
- metadata +89 -48
data/ext/dbg.h
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
#ifndef __dbg_h__
|
2
|
+
#define __dbg_h__
|
3
|
+
|
4
|
+
// ALL GLORY TO THE Zed A. Shaw
|
5
|
+
// http://c.learncodethehardway.org/book/learn-c-the-hard-waych21.html#x26-10500021
|
6
|
+
|
7
|
+
#include <stdio.h>
|
8
|
+
#include <errno.h>
|
9
|
+
#include <string.h>
|
10
|
+
|
11
|
+
#ifdef NDEBUG
|
12
|
+
#define debug(M, ...)
|
13
|
+
#else
|
14
|
+
#define debug(M, ...) fprintf(stderr, "DEBUG %s:%d: " M "\n", __FILE__, __LINE__, ##__VA_ARGS__)
|
15
|
+
#endif
|
16
|
+
|
17
|
+
#define clean_errno() (errno == 0 ? "None" : strerror(errno))
|
18
|
+
|
19
|
+
#define log_err(M, ...) fprintf(stderr, "[ERROR] (%s:%d: errno: %s) " M "\n", __FILE__, __LINE__, clean_errno(), ##__VA_ARGS__)
|
20
|
+
|
21
|
+
#define log_warn(M, ...) fprintf(stderr, "[WARN] (%s:%d: errno: %s) " M "\n", __FILE__, __LINE__, clean_errno(), ##__VA_ARGS__)
|
22
|
+
|
23
|
+
#define log_info(M, ...) fprintf(stderr, "[INFO] (%s:%d) " M "\n", __FILE__, __LINE__, ##__VA_ARGS__)
|
24
|
+
|
25
|
+
#define check(A, M, ...) if(!(A)) { log_err(M, ##__VA_ARGS__); errno=0; goto error; }
|
26
|
+
|
27
|
+
#define sentinel(M, ...) { log_err(M, ##__VA_ARGS__); errno=0; goto error; }
|
28
|
+
|
29
|
+
#define check_mem(A) check((A), "Out of memory.")
|
30
|
+
|
31
|
+
#define check_debug(A, M, ...) if(!(A)) { debug(M, ##__VA_ARGS__); errno=0; goto error; }
|
32
|
+
|
33
|
+
#define zkrb_debug(M, ...) if (ZKRBDebugging) fprintf(stderr, "DEBUG %s:%d: " M "\n", __FILE__, __LINE__, ##__VA_ARGS__)
|
34
|
+
#define zkrb_debug_inst(O, M, ...) zkrb_debug("obj_id: %lx, " M, FIX2LONG(rb_obj_id(O)), ##__VA_ARGS__)
|
35
|
+
|
36
|
+
#endif
|
37
|
+
|
data/ext/depend
ADDED
data/ext/extconf.rb
CHANGED
@@ -11,12 +11,14 @@ $LDFLAGS = "#{RbConfig::CONFIG['LDFLAGS']} #{$LDFLAGS}".gsub("$(ldflags)", "").g
|
|
11
11
|
$CXXFLAGS = " -std=gnu++98 #{$CFLAGS}"
|
12
12
|
$CPPFLAGS = $ARCH_FLAG = $DLDFLAGS = ""
|
13
13
|
|
14
|
+
ZK_DEBUG = (ENV['DEBUG'] or ARGV.any? { |arg| arg == '--debug' })
|
15
|
+
DEBUG_CFLAGS = " -O0 -ggdb3 -DHAVE_DEBUG"
|
14
16
|
|
15
|
-
if
|
17
|
+
if ZK_DEBUG
|
16
18
|
$stderr.puts "*** Setting debug flags. ***"
|
17
|
-
$CFLAGS << " -O0 -ggdb3 -DHAVE_DEBUG"
|
18
19
|
$EXTRA_CONF = " --enable-debug"
|
19
20
|
$CFLAGS.gsub!(/ -O[^0] /, ' ')
|
21
|
+
$CFLAGS << DEBUG_CFLAGS
|
20
22
|
end
|
21
23
|
|
22
24
|
$includes = " -I#{HERE}/include"
|
@@ -46,7 +48,11 @@ Dir.chdir(HERE) do
|
|
46
48
|
end
|
47
49
|
|
48
50
|
Dir.chdir(BUNDLE_PATH) do
|
49
|
-
|
51
|
+
configure = "./configure --prefix=#{HERE} --with-pic --without-cppunit --disable-dependency-tracking #{$EXTRA_CONF} 2>&1"
|
52
|
+
|
53
|
+
configure = "env CFLAGS='#{DEBUG_CFLAGS}' #{configure}" if ZK_DEBUG
|
54
|
+
|
55
|
+
safe_sh(configure)
|
50
56
|
safe_sh("make 2>&1")
|
51
57
|
safe_sh("make install 2>&1")
|
52
58
|
end
|
@@ -62,4 +68,6 @@ Dir.chdir("#{HERE}/lib") do
|
|
62
68
|
end
|
63
69
|
$LIBS << " -lzookeeper_mt_gem"
|
64
70
|
|
71
|
+
|
65
72
|
create_makefile 'zookeeper_c'
|
73
|
+
|
data/ext/zookeeper_base.rb
CHANGED
data/ext/zookeeper_c.c
CHANGED
@@ -22,7 +22,7 @@
|
|
22
22
|
#include <inttypes.h>
|
23
23
|
|
24
24
|
#include "zookeeper_lib.h"
|
25
|
-
|
25
|
+
#include "dbg.h"
|
26
26
|
|
27
27
|
static VALUE Zookeeper = Qnil;
|
28
28
|
|
@@ -32,6 +32,7 @@ struct zkrb_instance_data {
|
|
32
32
|
zhandle_t *zh;
|
33
33
|
clientid_t myid;
|
34
34
|
zkrb_queue_t *queue;
|
35
|
+
long object_id; // the ruby object this instance data is associated with
|
35
36
|
};
|
36
37
|
|
37
38
|
typedef enum {
|
@@ -44,23 +45,28 @@ typedef enum {
|
|
44
45
|
#define IS_SYNC(zkrbcall) ((zkrbcall)==SYNC || (zkrbcall)==SYNC_WATCH)
|
45
46
|
#define IS_ASYNC(zkrbcall) ((zkrbcall)==ASYNC || (zkrbcall)==ASYNC_WATCH)
|
46
47
|
|
48
|
+
|
47
49
|
static int destroy_zkrb_instance(struct zkrb_instance_data* ptr) {
|
48
50
|
int rv = ZOK;
|
49
51
|
|
50
52
|
if (ptr->zh) {
|
51
53
|
const void *ctx = zoo_get_context(ptr->zh);
|
52
54
|
/* Note that after zookeeper_close() returns, ZK handle is invalid */
|
53
|
-
|
55
|
+
zkrb_debug("obj_id: %lx, calling zookeeper_close", ptr->object_id);
|
54
56
|
rv = zookeeper_close(ptr->zh);
|
55
|
-
|
57
|
+
zkrb_debug("obj_id: %lx, zookeeper_close returned %d", ptr->object_id, rv);
|
56
58
|
free((void *) ctx);
|
57
59
|
}
|
58
60
|
|
59
61
|
#warning [wickman] TODO: fire off warning if queue is not empty
|
60
|
-
if (ptr->queue)
|
62
|
+
if (ptr->queue) {
|
63
|
+
zkrb_debug("obj_id: %lx, freeing queue pointer: %p", ptr->object_id, ptr->queue);
|
64
|
+
zkrb_queue_free(ptr->queue);
|
65
|
+
}
|
61
66
|
|
62
67
|
ptr->zh = NULL;
|
63
68
|
ptr->queue = NULL;
|
69
|
+
|
64
70
|
return rv;
|
65
71
|
}
|
66
72
|
|
@@ -70,10 +76,11 @@ static void free_zkrb_instance_data(struct zkrb_instance_data* ptr) {
|
|
70
76
|
|
71
77
|
static void print_zkrb_instance_data(struct zkrb_instance_data* ptr) {
|
72
78
|
fprintf(stderr, "zkrb_instance_data (%p) {\n", ptr);
|
73
|
-
fprintf(stderr, "
|
74
|
-
fprintf(stderr, "
|
75
|
-
fprintf(stderr, "
|
76
|
-
fprintf(stderr, "
|
79
|
+
fprintf(stderr, " zh = %p\n", ptr->zh);
|
80
|
+
fprintf(stderr, " { state = %d }\n", zoo_state(ptr->zh));
|
81
|
+
fprintf(stderr, " id = %"PRId64"\n", ptr->myid.client_id); // PRId64 defined in inttypes.h
|
82
|
+
fprintf(stderr, " q = %p\n", ptr->queue);
|
83
|
+
fprintf(stderr, " obj_id = %lx\n", ptr->object_id);
|
77
84
|
fprintf(stderr, "}\n");
|
78
85
|
}
|
79
86
|
|
@@ -154,6 +161,8 @@ static VALUE method_init(int argc, VALUE* argv, VALUE self) {
|
|
154
161
|
zkrb_calling_context *ctx =
|
155
162
|
zkrb_calling_context_alloc(ZKRB_GLOBAL_REQ, zk_local_ctx->queue);
|
156
163
|
|
164
|
+
zk_local_ctx->object_id = FIX2LONG(rb_obj_id(self));
|
165
|
+
|
157
166
|
zk_local_ctx->zh =
|
158
167
|
zookeeper_init(
|
159
168
|
RSTRING_PTR(hostPort),
|
@@ -168,7 +177,7 @@ static VALUE method_init(int argc, VALUE* argv, VALUE self) {
|
|
168
177
|
rb_raise(rb_eRuntimeError, "error connecting to zookeeper: %d", errno);
|
169
178
|
}
|
170
179
|
|
171
|
-
rb_iv_set(self, "@
|
180
|
+
rb_iv_set(self, "@_data", data);
|
172
181
|
rb_iv_set(self, "@selectable_io", create_selectable_io(zk_local_ctx->queue));
|
173
182
|
rb_iv_set(self, "@_running", Qtrue);
|
174
183
|
|
@@ -178,7 +187,7 @@ static VALUE method_init(int argc, VALUE* argv, VALUE self) {
|
|
178
187
|
|
179
188
|
#define FETCH_DATA_PTR(x, y) \
|
180
189
|
struct zkrb_instance_data * y; \
|
181
|
-
Data_Get_Struct(rb_iv_get(x, "@
|
190
|
+
Data_Get_Struct(rb_iv_get(x, "@_data"), struct zkrb_instance_data, y); \
|
182
191
|
if ((y)->zh == NULL) \
|
183
192
|
rb_raise(rb_eRuntimeError, "zookeeper handle is closed")
|
184
193
|
|
@@ -189,7 +198,7 @@ static VALUE method_init(int argc, VALUE* argv, VALUE self) {
|
|
189
198
|
} \
|
190
199
|
Check_Type(path, T_STRING); \
|
191
200
|
struct zkrb_instance_data * zk; \
|
192
|
-
Data_Get_Struct(rb_iv_get(self, "@
|
201
|
+
Data_Get_Struct(rb_iv_get(self, "@_data"), struct zkrb_instance_data, zk); \
|
193
202
|
if (!zk->zh) \
|
194
203
|
rb_raise(rb_eRuntimeError, "zookeeper handle is closed"); \
|
195
204
|
zkrb_calling_context* cb_ctx = \
|
@@ -489,7 +498,7 @@ static VALUE method_get_next_event(VALUE self, VALUE blocking) {
|
|
489
498
|
// ruby-land semaphore that we can also use in the java extension
|
490
499
|
//
|
491
500
|
if (is_closed(self) || !is_running(self)) {
|
492
|
-
|
501
|
+
zkrb_debug_inst(self, "is_closed(self): %d, is_running(self): %d, method_get_next_event is exiting loop", is_closed(self), is_running(self));
|
493
502
|
return Qnil; // this case for shutdown
|
494
503
|
}
|
495
504
|
|
@@ -512,9 +521,8 @@ static VALUE method_get_next_event(VALUE self, VALUE blocking) {
|
|
512
521
|
if (bytes_read == -1) {
|
513
522
|
rb_raise(rb_eRuntimeError, "read failed: %d", errno);
|
514
523
|
}
|
515
|
-
|
516
|
-
|
517
|
-
}
|
524
|
+
|
525
|
+
zkrb_debug_inst(self, "read %zd bytes from the queue (%p)'s pipe", bytes_read, zk->queue);
|
518
526
|
|
519
527
|
continue;
|
520
528
|
}
|
@@ -545,6 +553,7 @@ static VALUE method_client_id(VALUE self) {
|
|
545
553
|
static VALUE method_wake_event_loop_bang(VALUE self) {
|
546
554
|
FETCH_DATA_PTR(self, zk);
|
547
555
|
|
556
|
+
zkrb_debug_inst(self, "Waking event loop: %p", zk->queue);
|
548
557
|
zkrb_signal(zk->queue);
|
549
558
|
|
550
559
|
return Qnil;
|
@@ -563,7 +572,8 @@ static VALUE method_close_handle(VALUE self) {
|
|
563
572
|
FETCH_DATA_PTR(self, zk);
|
564
573
|
|
565
574
|
if (ZKRBDebugging) {
|
566
|
-
fprintf(stderr, "CLOSING ZK INSTANCE:")
|
575
|
+
/* fprintf(stderr, "CLOSING ZK INSTANCE: obj_id %lx", FIX2LONG(rb_obj_id(self)));*/
|
576
|
+
zkrb_debug_inst(self, "CLOSING_ZK_INSTANCE");
|
567
577
|
print_zkrb_instance_data(zk);
|
568
578
|
}
|
569
579
|
|
@@ -571,14 +581,15 @@ static VALUE method_close_handle(VALUE self) {
|
|
571
581
|
// has been called
|
572
582
|
rb_iv_set(self, "@_closed", Qtrue);
|
573
583
|
|
574
|
-
|
584
|
+
zkrb_debug_inst(self, "calling destroy_zkrb_instance");
|
575
585
|
|
576
586
|
/* Note that after zookeeper_close() returns, ZK handle is invalid */
|
577
587
|
int rc = destroy_zkrb_instance(zk);
|
578
588
|
|
579
|
-
|
589
|
+
zkrb_debug("destroy_zkrb_instance returned: %d", rc);
|
580
590
|
|
581
|
-
return
|
591
|
+
return Qnil;
|
592
|
+
/* return INT2FIX(rc);*/
|
582
593
|
}
|
583
594
|
|
584
595
|
static VALUE method_deterministic_conn_order(VALUE self, VALUE yn) {
|
@@ -657,3 +668,5 @@ void Init_zookeeper_c() {
|
|
657
668
|
Zookeeper = rb_define_class("CZookeeper", rb_cObject);
|
658
669
|
zkrb_define_methods();
|
659
670
|
}
|
671
|
+
|
672
|
+
// vim:ts=2:sw=2:sts=2:et
|
data/ext/zookeeper_lib.c
CHANGED
@@ -17,6 +17,7 @@ wickman@twitter.com
|
|
17
17
|
#include <pthread.h>
|
18
18
|
#include <unistd.h>
|
19
19
|
#include <inttypes.h>
|
20
|
+
#include "dbg.h"
|
20
21
|
|
21
22
|
#define GET_SYM(str) ID2SYM(rb_intern(str))
|
22
23
|
|
@@ -29,7 +30,7 @@ pthread_mutex_t zkrb_q_mutex = PTHREAD_MUTEX_INITIALIZER;
|
|
29
30
|
*
|
30
31
|
* NOTE: be *very careful* in these functions, calling *ANY* ruby interpreter
|
31
32
|
* function when you're not in an interpreter thread can hork ruby, trigger a
|
32
|
-
* [BUG], corrupt the stack, kill
|
33
|
+
* [BUG], corrupt the stack, kill your dog, knock up your daughter, etc. etc.
|
33
34
|
*
|
34
35
|
*********************************************************************************
|
35
36
|
*/
|
@@ -53,10 +54,8 @@ void zkrb_enqueue(zkrb_queue_t *q, zkrb_event_t *elt) {
|
|
53
54
|
// this from a ruby thread. Calling into the interpreter from a non-ruby
|
54
55
|
// thread is bad, mm'kay?
|
55
56
|
|
56
|
-
if (
|
57
|
-
|
58
|
-
fprintf(stderr, "WARNING: write to queue (%p) pipe failed!\n", q);
|
59
|
-
}
|
57
|
+
if ((ret == -1)) {
|
58
|
+
fprintf(stderr, "WARNING: write to queue (%p) pipe failed!\n", q);
|
60
59
|
}
|
61
60
|
}
|
62
61
|
|
@@ -93,7 +92,7 @@ void zkrb_signal(zkrb_queue_t *q) {
|
|
93
92
|
ssize_t ret = write(q->pipe_write, "0", 1); /* Wake up Ruby listener */
|
94
93
|
pthread_mutex_unlock(&zkrb_q_mutex);
|
95
94
|
if (ret == -1)
|
96
|
-
|
95
|
+
log_err("write to pipe failed");
|
97
96
|
}
|
98
97
|
|
99
98
|
zkrb_queue_t *zkrb_queue_alloc(void) {
|
data/lib/zookeeper/em_client.rb
CHANGED
data/slyphon-zookeeper.gemspec
CHANGED
@@ -3,7 +3,7 @@ $:.push File.expand_path("../lib", __FILE__)
|
|
3
3
|
|
4
4
|
Gem::Specification.new do |s|
|
5
5
|
s.name = "slyphon-zookeeper"
|
6
|
-
s.version = '0.2.
|
6
|
+
s.version = '0.2.7'
|
7
7
|
|
8
8
|
s.authors = ["Phillip Pearson", "Eric Maland", "Evan Weaver", "Brian Wickman", "Neil Conway", "Jonathan D. Simms"]
|
9
9
|
s.email = ["slyphon@gmail.com"]
|
metadata
CHANGED
@@ -1,10 +1,15 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: slyphon-zookeeper
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 25
|
5
5
|
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 2
|
9
|
+
- 7
|
10
|
+
version: 0.2.7
|
6
11
|
platform: ruby
|
7
|
-
authors:
|
12
|
+
authors:
|
8
13
|
- Phillip Pearson
|
9
14
|
- Eric Maland
|
10
15
|
- Evan Weaver
|
@@ -14,60 +19,85 @@ authors:
|
|
14
19
|
autorequire:
|
15
20
|
bindir: bin
|
16
21
|
cert_chain: []
|
17
|
-
|
18
|
-
|
19
|
-
|
22
|
+
|
23
|
+
date: 2011-11-17 00:00:00 Z
|
24
|
+
dependencies:
|
25
|
+
- !ruby/object:Gem::Dependency
|
20
26
|
name: rspec
|
21
|
-
|
27
|
+
prerelease: false
|
28
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
22
29
|
none: false
|
23
|
-
requirements:
|
24
|
-
- -
|
25
|
-
- !ruby/object:Gem::Version
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
hash: 15
|
34
|
+
segments:
|
35
|
+
- 2
|
36
|
+
- 0
|
37
|
+
- 0
|
26
38
|
version: 2.0.0
|
27
39
|
type: :development
|
28
|
-
|
29
|
-
|
30
|
-
- !ruby/object:Gem::Dependency
|
40
|
+
version_requirements: *id001
|
41
|
+
- !ruby/object:Gem::Dependency
|
31
42
|
name: flexmock
|
32
|
-
|
43
|
+
prerelease: false
|
44
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
33
45
|
none: false
|
34
|
-
requirements:
|
46
|
+
requirements:
|
35
47
|
- - ~>
|
36
|
-
- !ruby/object:Gem::Version
|
48
|
+
- !ruby/object:Gem::Version
|
49
|
+
hash: 41
|
50
|
+
segments:
|
51
|
+
- 0
|
52
|
+
- 8
|
53
|
+
- 11
|
37
54
|
version: 0.8.11
|
38
55
|
type: :development
|
39
|
-
|
40
|
-
|
41
|
-
- !ruby/object:Gem::Dependency
|
56
|
+
version_requirements: *id002
|
57
|
+
- !ruby/object:Gem::Dependency
|
42
58
|
name: eventmachine
|
43
|
-
|
59
|
+
prerelease: false
|
60
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
44
61
|
none: false
|
45
|
-
requirements:
|
46
|
-
- - =
|
47
|
-
- !ruby/object:Gem::Version
|
62
|
+
requirements:
|
63
|
+
- - "="
|
64
|
+
- !ruby/object:Gem::Version
|
65
|
+
hash: 62196363
|
66
|
+
segments:
|
67
|
+
- 1
|
68
|
+
- 0
|
69
|
+
- 0
|
70
|
+
- beta
|
71
|
+
- 4
|
48
72
|
version: 1.0.0.beta.4
|
49
73
|
type: :development
|
50
|
-
|
51
|
-
|
52
|
-
- !ruby/object:Gem::Dependency
|
74
|
+
version_requirements: *id003
|
75
|
+
- !ruby/object:Gem::Dependency
|
53
76
|
name: evented-spec
|
54
|
-
|
77
|
+
prerelease: false
|
78
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
55
79
|
none: false
|
56
|
-
requirements:
|
80
|
+
requirements:
|
57
81
|
- - ~>
|
58
|
-
- !ruby/object:Gem::Version
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
hash: 59
|
84
|
+
segments:
|
85
|
+
- 0
|
86
|
+
- 9
|
87
|
+
- 0
|
59
88
|
version: 0.9.0
|
60
89
|
type: :development
|
61
|
-
|
62
|
-
version_requirements: *70134739890760
|
90
|
+
version_requirements: *id004
|
63
91
|
description: twitter's zookeeper client
|
64
|
-
email:
|
92
|
+
email:
|
65
93
|
- slyphon@gmail.com
|
66
94
|
executables: []
|
67
|
-
|
95
|
+
|
96
|
+
extensions:
|
68
97
|
- ext/extconf.rb
|
69
98
|
extra_rdoc_files: []
|
70
|
-
|
99
|
+
|
100
|
+
files:
|
71
101
|
- .gitignore
|
72
102
|
- CHANGELOG
|
73
103
|
- Gemfile
|
@@ -78,6 +108,8 @@ files:
|
|
78
108
|
- examples/cloud_config.rb
|
79
109
|
- ext/.gitignore
|
80
110
|
- ext/Rakefile
|
111
|
+
- ext/dbg.h
|
112
|
+
- ext/depend
|
81
113
|
- ext/extconf.rb
|
82
114
|
- ext/zkc-3.3.3.tar.gz
|
83
115
|
- ext/zookeeper_base.rb
|
@@ -108,30 +140,39 @@ files:
|
|
108
140
|
- test/test_watcher2.rb
|
109
141
|
homepage: https://github.com/slyphon/zookeeper
|
110
142
|
licenses: []
|
143
|
+
|
111
144
|
post_install_message:
|
112
145
|
rdoc_options: []
|
113
|
-
|
146
|
+
|
147
|
+
require_paths:
|
114
148
|
- lib
|
115
149
|
- ext
|
116
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
150
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
117
151
|
none: false
|
118
|
-
requirements:
|
119
|
-
- -
|
120
|
-
- !ruby/object:Gem::Version
|
121
|
-
|
122
|
-
|
152
|
+
requirements:
|
153
|
+
- - ">="
|
154
|
+
- !ruby/object:Gem::Version
|
155
|
+
hash: 3
|
156
|
+
segments:
|
157
|
+
- 0
|
158
|
+
version: "0"
|
159
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
123
160
|
none: false
|
124
|
-
requirements:
|
125
|
-
- -
|
126
|
-
- !ruby/object:Gem::Version
|
127
|
-
|
161
|
+
requirements:
|
162
|
+
- - ">="
|
163
|
+
- !ruby/object:Gem::Version
|
164
|
+
hash: 3
|
165
|
+
segments:
|
166
|
+
- 0
|
167
|
+
version: "0"
|
128
168
|
requirements: []
|
169
|
+
|
129
170
|
rubyforge_project:
|
130
|
-
rubygems_version: 1.8.
|
171
|
+
rubygems_version: 1.8.6
|
131
172
|
signing_key:
|
132
173
|
specification_version: 3
|
133
174
|
summary: twitter's zookeeper client
|
134
|
-
test_files:
|
175
|
+
test_files:
|
135
176
|
- spec/default_watcher_spec.rb
|
136
177
|
- spec/em_spec.rb
|
137
178
|
- spec/log4j.properties
|