rasti-form 1.1.1 → 3.1.0

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
- SHA1:
3
- metadata.gz: a47fae2c272d4c2dae64cea207f396aeb10da765
4
- data.tar.gz: 6cac32f2aa2372c28647139a5a638fef09b0e975
2
+ SHA256:
3
+ metadata.gz: d866f9b7a43e27b5a12fbe5044672018066e99d45c2cce45bc7cb80baef095c1
4
+ data.tar.gz: 9c24281985c31043750f3998c6ddc857c30830abba2a6f6128d0cfe45c5d8432
5
5
  SHA512:
6
- metadata.gz: 285896f0bcdc9003ea5d11215d1a944a589ef5985228fb8e4910ba4056354cc7c366743ea55ae579010f7eda90909e8c2ba8c592d512a46f63f116e28ef3a7e7
7
- data.tar.gz: 8ea5c1447fe95a4a2e5c1650f6c19df68a5abc09e4b9694d63f80dab141b48f1be0c82c7bfa0d5d40c7cab999289230995d373973bacd72c4049ee193d32fcb4
6
+ metadata.gz: ff8eab55df69a186a42353248bb9218ae79352057642db8ea96af007c3a2717ed908d7b1219e803af11ed87e2d0166557e22ab58c849bdffa1638353f66bc3c7
7
+ data.tar.gz: 3e102c9dae971bb5482665db5471bbf1420ba35b2c81960bcd02583b119970dd5ba54df79450fe19ab50a3134b619809d1d234a21380725375460b86b59dcd37
@@ -1 +1 @@
1
- ruby-2.4.0
1
+ ruby-2.5.7
@@ -1,15 +1,15 @@
1
1
  language: ruby
2
2
 
3
3
  rvm:
4
- - 1.9.3
5
4
  - 2.0
6
5
  - 2.1
7
6
  - 2.2
8
- - 2.3.0
9
- - 2.4.0
10
- - 2.5.0
11
- - jruby-1.7.25
12
- - jruby-9.1.7.0
7
+ - 2.3
8
+ - 2.4
9
+ - 2.5
10
+ - 2.6
11
+ - 2.7
12
+ - jruby-9.2.9.0
13
13
  - ruby-head
14
14
  - jruby-head
15
15
 
@@ -17,7 +17,4 @@ matrix:
17
17
  fast_finish: true
18
18
  allow_failures:
19
19
  - rvm: ruby-head
