lite-validators 1.4.0 → 1.7.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
2
  SHA256:
3
- metadata.gz: e1e56debf660c1cb16481c4ba7e331c1d5f36f6666484b111fd4f54fd5dfe680
4
- data.tar.gz: 1b2b174b568d7e5f2a830fb98acd79064672477911d9ab2f2ce9128e22b4fbb5
3
+ metadata.gz: c30c0e86b00cc4525b0878c22cf5d5dfae82ffa4b3301726197d51c46efaba7e
4
+ data.tar.gz: 926913306e4b90b172db620412c5018090888b0bc8f76f3c3097f583c941f705
5
5
  SHA512:
6
- metadata.gz: b6bff3d5c92d63169e7fe5a73e88383d3e40a17e1a18ece15fa5efea477acdf577618d4ef4b5e9e3498b7bd50de77a4af53b2d468e368053c5f2180b6f9d6fbe
7
- data.tar.gz: 48b1f4e567f69000dd903420c7e0d3d93d55568c34cd00c3849cbd8678fa528f0d14c366e51c2f4921e2b706970ab2c135a0f805e9047b13669d709710af3f8e
6
+ metadata.gz: c53420f1612dd642452e7b9e1720e89cab49de4dd75d61e4c040eecc8474066908449be8d9740f39386ae52f3652428e4a6ab19c2be01b97789ba86282b242d4
7
+ data.tar.gz: 6ccb77637a747d155539cd2b7fc06a868fb4e816ccf501099b891968f132bb0f6aa0d8d967aaefcf1fe33e35303464724ad0b9973cea2bd96273f50c0805d66b
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.7.0] - 2022-03-17
10
+ ### Added
11
+ - Added Reference validator
12
+
13
+ ## [1.6.0] - 2022-02-17
14
+ ### Added
15
+ - Added List validator
16
+ ### Changed
17
+ - Update to use public_send instead of send
18
+
19
+ ## [1.5.0] - 2022-02-17
20
+ ### Changed
21
+ - Added `include_address` to ip_address validator
22
+ - Added `exclude_address` to ip_address validator
23
+
9
24
  ## [1.4.0] - 2022-02-11
10
25
  ### Changed
11
26
  - Added `include_host` to url validator
data/Gemfile.lock CHANGED
@@ -1,28 +1,28 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- lite-validators (1.4.0)
4
+ lite-validators (1.7.0)
5
5
  activemodel
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- actionpack (7.0.2.2)
11
- actionview (= 7.0.2.2)
12
- activesupport (= 7.0.2.2)
10
+ actionpack (7.0.2.3)
11
+ actionview (= 7.0.2.3)
12
+ activesupport (= 7.0.2.3)
13
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 (7.0.2.2)
18
- activesupport (= 7.0.2.2)
17
+ actionview (7.0.2.3)
18
+ activesupport (= 7.0.2.3)
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 (7.0.2.2)
24
- activesupport (= 7.0.2.2)
25
- activesupport (7.0.2.2)
23
+ activemodel (7.0.2.3)
24
+ activesupport (= 7.0.2.3)
25
+ activesupport (7.0.2.3)
26
26
  concurrent-ruby (~> 1.0, >= 1.0.2)
27
27
  i18n (>= 1.6, < 2)
28
28
  minitest (>= 5.1)
@@ -37,19 +37,19 @@ GEM
37
37
  fasterer (0.9.0)
38
38
  colorize (~> 0.7)
39
39
  ruby_parser (>= 3.14.1)
40
- i18n (1.9.1)
40
+ i18n (1.10.0)
41
41
  concurrent-ruby (~> 1.0)
42
- loofah (2.14.0)
42
+ loofah (2.15.0)
43
43
  crass (~> 1.0.2)
44
44
  nokogiri (>= 1.5.9)
45
45
  method_source (1.0.0)
46
- mini_portile2 (2.7.1)
46
+ mini_portile2 (2.8.0)
47
47
  minitest (5.15.0)
48
- nokogiri (1.13.1)
49
- mini_portile2 (~> 2.7.0)
48
+ nokogiri (1.13.3)
49
+ mini_portile2 (~> 2.8.0)
50
50
  racc (~> 1.4)
51
51
  parallel (1.21.0)
52
- parser (3.1.0.0)
52
+ parser (3.1.1.0)
53
53
  ast (~> 2.4.1)
54
54
  racc (1.6.0)
55
55
  rack (2.2.3)
@@ -60,16 +60,16 @@ GEM
60
60
  nokogiri (>= 1.6)
61
61
  rails-html-sanitizer (1.4.2)
62
62
  loofah (~> 2.3)
63
- railties (7.0.2.2)
64
- actionpack (= 7.0.2.2)
65
- activesupport (= 7.0.2.2)
63
+ railties (7.0.2.3)
64
+ actionpack (= 7.0.2.3)
65
+ activesupport (= 7.0.2.3)
66
66
  method_source
67
67
  rake (>= 12.2)
68
68
  thor (~> 1.0)
69
69
  zeitwerk (~> 2.5)
70
70
  rainbow (3.1.1)
71
71
  rake (13.0.6)
72
- regexp_parser (2.2.0)
72
+ regexp_parser (2.2.1)
73
73
  rexml (3.2.5)
74
74
  rspec (3.11.0)
75
75
  rspec-core (~> 3.11.0)
@@ -83,7 +83,7 @@ GEM
83
83
  rspec-mocks (3.11.0)
84
84
  diff-lcs (>= 1.2.0, < 2.0)
85
85
  rspec-support (~> 3.11.0)
86
- rspec-rails (5.1.0)
86
+ rspec-rails (5.1.1)
87
87
  actionpack (>= 5.2)
88
88
  activesupport (>= 5.2)
89
89
  railties (>= 5.2)
@@ -92,23 +92,23 @@ GEM
92
92
  rspec-mocks (~> 3.10)
93
93
  rspec-support (~> 3.10)
94
94
  rspec-support (3.11.0)
95
- rubocop (1.25.1)
95
+ rubocop (1.26.0)
96
96
  parallel (~> 1.10)
97
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.15.1, < 2.0)
101
+ rubocop-ast (>= 1.16.0, < 2.0)
102
102
  ruby-progressbar (~> 1.7)
103
103
  unicode-display_width (>= 1.4.0, < 3.0)
104
- rubocop-ast (1.15.1)
105
- parser (>= 3.0.1.1)
106
- rubocop-performance (1.13.2)
104
+ rubocop-ast (1.16.0)
105
+ parser (>= 3.1.1.0)
106
+ rubocop-performance (1.13.3)
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.8.0)
111
+ rubocop-rspec (2.9.0)
112
112
  rubocop (~> 1.19)
113
113
  ruby-progressbar (1.11.0)
114
114
  ruby_parser (3.18.1)
