lite-validators 1.3.2 → 1.6.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 +4 -4
- data/.rubocop.yml +2 -0
- data/CHANGELOG.md +15 -0
- data/Gemfile.lock +54 -55
- data/README.md +1 -0
- data/docs/IP_ADDRESS.md +4 -0
- data/docs/LIST.md +28 -0
- data/docs/URL.md +5 -1
- data/lib/lite/validators/compare_validator.rb +2 -2
- data/lib/lite/validators/cusip_validator.rb +1 -1
- data/lib/lite/validators/file_size_validator.rb +2 -2
- data/lib/lite/validators/ip_address_validator.rb +20 -1
- data/lib/lite/validators/list_validator.rb +35 -0
- data/lib/lite/validators/sedol_validator.rb +1 -1
- data/lib/lite/validators/url_validator.rb +27 -12
- data/lib/lite/validators/version.rb +1 -1
- data/lib/lite/validators.rb +1 -0
- data/lib/locales/en.yml +3 -0
- metadata +5 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 32c7948a3f64e0f2f5d648e6b78585100ddf30c3907a85df9072b36bd8237f3b
|
|
4
|
+
data.tar.gz: 7bdf81ee68471f5825d0ec93d96c215990c4b8b65dc60fd749206affc98c54db
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: bc9194585c2429df1cdfccc1439288d94eb3de065dc40491155c01f159355d5c5331175519d01effe12e1e6d5a6050dcab078eee9254ab9ed1a2d1517567f538
|
|
7
|
+
data.tar.gz: '00058c1e04fa56864e51e2bba074059b1ecef3d54361e5651b15718c06de7dface5505dd39c2135ee7c70e27d44e2d5e52a4c874e9c66a8fded2907981174643'
|
data/.rubocop.yml
CHANGED
data/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [1.6.0] - 2022-02-17
|
|
10
|
+
### Changed
|
|
11
|
+
- Added List validator
|
|
12
|
+
- Update to use public_send instead of send
|
|
13
|
+
|
|
14
|
+
## [1.5.0] - 2022-02-17
|
|
15
|
+
### Changed
|
|
16
|
+
- Added `include_address` to ip_address validator
|
|
17
|
+
- Added `exclude_address` to ip_address validator
|
|
18
|
+
|
|
19
|
+
## [1.4.0] - 2022-02-11
|
|
20
|
+
### Changed
|
|
21
|
+
- Added `include_host` to url validator
|
|
22
|
+
- Added `exclude_host` to url validator
|
|
23
|
+
|
|
9
24
|
## [1.3.2] - 2021-07-22
|
|
10
25
|
### Changed
|
|
11
26
|
- Improved setup
|
data/Gemfile.lock
CHANGED
|
@@ -1,89 +1,89 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
lite-validators (1.
|
|
4
|
+
lite-validators (1.6.0)
|
|
5
5
|
activemodel
|
|
6
6
|
|
|
7
7
|
GEM
|
|
8
8
|
remote: https://rubygems.org/
|
|
9
9
|
specs:
|
|
10
|
-
actionpack (
|
|
11
|
-
actionview (=
|
|
12
|
-
activesupport (=
|
|
13
|
-
rack (~> 2.0, >= 2.0
|
|
10
|
+
actionpack (7.0.2.2)
|
|
11
|
+
actionview (= 7.0.2.2)
|
|
12
|
+
activesupport (= 7.0.2.2)
|
|
13
|
+
rack (~> 2.0, >= 2.2.0)
|
|
14
14
|
rack-test (>= 0.6.3)
|
|
15
15
|
rails-dom-testing (~> 2.0)
|
|
16
16
|
rails-html-sanitizer (~> 1.0, >= 1.2.0)
|
|
17
|
-
actionview (
|
|
18
|
-
activesupport (=
|
|
17
|
+
actionview (7.0.2.2)
|
|
18
|
+
activesupport (= 7.0.2.2)
|
|
19
19
|
builder (~> 3.1)
|
|
20
20
|
erubi (~> 1.4)
|
|
21
21
|
rails-dom-testing (~> 2.0)
|
|
22
22
|
rails-html-sanitizer (~> 1.1, >= 1.2.0)
|
|
23
|
-
activemodel (
|
|
24
|
-
activesupport (=
|
|
25
|
-
activesupport (
|
|
23
|
+
activemodel (7.0.2.2)
|
|
24
|
+
activesupport (= 7.0.2.2)
|
|
25
|
+
activesupport (7.0.2.2)
|
|
26
26
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
|
27
27
|
i18n (>= 1.6, < 2)
|
|
28
28
|
minitest (>= 5.1)
|
|
29
29
|
tzinfo (~> 2.0)
|
|
30
|
-
zeitwerk (~> 2.3)
|
|
31
30
|
ast (2.4.2)
|
|
32
31
|
builder (3.2.4)
|
|
33
32
|
colorize (0.8.1)
|
|
34
33
|
concurrent-ruby (1.1.9)
|
|
35
34
|
crass (1.0.6)
|
|
36
|
-
diff-lcs (1.
|
|
35
|
+
diff-lcs (1.5.0)
|
|
37
36
|
erubi (1.10.0)
|
|
38
37
|
fasterer (0.9.0)
|
|
39
38
|
colorize (~> 0.7)
|
|
40
39
|
ruby_parser (>= 3.14.1)
|
|
41
|
-
i18n (1.
|
|
40
|
+
i18n (1.10.0)
|
|
42
41
|
concurrent-ruby (~> 1.0)
|
|
43
|
-
loofah (2.
|
|
42
|
+
loofah (2.14.0)
|
|
44
43
|
crass (~> 1.0.2)
|
|
45
44
|
nokogiri (>= 1.5.9)
|
|
46
45
|
method_source (1.0.0)
|
|
47
|
-
mini_portile2 (2.
|
|
48
|
-
minitest (5.
|
|
49
|
-
nokogiri (1.
|
|
50
|
-
mini_portile2 (~> 2.
|
|
46
|
+
mini_portile2 (2.8.0)
|
|
47
|
+
minitest (5.15.0)
|
|
48
|
+
nokogiri (1.13.3)
|
|
49
|
+
mini_portile2 (~> 2.8.0)
|
|
51
50
|
racc (~> 1.4)
|
|
52
|
-
parallel (1.
|
|
53
|
-
parser (3.
|
|
51
|
+
parallel (1.21.0)
|
|
52
|
+
parser (3.1.1.0)
|
|
54
53
|
ast (~> 2.4.1)
|
|
55
|
-
racc (1.
|
|
54
|
+
racc (1.6.0)
|
|
56
55
|
rack (2.2.3)
|
|
57
56
|
rack-test (1.1.0)
|
|
58
57
|
rack (>= 1.0, < 3)
|
|
59
58
|
rails-dom-testing (2.0.3)
|
|
60
59
|
activesupport (>= 4.2.0)
|
|
61
60
|
nokogiri (>= 1.6)
|
|
62
|
-
rails-html-sanitizer (1.
|
|
61
|
+
rails-html-sanitizer (1.4.2)
|
|
63
62
|
loofah (~> 2.3)
|
|
64
|
-
railties (
|
|
65
|
-
actionpack (=
|
|
66
|
-
activesupport (=
|
|
63
|
+
railties (7.0.2.2)
|
|
64
|
+
actionpack (= 7.0.2.2)
|
|
65
|
+
activesupport (= 7.0.2.2)
|
|
67
66
|
method_source
|
|
68
|
-
rake (>=
|
|
67
|
+
rake (>= 12.2)
|
|
69
68
|
thor (~> 1.0)
|
|
70
|
-
|
|
69
|
+
zeitwerk (~> 2.5)
|
|
70
|
+
rainbow (3.1.1)
|
|
71
71
|
rake (13.0.6)
|
|
72
|
-
regexp_parser (2.
|
|
72
|
+
regexp_parser (2.2.1)
|
|
73
73
|
rexml (3.2.5)
|
|
74
|
-
rspec (3.
|
|
75
|
-
rspec-core (~> 3.
|
|
76
|
-
rspec-expectations (~> 3.
|
|
77
|
-
rspec-mocks (~> 3.
|
|
78
|
-
rspec-core (3.
|
|
79
|
-
rspec-support (~> 3.
|
|
80
|
-
rspec-expectations (3.
|
|
74
|
+
rspec (3.11.0)
|
|
75
|
+
rspec-core (~> 3.11.0)
|
|
76
|
+
rspec-expectations (~> 3.11.0)
|
|
77
|
+
rspec-mocks (~> 3.11.0)
|
|
78
|
+
rspec-core (3.11.0)
|
|
79
|
+
rspec-support (~> 3.11.0)
|
|
80
|
+
rspec-expectations (3.11.0)
|
|
81
81
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
82
|
-
rspec-support (~> 3.
|
|
83
|
-
rspec-mocks (3.
|
|
82
|
+
rspec-support (~> 3.11.0)
|
|
83
|
+
rspec-mocks (3.11.0)
|
|
84
84
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
85
|
-
rspec-support (~> 3.
|
|
86
|
-
rspec-rails (5.0
|
|
85
|
+
rspec-support (~> 3.11.0)
|
|
86
|
+
rspec-rails (5.1.0)
|
|
87
87
|
actionpack (>= 5.2)
|
|
88
88
|
activesupport (>= 5.2)
|
|
89
89
|
railties (>= 5.2)
|
|
@@ -91,35 +91,34 @@ GEM
|
|
|
91
91
|
rspec-expectations (~> 3.10)
|
|
92
92
|
rspec-mocks (~> 3.10)
|
|
93
93
|
rspec-support (~> 3.10)
|
|
94
|
-
rspec-support (3.
|
|
95
|
-
rubocop (1.
|
|
94
|
+
rspec-support (3.11.0)
|
|
95
|
+
rubocop (1.25.1)
|
|
96
96
|
parallel (~> 1.10)
|
|
97
|
-
parser (>= 3.
|
|
97
|
+
parser (>= 3.1.0.0)
|
|
98
98
|
rainbow (>= 2.2.2, < 4.0)
|
|
99
99
|
regexp_parser (>= 1.8, < 3.0)
|
|
100
100
|
rexml
|
|
101
|
-
rubocop-ast (>= 1.
|
|
101
|
+
rubocop-ast (>= 1.15.1, < 2.0)
|
|
102
102
|
ruby-progressbar (~> 1.7)
|
|
103
103
|
unicode-display_width (>= 1.4.0, < 3.0)
|
|
104
|
-
rubocop-ast (1.
|
|
105
|
-
parser (>= 3.
|
|
106
|
-
rubocop-performance (1.
|
|
104
|
+
rubocop-ast (1.16.0)
|
|
105
|
+
parser (>= 3.1.1.0)
|
|
106
|
+
rubocop-performance (1.13.2)
|
|
107
107
|
rubocop (>= 1.7.0, < 2.0)
|
|
108
108
|
rubocop-ast (>= 0.4.0)
|
|
109
109
|
rubocop-rake (0.6.0)
|
|
110
110
|
rubocop (~> 1.0)
|
|
111
|
-
rubocop-rspec (2.
|
|
112
|
-
rubocop (~> 1.
|
|
113
|
-
rubocop-ast (>= 1.1.0)
|
|
111
|
+
rubocop-rspec (2.9.0)
|
|
112
|
+
rubocop (~> 1.19)
|
|
114
113
|
ruby-progressbar (1.11.0)
|
|
115
|
-
ruby_parser (3.
|
|
116
|
-
sexp_processor (~> 4.
|
|
117
|
-
sexp_processor (4.
|
|
118
|
-
thor (1.1
|
|
114
|
+
ruby_parser (3.18.1)
|
|
115
|
+
sexp_processor (~> 4.16)
|
|
116
|
+
sexp_processor (4.16.0)
|
|
117
|
+
thor (1.2.1)
|
|
119
118
|
tzinfo (2.0.4)
|
|
120
119
|
concurrent-ruby (~> 1.0)
|
|
121
|
-
unicode-display_width (2.
|
|
122
|
-
zeitwerk (2.4
|
|
120
|
+
unicode-display_width (2.1.0)
|
|
121
|
+
zeitwerk (2.5.4)
|
|
123
122
|
|
|
124
123
|
PLATFORMS
|
|
125
124
|
ruby
|
data/README.md
CHANGED
|
@@ -51,6 +51,7 @@ Or install it yourself as:
|
|
|
51
51
|
* [IP address](https://github.com/drexed/lite-validators/blob/master/docs/IP_ADDRESS.md)
|
|
52
52
|
* [ISBN](https://github.com/drexed/lite-validators/blob/master/docs/ISBN.md)
|
|
53
53
|
* [ISIN](https://github.com/drexed/lite-validators/blob/master/docs/ISIN.md)
|
|
54
|
+
* [List](https://github.com/drexed/lite-validators/blob/master/docs/LIST.md)
|
|
54
55
|
* [MAC address](https://github.com/drexed/lite-validators/blob/master/docs/MAC.md)
|
|
55
56
|
* [Name](https://github.com/drexed/lite-validators/blob/master/docs/NAME.md)
|
|
56
57
|
* [Password](https://github.com/drexed/lite-validators/blob/master/docs/PASSWORD.md)
|
data/docs/IP_ADDRESS.md
CHANGED
|
@@ -13,6 +13,8 @@
|
|
|
13
13
|
Option | Type | Available | Default
|
|
14
14
|
--- | --- | --- | ---
|
|
15
15
|
protocol | symbol | any, ipv4, ipv6 | any
|
|
16
|
+
include_address | array, string, symbol | |
|
|
17
|
+
exclude_address | array, string, symbol | |
|
|
16
18
|
|
|
17
19
|
#### Usage
|
|
18
20
|
|
|
@@ -21,6 +23,8 @@ class User < ActiveRecord::Base
|
|
|
21
23
|
|
|
22
24
|
validates :input0, ip_address: true
|
|
23
25
|
validates :input1, ip_address: { protocol: :ipv4 }
|
|
26
|
+
validates :input2, ip_address: { include_address: ['0.0.0.0', '99.39.240.31'] }
|
|
27
|
+
validates :input3, ip_address: { exclude_address: ['0.0.0.0', '99.39.240.31'] }
|
|
24
28
|
|
|
25
29
|
end
|
|
26
30
|
```
|
data/docs/LIST.md
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# List
|
|
2
|
+
|
|
3
|
+
#### Rules
|
|
4
|
+
|
|
5
|
+
```ruby
|
|
6
|
+
# 1. Check
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
#### Options
|
|
10
|
+
|
|
11
|
+
Option | Type | Available | Default
|
|
12
|
+
--- | --- | --- | ---
|
|
13
|
+
all | array | |
|
|
14
|
+
any | array | |
|
|
15
|
+
none | array | |
|
|
16
|
+
|
|
17
|
+
#### Usage
|
|
18
|
+
|
|
19
|
+
```ruby
|
|
20
|
+
class User < ActiveRecord::Base
|
|
21
|
+
|
|
22
|
+
validates :input0, list: { all: %w[monday tuesday] }
|
|
23
|
+
validates :input1, list: { any: %w[saturday sunday] }
|
|
24
|
+
validates :input2, list: { none: %w[wednesday thursday] }
|
|
25
|
+
validates :input3, list: { any: %w[saturday sunday], none: %w[wednesday thursday] }
|
|
26
|
+
|
|
27
|
+
end
|
|
28
|
+
```
|
data/docs/URL.md
CHANGED
|
@@ -13,6 +13,8 @@ Option | Type | Available | Default
|
|
|
13
13
|
domain | array, string, symbol | |
|
|
14
14
|
root_only | boolean | true, false | false
|
|
15
15
|
scheme | array, string, symbol | |
|
|
16
|
+
include_host | array, string, symbol | |
|
|
17
|
+
exclude_host | array, string, symbol | |
|
|
16
18
|
|
|
17
19
|
#### Usage
|
|
18
20
|
|
|
@@ -22,7 +24,9 @@ class User < ActiveRecord::Base
|
|
|
22
24
|
validates :input0, url: true
|
|
23
25
|
validates :input1, url: { domain: [:com, 'org'] }
|
|
24
26
|
validates :input2, url: { scheme: :https }
|
|
25
|
-
validates :input3, url: {
|
|
27
|
+
validates :input3, url: { include_host: ['example', 'test.org'] }
|
|
28
|
+
validates :input4, url: { exclude_host: ['example', 'test.org'] }
|
|
29
|
+
validates :input5, url: { root_only: true }
|
|
26
30
|
|
|
27
31
|
end
|
|
28
32
|
```
|
|
@@ -18,7 +18,7 @@ class CusipValidator < BaseValidator
|
|
|
18
18
|
odd_values = digits.values_at(*digits.each_index.select(&:odd?))
|
|
19
19
|
|
|
20
20
|
values = odd_values.map { |int| int * 2 }.zip(even_values).flatten
|
|
21
|
-
values = values.inject(0) { |sum, int| sum + (int / 10) + int % 10 }
|
|
21
|
+
values = values.inject(0) { |sum, int| sum + (int / 10) + (int % 10) }
|
|
22
22
|
|
|
23
23
|
((10 - values) % 10) % 10
|
|
24
24
|
end
|
|
@@ -59,9 +59,9 @@ class FileSizeValidator < BaseValidator
|
|
|
59
59
|
return false if size.nil?
|
|
60
60
|
|
|
61
61
|
if option_value.is_a?(Range)
|
|
62
|
-
option_value.
|
|
62
|
+
option_value.public_send(CHECKS[option], size)
|
|
63
63
|
else
|
|
64
|
-
size.
|
|
64
|
+
size.public_send(CHECKS[option], option_value)
|
|
65
65
|
end
|
|
66
66
|
end
|
|
67
67
|
|
|
@@ -20,11 +20,30 @@ class IpAddressValidator < BaseValidator
|
|
|
20
20
|
assert_valid_option!(:protocol, REGEXP.keys.push(:any))
|
|
21
21
|
end
|
|
22
22
|
|
|
23
|
+
def error_message_for(option)
|
|
24
|
+
options[:message] || I18n.t("errors.messages.ip_address.#{option}")
|
|
25
|
+
end
|
|
26
|
+
|
|
23
27
|
def protocol
|
|
24
28
|
options[:protocol] || :any
|
|
25
29
|
end
|
|
26
30
|
|
|
27
|
-
def
|
|
31
|
+
def valid?
|
|
32
|
+
valid_format? && valid_address?
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def valid_address?
|
|
36
|
+
addresses = options[:include_address] || options[:exclude_address]
|
|
37
|
+
return true unless addresses
|
|
38
|
+
|
|
39
|
+
check = options[:include_address] ? :any? : :none?
|
|
40
|
+
check = Array(addresses).public_send(check) { |address| value.include?(address.to_s) }
|
|
41
|
+
return true if check
|
|
42
|
+
|
|
43
|
+
record.errors.add(attribute, error_message_for(:address))
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def valid_format?
|
|
28
47
|
case protocol
|
|
29
48
|
when :ipv4 then valid_regexp?(:ipv4)
|
|
30
49
|
when :ipv6 then valid_regexp?(:ipv6)
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
class ListValidator < BaseValidator
|
|
4
|
+
|
|
5
|
+
def validate_each(record, attribute, value)
|
|
6
|
+
assert_valid_all_or_any_or_none!
|
|
7
|
+
assign_attr_readers(record, attribute, value)
|
|
8
|
+
valid?
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
private
|
|
12
|
+
|
|
13
|
+
def assert_valid_all_or_any_or_none!
|
|
14
|
+
return if options.key?(:all) || options.key?(:any) || options.key?(:none)
|
|
15
|
+
|
|
16
|
+
raise ArgumentError, 'Missing ":all", ":any" or ":none" attribute for comparison.'
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def valid_attr?
|
|
20
|
+
options.slice(:all, :any, :none).each do |option, option_value|
|
|
21
|
+
validate_check(option, option_value)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def valid_content_type?(option, option_value)
|
|
26
|
+
Array(value).public_send("#{option}?") { |val| option_value.include?(val) }
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def validate_check(option, option_value)
|
|
30
|
+
return if valid_content_type?(option, option_value)
|
|
31
|
+
|
|
32
|
+
record.errors.add(attribute, *error_message)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
end
|
|
@@ -17,7 +17,7 @@ class SedolValidator < BaseValidator
|
|
|
17
17
|
total = 0
|
|
18
18
|
digits = value.chars.map { |dgt| /[A-Z]/.match?(dgt) ? (dgt.ord - 55) : dgt.to_i }
|
|
19
19
|
digits.each_with_index { |dgt, idx| total += (WEIGHTS[idx] * dgt) }
|
|
20
|
-
(10 - total % 10) % 10
|
|
20
|
+
(10 - (total % 10)) % 10
|
|
21
21
|
end
|
|
22
22
|
|
|
23
23
|
end
|
|
@@ -11,53 +11,68 @@ class UrlValidator < BaseValidator
|
|
|
11
11
|
def validate_each(record, attribute, value)
|
|
12
12
|
assign_attr_readers(record, attribute, URI.parse(value.to_s))
|
|
13
13
|
valid_attr?
|
|
14
|
-
rescue URI::InvalidURIError
|
|
14
|
+
rescue URI::BadURIError, URI::InvalidURIError
|
|
15
15
|
record.errors.add(attribute, *error_message)
|
|
16
16
|
end
|
|
17
17
|
|
|
18
18
|
private
|
|
19
19
|
|
|
20
|
-
def scheme
|
|
21
|
-
options[:scheme] || UrlValidator::SCHEMES
|
|
22
|
-
end
|
|
23
|
-
|
|
24
20
|
def error_message_for(option)
|
|
25
21
|
options[:message] || I18n.t("errors.messages.url.#{option}")
|
|
26
22
|
end
|
|
27
23
|
|
|
24
|
+
# rubocop:disable Layout/LineLength, Metrics/AbcSize
|
|
28
25
|
def valid_attr?
|
|
29
26
|
raise URI::InvalidURIError if value.to_s.strip.empty?
|
|
30
27
|
|
|
31
|
-
valid_uri? && valid_domain? && valid_scheme? && valid_root?
|
|
28
|
+
valid_uri? && valid_host? && valid_domain? && valid_scheme? && valid_root?
|
|
32
29
|
end
|
|
33
30
|
|
|
34
|
-
# rubocop:disable Layout/LineLength, Metrics/AbcSize
|
|
35
31
|
def valid_domain?
|
|
36
32
|
return true unless options[:domain]
|
|
37
33
|
|
|
38
34
|
value_downcased = value.host.to_s.downcase
|
|
39
35
|
check = Array(options[:domain]).any? { |domain| value_downcased.end_with?(".#{domain.downcase}") }
|
|
40
|
-
|
|
36
|
+
return true if check
|
|
37
|
+
|
|
38
|
+
record.errors.add(attribute, error_message_for(:domain))
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def valid_host?
|
|
42
|
+
hosts = options[:include_host] || options[:exclude_host]
|
|
43
|
+
return true unless hosts
|
|
44
|
+
|
|
45
|
+
value_downcased = value.host.to_s.downcase
|
|
46
|
+
check = options[:include_host] ? :any? : :none?
|
|
47
|
+
check = Array(hosts).public_send(check) { |host| value_downcased.include?(host.to_s.downcase) }
|
|
48
|
+
return true if check
|
|
49
|
+
|
|
50
|
+
record.errors.add(attribute, error_message_for(:host))
|
|
41
51
|
end
|
|
42
|
-
# rubocop:enable Layout/LineLength, Metrics/AbcSize
|
|
43
52
|
|
|
44
53
|
def valid_root?
|
|
45
54
|
return true unless options[:root_only]
|
|
46
55
|
|
|
47
56
|
check = ['', '/'].include?(value.path) && value.query.blank? && value.fragment.blank?
|
|
48
|
-
|
|
57
|
+
return true if check
|
|
58
|
+
|
|
59
|
+
record.errors.add(attribute, error_message_for(:root))
|
|
49
60
|
end
|
|
50
61
|
|
|
51
62
|
def valid_scheme?
|
|
52
63
|
return true unless options[:scheme]
|
|
53
64
|
|
|
54
65
|
value_downcased = value.scheme.to_s.downcase
|
|
55
|
-
|
|
56
|
-
|
|
66
|
+
schemes = options[:scheme] || SCHEMES
|
|
67
|
+
check = Array(schemes).any? { |scheme| value_downcased == scheme.to_s.downcase }
|
|
68
|
+
return true if check
|
|
69
|
+
|
|
70
|
+
record.errors.add(attribute, error_message_for(:scheme))
|
|
57
71
|
end
|
|
58
72
|
|
|
59
73
|
def valid_uri?
|
|
60
74
|
value.is_a?(URI::Generic)
|
|
61
75
|
end
|
|
76
|
+
# rubocop:enable Layout/LineLength, Metrics/AbcSize
|
|
62
77
|
|
|
63
78
|
end
|
data/lib/lite/validators.rb
CHANGED
|
@@ -25,6 +25,7 @@ require 'lite/validators/imei_validator'
|
|
|
25
25
|
require 'lite/validators/ip_address_validator'
|
|
26
26
|
require 'lite/validators/isbn_validator'
|
|
27
27
|
require 'lite/validators/isin_validator'
|
|
28
|
+
require 'lite/validators/list_validator'
|
|
28
29
|
require 'lite/validators/mac_address_validator'
|
|
29
30
|
require 'lite/validators/name_validator'
|
|
30
31
|
require 'lite/validators/password_validator'
|
data/lib/locales/en.yml
CHANGED
|
@@ -21,7 +21,10 @@ en:
|
|
|
21
21
|
less_than_or_equal_to: "file size is not less than or equal to %{count}"
|
|
22
22
|
equal_to: "file size is not equal to %{count} but should"
|
|
23
23
|
not_equal_to: "file size is equal to %{count} but shouldn't"
|
|
24
|
+
ip_address:
|
|
25
|
+
address: "has an invalid address"
|
|
24
26
|
url:
|
|
25
27
|
domain: "has an invalid domain"
|
|
28
|
+
host: "has an invalid host"
|
|
26
29
|
root: "has a url path but shouldn't"
|
|
27
30
|
scheme: "has an invalid scheme"
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: lite-validators
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.6.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Juan Gomez
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: exe
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date:
|
|
11
|
+
date: 2022-03-04 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: activemodel
|
|
@@ -205,6 +205,7 @@ files:
|
|
|
205
205
|
- docs/IP_ADDRESS.md
|
|
206
206
|
- docs/ISBN.md
|
|
207
207
|
- docs/ISIN.md
|
|
208
|
+
- docs/LIST.md
|
|
208
209
|
- docs/MAC_ADDRESS.md
|
|
209
210
|
- docs/NAME.md
|
|
210
211
|
- docs/PASSWORD.md
|
|
@@ -239,6 +240,7 @@ files:
|
|
|
239
240
|
- lib/lite/validators/ip_address_validator.rb
|
|
240
241
|
- lib/lite/validators/isbn_validator.rb
|
|
241
242
|
- lib/lite/validators/isin_validator.rb
|
|
243
|
+
- lib/lite/validators/list_validator.rb
|
|
242
244
|
- lib/lite/validators/mac_address_validator.rb
|
|
243
245
|
- lib/lite/validators/name_validator.rb
|
|
244
246
|
- lib/lite/validators/password_validator.rb
|
|
@@ -274,7 +276,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
274
276
|
- !ruby/object:Gem::Version
|
|
275
277
|
version: '0'
|
|
276
278
|
requirements: []
|
|
277
|
-
rubygems_version: 3.
|
|
279
|
+
rubygems_version: 3.3.4
|
|
278
280
|
signing_key:
|
|
279
281
|
specification_version: 4
|
|
280
282
|
summary: Collection of ActiveModel/ActiveRecord validators
|