mini_defender 0.1.3 → 0.1.6

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: 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