mini_defender 0.5.8 → 0.6.0

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