rasti-form 1.1.1 → 2.0.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
2
  SHA1:
3
- metadata.gz: a47fae2c272d4c2dae64cea207f396aeb10da765
4
- data.tar.gz: 6cac32f2aa2372c28647139a5a638fef09b0e975
3
+ metadata.gz: 26c1c1f5dc1233ecbda35f3e19c0a6b8e286405c
4
+ data.tar.gz: 465729370df0070a7c536b6fc39c11d92a3b27fc
5
5
  SHA512:
6
- metadata.gz: 285896f0bcdc9003ea5d11215d1a944a589ef5985228fb8e4910ba4056354cc7c366743ea55ae579010f7eda90909e8c2ba8c592d512a46f63f116e28ef3a7e7
7
- data.tar.gz: 8ea5c1447fe95a4a2e5c1650f6c19df68a5abc09e4b9694d63f80dab141b48f1be0c82c7bfa0d5d40c7cab999289230995d373973bacd72c4049ee193d32fcb4
6
+ metadata.gz: ae1a7c147d82af7c2a3095a682e80899746fcc3b00aa44a0c4fb88842895f01daf577056be8b1eaa06351c0e85c12a03f4d0abe82db0ec910c97f789c98deb58
7
+ data.tar.gz: 40e2ffc9f4287a1c726c15f469575c5ed14bef3ae8a5f47eef0a49abd97b4ea127e78544cb831c7cf834bac2f1aedb30f717aba5aa1c75374847d388eb715a98
@@ -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
@@ -1,5 +1,5 @@
1
1
  module Rasti
2
2
  class Form
3
- VERSION = '1.1.1'
3
+ VERSION = '2.0.0'
4
4
  end
5
5
  end
data/lib/rasti/form.rb CHANGED
@@ -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
data/rasti-form.gemspec CHANGED
@@ -22,7 +22,7 @@ Gem::Specification.new do |spec|
22
22
 
23
23
  spec.add_development_dependency 'bundler', '~> 1.12'
24
24
  spec.add_development_dependency 'rake', '~> 11.0'
25
- spec.add_development_dependency 'minitest', '~> 5.0'
25
+ spec.add_development_dependency 'minitest', '~> 5.0', '< 5.11'
26
26
  spec.add_development_dependency 'minitest-colorin', '~> 0.1'
27
27
  spec.add_development_dependency 'minitest-line', '~> 0.6'
28
28
  spec.add_development_dependency 'simplecov', '~> 0.12'
@@ -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
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: 2.0.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: 2018-06-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: multi_require
@@ -59,6 +59,9 @@ dependencies:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
61
  version: '5.0'
62
+ - - "<"
63
+ - !ruby/object:Gem::Version
64
+ version: '5.11'
62
65
  type: :development
63
66
  prerelease: false
64
67
  version_requirements: !ruby/object:Gem::Requirement
@@ -66,6 +69,9 @@ dependencies:
66
69
  - - "~>"
67
70
  - !ruby/object:Gem::Version
68
71
  version: '5.0'
72
+ - - "<"
73
+ - !ruby/object:Gem::Version
74
+ version: '5.11'
69
75
  - !ruby/object:Gem::Dependency
70
76
  name: minitest-colorin
71
77
  requirement: !ruby/object:Gem::Requirement