active_model_validates_intersection_of 1.1.0 → 1.2.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 76242e3e9b01b1b5d32baf79a3e562c640b9a070
4
- data.tar.gz: e284f822c443f3670ee1e4a41ab0a50d69a743ea
3
+ metadata.gz: 2d9a880302c1fb042f2b7cfd0d45d13886d5c6a6
4
+ data.tar.gz: 8bebd7296a28944ff88fe31bbae47f42d5df6f49
5
5
  SHA512:
6
- metadata.gz: 4e91fef8acba499072b1dc4822fd655a8675e69685b0fff02d7979acd022878a815365a23d92e938f8cbadffcb201dd769e5cdade3d5d80238c42f4b3f0dec7a
7
- data.tar.gz: 844fcb44851f526de9e6fc0d9789ec81035b7c5ab1a6036790a0ce73ae4ef1a13a0ac82e3ab79e5ef2721f50076cb2240ef0dfe0067596972c6e9d1997fe12e5
6
+ metadata.gz: d508965100a884ba3ba35eadeda759d7e53f2d8fe360d467ec663836a297158917b76537ea9bfb09ebb159da219dc68c801f6684ad35a7bd89388540be486258
7
+ data.tar.gz: 4899760345566f7f3c71cd2012d0c8cda4603ad8086ae29eb551f33863b70fd35dbb7f15b6a8f1b0d2cdead25317d9998c5b30ae5664a84132cde1ac6fa3daec
@@ -1,3 +1,7 @@
1
+ ## v1.2.0 (2017-12-20)
2
+
3
+ - Support for proc and lambda
4
+
1
5
  ## v1.1.0 (2017-06-06)
2
6
 
3
7
  - Implement `validates :list, intersection: { in: ANOTHER_LIST }` see the README for more information
data/README.md CHANGED
@@ -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
@@ -1,12 +1,36 @@
1
1
  module ActiveModelValidatesIntersectionOf
2
2
  class Validator < ActiveModel::EachValidator
3
- 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)
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
6
11
 
7
- if (value - delimiter).any?
12
+ def validate_each(record, attribute, value)
13
+ raise ArgumentError, "value must be an array" unless value.is_a?(Array)
14
+
15
+ if (value - members(record)).any?
8
16
  record.errors.add(attribute, :inclusion, options.except(:in, :within).merge!(value: value))
9
17
  end
10
18
  end
19
+
20
+ private
21
+
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
29
+ end
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 = "1.2.0".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
 
@@ -61,5 +62,88 @@ RSpec.describe IntersectionValidator do
61
62
  end
62
63
  end
63
64
  end
65
+
66
+ context "validate with lambda" do
67
+ class SomeList
68
+ VALID_ARRAY = ["z", "x", 5 , 6]
69
+ include ActiveModel::Validations
70
+ attr_accessor :list
71
+ validates_intersection_of :list, in: lambda {|a| VALID_ARRAY }, message: "not valid"
72
+ end
73
+
74
+ it "is valid" do
75
+ list = SomeList.new
76
+ list.list = ["z"]
77
+ expect(list.valid?).to eq true
78
+ end
79
+
80
+ it "is invalid" do
81
+ list = SomeList.new
82
+ list.list = ["G"]
83
+ expect(list.valid?).to eq false
84
+ end
85
+ end
86
+
87
+ context "validate with proc" do
88
+ class ProcList
89
+ VALID_ARRAY = ["z", "q", 5 , 3]
90
+ include ActiveModel::Validations
91
+ attr_accessor :list
92
+ validates_intersection_of :list, in: proc { VALID_ARRAY }, message: "not valid"
93
+ end
94
+
95
+ it "is valid" do
96
+ list = ProcList.new
97
+ list.list = ["q"]
98
+ expect(list.valid?).to eq true
99
+ end
100
+
101
+ it "is invalid" do
102
+ list = ProcList.new
103
+ list.list = [10]
104
+ expect(list.valid?).to eq false
105
+ end
106
+ end
107
+
108
+ context "validate with symbol" do
109
+ class SymList
110
+ VALID_ARRAY = ["z", "d", 5 , 6]
111
+ include ActiveModel::Validations
112
+ attr_accessor :list
113
+ validates_intersection_of :list, in: :valid_options, message: "not valid"
114
+
115
+ def valid_options
116
+ VALID_ARRAY
117
+ end
118
+ end
119
+
120
+ it "is valid" do
121
+ list = SymList.new
122
+ list.list = ["d"]
123
+ expect(list.valid?).to eq true
124
+ end
125
+
126
+ it "is invalid" do
127
+ list = SymList.new
128
+ list.list = [8]
129
+ expect(list.valid?).to eq false
130
+ end
131
+ end
132
+
133
+ context "validate with value as string" do
134
+ class SomeInvalidList
135
+ include ActiveModel::Validations
136
+ attr_accessor :list
137
+ validates_intersection_of :list, in: proc { ['test'] }, message: "not valid"
138
+ end
139
+
140
+ it "causes an exception" do
141
+ list = SomeInvalidList.new
142
+ list.list = "d"
143
+ expect {
144
+ list.valid?
145
+ }.to raise_error(ArgumentError, "value must be an array")
146
+ end
147
+ end
64
148
  end
65
149
  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
 
@@ -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
 
@@ -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
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: 1.2.0
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: 2017-12-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel