mini_defender 0.1.3 → 0.1.6

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: a699d084ae691ee23d0df09ce95ed6dddc7bad0f47fdc1888025cbcc7a546aa2
4
- data.tar.gz: c5bd193ab55f4bdb8d850225425aac884aac3d70cf86cfa763f11a9aed0ddb07
3
+ metadata.gz: c249768a094c4518199ffd28c11b23cedc2795f2fd7b314066dd1ab8735ad64a
4
+ data.tar.gz: 03db289c1919edc2d6cfffd6db6f5ae70011a679edb1af8ae5ee7b915faa06b2
5
5
  SHA512:
6
- metadata.gz: 847de8ae3fd9563ff61013ebd36a660946a5ad8bbfdce2b82dee8d81d90abdef0704acdd976425cf5f20bf62bca9ea0353d888f0331964b4accf44f9afdad585
7
- data.tar.gz: cec864f4236ba28b34bf3b44987f59ebc22695e37b79b318aa1deed35308caa43981c3b58081b6ed244415632de2c8d62853013749601df5623af5554efa24d0
6
+ metadata.gz: bcb1491ce3eaef31ea2e713afd7651a5dd397ace80467eeab303086cda2ab1f23e8e044ace47f999ea49c62a31318650387044e4ae28c5e5d2204563c2746c33
7
+ data.tar.gz: 6bacb39daaf34e5e5d2685bb6e93629a8d390dc5dc0f7776495a4a1b003cb3e4939d9c67b2a3ccbe481758f24617707776b5768dc5b34b20d14995e1c33e67f4
data/.DS_Store ADDED
Binary file
@@ -74,4 +74,16 @@ class MiniDefender::Rule
74
74
  def message(attribute, value, validator)
75
75
  raise NotImplementedError, 'Use a concrete implementation.'
76
76
  end
77
+
78
+ def with_message(message)
79
+ @message = message
80
+ self
81
+ end
82
+
83
+ # @param [Object] attribute
84
+ # @param [Object] value
85
+ # @param [MiniDefender::Validator] validator
86
+ def error_message(attribute, value, validator)
87
+ @message || message(attribute, value, validator)
88
+ end
77
89
  end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ class MiniDefender::Rules::Hostname < MiniDefender::Rule
4
+ HOSTNAME_REGEX = /\A[a-zA-Z0-9][a-zA-Z0-9\-]{1,63}(\.[a-zA-Z0-9][a-zA-Z0-9\-]{1,63})+\.?\z/
5
+
6
+ def self.signature
7
+ 'hostname'
8
+ end
9
+
10
+ def coerce(value)
11
+ value.to_s.downcase.strip
12
+ end
13
+
14
+ def passes?(attribute, value, validator)
15
+ value = value.to_s.downcase.strip
16
+ return false if value.length > 255
17
+
18
+ value.match?(HOSTNAME_REGEX)
19
+ end
20
+
21
+ def message(attribute, value, validator)
22
+ 'Invalid hostname.'
23
+ end
24
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ class MiniDefender::Rules::Iban < MiniDefender::Rule
4
+ LENGTH_MATRIX = {
5
+ 'SA' => 24
6
+ }
7
+
8
+ def self.signature
9
+ 'iban'
10
+ end
11
+
12
+ def coerce(value)
13
+ value.to_s.upcase.gsub(/\s/, '')
14
+ end
15
+
16
+ def passes?(attribute, value, validator)
17
+ value = coerce(value)
18
+ value.match?(/[A-Z]{2}\d+/i) && valid_length?(value) && valid_checksum?(value)
19
+ end
20
+
21
+ def valid_checksum?(iban)
22
+ iban = "#{iban[4..]}#{letter_code(iban[0])}#{letter_code(iban[1])}#{iban[2..3]}".to_i
23
+ iban % 97 === 1
24
+ end
25
+
26
+ def valid_length?(iban)
27
+ iban.length == (LENGTH_MATRIX[iban[0..1]] || iban.length)
28
+ end
29
+
30
+ def message(attribute, value, validator)
31
+ "The value should be a valid IBAN."
32
+ end
33
+
34
+ private
35
+
36
+ def letter_code(letter)
37
+ # letter is assumed to be an upcase ASCII alphabet letter (A-Z)
38
+ letter.ord - 55
39
+ end
40
+ end
@@ -12,9 +12,9 @@ class MiniDefender::Rules::NotRegex < MiniDefender::Rule
12
12
  end
13
13
 
14
14
  def self.make(args)
15
- raise ArgumentError, 'Expected a pattern as input.' unless args.length == 1
15
+ raise ArgumentError, 'Expected a pattern as input.' unless args.length > 0
16
16
 
17
- new(Regexp.compile(args[0]))
17
+ new(Regexp.compile(args.join(',')))
18
18
  end
19
19
 
20
20
  def passes?(attribute, value, validator)
@@ -12,9 +12,9 @@ class MiniDefender::Rules::Regex < MiniDefender::Rule
12
12
  end
13
13
 
14
14
  def self.make(args)
15
- raise ArgumentError, 'Expected a pattern as input.' unless args.length == 1
15
+ raise ArgumentError, 'Expected a pattern as input.' unless args.length > 0
16
16
 
17
- new(Regexp.compile(args[0]))
17
+ new(Regexp.compile(args.join(',')))
18
18
  end
19
19
 
20
20
  def passes?(attribute, value, validator)
@@ -1,13 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class MiniDefender::Rules::Unique < MiniDefender::Rule
4
- def initialize(model, column)
5
- raise ArgumentError, 'model name must be a string or ActiveRecord::Base' unless model.is_a?(String)
6
- raise ArgumentError, 'Column name must be a string' unless column.is_a?(String)
4
+ def initialize(model, column = nil)
5
+ unless model.is_a?(String) || model.is_a?(Class) && model.ancestors.include?(ActiveRecord::Base)
6
+ raise ArgumentError, 'model name must be a string or ActiveRecord::Base'
7
+ end
7
8
 
8
- @model = model.camelcase.constantize
9
+ raise ArgumentError, 'Column name must be a string' unless column.is_a?(String) || column.nil?
10
+
11
+ @model = model
12
+ @model = @model.camelcase.constantize if model.is_a?(String)
9
13
  @column = column
10
14
  @ignore = nil
15
+ @additional_scope = nil
11
16
  end
12
17
 
13
18
  def self.signature
@@ -19,6 +24,11 @@ class MiniDefender::Rules::Unique < MiniDefender::Rule
19
24
  self
20
25
  end
21
26
 
27
+ def scope_by(callback)
28
+ @additional_scope = callback
29
+ self
30
+ end
31
+
22
32
  def self.make(args)
23
33
  raise ArgumentError, 'Model and column are required.' unless args.length == 2
24
34
 
@@ -26,9 +36,13 @@ class MiniDefender::Rules::Unique < MiniDefender::Rule
26
36
  end
27
37
 
28
38
  def passes?(attribute, value, validator)
39
+ @column = attribute.split('.')[-1] if @column.nil?
40
+
29
41
  query = @model.where(@column => value)
42
+ query = @additional_scope.call(query) unless @additional_scope.nil?
30
43
  query = query.where.not(@column, @ignore) unless @ignore.nil?
31
- query.exists?
44
+
45
+ !query.exists?
32
46
  end
33
47
 
34
48
  def message(attribute, value, validator)
@@ -57,7 +57,7 @@ module MiniDefender
57
57
  value_included &= !rule.excluded?(self)
58
58
 
59
59
  unless rule.passes?(k, value, self)
60
- @errors[k] << rule.message(k, value, self)
60
+ @errors[k] << rule.error_message(k, value, self)
61
61
  end
62
62
  end
63
63
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module MiniDefender
4
- VERSION = "0.1.3"
4
+ VERSION = "0.1.6"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mini_defender
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ali Alhoshaiyan
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-11-24 00:00:00.000000000 Z
11
+ date: 2022-11-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -74,9 +74,9 @@ executables: []
74
74
  extensions: []
75
75
  extra_rdoc_files: []
76
76
  files:
77
+ - ".DS_Store"
77
78
  - CHANGELOG.md
78
79
  - Gemfile
79
- - Gemfile.lock
80
80
  - LICENSE.md
81
81
  - README.md
82
82
  - RULES.md
@@ -127,6 +127,8 @@ files:
127
127
  - lib/mini_defender/rules/greater_than.rb
128
128
  - lib/mini_defender/rules/greater_than_or_equal.rb
129
129
  - lib/mini_defender/rules/hash.rb
130
+ - lib/mini_defender/rules/hostname.rb
131
+ - lib/mini_defender/rules/iban.rb
130
132
  - lib/mini_defender/rules/image.rb
131
133
  - lib/mini_defender/rules/in.rb
132
134
  - lib/mini_defender/rules/in_field.rb
@@ -198,7 +200,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
198
200
  - !ruby/object:Gem::Version
199
201
  version: '0'
200
202
  requirements: []
201
- rubygems_version: 3.3.7
203
+ rubygems_version: 3.3.26
202
204
  signing_key:
203
205
  specification_version: 4
204
206
  summary: A small and efficient validation library for Rails and anything that uses
data/Gemfile.lock DELETED
@@ -1,70 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- mini_defender (0.1.2)
5
- actionpack (>= 6.0)
6
- activemodel (>= 6.0)
7
- activesupport (>= 6.0)
8
- countries
9
-
10
- GEM
11
- remote: https://rubygems.org/
12
- specs:
13
- actionpack (7.0.4)
14
- actionview (= 7.0.4)
15
- activesupport (= 7.0.4)
16
- rack (~> 2.0, >= 2.2.0)
17
- rack-test (>= 0.6.3)
18
- rails-dom-testing (~> 2.0)
19
- rails-html-sanitizer (~> 1.0, >= 1.2.0)
20
- actionview (7.0.4)
21
- activesupport (= 7.0.4)
22
- builder (~> 3.1)
23
- erubi (~> 1.4)
24
- rails-dom-testing (~> 2.0)
25
- rails-html-sanitizer (~> 1.1, >= 1.2.0)
26
- activemodel (7.0.4)
27
- activesupport (= 7.0.4)
28
- activesupport (7.0.4)
29
- concurrent-ruby (~> 1.0, >= 1.0.2)
30
- i18n (>= 1.6, < 2)
31
- minitest (>= 5.1)
32
- tzinfo (~> 2.0)
33
- builder (3.2.4)
34
- concurrent-ruby (1.1.10)
35
- countries (5.2.0)
36
- unaccent (~> 0.3)
37
- crass (1.0.6)
38
- erubi (1.11.0)
39
- i18n (1.12.0)
40
- concurrent-ruby (~> 1.0)
41
- loofah (2.19.0)
42
- crass (~> 1.0.2)
43
- nokogiri (>= 1.5.9)
44
- minitest (5.16.3)
45
- nokogiri (1.13.9-arm64-darwin)
46
- racc (~> 1.4)
47
- racc (1.6.0)
48
- rack (2.2.4)
49
- rack-test (2.0.2)
50
- rack (>= 1.3)
51
- rails-dom-testing (2.0.3)
52
- activesupport (>= 4.2.0)
53
- nokogiri (>= 1.6)
54
- rails-html-sanitizer (1.4.3)
55
- loofah (~> 2.3)
56
- rake (13.0.6)
57
- tzinfo (2.0.5)
58
- concurrent-ruby (~> 1.0)
59
- unaccent (0.4.0)
60
-
61
- PLATFORMS
62
- arm64-darwin-21
63
-
64
- DEPENDENCIES
65
- mini_defender!
66
- minitest (~> 5.0)
67
- rake (~> 13.0)
68
-
69
- BUNDLED WITH
70
- 2.3.20