mini_defender 0.1.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.
Files changed (106) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +5 -0
  3. data/Gemfile +10 -0
  4. data/Gemfile.lock +70 -0
  5. data/LICENSE.md +21 -0
  6. data/LICENSE.txt +21 -0
  7. data/README.md +33 -0
  8. data/RULES.md +92 -0
  9. data/Rakefile +12 -0
  10. data/lib/mini_defender/extensions/enumerable.rb +34 -0
  11. data/lib/mini_defender/extensions/hash.rb +28 -0
  12. data/lib/mini_defender/rule.rb +77 -0
  13. data/lib/mini_defender/rules/accepted.rb +17 -0
  14. data/lib/mini_defender/rules/accepted_if.rb +26 -0
  15. data/lib/mini_defender/rules/alpha.rb +15 -0
  16. data/lib/mini_defender/rules/alpha_dash.rb +15 -0
  17. data/lib/mini_defender/rules/alpha_num.rb +15 -0
  18. data/lib/mini_defender/rules/array.rb +15 -0
  19. data/lib/mini_defender/rules/bail.rb +19 -0
  20. data/lib/mini_defender/rules/between.rb +29 -0
  21. data/lib/mini_defender/rules/boolean.rb +26 -0
  22. data/lib/mini_defender/rules/confirmed.rb +24 -0
  23. data/lib/mini_defender/rules/country_code.rb +23 -0
  24. data/lib/mini_defender/rules/credit_card.rb +13 -0
  25. data/lib/mini_defender/rules/date.rb +27 -0
  26. data/lib/mini_defender/rules/date_eq.rb +43 -0
  27. data/lib/mini_defender/rules/date_format.rb +38 -0
  28. data/lib/mini_defender/rules/date_gt.rb +24 -0
  29. data/lib/mini_defender/rules/date_gte.rb +24 -0
  30. data/lib/mini_defender/rules/date_lt.rb +24 -0
  31. data/lib/mini_defender/rules/date_lte.rb +24 -0
  32. data/lib/mini_defender/rules/declined.rb +17 -0
  33. data/lib/mini_defender/rules/declined_if.rb +26 -0
  34. data/lib/mini_defender/rules/default.rb +33 -0
  35. data/lib/mini_defender/rules/different.rb +31 -0
  36. data/lib/mini_defender/rules/digits.rb +26 -0
  37. data/lib/mini_defender/rules/digits_between.rb +29 -0
  38. data/lib/mini_defender/rules/distinct.rb +18 -0
  39. data/lib/mini_defender/rules/email.rb +19 -0
  40. data/lib/mini_defender/rules/ending_with.rb +31 -0
  41. data/lib/mini_defender/rules/equal.rb +9 -0
  42. data/lib/mini_defender/rules/excluded.rb +15 -0
  43. data/lib/mini_defender/rules/excluded_if.rb +28 -0
  44. data/lib/mini_defender/rules/excluded_unless.rb +28 -0
  45. data/lib/mini_defender/rules/excluded_with.rb +27 -0
  46. data/lib/mini_defender/rules/excluded_without.rb +27 -0
  47. data/lib/mini_defender/rules/exists.rb +29 -0
  48. data/lib/mini_defender/rules/expiry_date.rb +28 -0
  49. data/lib/mini_defender/rules/file.rb +17 -0
  50. data/lib/mini_defender/rules/filled.rb +22 -0
  51. data/lib/mini_defender/rules/greater_than.rb +34 -0
  52. data/lib/mini_defender/rules/greater_than_or_equal.rb +34 -0
  53. data/lib/mini_defender/rules/hash.rb +15 -0
  54. data/lib/mini_defender/rules/image.rb +19 -0
  55. data/lib/mini_defender/rules/in.rb +27 -0
  56. data/lib/mini_defender/rules/in_field.rb +40 -0
  57. data/lib/mini_defender/rules/integer.rb +19 -0
  58. data/lib/mini_defender/rules/ip.rb +43 -0
  59. data/lib/mini_defender/rules/ipv4.rb +43 -0
  60. data/lib/mini_defender/rules/ipv6.rb +43 -0
  61. data/lib/mini_defender/rules/json.rb +19 -0
  62. data/lib/mini_defender/rules/less_than.rb +34 -0
  63. data/lib/mini_defender/rules/less_than_or_equal.rb +34 -0
  64. data/lib/mini_defender/rules/luhn.rb +33 -0
  65. data/lib/mini_defender/rules/mac_address.rb +39 -0
  66. data/lib/mini_defender/rules/max.rb +9 -0
  67. data/lib/mini_defender/rules/max_digits.rb +32 -0
  68. data/lib/mini_defender/rules/mime_types.rb +37 -0
  69. data/lib/mini_defender/rules/min.rb +9 -0
  70. data/lib/mini_defender/rules/min_digits.rb +32 -0
  71. data/lib/mini_defender/rules/national_id.rb +13 -0
  72. data/lib/mini_defender/rules/not_ending_with.rb +31 -0
  73. data/lib/mini_defender/rules/not_in.rb +27 -0
  74. data/lib/mini_defender/rules/not_regex.rb +27 -0
  75. data/lib/mini_defender/rules/not_starting_with.rb +31 -0
  76. data/lib/mini_defender/rules/numeric.rb +19 -0
  77. data/lib/mini_defender/rules/present.rb +19 -0
  78. data/lib/mini_defender/rules/prohibited.rb +15 -0
  79. data/lib/mini_defender/rules/prohibited_if.rb +32 -0
  80. data/lib/mini_defender/rules/prohibited_unless.rb +32 -0
  81. data/lib/mini_defender/rules/regex.rb +27 -0
  82. data/lib/mini_defender/rules/required.rb +32 -0
  83. data/lib/mini_defender/rules/required_if.rb +26 -0
  84. data/lib/mini_defender/rules/required_unless.rb +26 -0
  85. data/lib/mini_defender/rules/required_with.rb +27 -0
  86. data/lib/mini_defender/rules/required_with_all.rb +27 -0
  87. data/lib/mini_defender/rules/required_without.rb +27 -0
  88. data/lib/mini_defender/rules/required_without_all.rb +27 -0
  89. data/lib/mini_defender/rules/size.rb +45 -0
  90. data/lib/mini_defender/rules/starting_with.rb +31 -0
  91. data/lib/mini_defender/rules/string.rb +15 -0
  92. data/lib/mini_defender/rules/timezone.rb +19 -0
  93. data/lib/mini_defender/rules/unique.rb +37 -0
  94. data/lib/mini_defender/rules/url.rb +17 -0
  95. data/lib/mini_defender/rules/uuid.rb +37 -0
  96. data/lib/mini_defender/rules.rb +8 -0
  97. data/lib/mini_defender/rules_expander.rb +19 -0
  98. data/lib/mini_defender/rules_factory.rb +36 -0
  99. data/lib/mini_defender/validates_input.rb +12 -0
  100. data/lib/mini_defender/validation_error.rb +10 -0
  101. data/lib/mini_defender/validator.rb +127 -0
  102. data/lib/mini_defender/version.rb +5 -0
  103. data/lib/mini_defender.rb +24 -0
  104. data/mini_defender.gemspec +38 -0
  105. data/sig/mini_defender.rbs +4 -0
  106. metadata +206 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 1fa43ad18c9eec0f5536856021d4ad91124919b193ebf402b063db104c2423bc
