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 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