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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1c37efc593f813e90d3bdd6969673232ce5fb342e7bca15b149fd2315bc25926
4
- data.tar.gz: e295cb6a4173f32d656a2ad209c2506afe12e21319f157fc414cb218338e1286
3
+ metadata.gz: 32c7948a3f64e0f2f5d648e6b78585100ddf30c3907a85df9072b36bd8237f3b
4
+ data.tar.gz: 7bdf81ee68471f5825d0ec93d96c215990c4b8b65dc60fd749206affc98c54db
5
5
  SHA512:
6
- metadata.gz: 60a0f783a9c482a6dda7da03371c83707d9daa9589955dac3ba9e6de75cf3eafc88006d9320312bc5b4ffbdab071b3168232d8843cb7b424f88cbdb9ad159774
7
- data.tar.gz: 97420a77ce746cca98d4cf074d700c6df49035a15c8416a87633823c1506428e8f8a23fd0f79aa8b47962db0a51531b132dbc3a2c632776672525cc0eeacad56
6
+ metadata.gz: bc9194585c2429df1cdfccc1439288d94eb3de065dc40491155c01f159355d5c5331175519d01effe12e1e6d5a6050dcab078eee9254ab9ed1a2d1517567f538
7
+ data.tar.gz: '00058c1e04fa56864e51e2bba074059b1ecef3d54361e5651b15718c06de7dface5505dd39c2135ee7c70e27d44e2d5e52a4c874e9c66a8fded2907981174643'
data/.rubocop.yml CHANGED
@@ -7,6 +7,8 @@ AllCops:
7
7
  NewCops: enable
8
8
  DisplayCopNames: true
9
9
  DisplayStyleGuide: true
10
+ Gemspec/RequireMFA:
11
+ Enabled: false
10
12
  Gemspec/RequiredRubyVersion:
11
13
  Enabled: false
12
14
  Layout/EmptyLinesAroundAttributeAccessor:
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.3.2)
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 (6.1.4)
11
- actionview (= 6.1.4)
12
- activesupport (= 6.1.4)
13
- rack (~> 2.0, >= 2.0.9)
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 (6.1.4)
18
- activesupport (= 6.1.4)
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 (6.1.4)
24
- activesupport (= 6.1.4)
25
- activesupport (6.1.4)
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.4.4)
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.8.10)
40
+ i18n (1.10.0)
42
41
  concurrent-ruby (~> 1.0)
43
- loofah (2.10.0)
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.5.3)
48
- minitest (5.14.4)
49
- nokogiri (1.11.7)
50
- mini_portile2 (~> 2.5.0)
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.20.1)
53
- parser (3.0.2.0)
51
+ parallel (1.21.0)
52
+ parser (3.1.1.0)
54
53
  ast (~> 2.4.1)
55
- racc (1.5.2)
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.3.0)
61
+ rails-html-sanitizer (1.4.2)
63
62
  loofah (~> 2.3)
64
- railties (6.1.4)
65
- actionpack (= 6.1.4)
66
- activesupport (= 6.1.4)
63
+ railties (7.0.2.2)
64
+ actionpack (= 7.0.2.2)
65
+ activesupport (= 7.0.2.2)
67
66
  method_source
68
- rake (>= 0.13)
67
+ rake (>= 12.2)
69
68
  thor (~> 1.0)
70
- rainbow (3.0.0)
69
+ zeitwerk (~> 2.5)
70
+ rainbow (3.1.1)
71
71
  rake (13.0.6)
72
- regexp_parser (2.1.1)
72
+ regexp_parser (2.2.1)
73
73
  rexml (3.2.5)
74
- rspec (3.10.0)
75
- rspec-core (~> 3.10.0)
76
- rspec-expectations (~> 3.10.0)
77
- rspec-mocks (~> 3.10.0)
78
- rspec-core (3.10.1)
79
- rspec-support (~> 3.10.0)
80
- rspec-expectations (3.10.1)
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.10.0)
83
- rspec-mocks (3.10.2)
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.10.0)
86
- rspec-rails (5.0.1)
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.10.2)
95
- rubocop (1.18.3)
94
+ rspec-support (3.11.0)
95
+ rubocop (1.25.1)
96
96
  parallel (~> 1.10)
97
- parser (>= 3.0.0.0)
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.7.0, < 2.0)
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.8.0)
105
- parser (>= 3.0.1.1)
106
- rubocop-performance (1.11.4)
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.4.0)
112
- rubocop (~> 1.0)
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.16.0)
116
- sexp_processor (~> 4.15, >= 4.15.1)
117
- sexp_processor (4.15.3)
118
- thor (1.1.0)
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.0.0)
122
- zeitwerk (2.4.2)
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: { root_only: true }
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
  ```
@@ -34,8 +34,8 @@ class CompareValidator < BaseValidator
34
34
  end
35
35
 
36
36
  def valid_attr?
37
- other = record.send(options[:to])
38
- value.send(CHECKS[check], other)
37
+ other = record.public_send(options[:to])
38
+ value.public_send(CHECKS[check], other)
39
39
  end
40
40
 
41
41
  end
@@ -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.send(CHECKS[option], size)
62
+ option_value.public_send(CHECKS[option], size)
63
63
  else
64
- size.send(CHECKS[option], option_value)
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 valid_attr?
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
- record.errors.add(attribute, error_message_for(:domain)) unless check
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
- record.errors.add(attribute, error_message_for(:root)) unless check
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
- check = Array(scheme).any? { |sch| value_downcased == sch.to_s.downcase }
56
- record.errors.add(attribute, error_message_for(:scheme)) unless check
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
@@ -3,7 +3,7 @@
3
3
  module Lite
4
4
  module Validators
5
5
 
6
- VERSION = '1.3.2'
6
+ VERSION = '1.6.0'
7
7
 
8
8
  end
9
9
  end
@@ -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.3.2
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: 2021-07-22 00:00:00.000000000 Z
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.2.24
279
+ rubygems_version: 3.3.4
278
280
  signing_key:
279
281
  specification_version: 4
280
282
  summary: Collection of ActiveModel/ActiveRecord validators