20
- - rvm: jruby-head
21
-
22
- before_install:
23
- - gem install bundler
20
+ - rvm: jruby-head
data/README.md CHANGED
@@ -4,7 +4,6 @@
4
4
  [![Build Status](https://travis-ci.org/gabynaiman/rasti-form.svg?branch=master)](https://travis-ci.org/gabynaiman/rasti-form)
5
5
  [![Coverage Status](https://coveralls.io/repos/github/gabynaiman/rasti-form/badge.svg?branch=master)](https://coveralls.io/github/gabynaiman/rasti-form?branch=master)
6
6
  [![Code Climate](https://codeclimate.com/github/gabynaiman/rasti-form.svg)](https://codeclimate.com/github/gabynaiman/rasti-form)
7
- [![Dependency Status](https://gemnasium.com/gabynaiman/rasti-form.svg)](https://gemnasium.com/gabynaiman/rasti-form)
8
7
 
9
8
  Forms validations and type casting
10
9
 
@@ -94,6 +93,7 @@ form.to # => 2016-10-28 00:00:00 -0300
94
93
  - Form
95
94
  - Hash
96
95
  - Integer
96
+ - IO
97
97
  - Regexp
98
98
  - String
99
99
  - Symbol
@@ -98,7 +98,7 @@ module Rasti
98
98
  rescue CastError => error
99
99
  errors[attr_name] << error.message
100
100
 
101
- rescue ValidationError => error
101
+ rescue MultiCastError, ValidationError => error
102
102
  error.errors.each do |inner_name, inner_errors|
103
103
  inner_errors.each { |message| errors["#{attr_name}.#{inner_name}"] << message }
104
104
  end
@@ -145,7 +145,11 @@ module Rasti
145
145
  end
146
146
 
147
147
  def assert_present(attribute)
148
- assert attribute, !fetch(attribute).nil?, 'not present'
148
+ assert attribute, !fetch(attribute).nil?, 'not present' unless errors.key? attribute
149
+ end
150
+
151
+ def assert_not_present(attribute)
152
+ assert attribute, fetch(attribute).nil?, 'is present'
149
153
  end
150
154
 
151
155
  def assert_not_empty(attribute)
@@ -155,6 +159,10 @@ module Rasti
155
159
  end
156
160
  end
157
161
 
162
+ def assert_time_range(attribute_from, attribute_to)
163
+ assert attribute_from, public_send(attribute_from) <= public_send(attribute_to), 'invalid time range'
164
+ end
165
+
158
166
  def assert_included_in(attribute, set)
159
167
  if assert_present attribute
160
168
  assert attribute, set.include?(fetch(attribute)), "not included in #{set.map { |e| e.is_a?(::String) ? "'#{e}'" : e.inspect }.join(', ')}"
@@ -14,7 +14,7 @@ module Rasti
14
14
 
15
15
  def transform!(value)
16
16
  transform value
17
- rescue ValidationError => ex
17
+ rescue MultiCastError, ValidationError => ex
18
18
  raise ex
19
19
  rescue
20
20
  raise CastError.new self, value
@@ -23,6 +23,26 @@ module Rasti
23
23
  end
24
24
 
25
25
 
26
+ class MultiCastError < StandardError
27
+
28
+ attr_reader :type, :value, :errors
29
+
30
+ def initialize(type, value, errors)
31
+ @type = type
32
+ @value = value
33
+ @errors = errors
34
+ end
35
+
36
+ def message
37
+ "Invalid cast: #{display_value} -> #{type} - #{JSON.dump(errors)}"
38
+ end
39
+
40
+ def display_value
41
+ value.is_a?(::String) ? "'#{value}'" : value.inspect
42
+ end
43
+
44
+ end
45
+
26
46
  class ValidationError < StandardError
27
47
 
28
48
  attr_reader :scope, :errors
@@ -27,7 +27,25 @@ module Rasti
27
27
  end
28
28
 
29
29
  def transform(value)
30
- value.map { |e| type.cast e }
30
+ result = []
31
+ errors = {}
32
+
33
+ value.each_with_index do |e,i|
34
+ index = i + 1
35
+ begin
36
+ result << type.cast(e)
37
+ rescue ValidationError => error
38
+ error.errors.each do |k,v|
39
+ errors["#{index}.#{k}"] = v
40
+ end
41
+ rescue => error
42
+ errors[index] = [error.message]
43
+ end
44
+ end
45
+
46
+ raise MultiCastError.new(self, value, errors) unless errors.empty?
47
+
48
+ result
31
49
  end
32
50
 
33
51
  end
@@ -0,0 +1,23 @@
1
+ module Rasti
2
+ class Form
3
+ module Types
4
+ class IO
5
+ class << self
6
+
7
+ include Castable
8
+
9
+ private
10
+
11
+ def valid?(value)
12
+ value.respond_to?(:read) && value.respond_to?(:write)
13
+ end
14
+
15
+ def transform(value)
16
+ value
17
+ end
18
+
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -2,26 +2,21 @@ module Rasti
2
2
  class Form
3
3
  module Types
4
4
  class Regexp
5
+ class << self
5
6
 
6
- include Formatable
7
+ include Castable
7
8
 
8
- def self.[](format)
9
- new format
10
- end
9
+ private
11
10
 
12
- def to_s
13
- "#{self.class}[#{format.inspect}]"
14
- end
15
- alias_method :inspect, :to_s
11
+ def valid?(value)
12
+ value.is_a?(::Regexp) || value.is_a?(::String)
13
+ end
16
14
 
17
- private
18
-
19
- attr_reader :format
15
+ def transform(value)
16
+ value.is_a?(::Regexp) ? value.source : ::Regexp.compile(value).source
17
+ end
20
18
 
21
- def initialize(format)
22
- @format = format.is_a?(String) ? ::Regexp.new(format) : format
23
19
  end
24
-
25
20
  end
26
21
  end
27
22
  end
@@ -5,11 +5,28 @@ module Rasti
5
5
  class << self
6
6
 
7
7
  include Castable
8
-
8
+
9
+ def [](format)
10
+ Class.new(self) do
11
+ @format = format.is_a?(::String) ? ::Regexp.new(format) : format
12
+ end
13
+ end
14
+
15
+ def to_s
16
+ name || "#{superclass.name}[#{format.inspect}]"
17
+ end
18
+ alias_method :inspect, :to_s
19
+
9
20
  private
10
21
 
22
+ attr_reader :format
23
+
11
24
  def valid?(value)
12
- !value.nil? && value.respond_to?(:to_s)
25
+ !value.nil? && value.respond_to?(:to_s) && valid_format?(value)
26
+ end
27
+
28
+ def valid_format?(value)
29
+ format.nil? || !value.to_s.match(format).nil?
13
30
  end
14
31
 
15
32
  def transform(value)
@@ -1,19 +1,7 @@
1
1
  module Rasti
2
2
  class Form
3
3
  module Types
4
- class UUID
5
- class << self
6
-
7
- include Formatable
8
-
9
- private
10
-
11
- def format
12
- /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}+$/
13
- end
14
-
15
- end
16
- end
4
+ UUID = String[/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}+$/]
17
5
  end
18
6
  end
19
7
  end
@@ -23,6 +23,13 @@ module Rasti
23
23
  false
24
24
  end
25
25
 
26
+ def assert_not_error(key)
27
+ yield
28
+ true
29
+ rescue => error
30
+ assert key, false, error.message
31
+ end
32
+
26
33
  end
27
34
  end
28
35
  end
@@ -1,5 +1,5 @@
1
1
  module Rasti
2
2
  class Form
3
- VERSION = '1.1.1'
3
+ VERSION = '3.1.0'
4
4
  end
5
5
  end
@@ -20,9 +20,8 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.add_runtime_dependency 'multi_require', '~> 1.0'
22
22
 
23
- spec.add_development_dependency 'bundler', '~> 1.12'
24
- spec.add_development_dependency 'rake', '~> 11.0'
25
- spec.add_development_dependency 'minitest', '~> 5.0'
23
+ spec.add_development_dependency 'rake', '~> 12.0'
24
+ spec.add_development_dependency 'minitest', '~> 5.0', '< 5.11'
26
25
  spec.add_development_dependency 'minitest-colorin', '~> 0.1'
27
26
  spec.add_development_dependency 'minitest-line', '~> 0.6'
28
27
  spec.add_development_dependency 'simplecov', '~> 0.12'
@@ -8,7 +8,7 @@ describe Rasti::Form do
8
8
 
9
9
  def build_form(&block)
10
10
  Class.new(Rasti::Form) do
11
- class_eval &block
11
+ class_eval(&block)
12
12
  end
13
13
  end
14
14
 
@@ -141,6 +141,23 @@ describe Rasti::Form do
141
141
 
142
142
  describe 'Validations' do
143
143
 
144
+ it 'Not error' do
145
+ form = build_form do
146
+ attribute :text, Rasti::Form::Types::String
147
+
148
+ def validate
149
+ assert_not_error :text do
150
+ raise 'Invalid text' if text.nil?
151
+ end
152
+ end
153
+ end
154
+
155
+ proc { form.new text: 'text' }.must_be_silent
156
+
157
+ error = proc { form.new }.must_raise Rasti::Form::ValidationError
158
+ error.message.must_equal 'Validation error: #<Rasti::Form[]> {"text":["Invalid text"]}'
159
+ end
160
+
144
161
  it 'Required' do
145
162
  form = build_form do
146
163
  attribute :text, Rasti::Form::Types::String
@@ -150,10 +167,42 @@ describe Rasti::Form do
150
167
  end
151
168
  end
152
169
 
170
+ proc { form.new text: 'text' }.must_be_silent
171
+
153
172
  error = proc { form.new }.must_raise Rasti::Form::ValidationError
154
173
  error.message.must_equal 'Validation error: #<Rasti::Form[]> {"text":["not present"]}'
155
174
  end
156
175
 
176
+ it 'Required when cast failed' do
177
+ form = build_form do
178
+ attribute :number, Rasti::Form::Types::Integer
179
+
180
+ def validate
181
+ assert_present :number
182
+ end
183
+ end
184
+
185
+ proc { form.new number: 1 }.must_be_silent
186
+
187
+ error = proc { form.new number: 'text' }.must_raise Rasti::Form::ValidationError
188
+ error.message.must_equal "Validation error: #<Rasti::Form[]> {\"number\":[\"Invalid cast: 'text' -> Rasti::Form::Types::Integer\"]}"
189
+ end
190
+
191
+ it 'Not required' do
192
+ form = build_form do
193
+ attribute :text, Rasti::Form::Types::String
194
+
195
+ def validate
196
+ assert_not_present :text
197
+ end
198
+ end
199
+
200
+ proc { form.new }.must_be_silent
201
+
202
+ error = proc { form.new text: 'text' }.must_raise Rasti::Form::ValidationError
203
+ error.message.must_equal 'Validation error: #<Rasti::Form[text: "text"]> {"text":["is present"]}'
204
+ end
205
+
157
206
  it 'Not empty string' do
158
207
  form = build_form do
159
208
  attribute :text, Rasti::Form::Types::String
@@ -163,6 +212,8 @@ describe Rasti::Form do
163
212
  end
164
213
  end
165
214
 
215
+ proc { form.new text: 'text' }.must_be_silent
216
+
166
217
  error = proc { form.new text: ' ' }.must_raise Rasti::Form::ValidationError
167
218
  error.message.must_equal 'Validation error: #<Rasti::Form[text: " "]> {"text":["is empty"]}'
168
219
  end
@@ -176,6 +227,8 @@ describe Rasti::Form do
176
227
  end
177
228
  end
178
229
 
230
+ proc { form.new array: ['text'] }.must_be_silent
231
+
179
232
  error = proc { form.new array: [] }.must_raise Rasti::Form::ValidationError
180
233
  error.message.must_equal 'Validation error: #<Rasti::Form[array: []]> {"array":["is empty"]}'
181
234
  end
@@ -189,10 +242,31 @@ describe Rasti::Form do
189
242
  end
190
243
  end
191
244
 
245
+ proc { form.new text: 'value_1' }.must_be_silent
246
+
192
247
  error = proc { form.new text: 'xyz' }.must_raise Rasti::Form::ValidationError
193
248
  error.message.must_equal 'Validation error: #<Rasti::Form[text: "xyz"]> {"text":["not included in \'value_1\', \'value_2\'"]}'
194
249
  end
195
250
 
251
+ it 'Time range' do
252
+ form = build_form do
253
+ attribute :from, Rasti::Form::Types::Time['%Y-%m-%d %H:%M:%S %Z']
254
+ attribute :to, Rasti::Form::Types::Time['%Y-%m-%d %H:%M:%S %Z']
255
+
256
+ def validate
257
+ assert_time_range :from, :to
258
+ end
259
+ end
260
+
261
+ from = Time.parse '2018-01-01 03:10:00'
262
+ to = Time.parse '2018-01-01 15:30:00'
263
+
264
+ proc { form.new from: from, to: to }.must_be_silent
265
+
266
+ error = proc { form.new from: to.to_s, to: from.to_s }.must_raise Rasti::Form::ValidationError
267
+ error.message.must_equal "Validation error: #<Rasti::Form[from: #{to}, to: #{from}]> {\"from\":[\"invalid time range\"]}"
268
+ end
269
+
196
270
  it 'Nested form' do
197
271
  form = build_form do
198
272
  attribute :range, Rasti::Form::Types::Form[min: Rasti::Form::Types::Integer, max: Rasti::Form::Types::Integer]
@@ -203,6 +277,8 @@ describe Rasti::Form do
203
277
  end
204
278
  end
205
279
 
280
+ proc { form.new range: {min: 1, max: 2} }.must_be_silent
281
+
206
282
  error = proc { form.new }.must_raise Rasti::Form::ValidationError
207
283
  error.message.must_equal 'Validation error: #<Rasti::Form[]> {"range.min":["not present"],"range.max":["not present"]}'
208
284
  end
@@ -219,7 +295,9 @@ describe Rasti::Form do
219
295
 
220
296
  form = build_form do
221
297
  attribute :range, Rasti::Form::Types::Form[range]
222
- end
298
+ end
299
+
300
+ proc { form.new range: {min: 1, max: 2} }.must_be_silent
223
301
 
224
302
  error = proc { form.new range: {min: 2, max: 1} }.must_raise Rasti::Form::ValidationError
225
303
  error.message.must_equal 'Validation error: #<Rasti::Form[]> {"range.min":["Min must be less than Max"]}'
@@ -2,21 +2,53 @@ require 'minitest_helper'
2
2
 
3
3
  describe Rasti::Form::Types::Array do
4
4
 
5
- array = [1, '2', Time.now]
5
+ VALID_ARRAY = [1, '2', Time.now]
6
+ INVALID_ARRAY = [nil, 1, 'text', :symbol, {a: 1, b: 2}, Object.new]
6
7
 
7
- it "#{array.inspect} -> #{array.map(&:to_i)}" do
8
- Rasti::Form::Types::Array[Rasti::Form::Types::Integer].cast(array).must_equal array.map(&:to_i)
8
+ it "#{VALID_ARRAY.inspect} -> #{VALID_ARRAY.map(&:to_i)}" do
9
+ Rasti::Form::Types::Array[Rasti::Form::Types::Integer].cast(VALID_ARRAY).must_equal VALID_ARRAY.map(&:to_i)
9
10
  end
10
11
 
11
- it "#{array.inspect} -> #{array.map(&:to_s)}" do
12
- Rasti::Form::Types::Array[Rasti::Form::Types::String].cast(array).must_equal array.map(&:to_s)
12
+ it "#{VALID_ARRAY.inspect} -> #{VALID_ARRAY.map(&:to_s)}" do
13
+ Rasti::Form::Types::Array[Rasti::Form::Types::String].cast(VALID_ARRAY).must_equal VALID_ARRAY.map(&:to_s)
13
14
  end
14
15
 
15
- [[nil], nil, 1, 'text', :symbol, {a: 1, b: 2}, Object.new].each do |value|
16
+ INVALID_ARRAY.each do |value|
16
17
  it "#{value.inspect} -> CastError" do
17
18
  error = proc { Rasti::Form::Types::Array[Rasti::Form::Types::String].cast(value) }.must_raise Rasti::Form::CastError
18
19
  error.message.must_equal "Invalid cast: #{as_string(value)} -> Rasti::Form::Types::Array[Rasti::Form::Types::String]"
19
20
  end
20
21
  end
21
22
 
23
+ describe 'Multi cast errors' do
24
+
25
+ it 'Array of integers' do
26
+ array = [1, 2 , 'a', 3, 'c', 4, nil]
27
+ error = proc { Rasti::Form::Types::Array[Rasti::Form::Types::Integer].cast(array) }.must_raise Rasti::Form::MultiCastError
28
+ error.errors.must_equal 3 => ["Invalid cast: 'a' -> Rasti::Form::Types::Integer"],
29
+ 5 => ["Invalid cast: 'c' -> Rasti::Form::Types::Integer"],
30
+ 7 => ["Invalid cast: nil -> Rasti::Form::Types::Integer"]
31
+ error.message.must_equal "Invalid cast: [1, 2, \"a\", 3, \"c\", 4, nil] -> Rasti::Form::Types::Array[Rasti::Form::Types::Integer] - {\"3\":[\"Invalid cast: 'a' -> Rasti::Form::Types::Integer\"],\"5\":[\"Invalid cast: 'c' -> Rasti::Form::Types::Integer\"],\"7\":[\"Invalid cast: nil -> Rasti::Form::Types::Integer\"]}"
32
+ end
33
+
34
+ it 'Array of forms' do
35
+ inner_form_class = Rasti::Form::Types::Form[x: Rasti::Form::Types::Integer, y: Rasti::Form::Types::Integer]
36
+ form_class = Rasti::Form[points: Rasti::Form::Types::Array[inner_form_class]]
37
+
38
+ error = proc do
39
+ form_class.new points: [
40
+ {x: 1, y: 2},
41
+ {x: 'a', y: 2},
42
+ {x: 1, y: 'b'},
43
+ {x: 3, y: 4}
44
+ ]
45
+ end.must_raise Rasti::Form::ValidationError
46
+
47
+ error.errors.must_equal 'points.2.x' => ["Invalid cast: 'a' -> Rasti::Form::Types::Integer"],
48
+ 'points.3.y' => ["Invalid cast: 'b' -> Rasti::Form::Types::Integer"]
49
+ error.message.must_equal "Validation error: #<Rasti::Form[]> {\"points.2.x\":[\"Invalid cast: 'a' -> Rasti::Form::Types::Integer\"],\"points.3.y\":[\"Invalid cast: 'b' -> Rasti::Form::Types::Integer\"]}"
50
+ end
51
+
52
+ end
53
+
22
54
  end
@@ -0,0 +1,18 @@
1
+ require 'minitest_helper'
2
+
3
+ describe Rasti::Form::Types::IO do
4
+
5
+ [StringIO.new, File.new(__FILE__)].each do |value|
6
+ it "#{value.inspect} -> #{value}" do
7
+ Rasti::Form::Types::IO.cast(value).must_equal value
8
+ end
9
+ end
10
+
11
+ [nil, 'text', 123, :symbol, [1,2], {a: 1, b: 2}, Object.new].each do |value|
12
+ it "#{value.inspect} -> CastError" do
13
+ error = proc { Rasti::Form::Types::IO.cast(value) }.must_raise Rasti::Form::CastError
14
+ error.message.must_equal "Invalid cast: #{as_string(value)} -> Rasti::Form::Types::IO"
15
+ end
16
+ end
17
+
18
+ end
@@ -2,18 +2,16 @@ require 'minitest_helper'
2
2
 
3
3
  describe Rasti::Form::Types::Regexp do
4
4
 
5
- email_regexp = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i
6
-
7
- ['user@mail.com'.to_sym, 'user.name-123@mail-test.com.ar'].each do |value|
8
- it "#{value.inspect} -> #{value.to_s}" do
9
- Rasti::Form::Types::Regexp[email_regexp].cast(value).must_equal value
5
+ ['[a-z]', /[a-z]/].each do |value|
6
+ it "#{value.inspect} -> #{Regexp.new(value).inspect}" do
7
+ Rasti::Form::Types::Regexp.cast(value).must_equal Regexp.new(value).source
10
8
  end
11
9
  end
12
10
 
13
- [nil, 'text', :symbol, '999'.to_sym, [1,2], {a: 1, b: 2}, Object.new, 5].each do |value|
11
+ [nil, '[a-z', :symbol, [1,2], {a: 1, b: 2}, Object.new, 5].each do |value|
14
12
  it "#{value.inspect} -> CastError" do
15
- error = proc { Rasti::Form::Types::Regexp[email_regexp].cast(value) }.must_raise Rasti::Form::CastError
16
- error.message.must_equal "Invalid cast: #{as_string(value)} -> Rasti::Form::Types::Regexp[#{as_string(email_regexp)}]"
13
+ error = proc { Rasti::Form::Types::Regexp.cast(value) }.must_raise Rasti::Form::CastError
14
+ error.message.must_equal "Invalid cast: #{as_string(value)} -> Rasti::Form::Types::Regexp"
17
15
  end
18
16
  end
19
17
 
@@ -0,0 +1,20 @@
1
+ require 'minitest_helper'
2
+
3
+ describe Rasti::Form::Types::String, 'Formatted' do
4
+
5
+ email_regexp = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i
6
+
7
+ ['user@mail.com'.to_sym, 'user.name-123@mail-test.com.ar'].each do |value|
8
+ it "#{value.inspect} -> #{value.to_s}" do
9
+ Rasti::Form::Types::String[email_regexp].cast(value).must_equal value.to_s
10
+ end
11
+ end
12
+
13
+ [nil, 'text', :symbol, '999'.to_sym, [1,2], {a: 1, b: 2}, Object.new, 5].each do |value|
14
+ it "#{value.inspect} -> CastError" do
15
+ error = proc { Rasti::Form::Types::String[email_regexp].cast(value) }.must_raise Rasti::Form::CastError
16
+ error.message.must_equal "Invalid cast: #{as_string(value)} -> Rasti::Form::Types::String[#{as_string(email_regexp)}]"
17
+ end
18
+ end
19
+
20
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rasti-form
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.1
4
+ version: 3.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gabriel Naiman
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-12-29 00:00:00.000000000 Z
11
+ date: 2020-07-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: multi_require
@@ -24,34 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.0'
27
- - !ruby/object:Gem::Dependency
28
- name: bundler
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - "~>"
32
- - !ruby/object:Gem::Version
33
- version: '1.12'
34
- type: :development
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - "~>"
39
- - !ruby/object:Gem::Version
40
- version: '1.12'
41
27
  - !ruby/object:Gem::Dependency
42
28
  name: rake
43
29
  requirement: !ruby/object:Gem::Requirement
44
30
  requirements:
45
31
  - - "~>"
46
32
  - !ruby/object:Gem::Version
47
- version: '11.0'
33
+ version: '12.0'
48
34
  type: :development
49
35
  prerelease: false
50
36
  version_requirements: !ruby/object:Gem::Requirement
51
37
  requirements:
52
38
  - - "~>"
53
39
  - !ruby/object:Gem::Version
54
- version: '11.0'
40
+ version: '12.0'
55
41
  - !ruby/object:Gem::Dependency
56
42
  name: minitest
57
43
  requirement: !ruby/object:Gem::Requirement
@@ -59,6 +45,9 @@ dependencies:
59
45
  - - "~>"
60
46
  - !ruby/object:Gem::Version
61
47
  version: '5.0'
48
+ - - "<"
49
+ - !ruby/object:Gem::Version
50
+ version: '5.11'
62
51
  type: :development
63
52
  prerelease: false
64
53
  version_requirements: !ruby/object:Gem::Requirement
@@ -66,6 +55,9 @@ dependencies:
66
55
  - - "~>"
67
56
  - !ruby/object:Gem::Version
68
57
  version: '5.0'
58
+ - - "<"
59
+ - !ruby/object:Gem::Version
60
+ version: '5.11'
69
61
  - !ruby/object:Gem::Dependency
70
62
  name: minitest-colorin
71
63
  requirement: !ruby/object:Gem::Requirement
@@ -156,7 +148,6 @@ files:
156
148
  - lib/rasti/form.rb
157
149
  - lib/rasti/form/castable.rb
158
150
  - lib/rasti/form/errors.rb
159
- - lib/rasti/form/formatable.rb
160
151
  - lib/rasti/form/types/array.rb
161
152
  - lib/rasti/form/types/boolean.rb
162
153
  - lib/rasti/form/types/enum.rb
@@ -164,6 +155,7 @@ files:
164
155
  - lib/rasti/form/types/form.rb
165
156
  - lib/rasti/form/types/hash.rb
166
157
  - lib/rasti/form/types/integer.rb
158
+ - lib/rasti/form/types/io.rb
167
159
  - lib/rasti/form/types/regexp.rb
168
160
  - lib/rasti/form/types/string.rb
169
161
  - lib/rasti/form/types/symbol.rb
@@ -182,7 +174,9 @@ files:
182
174
  - spec/types/form_spec.rb
183
175
  - spec/types/hash_spec.rb
184
176
  - spec/types/integer_spec.rb
177
+ - spec/types/io_spec.rb
185
178
  - spec/types/regexp_spec.rb
179
+ - spec/types/string_formatted_spec.rb
186
180
  - spec/types/string_spec.rb
187
181
  - spec/types/symbol_spec.rb
188
182
  - spec/types/time_spec.rb
@@ -206,8 +200,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
206
200
  - !ruby/object:Gem::Version
207
201
  version: '0'
208
202
  requirements: []
209
- rubyforge_project:
210
- rubygems_version: 2.6.8
203
+ rubygems_version: 3.0.6
211
204
  signing_key:
212
205
  specification_version: 4
213
206
  summary: Forms validations and type casting
@@ -222,7 +215,9 @@ test_files:
222
215
  - spec/types/form_spec.rb
223
216
  - spec/types/hash_spec.rb
224
217
  - spec/types/integer_spec.rb
218
+ - spec/types/io_spec.rb
225
219
  - spec/types/regexp_spec.rb
220
+ - spec/types/string_formatted_spec.rb
226
221
  - spec/types/string_spec.rb
227
222
  - spec/types/symbol_spec.rb
228
223
  - spec/types/time_spec.rb
@@ -1,19 +0,0 @@
1
- module Rasti
2
- class Form
3
- module Formatable
4
-
5
- include Castable
6
-
7
- private
8
-
9
- def valid?(value)
10
- (value.is_a?(::String) || value.is_a?(Symbol)) && value.to_s.match(format)
11
- end
12
-
13
- def transform(value)
14
- value
15
- end
16
-
17
- end
18
- end
19
- end