couchbase-orm 1.1.0 → 1.1.1
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 +5 -5
- data/.travis.yml +2 -2
- data/lib/couchbase-orm/persistence.rb +14 -6
- data/lib/couchbase-orm/utilities/index.rb +19 -2
- data/lib/couchbase-orm/version.rb +1 -1
- data/spec/index_spec.rb +43 -0
- data/spec/views_spec.rb +2 -2
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 8d5a44e4dcc24a7d2e0d4dfdac8ea6cf2657cbf8cd2edf6499ab8ac002b82192
|
4
|
+
data.tar.gz: ff4554e430770fc9d69f83247e6089ed8ec2874afd2f5cc3543bd21ef7c9ae5c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 50bf631a6df22796e99a6fc7a6d1c49b1a00dd19fbbab58e4035286b2388fb597168b2cdbfd335f8a6f89028526ac7f47c005d30d49aac19064b6d7bd67d87b4
|
7
|
+
data.tar.gz: 1b2c61ce24033f54779fa56e5ef51e3c12a9f8c3e603fa8b00c4b7837db5289d032a2041b4e72d45dc032383fe6d8d710c822a1814bac75ad3be03269c36dc87
|
data/.travis.yml
CHANGED
@@ -14,8 +14,8 @@ before_install:
|
|
14
14
|
- git submodule update --init --recursive
|
15
15
|
- gem install ffi
|
16
16
|
- sudo apt-get install libev-dev python-httplib2
|
17
|
-
- sudo wget https://packages.couchbase.com/releases/5.
|
18
|
-
- sudo dpkg -i couchbase-server-enterprise_5.
|
17
|
+
- sudo wget https://packages.couchbase.com/releases/5.1.0/couchbase-server-enterprise_5.1.0-ubuntu14.04_amd64.deb
|
18
|
+
- sudo dpkg -i couchbase-server-enterprise_5.1.0-ubuntu14.04_amd64.deb
|
19
19
|
- sleep 8
|
20
20
|
- sudo service couchbase-server status
|
21
21
|
- /opt/couchbase/bin/couchbase-cli cluster-init -c 127.0.0.1:8091 --cluster-username=admin --cluster-password=password --cluster-ramsize=320 --cluster-index-ramsize=256 --cluster-fts-ramsize=256 --services=data,index,query,fts
|
@@ -165,14 +165,22 @@ module CouchbaseOrm
|
|
165
165
|
|
166
166
|
assign_attributes(hash)
|
167
167
|
|
168
|
-
|
169
|
-
@__attributes__[:type] = self.class.design_document
|
170
|
-
@__attributes__.delete(:id)
|
171
|
-
|
172
|
-
options = {}
|
168
|
+
options = {extended: true}
|
173
169
|
options[:cas] = @__metadata__.cas if with_cas
|
174
170
|
|
175
|
-
|
171
|
+
# There is a limit of 16 subdoc operations per request
|
172
|
+
resp = if hash.length <= 16
|
173
|
+
subdoc = self.class.bucket.subdoc(_id)
|
174
|
+
hash.each do |key, value|
|
175
|
+
subdoc.dict_upsert(key, value)
|
176
|
+
end
|
177
|
+
subdoc.execute!(options)
|
178
|
+
else
|
179
|
+
# Fallback to writing the whole document
|
180
|
+
@__attributes__[:type] = self.class.design_document
|
181
|
+
@__attributes__.delete(:id)
|
182
|
+
self.class.bucket.replace(_id, @__attributes__, **options)
|
183
|
+
end
|
176
184
|
|
177
185
|
# Ensure the model is up to date
|
178
186
|
@__metadata__.key = resp.key
|
@@ -98,7 +98,17 @@ module CouchbaseOrm
|
|
98
98
|
# new one. the id of the current record is used as the key's value.
|
99
99
|
after_save do |record|
|
100
100
|
original_key = instance_variable_get(original_bucket_key_var)
|
101
|
-
|
101
|
+
|
102
|
+
if original_key
|
103
|
+
check_ref_id = record.class.bucket.get(original_key, extended: true, quiet: true)
|
104
|
+
if check_ref_id && check_ref_id.value == record.id
|
105
|
+
begin
|
106
|
+
record.class.bucket.delete(original_key, cas: check_ref_id.cas)
|
107
|
+
rescue ::Libcouchbase::Error::KeyExists
|
108
|
+
# Errors here can be ignored. Just means the key was updated elswhere
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
102
112
|
|
103
113
|
unless presence == false && attrs.length == 1 && record[attrs[0]].nil?
|
104
114
|
record.class.bucket.set(record.send(bucket_key_method), record.id, plain: true)
|
@@ -109,7 +119,14 @@ module CouchbaseOrm
|
|
109
119
|
# cleanup by removing the bucket key before the record is deleted
|
110
120
|
# TODO: handle unpersisted, modified component values
|
111
121
|
before_destroy do |record|
|
112
|
-
record.class.bucket.
|
122
|
+
check_ref_id = record.class.bucket.get(record.send(bucket_key_method), extended: true, quiet: true)
|
123
|
+
if check_ref_id && check_ref_id.value == record.id
|
124
|
+
begin
|
125
|
+
record.class.bucket.delete(record.send(bucket_key_method), cas: check_ref_id.cas)
|
126
|
+
rescue ::Libcouchbase::Error::KeyExists
|
127
|
+
# Errors here can be ignored. Just means the key was updated elswhere
|
128
|
+
end
|
129
|
+
end
|
113
130
|
true
|
114
131
|
end
|
115
132
|
|
data/spec/index_spec.rb
CHANGED
@@ -9,6 +9,13 @@ class IndexTest < CouchbaseOrm::Base
|
|
9
9
|
ensure_unique :email, presence: false
|
10
10
|
end
|
11
11
|
|
12
|
+
class NoUniqueIndexTest < CouchbaseOrm::Base
|
13
|
+
attribute :email, type: String
|
14
|
+
attribute :name, type: String, default: :joe
|
15
|
+
|
16
|
+
index :email, presence: false
|
17
|
+
end
|
18
|
+
|
12
19
|
class EnumTest < CouchbaseOrm::Base
|
13
20
|
enum visibility: [:group, :authority, :public], default: :authority
|
14
21
|
end
|
@@ -92,4 +99,40 @@ describe CouchbaseOrm::Index do
|
|
92
99
|
expect(enum.visibility).to eq(2)
|
93
100
|
enum.destroy
|
94
101
|
end
|
102
|
+
|
103
|
+
it "should not overwrite index's that do not belong to the current model" do
|
104
|
+
joe = NoUniqueIndexTest.create!
|
105
|
+
expect(NoUniqueIndexTest.find_by_email(nil)).to eq(nil)
|
106
|
+
|
107
|
+
joe.email = 'joe@aca.com'
|
108
|
+
joe.save!
|
109
|
+
expect(NoUniqueIndexTest.find_by_email('joe@aca.com')).to eq(joe)
|
110
|
+
|
111
|
+
joe2 = NoUniqueIndexTest.create!
|
112
|
+
joe2.email = 'joe@aca.com' # joe here is deliberate
|
113
|
+
joe2.save!
|
114
|
+
|
115
|
+
expect(NoUniqueIndexTest.find_by_email('joe@aca.com')).to eq(joe2)
|
116
|
+
|
117
|
+
# Joe's indexing should not remove joe2 index
|
118
|
+
joe.email = nil
|
119
|
+
joe.save!
|
120
|
+
expect(NoUniqueIndexTest.find_by_email('joe@aca.com')).to eq(joe2)
|
121
|
+
|
122
|
+
# Test destroy
|
123
|
+
joe.email = 'joe@aca.com'
|
124
|
+
joe.save!
|
125
|
+
expect(NoUniqueIndexTest.find_by_email('joe@aca.com')).to eq(joe)
|
126
|
+
|
127
|
+
# Index should not be updated
|
128
|
+
joe2.destroy
|
129
|
+
expect(NoUniqueIndexTest.find_by_email('joe@aca.com')).to eq(joe)
|
130
|
+
|
131
|
+
# index should be updated
|
132
|
+
joe.email = nil
|
133
|
+
joe.save!
|
134
|
+
expect(NoUniqueIndexTest.find_by_email('joe@aca.com')).to eq(nil)
|
135
|
+
|
136
|
+
joe.destroy
|
137
|
+
end
|
95
138
|
end
|
data/spec/views_spec.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true, encoding: ASCII-8BIT
|
2
2
|
|
3
3
|
require File.expand_path("../support", __FILE__)
|
4
|
-
|
4
|
+
require 'set'
|
5
5
|
|
6
6
|
class ViewTest < CouchbaseOrm::Base
|
7
7
|
attribute :name, type: String
|
@@ -68,6 +68,6 @@ describe CouchbaseOrm::Views do
|
|
68
68
|
ob.destroy
|
69
69
|
}
|
70
70
|
|
71
|
-
expect(docs).to eq(['bob', 'jane'])
|
71
|
+
expect(Set.new(docs)).to eq(Set.new(['bob', 'jane']))
|
72
72
|
end
|
73
73
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: couchbase-orm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
4
|
+
version: 1.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stephen von Takach
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-10-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: libcouchbase
|
@@ -175,7 +175,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
175
175
|
version: '0'
|
176
176
|
requirements: []
|
177
177
|
rubyforge_project:
|
178
|
-
rubygems_version: 2.
|
178
|
+
rubygems_version: 2.7.7
|
179
179
|
signing_key:
|
180
180
|
specification_version: 4
|
181
181
|
summary: Couchbase ORM for Rails
|