optional_validations 0.0.1
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 +7 -0
- data/Rakefile +8 -0
- data/lib/optional_validations.rb +51 -0
- data/test/test_optional_validations.rb +171 -0
- metadata +88 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: 35d13a5d2248f8840226fe6d2dc91c8779f424ad
|
|
4
|
+
data.tar.gz: ec08971b0a2a26653da3225e84fbb3d117c5adbb
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 9ac28392dda3e57513f0874111060299cc5ebb44028fafeba34633f214a936ec89fdcd9418cb8242badeb830515870527458fcc78c0b6fc49654ac5a9d46f8a0
|
|
7
|
+
data.tar.gz: 7e8804e4e6709a5fce67c414b9c36cec972c1bedc7236bc4d941cde47684399fc19da5168218ccd863aed8175dcf9707134a22fcba383d43e0f597f21d28fecb
|
data/Rakefile
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
require 'active_support/all'
|
|
2
|
+
require 'active_model'
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
module ActiveModel
|
|
6
|
+
module Validations
|
|
7
|
+
module ClassMethods
|
|
8
|
+
alias_method :__validates_with, :validates_with
|
|
9
|
+
def validates_with(*args, &block)
|
|
10
|
+
|
|
11
|
+
_if = Array(args[1][:if])
|
|
12
|
+
|
|
13
|
+
# if multiple attribute names are supplied we need to split them into separate validates_with calls
|
|
14
|
+
# in order to be able to choose only relevant validations to certain fields
|
|
15
|
+
args[1][:attributes].each do |attr_name|
|
|
16
|
+
args[1][:attributes] = [attr_name]
|
|
17
|
+
args[1][:if] = _if.clone
|
|
18
|
+
args[1][:if].unshift -> do
|
|
19
|
+
if @__validate_only.present?
|
|
20
|
+
@__validate_only.include?(attr_name)
|
|
21
|
+
elsif @__validate_except.present?
|
|
22
|
+
! @__validate_except.include?(attr_name)
|
|
23
|
+
else
|
|
24
|
+
true
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
__validates_with(*args, &block)
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def validate_only(*fields)
|
|
33
|
+
@__validate_except = nil
|
|
34
|
+
@__validate_only = fields.map &:to_sym
|
|
35
|
+
true
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def validate_except(*fields)
|
|
39
|
+
@__validate_only = nil
|
|
40
|
+
@__validate_except = fields.map &:to_sym
|
|
41
|
+
true
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def validate_all
|
|
45
|
+
@__validate_only = nil
|
|
46
|
+
@__validate_except = nil
|
|
47
|
+
true
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
require 'minitest/autorun'
|
|
2
|
+
require 'optional_validations'
|
|
3
|
+
|
|
4
|
+
class ModelBase
|
|
5
|
+
include ActiveModel::Validations
|
|
6
|
+
|
|
7
|
+
attr_accessor :attr1, :attr2, :attr3
|
|
8
|
+
|
|
9
|
+
def test1?
|
|
10
|
+
true
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def test2?
|
|
14
|
+
true
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def self.name
|
|
18
|
+
'ModelExample'
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class OptionalValidationsTest < Minitest::Test
|
|
25
|
+
def test_valid_by_default
|
|
26
|
+
model = Class.new(ModelBase) do
|
|
27
|
+
# validates_presence_of :attr1
|
|
28
|
+
end
|
|
29
|
+
m = model.new
|
|
30
|
+
assert m.valid?
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def test_basic_validation
|
|
35
|
+
model = Class.new(ModelBase) do
|
|
36
|
+
validates_presence_of :attr1
|
|
37
|
+
end
|
|
38
|
+
m = model.new
|
|
39
|
+
assert !m.valid?
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def test_basic_validate_only
|
|
43
|
+
model = Class.new(ModelBase) do
|
|
44
|
+
validates_presence_of :attr1
|
|
45
|
+
end
|
|
46
|
+
m = model.new
|
|
47
|
+
|
|
48
|
+
m.validate_only :attr2
|
|
49
|
+
assert m.valid?
|
|
50
|
+
|
|
51
|
+
m.validate_only :attr1
|
|
52
|
+
assert !m.valid?
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def test_basic_validate_except
|
|
56
|
+
model = Class.new(ModelBase) do
|
|
57
|
+
validates_presence_of :attr1
|
|
58
|
+
end
|
|
59
|
+
m = model.new
|
|
60
|
+
|
|
61
|
+
m.validate_except :attr2
|
|
62
|
+
assert !m.valid?
|
|
63
|
+
|
|
64
|
+
m.validate_except :attr1
|
|
65
|
+
assert m.valid?
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def test_basic_validate_all
|
|
69
|
+
model = Class.new(ModelBase) do
|
|
70
|
+
validates_presence_of :attr1
|
|
71
|
+
end
|
|
72
|
+
m = model.new
|
|
73
|
+
|
|
74
|
+
m.validate_except :attr2
|
|
75
|
+
assert !m.valid?
|
|
76
|
+
|
|
77
|
+
m.validate_except :attr1
|
|
78
|
+
assert m.valid?
|
|
79
|
+
|
|
80
|
+
m.validate_all
|
|
81
|
+
assert !m.valid?
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def test_multiple_fields
|
|
86
|
+
model = Class.new(ModelBase) do
|
|
87
|
+
validates_presence_of :attr1, :attr2
|
|
88
|
+
end
|
|
89
|
+
m = model.new
|
|
90
|
+
|
|
91
|
+
m.validate_only :attr1
|
|
92
|
+
assert !m.valid?
|
|
93
|
+
|
|
94
|
+
m.validate_only :attr2
|
|
95
|
+
assert !m.valid?
|
|
96
|
+
|
|
97
|
+
m.validate_except :attr1, :attr2
|
|
98
|
+
assert m.valid?
|
|
99
|
+
|
|
100
|
+
m.validate_only :attr3
|
|
101
|
+
assert m.valid?
|
|
102
|
+
|
|
103
|
+
m.attr1 = 1
|
|
104
|
+
m.validate_only :attr1
|
|
105
|
+
assert m.valid?
|
|
106
|
+
|
|
107
|
+
m.validate_only :attr2
|
|
108
|
+
assert !m.valid?
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def test_conditional_validation
|
|
112
|
+
model = Class.new(ModelBase) do
|
|
113
|
+
validates_presence_of :attr1, :attr2, if: :test1?
|
|
114
|
+
end
|
|
115
|
+
m = model.new
|
|
116
|
+
assert !m.valid?
|
|
117
|
+
|
|
118
|
+
m.validate_except :attr1, :attr2
|
|
119
|
+
assert m.valid?
|
|
120
|
+
|
|
121
|
+
m.attr1 = 1
|
|
122
|
+
m.validate_only :attr1
|
|
123
|
+
assert m.valid?
|
|
124
|
+
|
|
125
|
+
m.validate_only :attr2
|
|
126
|
+
assert !m.valid?
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def test_multi_conditional_validation
|
|
130
|
+
model = Class.new(ModelBase) do
|
|
131
|
+
validates_presence_of :attr1, :attr2, if: [:test1?, :test2?, -> { true }]
|
|
132
|
+
end
|
|
133
|
+
m = model.new
|
|
134
|
+
assert !m.valid?
|
|
135
|
+
|
|
136
|
+
m.validate_except :attr1, :attr2
|
|
137
|
+
assert m.valid?
|
|
138
|
+
|
|
139
|
+
m.attr1 = 1
|
|
140
|
+
m.validate_only :attr1
|
|
141
|
+
assert m.valid?
|
|
142
|
+
|
|
143
|
+
m.validate_only :attr2
|
|
144
|
+
assert !m.valid?
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
def test_multiple_validations
|
|
148
|
+
model = Class.new(ModelBase) do
|
|
149
|
+
validates_presence_of :attr1, :attr2
|
|
150
|
+
validates_numericality_of :attr2, :attr3
|
|
151
|
+
end
|
|
152
|
+
m = model.new
|
|
153
|
+
assert !m.valid?
|
|
154
|
+
|
|
155
|
+
m.attr1 = 'a'
|
|
156
|
+
m.attr2 = 1
|
|
157
|
+
m.validate_only :attr1, :attr2
|
|
158
|
+
assert m.valid?
|
|
159
|
+
|
|
160
|
+
m.validate_all
|
|
161
|
+
assert !m.valid?
|
|
162
|
+
|
|
163
|
+
m.validate_only :attr2
|
|
164
|
+
assert m.valid?
|
|
165
|
+
m.attr2 = 'a'
|
|
166
|
+
assert !m.valid?
|
|
167
|
+
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: optional_validations
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.0.1
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Ivan Brykov
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2015-04-16 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: minitest
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - "~>"
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '5'
|
|
20
|
+
type: :development
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - "~>"
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '5'
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: activesupport
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - "~>"
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '4'
|
|
34
|
+
type: :runtime
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - "~>"
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '4'
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: activemodel
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - "~>"
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: '4'
|
|
48
|
+
type: :runtime
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - "~>"
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '4'
|
|
55
|
+
description: Introduces new ActiveModel::Validations methods — validate_only and validate_except
|
|
56
|
+
email:
|
|
57
|
+
executables: []
|
|
58
|
+
extensions: []
|
|
59
|
+
extra_rdoc_files: []
|
|
60
|
+
files:
|
|
61
|
+
- Rakefile
|
|
62
|
+
- lib/optional_validations.rb
|
|
63
|
+
- test/test_optional_validations.rb
|
|
64
|
+
homepage: https://github.org/brykov/optional_validations
|
|
65
|
+
licenses:
|
|
66
|
+
- MIT
|
|
67
|
+
metadata: {}
|
|
68
|
+
post_install_message:
|
|
69
|
+
rdoc_options: []
|
|
70
|
+
require_paths:
|
|
71
|
+
- lib
|
|
72
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
73
|
+
requirements:
|
|
74
|
+
- - ">="
|
|
75
|
+
- !ruby/object:Gem::Version
|
|
76
|
+
version: '0'
|
|
77
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
78
|
+
requirements:
|
|
79
|
+
- - ">="
|
|
80
|
+
- !ruby/object:Gem::Version
|
|
81
|
+
version: '0'
|
|
82
|
+
requirements: []
|
|
83
|
+
rubyforge_project:
|
|
84
|
+
rubygems_version: 2.4.5
|
|
85
|
+
signing_key:
|
|
86
|
+
specification_version: 4
|
|
87
|
+
summary: Provides ability to choose ActiveModel fields to be validated
|
|
88
|
+
test_files: []
|