couchpillow 0.3.9 → 0.3.10
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/lib/couchpillow/document.rb +53 -13
- data/lib/couchpillow/version.rb +1 -1
- data/test/test_document.rb +43 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3185ef13356f6eadae67b5b1e57d3af472a3e545
|
4
|
+
data.tar.gz: 9954f18c4e2469738fabab9ff8e3c9cd0409e681
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ffd1543a372cd2fa2431d70b9210532ad04ed94398d8b4a54b1ed233070eaeb6dafcc8437e687790a954d3b9a5636e644e50b045ad4e70ab72c3803a47423013
|
7
|
+
data.tar.gz: cedf8d10d9b414c100797b505667da6010d8e6b0088bc73d2646e33456ea859d29b86a3dac0f4958da4fc656631be1de9fb940ffcb7568c3e09d077b14845611
|
data/lib/couchpillow/document.rb
CHANGED
@@ -2,9 +2,16 @@ module CouchPillow
|
|
2
2
|
|
3
3
|
class Document
|
4
4
|
|
5
|
+
# Validation Error.
|
6
|
+
#
|
5
7
|
class ValidationError < StandardError; end
|
6
8
|
|
7
9
|
|
10
|
+
# Faux Boolean class used for type checking and conversion.
|
11
|
+
#
|
12
|
+
class Boolean; end
|
13
|
+
|
14
|
+
|
8
15
|
attr_reader :id
|
9
16
|
|
10
17
|
|
@@ -47,6 +54,7 @@ module CouchPillow
|
|
47
54
|
end
|
48
55
|
|
49
56
|
|
57
|
+
# @private
|
50
58
|
# Map hash keys to methods
|
51
59
|
#
|
52
60
|
def method_missing m, *args, &block
|
@@ -64,6 +72,8 @@ module CouchPillow
|
|
64
72
|
end
|
65
73
|
|
66
74
|
|
75
|
+
# @private
|
76
|
+
#
|
67
77
|
def respond_to? m
|
68
78
|
ms = m.to_s
|
69
79
|
return true if ms.end_with?("=")
|
@@ -72,6 +82,8 @@ module CouchPillow
|
|
72
82
|
end
|
73
83
|
|
74
84
|
|
85
|
+
# @private
|
86
|
+
#
|
75
87
|
def timestamp!
|
76
88
|
@data[:updated_at] = Time.now.utc
|
77
89
|
end
|
@@ -143,12 +155,14 @@ module CouchPillow
|
|
143
155
|
|
144
156
|
def validate
|
145
157
|
self.class.validate_keys.each do |k, msg, method|
|
146
|
-
raise ValidationError, "#{k} #{msg}" unless
|
158
|
+
raise ValidationError, "[#{k}, #{@data[k]}] #{msg}" unless
|
147
159
|
@data.has_key?(k) && method.call(@data[k])
|
148
160
|
end
|
149
161
|
end
|
150
162
|
|
151
163
|
|
164
|
+
# Rename the keys in this Document as specified by the {rename} directive.
|
165
|
+
#
|
152
166
|
def rename!
|
153
167
|
self.class.rename_keys.each do |from, to|
|
154
168
|
@data.has_key?(from) and
|
@@ -158,6 +172,9 @@ module CouchPillow
|
|
158
172
|
end
|
159
173
|
|
160
174
|
|
175
|
+
# Ensure types of the values in the Document are converted to the type
|
176
|
+
# specified in the {validate_type} method.
|
177
|
+
#
|
161
178
|
def ensure_types!
|
162
179
|
self.class.type_keys.each do |k, t|
|
163
180
|
if value = @data[k] and !value.is_a?(t)
|
@@ -171,12 +188,17 @@ module CouchPillow
|
|
171
188
|
@data[k] = Array(value)
|
172
189
|
elsif t == Time
|
173
190
|
@data[k] = Time.parse(value)
|
191
|
+
elsif t == Boolean
|
192
|
+
@data[k] = value == 0 || !value ? false : true
|
174
193
|
end
|
175
194
|
end
|
176
195
|
end
|
177
196
|
end
|
178
197
|
|
179
198
|
|
199
|
+
# Filter this Document through the whitelist as specified by the
|
200
|
+
# {whitelist} directive.
|
201
|
+
#
|
180
202
|
def whitelist!
|
181
203
|
unless self.class.whitelist_keys.empty?
|
182
204
|
@data.select! do |k, v|
|
@@ -189,7 +211,7 @@ module CouchPillow
|
|
189
211
|
|
190
212
|
# Get a Document given an id.
|
191
213
|
#
|
192
|
-
# @
|
214
|
+
# @return nil if Document is of a different type.
|
193
215
|
#
|
194
216
|
def self.get id
|
195
217
|
result = CouchPillow.db.get(id) and
|
@@ -200,16 +222,13 @@ module CouchPillow
|
|
200
222
|
end
|
201
223
|
|
202
224
|
|
225
|
+
# Sets the type of this Document.
|
226
|
+
#
|
203
227
|
def self.type value
|
204
228
|
@type = value.to_s
|
205
229
|
end
|
206
230
|
|
207
231
|
|
208
|
-
def self._type
|
209
|
-
@type
|
210
|
-
end
|
211
|
-
|
212
|
-
|
213
232
|
# Rename an existing key to a new key. This is invoked right after
|
214
233
|
# initialize.
|
215
234
|
#
|
@@ -231,23 +250,35 @@ module CouchPillow
|
|
231
250
|
|
232
251
|
# Validate the type of a particular key.
|
233
252
|
#
|
253
|
+
# @example
|
254
|
+
# validate_type :name, String
|
255
|
+
#
|
234
256
|
def self.validate_type key, type
|
235
|
-
validate key, "is not the correct type. Expected a #{type}", lambda { |v| v.is_a? type }
|
257
|
+
validate key, "#{key} is not the correct type. Expected a #{type}", lambda { |v| v.is_a? type }
|
236
258
|
type_keys << [key, type]
|
237
259
|
end
|
238
260
|
|
239
261
|
|
262
|
+
# Validate the type is a Boolean, since Ruby lacks a Boolean class.
|
263
|
+
#
|
264
|
+
# @example
|
265
|
+
# validate_type_boolean :available, Boolean
|
266
|
+
#
|
267
|
+
def self.validate_type_boolean key
|
268
|
+
validate key, "#{key} is not the correct type. Expected a Boolean", lambda { |v| !!v == v }
|
269
|
+
type_keys << [key, Boolean]
|
270
|
+
end
|
271
|
+
|
272
|
+
|
240
273
|
# Validate the presence of a particular key using a custom validation method.
|
241
|
-
# If block is omitted, it only validates the existence of the key.
|
242
274
|
#
|
243
275
|
# @param key Key to be validated.
|
244
276
|
# @param message Message that will be displayed when validation fails.
|
245
|
-
# Will be appended after the key.
|
246
277
|
# @yield [v] Value of the key.
|
247
278
|
# The block must return truthy for it to pass the validation.
|
248
279
|
#
|
249
280
|
# @example
|
250
|
-
# validate :first_name, '
|
281
|
+
# validate :first_name, 'first name is not Joe', lambda { |v| v != "Joe" }
|
251
282
|
#
|
252
283
|
def self.validate key, message, block
|
253
284
|
raise ValidationError, "Provide validation method for key #{key}" unless block
|
@@ -257,13 +288,15 @@ module CouchPillow
|
|
257
288
|
|
258
289
|
# This Document should only accept keys that are specified here.
|
259
290
|
# The existence of these keys are optional, and won't trigger any validation
|
260
|
-
# unless specified by the validate methods. Hashes passed to update and
|
261
|
-
# initialize will be filtered through this list.
|
291
|
+
# unless specified by the validate methods. Hashes passed to {#update} and
|
292
|
+
# {#initialize} will be filtered through this list.
|
262
293
|
#
|
263
294
|
# If you don't specify a whitelist, Document will accept any keys, but
|
264
295
|
# once you specify it, only those keys will be accepted and the rest will
|
265
296
|
# be dropped.
|
266
297
|
#
|
298
|
+
# @param list Whitelist of keys.
|
299
|
+
#
|
267
300
|
# @example
|
268
301
|
# whitelist :first_name, :last_name, :address
|
269
302
|
#
|
@@ -277,6 +310,13 @@ module CouchPillow
|
|
277
310
|
private
|
278
311
|
|
279
312
|
|
313
|
+
# Read the type of this Document. Internal use only.
|
314
|
+
#
|
315
|
+
def self._type
|
316
|
+
@type
|
317
|
+
end
|
318
|
+
|
319
|
+
|
280
320
|
def self.rename_keys
|
281
321
|
@rename_keys ||= []
|
282
322
|
end
|
data/lib/couchpillow/version.rb
CHANGED
data/test/test_document.rb
CHANGED
@@ -108,6 +108,21 @@ class TestDocument < Minitest::Test
|
|
108
108
|
end
|
109
109
|
|
110
110
|
|
111
|
+
def test_validate_type_boolean
|
112
|
+
d = Class.new(Document) do
|
113
|
+
validate_type_boolean :abc
|
114
|
+
end.new
|
115
|
+
|
116
|
+
d.abc = "other type"
|
117
|
+
assert_raises Document::ValidationError do
|
118
|
+
d.save!
|
119
|
+
end
|
120
|
+
|
121
|
+
d.abc = true
|
122
|
+
d.save!
|
123
|
+
end
|
124
|
+
|
125
|
+
|
111
126
|
def test_validate_type_also_ensures_types_on_create_integer
|
112
127
|
klass = Class.new(Document) do
|
113
128
|
type "test"
|
@@ -196,6 +211,34 @@ class TestDocument < Minitest::Test
|
|
196
211
|
end
|
197
212
|
|
198
213
|
|
214
|
+
def test_validate_type_also_ensures_types_on_create_boolean
|
215
|
+
klass = Class.new(Document) do
|
216
|
+
type "test"
|
217
|
+
validate_type_boolean :abc
|
218
|
+
end
|
219
|
+
|
220
|
+
# true
|
221
|
+
CouchPillow.db.
|
222
|
+
expects(:get).
|
223
|
+
with('123').
|
224
|
+
returns( { '_type' => 'test', 'abc' => 1 } )
|
225
|
+
|
226
|
+
d = klass.get('123')
|
227
|
+
assert d
|
228
|
+
assert_equal true, d.abc
|
229
|
+
|
230
|
+
# false
|
231
|
+
CouchPillow.db.
|
232
|
+
expects(:get).
|
233
|
+
with('123').
|
234
|
+
returns( { '_type' => 'test', 'abc' => 0 } )
|
235
|
+
|
236
|
+
d = klass.get('123')
|
237
|
+
assert d
|
238
|
+
assert_equal false, d.abc
|
239
|
+
end
|
240
|
+
|
241
|
+
|
199
242
|
def test_validate_custom
|
200
243
|
d = Class.new(Document) do
|
201
244
|
validate :xyz, "must be Numeric", lambda { |v| v.is_a? Numeric }
|
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.3.
|
4
|
+
version: 0.3.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Albert Tedja
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-11-
|
11
|
+
date: 2014-11-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: minitest
|