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 +4 -4
- data/.DS_Store +0 -0
- data/lib/mini_defender/rule.rb +12 -0
- data/lib/mini_defender/rules/hostname.rb +24 -0
- data/lib/mini_defender/rules/iban.rb +40 -0
- data/lib/mini_defender/rules/not_regex.rb +2 -2
- data/lib/mini_defender/rules/regex.rb +2 -2
- data/lib/mini_defender/rules/unique.rb +19 -5
- data/lib/mini_defender/validator.rb +1 -1
- data/lib/mini_defender/version.rb +1 -1
- metadata +6 -4
- data/Gemfile.lock +0 -70
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c249768a094c4518199ffd28c11b23cedc2795f2fd7b314066dd1ab8735ad64a
|
4
|
+
data.tar.gz: 03db289c1919edc2d6cfffd6db6f5ae70011a679edb1af8ae5ee7b915faa06b2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bcb1491ce3eaef31ea2e713afd7651a5dd397ace80467eeab303086cda2ab1f23e8e044ace47f999ea49c62a31318650387044e4ae28c5e5d2204563c2746c33
|
7
|
+
data.tar.gz: 6bacb39daaf34e5e5d2685bb6e93629a8d390dc5dc0f7776495a4a1b003cb3e4939d9c67b2a3ccbe481758f24617707776b5768dc5b34b20d14995e1c33e67f4
|
data/.DS_Store
ADDED
Binary file
|
data/lib/mini_defender/rule.rb
CHANGED
@@ -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
|
15
|
+
raise ArgumentError, 'Expected a pattern as input.' unless args.length > 0
|
16
16
|
|
17
|
-
new(Regexp.compile(args
|
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
|
15
|
+
raise ArgumentError, 'Expected a pattern as input.' unless args.length > 0
|
16
16
|
|
17
|
-
new(Regexp.compile(args
|
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
|
-
|
6
|
-
|
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
|
-
|
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
|
-
|
44
|
+
|
45
|
+
!query.exists?
|
32
46
|
end
|
33
47
|
|
34
48
|
def message(attribute, value, validator)
|
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.
|
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-
|
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.
|
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
|