spymemcached.jruby 1.0.0-universal-java-1.7

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f2041c63625bc2d15329384c3fcfc124d2c4f3e3
4
+ data.tar.gz: dd2a6e89826d7fea2d48c802cc60eda42b72463f
5
+ SHA512:
6
+ metadata.gz: 7725d53c5682dcc8b321f7799a33738310425132f60e68e5d9b00af42dacd8d382a5730bd83a5bc921a5b7529733585b4b59471722ccba8c3bec266878cf6898
7
+ data.tar.gz: fd482a06a00659cfe2f59965695d542c5ee00cb74bb5494dc1027190e00a397ffbf221df3c5f9286d0e64b3eccbdd9e98f7e03c615553cd158e6fe95825aedcd
data/README.md ADDED
File without changes
@@ -0,0 +1,60 @@
1
+ require 'memcache'
2
+
3
+ class Spymemcached
4
+ class Rails23
5
+ module Response # :nodoc:
6
+ STORED = "STORED\r\n"
7
+ NOT_STORED = "NOT_STORED\r\n"
8
+ EXISTS = "EXISTS\r\n"
9
+ NOT_FOUND = "NOT_FOUND\r\n"
10
+ DELETED = "DELETED\r\n"
11
+ end
12
+
13
+ def initialize(client)
14
+ @client = client
15
+ end
16
+
17
+ def get_multi(*args)
18
+ op(:get_multi, *args)
19
+ end
20
+
21
+ def get(key, *args)
22
+ op(:get, key)
23
+ end
24
+
25
+ def add(key, value, ttl=0, *args)
26
+ op(:add, key, value, ttl) ? Response::STORED : Response::NOT_STORED
27
+ end
28
+
29
+ def set(key, value, ttl=0, *args)
30
+ op(:set, key, value, ttl) ? Response::STORED : Response::NOT_STORED
31
+ end
32
+
33
+ def delete(key, *args)
34
+ op(:delete, key) ? Response::DELETED : Response::NOT_FOUND
35
+ end
36
+
37
+ def incr(key, by=1)
38
+ op(:incr, key, by)
39
+ end
40
+
41
+ def decr(key, by=1)
42
+ op(:decr, key, by)
43
+ end
44
+
45
+ def flush_all
46
+ op(:flush_all)
47
+ end
48
+
49
+ def stats
50
+ op(:stats)
51
+ end
52
+
53
+ private
54
+ def op(name, *args, &block)
55
+ @client.send(name, *args, &block)
56
+ rescue TimeoutError => e
57
+ raise MemCache::MemCacheError, e.message
58
+ end
59
+ end
60
+ end
Binary file
@@ -0,0 +1,135 @@
1
+ require 'spymemcached-2.11.4.jar'
2
+ require 'spymemcached_adapter.jar'
3
+ require 'spymemcached_adapter'
4
+
5
+ #
6
+ # Memcached client Spymemcached JRuby extension
7
+ #
8
+ class Spymemcached
9
+ class TimeoutError < StandardError; end
10
+
11
+ # default options for client
12
+ DEFAULT_OPTIONS = {
13
+ :timeout => 0.5, # second
14
+ :binary => true
15
+ }
16
+
17
+ # Accepts a list of +servers+ and a list of +options+.
18
+ # The +servers+ can be either strings of the form "hostname:port" or
19
+ # one string format as "<hostname>:<port>,<hostname>:<port>".
20
+ # Use KetamaConnectionFactory as Spymemcached MemcachedClient connection factory.
21
+ # See Spymemcached document for details.
22
+ # Different with Ruby memcache clients (e.g. Dalli), there is no raw option for operations.
23
+ #
24
+ # Valid +options+ are:
25
+ #
26
+ # [:namespace] Prepends this value to all keys added or retrieved.
27
+ # [:timeout] Time to use as the socket read timeout, seconds. Defaults to 0.5 sec.
28
+ # [:binary] Talks binary protocol with Memcached server. Default to true.
29
+ #
30
+ # Logger: see Spymemcached for how to turn on detail log
31
+ #
32
+ def initialize(servers=['localhost:11211'], options={})
33
+ @servers, @options = Array(servers).join(','), DEFAULT_OPTIONS.merge(options)
34
+ @client = SpymemcachedAdapter.new(@servers, @options)
35
+ at_exit { shutdown }
36
+ end
37
+
38
+ def fetch(key, ttl=0, &block)
39
+ val = get(key)
40
+ if val.nil? && block_given?
41
+ val = yield
42
+ add(key, val, ttl)
43
+ end
44
+ val
45
+ end
46
+
47
+ def get(key)
48
+ @client.get(ns(key))
49
+ end
50
+ alias :[] :get
51
+
52
+ def get_multi(*keys)
53
+ Hash[@client.get_multi(keys.map(&method(:ns))).map {|k, v| [unns(k), v]}]
54
+ end
55
+
56
+ def add(key, value, ttl=0, opts={})
57
+ @client.add(ns(key), value, ttl)
58
+ end
59
+
60
+ def set(key, value, ttl=0, opts={})
61
+ @client.set(ns(key), value, ttl)
62
+ end
63
+ alias :[]= :set
64
+
65
+ def cas(key, ttl=0, &block)
66
+ @client.cas(ns(key), ttl, &block)
67
+ end
68
+
69
+ def replace(key, value, ttl=0)
70
+ @client.replace(ns(key), value, ttl)
71
+ end
72
+
73
+ def delete(key)
74
+ @client.delete(ns(key))
75
+ end
76
+
77
+ def incr(key, by=1)
78
+ @client.incr(ns(key), by)
79
+ end
80
+
81
+ def decr(key, by=1)
82
+ @client.decr(ns(key), by)
83
+ end
84
+
85
+ def append(key, value)
86
+ @client.append(ns(key), value)
87
+ end
88
+
89
+ def prepend(key, value)
90
+ @client.prepend(ns(key), value)
91
+ end
92
+
93
+ def touch(key, ttl=0)
94
+ @client.touch(ns(key), ttl)
95
+ end
96
+
97
+ def stats
98
+ @client.stats
99
+ end
100
+
101
+ def version
102
+ @client.version
103
+ end
104
+
105
+ def flush_all
106
+ @client.flush_all
107
+ end
108
+ alias :flush :flush_all
109
+ alias :clear :flush_all
110
+
111
+ def shutdown
112
+ @client.shutdown
113
+ end
114
+
115
+ # compatible api
116
+ def rails23
117
+ require 'spymemcached/rails23'
118
+ Rails23.new(self)
119
+ end
120
+
121
+ private
122
+ def raw?(opts)
123
+ opts.is_a?(Hash) ? opts[:raw] : opts
124
+ end
125
+
126
+ def ns(key)
127
+ @options[:namespace] ? "#{@options[:namespace]}:#{key}" : key
128
+ end
129
+
130
+ def unns(k)
131
+ return k unless @options[:namespace]
132
+ @ns_size ||= @options[:namespace].size + 1
133
+ k[@ns_size..-1]
134
+ end
135
+ end
Binary file
data/test/memcache.rb ADDED
@@ -0,0 +1,4 @@
1
+ class MemCache
2
+ class MemCacheError
3
+ end
4
+ end
@@ -0,0 +1,121 @@
1
+ require 'test_helper'
2
+
3
+ class SpymemcachedBinaryProtocolTest < Test::Unit::TestCase
4
+ def setup
5
+ @client = binary_client
6
+ @client.flush_all
7
+ end
8
+
9
+ def test_get_set
10
+ assert_equal nil, @client.get('key')
11
+ @client.set('key', 'value')
12
+ assert_equal 'value', @client.get('key')
13
+ assert_equal 'value', @client['key']
14
+
15
+ @client.set('key', nil)
16
+ assert_equal nil, @client.get('key')
17
+ @client['key'] = 'hello'
18
+ assert_equal 'hello', @client.get('key')
19
+
20
+ @client.set('key2', ['hello', 'world'])
21
+ assert_equal ['hello', 'world'], @client.get('key2')
22
+
23
+ @client.set('key2', Msg.new('hi'))
24
+ assert_equal Msg.new('hi'), @client.get('key2')
25
+ end
26
+
27
+ def test_get_set_large_string
28
+ str = 'value' * 10_000_000
29
+ @client.set(name, str)
30
+ assert_equal str, @client.get(name)
31
+ end
32
+
33
+ def test_add
34
+ assert @client.add('key', 'value')
35
+ assert_equal "value", @client.get('key')
36
+
37
+ assert !@client.add('key', 'another')
38
+ assert_equal "value", @client.get('key')
39
+ end
40
+
41
+ def test_incr_and_decr
42
+ @client.add('key', '0')
43
+ assert_equal 0, @client.incr('key', 0)
44
+ @client.incr('key')
45
+ assert_equal 1, @client.incr('key', 0)
46
+ @client.incr('key', 5)
47
+ assert_equal 6, @client.incr('key', 0)
48
+ assert_equal '6', @client.get('key')
49
+
50
+ @client.set('key', '6')
51
+ @client.decr('key')
52
+ assert_equal 5, @client.decr('key', 0)
53
+ @client.decr('key', 3)
54
+ assert_equal 2, @client.decr('key', 0)
55
+
56
+ @client.replace('key', '10')
57
+ assert_equal 11, @client.incr('key')
58
+
59
+ @client.cas('key') { '7' }
60
+ assert_equal 8, @client.incr('key')
61
+ end
62
+
63
+ def test_fetch
64
+ ret = @client.fetch('key') { 'value' }
65
+ assert_equal 'value', ret
66
+ ret = @client.fetch('key') { 'hello' }
67
+ assert_equal 'value', ret
68
+ end
69
+
70
+ def test_get_multi
71
+ @client.add('k1', 'v1')
72
+ @client.add('k2', Msg.new('v2'))
73
+ ret = @client.get_multi('k1', 'k2', 'k3')
74
+ assert_equal(2, ret.size)
75
+ assert_equal('v1', ret['k1'])
76
+ assert_equal(Msg.new('v2'), ret['k2'])
77
+ end
78
+
79
+ def test_cas
80
+ assert_nil(@client.cas('k1') { 'v0' })
81
+
82
+ assert @client.add('k1', 'v1')
83
+ assert(@client.cas('k1') { 'v2' })
84
+ assert_equal 'v2', @client.get('k1')
85
+
86
+ ret = @client.cas('k1') do
87
+ @client.set('k1', 'v4')
88
+ 'v3'
89
+ end
90
+ assert_equal(false, ret)
91
+ assert_equal('v4', @client.get('k1'))
92
+ end
93
+
94
+ def test_replace
95
+ assert_equal false, @client.replace('k1', 'v1')
96
+ assert_nil @client['k1']
97
+
98
+ @client['k1'] = 'v0'
99
+ assert @client.replace('k1', 'v1')
100
+ assert_equal 'v1', @client['k1']
101
+ end
102
+
103
+ def test_delete
104
+ @client['k1'] = 'v0'
105
+ assert @client.delete('k1')
106
+ assert_nil @client['k1']
107
+ assert_equal false, @client.delete('k1')
108
+ end
109
+
110
+ def test_append_string
111
+ @client['k1'] = 'v'
112
+ assert @client.append('k1', '1')
113
+ assert_equal 'v1', @client['k1']
114
+ end
115
+
116
+ def test_prepend_string
117
+ @client['k1'] = 'v'
118
+ assert @client.prepend('k1', '1')
119
+ assert_equal '1v', @client['k1']
120
+ end
121
+ end
@@ -0,0 +1,121 @@
1
+ require 'test_helper'
2
+
3
+ class SpymemcachedPlainProtocolTest < Test::Unit::TestCase
4
+ def setup
5
+ @client = plain_client
6
+ @client.flush_all
7
+ end
8
+
9
+ def test_get_set
10
+ assert_equal nil, @client.get('key')
11
+ @client.set('key', 'value')
12
+ assert_equal 'value', @client.get('key')
13
+ assert_equal 'value', @client['key']
14
+
15
+ @client.set('key', nil)
16
+ assert_equal nil, @client.get('key')
17
+ @client['key'] = 'hello'
18
+ assert_equal 'hello', @client.get('key')
19
+
20
+ @client.set('key2', ['hello', 'world'])
21
+ assert_equal ['hello', 'world'], @client.get('key2')
22
+
23
+ @client.set('key2', Msg.new('hi'))
24
+ assert_equal Msg.new('hi'), @client.get('key2')
25
+ end
26
+
27
+ def test_get_set_large_string
28
+ str = 'value' * 10_000_000
29
+ @client.set(name, str)
30
+ assert_equal str, @client.get(name)
31
+ end
32
+
33
+ def test_add
34
+ assert @client.add('key', 'value')
35
+ assert_equal "value", @client.get('key')
36
+
37
+ assert !@client.add('key', 'another')
38
+ assert_equal "value", @client.get('key')
39
+ end
40
+
41
+ def test_incr_and_decr
42
+ @client.add('key', '0')
43
+ assert_equal 0, @client.incr('key', 0)
44
+ @client.incr('key')
45
+ assert_equal 1, @client.incr('key', 0)
46
+ @client.incr('key', 5)
47
+ assert_equal 6, @client.incr('key', 0)
48
+ assert_equal '6', @client.get('key')
49
+
50
+ @client.set('key', '6')
51
+ @client.decr('key')
52
+ assert_equal 5, @client.decr('key', 0)
53
+ @client.decr('key', 3)
54
+ assert_equal 2, @client.decr('key', 0)
55
+
56
+ @client.replace('key', '10')
57
+ assert_equal 11, @client.incr('key')
58
+
59
+ @client.cas('key') { '7' }
60
+ assert_equal 8, @client.incr('key')
61
+ end
62
+
63
+ def test_fetch
64
+ ret = @client.fetch('key') { 'value' }
65
+ assert_equal 'value', ret
66
+ ret = @client.fetch('key') { 'hello' }
67
+ assert_equal 'value', ret
68
+ end
69
+
70
+ def test_get_multi
71
+ @client.add('k1', 'v1')
72
+ @client.add('k2', Msg.new('v2'))
73
+ ret = @client.get_multi('k1', 'k2', 'k3')
74
+ assert_equal(2, ret.size)
75
+ assert_equal('v1', ret['k1'])
76
+ assert_equal(Msg.new('v2'), ret['k2'])
77
+ end
78
+
79
+ def test_cas
80
+ assert_nil(@client.cas('k1') { 'v0' })
81
+
82
+ assert @client.add('k1', 'v1')
83
+ assert(@client.cas('k1') { 'v2' })
84
+ assert_equal 'v2', @client.get('k1')
85
+
86
+ ret = @client.cas('k1') do
87
+ @client.set('k1', 'v4')
88
+ 'v3'
89
+ end
90
+ assert_equal(false, ret)
91
+ assert_equal('v4', @client.get('k1'))
92
+ end
93
+
94
+ def test_replace
95
+ assert_equal false, @client.replace('k1', 'v1')
96
+ assert_nil @client['k1']
97
+
98
+ @client['k1'] = 'v0'
99
+ assert @client.replace('k1', 'v1')
100
+ assert_equal 'v1', @client['k1']
101
+ end
102
+
103
+ def test_delete
104
+ @client['k1'] = 'v0'
105
+ assert @client.delete('k1')
106
+ assert_nil @client['k1']
107
+ assert_equal false, @client.delete('k1')
108
+ end
109
+
110
+ def test_append_string
111
+ @client['k1'] = 'v'
112
+ assert @client.append('k1', '1')
113
+ assert_equal 'v1', @client['k1']
114
+ end
115
+
116
+ def test_prepend_string
117
+ @client['k1'] = 'v'
118
+ assert @client.prepend('k1', '1')
119
+ assert_equal '1v', @client['k1']
120
+ end
121
+ end
@@ -0,0 +1,30 @@
1
+ require 'test_helper'
2
+
3
+ class SpymemcachedRails23Test < Test::Unit::TestCase
4
+ def setup
5
+ @client = binary_client.rails23
6
+ @client.flush_all
7
+ end
8
+
9
+ def test_api_compatible
10
+ assert_equal response::STORED, @client.add("key", 'value')
11
+ assert_equal 'value', @client.get('key')
12
+ assert_equal response::STORED, @client.set('key', 'value2')
13
+
14
+ assert_equal response::DELETED, @client.delete('key')
15
+ assert_equal response::NOT_FOUND, @client.delete('key2')
16
+
17
+ @client.set("key1", '0')
18
+ @client.set("key2", '1')
19
+ assert_equal({"key1" => '0', 'key2' => '1'}, @client.get_multi('key1', 'key2'))
20
+
21
+ assert_equal 1, @client.incr('key1')
22
+ assert_equal 0, @client.decr('key2')
23
+
24
+ assert @client.stats.values.first
25
+ end
26
+
27
+ def response
28
+ Spymemcached::Rails23::Response
29
+ end
30
+ end
@@ -0,0 +1,154 @@
1
+ require 'test_helper'
2
+
3
+ class SpymemcachedTest < Test::Unit::TestCase
4
+ def setup
5
+ @client = binary_client
6
+ @client.flush_all
7
+ end
8
+
9
+ def test_expiry
10
+ @client.add('add_key1', 'v1', 0)
11
+ @client.add('add_key2', 'v2', 1)
12
+
13
+ @client.set('set_key1', 'v1', 0)
14
+ @client.set('set_key2', 'v2', 1)
15
+
16
+ @client.fetch('fetch_key1', 0) { 'v1' }
17
+ @client.fetch('fetch_key2', 1) { 'v2' }
18
+
19
+ @client.add('cas_key1', 'v0')
20
+ @client.add('cas_key2', 'v0')
21
+ @client.cas('cas_key1', 0) { 'v1' }
22
+ @client.cas('cas_key2', 1) { 'v2' }
23
+
24
+ @client.add('replace_key1', 'v0')
25
+ @client.add('replace_key2', 'v0')
26
+ @client.replace('replace_key1', 'v1', 0)
27
+ @client.replace('replace_key2', 'v2', 1)
28
+
29
+ @client.add('touch_key1', 'v1', 1)
30
+
31
+ sleep 0.5
32
+ @client.touch('touch_key1')
33
+
34
+ sleep 0.7
35
+ assert_equal 'v1', @client['touch_key1']
36
+
37
+ assert_equal 'v1', @client.get('add_key1')
38
+ assert_nil @client.get('add_key2')
39
+
40
+ assert_equal 'v1', @client.get('set_key1')
41
+ assert_nil @client.get('set_key2')
42
+
43
+ assert_equal 'v1', @client.get('fetch_key1')
44
+ assert_nil @client.get('fetch_key2')
45
+
46
+ assert_equal 'v1', @client.get('cas_key1')
47
+ assert_nil @client.get('cas_key2')
48
+
49
+ assert_equal 'v1', @client.get('replace_key1')
50
+ assert_nil @client.get('replace_key2')
51
+ end
52
+
53
+ def test_timeout
54
+ @client = Spymemcached.new('localhost:11111', :timeout => 0.01)
55
+ assert_timeout = lambda do |action, *args|
56
+ start_at = Time.now
57
+ assert_raise Spymemcached::TimeoutError do
58
+ @client.send(action, *args) { 'v1' }
59
+ end
60
+ time = Time.now - start_at
61
+ assert time < 0.025, "Timeout is 0.01, actual time of action #{action} when timeout: #{time}"
62
+ end
63
+
64
+ assert_timeout[:flush_all]
65
+
66
+ assert_timeout[:get, 'key']
67
+ assert_timeout[:get_multi, 'key']
68
+ assert_timeout[:incr, 'key']
69
+ assert_timeout[:decr, 'key']
70
+ assert_timeout[:fetch, 'key']
71
+ assert_timeout[:delete, 'key']
72
+ assert_timeout[:touch, 'key']
73
+
74
+ assert_timeout[:add, 'key', 'value']
75
+ assert_timeout[:set, 'key', 'value']
76
+ assert_timeout[:replace, 'key', 'value']
77
+ assert_timeout[:append, 'key', 'value']
78
+ assert_timeout[:prepend, 'key', 'value']
79
+
80
+ assert_equal({}, @client.version)
81
+
82
+ stats = @client.stats
83
+ assert_equal(1, stats.size)
84
+ assert_equal([{}], stats.values)
85
+ end
86
+
87
+ def test_namespace
88
+ @ns_client = Spymemcached.new('localhost:11211', :namespace => 'ns')
89
+ assert_ns = lambda do |k, v|
90
+ assert_equal 'v1', @ns_client.get('key1')
91
+ assert_nil @client.get('key1')
92
+ assert_equal 'v1', @client.get('ns:key1')
93
+ end
94
+
95
+ @ns_client.set('key1', 'v1')
96
+ assert_ns.call('key1', 'v1')
97
+
98
+ @ns_client.add('key2', 'v2')
99
+ assert_ns.call('key2', 'v2')
100
+
101
+ assert_equal({'key1' => 'v1', 'key2' => 'v2'}, @ns_client.get_multi('key1', 'key2'))
102
+ assert_equal({}, @client.get_multi('key1', 'key2'))
103
+
104
+ @ns_client.add('key3', 'v0')
105
+ @ns_client.cas('key3') { 'v3' }
106
+ assert_equal 'v3', @ns_client['key3']
107
+ assert_nil @client['key3']
108
+ assert_equal 'v3', @client['ns:key3']
109
+
110
+ assert @ns_client.replace('key3', 'v4')
111
+ assert_equal 'v4', @ns_client['key3']
112
+ assert_nil @client['key3']
113
+ assert_equal 'v4', @client['ns:key3']
114
+
115
+ @client['key3'] = 'v3'
116
+ assert @ns_client.delete('key3')
117
+ assert_equal 'v3', @client['key3']
118
+ assert_nil @ns_client['key3']
119
+
120
+ @ns_client.append('key2', '4')
121
+ assert_equal 'v24', @ns_client.get('key2')
122
+
123
+ @ns_client.prepend('key2', '4')
124
+ assert_equal '4v24', @ns_client.get('key2')
125
+
126
+ @ns_client['key2'] = '1'
127
+ assert_equal 2, @ns_client.incr('key2')
128
+ assert_equal 1, @ns_client.decr('key2')
129
+
130
+ @ns_client.touch('key2', 1)
131
+ sleep 1.1
132
+ assert_nil @ns_client['key2']
133
+ end
134
+
135
+ def test_stats
136
+ stats = @client.stats
137
+ assert_equal(Hash, stats.class)
138
+ assert_equal(1, stats.size)
139
+ assert_match /localhost/, stats.keys.first
140
+ assert_match /\:11211/, stats.keys.first
141
+ assert_equal Hash, stats.values.first.class
142
+ assert stats.values.first.size > 5
143
+ assert_match @client.version.values.first, stats.values.first['version']
144
+ end
145
+
146
+ def test_version
147
+ v = @client.version
148
+ assert_equal(Hash, v.class)
149
+ assert_equal(1, v.size)
150
+ assert_match /localhost/, v.keys.first
151
+ assert_match /\:11211/, v.keys.first
152
+ assert_match /\d\.\d+\.\d+/, v.values.first
153
+ end
154
+ end
@@ -0,0 +1,19 @@
1
+ require 'test/unit'
2
+ require "spymemcached"
3
+
4
+ class Msg < Struct.new(:name)
5
+ end
6
+
7
+ class Test::Unit::TestCase
8
+ def plain_client
9
+ @@plain_client ||= spymemcached(:binary => false)
10
+ end
11
+
12
+ def binary_client
13
+ @@binary_client ||= spymemcached
14
+ end
15
+
16
+ def spymemcached(opts={})
17
+ Spymemcached.new('localhost:11211', opts)
18
+ end
19
+ end
metadata ADDED
@@ -0,0 +1,104 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: spymemcached.jruby
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: universal-java-1.7
6
+ authors:
7
+ - Xiao Li
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-10-27 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ version_requirements: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ requirement: !ruby/object:Gem::Requirement
21
+ requirements:
22
+ - - '>='
23
+ - !ruby/object:Gem::Version
24
+ version: '0'
25
+ prerelease: false
26
+ type: :development
27
+ - !ruby/object:Gem::Dependency
28
+ name: test-unit
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ requirement: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - '>='
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ prerelease: false
40
+ type: :development
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake-compiler
43
+ version_requirements: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '0.9'
48
+ - - '>='
49
+ - !ruby/object:Gem::Version
50
+ version: 0.9.2
51
+ requirement: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ~>
54
+ - !ruby/object:Gem::Version
55
+ version: '0.9'
56
+ - - '>='
57
+ - !ruby/object:Gem::Version
58
+ version: 0.9.2
59
+ prerelease: false
60
+ type: :development
61
+ description: |
62
+ A JRuby extension wrapping the latest spymemcached client (v2.11.4).
63
+ email:
64
+ - swing1979@gmail.com
65
+ executables: []
66
+ extensions: []
67
+ extra_rdoc_files: []
68
+ files:
69
+ - README.md
70
+ - lib/spymemcached-2.11.4.jar
71
+ - lib/spymemcached.rb
72
+ - lib/spymemcached_adapter.jar
73
+ - lib/spymemcached/rails23.rb
74
+ - test/memcache.rb
75
+ - test/spymemcached_binary_protocol_test.rb
76
+ - test/spymemcached_plain_protocol_test.rb
77
+ - test/spymemcached_rails23_test.rb
78
+ - test/spymemcached_test.rb
79
+ - test/test_helper.rb
80
+ homepage: https://github.com/xli/spymemcached.jruby
81
+ licenses:
82
+ - MIT
83
+ metadata: {}
84
+ post_install_message:
85
+ rdoc_options: []
86
+ require_paths:
87
+ - lib
88
+ required_ruby_version: !ruby/object:Gem::Requirement
89
+ requirements:
90
+ - - '>='
91
+ - !ruby/object:Gem::Version
92
+ version: '0'
93
+ required_rubygems_version: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - '>='
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ requirements: []
99
+ rubyforge_project:
100
+ rubygems_version: 2.1.9
101
+ signing_key:
102
+ specification_version: 4
103
+ summary: A JRuby extension wrapping the latest spymemcached client (v2.11.4).
104
+ test_files: []