mini_defender 0.5.8 → 0.6.0

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: 0b22d2146228e92dfadf457e5643cf302660d0270ca7d7bdb5c234d6f77c8c26
4
- data.tar.gz: 6fb0563b3e8ca27291823e57b36d0e80721c72623580c2ddbb81c529ab414ad7
3
+ metadata.gz: 4afc89ccb1f98c186e927a88b6bd85e9a5194f4dd74c7b45653f8a63feeb8f79
4
+ data.tar.gz: 53c21490530615efe4e8ba51c52ac26e2a448f8b3c555af66744dd7c0ce238df
5
5
  SHA512:
6
- metadata.gz: 788accd406dee38de6fc5fb0150eee0760400eb1afa1ab5f0f4f8480384f77aa5f9d2b0737fece159c2c361c2f1c375a691b8e008e6bca7a259cb3557db3cc38
7
- data.tar.gz: df80d251d07fd941fe6711ce275b2a5b599548b8b9e31efab1d7893da1f631dbe15dd4768b45683814f7fff4ceaa2ff645e6b0cf2568b22fc7f69ee17ea2b798
6
+ metadata.gz: 9cd0c033f42766e22cb7900b0903d275f3454df9293c553a5f2766154ed73760d7c28cd392ccd051d80bffa4c09027687ef7ca361d375b6f4037d706f26d6435
7
+ data.tar.gz: 9a50f0cc9ab6e9cd751d978cd5e37ec48ee2c742f80b5d058af6e82db2c1d2d9fdbf2de155c967fcf5baf1e7079d6fb77ad01dbd7e1d3ed025e0f3a5f0916501
@@ -1,19 +1,83 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class MiniDefender::Rules::Integer < MiniDefender::Rule
4
+ attr_reader :mode
5
+ attr_reader :parsed
6
+
7
+ DIGIT_MAP = {
8
+ # Arabic-Indic Digits
9
+ "\u0660" => '0',
10
+ "\u0661" => '1',
11
+ "\u0662" => '2',
12
+ "\u0663" => '3',
13
+ "\u0664" => '4',
14
+ "\u0665" => '5',
15
+ "\u0666" => '6',
16
+ "\u0667" => '7',
17
+ "\u0668" => '8',
18
+ "\u0669" => '9',
19
+
20
+ # Extended Arabic-Indic Digits
21
+ "\u06F0" => '0',
22
+ "\u06F1" => '1',
23
+ "\u06F2" => '2',
24
+ "\u06F3" => '3',
25
+ "\u06F4" => '4',
26
+ "\u06F5" => '5',
27
+ "\u06F6" => '6',
28
+ "\u06F7" => '7',
29
+ "\u06F8" => '8',
30
+ "\u06F9" => '9',
31
+ }
32
+
33
+ def initialize(mode = 'strict')
34
+ @mode = mode
35
+ end
36
+
4
37
  def self.signature
5
38
  'integer'
6
39
  end
7
40
 
41
+ def self.make(args)
42
+ new(args[0] || 'strict')
43
+ end
44
+
8
45
  def coerce(value)
9
- value.to_i
46
+ @parsed
10
47
  end
11
48
 
12
49
  def passes?(attribute, value, validator)
13
- value.is_a?(Integer) || value.is_a?(String) && value.match?(/^\d+$/)
50
+ # Avoid converting integers to string and back
51
+ if value.is_a?(Integer)
52
+ @parsed = value
53
+ return true
54
+ end
55
+
56
+ value = value.to_s
57
+
58
+ if @mode == 'relaxed'
59
+ value = normalize_digits(value)
60
+ end
61
+
62
+ @parsed = Integer(value)
63
+ rescue
64
+ false
14
65
  end
15
66
 
16
67
  def message(attribute, value, validator)
17
68
  "The value must be an integer."
18
69
  end
70
+
71
+ def normalize_digits(data)
72
+ # Check if arabic digits exist or avoid expensive string creation operation
73
+ unless data.match?(/[\u0660-\u0669\u06F0-\u06F9]/)
74
+ return data
75
+ end
76
+
77
+ DIGIT_MAP.each do |k, v|
78
+ data = data.gsub(k, v)
79
+ end
80
+
81
+ data
82
+ end
19
83
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module MiniDefender
4
- VERSION = "0.5.8"
4
+ VERSION = "0.6.0"
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.5.8
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ali Alhoshaiyan
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-02-20 00:00:00.000000000 Z
11
+ date: 2024-03-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport