subvalid 0.1.0 → 0.2.0

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: edca18185857cfbbc93dbb3314d3d09083c5f200
4
- data.tar.gz: af80dce164c5388a450adaba42db36d4f414ca73
2
+ SHA256:
3
+ metadata.gz: c0653675ee971b2059d362155fd30634850d423b4137cbde73d65516b7ba599b
4
+ data.tar.gz: e95bcb0dde03e2be59337374573928b70a5ff16f7bf801d1922b4d6cce98e8de
5
5
  SHA512:
6
- metadata.gz: 9875098c16bcc27ce0acafb0248684536dca09adabfc199c554cd2b4c71d8a7452b4b9b3ecb9e76764e90167cfe98fa01b2fec6d86db6f62839f070b924bf9fb
7
- data.tar.gz: e9099ec87e31f154edd3fa4448efe3e2ff7c034cc6538aa77def84fc98d02775850a1782d7ceff0936cc14cf1a438da6c0c8b5d5a57032f5748cc0996549cfa3
6
+ metadata.gz: 3547b4e243cb436ba8440804932a94abdc1b242f8fd0dd7692864ee35d0964c15ddf5d900438b81bfee4327d5b60767e78daf0631c31dc967aab537dbdd5a542
7
+ data.tar.gz: f1309e4d68890d1df8fc40a54d61f7099f0c830ed4a1bb813a1bba8fb389ff5e953ff433b22c1e83f371af2fa0cb1306a577a91224dbf2785d9e6f740fb334ea
@@ -1,7 +1,10 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.2.2
4
- - 2.1.6
5
- - 2.0.0
3
+ - 2.6.3
4
+ - 2.5.5
5
+ - 2.5.1
6
+ - 2.3.8
6
7
  - ruby-head
7
- - jruby-9.0.0.0
8
+ - jruby-9.2.7.0
9
+ before_install:
10
+ - gem install bundler --no-doc
data/README.md CHANGED
@@ -164,6 +164,35 @@ class PersonValidator
164
164
  end