data/README.md CHANGED
@@ -51,10 +51,12 @@ 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)
57
58
  * [Phone number](https://github.com/drexed/lite-validators/blob/master/docs/PHONE_NUMBER.md)
59
+ * [Reference](https://github.com/drexed/lite-validators/blob/master/docs/REFERENCE.md)
58
60
  * [SEDOL](https://github.com/drexed/lite-validators/blob/master/docs/SEDOL.md)
59
61
  * [Slug](https://github.com/drexed/lite-validators/blob/master/docs/SLUG.md)
60
62
  * [SSN](https://github.com/drexed/lite-validators/blob/master/docs/SSN.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/REFERENCE.md ADDED
@@ -0,0 +1,25 @@
1
+ # Reference
2
+
3
+ #### Rules
4
+
5
+ ```ruby
6
+ # 1. Pattern
7
+ /\A[+-]?\d+\z/
8
+ ```
9
+
10
+ #### Options
11
+
12
+ Option | Type | Available | Default
13
+ --- | --- | --- | ---
14
+ association | symbol | object method | attribute without `_id`
15
+
16
+ #### Usage
17
+
18
+ ```ruby
19
+ class User < ActiveRecord::Base
20
+
21
+ validates :input_id, reference: true
22
+ validates :output_id, reference: { association: :input }
23
+
24
+ end
25
+ ```
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
 
@@ -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
@@ -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
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ReferenceValidator < BaseValidator
4
+
5
+ REGEXP = /\A[+-]?\d+\z/
6
+
7
+ private
8
+
9
+ def valid?
10
+ valid_id? || valid_object?
11
+ end
12
+
13
+ def valid_id?
14
+ if value.blank?
15
+ false
16
+ elsif !valid_regexp?
17
+ record.errors.add(attribute, *error_message)
18
+ else
19
+ !value.to_i.negative?
20
+ end
21
+ end
22
+
23
+ def valid_object?
24
+ association_object = options[:association] || attribute.to_s.chomp('_id')
25
+ record.send(association_object).present?
26
+ end
27
+
28
+ end
@@ -33,7 +33,9 @@ class UrlValidator < BaseValidator
33
33
 
34
34
  value_downcased = value.host.to_s.downcase
35
35
  check = Array(options[:domain]).any? { |domain| value_downcased.end_with?(".#{domain.downcase}") }
36
- 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))
37
39
  end
38
40
 
39
41
  def valid_host?
@@ -42,15 +44,19 @@ class UrlValidator < BaseValidator
42
44
 
43
45
  value_downcased = value.host.to_s.downcase
44
46
  check = options[:include_host] ? :any? : :none?
45
- check = Array(hosts).send(check) { |host| value_downcased.include?(host.to_s.downcase) }
46
- record.errors.add(attribute, error_message_for(:host)) unless check
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))
47
51
  end
48
52
 
49
53
  def valid_root?
50
54
  return true unless options[:root_only]
51
55
 
52
56
  check = ['', '/'].include?(value.path) && value.query.blank? && value.fragment.blank?
53
- 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))
54
60
  end
55
61
 
56
62
  def valid_scheme?
@@ -59,7 +65,9 @@ class UrlValidator < BaseValidator
59
65
  value_downcased = value.scheme.to_s.downcase
60
66
  schemes = options[:scheme] || SCHEMES
61
67
  check = Array(schemes).any? { |scheme| value_downcased == scheme.to_s.downcase }
62
- record.errors.add(attribute, error_message_for(:scheme)) unless check
68
+ return true if check
69
+
70
+ record.errors.add(attribute, error_message_for(:scheme))
63
71
  end
64
72
 
65
73
  def valid_uri?
@@ -3,7 +3,7 @@
3
3
  module Lite
4
4
  module Validators
5
5
 
6
- VERSION = '1.4.0'
6
+ VERSION = '1.7.0'
7
7
 
8
8
  end
9
9
  end
@@ -25,10 +25,12 @@ 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'
31
32
  require 'lite/validators/phone_number_validator'
33
+ require 'lite/validators/reference_validator'
32
34
  require 'lite/validators/sedol_validator'
33
35
  require 'lite/validators/slug_validator'
34
36
  require 'lite/validators/ssn_validator'
data/lib/locales/en.yml CHANGED
@@ -21,6 +21,8 @@ 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"
26
28
  host: "has an invalid host"
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.0
4
+ version: 1.7.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: 2022-02-11 00:00:00.000000000 Z
11
+ date: 2022-03-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemodel
@@ -205,10 +205,12 @@ 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
211
212
  - docs/PHONE_NUMBER.md
213
+ - docs/REFERENCE.md
212
214
  - docs/SEDOL.md
213
215
  - docs/SLUG.md
214
216
  - docs/SSN.md
@@ -239,11 +241,13 @@ files:
239
241
  - lib/lite/validators/ip_address_validator.rb
240
242
  - lib/lite/validators/isbn_validator.rb
241
243
  - lib/lite/validators/isin_validator.rb
244
+ - lib/lite/validators/list_validator.rb
242
245
  - lib/lite/validators/mac_address_validator.rb
243
246
  - lib/lite/validators/name_validator.rb
244
247
  - lib/lite/validators/password_validator.rb
245
248
  - lib/lite/validators/phone_number_validator.rb
246
249
  - lib/lite/validators/railtie.rb
250
+ - lib/lite/validators/reference_validator.rb
247
251
  - lib/lite/validators/sedol_validator.rb
248
252
  - lib/lite/validators/slug_validator.rb
249
253
  - lib/lite/validators/ssn_validator.rb