active_model_validates_intersection_of 1.1.0 → 3.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 76242e3e9b01b1b5d32baf79a3e562c640b9a070
4
- data.tar.gz: e284f822c443f3670ee1e4a41ab0a50d69a743ea
2
+ SHA256:
3
+ metadata.gz: 380a36633d08fb17e45a86ad9d94c329620487717be29f4ee3cfd4573a2ba1de
4
+ data.tar.gz: 00f2ec575910e8f8c7b8ab563a07b07f8c60e11740ecf10253d45b3f22730ac1
5
5
  SHA512:
6
- metadata.gz: 4e91fef8acba499072b1dc4822fd655a8675e69685b0fff02d7979acd022878a815365a23d92e938f8cbadffcb201dd769e5cdade3d5d80238c42f4b3f0dec7a
7
- data.tar.gz: 844fcb44851f526de9e6fc0d9789ec81035b7c5ab1a6036790a0ce73ae4ef1a13a0ac82e3ab79e5ef2721f50076cb2240ef0dfe0067596972c6e9d1997fe12e5
6
+ metadata.gz: bf99fdd4024988e87e6b7fd079f17347750aa80ce75cd7d4c9f71857e373abf99958672adb2af49886beddb9221c3f947060cca21bbacddaec9f0488e3e2a7f8
7
+ data.tar.gz: be4f4ed87278de54137fa89661ede7a931160fc50996d7d7e36f90efaef2c6b31ff198929880ab36812e19893834eb67ab40eb923f1300465c09c6b661222f7c
data/.travis.yml CHANGED
@@ -1,5 +1,16 @@
1
1
  sudo: false
2
2
  language: ruby
3
3
  rvm:
4
- - 2.4.1
5
- before_install: gem install bundler -v 1.15.0
4
+ - 2.3.6
5
+ - 2.4.3
6
+ - 2.5.0
7
+ - 3.0.1
8
+ before_install: gem install bundler -v 2.2.16
9
+ before_script:
10
+ - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
11
+ - chmod +x ./cc-test-reporter
12
+ - ./cc-test-reporter before-build
13
+ script:
14
+ - bundle exec rspec
15
+ after_script:
16
+ - ./cc-test-reporter after-build --exit-code $TRAVIS_TEST_RESULT
data/CHANGELOG.md CHANGED
@@ -1,3 +1,15 @@
1
+ ## v3.0.1 (2021-08-24)
2
+
3
+ - Fixing model validation when the value is nil (eg: list = `[nil]` model.valid? should be false). (From issue: #9)
4
+
5
+ ## v3.0.0 (2021-04-13)
6
+
7
+ - Ruby 3 support.
8
+
9
+ ## v1.2.0 (2017-12-20)
10
+
11
+ - Support for proc and lambda
12
+
1
13
  ## v1.1.0 (2017-06-06)
2
14
 
3
15
  - Implement `validates :list, intersection: { in: ANOTHER_LIST }` see the README for more information
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Active Model Validates Intersection Of
2
2
 
3
- ![Gem Version](https://img.shields.io/gem/v/active_model_validates_intersection_of.svg?style=flat-square) [![Code Climate](https://img.shields.io/codeclimate/github/rafaelbiriba/active_model_validates_intersection_of.svg?style=flat-square)](https://codeclimate.com/github/rafaelbiriba/active_model_validates_intersection_of) [![Coverage Status](https://img.shields.io/coveralls/rafaelbiriba/active_model_validates_intersection_of/master.svg?style=flat-square)](https://coveralls.io/r/rafaelbiriba/active_model_validates_intersection_of?branch=master) [![Travis](https://img.shields.io/travis/rafaelbiriba/active_model_validates_intersection_of/master.svg?style=flat-square)](https://travis-ci.org/rafaelbiriba/active_model_validates_intersection_of)
3
+ ![Gem Version](https://img.shields.io/gem/v/active_model_validates_intersection_of.svg?style=flat-square) [![Maintainability](https://api.codeclimate.com/v1/badges/e95e09a4905d648a3600/maintainability)](https://codeclimate.com/github/rafaelbiriba/active_model_validates_intersection_of/maintainability) [![Test Coverage](https://api.codeclimate.com/v1/badges/e95e09a4905d648a3600/test_coverage)](https://codeclimate.com/github/rafaelbiriba/active_model_validates_intersection_of/test_coverage) [![Coverage Status](https://img.shields.io/coveralls/rafaelbiriba/active_model_validates_intersection_of/master.svg?style=flat-square)](https://coveralls.io/r/rafaelbiriba/active_model_validates_intersection_of?branch=master) [![Travis](https://img.shields.io/travis/rafaelbiriba/active_model_validates_intersection_of/master.svg?style=flat-square)](https://travis-ci.org/rafaelbiriba/active_model_validates_intersection_of)
4
4
 
5
5
  A custom validation for Active Model that check if an array is included in another one.
6
6
 
@@ -54,7 +54,7 @@ require "active_model_validates_intersection_of"
54
54
 
55
55
  ### Parameters
56
56
 
57
- * `:in` - Parameter is required
57
+ * `:in` - Parameter is required. (Supports: Array, proc and lambda)
58
58
  * `:within` - *Optional:* A synonym(alias) for `:in`
59
59
  * `:message` - *Optional:* Specifies a custom error message
60
60
 
@@ -70,6 +70,10 @@ class User < ActiveRecord::Base
70
70
  validates_intersection_of :permission, in: DEFAULT_PERMISSION, message: "invalid permission"
71
71
  validates_intersection_of :permission, within: DEFAULT_PERMISSION, message: "invalid permission"
72
72
 
73
+ # proc and lambda support
74
+ validates_intersection_of :permission, in: proc { DEFAULT_PERMISSION }, message: "invalid permission"
75
+ validates_intersection_of :permission, in: lambda { |l| DEFAULT_PERMISSION }, message: "invalid permission"
76
+
73
77
  # Using the validator explicit:
74
78
  validates_with ActiveModelValidatesIntersectionOf::Validator, attributes: [:permission], in: DEFAULT_PERMISSION
75
79
  validates_with ActiveModelValidatesIntersectionOf::Validator, attributes: [:permission], within: DEFAULT_PERMISSION
@@ -18,9 +18,10 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(spec)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.add_dependency "activemodel", ">= 4.0.0"
22
- spec.add_development_dependency "bundler", "~> 1.15"
23
- spec.add_development_dependency "rake", "~> 10.0"
21
+ spec.add_dependency "activemodel", ">= 5.0.0"
22
+ spec.add_development_dependency "bundler", "~> 2.1"
23
+ spec.add_development_dependency "rake", "~> 13.0"
24
24
  spec.add_development_dependency "rspec", "~> 3.0"
25
25
  spec.add_development_dependency "coveralls"
26
+ spec.add_development_dependency "simplecov"
26
27
  end
@@ -1,12 +1,36 @@
1
1
  module ActiveModelValidatesIntersectionOf
2
2
  class Validator < ActiveModel::EachValidator
3
+ ERROR_MESSAGE = "An object with the method #include? or a proc, lambda or symbol is required, " \
4
+ "and must be supplied as the :in (or :within) option"
5
+
6
+ def check_validity!
7
+ unless delimiter.respond_to?(:include?) || delimiter.respond_to?(:call) || delimiter.respond_to?(:to_sym)
8
+ raise ArgumentError, ERROR_MESSAGE
9
+ end
10
+ end
11
+
3
12
  def validate_each(record, attribute, value)
4
- delimiter = options[:in] || options[:within]
5
- raise(ArgumentError, "An array must be supplied as the :in option of the configuration hash") unless delimiter.kind_of?(Array)
13
+ raise ArgumentError, "value must be an array" unless value.is_a?(Array)
14
+
15
+ if (value - members(record)).size > 0
16
+ record.errors.add(attribute, :inclusion, **options.except(:in, :within).merge!(value: value))
17
+ end
18
+ end
19
+
20
+ private
6
21
 
7
- if (value - delimiter).any?
8
- record.errors.add(attribute, :inclusion, options.except(:in, :within).merge!(value: value))
22
+ def members(record)
23
+ members = if delimiter.respond_to?(:call)
24
+ delimiter.call(record)
25
+ elsif delimiter.respond_to?(:to_sym)
26
+ record.send(delimiter)
27
+ else
28
+ delimiter
9
29
  end
10
30
  end
31
+
32
+ def delimiter
33
+ @delimiter ||= options[:in] || options[:within]
34
+ end
11
35
  end
12
- end
36
+ end
@@ -1,3 +1,3 @@
1
1
  module ActiveModelValidatesIntersectionOf
2
- VERSION = "1.1.0".freeze
2
+ VERSION = "3.0.1".freeze
3
3
  end
@@ -5,14 +5,15 @@ RSpec.describe IntersectionValidator do
5
5
  class BadSetupValidator
6
6
  include ActiveModel::Validations
7
7
  attr_accessor :list
8
- validates :list, intersection: true
9
8
  end
10
9
 
11
- let(:badsetup) { BadSetupValidator.new }
12
-
13
10
  context "setup" do
14
11
  describe "with neither :in nor :within configuration" do
15
- it_behaves_like "invalid configuration"
12
+ it "raises argument error" do
13
+ expect {
14
+ BadSetupValidator.class_eval("validates :list, intersection: true")
15
+ }.to raise_error(ArgumentError)
16
+ end
16
17
  end
17
18
  end
18
19
 
@@ -36,6 +37,22 @@ RSpec.describe IntersectionValidator do
36
37
  describe "with an invalid list" do
37
38
  it_behaves_like "invalid object"
38
39
  end
40
+
41
+ context "when the model value is an array with nil value" do
42
+ class ListTest
43
+ VALID_ARRAY = ["z", "x", 5 , 6]
44
+ include ActiveModel::Validations
45
+ attr_accessor :list
46
+ validates_intersection_of :list, within: VALID_ARRAY, message: "not valid"
47
+ end
48
+
49
+ subject { ListTest.new }
50
+
51
+ it "should return as invalid" do
52
+ subject.list = [nil]
53
+ expect(subject.valid?).to eq(false)
54
+ end
55
+ end
39
56
  end
40
57
 
41
58
  context "with :within option" do
@@ -60,6 +77,105 @@ RSpec.describe IntersectionValidator do
60
77
  it_behaves_like "invalid object"
61
78
  end
62
79
  end
80
+
81
+ context "when the model value is an array with nil value" do
82
+ class ListTest
83
+ VALID_ARRAY = ["z", "x", 5 , 6]
84
+ include ActiveModel::Validations
85
+ attr_accessor :list
86
+ validates_intersection_of :list, within: VALID_ARRAY, message: "not valid"
87
+ end
88
+
89
+ subject { ListTest.new }
90
+
91
+ it "should return as invalid" do
92
+ subject.list = [nil]
93
+ expect(subject.valid?).to eq(false)
94
+ end
95
+ end
96
+ end
97
+
98
+ context "validate with lambda" do
99
+ class SomeList
100
+ VALID_ARRAY = ["z", "x", 5 , 6]
101
+ include ActiveModel::Validations
102
+ attr_accessor :list
103
+ validates_intersection_of :list, in: lambda {|a| VALID_ARRAY }, message: "not valid"
104
+ end
105
+
106
+ it "is valid" do
107
+ list = SomeList.new
108
+ list.list = ["z"]
109
+ expect(list.valid?).to eq true
110
+ end
111
+
112
+ it "is invalid" do
113
+ list = SomeList.new
114
+ list.list = ["G"]
115
+ expect(list.valid?).to eq false
116
+ end
117
+ end
118
+
119
+ context "validate with proc" do
120
+ class ProcList
121
+ VALID_ARRAY = ["z", "q", 5 , 3]
122
+ include ActiveModel::Validations
123
+ attr_accessor :list
124
+ validates_intersection_of :list, in: proc { VALID_ARRAY }, message: "not valid"
125
+ end
126
+
127
+ it "is valid" do
128
+ list = ProcList.new
129
+ list.list = ["q"]
130
+ expect(list.valid?).to eq true
131
+ end
132
+
133
+ it "is invalid" do
134
+ list = ProcList.new
135
+ list.list = [10]
136
+ expect(list.valid?).to eq false
137
+ end
138
+ end
139
+
140
+ context "validate with symbol" do
141
+ class SymList
142
+ VALID_ARRAY = ["z", "d", 5 , 6]
143
+ include ActiveModel::Validations
144
+ attr_accessor :list
145
+ validates_intersection_of :list, in: :valid_options, message: "not valid"
146
+
147
+ def valid_options
148
+ VALID_ARRAY
149
+ end
150
+ end
151
+
152
+ it "is valid" do
153
+ list = SymList.new
154
+ list.list = ["d"]
155
+ expect(list.valid?).to eq true
156
+ end
157
+
158
+ it "is invalid" do
159
+ list = SymList.new
160
+ list.list = [8]
161
+ expect(list.valid?).to eq false
162
+ end
163
+ end
164
+
165
+ context "validate with value as string" do
166
+ class SomeInvalidList
167
+ include ActiveModel::Validations
168
+ attr_accessor :list
169
+ validates_intersection_of :list, in: proc { ['test'] }, message: "not valid"
170
+ end
171
+
172
+ it "causes an exception" do
173
+ list = SomeInvalidList.new
174
+ list.list = "d"
175
+ expect {
176
+ list.valid?
177
+ }.to raise_error(ArgumentError, "value must be an array")
178
+ end
63
179
  end
64
180
  end
65
181
  end
@@ -5,14 +5,15 @@ RSpec.describe ActiveModel::Validations::HelperMethods do
5
5
  class BadSetup
6
6
  include ActiveModel::Validations
7
7
  attr_accessor :list
8
- validates_intersection_of :list
9
8
  end
10
9
 
11
- let(:badsetup) { BadSetup.new }
12
-
13
10
  context "setup" do
14
11
  describe "with neither :in nor :within configuration" do
15
- it_behaves_like "invalid configuration"
12
+ it "raises argument error" do
13
+ expect {
14
+ BadSetup.class_eval("validates_intersection_of :list")
15
+ }.to raise_error(ArgumentError)
16
+ end
16
17
  end
17
18
  end
18
19
 
@@ -64,5 +65,21 @@ RSpec.describe ActiveModel::Validations::HelperMethods do
64
65
  end
65
66
  end
66
67
  end
68
+
69
+ context "when the model value is an array with nil value" do
70
+ class ListTest
71
+ VALID_ARRAY = ["z", "x", 5 , 6]
72
+ include ActiveModel::Validations
73
+ attr_accessor :list
74
+ validates_intersection_of :list, within: VALID_ARRAY, message: "not valid"
75
+ end
76
+
77
+ subject { ListTest.new }
78
+
79
+ it "should return as invalid" do
80
+ subject.list = [nil]
81
+ expect(subject.valid?).to eq(false)
82
+ end
83
+ end
67
84
  end
68
85
  end
@@ -5,14 +5,15 @@ RSpec.describe ActiveModelValidatesIntersectionOf::Validator do
5
5
  class BadSetupValidator
6
6
  include ActiveModel::Validations
7
7
  attr_accessor :list
8
- validates_with ActiveModelValidatesIntersectionOf::Validator, attributes: [:list]
9
8
  end
10
9
 
11
- let(:badsetup) { BadSetupValidator.new }
12
-
13
10
  context "setup" do
14
11
  describe "with neither :in nor :within configuration" do
15
- it_behaves_like "invalid configuration"
12
+ it "raises argument error" do
13
+ expect {
14
+ BadSetupValidator.class_eval("validates_with ActiveModelValidatesIntersectionOf::Validator, attributes: [:list]")
15
+ }.to raise_error(ArgumentError)
16
+ end
16
17
  end
17
18
  end
18
19
 
data/spec/shared.rb CHANGED
@@ -1,9 +1,3 @@
1
- RSpec.shared_examples "invalid configuration" do
2
- it "should raise an error" do
3
- expect { badsetup.valid? }.to raise_error(ArgumentError)
4
- end
5
- end
6
-
7
1
  RSpec.shared_examples "valid object" do
8
2
  it "the subject should be valid" do
9
3
  subject.list = valid_partial_array
data/spec/spec_helper.rb CHANGED
@@ -1,8 +1,12 @@
1
+ require "simplecov"
2
+ SimpleCov.start
3
+
4
+ require "coveralls"
5
+ Coveralls.wear!
6
+
1
7
  require "bundler/setup"
2
8
  require "active_model"
3
9
  require "active_model_validates_intersection_of"
4
- require "coveralls"
5
- Coveralls.wear!
6
10
 
7
11
  RSpec.configure do |config|
8
12
  # Enable flags like --only-failures and --next-failure
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_model_validates_intersection_of
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 3.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rafael Biriba
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-06-06 00:00:00.000000000 Z
11
+ date: 2021-08-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel
@@ -16,42 +16,42 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 4.0.0
19
+ version: 5.0.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 4.0.0
26
+ version: 5.0.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '1.15'
33
+ version: '2.1'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '1.15'
40
+ version: '2.1'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '10.0'
47
+ version: '13.0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '10.0'
54
+ version: '13.0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rspec
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: simplecov
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
83
97
  description: A custom validation for your Active Model that check if an array is included
84
98
  in another one
85
99
  email:
@@ -125,8 +139,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
125
139
  - !ruby/object:Gem::Version
126
140
  version: '0'
127
141
  requirements: []
128
- rubyforge_project:
129
- rubygems_version: 2.6.12
142
+ rubygems_version: 3.0.3
130
143
  signing_key:
131
144
  specification_version: 4
132
145
  summary: A custom validation for your Active Model that check if an array is included