compel 0.3.6 → 0.3.7

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6e6cfd90b9d392c7d5bf4f81be726f0e5b0f1444
4
- data.tar.gz: 9ad55dcf253ce805dc407889fcc94fe659106329
3
+ metadata.gz: dd80b5474b8218a24a20053cbf9a52645965acd3
4
+ data.tar.gz: c793b3161901f6aa6872b0763a7fb9570c9864d9
5
5
  SHA512:
6
- metadata.gz: 35e2a1ff640dd63f43b9826a79fa4949b3a15da09e3c3eb517b6ac64f0763ed2cc2b3c2e8b04baec04ea6e9906edbdc3af84002fef4dff7210a01433b5bea70c
7
- data.tar.gz: d4e7c4d9443609d922ea3adb3d664d21b3c49b5b8b278d3a46786ff33acfca330afde0f6f6746b41b58f9c9b4f7f39ef2f0518542c1b0516f7b8a461827475f3
6
+ metadata.gz: 78f27f5b101c0255540f8a99018d750247ddae79eca4847b1a656fbbd527e4af1445ce12567f5049b201fc1309bdd1b594af225876937b450689fc269f2b92c6
7
+ data.tar.gz: 6c1d7772d9cd20a21f6e36fe0f1c717bebb358a4a98ed2c3fb6831f986770895d4040901bf4a8ccc25e3b0ccd16cd72ae34ed0b142e9c02330bb83a4946c4ebf
data/README.md CHANGED
@@ -37,29 +37,38 @@ schema = Compel.hash.keys({
37
37
  })
38
38
  })
39
39
 
40
- Compel.run(object, schema)
40
+ Compel.run(object, schema) # or schema.validate(object)
41
41
  ```
42
42
 
43
- Will return an [Hashie::Mash](https://github.com/intridea/hashie) object:
43
+ Will return a `Compel::Result` object:
44
44
 
45
45
  ```ruby
46
- {
47
- "first_name" => "Joaquim",
48
- "birth_date" => "1989-0",
49
- "address" => {
50
- "line_one" => "Lisboa",
51
- "line_two" => "-",
52
- "post_code" => "1100",
53
- "country_code" => "PT"
54
- },
55
- "errors" => {
46
+ => <Compel::Result
47
+ @errors={
56
48
  "last_name" => ["is required"],
57
- "birth_date" => ["'1989-0' is not a parsable date with format: %Y-%m-%d"],
49
+ "birth_date" => ["'1989-0' is not a parsable datetime with format: %FT%T"],
58
50
  "address" => {
59
- "post_code" => ["must match format ^\d{4}-\d{3}$"]
51
+ "post_code" => ["must match format ^\\d{4}-\\d{3}$"]
60
52
  }
61
- }
62
- }
53
+ },
54
+ @valid=false,
55
+ @value={
56
+ "first_name" => "Joaquim",
57
+ "birth_date" => "1989-0",
58
+ "address" => {
59
+ "line_one" => "Lisboa",
60
+ "post_code" => "1100",
61
+ "country_code" => "PT",
62
+ "line_two" => "-"
63
+ },
64
+ "errors" => {
65
+ "last_name" => ["is required"],
66
+ "birth_date" => ["'1989-0' is not a parsable datetime with format: %FT%T"],
67
+ "address" => {
68
+ "post_code" => ["must match format ^\\d{4}-\\d{3}$"]
69
+ }
70
+ }
71
+ }>
63
72
  ```
64
73
 
65
74
  There are 4 ways to run validations:
@@ -259,7 +268,7 @@ end
259
268
 
260
269
  Add this line to your application's Gemfile:
261
270
 
262
- gem 'compel', '~> 0.3.5'
271
+ gem 'compel', '~> 0.3.7'
263
272
 
264
273
  And then execute:
265
274
 
@@ -4,7 +4,7 @@ module Compel
4
4
  module Common
5
5
 
6
6
  def is(value)
7
- options[:is] = value
7
+ options[:is] = Coercion.coerce!(value, self.type)
8
8
  self
9
9
  end
10
10
 
@@ -14,7 +14,7 @@ module Compel
14
14
  end
15
15
 
16
16
  def default(value)
17
- options[:default] = value
17
+ options[:default] = Coercion.coerce!(value, self.type)
18
18
  self
19
19
  end
20
20
 
@@ -4,25 +4,65 @@ module Compel
4
4
  module CommonValue
5
5
 
6
6
  def in(value)
7
- options[:in] = value
7
+ options[:in] = coerce_values_ary!(value, :in)
8
8
  self
9
9
  end
10
10
 
11
11
  def range(value)
12
- options[:range] = value
12
+ options[:range] = coerce_values_ary!(value, :range)
13
13
  self
14
14
  end
15
15
 
16
16
  def min(value)
17
- options[:min] = value
17
+ options[:min] = coerce_value!(value, :min)
18
18
  self
19
19
  end
20
20
 
21
21
  def max(value)
22
- options[:max] = value
22
+ options[:max] = coerce_value!(value, :max)
23
23
  self
24
24
  end
25
25
 
26
+ def coerce_values_ary!(values, method)
27
+ begin
28
+ fail if values.nil?
29
+
30
+ Coercion.coerce!(values, Coercion::Array)
31
+ rescue
32
+ raise_array_error(method)
33
+ end
34
+
35
+ values.map{ |value| Coercion.coerce!(value, self.type) }
36
+
37
+ rescue
38
+ raise_array_values_error(method)
39
+ end
40
+
41
+ def coerce_value!(value, method)
42
+ begin
43
+ fail if value.nil?
44
+
45
+ Coercion.coerce!(value, self.type)
46
+ rescue
47
+ raise_value_error(method)
48
+ end
49
+ end
50
+
51
+ def raise_array_error(method)
52
+ raise TypeError, "#{self.class.human_name} ##{method} " \
53
+ "value must an Array"
54
+ end
55
+
56
+ def raise_array_values_error(method)
57
+ raise TypeError, "All #{self.class.human_name} ##{method} values " \
58
+ "must be a valid #{self.type.human_name}"
59
+ end
60
+
61
+ def raise_value_error(method)
62
+ raise TypeError, "#{self.class.human_name} ##{method} value " \
63
+ "must be a valid #{self.type.human_name}"
64
+ end
65
+
26
66
  end
27
67
 
28
68
  end
@@ -3,6 +3,8 @@ module Compel
3
3
 
4
4
  class Date < Schema
5
5
 
6
+ include CommonValue
7
+
6
8
  def initialize
7
9
  super(Coercion::Date)
8
10
  end
@@ -3,6 +3,8 @@ module Compel
3
3
 
4
4
  class DateTime < Schema
5
5
 
6
+ include CommonValue
7
+
6
8
  def initialize
7
9
  super(Coercion::DateTime)
8
10
  end
@@ -10,11 +10,11 @@ module Compel
10
10
 
11
11
  def initialize(type)
12
12
  @type = type
13
- @options = Hashie::Mash.new
13
+ @options = default_options
14
14
  end
15
15
 
16
16
  def required?
17
- !!options[:required]
17
+ options[:required]
18
18
  end
19
19
 
20
20
  def default_value
@@ -25,6 +25,20 @@ module Compel
25
25
  Contract.new(object, self).validate
26
26
  end
27
27
 
28
+ class << self
29
+
30
+ def human_name
31
+ "#{self.name.split('::')[1..-1].join('::')}"
32
+ end
33
+
34
+ end
35
+
36
+ protected
37
+
38
+ def default_options
39
+ Hashie::Mash.new(required: false)
40
+ end
41
+
28
42
  end
29
43
 
30
44
  end
@@ -3,6 +3,14 @@ module Compel
3
3
 
4
4
  class String < Schema
5
5
 
6
+ # Taken from ruby_regex gem by @eparreno
7
+ # https://github.com/eparreno/ruby_regex
8
+ URL_REGEX = /(\A\z)|(\A(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(([0-9]{1,5})?\/.*)?\z)/ix
9
+
10
+ # Taken from Michael Hartl's 'The Ruby on Rails Tutorial'
11
+ # https://www.railstutorial.org/book
12
+ EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z]+)*\.[a-z]+\z/i
13
+
6
14
  include CommonValue
7
15
 
8
16
  def initialize
@@ -14,6 +22,16 @@ module Compel
14
22
  self
15
23
  end
16
24
 
25
+ def url
26
+ options[:format] = URL_REGEX
27
+ self
28
+ end
29
+
30
+ def email
31
+ options[:format] = EMAIL_REGEX
32
+ self
33
+ end
34
+
17
35
  end
18
36
 
19
37
  end
@@ -3,6 +3,8 @@ module Compel
3
3
 
4
4
  class Time < Schema
5
5
 
6
+ include CommonValue
7
+
6
8
  def initialize
7
9
  super(Coercion::Time)
8
10
  end
@@ -1,4 +1,5 @@
1
1
  require 'compel/coercion/types/type'
2
+ require 'compel/coercion/types/date_type'
2
3
  require 'compel/coercion/types/integer'
3
4
  require 'compel/coercion/types/float'
4
5
  require 'compel/coercion/types/string'
@@ -1,33 +1,14 @@
1
1
  module Compel
2
2
  module Coercion
3
3
 
4
- class Date < Type
4
+ class Date < DateType
5
5
 
6
- attr_reader :format
7
-
8
- def coerce_value
9
- @format = options[:format] || '%Y-%m-%d'
10
-
11
- if value.is_a?(::Date)
12
- @value = value.strftime(format)
13
- end
14
-
15
- coerced = ::Date.strptime(value, format)
16
-
17
- if coerced.strftime(format) == value
18
- return coerced
19
- end
20
-
21
- build_error_result
22
-
23
- rescue
24
- build_error_result
6
+ def klass
7
+ ::Date
25
8
  end
26
9
 
27
- def build_error_result
28
- custom_error = "'#{value}' is not a parsable date with format: #{format}"
29
-
30
- Result.new(nil, value, self.class, custom_error)
10
+ def default_format
11
+ '%Y-%m-%d'
31
12
  end
32
13
 
33
14
  end
@@ -0,0 +1,36 @@
1
+ module Compel
2
+ module Coercion
3
+
4
+ class DateType < Type
5
+
6
+ attr_reader :format
7
+
8
+ def coerce_value
9
+ @format = options[:format] || default_format
10
+
11
+ if value.is_a?(klass)
12
+ @value = value.strftime(format)
13
+ end
14
+
15
+ coerced = klass.strptime(value, format)
16
+
17
+ if coerced.strftime(format) == value
18
+ return coerced
19
+ end
20
+
21
+ build_error_result
22
+
23
+ rescue
24
+ build_error_result
25
+ end
26
+
27
+ def build_error_result
28
+ custom_error = "'#{value}' is not a parsable #{klass.to_s.downcase} with format: #{format}"
29
+
30
+ Result.new(nil, value, self.class, custom_error)
31
+ end
32
+
33
+ end
34
+
35
+ end
36
+ end
@@ -1,33 +1,14 @@
1
1
  module Compel
2
2
  module Coercion
3
3
 
4
- class DateTime < Type
4
+ class DateTime < DateType
5
5
 
6
- attr_reader :format
7
-
8
- def coerce_value
9
- @format = options[:format] || '%FT%T'
10
-
11
- if value.is_a?(::DateTime)
12
- @value = value.strftime(format)
13
- end
14
-
15
- coerced = ::DateTime.strptime(value, format)
16
-
17
- if coerced.strftime(format) == value
18
- return coerced
19
- end
20
-
21
- build_error_result
22
-
23
- rescue
24
- build_error_result
6
+ def klass
7
+ ::DateTime
25
8
  end
26
9
 
27
- def build_error_result
28
- custom_error = "'#{value}' is not a parsable datetime with format: #{format}"
29
-
30
- Result.new(nil, value, self.class, custom_error)
10
+ def default_format
11
+ '%FT%T'
31
12
  end
32
13
 
33
14
  end
@@ -1,33 +1,14 @@
1
1
  module Compel
2
2
  module Coercion
3
3
 
4
- class Time < Type
4
+ class Time < DateType
5
5
 
6
- attr_reader :format
7
-
8
- def coerce_value
9
- @format = options[:format] || '%FT%T'
10
-
11
- if value.is_a?(::Time)
12
- @value = value.strftime(format)
13
- end
14
-
15
- coerced = ::Time.strptime(value, format)
16
-
17
- if coerced.strftime(format) == value
18
- return coerced
19
- end
20
-
21
- build_error_result
22
-
23
- rescue
24
- build_error_result
6
+ def klass
7
+ ::Time
25
8
  end
26
9
 
27
- def build_error_result
28
- custom_error = "'#{value}' is not a parsable time with format: #{format}"
29
-
30
- Result.new(nil, value, self.class, custom_error)
10
+ def default_format
11
+ '%FT%T'
31
12
  end
32
13
 
33
14
  end
@@ -27,6 +27,14 @@ module Compel
27
27
  Coercion::Result.new(result, value, self.class)
28
28
  end
29
29
 
30
+ class << self
31
+
32
+ def human_name
33
+ "#{self.name.split('::')[-1]}"
34
+ end
35
+
36
+ end
37
+
30
38
  end
31
39
 
32
40
  end
@@ -17,8 +17,6 @@ module Compel
17
17
 
18
18
  end
19
19
 
20
- class Within < In; end
21
-
22
20
  class Range < In; end
23
21
 
24
22
  end
@@ -20,7 +20,6 @@ module Compel
20
20
  min: Validation::Min,
21
21
  max: Validation::Max,
22
22
  range: Validation::Range,
23
- within: Validation::Within,
24
23
  format: Validation::Format,
25
24
  length: Validation::Length,
26
25
  min_length: Validation::MinLength,
@@ -1,3 +1,3 @@
1
1
  module Compel
2
- VERSION = '0.3.6'
2
+ VERSION = '0.3.7'
3
3
  end
data/lib/compel.rb CHANGED
@@ -1,3 +1,4 @@
1
+ require 'time'
1
2
  require 'hashie'
2
3
 
3
4
  require 'compel/exceptions/type_error'
@@ -8,19 +8,32 @@ describe Compel::Builder do
8
8
  builder = Compel.string
9
9
 
10
10
  expect(builder.type).to be(Compel::Coercion::String)
11
- expect(builder.options.keys).to eq([])
11
+ expect(builder.options.keys).to include('required')
12
12
  expect(builder.required?).to be false
13
13
  expect(builder.default_value).to be nil
14
14
  end
15
15
 
16
16
  context 'Builder::CommonValue' do
17
17
 
18
- context '#in, #range, #min, #max' do
18
+ context '#in, #range' do
19
19
 
20
20
  subject(:builder) { Compel.string }
21
21
 
22
22
  it 'should have value' do
23
- [:in, :range, :min, :max].each do |method|
23
+ [:in, :range].each do |method|
24
+ builder.send(method, ["#{method}"])
25
+ expect(builder.options[method]).to eq(["#{method}"])
26
+ end
27
+ end
28
+
29
+ end
30
+
31
+ context '#min, #max' do
32
+
33
+ subject(:builder) { Compel.string }
34
+
35
+ it 'should have value' do
36
+ [:min, :max].each do |method|
24
37
  builder.send(method, "#{method}")
25
38
  expect(builder.options[method]).to eq("#{method}")
26
39
  end
@@ -97,12 +110,129 @@ describe Compel::Builder do
97
110
 
98
111
  end
99
112
 
113
+ context '#max' do
114
+
115
+ it 'should set max value with string and coerce' do
116
+ builder.max('2016-01-01')
117
+
118
+ expect(builder.options[:max]).to eq(Date.new(2016, 1, 1))
119
+ end
120
+
121
+ end
122
+
123
+ context '#in' do
124
+
125
+ it 'should set max value with string and coerce' do
126
+ builder.in(['2016-01-01', '2016-01-02'])
127
+
128
+ expect(builder.options[:in]).to include(Date.new(2016, 1, 1))
129
+ expect(builder.options[:in]).to include(Date.new(2016, 1, 2))
130
+ end
131
+
132
+ end
133
+
134
+ end
135
+
136
+ context 'Date, DateTime and Time' do
137
+
138
+ def each_date_builder
139
+ [Date, DateTime, Time].each do |klass|
140
+ builder = Compel.send("#{klass.to_s.downcase}")
141
+
142
+ yield builder, klass
143
+ end
144
+ end
145
+
146
+ context 'in' do
147
+
148
+ def expect_raise_error_for(builder, values, klass)
149
+ expect{ builder.in(values) }.to \
150
+ raise_error \
151
+ Compel::TypeError,
152
+ "All Builder::#{klass} #in values must be a valid #{klass}"
153
+ end
154
+
155
+ it 'should set in value' do
156
+ each_date_builder do |builder, klass|
157
+ builder.in([klass.new(2016, 1, 1), klass.new(2016, 1, 2)])
158
+
159
+ expect(builder.options[:in].length).to eq 2
160
+ end
161
+ end
162
+
163
+ it 'should raise exception for invalid #in values' do
164
+ each_date_builder do |builder, klass|
165
+ expect_raise_error_for(builder, [klass.new(2016, 1, 1), 'invalid_date'], klass)
166
+ end
167
+ end
168
+
169
+ end
170
+
171
+ context '#max' do
172
+
173
+ it 'should set max value' do
174
+ each_date_builder do |builder, klass|
175
+ builder.max(klass.new(2016, 1, 1))
176
+
177
+ expect(builder.options[:max]).to eq(klass.new(2016, 1, 1))
178
+ end
179
+ end
180
+
181
+ it 'should raise exception for invalid value' do
182
+ each_date_builder do |builder, klass|
183
+ expect{ builder.max(1) }.to \
184
+ raise_error \
185
+ Compel::TypeError,
186
+ "Builder::#{klass} #max value must be a valid #{klass}"
187
+ end
188
+ end
189
+
190
+ end
191
+
192
+ context '#min' do
193
+
194
+ it 'should set min value' do
195
+ each_date_builder do |builder, klass|
196
+ builder.min(klass.new(2016, 1, 1))
197
+
198
+ expect(builder.options[:min]).to eq(klass.new(2016, 1, 1))
199
+ end
200
+ end
201
+
202
+ it 'should raise exception for invalid value' do
203
+ each_date_builder do |builder, klass|
204
+ expect{ builder.min(1) }.to \
205
+ raise_error \
206
+ Compel::TypeError,
207
+ "Builder::#{klass} #min value must be a valid #{klass}"
208
+ end
209
+ end
210
+
211
+ end
212
+
100
213
  end
101
214
 
102
215
  context 'String' do
103
216
 
104
217
  subject(:builder) { Compel.string }
105
218
 
219
+ context 'in' do
220
+
221
+ it 'should set in value' do
222
+ builder.in(['a', 'b'])
223
+
224
+ expect(builder.options[:in].length).to eq 2
225
+ end
226
+
227
+ it 'should raise exception for invalid item on array' do
228
+ expect{ builder.in([1, 'b']) }.to \
229
+ raise_error \
230
+ Compel::TypeError,
231
+ "All Builder::String #in values must be a valid String"
232
+ end
233
+
234
+ end
235
+
106
236
  context '#format' do
107
237
 
108
238
  it 'should raise exception for invalid type' do
@@ -195,6 +325,46 @@ describe Compel::Builder do
195
325
 
196
326
  end
197
327
 
328
+ context 'Array' do
329
+
330
+ it 'should raise exception for invalid type' do
331
+ expect { Compel.array.items('a') }.to \
332
+ raise_error Compel::TypeError, "#items must be a valid Schema"
333
+ end
334
+
335
+ it 'should raise exception for invalid type' do
336
+ expect { Compel.array.items('a') }.to \
337
+ raise_error Compel::TypeError, "#items must be a valid Schema"
338
+ end
339
+
340
+ it 'should have value' do
341
+ builder = Compel.array.items(Compel.integer)
342
+
343
+ expect(builder.options[:items].class).to be(Compel::Builder::Integer)
344
+ end
345
+
346
+ end
347
+
348
+ context 'Integer' do
349
+
350
+ context 'min' do
351
+
352
+ it 'should build schema' do
353
+ builder = Compel.integer.min(10)
354
+
355
+ expect(builder.options[:min]).to eq(10)
356
+ end
357
+
358
+ it 'should raise exception for invalid value' do
359
+ expect{ Compel.integer.min('ten') }.to \
360
+ raise_error \
361
+ Compel::TypeError, 'Builder::Integer #min value must be a valid Integer'
362
+ end
363
+
364
+ end
365
+
366
+ end
367
+
198
368
  end
199
369
 
200
370
  context 'Validate' do
@@ -414,6 +584,26 @@ describe Compel::Builder do
414
584
  include('is required')
415
585
  end
416
586
 
587
+ context '#required' do
588
+
589
+ it 'should validate empty keys option' do
590
+ schema = Compel.hash.required
591
+
592
+ expect(schema.validate({ a: 1 }).valid?).to be true
593
+ end
594
+
595
+ it 'should validate nil' do
596
+ schema = Compel.hash.required
597
+
598
+ result = schema.validate(nil)
599
+
600
+ expect(result.valid?).to be false
601
+ expect(result.errors[:base]).to \
602
+ include('is required')
603
+ end
604
+
605
+ end
606
+
417
607
  context '#is' do
418
608
 
419
609
  it 'should validate with errors' do
@@ -438,6 +628,18 @@ describe Compel::Builder do
438
628
 
439
629
  end
440
630
 
631
+ context '#length' do
632
+
633
+ it 'should validate empty keys with errors' do
634
+ result = Compel.hash.length(2).validate({ a: 1 })
635
+
636
+ expect(result.valid?).to be false
637
+ expect(result.errors[:base]).to \
638
+ include('cannot have length different than 2')
639
+ end
640
+
641
+ end
642
+
441
643
  end
442
644
 
443
645
  context 'String' do
@@ -450,26 +652,74 @@ describe Compel::Builder do
450
652
  include("must match format ^\\d{4}-\\d{3}$")
451
653
  end
452
654
 
655
+ context '#url' do
656
+
657
+ it 'should validate' do
658
+ result = Compel.string.url.validate('http://example.com')
659
+
660
+ expect(result.valid?).to be true
661
+ end
662
+
663
+ it 'should validate' do
664
+ result = Compel.string.url.validate('http://app.com/posts/1/comments')
665
+
666
+ expect(result.valid?).to be true
667
+ end
668
+
669
+ it 'should not validate' do
670
+ result = Compel.string.url.validate('www.example.com')
671
+
672
+ expect(result.valid?).to be false
673
+ end
674
+
675
+ it 'should not validate' do
676
+ result = Compel.string.url.validate('url')
677
+
678
+ expect(result.valid?).to be false
679
+ end
680
+
681
+ end
682
+
683
+ context '#email' do
684
+
685
+ it 'should validate' do
686
+ result = Compel.string.email.validate('example@gmail.com')
687
+
688
+ expect(result.valid?).to be true
689
+ end
690
+
691
+ it 'should not validate' do
692
+ result = Compel.string.email.validate('example@gmail')
693
+
694
+ expect(result.valid?).to be false
695
+ end
696
+
697
+ it 'should not validate' do
698
+ result = Compel.string.email.validate('email')
699
+
700
+ expect(result.valid?).to be false
701
+ end
702
+
703
+ end
704
+
453
705
  end
454
706
 
455
707
  context 'Array' do
456
708
 
457
- subject(:builder) { Compel.array }
458
-
459
709
  it 'should validate nil without errors' do
460
- result = builder.validate(nil)
710
+ result = Compel.array.validate(nil)
461
711
 
462
712
  expect(result.valid?).to be true
463
713
  end
464
714
 
465
715
  it 'should validate nil with errors' do
466
- result = builder.required.validate(nil)
716
+ result = Compel.array.required.validate(nil)
467
717
 
468
718
  expect(result.errors[:base]).to include('is required')
469
719
  end
470
720
 
471
721
  it 'should validate with errors for invalid array' do
472
- result = builder.required.validate(1)
722
+ result = Compel.array.required.validate(1)
473
723
 
474
724
  expect(result.errors[:base]).to include("'1' is not a valid Array")
475
725
  end
@@ -477,41 +727,21 @@ describe Compel::Builder do
477
727
  context '#items' do
478
728
 
479
729
  it 'should validate without items' do
480
- result = builder.validate([1, 2, 3])
730
+ result = Compel.array.validate([1, 2, 3])
481
731
 
482
732
  expect(result.valid?).to be true
483
733
  expect(result.value).to eq([1, 2, 3])
484
734
  end
485
735
 
486
- it 'should raise exception for invalid type' do
487
- expect { builder.items('a') }.to \
488
- raise_error Compel::TypeError, "#items must be a valid Schema"
489
- end
490
-
491
- it 'should raise exception for invalid type' do
492
- expect { builder.items('a') }.to \
493
- raise_error Compel::TypeError, "#items must be a valid Schema"
494
- end
495
-
496
- it 'should have value' do
497
- builder.items(Compel.integer)
498
-
499
- expect(builder.options[:items].class).to be(Compel::Builder::Integer)
500
- end
501
-
502
736
  it 'should validate all items' do
503
- builder.items(Compel.integer)
504
-
505
- result = builder.validate([1, '2', nil])
737
+ result = Compel.array.items(Compel.integer).validate([1, '2', nil])
506
738
 
507
739
  expect(result.valid?).to be true
508
740
  expect(result.value).to eq([1, 2])
509
741
  end
510
742
 
511
743
  it 'should validate all items with errors' do
512
- builder.items(Compel.float.required)
513
-
514
- result = builder.validate([1, 'a', nil])
744
+ result = Compel.array.items(Compel.float.required).validate([1, 'a', nil])
515
745
 
516
746
  expect(result.valid?).to be false
517
747
  expect(result.errors['1']).to include("'a' is not a valid Float")
@@ -519,7 +749,7 @@ describe Compel::Builder do
519
749
  end
520
750
 
521
751
  it 'should coerce all hash items' do
522
- builder.items(Compel.hash.keys({
752
+ builder = Compel.array.items(Compel.hash.keys({
523
753
  a: Compel.string.required,
524
754
  b: Compel.integer
525
755
  }))
@@ -540,7 +770,7 @@ describe Compel::Builder do
540
770
  end
541
771
 
542
772
  it 'should coerce all hash items with errors' do
543
- builder.items(Compel.hash.keys({
773
+ builder = Compel.array.items(Compel.hash.keys({
544
774
  a: Compel.string.required,
545
775
  b: Compel.string.format(/^abc$/).required
546
776
  }))
@@ -569,7 +799,7 @@ describe Compel::Builder do
569
799
  end
570
800
 
571
801
  it 'should coerce array with hash items and nested array keys with errors' do
572
- builder.items(Compel.hash.keys({
802
+ builder = Compel.array.items(Compel.hash.keys({
573
803
  a: Compel.string,
574
804
  b: Compel.array.items(Compel.integer.required).required
575
805
  }))
@@ -626,16 +856,14 @@ describe Compel::Builder do
626
856
 
627
857
  it 'should validate with errors' do
628
858
  value = [1, 2, 3]
629
- schema = builder.is(value)
630
- result = schema.validate([1, 2])
859
+ result = Compel.array.is(value).validate([1, 2])
631
860
 
632
861
  expect(result.valid?).to be false
633
862
  expect(result.errors[:base]).to include("must be #{value}")
634
863
  end
635
864
 
636
865
  it 'should validate without errors' do
637
- schema = builder.is(['a', 'b', 'c'])
638
- result = schema.validate(['a', 'b', 'c'])
866
+ result = Compel.array.is(['a', 'b', 'c']).validate(['a', 'b', 'c'])
639
867
 
640
868
  expect(result.valid?).to be true
641
869
  end
@@ -644,34 +872,14 @@ describe Compel::Builder do
644
872
 
645
873
  end
646
874
 
647
- context 'Hash' do
875
+ context 'DateTime' do
648
876
 
649
- subject(:builder) { Compel.hash }
650
-
651
- it 'should validate empty keys option' do
652
- schema = builder.required
653
-
654
- expect(schema.validate({ a: 1 }).valid?).to be true
655
- end
656
-
657
- it 'should validate nil' do
658
- schema = builder.required
659
-
660
- result = schema.validate(nil)
661
-
662
- expect(result.valid?).to be false
663
- expect(result.errors[:base]).to \
664
- include('is required')
665
- end
666
-
667
- it 'should validate empty keys with errors' do
668
- schema = builder.required.length(2)
669
-
670
- result = schema.validate({ a: 1 })
877
+ it 'should validate with errors' do
878
+ result = Compel.datetime.validate('1989-0')
671
879
 
672
880
  expect(result.valid?).to be false
673
- expect(result.errors[:base]).to \
674
- include('cannot have length different than 2')
881
+ expect(result.errors).to \
882
+ include("'1989-0' is not a parsable datetime with format: %FT%T")
675
883
  end
676
884
 
677
885
  end
@@ -27,23 +27,23 @@ describe Compel::Validation do
27
27
 
28
28
  end
29
29
 
30
- context 'in, within, range' do
30
+ context 'in, range' do
31
31
 
32
- def expect_be_in_within_range(range, value)
33
- [:in, :within].each do |key|
32
+ def expect_be_in_range(range, value)
33
+ [:in, :range].each do |key|
34
34
  errors = Compel::Validation.validate(value, Compel::Coercion::String, { key => range })
35
35
  yield errors
36
36
  end
37
37
  end
38
38
 
39
39
  it 'should validate without errors' do
40
- expect_be_in_within_range(['PT', 'UK'], 'PT') do |errors|
40
+ expect_be_in_range(['PT', 'UK'], 'PT') do |errors|
41
41
  expect(errors.empty?).to eq(true)
42
42
  end
43
43
  end
44
44
 
45
45
  it 'should validate with errors' do
46
- expect_be_in_within_range(['PT', 'UK'], 'US') do |errors|
46
+ expect_be_in_range(['PT', 'UK'], 'US') do |errors|
47
47
  expect(errors).to include('must be within ["PT", "UK"]')
48
48
  end
49
49
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: compel
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.6
4
+ version: 0.3.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joaquim Adráz
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-08 00:00:00.000000000 Z
11
+ date: 2016-01-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: hashie
@@ -104,6 +104,7 @@ files:
104
104
  - lib/compel/coercion/types/array.rb
105
105
  - lib/compel/coercion/types/boolean.rb
106
106
  - lib/compel/coercion/types/date.rb
107
+ - lib/compel/coercion/types/date_type.rb
107
108
  - lib/compel/coercion/types/datetime.rb
108
109
  - lib/compel/coercion/types/float.rb
109
110
  - lib/compel/coercion/types/hash.rb