active_subset_validator 0.0.1 → 1.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.
- data/.travis.yml +4 -0
- data/CHANGELOG.md +6 -0
- data/Gemfile +4 -0
- data/README.md +44 -2
- data/lib/active_subset_validator/version.rb +1 -1
- data/spec/active_subset_validator/subset_validator_spec.rb +10 -15
- data/spec/active_subset_validator_spec.rb +13 -13
- data/spec/spec_helper.rb +3 -0
- metadata +5 -4
data/.travis.yml
ADDED
data/CHANGELOG.md
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
# ActiveSubsetValidator
|
2
2
|
[](https://codeclimate.com/github/paulnsorensen/active_subset_validator)
|
3
3
|
[](https://gemnasium.com/paulnsorensen/active_subset_validator)
|
4
|
+
[](http://badge.fury.io/rb/active_subset_validator)
|
5
|
+
[](https://travis-ci.org/paulnsorensen/active_subset_validator)
|
6
|
+
[](https://coveralls.io/r/paulnsorensen/active_subset_validator?branch=master)
|
4
7
|
|
5
8
|
Provides subset validation for serialized arrays or sets in Active Record.
|
6
9
|
Checks whether given values for a serialized array or set are a subset of
|
@@ -22,9 +25,48 @@ Or install it yourself as:
|
|
22
25
|
|
23
26
|
## Usage
|
24
27
|
|
25
|
-
|
26
|
-
|
28
|
+
Add to your models like so:
|
29
|
+
|
30
|
+
```ruby
|
31
|
+
class Article < ActiveRecord::Base
|
32
|
+
validates :categories, subset: { of: %w(foo bar baz ) }
|
33
|
+
end
|
34
|
+
```
|
35
|
+
The `:of` parameter may contain an `Array` or `Set` or a `Proc` or `lambda` that returns either type.
|
36
|
+
|
37
|
+
The validator in this gem is a subclass `ActiveModel::EachValidator` so you should have all the nifty options to pass to the `validates` method as well.
|
38
|
+
|
39
|
+
```ruby
|
40
|
+
class Comment < ActiveRecord::Base
|
41
|
+
attr_accessible :content, :tags,
|
42
|
+
validates :tags,
|
43
|
+
subset: { of: %w(some list of strings) },
|
44
|
+
if: ->(comment) { comment.some_method? },
|
45
|
+
allow_nil: false
|
46
|
+
end
|
47
|
+
```
|
48
|
+
|
49
|
+
## Testing
|
50
|
+
|
51
|
+
You may write your tests similar to the following to ensure that the subset
|
52
|
+
validator is working. Here's an example using [FactoryGirl](https://github.com/thoughtbot/factory_girl) and [RSpec](https://github.com/rspec/rspec):
|
53
|
+
|
54
|
+
```ruby
|
55
|
+
it "ensures times_taken contains only values within the proper set" do
|
56
|
+
med = build(:medication)
|
57
|
+
med.times_taken = %w(as_needed breakfast lunch dinner bedtime)
|
58
|
+
med.should have(:no).errors_on(:times_taken)
|
59
|
+
med.times_taken << "midnight"
|
60
|
+
med.errors_on(:times_taken).should include("is not a subset of the list")
|
27
61
|
end
|
62
|
+
```
|
63
|
+
|
64
|
+
Alternatively, if you use [shoulda-matchers](https://github.com/thoughtbot/shoulda-matchers), you could do this:
|
65
|
+
|
66
|
+
```ruby
|
67
|
+
it { should allow_value(%w(good-val-0 good-val-1)).for(foo) }
|
68
|
+
it { should_not allow_value(%w(bad-val-0 bad-val-1)).for(:foo) }
|
69
|
+
```
|
28
70
|
|
29
71
|
## Contributing
|
30
72
|
|
@@ -68,8 +68,7 @@ describe SubsetValidator do
|
|
68
68
|
Comment.validates :tags, subset: { of: Proc.new { |r| r.valid_set } }
|
69
69
|
comment = Comment.new
|
70
70
|
comment.tags = Set.new %w(python java)
|
71
|
-
comment.
|
72
|
-
comment.errors[:tags].first.should eq "is not a subset of the list"
|
71
|
+
expect(comment.errors_on(:tags)).to include "is not a subset of the list"
|
73
72
|
end
|
74
73
|
|
75
74
|
it "adds an error for the invalid attribute when :of is a Set" do
|
@@ -77,8 +76,7 @@ describe SubsetValidator do
|
|
77
76
|
Comment.validates :tags, subset: { of: Set.new([1,2,3,5]) }
|
78
77
|
comment = Comment.new
|
79
78
|
comment.tags = Set.new [2,4]
|
80
|
-
comment.
|
81
|
-
comment.errors[:tags].first.should eq "is not a subset of the list"
|
79
|
+
expect(comment.errors_on(:tags)).to include "is not a subset of the list"
|
82
80
|
end
|
83
81
|
|
84
82
|
it "adds an error for the invalid attribute when :of is an Array" do
|
@@ -86,8 +84,7 @@ describe SubsetValidator do
|
|
86
84
|
Comment.validates :tags, subset: { of: %w(Atlanta Cleveland Chicago) }
|
87
85
|
comment = Comment.new
|
88
86
|
comment.tags = %w(Chicago Boston)
|
89
|
-
comment.
|
90
|
-
comment.errors[:tags].first.should eq "is not a subset of the list"
|
87
|
+
expect(comment.errors_on(:tags)).to include "is not a subset of the list"
|
91
88
|
end
|
92
89
|
|
93
90
|
it "adds a custom error message for an invalid attribute when passed" do
|
@@ -98,8 +95,7 @@ describe SubsetValidator do
|
|
98
95
|
}
|
99
96
|
comment = Comment.new
|
100
97
|
comment.tags = %w(Chicago Boston)
|
101
|
-
comment.
|
102
|
-
comment.errors[:tags].first.should eq "contains an out-of-range city"
|
98
|
+
expect(comment.errors_on(:tags)).to include "contains an out-of-range city"
|
103
99
|
end
|
104
100
|
|
105
101
|
it "correctly validates a serialized Set when :of is a Set" do
|
@@ -110,7 +106,7 @@ describe SubsetValidator do
|
|
110
106
|
Comment.validates :tags, subset: { of: Set.new(%w(java scala python)) }
|
111
107
|
comment = Comment.new
|
112
108
|
comment.tags = Set.new %w(python java)
|
113
|
-
comment.
|
109
|
+
expect(comment).to have(:no).errors_on(:tags)
|
114
110
|
end
|
115
111
|
|
116
112
|
it "correctly validates a serialized Set when :of is a Proc" do
|
@@ -121,7 +117,7 @@ describe SubsetValidator do
|
|
121
117
|
Comment.validates :tags, subset: { of: Proc.new { |r| r.valid_set } }
|
122
118
|
comment = Comment.new
|
123
119
|
comment.tags = Set.new %w(python ruby)
|
124
|
-
comment.
|
120
|
+
expect(comment).to have(:no).errors_on(:tags)
|
125
121
|
end
|
126
122
|
|
127
123
|
it "correctly validates a serialized Array when :of is a Array" do
|
@@ -129,7 +125,7 @@ describe SubsetValidator do
|
|
129
125
|
Comment.validates :tags, subset: { of: %w(Atlanta Boston Chicago) }
|
130
126
|
comment = Comment.new
|
131
127
|
comment.tags = %w(Chicago Boston)
|
132
|
-
comment.
|
128
|
+
expect(comment).to have(:no).errors_on(:tags)
|
133
129
|
end
|
134
130
|
|
135
131
|
it "correctly validates a serialized Array when :of is a Proc" do
|
@@ -137,7 +133,7 @@ describe SubsetValidator do
|
|
137
133
|
Comment.validates :tags, subset: { of: Proc.new { [1,3,9,27,81] } }
|
138
134
|
comment = Comment.new
|
139
135
|
comment.tags = [9,27]
|
140
|
-
comment.
|
136
|
+
expect(comment).to have(:no).errors_on(:tags)
|
141
137
|
end
|
142
138
|
|
143
139
|
it "allows nil if :allow_nil is true (default)" do
|
@@ -145,7 +141,7 @@ describe SubsetValidator do
|
|
145
141
|
Comment.validates :tags, subset: { of: [1,3,9,27,81] }
|
146
142
|
comment = Comment.new
|
147
143
|
comment.tags = nil
|
148
|
-
comment.
|
144
|
+
expect(comment).to have(:no).errors_on(:tags)
|
149
145
|
end
|
150
146
|
|
151
147
|
it "doesn't allow nil if :allow_nil is false" do
|
@@ -153,8 +149,7 @@ describe SubsetValidator do
|
|
153
149
|
Comment.validates :tags, subset: { of: [1,3,9,27,81], allow_nil: false }
|
154
150
|
comment = Comment.new
|
155
151
|
comment.tags = nil
|
156
|
-
comment.
|
157
|
-
comment.errors[:tags].first.should eq "cannot be nil"
|
152
|
+
expect(comment.errors_on(:tags)).to include "cannot be nil"
|
158
153
|
end
|
159
154
|
end
|
160
155
|
end
|
@@ -1,51 +1,51 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe ActiveSubsetValidator do
|
4
|
-
describe "
|
4
|
+
describe ".is_a_set?" do
|
5
5
|
it "returns true if an array is a set" do
|
6
|
-
ActiveSubsetValidator.is_a_set?((1..20).to_a).
|
6
|
+
expect(ActiveSubsetValidator.is_a_set?((1..20).to_a)).to eq(true)
|
7
7
|
end
|
8
8
|
|
9
9
|
it "returns false if an array has duplicate values" do
|
10
|
-
ActiveSubsetValidator.is_a_set?(%w(foo foo bar baz)).
|
10
|
+
expect(ActiveSubsetValidator.is_a_set?(%w(foo foo bar baz))).to eq(false)
|
11
11
|
end
|
12
12
|
|
13
13
|
it "returns true if a Set is a set" do
|
14
|
-
ActiveSubsetValidator.is_a_set?(Set.new [1,2,4]).
|
14
|
+
expect(ActiveSubsetValidator.is_a_set?(Set.new [1,2,4])).to eq(true)
|
15
15
|
end
|
16
16
|
|
17
17
|
it "returns true if a proc that is passed returns a proper array" do
|
18
|
-
ActiveSubsetValidator.is_a_set?(Proc.new { %w(foo bar baz) }).
|
18
|
+
expect(ActiveSubsetValidator.is_a_set?(Proc.new { %w(foo bar baz) })).to eq(true)
|
19
19
|
end
|
20
20
|
|
21
21
|
it "returns false if a proc that is passed returns an improper array" do
|
22
|
-
ActiveSubsetValidator.is_a_set?(Proc.new { %w(foo foo bar baz) }).
|
22
|
+
expect(ActiveSubsetValidator.is_a_set?(Proc.new { %w(foo foo bar baz) })).to eq(false)
|
23
23
|
end
|
24
24
|
|
25
25
|
it "returns true if a proc that is passed returns a set" do
|
26
|
-
ActiveSubsetValidator.is_a_set?(Proc.new { Set.new [1,2,4] }).
|
26
|
+
expect(ActiveSubsetValidator.is_a_set?(Proc.new { Set.new [1,2,4] })).to eq(true)
|
27
27
|
end
|
28
28
|
|
29
29
|
it "returns true for valid procs with arguments" do
|
30
|
-
ActiveSubsetValidator.is_a_set?(Proc.new { |a| Set.new a }, [1,2,3]).
|
30
|
+
expect(ActiveSubsetValidator.is_a_set?(Proc.new { |a| Set.new a }, [1,2,3])).to eq(true)
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
34
|
-
describe "
|
34
|
+
describe ".set_difference" do
|
35
35
|
it "returns [] if the first array is a subset of the second array" do
|
36
|
-
ActiveSubsetValidator.set_difference(%w(foo bar), %w(foo bar baz)).
|
36
|
+
expect(ActiveSubsetValidator.set_difference(%w(foo bar), %w(foo bar baz))).to eq([])
|
37
37
|
end
|
38
38
|
|
39
39
|
it "returns [] if the first and second arrays have the same values" do
|
40
|
-
ActiveSubsetValidator.set_difference([1.0, 2.4, 3.9], [2.4, 1.0, 3.9]).
|
40
|
+
expect(ActiveSubsetValidator.set_difference([1.0, 2.4, 3.9], [2.4, 1.0, 3.9])).to eq([])
|
41
41
|
end
|
42
42
|
|
43
43
|
it "returns the set difference when the first array has more values" do
|
44
|
-
ActiveSubsetValidator.set_difference(%w(foo bar baz beans), %w(foo bar baz)).
|
44
|
+
expect(ActiveSubsetValidator.set_difference(%w(foo bar baz beans), %w(foo bar baz))).to eq(%w(beans))
|
45
45
|
end
|
46
46
|
|
47
47
|
it "returns the set difference when the first array is outside the set of the second" do
|
48
|
-
ActiveSubsetValidator.set_difference(%w(beans), %w(foo bar baz)).
|
48
|
+
expect(ActiveSubsetValidator.set_difference(%w(beans), %w(foo bar baz))).to eq(%w(beans))
|
49
49
|
end
|
50
50
|
end
|
51
51
|
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_subset_validator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 1.0.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-08-
|
12
|
+
date: 2013-08-27 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -116,6 +116,7 @@ extra_rdoc_files: []
|
|
116
116
|
files:
|
117
117
|
- .gitignore
|
118
118
|
- .rspec
|
119
|
+
- .travis.yml
|
119
120
|
- CHANGELOG.md
|
120
121
|
- Gemfile
|
121
122
|
- LICENSE.txt
|
@@ -145,7 +146,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
145
146
|
version: '0'
|
146
147
|
segments:
|
147
148
|
- 0
|
148
|
-
hash:
|
149
|
+
hash: 892968742125388242
|
149
150
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
150
151
|
none: false
|
151
152
|
requirements:
|
@@ -154,7 +155,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
154
155
|
version: '0'
|
155
156
|
segments:
|
156
157
|
- 0
|
157
|
-
hash:
|
158
|
+
hash: 892968742125388242
|
158
159
|
requirements: []
|
159
160
|
rubyforge_project:
|
160
161
|
rubygems_version: 1.8.25
|