mini_defender 0.6.9 → 0.7.1

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: 1a9dd7cd41807156b4aaa18aa7cf645fd00b67ea0dfbd9bc457e12c01bf9c6a3
4
- data.tar.gz: 9b666b35cbe313a93783609ada72dadffe70feacd7eb22dfba05d958906ac283
3
+ metadata.gz: b5b6dfb53b37f6a2c6b47b6e16e31fed61ef5a8b54c09bfdfb6cd281d184543e
4
+ data.tar.gz: 7377e5c6a38f01740bbc08599d8887230664d1aef7fd13d60fd15575d16b1457
5
5
  SHA512:
6
- metadata.gz: f604e44530496d5f20eddecc82806cd3b52ea66b2158dcb6cb106f7571f26c57153d3bba13cdc8f2a78c63f7dd9deb16132ad1dde220ab1eaded04fa6167afb5
7
- data.tar.gz: ce4951ee441eaac7eeba302336a9d7403a6cb18aa607784b28702ec02d654dc9b521bc8dde021e75bebc06ab9aad83b477da0aa90ba461514d03f7907fe2d1a3
6
+ metadata.gz: c139200a8d9ec41d27de36007df37022b138d4acdf83369cbdcb3690448cff2e46dfda9d3045ac922c0dae38f37a3f105dec376b943ec3edfd25b118ff00d2e7
7
+ data.tar.gz: 7c4afa6982e5746cbe19071abd5619e62cb02eb0788a9a3443e14fc15a0bbd83d53254e96cda8cd04e198464bb9908579f50547367682228c4f450acd3cd0974
data/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.7.1] - 2025-09-07
4
+
5
+ - Add password rule
6
+
3
7
  ## [0.3.0] - 2023-04-05
4
8
 
5
9
  - Add cleansing for data before validation
@@ -0,0 +1,70 @@
1
+ # frozen_string_literal: true
2
+
3
+ class MiniDefender::Rules::Password < MiniDefender::Rule
4
+ SPECIAL_CHARS = '!@#$%^&*()_+-=[]{}|;:,.<>?'.freeze
5
+ MIN_LENGTH = 8
6
+
7
+ def self.signature
8
+ 'password'
9
+ end
10
+
11
+ def passes?(attribute, value, validator)
12
+ unless value.is_a?(String)
13
+ return false
14
+ end
15
+
16
+ @missing_requirements = []
17
+
18
+ check_length(value)
19
+ check_lowercase(value)
20
+ check_uppercase(value)
21
+ check_digit(value)
22
+ check_special_char(value)
23
+
24
+ @missing_requirements.empty?
25
+ end
26
+
27
+ def message(attribute, value, validator)
28
+ unless value.is_a?(String)
29
+ return 'Password must be a string.'
30
+ end
31
+
32
+ if @missing_requirements.nil? || @missing_requirements.empty?
33
+ return 'Password is valid.'
34
+ end
35
+
36
+ "Password is missing: #{@missing_requirements.join(', ')}."
37
+ end
38
+
39
+ private
40
+
41
+ def check_length(value)
42
+ if value.length < MIN_LENGTH
43
+ @missing_requirements << "at least #{MIN_LENGTH} characters"
44
+ end
45
+ end
46
+
47
+ def check_lowercase(value)
48
+ unless value.match?(/[a-z]/)
49
+ @missing_requirements << 'at least one lowercase letter'
50
+ end
51
+ end
52
+
53
+ def check_uppercase(value)
54
+ unless value.match?(/[A-Z]/)
55
+ @missing_requirements << 'at least one uppercase letter'
56
+ end
57
+ end
58
+
59
+ def check_digit(value)
60
+ unless value.match?(/\d/)
61
+ @missing_requirements << 'at least one digit'
62
+ end
63
+ end
64
+
65
+ def check_special_char(value)
66
+ unless value.chars.any? { |char| SPECIAL_CHARS.include?(char) }
67
+ @missing_requirements << 'at least one special character'
68
+ end
69
+ end
70
+ end
@@ -13,16 +13,16 @@ class MiniDefender::Rules::Required < MiniDefender::Rule
13
13
 
14
14
  def passes?(attribute, value, validator)
15
15
  case value
16
- when nil
17
- false
18
- when String
19
- value.strip.length > 0
20
- when Enumerable
21
- value.length > 0
22
- when ActionDispatch::Http::UploadedFile
23
- value.path && value.path.length > 0 && value.size > 0
24
- else
25
- true
16
+ when nil
17
+ false
18
+ when String
19
+ value.strip.length > 0
20
+ when Enumerable
21
+ value.length > 0
22
+ when ActionDispatch::Http::UploadedFile
23
+ value.path && value.path.length > 0 && value.size > 0
24
+ else
25
+ true
26
26
  end
27
27
  end
28
28
 
@@ -4,7 +4,9 @@ require_relative 'required'
4
4
 
5
5
  class MiniDefender::Rules::RequiredIf < MiniDefender::Rules::Required
6
6
  def initialize(target, value)
7
- raise ArgumentError, 'Target must be a string' unless target.is_a?(String)
7
+ unless target.is_a?(String)
8
+ raise ArgumentError, 'Target must be a string'
9
+ end
8
10
 