165
165
  ```
166
166
 
167
+ ### Length Options
168
+
169
+ You can specify length constraints in different ways:
170
+
171
+ ```ruby
172
+ class PersonValidator
173
+ include Subvalid::Validator
174
+
175
+ validates :name, length: { minimum: 2 }
176
+ validates :bio, length: { maximum: 500 }
177
+ validates :password, length: { in: 6..20 }
178
+ validates :registration_number, length: { is: 6 }
179
+ end
180
+ ```
181
+
182
+ The possible length constraint options are:
183
+
184
+ `:minimum` - The attribute cannot have less than the specified length.
185
+
186
+ `:maximum` - The attribute cannot have more than the specified length.
187
+
188
+ `:in` (or `:within`) - The attribute length must be included in a given interval. The value for this option must be a range.
189
+
190
+ `:is` - The attribute length must be equal to the given value.
191
+
192
+ The default error messages depend on the type of length validation being performed. You can use the `:message` option to specify an error message.
193
+
194
+ Note that the default error messages are plural. A personalised message should be provided in cases where it is grammatically incorrect, eg, "cannot be shorter than 1 characters".
195
+
167
196
  ## Contact
168
197
 
169
198
  - [github project](https://github.com/envato/subvalid)
@@ -4,11 +4,19 @@ module Subvalid
4
4
  def self.validate(object, validation_result=ValidationResult.new, *args)
5
5
  return unless object
6
6
  args = args.to_h
7
+ message = args.delete(:message)
7
8
  args.each do |operator, value|
8
9
  case operator
10
+ when :minimum
11
+ validation_result.add_error(message || "cannot be shorter than #{value} characters") if object.size < value
9
12
  when :maximum
10
- validation_result.add_error("is too long, maximum is #{value}") if object.size > value
11
- # TODO ALL the other operators from http://guides.rubyonrails.org/active_record_validations.html#length
13
+ validation_result.add_error(message || "cannot be longer than #{value} characters") if object.size > value
14
+ when :is
15
+ validation_result.add_error(message || "should have exactly #{value} characters") if object.size != value
16
+ when :in, :within
17
+ unless value.include?(object.size)
18
+ validation_result.add_error(message || "should contain #{value.first} to #{value.last} characters")
19
+ end
12
20
  else
13
21
  raise "don't know what to do with operator=#{operator}"
14
22
  end
@@ -1,3 +1,3 @@
1
1
  module Subvalid
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -17,13 +17,6 @@ describe Subvalid::Validator do
17
17
  end
18
18
  end
19
19
 
20
- class TestValidator
21
- def self.validate(object, validation_result=ValidationResult.new, *args)
22
- validation_result.add_error("testing #{object}")
23
- end
24
- end
25
- Subvalid::ValidatorRegistry.register(:test, TestValidator)
26
-
27
20
  Poro = Struct.new(:foo, :bar, :child, :some_predicate) do
28
21
  def to_s
29
22
  "I'M A PORO"
@@ -0,0 +1,179 @@
1
+ require "spec_helper"
2
+
3
+ describe Subvalid::Validators::LengthValidator do
4
+ Thing = Struct.new(:list)
5
+ let(:thing) { Thing.new(list) }
6
+ let(:list) { [] }
7
+
8
+ describe '#validate' do
9
+ context 'when attribute is a string' do
10
+ context 'with minimum' do
11
+ class MinValidator
12
+ include Subvalid::Validator
13
+ validates :list, length: {minimum: 2}
14
+ end
15
+
16
+ subject(:validator) { MinValidator.validate(thing) }
17
+
18
+ it 'returns a validation result' do
19
+ expect(validator).to be_a(Subvalid::ValidationResult)
20
+ end
21
+
22
+ context 'when the length is just right' do
23
+ let(:list) { 'a' * 3 }
24
+ it { is_expected.to be_valid }
25
+ end
26
+
27
+ context 'when the length is too short' do
28
+ it { is_expected.not_to be_valid }
29
+
30
+ it 'shows the default error message' do
31
+ expect(validator.children[:list].errors).to include("cannot be shorter than 2 characters")
32
+ end
33
+ end
34
+ end
35
+
36
+ context 'with maximum' do
37
+ class MaxValidator
38
+ include Subvalid::Validator
39
+ validates :list, length: {maximum: 10}
40
+ end
41
+
42
+ subject(:validator) { MaxValidator.validate(thing) }
43
+
44
+ it 'returns a validation result' do
45
+ expect(validator).to be_a(Subvalid::ValidationResult)
46
+ end
47
+
48
+ context 'when the length is just right' do
49
+ it { is_expected.to be_valid }
50
+ end
51
+
52
+ context 'when the length is too long' do
53
+ let(:list) { 'a' * 30 }
54
+ it { is_expected.not_to be_valid }
55
+
56
+ it 'shows the default error message' do
57
+ expect(validator.children[:list].errors).to include("cannot be longer than 10 characters")
58
+ end
59
+ end
60
+ end
61
+
62
+ context 'with exact character count' do
63
+ class ExactLengthValidator
64
+ include Subvalid::Validator
65
+ validates :list, length: {is: 4}
66
+ end
67
+
68
+ subject(:validator) { ExactLengthValidator.validate(thing) }
69
+
70
+ it 'returns a validation result' do
71
+ expect(validator).to be_a(Subvalid::ValidationResult)
72
+ end
73
+
74
+ context 'when the length is just right' do
75
+ let(:list) { 'a' * 4 }
76
+ it { is_expected.to be_valid }
77
+ end
78
+
79
+ context 'when the length is too short' do
80
+ it { is_expected.not_to be_valid }
81
+ end
82
+
83
+ context 'when the length is too long' do
84
+ let(:list) { 'a' * 5 }
85
+ it { is_expected.not_to be_valid }
86
+
87
+ it 'shows the default error message' do
88
+ expect(validator.children[:list].errors).to include("should have exactly 4 characters")
89
+ end
90
+ end
91
+ end
92
+
93
+ context 'with a range' do
94
+ context 'when using within' do
95
+ class WithinValidator
96
+ include Subvalid::Validator
97
+ validates :list, length: {within: 2..4}
98
+ end
99
+
100
+ subject(:validator) { WithinValidator.validate(thing) }
101
+
102
+ it 'returns a validation result' do
103
+ expect(validator).to be_a(Subvalid::ValidationResult)
104
+ end
105
+
106
+ context 'when the length is just right' do
107
+ let(:list) { 'a' * 3 }
108
+ it { is_expected.to be_valid }
109
+ end
110
+
111
+ context 'when the length is too short' do
112
+ it { is_expected.not_to be_valid }
113
+ end
114
+
115
+ context 'when the length is too long' do
116
+ let(:list) { 'a' * 5 }
117
+ it { is_expected.not_to be_valid }
118
+
119
+ it 'shows the default error message' do
120
+ expect(validator.children[:list].errors).to include("should contain 2 to 4 characters")
121
+ end
122
+ end
123
+ end
124
+
125
+ context 'when using in' do
126
+ class InValidator
127
+ include Subvalid::Validator
128
+ validates :list, length: {in: 2..4}
129
+ end
130
+
131
+ subject(:validator) { InValidator.validate(thing) }
132
+
133
+ it 'returns a validation result' do
134
+ expect(validator).to be_a(Subvalid::ValidationResult)
135
+ end
136
+
137
+ context 'when the length is just right' do
138
+ let(:list) { 'a' * 3 }
139
+ it { is_expected.to be_valid }
140
+ end
141
+
142
+ context 'when the length is too short' do
143
+ it { is_expected.not_to be_valid }
144
+ end
145
+
146
+ context 'when the length is too long' do
147
+ let(:list) { 'a' * 5 }
148
+ it { is_expected.not_to be_valid }
149
+
150
+ it 'shows the default error message' do
151
+ expect(validator.children[:list].errors).to include("should contain 2 to 4 characters")
152
+ end
153
+ end
154
+ end
155
+ end
156
+ end
157
+
158
+ context 'when attribute is an array' do
159
+ context 'with custom message' do
160
+ class MaxWithMessageValidator
161
+ include Subvalid::Validator
162
+ validates :list, length: {maximum: 4, message: "cannot contain more than 5 items"}
163
+ end
164
+
165
+ subject(:validator) { MaxWithMessageValidator.validate(thing) }
166
+
167
+ context 'when there are too many elements' do
168
+ context 'with provided message' do
169
+ let(:list) { [:a] * 5 }
170
+
171
+ it 'shows custom error message' do
172
+ expect(validator.children[:list].errors).to include("cannot contain more than 5 items")
173
+ end
174
+ end
175
+ end
176
+ end
177
+ end
178
+ end
179
+ end
@@ -18,8 +18,8 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.add_development_dependency "bundler", "~> 1.7"
22
- spec.add_development_dependency "rake", "~> 10.0"
21
+ spec.add_development_dependency "bundler"
22
+ spec.add_development_dependency "rake"
23
23
  spec.add_development_dependency "rspec"
24
24
  spec.add_development_dependency "pry"
25
25
  end
metadata CHANGED
@@ -1,43 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: subvalid
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Julian Doherty
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-06-27 00:00:00.000000000 Z
11
+ date: 2019-05-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '1.7'
19
+ version: '0'
20
20
  type: :development
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: '1.7'
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '10.0'
33
+ version: '0'
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: '10.0'
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -100,6 +100,7 @@ files:
100
100
  - spec/subvalid/validation_result_spec.rb
101
101
  - spec/subvalid/validator_registry_spec.rb
102
102
  - spec/subvalid/validator_spec.rb
103
+ - spec/subvalid/validators/length_validator_spec.rb
103
104
  - spec/subvalid_spec.rb
104
105
  - subvalid.gemspec
105
106
  homepage: ''
@@ -121,8 +122,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
121
122
  - !ruby/object:Gem::Version
122
123
  version: '0'
123
124
  requirements: []
124
- rubyforge_project:
125
- rubygems_version: 2.5.1
125
+ rubygems_version: 3.0.1
126
126
  signing_key:
127
127
  specification_version: 4
128
128
  summary: Subjective validation for Plain Old Ruby Objects
@@ -131,4 +131,5 @@ test_files:
131
131
  - spec/subvalid/validation_result_spec.rb
132
132
  - spec/subvalid/validator_registry_spec.rb
133
133
  - spec/subvalid/validator_spec.rb
134
+ - spec/subvalid/validators/length_validator_spec.rb
134
135
  - spec/subvalid_spec.rb