couchbase 1.2.3 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
@@ -17,5 +17,5 @@
17
17
 
18
18
  # Couchbase ruby client
19
19
  module Couchbase
20
- VERSION = "1.2.3"
20
+ VERSION = "1.3.0"
21
21
  end
@@ -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.3"
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",
@@ -128,7 +128,7 @@ class TestBucket < MiniTest::Unit::TestCase
128
128
  end
129
129
  end
130
130
 
131
- def test_it_unable_to_connect_to_protected_buckets_with_wrond_credentials
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
- if RUBY_VERSION.match /1\.9/
82
- def test_it_reads_raw_data
83
- store.write uniq_id, @foo
84
- assert_equal "\x04\bU:\x0FOpenStruct{\x06:\fpayloadI\"\bfoo\x06:\x06EF",
85
- store.read(uniq_id, :raw => true)
86
- end
87
- else
88
- def test_it_reads_raw_data
89
- store.write uniq_id, @foo
90
- assert_equal "\004\bU:\017OpenStruct{\006:\fpayload\"\bfoo",
91
- store.read(uniq_id, :raw => true)
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
@@ -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 0x01, flags & 0x11
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
- version: 1.2.3
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
- date: 2013-04-02 00:00:00.000000000 Z
12
- dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: yaji
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
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
- type: :runtime
34
+ name: yaji
35
+ version_requirements: *id001
21
36
  prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
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
- version: 0.3.2
27
- - !ruby/object:Gem::Dependency
43
+ - !ruby/object:Gem::Version
44
+ hash: 15
45
+ segments:
46
+ - 1
47
+ - 0
48
+ version: "1.0"
28
49
  name: multi_json
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ~>
32
- - !ruby/object:Gem::Version
33
- version: '1.0'
34
- type: :runtime
50
+ version_requirements: *id002
35
51
  prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
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
- version: '1.0'
41
- - !ruby/object:Gem::Dependency
42
- name: rake
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - ! '>='
46
- - !ruby/object:Gem::Version
47
- version: '0'
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
- version_requirements: !ruby/object:Gem::Requirement
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
- version_requirements: !ruby/object:Gem::Requirement
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
- version_requirements: !ruby/object:Gem::Requirement
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
- version_requirements: !ruby/object:Gem::Requirement
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
- version_requirements: !ruby/object:Gem::Requirement
107
- requirements:
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
- - !ruby/object:Gem::Dependency
112
- name: active_support
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
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
- version_requirements: !ruby/object:Gem::Requirement
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
- extensions:
173
+
174
+ extensions:
143
175
  - ext/couchbase_ext/extconf.rb
144
176
  extra_rdoc_files: []
145
- files:
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
- require_paths:
275
+
276
+ require_paths:
230
277
  - lib
231
- required_ruby_version: !ruby/object:Gem::Requirement
232
- requirements:
233
- - - ! '>='
234
- - !ruby/object:Gem::Version
235
- version: '0'
236
- required_rubygems_version: !ruby/object:Gem::Requirement
237
- requirements:
238
- - - ! '>='
239
- - !ruby/object:Gem::Version
240
- version: '0'
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: 2.0.3
299
+ rubygems_version: 1.6.2
244
300
  signing_key:
245
- specification_version: 4
301
+ specification_version: 3
246
302
  summary: Couchbase ruby driver
247
303
  test_files: []
304
+