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 CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- NTU3NzRmZTFiOGNlYmMzNGFlZDMwOTBkOWU1NTk2MjMyMmVkNDI5ZA==
4
+ OTc4ZmQ5ZGFhNDlmOGEwZGI0NzI1NzA1NWQ0OTZmY2UyMTdlN2MxNA==
5
5
  data.tar.gz: !binary |-
6
- NDIzOGFmMjllYmY0MThkODVlYzkxMWQwNzljOTNhMzhjNzg2ZGJkZQ==
6
+ Y2VlNTQ5NjViNzExZmZlZGFkNDMwNzAyZjExNjkyYTM1OTVmYWFjMw==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- ZjhiOGNhY2U5ZGU2Y2Y4N2ExOWNmOWFlOGZkZjAxZjAwZWY0NGVlMmU4ZjE3
10
- YTY4ODI5ZDFkOTBjMDQ5MzEyYWUzNzMwY2JmOTkxNWVkYzk3NzgxMmFhNzhm
11
- NTVlZjMxMzU1M2Y0NTMwNzY3OGUwYTllYjI3Zjk2MWM5ZWEyOWI=
9
+ ODM1ODIzYmIzYjIyZTVhOWU0NjJjMjkxODI0MGUxMjdmZWM2MWYzOWIyYzBl
10
+ NmZhOThlN2VjZWRiNjJlMDBjYWIzYzAyMDI0MzE2ZDgwZWUwMDRkMTkxMTQw
11
+ MmQzYzZmMDlmZWQ0NjIyMTBlNDhhNWQyYWUwNjkzMjZiMzM2NmI=
12
12
  data.tar.gz: !binary |-
13
- MjY0NGI2YTk5MWY3YzlkZWVhNDZjYzQyM2E0NmU0OGMwY2QzNzE0NjNjNTkz
14
- NDJhOGJmOGQzYzhiY2FmZTE1NWQ0ZDZmMzFkYTBmMmNjYTY5N2JkMTZmMTg4
15
- ODczYWZkZTE4MDZkYzkyNTE4NGE0NmZlMzY4M2M2YjIxNzFkMTM=
13
+ ZmY2ZGJkMzc0MGFkOTJlYjFiMmUwNTZmNzkxMGJlM2ZjMjZhYzY0NWU0MTAw
14
+ Y2JjMmIyYWM0MDUyNDkzNjdmMzI2YTYwYTM2ZWIyNmNlNGNkNzkxZTBjZTY1
15
+ ZWYzZTY5NTY5ZjFkY2E5YmUwMGM0OTU2ODFhMmI4ZjYzZDk2Mzc=
data/Gemfile.lock CHANGED
@@ -1,8 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- validates_serialized (0.0.0)
5
- activemodel (>= 4.0.0)
4
+ validates_serialized (0.0.2)
5
+ activemodel (>= 3.0, < 5.0)
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
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,13 @@
1
+ require 'active_model'
2
+
3
+ class ValidateableArrayValue
4
+ include ::ActiveModel::Validations
5
+
6
+ def initialize(value)
7
+ @value = value
8
+ end
9
+
10
+ def value
11
+ @value
12
+ end
13
+ end
@@ -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
@@ -1,3 +1,3 @@
1
1
  module ValidatesSerialized
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -1,10 +1,11 @@
1
1
  require 'validates_serialized/version'
2
- require 'validates_serialized/validateable_array'
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.2
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-05 00:00:00.000000000 Z
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/validateable_array.rb
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/validateable_array_spec.rb
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/validateable_array_spec.rb
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,9 +0,0 @@
1
- require 'active_model'
2
-
3
- class ValidateableArray < Array
4
- include ::ActiveModel::Validations
5
-
6
- def initialize(array)
7
- @array = array
8
- end
9
- end
@@ -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