couchpillow 0.2.0 → 0.3.0
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 -1
- data/lib/couchpillow/document.rb +26 -2
- data/lib/couchpillow/version.rb +1 -1
- data/test/test_document.rb +45 -17
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3ee5cf9a4867bd4fa3ab19cb9ad0e1401fa94dce
|
4
|
+
data.tar.gz: 56f2d1e20e5a33755946c1e3c7d1147663be2cae
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: de31833c33e134ee6dd08dd35416b80b76249bf06d69187be8d8f7e74828e8698945adcd060187f9eefa2b89d6ff0836e992151b732e16fbbbc6b4fc877d4972
|
7
|
+
data.tar.gz: 78fb2de9b1356819ce87dbd754be463d79bf056c96175f3f92cc52442fe28d1d26594c51cb71f5f94c99c0269857dd2b457444b35c51b81eb718d0688a6034a4
|
data/README.markdown
CHANGED
@@ -68,8 +68,9 @@ Overriding `CouchPillow::Document`
|
|
68
68
|
Using validation
|
69
69
|
|
70
70
|
class User < CouchPillow::Document
|
71
|
-
type
|
71
|
+
type :user
|
72
72
|
validate_presence :email
|
73
|
+
validate_type :first_name, String
|
73
74
|
end
|
74
75
|
|
75
76
|
CouchPillow.db = Couchbase.connect( bucket: 'default', host: 'localhost' )
|
@@ -95,6 +96,17 @@ Using custom validation blocks
|
|
95
96
|
doc.phone = 123
|
96
97
|
doc.save! # Success!
|
97
98
|
|
99
|
+
Using `rename` to rename keys. Useful to maintain document integrity.
|
100
|
+
|
101
|
+
class User < CouchPillow::Document
|
102
|
+
rename :username, :nickname
|
103
|
+
end
|
104
|
+
u = User.new( { :username => 'jdoe' } )
|
105
|
+
u.nickname # 'jdoe'
|
106
|
+
|
107
|
+
|
108
|
+
## Design Docs and Views
|
109
|
+
|
98
110
|
What about Design Docs and Views? They are outside the scope of CouchPillow.
|
99
111
|
However, given a design doc named `my_design_doc` and a View named `by_email`,
|
100
112
|
that returns documents as values, you can easily use it like this:
|
data/lib/couchpillow/document.rb
CHANGED
@@ -25,6 +25,7 @@ module CouchPillow
|
|
25
25
|
|
26
26
|
raise TypeError if @data[:_type] && @data[:_type] != self.class._type
|
27
27
|
@data[:_type] = self.class._type
|
28
|
+
rename!
|
28
29
|
end
|
29
30
|
|
30
31
|
|
@@ -113,6 +114,15 @@ module CouchPillow
|
|
113
114
|
end
|
114
115
|
|
115
116
|
|
117
|
+
def rename!
|
118
|
+
self.class.rename_keys.each do |from, to|
|
119
|
+
@data.has_key?(from) and
|
120
|
+
@data[to] = @data[from] and
|
121
|
+
@data.delete(from)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
|
116
126
|
def self.get id
|
117
127
|
new(CouchPillow.db.get(id), id)
|
118
128
|
end
|
@@ -128,8 +138,10 @@ module CouchPillow
|
|
128
138
|
end
|
129
139
|
|
130
140
|
|
131
|
-
|
132
|
-
|
141
|
+
# Rename an existing key to a new key. This is invoked right after initialize.
|
142
|
+
#
|
143
|
+
def self.rename from, to
|
144
|
+
rename_keys << [from.to_s.to_sym, to.to_s.to_sym]
|
133
145
|
end
|
134
146
|
|
135
147
|
|
@@ -141,6 +153,13 @@ module CouchPillow
|
|
141
153
|
end
|
142
154
|
|
143
155
|
|
156
|
+
# Validate the type of a particular key.
|
157
|
+
#
|
158
|
+
def self.validate_type key, type
|
159
|
+
validate key, "is not the correct type. Expected a #{type}", lambda { |v| v.is_a? type }
|
160
|
+
end
|
161
|
+
|
162
|
+
|
144
163
|
# Validate the presence of a particular key using a custom validation method.
|
145
164
|
# Implies the Document must contain the key.
|
146
165
|
#
|
@@ -153,6 +172,11 @@ module CouchPillow
|
|
153
172
|
private
|
154
173
|
|
155
174
|
|
175
|
+
def self.rename_keys
|
176
|
+
@rename_keys ||= []
|
177
|
+
end
|
178
|
+
|
179
|
+
|
156
180
|
def self.validate_keys
|
157
181
|
@validate_key ||= []
|
158
182
|
end
|
data/lib/couchpillow/version.rb
CHANGED
data/test/test_document.rb
CHANGED
@@ -5,12 +5,7 @@ require './lib/couchpillow.rb'
|
|
5
5
|
|
6
6
|
class TestDocument < Minitest::Test
|
7
7
|
|
8
|
-
|
9
|
-
type :test
|
10
|
-
validate_presence :xyz
|
11
|
-
validate :xyz, "must be Numeric", lambda { |v| v.is_a? Numeric }
|
12
|
-
end
|
13
|
-
|
8
|
+
Document = CouchPillow::Document
|
14
9
|
|
15
10
|
def mock_time
|
16
11
|
return @time if @time
|
@@ -31,13 +26,13 @@ class TestDocument < Minitest::Test
|
|
31
26
|
|
32
27
|
|
33
28
|
def test_create
|
34
|
-
d =
|
29
|
+
d = Document.new
|
35
30
|
d.save!
|
36
31
|
end
|
37
32
|
|
38
33
|
|
39
34
|
def test_timestamp
|
40
|
-
d =
|
35
|
+
d = Document.new({}, "1")
|
41
36
|
d.save!
|
42
37
|
assert d.created_at
|
43
38
|
assert d.updated_at
|
@@ -45,20 +40,24 @@ class TestDocument < Minitest::Test
|
|
45
40
|
|
46
41
|
|
47
42
|
def test_type
|
48
|
-
d =
|
43
|
+
d = Document.new({}, "1")
|
49
44
|
assert_equal "default", d._type
|
50
45
|
end
|
51
46
|
|
52
47
|
|
53
48
|
def test_type_subclasses
|
54
|
-
d =
|
49
|
+
d = Class.new(Document) do
|
50
|
+
type 'test'
|
51
|
+
end.new
|
55
52
|
assert_equal "test", d._type
|
56
53
|
end
|
57
54
|
|
58
55
|
|
59
56
|
def test_validate_presence
|
60
|
-
d =
|
61
|
-
|
57
|
+
d = Class.new(Document) do
|
58
|
+
validate_presence :xyz
|
59
|
+
end.new
|
60
|
+
assert_raises Document::ValidationError do
|
62
61
|
d.save!
|
63
62
|
end
|
64
63
|
|
@@ -67,15 +66,32 @@ class TestDocument < Minitest::Test
|
|
67
66
|
end
|
68
67
|
|
69
68
|
|
69
|
+
def test_validate_type
|
70
|
+
d = Class.new(Document) do
|
71
|
+
validate_type :abc, Hash
|
72
|
+
end.new
|
73
|
+
|
74
|
+
d.abc = "other type"
|
75
|
+
assert_raises Document::ValidationError do
|
76
|
+
d.save!
|
77
|
+
end
|
78
|
+
|
79
|
+
d.abc = { :hello => "world" }
|
80
|
+
d.save!
|
81
|
+
end
|
82
|
+
|
83
|
+
|
70
84
|
def test_validate_custom
|
71
|
-
d =
|
85
|
+
d = Class.new(Document) do
|
86
|
+
validate :xyz, "must be Numeric", lambda { |v| v.is_a? Numeric }
|
87
|
+
end.new
|
72
88
|
d.xyz = "string"
|
73
|
-
assert_raises
|
89
|
+
assert_raises Document::ValidationError do
|
74
90
|
d.save!
|
75
91
|
end
|
76
92
|
|
77
93
|
d.xyz = {}
|
78
|
-
assert_raises
|
94
|
+
assert_raises Document::ValidationError do
|
79
95
|
d.save!
|
80
96
|
end
|
81
97
|
|
@@ -86,13 +102,13 @@ class TestDocument < Minitest::Test
|
|
86
102
|
|
87
103
|
def test_to_json
|
88
104
|
mock_time
|
89
|
-
d =
|
105
|
+
d = Document.new({}, "1")
|
90
106
|
assert_equal "{\"_id\":\"1\",\"created_at\":\"#{mock_time.to_s}\",\"_type\":\"default\"}", d.to_json
|
91
107
|
end
|
92
108
|
|
93
109
|
|
94
110
|
def test_brackets
|
95
|
-
d =
|
111
|
+
d = Document.new({})
|
96
112
|
d[123] = 'test'
|
97
113
|
assert_equal 'test', d[123]
|
98
114
|
|
@@ -105,4 +121,16 @@ class TestDocument < Minitest::Test
|
|
105
121
|
assert_equal nil, d[:something_else]
|
106
122
|
end
|
107
123
|
|
124
|
+
|
125
|
+
def test_rename_keys
|
126
|
+
d = Class.new(Document) do
|
127
|
+
rename :foo, :bar
|
128
|
+
end.new( { :foo => 123, :other => 'abc' } )
|
129
|
+
assert_equal 123, d[:bar]
|
130
|
+
assert_equal 123, d.bar
|
131
|
+
assert_equal nil, d[:foo]
|
132
|
+
refute d.respond_to?(:foo)
|
133
|
+
assert_equal 'abc', d.other
|
134
|
+
end
|
135
|
+
|
108
136
|
end
|