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.
@@ -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
+