spymemcached.jruby 1.0.0-universal-java-1.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.
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: []