validates_serialized 0.0.2 → 0.0.3
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 +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
|