4
+ data.tar.gz: '09550f63e65490c59b43cf50b6f3454d4385655090dbe880e6408c10c50375da'
5
+ SHA512:
6
+ metadata.gz: aa5d6f0399d1fb8df563f5b86830b0e058f7343360258dceff43dc34d9e6ce381250a9c3ef5291133c3ca639681770583c2e7418d3d177c8202cd89777952ec4
7
+ data.tar.gz: 5dc095ea1c58329e1fe04f4977f53f08c832b51e61e4e6bb6c97ac71783793049e6ab360eac3053a0441c049b6d590b320db976f355e5727d568b09a5389b8c4
data/CHANGELOG.md ADDED
@@ -0,0 +1,5 @@
1
+ ## [Unreleased]
2
+
3
+ ## [0.1.0] - 2022-09-22
4
+
5
+ - Initial release
data/Gemfile ADDED
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
4
+
5
+ # Specify your gem's dependencies in mini_defender.gemspec
6
+ gemspec
7
+
8
+ gem "rake", "~> 13.0"
9
+
10
+ gem "minitest", "~> 5.0"
data/Gemfile.lock ADDED
@@ -0,0 +1,70 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ mini_defender (0.1.0)
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
data/LICENSE.md ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2022 Ali Alhoshaiyan
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2022 Ali Alhoshaiyan
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,33 @@
1
+ # MiniDefender
2
+
3
+ Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/mini_defender`. To experiment with that code, run `bin/console` for an interactive prompt.
4
+
5
+ TODO: Delete this and the text above, and describe your gem
6
+
7
+ ## Installation
8
+
9
+ Install the gem and add to the application's Gemfile by executing:
10
+
11
+ $ bundle add mini_defender
12
+
13
+ If bundler is not being used to manage dependencies, install the gem by executing:
14
+
15
+ $ gem install mini_defender
16
+
17
+ ## Usage
18
+
19
+ TODO: Write usage instructions here
20
+
21
+ ## Development
22
+
23
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
24
+
25
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
26
+
27
+ ## Contributing
28
+
29
+ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/mini_defender.
30
+
31
+ ## License
32
+
33
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
data/RULES.md ADDED
@@ -0,0 +1,92 @@
1
+ # Rules
2
+
3
+ - [x] Accepted
4
+ - [X] Accepted If
5
+ - [x] After (Date)
6
+ - [x] After Or Equal (Date)
7
+ - [x] Alpha
8
+ - [x] Alpha Dash
9
+ - [x] Alpha Numeric
10
+ - [x] Array
11
+ - [x] Bail
12
+ - [x] Before (Date)
13
+ - [x] Before Or Equal (Date)
14
+ - [x] Between
15
+ - [x] Boolean
16
+ - [x] Confirmed
17
+ - [x] Date
18
+ - [x] Date Equals
19
+ - [x] Date Format
20
+ - [x] Declined
21
+ - [x] Declined If
22
+ - [x] Different
23
+ - [x] Digits
24
+ - [x] Digits Between
25
+ - [x] Distinct
26
+ - [x] Doesnt Start With
27
+ - [x] Doesnt End With
28
+ - [x] Email
29
+ - [x] Ends With
30
+ - [x] Exclude
31
+ - [x] Exclude If
32
+ - [x] Exclude Unless
33
+ - [x] Exclude With
34
+ - [x] Exclude Without
35
+ - [x] Exists (Database)
36
+ - [x] File
37
+ - [x] Filled
38
+ - [x] Greater Than
39
+ - [x] Greater Than Or Equal
40
+ - [x] Image (File)
41
+ - [x] In
42
+ - [x] In Array
43
+ - [x] Integer
44
+ - [x] IPv4 Address
45
+ - [x] IPv6 Address
46
+ - [x] JSON
47
+ - [x] Less Than
48
+ - [x] Less Than Or Equal
49
+ - [x] MAC Address
50
+ - [x] Max
51
+ - [x] Max Digits
52
+ - [x] MIME Types
53
+ - [-] MIME Type By File Extension
54
+ - [x] Min
55
+ - [x] Min Digits
56
+ - [-] Multiple Of
57
+ - [x] Not In
58
+ - [x] Not Regex
59
+ - [?] Nullable
60
+ - [x] Numeric
61
+ - [-] Password
62
+ - [x] Present
63
+ - [x] Prohibited
64
+ - [x] Prohibited If
65
+ - [x] Prohibited Unless
66
+ - [?] Prohibits
67
+ - [x] Regular Expression
68
+ - [x] Required
69
+ - [x] Required If
70
+ - [x] Required Unless
71
+ - [x] Required With
72
+ - [x] Required With All
73
+ - [x] Required Without
74
+ - [x] Required Without All
75
+ - [x] Required Array Keys
76
+ - [-] Same
77
+ - [x] Size
78
+ - [ ] Sometimes
79
+ - [x] Starts With
80
+ - [x] String
81
+ - [x] Timezone
82
+ - [x] Unique (Database)
83
+ - [x] URL
84
+ - [x] UUID
85
+ - [x] UUID v1
86
+ - [x] UUID v2
87
+ - [x] UUID v3
88
+ - [x] UUID v4
89
+ - [x] Luhn Number
90
+ - [x] National ID
91
+ - [x] Credit Card
92
+ - [x] Valid Card Expiration
data/Rakefile ADDED
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/gem_tasks"
4
+ require "rake/testtask"
5
+
6
+ Rake::TestTask.new(:test) do |t|
7
+ t.libs << "test"
8
+ t.libs << "lib"
9
+ t.test_files = FileList["test/**/*_test.rb"]
10
+ end
11
+
12
+ task default: :test
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Enumerable
4
+ def flatten_keys(keep_roots: false)
5
+ flatten_keys_recurse(self, keep_roots: keep_roots)
6
+ end
7
+
8
+ private
9
+
10
+ def flatten_keys_recurse(root, keep_roots: false)
11
+ unless root.is_a?(Enumerable)
12
+ return {}
13
+ end
14
+
15
+ unless root.is_a?(Hash)
16
+ root = root.each_with_index.to_h { |v, k| [k, v] }
17
+ end
18
+
19
+ result = {}
20
+ root.each do |k, v|
21
+ result[k] = v if keep_roots
22
+
23
+ if v.is_a?(Enumerable)
24
+ flatten_keys_recurse(v, keep_roots: keep_roots).each do |sub_key, sub_v|
25
+ result["#{k}.#{sub_key}"] = sub_v
26
+ end
27
+ else
28
+ result[k] = v
29
+ end
30
+ end
31
+
32
+ result
33
+ end
34
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Hash
4
+ def expand
5
+ expanded = {}
6
+
7
+ reject{ |_, v| v.is_a?(Hash) || v.is_a?(Array) }.each do |k, v|
8
+ keys = k.split('.')
9
+ node = expanded
10
+ node = (node[keys.shift] ||= {}) while keys.length > 1
11
+ node[keys.shift] = v
12
+ end
13
+
14
+ expanded.compact_keys
15
+ end
16
+
17
+ def compact_keys
18
+ result = to_h do |k, v|
19
+ [k, v.is_a?(Hash) ? v.compact_keys : v]
20
+ end
21
+
22
+ if result.all? { |k, _v| k.match?(/\A\d+\z/) }
23
+ result.values
24
+ else
25
+ result
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+
3
+ class MiniDefender::Rule
4
+ def self.signature
5
+ raise NotImplementedError, 'Use a concrete implementation.'
6
+ end
7
+
8
+ # @param [Array] args Set of positional arguments
9
+ # @return [MiniDefender::Rule]
10
+ def self.make(args)
11
+ self.new
12
+ end
13
+
14
+ # @return [Boolean]
15
+ def self.available?
16
+ true
17
+ end
18
+
19
+ # @param [MiniDefender::Validator] validator
20
+ # @return [Boolean]
21
+ def implicit?(validator)
22
+ false
23
+ end
24
+
25
+ # @param [MiniDefender::Validator] validator
26
+ # @return [Boolean]
27
+ def defaults?(validator)
28
+ false
29
+ end
30
+
31
+ # @param [MiniDefender::Validator] validator
32
+ # @return [?Object]
33
+ def default_value(validator)
34
+ nil
35
+ end
36
+
37
+ # Instruct the validator to stop validation for the current attribute
38
+ # when the first error is encountered
39
+ def bails?
40
+ false
41
+ end
42
+
43
+ # Instructs the validator to stop validation for all rules for the current attribute
44
+ def stops?
45
+ false
46
+ end
47
+
48
+ # @param [MiniDefender::Validator] validator
49
+ # @return [Boolean]
50
+ def active?(validator)
51
+ true
52
+ end
53
+
54
+ # @param [MiniDefender::Validator]
55
+ # @return [Boolean]
56
+ def excluded?(validator)
57
+ false
58
+ end
59
+
60
+ def coerce(value)
61
+ value
62
+ end
63
+
64
+ # @param [Object] attribute
65
+ # @param [Object] value
66
+ # @param [MiniDefender::Validator] validator
67
+ def passes?(attribute, value, validator)
68
+ raise NotImplementedError, 'Use a concrete implementation.'
69
+ end
70
+
71
+ # @param [Object] attribute
72
+ # @param [Object] value
73
+ # @param [MiniDefender::Validator] validator
74
+ def message(attribute, value, validator)
75
+ raise NotImplementedError, 'Use a concrete implementation.'
76
+ end
77
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ class MiniDefender::Rules::Accepted < MiniDefender::Rule
4
+ ALLOWED_VALUES = ['yes', 'on', 1, true]
5
+
6
+ def self.signature
7
+ 'accepted'
8
+ end
9
+
10
+ def passes?(attribute, value, validator)
11
+ !value.nil? && ALLOWED_VALUES.include?(value)
12
+ end
13
+
14
+ def message(attribute, value, validator)
15
+ "Must be accepted."
16
+ end
17
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'accepted'
4
+
5
+ class MiniDefender::Rules::AcceptedIf < MiniDefender::Rules::Accepted
6
+ def initialize(target, value)
7
+ raise ArgumentError, 'Target must be a string' unless target.is_a?(String)
8
+
9
+ @target = target
10
+ @value = value
11
+ end
12
+
13
+ def self.signature
14
+ 'accepted_if'
15
+ end
16
+
17
+ def self.make(args)
18
+ raise ArgumentError, 'Target and expected value are required.' unless args.length == 2
19
+
20
+ self.new(args[0], args[1])
21
+ end
22
+
23
+ def active?(validator)
24
+ validator.data[@target] === @value
25
+ end
26
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ class MiniDefender::Rules::Alpha < MiniDefender::Rule
4
+ def self.signature
5
+ 'alpha'
6
+ end
7
+
8
+ def passes?(attribute, value, validator)
9
+ value.is_a?(String) && /^[a-zA-Z]+$/.match?(value)
10
+ end
11
+
12
+ def message(attribute, value, validator)
13
+ 'The field must only contain alphabetical characters.'
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ class MiniDefender::Rules::AlphaDash < MiniDefender::Rule
4
+ def self.signature
5
+ 'alpha_dash'
6
+ end
7
+
8
+ def passes?(attribute, value, validator)
9
+ value.is_a?(String) && /^[a-zA-Z\-_]+$/.match?(value)
10
+ end
11
+
12
+ def message(attribute, value, validator)
13
+ 'The field must only contain alphabetical characters, dashes and underscores.'
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ class MiniDefender::Rules::AlphaNum < MiniDefender::Rule
4
+ def self.signature
5
+ 'alpha_num'
6
+ end
7
+
8
+ def passes?(attribute, value, validator)
9
+ value.is_a?(String) && /^[a-zA-Z0-9]+$/.match?(value)
10
+ end
11
+
12
+ def message(attribute, value, validator)
13
+ 'The field must only contain alpha-num characters.'
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ class MiniDefender::Rules::Array < MiniDefender::Rule
4
+ def self.signature
5
+ 'array'
6
+ end
7
+
8
+ def passes?(attribute, value, validator)
9
+ value.is_a?(Array)
10
+ end
11
+
12
+ def message(attribute, value, validator)
13
+ "The field must be an array."
14
+ end
15
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ class MiniDefender::Rules::Bail < MiniDefender::Rule
4
+ def self.signature
5
+ 'bail'
6
+ end
7
+
8
+ def bails?
9
+ true
10
+ end
11
+
12
+ def passes?(attribute, value, validator)
13
+ true
14
+ end
15
+
16
+ def message(attribute, value, validator)
17
+ "i can haz turkey?."
18
+ end
19
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ class MiniDefender::Rules::Between < MiniDefender::Rule
4
+ def initialize(min, max)
5
+ @min = min
6
+ @max = max
7
+ end
8
+
9
+ def self.signature
10
+ 'between'
11
+ end
12
+
13
+ def self.make(args)
14
+ self.new(args[0].to_i, args[1].to_i)
15
+ end
16
+
17
+ def passes?(attribute, value, validator)
18
+ case value
19
+ when String, Array, Hash
20
+ @min <= value.length && value.length <= @max
21
+ else
22
+ false
23
+ end
24
+ end
25
+
26
+ def message(attribute, value, validator)
27
+ "The value length must be between #{@min} and #{@max}."
28
+ end
29
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ class MiniDefender::Rules::Boolean < MiniDefender::Rule
4
+ def self.signature
5
+ 'boolean'
6
+ end
7
+
8
+ def coerce(value)
9
+ case value
10
+ when 0, '0'
11
+ false
12
+ when 1, '1'
13
+ true
14
+ else
15
+ value
16
+ end
17
+ end
18
+
19
+ def passes?(attribute, value, validator)
20
+ value.is_a?(TrueClass) || value.is_a?(FalseClass) || [1, 0, '1', '0'].include?(value)
21
+ end
22
+
23
+ def message(attribute, value, validator)
24
+ "The value must be a boolean."
25
+ end
26
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ class MiniDefender::Rules::Confirmed < MiniDefender::Rule
4
+ def initialize
5
+ @found = false
6
+ end
7
+
8
+ def self.signature
9
+ 'confirmed'
10
+ end
11
+
12
+ def passes?(attribute, value, validator)
13
+ key = "#{attribute}_confirmation"
14
+ (@found = validator.data.key?(key)) && value == validator.data[key]
15
+ end
16
+
17
+ def message(attribute, value, validator)
18
+ if @found
19
+ 'The value confirmation does not match.'
20
+ else
21
+ 'The value must be confirmed.'
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'countries'
4
+
5
+ class MiniDefender::Rules::CountryCode < MiniDefender::Rule
6
+ COUNTRIES = ISO3166::Country.pluck(:alpha2).flatten
7
+
8
+ def self.signature
9
+ 'country_code'
10
+ end
11
+
12
+ def coerce(value)
13
+ value.strip.upcase
14
+ end
15
+
16
+ def passes?(attribute, value, validator)
17
+ value.is_a?(String) && COUNTRIES.include?(value.strip.upcase)
18
+ end
19
+
20
+ def message(attribute, value, validator)
21
+ 'The value must be a valid ISO3166 country code.'
22
+ end
23
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'luhn'
4
+
5
+ class MiniDefender::Rules::CreditCard < MiniDefender::Rules::Luhn
6
+ def self.signature
7
+ 'credit_card'
8
+ end
9
+
10
+ def message(attribute, value, validator)
11
+ 'The value must be a proper credit/debit card number.'
12
+ end
13
+ end