couchbase 1.2.3 → 1.3.0
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/.yardopts +1 -1
- data/README.markdown +12 -8
- data/RELEASE_NOTES.markdown +19 -0
- data/couchbase.gemspec +1 -0
- data/examples/chat-goliath-grape/Gemfile +5 -0
- data/examples/chat-goliath-grape/README.markdown +50 -0
- data/examples/chat-goliath-grape/app.rb +67 -0
- data/examples/chat-goliath-grape/config/app.rb +20 -0
- data/examples/transcoders/Gemfile +3 -0
- data/examples/transcoders/README.markdown +59 -0
- data/examples/transcoders/cb-zcat +40 -0
- data/examples/transcoders/cb-zcp +45 -0
- data/examples/transcoders/gzip_transcoder.rb +49 -0
- data/examples/transcoders/options.rb +54 -0
- data/ext/couchbase_ext/arguments.c +67 -22
- data/ext/couchbase_ext/bucket.c +64 -20
- data/ext/couchbase_ext/context.c +2 -1
- data/ext/couchbase_ext/couchbase_ext.c +59 -9
- data/ext/couchbase_ext/couchbase_ext.h +18 -9
- data/ext/couchbase_ext/get.c +19 -23
- data/ext/couchbase_ext/store.c +1 -1
- data/ext/couchbase_ext/utils.c +38 -81
- data/lib/active_support/cache/couchbase_store.rb +60 -23
- data/lib/couchbase.rb +4 -2
- data/lib/couchbase/connection_pool.rb +55 -0
- data/lib/couchbase/transcoder.rb +120 -0
- data/lib/couchbase/version.rb +1 -1
- data/tasks/compile.rake +1 -1
- data/test/test_bucket.rb +1 -1
- data/test/test_couchbase_connection_pool.rb +73 -0
- data/test/test_couchbase_rails_cache_store.rb +36 -12
- data/test/test_format.rb +51 -1
- metadata +184 -127
- checksums.yaml +0 -15
data/lib/couchbase.rb
CHANGED
@@ -16,10 +16,9 @@
|
|
16
16
|
#
|
17
17
|
|
18
18
|
require 'couchbase/version'
|
19
|
-
require 'multi_json'
|
20
|
-
require 'ext/multi_json_fix'
|
21
19
|
require 'yaji'
|
22
20
|
require 'uri'
|
21
|
+
require 'couchbase/transcoder'
|
23
22
|
require 'couchbase_ext'
|
24
23
|
require 'couchbase/constants'
|
25
24
|
require 'couchbase/utils'
|
@@ -29,9 +28,12 @@ require 'couchbase/view'
|
|
29
28
|
require 'couchbase/result'
|
30
29
|
require 'couchbase/cluster'
|
31
30
|
|
31
|
+
|
32
32
|
# Couchbase ruby client
|
33
33
|
module Couchbase
|
34
34
|
|
35
|
+
autoload(:ConnectionPool, 'couchbase/connection_pool')
|
36
|
+
|
35
37
|
class << self
|
36
38
|
# The method +connect+ initializes new Bucket instance with all arguments passed.
|
37
39
|
#
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# Author:: Couchbase <info@couchbase.com>
|
2
|
+
# Copyright:: 2013 Couchbase, Inc.
|
3
|
+
# License:: Apache License, Version 2.0
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
#
|
17
|
+
|
18
|
+
require 'connection_pool'
|
19
|
+
|
20
|
+
module Couchbase
|
21
|
+
class ConnectionPool
|
22
|
+
|
23
|
+
def initialize(pool_size = 5, *args)
|
24
|
+
@pool = ::ConnectionPool.new(:size => pool_size) { ::Couchbase::Bucket.new(*args) }
|
25
|
+
end
|
26
|
+
|
27
|
+
def with
|
28
|
+
yield @pool.checkout
|
29
|
+
ensure
|
30
|
+
@pool.checkin
|
31
|
+
end
|
32
|
+
|
33
|
+
def respond_to?(id, *args)
|
34
|
+
super || @pool.with { |c| c.respond_to?(id, *args) }
|
35
|
+
end
|
36
|
+
|
37
|
+
def method_missing(name, *args, &block)
|
38
|
+
define_proxy_method(name)
|
39
|
+
send(name, *args, &block)
|
40
|
+
end
|
41
|
+
|
42
|
+
protected
|
43
|
+
|
44
|
+
def define_proxy_method(name)
|
45
|
+
self.class.class_eval <<-RUBY
|
46
|
+
def #{name}(*args, &block)
|
47
|
+
@pool.with do |connection|
|
48
|
+
connection.send(#{name.inspect}, *args, &block)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
RUBY
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,120 @@
|
|
1
|
+
# Author:: Couchbase <info@couchbase.com>
|
2
|
+
# Copyright:: 2013 Couchbase, Inc.
|
3
|
+
# License:: Apache License, Version 2.0
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
#
|
17
|
+
|
18
|
+
require 'multi_json'
|
19
|
+
require 'ext/multi_json_fix'
|
20
|
+
|
21
|
+
module Couchbase
|
22
|
+
|
23
|
+
module Transcoder
|
24
|
+
|
25
|
+
module Compat
|
26
|
+
def self.enable!
|
27
|
+
@disabled = false
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.disable!
|
31
|
+
@disabled = true
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.enabled?
|
35
|
+
!@disabled
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.guess_and_load(blob, flags, options = {})
|
39
|
+
case flags & Bucket::FMT_MASK
|
40
|
+
when Bucket::FMT_DOCUMENT
|
41
|
+
MultiJson.load(blob)
|
42
|
+
when Bucket::FMT_MARSHAL
|
43
|
+
::Marshal.load(blob)
|
44
|
+
when Bucket::FMT_PLAIN
|
45
|
+
blob
|
46
|
+
else
|
47
|
+
raise ArgumentError, "unexpected flags (0x%02x)" % flags
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
module Document
|
53
|
+
def self.dump(obj, flags, options = {})
|
54
|
+
[
|
55
|
+
MultiJson.dump(obj),
|
56
|
+
(flags & ~Bucket::FMT_MASK) | Bucket::FMT_DOCUMENT
|
57
|
+
]
|
58
|
+
end
|
59
|
+
|
60
|
+
def self.load(blob, flags, options = {})
|
61
|
+
if (flags & Bucket::FMT_MASK) == Bucket::FMT_DOCUMENT || options[:forced]
|
62
|
+
MultiJson.load(blob)
|
63
|
+
else
|
64
|
+
if Compat.enabled?
|
65
|
+
return Compat.guess_and_load(blob, flags, options)
|
66
|
+
else
|
67
|
+
raise ArgumentError,
|
68
|
+
"unexpected flags (0x%02x instead of 0x%02x)" % [flags, Bucket::FMT_DOCUMENT]
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
module Marshal
|
75
|
+
def self.dump(obj, flags, options = {})
|
76
|
+
[
|
77
|
+
::Marshal.dump(obj),
|
78
|
+
(flags & ~Bucket::FMT_MASK) | Bucket::FMT_MARSHAL
|
79
|
+
]
|
80
|
+
end
|
81
|
+
|
82
|
+
def self.load(blob, flags, options = {})
|
83
|
+
if (flags & Bucket::FMT_MASK) == Bucket::FMT_MARSHAL || options[:forced]
|
84
|
+
::Marshal.load(blob)
|
85
|
+
else
|
86
|
+
if Compat.enabled?
|
87
|
+
return Compat.guess_and_load(blob, flags, options)
|
88
|
+
else
|
89
|
+
raise ArgumentError,
|
90
|
+
"unexpected flags (0x%02x instead of 0x%02x)" % [flags, Bucket::FMT_MARSHAL]
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
module Plain
|
97
|
+
def self.dump(obj, flags, options = {})
|
98
|
+
[
|
99
|
+
obj,
|
100
|
+
(flags & ~Bucket::FMT_MASK) | Bucket::FMT_PLAIN
|
101
|
+
]
|
102
|
+
end
|
103
|
+
|
104
|
+
def self.load(blob, flags, options = {})
|
105
|
+
if (flags & Bucket::FMT_MASK) == Bucket::FMT_PLAIN || options[:forced]
|
106
|
+
blob
|
107
|
+
else
|
108
|
+
if Compat.enabled?
|
109
|
+
return Compat.guess_and_load(blob, flags, options)
|
110
|
+
else
|
111
|
+
raise ArgumentError,
|
112
|
+
"unexpected flags (0x%02x instead of 0x%02x)" % [flags, Bucket::FMT_PLAIN]
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
end
|
119
|
+
|
120
|
+
end
|
data/lib/couchbase/version.rb
CHANGED
data/tasks/compile.rake
CHANGED
@@ -84,7 +84,7 @@ namespace :ports do
|
|
84
84
|
directory "ports"
|
85
85
|
|
86
86
|
task :libcouchbase => ["ports"] do
|
87
|
-
recipe = MiniPortile.new "libcouchbase", "2.0.
|
87
|
+
recipe = MiniPortile.new "libcouchbase", "2.0.6"
|
88
88
|
recipe.files << "http://packages.couchbase.com/clients/c/libcouchbase-#{recipe.version}.tar.gz"
|
89
89
|
recipe.configure_options.push("--disable-debug",
|
90
90
|
"--disable-dependency-tracking",
|
data/test/test_bucket.rb
CHANGED
@@ -128,7 +128,7 @@ class TestBucket < MiniTest::Unit::TestCase
|
|
128
128
|
end
|
129
129
|
end
|
130
130
|
|
131
|
-
def
|
131
|
+
def test_it_unable_to_connect_to_protected_buckets_with_wrong_credentials
|
132
132
|
with_mock(:buckets_spec => 'protected:secret') do |mock|
|
133
133
|
assert_raises Couchbase::Error::Auth do
|
134
134
|
Couchbase.new(:hostname => mock.host,
|
@@ -0,0 +1,73 @@
|
|
1
|
+
# Author:: Couchbase <info@couchbase.com>
|
2
|
+
# Copyright:: 2013 Couchbase, Inc.
|
3
|
+
# License:: Apache License, Version 2.0
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
#
|
17
|
+
|
18
|
+
require File.join(File.dirname(__FILE__), 'setup')
|
19
|
+
require 'couchbase/connection_pool'
|
20
|
+
|
21
|
+
class TestCouchbaseConnectionPool < MiniTest::Unit::TestCase
|
22
|
+
|
23
|
+
def setup
|
24
|
+
@mock = start_mock
|
25
|
+
@pool = ::Couchbase::ConnectionPool.new(5, :hostname => @mock.host, :port => @mock.port)
|
26
|
+
end
|
27
|
+
|
28
|
+
def teardown
|
29
|
+
stop_mock(@mock)
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_basic_multithreaded_usage
|
33
|
+
@pool.set('foo', 'bar')
|
34
|
+
|
35
|
+
threads = []
|
36
|
+
15.times do
|
37
|
+
threads << Thread.new do
|
38
|
+
@pool.get('foo')
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
result = threads.map(&:value)
|
43
|
+
result.each do |val|
|
44
|
+
assert_equal 'bar', val
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_set_and_get
|
49
|
+
@pool.set('fiz', 'buzz')
|
50
|
+
assert_equal 'buzz', @pool.get('fiz')
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_set_and_delete
|
54
|
+
@pool.set('baz', 'bar')
|
55
|
+
@pool.delete('baz')
|
56
|
+
assert_raises Couchbase::Error::NotFound do
|
57
|
+
@pool.get('baz')
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def test_incr
|
62
|
+
@pool.set('counter', 0)
|
63
|
+
@pool.incr('counter', 1)
|
64
|
+
assert_equal 1, @pool.get('counter')
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_decr
|
68
|
+
@pool.set('counter', 1)
|
69
|
+
@pool.decr('counter', 1)
|
70
|
+
assert_equal 0, @pool.get('counter')
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
@@ -37,6 +37,12 @@ class TestCouchbaseRailsCacheStore < MiniTest::Unit::TestCase
|
|
37
37
|
:port => @mock.port)
|
38
38
|
end
|
39
39
|
|
40
|
+
def pool_store
|
41
|
+
@pool_store ||= ActiveSupport::Cache::CouchbaseStore.new(:hostname => @mock.host,
|
42
|
+
:port => @mock.port,
|
43
|
+
:connection_pool => 5)
|
44
|
+
end
|
45
|
+
|
40
46
|
def test_it_supported_methods
|
41
47
|
supported_methods = store.public_methods(false).map(&:to_sym)
|
42
48
|
assert supported_methods.include?(:fetch)
|
@@ -78,18 +84,17 @@ class TestCouchbaseRailsCacheStore < MiniTest::Unit::TestCase
|
|
78
84
|
end
|
79
85
|
end
|
80
86
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
end
|
87
|
+
def test_it_reads_raw_data
|
88
|
+
store.write uniq_id, @foo
|
89
|
+
expected = case RUBY_VERSION
|
90
|
+
when /^2\.0/
|
91
|
+
"\x04\bU:\x0FOpenStruct{\x06:\fpayloadI\"\bfoo\x06:\x06ET"
|
92
|
+
when /^1\.9/
|
93
|
+
"\x04\bU:\x0FOpenStruct{\x06:\fpayloadI\"\bfoo\x06:\x06EF"
|
94
|
+
else
|
95
|
+
"\004\bU:\017OpenStruct{\006:\fpayload\"\bfoo"
|
96
|
+
end
|
97
|
+
assert_equal expected, store.read(uniq_id, :raw => true)
|
93
98
|
end
|
94
99
|
|
95
100
|
def test_it_writes_raw_data
|
@@ -303,6 +308,25 @@ class TestCouchbaseRailsCacheStore < MiniTest::Unit::TestCase
|
|
303
308
|
workers.each { |w| w.join }
|
304
309
|
end
|
305
310
|
|
311
|
+
def test_it_can_use_connection_pool_for_thread_safety
|
312
|
+
workers = []
|
313
|
+
|
314
|
+
10.times do
|
315
|
+
workers << Thread.new do
|
316
|
+
100.times do
|
317
|
+
pool_store.write('a', 9)
|
318
|
+
pool_store.write('b', 11)
|
319
|
+
assert_equal 9, pool_store.read('a')
|
320
|
+
assert_equal({ 'a' => 9, 'b' => 11 }, pool_store.read_multi('a', 'b'))
|
321
|
+
assert_equal 11, pool_store.read('b')
|
322
|
+
assert_equal %w(a b), pool_store.read_multi('a', 'b', 'c').keys.sort
|
323
|
+
end
|
324
|
+
end
|
325
|
+
end
|
326
|
+
|
327
|
+
workers.each { |w| w.join }
|
328
|
+
end
|
329
|
+
|
306
330
|
private
|
307
331
|
|
308
332
|
def collect_notifications
|
data/test/test_format.rb
CHANGED
@@ -78,7 +78,7 @@ class TestFormat < MiniTest::Unit::TestCase
|
|
78
78
|
connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port)
|
79
79
|
connection.set(uniq_id, orig_doc, :format => :marshal)
|
80
80
|
doc, flags, cas = connection.get(uniq_id, :extended => true)
|
81
|
-
assert_equal
|
81
|
+
assert_equal Couchbase::Bucket::FMT_MARSHAL, flags & Couchbase::Bucket::FMT_MASK
|
82
82
|
assert doc.is_a?(ArbitraryClass)
|
83
83
|
assert_equal 'Twoflower', doc.name
|
84
84
|
assert_equal 'The tourist', doc.role
|
@@ -106,4 +106,54 @@ class TestFormat < MiniTest::Unit::TestCase
|
|
106
106
|
end
|
107
107
|
end
|
108
108
|
|
109
|
+
def test_it_allows_to_turn_off_transcoder
|
110
|
+
connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port, :transcoder => nil)
|
111
|
+
connection.set(uniq_id, "value", :flags => 0xffff_ffff)
|
112
|
+
doc, flags, _ = connection.get(uniq_id, :extended => true)
|
113
|
+
assert_equal "value", doc
|
114
|
+
assert_equal 0xffff_ffff, flags
|
115
|
+
end
|
116
|
+
|
117
|
+
require 'zlib'
|
118
|
+
# This class wraps any other transcoder and performs compression
|
119
|
+
# using zlib
|
120
|
+
class ZlibTranscoder
|
121
|
+
FMT_ZLIB = 0x04
|
122
|
+
|
123
|
+
def initialize(base)
|
124
|
+
@base = base
|
125
|
+
end
|
126
|
+
|
127
|
+
def dump(obj, flags, options = {})
|
128
|
+
obj, flags = @base.dump(obj, flags, options)
|
129
|
+
z = Zlib::Deflate.new(Zlib::BEST_SPEED)
|
130
|
+
buffer = z.deflate(obj, Zlib::FINISH)
|
131
|
+
z.close
|
132
|
+
[buffer, flags|FMT_ZLIB]
|
133
|
+
end
|
134
|
+
|
135
|
+
def load(blob, flags, options = {})
|
136
|
+
# decompress value only if Zlib flag set
|
137
|
+
if (flags & FMT_ZLIB) == FMT_ZLIB
|
138
|
+
z = Zlib::Inflate.new
|
139
|
+
blob = z.inflate(blob)
|
140
|
+
z.finish
|
141
|
+
z.close
|
142
|
+
end
|
143
|
+
@base.load(blob, flags, options)
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
def test_it_can_use_custom_transcoder
|
148
|
+
connection = Couchbase.new(:hostname => @mock.host, :port => @mock.port)
|
149
|
+
connection.transcoder = ZlibTranscoder.new(Couchbase::Transcoder::Document)
|
150
|
+
connection.set(uniq_id, {"foo" => "bar"})
|
151
|
+
doc, flags, _ = connection.get(uniq_id, :extended => true)
|
152
|
+
assert_equal({"foo" => "bar"}, doc)
|
153
|
+
assert_equal(ZlibTranscoder::FMT_ZLIB|Couchbase::Bucket::FMT_DOCUMENT, flags)
|
154
|
+
connection.transcoder = nil
|
155
|
+
doc = connection.get(uniq_id)
|
156
|
+
assert_equal "x\x01\xABVJ\xCB\xCFW\xB2RJJ,R\xAA\x05\0\x1Dz\x044", doc
|
157
|
+
end
|
158
|
+
|
109
159
|
end
|
metadata
CHANGED
@@ -1,148 +1,181 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: couchbase
|
3
|
-
version: !ruby/object:Gem::Version
|
4
|
-
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 27
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 1
|
8
|
+
- 3
|
9
|
+
- 0
|
10
|
+
version: 1.3.0
|
5
11
|
platform: ruby
|
6
|
-
authors:
|
12
|
+
authors:
|
7
13
|
- Couchbase
|
8
14
|
autorequire:
|
9
15
|
bindir: bin
|
10
16
|
cert_chain: []
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
+
|
18
|
+
date: 2013-05-08 00:00:00 +03:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
type: :runtime
|
23
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
+
none: false
|
25
|
+
requirements:
|
17
26
|
- - ~>
|
18
|
-
- !ruby/object:Gem::Version
|
27
|
+
- !ruby/object:Gem::Version
|
28
|
+
hash: 23
|
29
|
+
segments:
|
30
|
+
- 0
|
31
|
+
- 3
|
32
|
+
- 2
|
19
33
|
version: 0.3.2
|
20
|
-
|
34
|
+
name: yaji
|
35
|
+
version_requirements: *id001
|
21
36
|
prerelease: false
|
22
|
-
|
23
|
-
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
type: :runtime
|
39
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
24
42
|
- - ~>
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
|
27
|
-
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
hash: 15
|
45
|
+
segments:
|
46
|
+
- 1
|
47
|
+
- 0
|
48
|
+
version: "1.0"
|
28
49
|
name: multi_json
|
29
|
-
|
30
|
-
requirements:
|
31
|
-
- - ~>
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '1.0'
|
34
|
-
type: :runtime
|
50
|
+
version_requirements: *id002
|
35
51
|
prerelease: false
|
36
|
-
|
37
|
-
|
52
|
+
- !ruby/object:Gem::Dependency
|
53
|
+
type: :runtime
|
54
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
55
|
+
none: false
|
56
|
+
requirements:
|
38
57
|
- - ~>
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
type: :development
|
58
|
+
- !ruby/object:Gem::Version
|
59
|
+
hash: 63
|
60
|
+
segments:
|
61
|
+
- 0
|
62
|
+
- 9
|
63
|
+
- 2
|
64
|
+
version: 0.9.2
|
65
|
+
name: connection_pool
|
66
|
+
version_requirements: *id003
|
49
67
|
prerelease: false
|
50
|
-
|
51
|
-
requirements:
|
52
|
-
- - ! '>='
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '0'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: minitest
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - ! '>='
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '0'
|
68
|
+
- !ruby/object:Gem::Dependency
|
62
69
|
type: :development
|
70
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
71
|
+
none: false
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
hash: 3
|
76
|
+
segments:
|
77
|
+
- 0
|
78
|
+
version: "0"
|
79
|
+
name: rake
|
80
|
+
version_requirements: *id004
|
63
81
|
prerelease: false
|
64
|
-
|
65
|
-
requirements:
|
66
|
-
- - ! '>='
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '0'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: rake-compiler
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - ! '>='
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: 0.7.5
|
82
|
+
- !ruby/object:Gem::Dependency
|
76
83
|
type: :development
|
84
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
85
|
+
none: false
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
hash: 3
|
90
|
+
segments:
|
91
|
+
- 0
|
92
|
+
version: "0"
|
93
|
+
name: minitest
|
94
|
+
version_requirements: *id005
|
77
95
|
prerelease: false
|
78
|
-
|
79
|
-
requirements:
|
80
|
-
- - ! '>='
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: 0.7.5
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: mini_portile
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - ! '>='
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '0'
|
96
|
+
- !ruby/object:Gem::Dependency
|
90
97
|
type: :development
|
98
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
99
|
+
none: false
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
hash: 9
|
104
|
+
segments:
|
105
|
+
- 0
|
106
|
+
- 7
|
107
|
+
- 5
|
108
|
+
version: 0.7.5
|
109
|
+
name: rake-compiler
|
110
|
+
version_requirements: *id006
|
91
111
|
prerelease: false
|
92
|
-
|
93
|
-
requirements:
|
94
|
-
- - ! '>='
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '0'
|
97
|
-
- !ruby/object:Gem::Dependency
|
98
|
-
name: yajl-ruby
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
100
|
-
requirements:
|
101
|
-
- - ~>
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: 1.1.0
|
112
|
+
- !ruby/object:Gem::Dependency
|
104
113
|
type: :development
|
114
|
+
requirement: &id007 !ruby/object:Gem::Requirement
|
115
|
+
none: false
|
116
|
+
requirements:
|
117
|
+
- - ">="
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
hash: 3
|
120
|
+
segments:
|
121
|
+
- 0
|
122
|
+
version: "0"
|
123
|
+
name: mini_portile
|
124
|
+
version_requirements: *id007
|
105
125
|
prerelease: false
|
106
|
-
|
107
|
-
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
type: :development
|
128
|
+
requirement: &id008 !ruby/object:Gem::Requirement
|
129
|
+
none: false
|
130
|
+
requirements:
|
108
131
|
- - ~>
|
109
|
-
- !ruby/object:Gem::Version
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
hash: 19
|
134
|
+
segments:
|
135
|
+
- 1
|
136
|
+
- 1
|
137
|
+
- 0
|
110
138
|
version: 1.1.0
|
111
|
-
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
- - ! '>='
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
version: '0'
|
139
|
+
name: yajl-ruby
|
140
|
+
version_requirements: *id008
|
141
|
+
prerelease: false
|
142
|
+
- !ruby/object:Gem::Dependency
|
118
143
|
type: :development
|
144
|
+
requirement: &id009 !ruby/object:Gem::Requirement
|
145
|
+
none: false
|
146
|
+
requirements:
|
147
|
+
- - ">="
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
hash: 3
|
150
|
+
segments:
|
151
|
+
- 0
|
152
|
+
version: "0"
|
153
|
+
name: active_support
|
154
|
+
version_requirements: *id009
|
119
155
|
prerelease: false
|
120
|
-
|
121
|
-
requirements:
|
122
|
-
- - ! '>='
|
123
|
-
- !ruby/object:Gem::Version
|
124
|
-
version: '0'
|
125
|
-
- !ruby/object:Gem::Dependency
|
126
|
-
name: eventmachine
|
127
|
-
requirement: !ruby/object:Gem::Requirement
|
128
|
-
requirements:
|
129
|
-
- - ! '>='
|
130
|
-
- !ruby/object:Gem::Version
|
131
|
-
version: '0'
|
156
|
+
- !ruby/object:Gem::Dependency
|
132
157
|
type: :development
|
158
|
+
requirement: &id010 !ruby/object:Gem::Requirement
|
159
|
+
none: false
|
160
|
+
requirements:
|
161
|
+
- - ">="
|
162
|
+
- !ruby/object:Gem::Version
|
163
|
+
hash: 3
|
164
|
+
segments:
|
165
|
+
- 0
|
166
|
+
version: "0"
|
167
|
+
name: eventmachine
|
168
|
+
version_requirements: *id010
|
133
169
|
prerelease: false
|
134
|
-
version_requirements: !ruby/object:Gem::Requirement
|
135
|
-
requirements:
|
136
|
-
- - ! '>='
|
137
|
-
- !ruby/object:Gem::Version
|
138
|
-
version: '0'
|
139
170
|
description: The official client library for use with Couchbase Server.
|
140
171
|
email: support@couchbase.com
|
141
172
|
executables: []
|
142
|
-
|
173
|
+
|
174
|
+
extensions:
|
143
175
|
- ext/couchbase_ext/extconf.rb
|
144
176
|
extra_rdoc_files: []
|
145
|
-
|
177
|
+
|
178
|
+
files:
|
146
179
|
- .gitignore
|
147
180
|
- .travis.yml
|
148
181
|
- .yardopts
|
@@ -157,6 +190,16 @@ files:
|
|
157
190
|
- examples/chat-em/Gemfile
|
158
191
|
- examples/chat-em/README.markdown
|
159
192
|
- examples/chat-em/server.rb
|
193
|
+
- examples/chat-goliath-grape/Gemfile
|
194
|
+
- examples/chat-goliath-grape/README.markdown
|
195
|
+
- examples/chat-goliath-grape/app.rb
|
196
|
+
- examples/chat-goliath-grape/config/app.rb
|
197
|
+
- examples/transcoders/Gemfile
|
198
|
+
- examples/transcoders/README.markdown
|
199
|
+
- examples/transcoders/cb-zcat
|
200
|
+
- examples/transcoders/cb-zcp
|
201
|
+
- examples/transcoders/gzip_transcoder.rb
|
202
|
+
- examples/transcoders/options.rb
|
160
203
|
- ext/couchbase_ext/.gitignore
|
161
204
|
- ext/couchbase_ext/arguments.c
|
162
205
|
- ext/couchbase_ext/arithmetic.c
|
@@ -186,8 +229,10 @@ files:
|
|
186
229
|
- lib/couchbase.rb
|
187
230
|
- lib/couchbase/bucket.rb
|
188
231
|
- lib/couchbase/cluster.rb
|
232
|
+
- lib/couchbase/connection_pool.rb
|
189
233
|
- lib/couchbase/constants.rb
|
190
234
|
- lib/couchbase/result.rb
|
235
|
+
- lib/couchbase/transcoder.rb
|
191
236
|
- lib/couchbase/utils.rb
|
192
237
|
- lib/couchbase/version.rb
|
193
238
|
- lib/couchbase/view.rb
|
@@ -207,6 +252,7 @@ files:
|
|
207
252
|
- test/test_bucket.rb
|
208
253
|
- test/test_cas.rb
|
209
254
|
- test/test_couchbase.rb
|
255
|
+
- test/test_couchbase_connection_pool.rb
|
210
256
|
- test/test_couchbase_rails_cache_store.rb
|
211
257
|
- test/test_delete.rb
|
212
258
|
- test/test_errors.rb
|
@@ -220,28 +266,39 @@ files:
|
|
220
266
|
- test/test_unlock.rb
|
221
267
|
- test/test_utils.rb
|
222
268
|
- test/test_version.rb
|
269
|
+
has_rdoc: true
|
223
270
|
homepage: http://couchbase.org
|
224
|
-
licenses:
|
271
|
+
licenses:
|
225
272
|
- ASL-2
|
226
|
-
metadata: {}
|
227
273
|
post_install_message:
|
228
274
|
rdoc_options: []
|
229
|
-
|
275
|
+
|
276
|
+
require_paths:
|
230
277
|
- lib
|
231
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
278
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
279
|
+
none: false
|
280
|
+
requirements:
|
281
|
+
- - ">="
|
282
|
+
- !ruby/object:Gem::Version
|
283
|
+
hash: 3
|
284
|
+
segments:
|
285
|
+
- 0
|
286
|
+
version: "0"
|
287
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
288
|
+
none: false
|
289
|
+
requirements:
|
290
|
+
- - ">="
|
291
|
+
- !ruby/object:Gem::Version
|
292
|
+
hash: 3
|
293
|
+
segments:
|
294
|
+
- 0
|
295
|
+
version: "0"
|
241
296
|
requirements: []
|
297
|
+
|
242
298
|
rubyforge_project:
|
243
|
-
rubygems_version:
|
299
|
+
rubygems_version: 1.6.2
|
244
300
|
signing_key:
|
245
|
-
specification_version:
|
301
|
+
specification_version: 3
|
246
302
|
summary: Couchbase ruby driver
|
247
303
|
test_files: []
|
304
|
+
|