validates_serialized 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/Gemfile.lock +2 -2
- data/README.md +23 -1
- data/lib/validates_serialized/validateable_array_value.rb +13 -0
- data/lib/validates_serialized/validators/array_block_validator.rb +65 -0
- data/lib/validates_serialized/version.rb +1 -1
- data/lib/validates_serialized.rb +2 -1
- data/spec/validateable_array_value_spec.rb +20 -0
- data/spec/validators/array_block_validator_spec.rb +92 -0
- metadata +8 -5
- data/lib/validates_serialized/validateable_array.rb +0 -9
- data/spec/validateable_array_spec.rb +0 -15
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
OTc4ZmQ5ZGFhNDlmOGEwZGI0NzI1NzA1NWQ0OTZmY2UyMTdlN2MxNA==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
Y2VlNTQ5NjViNzExZmZlZGFkNDMwNzAyZjExNjkyYTM1OTVmYWFjMw==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
ODM1ODIzYmIzYjIyZTVhOWU0NjJjMjkxODI0MGUxMjdmZWM2MWYzOWIyYzBl
|
10
|
+
NmZhOThlN2VjZWRiNjJlMDBjYWIzYzAyMDI0MzE2ZDgwZWUwMDRkMTkxMTQw
|
11
|
+
MmQzYzZmMDlmZWQ0NjIyMTBlNDhhNWQyYWUwNjkzMjZiMzM2NmI=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
ZmY2ZGJkMzc0MGFkOTJlYjFiMmUwNTZmNzkxMGJlM2ZjMjZhYzY0NWU0MTAw
|
14
|
+
Y2JjMmIyYWM0MDUyNDkzNjdmMzI2YTYwYTM2ZWIyNmNlNGNkNzkxZTBjZTY1
|
15
|
+
ZWYzZTY5NTY5ZjFkY2E5YmUwMGM0OTU2ODFhMmI4ZjYzZDk2Mzc=
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -122,7 +122,7 @@ comment.valid? #=> false
|
|
122
122
|
comment.errors[:ratings] #=> ["ratings must be greater than 0"]
|
123
123
|
```
|
124
124
|
|
125
|
-
## Validating a serialized array
|
125
|
+
## Validating a serialized array (syntax #1)
|
126
126
|
```ruby
|
127
127
|
class Comment < ActiveRecord::Base
|
128
128
|
include ActiveModel
|
@@ -142,6 +142,28 @@ comment.valid? #=> false
|
|
142
142
|
comment.errors[:tags] #=> ["tags is too short (minimum is 4 characters)"]
|
143
143
|
```
|
144
144
|
|
145
|
+
## Validating a serialized array (syntax #2)
|
146
|
+
```ruby
|
147
|
+
class Comment < ActiveRecord::Base
|
148
|
+
include ActiveModel
|
149
|
+
...
|
150
|
+
|
151
|
+
serialize :tags, Array
|
152
|
+
validates_each_in_array :tags do
|
153
|
+
validates :value, length: { minimum: 4 } #the attribute 'value' with access each value
|
154
|
+
end
|
155
|
+
end
|
156
|
+
|
157
|
+
# With valid hash
|
158
|
+
comment = Comment.new(tags: ["ruby" "rails"])
|
159
|
+
comment.valid? #=> true
|
160
|
+
|
161
|
+
# With invalid hash
|
162
|
+
comment = Comment.new(tags: ["ruby" "rails", "ror"])
|
163
|
+
comment.valid? #=> false
|
164
|
+
comment.errors[:tags] #=> ["tags is too short (minimum is 4 characters)"]
|
165
|
+
```
|
166
|
+
|
145
167
|
## Contributing
|
146
168
|
|
147
169
|
1. Fork it
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module ActiveModel
|
2
|
+
module Validations
|
3
|
+
class ArrayBlockValidator < BlockValidator #:nodoc:
|
4
|
+
def initialize(options, &block)
|
5
|
+
@block = block
|
6
|
+
@options = options
|
7
|
+
super
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
def validate_each(record, attribute, array)
|
12
|
+
raise TypeError, "#{attribute} is not an Array" unless array.is_a?(Array)
|
13
|
+
errors = get_serialized_object_errors(array)
|
14
|
+
add_errors_to_record(record, attribute, errors)
|
15
|
+
end
|
16
|
+
|
17
|
+
def get_serialized_object_errors(array)
|
18
|
+
messages = []
|
19
|
+
array.each do |value|
|
20
|
+
serialized_object = ValidateableArrayValue.new(value)
|
21
|
+
serialized_object.class_eval &@block
|
22
|
+
serialized_object.valid?
|
23
|
+
message = serialized_object.errors.messages[:value]
|
24
|
+
messages << message unless message.blank?
|
25
|
+
end
|
26
|
+
messages
|
27
|
+
end
|
28
|
+
|
29
|
+
def add_errors_to_record(record, attribute, error_array)
|
30
|
+
error_array.each do |value|
|
31
|
+
text = value.join(", ")
|
32
|
+
message = "#{attribute} has a value that #{text}"
|
33
|
+
record.errors.add(attribute, message)
|
34
|
+
end
|
35
|
+
if exception = options[:strict]
|
36
|
+
exception = ActiveModel::StrictValidationFailed if exception == true
|
37
|
+
exception_message = record.errors[attribute].join(", ")
|
38
|
+
raise exception, exception_message unless exception_message.blank?
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
# def get_message_from_error_hash(error_hash)
|
43
|
+
# message = nil
|
44
|
+
# error_hash.each_pair do |key, array|
|
45
|
+
# message = array.join(", ")
|
46
|
+
# end
|
47
|
+
# message
|
48
|
+
# end
|
49
|
+
end
|
50
|
+
|
51
|
+
module ClassMethods
|
52
|
+
# Helper to accept arguments in the style of the +validates+ class method
|
53
|
+
def validates_each_in_array(*attr_names, &block)
|
54
|
+
raise ArgumentError, "You need to supply at least one attribute" if attr_names.empty?
|
55
|
+
validates_with ArrayBlockValidator, _merge_attributes(attr_names), &block
|
56
|
+
end
|
57
|
+
|
58
|
+
def validates_each_in_array!(*attr_names, &block)
|
59
|
+
options = attr_names.extract_options!
|
60
|
+
options[:strict] = true
|
61
|
+
validates_each_in_array(*(attr_names << options), &block)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
data/lib/validates_serialized.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
require 'validates_serialized/version'
|
2
|
-
require 'validates_serialized/
|
2
|
+
require 'validates_serialized/validateable_array_value'
|
3
3
|
require 'validates_serialized/validateable_hash'
|
4
4
|
require 'validates_serialized/validateable_object'
|
5
5
|
require 'validates_serialized/each_validator'
|
6
6
|
require 'validates_serialized/validators/serialized_validator'
|
7
7
|
require 'validates_serialized/validators/array_validator'
|
8
|
+
require 'validates_serialized/validators/array_block_validator'
|
8
9
|
require 'validates_serialized/validators/hash_validator'
|
9
10
|
require 'validates_serialized/validators/hash_block_validator'
|
10
11
|
require 'validates_serialized/validators/object_block_validator'
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ValidateableArrayValue do
|
4
|
+
let!(:array) { [1, 2, 3] }
|
5
|
+
let!(:value) { array.first }
|
6
|
+
|
7
|
+
subject { described_class.new(value) }
|
8
|
+
|
9
|
+
it "responds to valid?" do
|
10
|
+
subject.should be_valid
|
11
|
+
end
|
12
|
+
|
13
|
+
it "responds to .errors" do
|
14
|
+
subject.errors.should be_empty
|
15
|
+
end
|
16
|
+
|
17
|
+
it "returns itself on :value method" do
|
18
|
+
subject.value.should eq(1)
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'ostruct'
|
3
|
+
|
4
|
+
describe ActiveModel::Validations::ArrayBlockValidator do
|
5
|
+
context "#validates_each_in_array" do
|
6
|
+
class ValidatorBlockArrayTestOne
|
7
|
+
include ActiveModel::Validations
|
8
|
+
|
9
|
+
def initialize(h={})
|
10
|
+
h.each {|k,v| send("#{k}=",v)}
|
11
|
+
end
|
12
|
+
|
13
|
+
def my_attr
|
14
|
+
@my_attr ||= []
|
15
|
+
end
|
16
|
+
|
17
|
+
def my_attr=(val)
|
18
|
+
@my_attr = val
|
19
|
+
end
|
20
|
+
|
21
|
+
validates_each_in_array :my_attr do
|
22
|
+
validates :value, presence: true
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
it "does not raise error for valid value" do
|
27
|
+
record = ValidatorBlockArrayTestOne.new(my_attr: [2, 4])
|
28
|
+
record.valid?
|
29
|
+
record.errors[:my_attr].should eq([])
|
30
|
+
end
|
31
|
+
|
32
|
+
it "adds error for invalid value" do
|
33
|
+
record = ValidatorBlockArrayTestOne.new(my_attr: [nil, 4])
|
34
|
+
record.valid?
|
35
|
+
record.errors[:my_attr].should eq(["my_attr has a value that can't be blank"])
|
36
|
+
end
|
37
|
+
|
38
|
+
it "adds multiple errors for multiple invalid value" do
|
39
|
+
record = ValidatorBlockArrayTestOne.new(my_attr: [nil, 4, nil])
|
40
|
+
record.valid?
|
41
|
+
record.errors[:my_attr].should eq(["my_attr has a value that can't be blank", "my_attr has a value that can't be blank"])
|
42
|
+
end
|
43
|
+
|
44
|
+
it "raises error for non-array" do
|
45
|
+
record = ValidatorBlockArrayTestOne.new(my_attr: 4)
|
46
|
+
expect { record.valid? }.to raise_error(TypeError, 'my_attr is not an Array')
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
context "#validates_each_in_array!" do
|
51
|
+
class ValidatorBlockArrayTestStrict
|
52
|
+
include ActiveModel::Validations
|
53
|
+
|
54
|
+
def initialize(h={})
|
55
|
+
h.each {|k,v| send("#{k}=",v)}
|
56
|
+
end
|
57
|
+
|
58
|
+
def my_attr
|
59
|
+
@my_attr ||= {}
|
60
|
+
end
|
61
|
+
|
62
|
+
def my_attr=(val)
|
63
|
+
@my_attr = val
|
64
|
+
end
|
65
|
+
|
66
|
+
validates_each_in_array! :my_attr do
|
67
|
+
validates :value, inclusion: { in: [1, 2, 3, 4] }
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
it "does not raise error for valid value" do
|
72
|
+
record = ValidatorBlockArrayTestStrict.new(my_attr: [2, 3])
|
73
|
+
record.valid?
|
74
|
+
record.errors[:my_attr].should eq([])
|
75
|
+
end
|
76
|
+
|
77
|
+
it "raises error for invalid value" do
|
78
|
+
record = ValidatorBlockArrayTestStrict.new(my_attr: [2, 5])
|
79
|
+
expect { record.valid? }.to raise_error(ActiveModel::StrictValidationFailed, 'my_attr has a value that is not included in the list')
|
80
|
+
end
|
81
|
+
|
82
|
+
it "raises error for multiple invalid value" do
|
83
|
+
record = ValidatorBlockArrayTestStrict.new(my_attr: [nil, 9])
|
84
|
+
expect { record.valid? }.to raise_error(ActiveModel::StrictValidationFailed, "my_attr has a value that is not included in the list, my_attr has a value that is not included in the list")
|
85
|
+
end
|
86
|
+
|
87
|
+
it "raises error for non-array" do
|
88
|
+
record = ValidatorBlockArrayTestStrict.new(my_attr: 4)
|
89
|
+
expect { record.valid? }.to raise_error(TypeError, 'my_attr is not an Array')
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: validates_serialized
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- brycesenz
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-01-
|
11
|
+
date: 2015-01-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|
@@ -101,9 +101,10 @@ files:
|
|
101
101
|
- README.md
|
102
102
|
- lib/validates_serialized.rb
|
103
103
|
- lib/validates_serialized/each_validator.rb
|
104
|
-
- lib/validates_serialized/
|
104
|
+
- lib/validates_serialized/validateable_array_value.rb
|
105
105
|
- lib/validates_serialized/validateable_hash.rb
|
106
106
|
- lib/validates_serialized/validateable_object.rb
|
107
|
+
- lib/validates_serialized/validators/array_block_validator.rb
|
107
108
|
- lib/validates_serialized/validators/array_validator.rb
|
108
109
|
- lib/validates_serialized/validators/hash_block_validator.rb
|
109
110
|
- lib/validates_serialized/validators/hash_validator.rb
|
@@ -114,9 +115,10 @@ files:
|
|
114
115
|
- spec/acceptance_spec.rb
|
115
116
|
- spec/each_validator_spec.rb
|
116
117
|
- spec/spec_helper.rb
|
117
|
-
- spec/
|
118
|
+
- spec/validateable_array_value_spec.rb
|
118
119
|
- spec/validateable_hash_spec.rb
|
119
120
|
- spec/validateable_object_spec.rb
|
121
|
+
- spec/validators/array_block_validator_spec.rb
|
120
122
|
- spec/validators/array_validator_spec.rb
|
121
123
|
- spec/validators/hash_block_validator_spec.rb
|
122
124
|
- spec/validators/hash_validator_spec.rb
|
@@ -151,9 +153,10 @@ test_files:
|
|
151
153
|
- spec/acceptance_spec.rb
|
152
154
|
- spec/each_validator_spec.rb
|
153
155
|
- spec/spec_helper.rb
|
154
|
-
- spec/
|
156
|
+
- spec/validateable_array_value_spec.rb
|
155
157
|
- spec/validateable_hash_spec.rb
|
156
158
|
- spec/validateable_object_spec.rb
|
159
|
+
- spec/validators/array_block_validator_spec.rb
|
157
160
|
- spec/validators/array_validator_spec.rb
|
158
161
|
- spec/validators/hash_block_validator_spec.rb
|
159
162
|
- spec/validators/hash_validator_spec.rb
|
@@ -1,15 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe ValidateableArray do
|
4
|
-
let!(:array) { Array.new }
|
5
|
-
|
6
|
-
subject { described_class.new(array) }
|
7
|
-
|
8
|
-
it "responds to valid?" do
|
9
|
-
subject.should be_valid
|
10
|
-
end
|
11
|
-
|
12
|
-
it "responds to .errors" do
|
13
|
-
subject.errors.should be_empty
|
14
|
-
end
|
15
|
-
end
|