couchpillow 0.4.2 → 0.4.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.markdown +13 -11
- data/lib/couchpillow/attribute.rb +23 -15
- data/lib/couchpillow/attributive.rb +3 -1
- data/lib/couchpillow/document.rb +22 -2
- data/lib/couchpillow/version.rb +1 -1
- data/test/helper.rb +1 -1
- data/test/test_document.rb +70 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8766ff55f2a06b3e6a73581eb02a5add86407868
|
4
|
+
data.tar.gz: e4b22c670eefa9f68deb5f4bf5de5db8dfa03613
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d8fd8cec7c43b888807d46a1faac51ed83087b1d7a2af8a85ebff8ec517b8937a8b26bf8cb76bc06213eec4c711d4f51de41190b7c4abde78c7c21acce6cd166
|
7
|
+
data.tar.gz: c793792ad45b53674963350e3b740d0b3310e1a10a5b8379a387cee46692c9d1e21d79625e1c44ef13054c9071c9bf485fb218d050a641bc46928d4393bd344d
|
data/README.markdown
CHANGED
@@ -2,11 +2,8 @@
|
|
2
2
|
|
3
3
|
Light and comfortable Document integrity tool for Couchbase Server.
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
CouchPillow is an integrity tool for Couchbase Documents to make sure that all
|
9
|
-
current and existing documents can work nicely with the current code.
|
5
|
+
CouchPillow is a document integrity tool for Couchbase Documents to make sure
|
6
|
+
that all current and existing documents can work nicely with the current code.
|
10
7
|
|
11
8
|
CouchPillow separates itself from the database drivers, making it light and
|
12
9
|
independent from the implementation. Although it is initially designed to work
|
@@ -40,7 +37,7 @@ long as they `respond_to?` the `set`, `delete`, `replace`, and `get` methods.
|
|
40
37
|
doc.save!
|
41
38
|
|
42
39
|
# {
|
43
|
-
# '_id': '
|
40
|
+
# '_id': 'my_document::fb579b265cc005c47ff420a5c2a15d2b',
|
44
41
|
# '_type': 'my_document',
|
45
42
|
# 'stuff': 'hello',
|
46
43
|
# '_created_at': '2014-07-04 00:00:00 UTC'
|
@@ -50,10 +47,10 @@ long as they `respond_to?` the `set`, `delete`, `replace`, and `get` methods.
|
|
50
47
|
|
51
48
|
Retrieving Documents:
|
52
49
|
|
53
|
-
doc = MyDocument.get('
|
50
|
+
doc = MyDocument.get('my_document::fb579b265cc005c47ff420a5c2a15d2b')
|
54
51
|
doc.stuff # 'hello'
|
55
52
|
|
56
|
-
Specifying custom id:
|
53
|
+
Specifying custom id if the auto-generated id is too confusing:
|
57
54
|
|
58
55
|
class User < CouchPillow::Document
|
59
56
|
type :user
|
@@ -116,14 +113,14 @@ List of Attribute Directives:
|
|
116
113
|
* `content(&block)`
|
117
114
|
|
118
115
|
Custom validation method to check the value of the attribute. This is useful
|
119
|
-
in cases where you only want certain values to be stored (e.g a number
|
120
|
-
1-10 only)
|
116
|
+
in cases where you only want certain values to be stored (e.g a number
|
117
|
+
between 1-10 only)
|
121
118
|
|
122
119
|
|
123
120
|
### Migration
|
124
121
|
|
125
122
|
Using `rename` to rename keys. Useful to maintain document integrity
|
126
|
-
|
123
|
+
after a migration.
|
127
124
|
|
128
125
|
class User < CouchPillow::Document
|
129
126
|
rename :username, :nickname
|
@@ -132,6 +129,11 @@ from a migration.
|
|
132
129
|
u = User.new( { :username => 'jdoe' } )
|
133
130
|
u.nickname # 'jdoe'
|
134
131
|
|
132
|
+
Rename triggers per-document basis. You can use this on a separate script
|
133
|
+
that queries each document in the database and updates them, or you can
|
134
|
+
simply use this inside your application code, so it only migrates the document
|
135
|
+
as it reads them.
|
136
|
+
|
135
137
|
|
136
138
|
|
137
139
|
## Design Docs and Views
|
@@ -108,21 +108,7 @@ module CouchPillow
|
|
108
108
|
def trigger_type_directive value
|
109
109
|
if @type
|
110
110
|
# Run auto-conversion first.
|
111
|
-
|
112
|
-
if @type == Integer
|
113
|
-
value = Integer(value)
|
114
|
-
elsif @type == Float
|
115
|
-
value = Float(value)
|
116
|
-
elsif @type == String
|
117
|
-
value = String(value)
|
118
|
-
elsif @type == Array
|
119
|
-
value = Array(value)
|
120
|
-
elsif @type == Time && !value.is_a?(Time)
|
121
|
-
value = Time.parse(value)
|
122
|
-
elsif @type == CouchPillow::Boolean
|
123
|
-
value = value == 0 || value.to_s.downcase == "false" || !value ? false : true
|
124
|
-
end
|
125
|
-
end
|
111
|
+
value = trigger_auto_convert_directive(value)
|
126
112
|
|
127
113
|
if @type == CouchPillow::Boolean
|
128
114
|
raise ValidationError unless !!value == value
|
@@ -135,6 +121,28 @@ module CouchPillow
|
|
135
121
|
end
|
136
122
|
|
137
123
|
|
124
|
+
# Auto convert the value
|
125
|
+
#
|
126
|
+
def trigger_auto_convert_directive value
|
127
|
+
if @auto_convert
|
128
|
+
if @type == Integer
|
129
|
+
value = Integer(value)
|
130
|
+
elsif @type == Float
|
131
|
+
value = Float(value)
|
132
|
+
elsif @type == String
|
133
|
+
value = String(value)
|
134
|
+
elsif @type == Array
|
135
|
+
value = Array(value)
|
136
|
+
elsif @type == Time && !value.is_a?(Time)
|
137
|
+
value = Time.parse(value)
|
138
|
+
elsif @type == CouchPillow::Boolean
|
139
|
+
value = value == 0 || value.to_s.downcase == "false" || !value ? false : true
|
140
|
+
end
|
141
|
+
end
|
142
|
+
value
|
143
|
+
end
|
144
|
+
|
145
|
+
|
138
146
|
# Run the validation directives, except required directive.
|
139
147
|
# First it executes the {default} directive, then {auto_convert} to type,
|
140
148
|
# then {type} validation, then finally the {content} directive.
|
@@ -4,7 +4,7 @@ module CouchPillow
|
|
4
4
|
|
5
5
|
# Declares a new Attribute
|
6
6
|
#
|
7
|
-
def attribute attr
|
7
|
+
def attribute attr, &block
|
8
8
|
attr = attr.to_s.to_sym
|
9
9
|
new_attr = Attribute.new(attr)
|
10
10
|
attributes[attr] = new_attr
|
@@ -17,6 +17,8 @@ module CouchPillow
|
|
17
17
|
@data[attr] = val
|
18
18
|
end
|
19
19
|
|
20
|
+
new_attr.instance_eval &block if block
|
21
|
+
|
20
22
|
new_attr
|
21
23
|
end
|
22
24
|
|
data/lib/couchpillow/document.rb
CHANGED
@@ -32,6 +32,8 @@ module CouchPillow
|
|
32
32
|
|
33
33
|
rename!
|
34
34
|
whitelist!
|
35
|
+
assign_defaults!
|
36
|
+
auto_convert!
|
35
37
|
end
|
36
38
|
|
37
39
|
|
@@ -54,7 +56,7 @@ module CouchPillow
|
|
54
56
|
|
55
57
|
# Save this document to the server
|
56
58
|
#
|
57
|
-
def save!
|
59
|
+
def save! opts = {}
|
58
60
|
whitelist!
|
59
61
|
sort!
|
60
62
|
timestamp!
|
@@ -62,7 +64,7 @@ module CouchPillow
|
|
62
64
|
to_save = @data.merge({
|
63
65
|
:_type => self.class._type
|
64
66
|
})
|
65
|
-
CouchPillow.db.set
|
67
|
+
CouchPillow.db.set(@id, to_save, opts)
|
66
68
|
end
|
67
69
|
|
68
70
|
|
@@ -136,6 +138,24 @@ module CouchPillow
|
|
136
138
|
end
|
137
139
|
|
138
140
|
|
141
|
+
# Assign default value
|
142
|
+
#
|
143
|
+
def assign_defaults!
|
144
|
+
self.class.attributes.each do |k, attr|
|
145
|
+
@data[k] = attr.trigger_default_directive if !has?(k) && attr.has_default?
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
|
150
|
+
# Auto convert.
|
151
|
+
#
|
152
|
+
def auto_convert!
|
153
|
+
self.class.attributes.each do |k, attr|
|
154
|
+
@data[k] = attr.trigger_auto_convert_directive(@data[k]) if has?(k)
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
|
139
159
|
# Go through each attribute, and validate the values.
|
140
160
|
# Validation also perform auto-conversion if auto-conversion is enabled
|
141
161
|
# for that attribute.
|
data/lib/couchpillow/version.rb
CHANGED
data/test/helper.rb
CHANGED
data/test/test_document.rb
CHANGED
@@ -323,4 +323,74 @@ class TestDocument < Minitest::Test
|
|
323
323
|
k.save!
|
324
324
|
end
|
325
325
|
|
326
|
+
|
327
|
+
def test_auto_convert_triggers_on_initialize
|
328
|
+
d = Class.new(Document) do
|
329
|
+
type 'test'
|
330
|
+
attribute(:foo)
|
331
|
+
.type(String).auto_convert
|
332
|
+
attribute(:not_auto)
|
333
|
+
.type(Integer)
|
334
|
+
end.new( foo: 1, not_auto: "100" )
|
335
|
+
|
336
|
+
assert_equal "1", d.foo
|
337
|
+
assert_equal "100", d.not_auto
|
338
|
+
end
|
339
|
+
|
340
|
+
|
341
|
+
def test_dsl_style
|
342
|
+
d = Class.new(Document) do
|
343
|
+
type 'test'
|
344
|
+
|
345
|
+
attribute :foo do
|
346
|
+
type String
|
347
|
+
auto_convert
|
348
|
+
required
|
349
|
+
end
|
350
|
+
|
351
|
+
attribute :bar do
|
352
|
+
type Integer
|
353
|
+
auto_convert
|
354
|
+
required
|
355
|
+
end
|
356
|
+
end.new( foo: 1, bar: "100" )
|
357
|
+
|
358
|
+
assert_equal "1", d.foo
|
359
|
+
assert_equal 100, d.bar
|
360
|
+
end
|
361
|
+
|
362
|
+
|
363
|
+
def test_assign_default_value_at_creation
|
364
|
+
d = Class.new(Document) do
|
365
|
+
type 'test'
|
366
|
+
|
367
|
+
attribute :foo do
|
368
|
+
type String
|
369
|
+
auto_convert
|
370
|
+
required
|
371
|
+
default { "tester" }
|
372
|
+
end
|
373
|
+
|
374
|
+
end.new
|
375
|
+
|
376
|
+
assert_equal "tester", d.foo
|
377
|
+
end
|
378
|
+
|
379
|
+
|
380
|
+
def test_ttl_support
|
381
|
+
d = Class.new(Document) do
|
382
|
+
type 'test'
|
383
|
+
|
384
|
+
attribute :foo do
|
385
|
+
type String
|
386
|
+
auto_convert
|
387
|
+
required
|
388
|
+
default { "tester" }
|
389
|
+
end
|
390
|
+
|
391
|
+
end.new
|
392
|
+
|
393
|
+
d.save! ttl: 100
|
394
|
+
end
|
395
|
+
|
326
396
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: couchpillow
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Albert Tedja
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-03-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|
@@ -93,7 +93,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
93
93
|
version: '0'
|
94
94
|
requirements: []
|
95
95
|
rubyforge_project:
|
96
|
-
rubygems_version: 2.4.
|
96
|
+
rubygems_version: 2.4.6
|
97
97
|
signing_key:
|
98
98
|
specification_version: 4
|
99
99
|
summary: Document wrapper for Couchbase
|