9
11
  @target = target
10
12
  @value = value
@@ -15,12 +17,27 @@ class MiniDefender::Rules::RequiredIf < MiniDefender::Rules::Required
15
17
  end
16
18
 
17
19
  def self.make(args)
18
- raise ArgumentError, 'Target and expected value are required.' unless args.length == 2
20
+ unless args.length == 2
21
+ raise ArgumentError, 'Target and expected value are required.'
22
+ end
19
23
 
20
24
  self.new(args[0], args[1])
21
25
  end
22
26
 
23
27
  def implicit?(validator)
24
- validator.data.key?(@target) && validator.data[@target] == @value
28
+ unless validator.data.key?(@target)
29
+ return false
30
+ end
31
+
32
+ target_value = validator.data[@target]
33
+
34
+ case target_value
35
+ when Array
36
+ target_value.include?(@value)
37
+ when Hash
38
+ target_value.keys.include?(@value)
39
+ else
40
+ target_value == @value
41
+ end
25
42
  end
26
43
  end
@@ -4,7 +4,9 @@ require_relative 'required'
4
4
 
5
5
  class MiniDefender::Rules::RequiredUnless < MiniDefender::Rules::Required
6
6
  def initialize(target, value)
7
- raise ArgumentError, 'Target must be a string' unless target.is_a?(String)
7
+ unless target.is_a?(String)
8
+ raise ArgumentError, 'Target must be a string'
9
+ end
8
10
 
9
11
  @target = target
10
12
  @value = value
@@ -15,12 +17,27 @@ class MiniDefender::Rules::RequiredUnless < MiniDefender::Rules::Required
15
17
  end
16
18
 
17
19
  def self.make(args)
18
- raise ArgumentError, 'Target and expected value are required.' unless args.length == 2
20
+ unless args.length == 2
21
+ raise ArgumentError, 'Target and expected value are required.'
22
+ end
19
23
 
20
24
  self.new(args[0], args[1])
21
25
  end
22
26
 
23
27
  def implicit?(validator)
24
- validator.data.key?(@target) && validator.data[@target] != @value
28
+ unless validator.data.key?(@target)
29
+ return false
30
+ end
31
+
32
+ target_value = validator.data[@target]
33
+
34
+ case target_value
35
+ when Array
36
+ ! target_value.include?(@value)
37
+ when Hash
38
+ ! target_value.keys.include?(@value)
39
+ else
40
+ target_value != @value
41
+ end
25
42
  end
26
43
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module MiniDefender
4
- VERSION = "0.6.9"
4
+ VERSION = "0.7.1"
5
5
  end
@@ -31,6 +31,7 @@ Gem::Specification.new do |spec|
31
31
  spec.add_runtime_dependency 'activesupport', '>= 6.0'
32
32
  spec.add_runtime_dependency 'activemodel', '>= 6.0'
33
33
  spec.add_runtime_dependency 'actionpack', '>= 6.0'
34
+ spec.add_runtime_dependency 'railties', '>= 6.0'
34
35
  spec.add_runtime_dependency 'countries'
35
36
  spec.add_runtime_dependency 'money'
36
37
  spec.add_runtime_dependency 'marcel'
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mini_defender
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.9
4
+ version: 0.7.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ali Alhoshaiyan
8
- autorequire:
9
8
  bindir: exe
10
9
  cert_chain: []
11
- date: 2025-05-20 00:00:00.000000000 Z
10
+ date: 2025-09-09 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: activesupport
@@ -52,6 +51,20 @@ dependencies:
52
51
  - - ">="
53
52
  - !ruby/object:Gem::Version
54
53
  version: '6.0'
54
+ - !ruby/object:Gem::Dependency
55
+ name: railties
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: '6.0'
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: '6.0'
55
68
  - !ruby/object:Gem::Dependency
56
69
  name: countries
57
70
  requirement: !ruby/object:Gem::Requirement
@@ -198,6 +211,7 @@ files:
198
211
  - lib/mini_defender/rules/not_regex.rb
199
212
  - lib/mini_defender/rules/not_starting_with.rb
200
213
  - lib/mini_defender/rules/numeric.rb
214
+ - lib/mini_defender/rules/password.rb
201
215
  - lib/mini_defender/rules/present.rb
202
216
  - lib/mini_defender/rules/prohibited.rb
203
217
  - lib/mini_defender/rules/prohibited_if.rb
@@ -232,7 +246,6 @@ licenses:
232
246
  metadata:
233
247
  homepage_uri: https://github.com/ahoshaiyan/mini-defender
234
248
  source_code_uri: https://github.com/ahoshaiyan/mini-defender
235
- post_install_message:
236
249
  rdoc_options: []
237
250
  require_paths:
238
251
  - lib
@@ -247,8 +260,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
247
260
  - !ruby/object:Gem::Version
248
261
  version: '0'
249
262
  requirements: []
250
- rubygems_version: 3.5.11
251
- signing_key:
263
+ rubygems_version: 3.6.5
252
264
  specification_version: 4
253
265
  summary: A small and efficient validation library for Rails and anything that uses
254
266
  Ruby.