compel 0.2.0 → 0.3.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 +4 -4
- data/README.md +88 -20
- data/lib/compel/builder/array.rb +31 -0
- data/lib/compel/builder/boolean.rb +7 -0
- data/lib/compel/builder/common.rb +2 -2
- data/lib/compel/builder/common_value.rb +4 -4
- data/lib/compel/builder/hash.rb +3 -1
- data/lib/compel/builder/methods.rb +5 -0
- data/lib/compel/builder/schema.rb +4 -0
- data/lib/compel/coercion/coercion.rb +47 -0
- data/lib/compel/coercion/nil_result.rb +13 -0
- data/lib/compel/coercion/result.rb +37 -0
- data/lib/compel/coercion/types/array.rb +15 -0
- data/lib/compel/coercion/{boolean.rb → types/boolean.rb} +1 -3
- data/lib/compel/coercion/types/date.rb +36 -0
- data/lib/compel/coercion/types/datetime.rb +36 -0
- data/lib/compel/coercion/{float.rb → types/float.rb} +2 -2
- data/lib/compel/coercion/{hash.rb → types/hash.rb} +2 -2
- data/lib/compel/coercion/{integer.rb → types/integer.rb} +2 -2
- data/lib/compel/coercion/{json.rb → types/json.rb} +2 -2
- data/lib/compel/coercion/{regexp.rb → types/regexp.rb} +2 -4
- data/lib/compel/coercion/{string.rb → types/string.rb} +3 -5
- data/lib/compel/coercion/types/time.rb +36 -0
- data/lib/compel/coercion/types/type.rb +29 -0
- data/lib/compel/contract.rb +14 -42
- data/lib/compel/errors.rb +13 -17
- data/lib/compel/exceptions/invalid_object_error.rb +9 -0
- data/lib/compel/result.rb +30 -0
- data/lib/compel/validation.rb +6 -4
- data/lib/compel/validators/array_validator.rb +107 -0
- data/lib/compel/validators/base.rb +11 -1
- data/lib/compel/validators/hash_validator.rb +77 -19
- data/lib/compel/validators/type_validator.rb +42 -11
- data/lib/compel/version.rb +1 -1
- data/lib/compel.rb +6 -15
- data/spec/compel/builder_spec.rb +354 -144
- data/spec/compel/coercion_spec.rb +16 -1
- data/spec/compel/compel_spec.rb +315 -302
- data/spec/compel/validation_spec.rb +97 -115
- data/spec/support/sinatra_app.rb +2 -2
- metadata +21 -15
- data/lib/compel/coercion/date.rb +0 -30
- data/lib/compel/coercion/datetime.rb +0 -30
- data/lib/compel/coercion/time.rb +0 -30
- data/lib/compel/coercion/type.rb +0 -17
- data/lib/compel/coercion.rb +0 -31
- data/lib/compel/exceptions/invalid_hash_error.rb +0 -9
data/spec/compel/compel_spec.rb
CHANGED
@@ -4,8 +4,8 @@ describe Compel do
|
|
4
4
|
|
5
5
|
context 'User validation example' do
|
6
6
|
|
7
|
-
def
|
8
|
-
|
7
|
+
def user_schema
|
8
|
+
Compel.hash.keys({
|
9
9
|
user: Compel.hash.keys({
|
10
10
|
first_name: Compel.string.required,
|
11
11
|
last_name: Compel.string.required,
|
@@ -16,98 +16,124 @@ describe Compel do
|
|
16
16
|
admin: Compel.boolean.required
|
17
17
|
})
|
18
18
|
}).required
|
19
|
-
})
|
20
|
-
|
21
|
-
Compel.send(method, hash, schema)
|
19
|
+
}).required
|
22
20
|
end
|
23
21
|
|
24
|
-
|
25
|
-
hash = {
|
26
|
-
user: {
|
27
|
-
first_name: 'Joaquim',
|
28
|
-
last_name: 'Adráz',
|
29
|
-
birth_date: '1989-08-06T09:00:00',
|
30
|
-
age: '26',
|
31
|
-
admin: 'f',
|
32
|
-
blog_role: {
|
33
|
-
admin: '0'
|
34
|
-
}
|
35
|
-
}
|
36
|
-
}
|
22
|
+
context 'valid' do
|
37
23
|
|
38
|
-
|
39
|
-
|
24
|
+
it 'return coerced values' do
|
25
|
+
object = {
|
40
26
|
user: {
|
41
27
|
first_name: 'Joaquim',
|
42
28
|
last_name: 'Adráz',
|
43
|
-
birth_date:
|
44
|
-
age: 26,
|
45
|
-
admin:
|
29
|
+
birth_date: '1989-08-06T09:00:00',
|
30
|
+
age: '26',
|
31
|
+
admin: 'f',
|
46
32
|
blog_role: {
|
47
|
-
admin:
|
33
|
+
admin: '0'
|
48
34
|
}
|
49
35
|
}
|
50
|
-
})
|
51
|
-
end
|
52
|
-
|
53
|
-
it 'should not compel and leave other hash untouched' do
|
54
|
-
hash = {
|
55
|
-
other_param: 1,
|
56
|
-
user: {
|
57
|
-
first_name: 'Joaquim'
|
58
36
|
}
|
59
|
-
}
|
60
37
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
},
|
67
|
-
errors: {
|
38
|
+
result = Compel.run(object, user_schema)
|
39
|
+
|
40
|
+
expect(result.valid?).to be true
|
41
|
+
expect(result.value).to eq \
|
42
|
+
Hashie::Mash.new({
|
68
43
|
user: {
|
69
|
-
|
44
|
+
first_name: 'Joaquim',
|
45
|
+
last_name: 'Adráz',
|
46
|
+
birth_date: DateTime.parse('1989-08-06T09:00:00'),
|
47
|
+
age: 26,
|
48
|
+
admin: false,
|
49
|
+
blog_role: {
|
50
|
+
admin: false
|
51
|
+
}
|
70
52
|
}
|
71
|
-
}
|
72
|
-
|
73
|
-
end
|
53
|
+
})
|
54
|
+
end
|
74
55
|
|
75
|
-
it 'should not compel for invalid hash' do
|
76
|
-
expect{ make_the_call(:run, 1) }.to \
|
77
|
-
raise_error Compel::TypeError, 'must be an Hash'
|
78
56
|
end
|
79
57
|
|
80
|
-
|
81
|
-
expect{ make_the_call(:run, nil) }.to \
|
82
|
-
raise_error Compel::TypeError, 'must be an Hash'
|
83
|
-
end
|
58
|
+
context 'invalid' do
|
84
59
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
60
|
+
it 'should not compel and leave other keys untouched' do
|
61
|
+
object = {
|
62
|
+
other_param: 1,
|
63
|
+
user: {
|
64
|
+
first_name: 'Joaquim'
|
65
|
+
}
|
89
66
|
}
|
90
|
-
}
|
91
67
|
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
68
|
+
result = Compel.run(object, user_schema)
|
69
|
+
|
70
|
+
expect(result.valid?).to be false
|
71
|
+
expect(result.value).to eq \
|
72
|
+
Hashie::Mash.new({
|
73
|
+
other_param: 1,
|
98
74
|
user: {
|
99
|
-
|
75
|
+
first_name: 'Joaquim',
|
76
|
+
},
|
77
|
+
errors: {
|
78
|
+
user: {
|
79
|
+
last_name: ['is required']
|
80
|
+
}
|
100
81
|
}
|
82
|
+
})
|
83
|
+
end
|
84
|
+
|
85
|
+
it 'should not compel for invalid hash' do
|
86
|
+
result = Compel.run(1, user_schema)
|
87
|
+
|
88
|
+
expect(result.valid?).to be false
|
89
|
+
expect(result.errors[:base]).to include("'1' is not a valid Hash")
|
90
|
+
end
|
91
|
+
|
92
|
+
it 'should not compel for missing hash' do
|
93
|
+
result = Compel.run(nil, user_schema)
|
94
|
+
|
95
|
+
expect(result.valid?).to be false
|
96
|
+
expect(result.errors[:base]).to include('is required')
|
97
|
+
end
|
98
|
+
|
99
|
+
it 'should not compel for empty hash' do
|
100
|
+
result = Compel.run({}, user_schema)
|
101
|
+
|
102
|
+
expect(result.valid?).to be false
|
103
|
+
expect(result.errors[:user]).to include('is required')
|
104
|
+
end
|
105
|
+
|
106
|
+
it 'should not compel for missing required key' do
|
107
|
+
object = {
|
108
|
+
user: {
|
109
|
+
first_name: 'Joaquim'
|
101
110
|
}
|
102
|
-
}
|
111
|
+
}
|
112
|
+
|
113
|
+
result = Compel.run(object, user_schema)
|
114
|
+
|
115
|
+
expect(result.valid?).to be false
|
116
|
+
expect(result.value).to eq \
|
117
|
+
Hashie::Mash.new({
|
118
|
+
user:{
|
119
|
+
first_name: 'Joaquim',
|
120
|
+
},
|
121
|
+
errors: {
|
122
|
+
user: {
|
123
|
+
last_name: ['is required']
|
124
|
+
}
|
125
|
+
}
|
126
|
+
})
|
127
|
+
end
|
128
|
+
|
103
129
|
end
|
104
130
|
|
105
131
|
end
|
106
132
|
|
107
133
|
context 'Address validation example' do
|
108
134
|
|
109
|
-
def
|
110
|
-
|
135
|
+
def address_schema
|
136
|
+
Compel.hash.keys({
|
111
137
|
address: Compel.hash.keys({
|
112
138
|
line_one: Compel.string.required,
|
113
139
|
line_two: Compel.string,
|
@@ -121,199 +147,196 @@ describe Compel do
|
|
121
147
|
}).required
|
122
148
|
}).required
|
123
149
|
})
|
124
|
-
|
125
|
-
Compel.send(method, hash, schema)
|
126
150
|
end
|
127
151
|
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
152
|
+
context 'valid' do
|
153
|
+
|
154
|
+
it 'should compel with #run?' do
|
155
|
+
object = {
|
156
|
+
address: {
|
157
|
+
line_one: 'Lisbon',
|
158
|
+
line_two: 'Portugal',
|
159
|
+
post_code: {
|
160
|
+
prefix: 1100,
|
161
|
+
suffix: 100
|
162
|
+
}
|
136
163
|
}
|
137
164
|
}
|
138
|
-
}
|
139
165
|
|
140
|
-
|
166
|
+
expect(Compel.run?(object, address_schema)).to eq(true)
|
167
|
+
end
|
168
|
+
|
141
169
|
end
|
142
170
|
|
143
|
-
|
144
|
-
hash = {
|
145
|
-
address: {
|
146
|
-
line_two: 'Portugal'
|
147
|
-
}
|
148
|
-
}
|
171
|
+
context 'invalid' do
|
149
172
|
|
150
|
-
|
151
|
-
|
173
|
+
it 'should not compel for missing required keys' do
|
174
|
+
object = {
|
152
175
|
address: {
|
153
176
|
line_two: 'Portugal'
|
154
|
-
},
|
155
|
-
errors: {
|
156
|
-
address: {
|
157
|
-
line_one: ['is required'],
|
158
|
-
post_code: ['is required']
|
159
|
-
}
|
160
177
|
}
|
161
|
-
}
|
162
|
-
end
|
178
|
+
}
|
163
179
|
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
180
|
+
result = Compel.run(object, address_schema)
|
181
|
+
|
182
|
+
expect(result.valid?).to be false
|
183
|
+
expect(result.value).to eq \
|
184
|
+
Hashie::Mash.new({
|
185
|
+
address: {
|
186
|
+
line_two: 'Portugal'
|
187
|
+
},
|
188
|
+
errors: {
|
189
|
+
address: {
|
190
|
+
line_one: ['is required'],
|
191
|
+
post_code: ['is required']
|
192
|
+
}
|
172
193
|
}
|
173
|
-
}
|
174
|
-
|
175
|
-
}
|
194
|
+
})
|
195
|
+
end
|
176
196
|
|
177
|
-
|
178
|
-
|
197
|
+
it 'should not compel missing key and length invalid' do
|
198
|
+
object = {
|
179
199
|
address: {
|
180
200
|
line_two: 'Portugal',
|
181
201
|
post_code: {
|
182
|
-
prefix: 1,
|
202
|
+
prefix: '1',
|
183
203
|
county: {
|
184
204
|
code: 'LX'
|
185
205
|
}
|
186
206
|
}
|
187
|
-
},
|
188
|
-
errors: {
|
189
|
-
address: {
|
190
|
-
line_one: ['is required'],
|
191
|
-
post_code: {
|
192
|
-
prefix: ['cannot have length different than 4']
|
193
|
-
}
|
194
|
-
}
|
195
|
-
}
|
196
|
-
})
|
197
|
-
end
|
198
|
-
|
199
|
-
it 'should not compel 2' do
|
200
|
-
hash = {
|
201
|
-
address: {
|
202
|
-
post_code: {
|
203
|
-
suffix: '1234'
|
204
207
|
}
|
205
208
|
}
|
206
|
-
}
|
207
209
|
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
}
|
214
|
-
},
|
215
|
-
errors: {
|
210
|
+
result = Compel.run(object, address_schema)
|
211
|
+
|
212
|
+
expect(result.valid?).to be false
|
213
|
+
expect(result.value).to eq \
|
214
|
+
Hashie::Mash.new({
|
216
215
|
address: {
|
217
|
-
|
216
|
+
line_two: 'Portugal',
|
218
217
|
post_code: {
|
219
|
-
prefix:
|
220
|
-
|
218
|
+
prefix: 1,
|
219
|
+
county: {
|
220
|
+
code: 'LX'
|
221
|
+
}
|
222
|
+
}
|
223
|
+
},
|
224
|
+
errors: {
|
225
|
+
address: {
|
226
|
+
line_one: ['is required'],
|
227
|
+
post_code: {
|
228
|
+
prefix: ['cannot have length different than 4']
|
229
|
+
}
|
221
230
|
}
|
222
231
|
}
|
223
|
-
}
|
224
|
-
|
225
|
-
end
|
226
|
-
|
227
|
-
it 'should not compel 3' do
|
228
|
-
hash = {
|
229
|
-
address: {
|
230
|
-
post_code: {
|
231
|
-
prefix: '1100',
|
232
|
-
suffix: '100',
|
233
|
-
county: {}
|
234
|
-
},
|
235
|
-
}
|
236
|
-
}
|
232
|
+
})
|
233
|
+
end
|
237
234
|
|
238
|
-
|
239
|
-
|
235
|
+
it 'should not compel for givin invalid optional value' do
|
236
|
+
object = {
|
240
237
|
address: {
|
238
|
+
line_one: 'Line',
|
241
239
|
post_code: {
|
242
|
-
prefix: 1100,
|
243
|
-
suffix: 100,
|
240
|
+
prefix: '1100',
|
241
|
+
suffix: '100',
|
244
242
|
county: {}
|
245
|
-
}
|
246
|
-
}
|
247
|
-
|
243
|
+
},
|
244
|
+
}
|
245
|
+
}
|
246
|
+
|
247
|
+
result = Compel.run(object, address_schema)
|
248
|
+
|
249
|
+
expect(result.valid?).to be false
|
250
|
+
expect(result.value).to eq \
|
251
|
+
Hashie::Mash.new({
|
248
252
|
address: {
|
249
|
-
line_one:
|
253
|
+
line_one: 'Line',
|
250
254
|
post_code: {
|
251
|
-
|
252
|
-
|
255
|
+
prefix: 1100,
|
256
|
+
suffix: 100,
|
257
|
+
county: {}
|
258
|
+
}
|
259
|
+
},
|
260
|
+
errors: {
|
261
|
+
address: {
|
262
|
+
post_code: {
|
263
|
+
county: {
|
264
|
+
code: ['is required']
|
265
|
+
}
|
253
266
|
}
|
254
267
|
}
|
255
268
|
}
|
256
|
-
}
|
257
|
-
})
|
269
|
+
})
|
258
270
|
|
259
|
-
|
271
|
+
end
|
260
272
|
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
273
|
+
it 'should not compel for missing required root key' do
|
274
|
+
object = {
|
275
|
+
address: nil
|
276
|
+
}
|
265
277
|
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
278
|
+
result = Compel.run(object, address_schema)
|
279
|
+
|
280
|
+
expect(result.valid?).to be false
|
281
|
+
expect(result.value).to eq \
|
282
|
+
Hashie::Mash.new({
|
283
|
+
address: nil,
|
284
|
+
errors: {
|
285
|
+
address: ['is required']
|
286
|
+
}
|
287
|
+
})
|
288
|
+
end
|
289
|
+
|
290
|
+
it 'should not compel for empty object' do
|
291
|
+
result = Compel.run({}, address_schema)
|
292
|
+
|
293
|
+
expect(result.valid?).to be false
|
294
|
+
expect(result.value).to eq \
|
295
|
+
Hashie::Mash.new({
|
296
|
+
errors: {
|
297
|
+
address: ['is required']
|
298
|
+
}
|
299
|
+
})
|
300
|
+
end
|
274
301
|
|
275
|
-
it 'should not compel 5' do
|
276
|
-
expect(make_the_call(:run, {})).to eq \
|
277
|
-
Hashie::Mash.new({
|
278
|
-
errors: {
|
279
|
-
address: ['is required']
|
280
|
-
}
|
281
|
-
})
|
282
302
|
end
|
283
303
|
|
284
304
|
end
|
285
305
|
|
286
306
|
context 'Boolean' do
|
287
307
|
|
288
|
-
|
308
|
+
it 'it not compel for invalid boolean' do
|
309
|
+
result = Compel.run(nil, Compel.boolean.required)
|
289
310
|
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
})
|
311
|
+
expect(result.valid?).to be false
|
312
|
+
expect(result.errors).to include('is required')
|
313
|
+
end
|
294
314
|
|
295
|
-
|
315
|
+
context 'required option' do
|
316
|
+
|
317
|
+
it 'should compel with valid option' do
|
318
|
+
expect(Compel.run?(1, Compel.boolean.required)).to be true
|
296
319
|
end
|
297
320
|
|
298
|
-
it 'should not compel' do
|
321
|
+
it 'should not compel for missing required boolean' do
|
299
322
|
schema = Compel.hash.keys({
|
300
323
|
admin: Compel.boolean.required
|
301
324
|
})
|
302
325
|
|
303
|
-
|
304
|
-
|
326
|
+
result = Compel.run({ admin: nil }, schema)
|
327
|
+
|
328
|
+
expect(result.valid?).to be false
|
329
|
+
expect(result.errors[:admin]).to include('is required')
|
305
330
|
end
|
306
331
|
|
307
332
|
end
|
308
333
|
|
309
334
|
context 'default option' do
|
310
335
|
|
311
|
-
it 'should compel' do
|
312
|
-
|
313
|
-
admin: Compel.boolean.default(false)
|
314
|
-
})
|
336
|
+
it 'should compel with default option set' do
|
337
|
+
result = Compel.run(nil, Compel.boolean.default(false))
|
315
338
|
|
316
|
-
expect(
|
339
|
+
expect(result.value).to be false
|
317
340
|
end
|
318
341
|
|
319
342
|
end
|
@@ -321,20 +344,14 @@ describe Compel do
|
|
321
344
|
context 'is option' do
|
322
345
|
|
323
346
|
it 'should compel' do
|
324
|
-
|
325
|
-
admin: Compel.boolean.is(1)
|
326
|
-
})
|
327
|
-
|
328
|
-
expect(Compel.run?({ admin: 1 }, schema)).to be true
|
347
|
+
expect(Compel.run?(1, Compel.boolean.is(1))).to be true
|
329
348
|
end
|
330
349
|
|
331
350
|
it 'should not compel' do
|
332
|
-
|
333
|
-
admin: Compel.boolean.is(1)
|
334
|
-
})
|
351
|
+
result = Compel.run(0, Compel.boolean.is(1))
|
335
352
|
|
336
|
-
expect(
|
337
|
-
|
353
|
+
expect(result.valid?).to be false
|
354
|
+
expect(result.errors).to include('must be 1')
|
338
355
|
end
|
339
356
|
|
340
357
|
end
|
@@ -346,20 +363,17 @@ describe Compel do
|
|
346
363
|
context 'format option' do
|
347
364
|
|
348
365
|
it 'should compel' do
|
349
|
-
schema = Compel.
|
350
|
-
post_code: Compel.string.format(/^\d{4}-\d{3}$/)
|
351
|
-
})
|
366
|
+
schema = Compel.string.format(/^\d{4}-\d{3}$/)
|
352
367
|
|
353
|
-
expect(Compel.run?(
|
368
|
+
expect(Compel.run?('1100-100', schema)).to be true
|
354
369
|
end
|
355
370
|
|
356
371
|
it 'should not compel' do
|
357
|
-
schema = Compel.
|
358
|
-
|
359
|
-
|
372
|
+
schema = Compel.string.format(/^\d{4}-\d{3}$/)
|
373
|
+
|
374
|
+
result = Compel.run('110-100', schema)
|
360
375
|
|
361
|
-
expect(
|
362
|
-
include('must match format ^\\d{4}-\\d{3}$')
|
376
|
+
expect(result.errors).to include('must match format ^\\d{4}-\\d{3}$')
|
363
377
|
end
|
364
378
|
|
365
379
|
end
|
@@ -371,39 +385,36 @@ describe Compel do
|
|
371
385
|
context 'format option' do
|
372
386
|
|
373
387
|
it 'should not compel' do
|
374
|
-
schema = Compel.
|
375
|
-
|
376
|
-
})
|
388
|
+
schema = Compel.time
|
389
|
+
result = Compel.run('1989-08-06', schema)
|
377
390
|
|
378
|
-
expect(
|
391
|
+
expect(result.valid?).to be false
|
392
|
+
expect(result.errors).to \
|
379
393
|
include("'1989-08-06' is not a parsable time with format: %FT%T")
|
380
394
|
end
|
381
395
|
|
382
396
|
it 'should compel with format' do
|
383
|
-
schema = Compel.
|
384
|
-
|
385
|
-
})
|
397
|
+
schema = Compel.time.format('%Y-%m-%d')
|
398
|
+
result = Compel.run('1989-08-06', schema)
|
386
399
|
|
387
|
-
expect(
|
388
|
-
|
400
|
+
expect(result.valid?).to be true
|
401
|
+
expect(result.value).to eq(Time.new(1989, 8, 6))
|
389
402
|
end
|
390
403
|
|
391
404
|
it 'should compel by default' do
|
392
|
-
schema = Compel.
|
393
|
-
|
394
|
-
})
|
405
|
+
schema = Compel.time
|
406
|
+
result = Compel.run('1989-08-06T09:00:00', schema)
|
395
407
|
|
396
|
-
expect(
|
397
|
-
|
408
|
+
expect(result.valid?).to be true
|
409
|
+
expect(result.value).to eq(Time.new(1989, 8, 6, 9))
|
398
410
|
end
|
399
411
|
|
400
412
|
it 'should compel with iso8601 format' do
|
401
|
-
schema = Compel.
|
402
|
-
|
403
|
-
})
|
413
|
+
schema = Compel.time.iso8601
|
414
|
+
result = Compel.run('1989-08-06T09:00:00', schema)
|
404
415
|
|
405
|
-
expect(
|
406
|
-
|
416
|
+
expect(result.valid?).to be true
|
417
|
+
expect(result.value).to eq(Time.new(1989, 8, 6, 9))
|
407
418
|
end
|
408
419
|
|
409
420
|
end
|
@@ -421,7 +432,10 @@ describe Compel do
|
|
421
432
|
birth_date: Compel.datetime
|
422
433
|
})
|
423
434
|
|
424
|
-
|
435
|
+
result = Compel.run({ birth_date: '1989-08-06' }, schema)
|
436
|
+
|
437
|
+
expect(result.valid?).to be false
|
438
|
+
expect(result.errors[:birth_date]).to \
|
425
439
|
include("'1989-08-06' is not a parsable datetime with format: %FT%T")
|
426
440
|
end
|
427
441
|
|
@@ -430,8 +444,10 @@ describe Compel do
|
|
430
444
|
birth_date: Compel.datetime.format('%Y-%m-%d')
|
431
445
|
})
|
432
446
|
|
433
|
-
|
434
|
-
|
447
|
+
result = Compel.run({ birth_date: '1989-08-06' }, schema)
|
448
|
+
|
449
|
+
expect(result.valid?).to be true
|
450
|
+
expect(result.value[:birth_date]).to eq(DateTime.new(1989, 8, 6))
|
435
451
|
end
|
436
452
|
|
437
453
|
it 'should compel by default' do
|
@@ -439,8 +455,10 @@ describe Compel do
|
|
439
455
|
birth_date: Compel.datetime
|
440
456
|
})
|
441
457
|
|
442
|
-
|
443
|
-
|
458
|
+
result = Compel.run({ birth_date: '1989-08-06T09:00:00' }, schema)
|
459
|
+
|
460
|
+
expect(result.valid?).to be true
|
461
|
+
expect(result.value[:birth_date]).to eq(DateTime.new(1989, 8, 6, 9))
|
444
462
|
end
|
445
463
|
|
446
464
|
it 'should compel with iso8601 format' do
|
@@ -448,8 +466,10 @@ describe Compel do
|
|
448
466
|
birth_date: Compel.datetime.iso8601
|
449
467
|
})
|
450
468
|
|
451
|
-
|
452
|
-
|
469
|
+
result = Compel.run({ birth_date: '1989-08-06T09:00:00' }, schema)
|
470
|
+
|
471
|
+
expect(result.valid?).to be true
|
472
|
+
expect(result.value[:birth_date]).to eq(DateTime.new(1989, 8, 6, 9))
|
453
473
|
end
|
454
474
|
|
455
475
|
end
|
@@ -458,87 +478,80 @@ describe Compel do
|
|
458
478
|
|
459
479
|
context 'Compel methods' do
|
460
480
|
|
461
|
-
def make_the_call(method, hash)
|
462
|
-
schema = Compel.hash.keys({
|
463
|
-
first_name: Compel.string.required,
|
464
|
-
last_name: Compel.string.required,
|
465
|
-
birth_date: Compel.datetime
|
466
|
-
})
|
467
|
-
|
468
|
-
Compel.send(method, hash, schema)
|
469
|
-
end
|
470
|
-
|
471
481
|
context '#run!' do
|
472
482
|
|
473
|
-
|
474
|
-
hash = {
|
475
|
-
first_name: 'Joaquim',
|
476
|
-
last_name: 'Adráz',
|
477
|
-
birth_date: DateTime.new(1988, 12, 24)
|
478
|
-
}
|
483
|
+
context 'Other Values' do
|
479
484
|
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
|
485
|
-
birth_date: DateTime.new(1988, 12, 24)
|
486
|
-
})
|
487
|
-
end
|
485
|
+
it 'should compel valid integer' do
|
486
|
+
result = Compel.run!(1, Compel.integer.required)
|
487
|
+
|
488
|
+
expect(result).to eq(1)
|
489
|
+
end
|
488
490
|
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
|
491
|
+
it 'should not compel for invalid integer' do
|
492
|
+
expect{ Compel.run!('abc', Compel.integer.required) }.to \
|
493
|
+
raise_error Compel::InvalidObjectError, 'object has errors'
|
494
|
+
end
|
493
495
|
|
494
|
-
expect{ make_the_call(:run!, hash) }.to \
|
495
|
-
raise_error Compel::InvalidHashError, 'hash has errors'
|
496
496
|
end
|
497
497
|
|
498
|
-
|
499
|
-
hash = {
|
500
|
-
first_name: 'Joaquim'
|
501
|
-
}
|
498
|
+
context 'User validation example' do
|
502
499
|
|
503
|
-
|
504
|
-
|
505
|
-
|
500
|
+
def make_the_call(method, hash)
|
501
|
+
schema = Compel.hash.keys({
|
502
|
+
first_name: Compel.string.required,
|
503
|
+
last_name: Compel.string.required,
|
504
|
+
birth_date: Compel.datetime
|
505
|
+
})
|
506
506
|
|
507
|
-
|
508
|
-
Hashie::Mash.new(last_name: ['is required'])
|
507
|
+
Compel.send(method, hash, schema)
|
509
508
|
end
|
510
|
-
end
|
511
509
|
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
|
510
|
+
it 'should compel' do
|
511
|
+
hash = {
|
512
|
+
first_name: 'Joaquim',
|
513
|
+
last_name: 'Adráz',
|
514
|
+
birth_date: DateTime.new(1988, 12, 24)
|
515
|
+
}
|
516
516
|
|
517
|
-
|
517
|
+
expect(make_the_call(:run!, hash)).to \
|
518
|
+
eq \
|
519
|
+
Hashie::Mash.new({
|
520
|
+
first_name: 'Joaquim',
|
521
|
+
last_name: 'Adráz',
|
522
|
+
birth_date: DateTime.new(1988, 12, 24)
|
523
|
+
})
|
524
|
+
end
|
518
525
|
|
519
|
-
|
526
|
+
it 'should raise InvalidObjectError exception for missing required key' do
|
527
|
+
hash = {
|
528
|
+
first_name: 'Joaquim'
|
529
|
+
}
|
520
530
|
|
521
|
-
|
522
|
-
|
523
|
-
|
524
|
-
last_name: 'Adráz',
|
525
|
-
birth_date: '1989-08-06T09:00:00'
|
526
|
-
}
|
531
|
+
expect{ make_the_call(:run!, hash) }.to \
|
532
|
+
raise_error Compel::InvalidObjectError, 'object has errors'
|
533
|
+
end
|
527
534
|
|
528
|
-
|
529
|
-
|
535
|
+
it 'should raise InvalidObjectError exception with errors' do
|
536
|
+
hash = {
|
537
|
+
first_name: 'Joaquim'
|
538
|
+
}
|
539
|
+
|
540
|
+
expect{ make_the_call(:run!, hash) }.to raise_error do |exception|
|
541
|
+
expect(exception.object).to eq \
|
542
|
+
Hashie::Mash.new(first_name: 'Joaquim', errors: { last_name: ['is required'] })
|
543
|
+
end
|
544
|
+
end
|
530
545
|
|
531
|
-
|
532
|
-
|
533
|
-
|
534
|
-
|
546
|
+
it 'should raise InvalidObjectError exception for missing hash' do
|
547
|
+
expect{ make_the_call(:run!, {}) }.to \
|
548
|
+
raise_error Compel::InvalidObjectError, 'object has errors'
|
549
|
+
end
|
535
550
|
|
536
|
-
expect(make_the_call(:run?, hash)).to eq(false)
|
537
551
|
end
|
538
552
|
|
539
553
|
end
|
540
554
|
|
541
555
|
end
|
542
556
|
|
543
|
-
|
544
557
|
end
|