flash_validators 0.0.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 +7 -0
- data/.coveralls.yml +1 -0
- data/.gitignore +17 -0
- data/.rspec +4 -0
- data/.travis.yml +14 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +589 -0
- data/Rakefile +6 -0
- data/config/locales/en.yml +73 -0
- data/flash_validators.gemspec +28 -0
- data/lib/flash_validators/matchers/ensure_valid_boolean_format_of.rb +20 -0
- data/lib/flash_validators/matchers/ensure_valid_currency_format_of.rb +20 -0
- data/lib/flash_validators/matchers/ensure_valid_email_format_of.rb +20 -0
- data/lib/flash_validators/matchers/ensure_valid_equality_matcher_of.rb +32 -0
- data/lib/flash_validators/matchers/ensure_valid_hex_format_of.rb +20 -0
- data/lib/flash_validators/matchers/ensure_valid_imei_format_of.rb +20 -0
- data/lib/flash_validators/matchers/ensure_valid_ip_format_of.rb +20 -0
- data/lib/flash_validators/matchers/ensure_valid_latitude_format_of.rb +20 -0
- data/lib/flash_validators/matchers/ensure_valid_longitude_format_of.rb +20 -0
- data/lib/flash_validators/matchers/ensure_valid_mac_address_format_of.rb +20 -0
- data/lib/flash_validators/matchers/ensure_valid_name_format_of.rb +20 -0
- data/lib/flash_validators/matchers/ensure_valid_password_format_of.rb +20 -0
- data/lib/flash_validators/matchers/ensure_valid_phone_format_of.rb +20 -0
- data/lib/flash_validators/matchers/ensure_valid_slug_format_of.rb +20 -0
- data/lib/flash_validators/matchers/ensure_valid_ssn_format_of.rb +20 -0
- data/lib/flash_validators/matchers/ensure_valid_url_format_of.rb +20 -0
- data/lib/flash_validators/matchers/ensure_valid_username_format_of.rb +20 -0
- data/lib/flash_validators/validators/boolean_validator.rb +9 -0
- data/lib/flash_validators/validators/currency_validator.rb +17 -0
- data/lib/flash_validators/validators/email_validator.rb +25 -0
- data/lib/flash_validators/validators/equality_validator.rb +27 -0
- data/lib/flash_validators/validators/hex_validator.rb +9 -0
- data/lib/flash_validators/validators/imei_validator.rb +37 -0
- data/lib/flash_validators/validators/ip_validator.rb +9 -0
- data/lib/flash_validators/validators/latitude_validator.rb +9 -0
- data/lib/flash_validators/validators/longitude_validator.rb +9 -0
- data/lib/flash_validators/validators/mac_address_validator.rb +24 -0
- data/lib/flash_validators/validators/name_validator.rb +9 -0
- data/lib/flash_validators/validators/password_validator.rb +9 -0
- data/lib/flash_validators/validators/phone_validator.rb +9 -0
- data/lib/flash_validators/validators/slug_validator.rb +9 -0
- data/lib/flash_validators/validators/ssn_validator.rb +9 -0
- data/lib/flash_validators/validators/url_validator.rb +36 -0
- data/lib/flash_validators/validators/username_validator.rb +9 -0
- data/lib/flash_validators/version.rb +3 -0
- data/lib/flash_validators.rb +41 -0
- data/spec/lib/boolean_validator_spec.rb +35 -0
- data/spec/lib/currency_validator_spec.rb +63 -0
- data/spec/lib/email_validator_spec.rb +111 -0
- data/spec/lib/equality_validator_spec.rb +340 -0
- data/spec/lib/hex_validator_spec.rb +53 -0
- data/spec/lib/imei_validator_spec.rb +41 -0
- data/spec/lib/ip_validator_spec.rb +33 -0
- data/spec/lib/latitude_validator_spec.rb +31 -0
- data/spec/lib/longitude_validator_spec.rb +31 -0
- data/spec/lib/mac_address_validator_spec.rb +54 -0
- data/spec/lib/name_validator_spec.rb +39 -0
- data/spec/lib/password_validator_spec.rb +45 -0
- data/spec/lib/phone_validator_spec.rb +42 -0
- data/spec/lib/slug_validator_spec.rb +41 -0
- data/spec/lib/ssn_validator_spec.rb +36 -0
- data/spec/lib/url_validator_spec.rb +109 -0
- data/spec/lib/username_validator_spec.rb +37 -0
- data/spec/spec_helper.rb +11 -0
- metadata +224 -0
@@ -0,0 +1,24 @@
|
|
1
|
+
class MacAddressValidator < ActiveModel::EachValidator
|
2
|
+
|
3
|
+
def validate_each(record, attribute, value)
|
4
|
+
unless self.class.valid?(value, options)
|
5
|
+
record.errors[attribute] << (options[:message] || I18n.t('errors.messages.mac_address'))
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def self.validate_format(mac_address)
|
12
|
+
!!(mac_address =~ /^([\h]{2}:){5}[\h]{2}?$/i) || # 08:00:2b:01:02:03
|
13
|
+
!!(mac_address =~ /^([\h]{2}[-|\.|\s]){5}[\h]{2}?$/i) || # 08-00-2b-01-02-03 or 08.00.2b.01.02.03
|
14
|
+
!!(mac_address =~ /^([\h]{6})[-|\.][\h]{6}?$/i) || # 08002b-010203 or 08002b.010203
|
15
|
+
!!(mac_address =~ /^([\h]{6}):[\h]{6}?$/i) || # 08002b:010203
|
16
|
+
!!(mac_address =~ /^([\h]{4}[-|\.|\s]){2}[\h]{4}?$/i) || # 0800.2b01.0203 or 0800-2b01-0203 0800 2b01 0203
|
17
|
+
!!(mac_address =~ /^[\h]{12}?$/i) # 08002b010203
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.valid?(mac_address, options)
|
21
|
+
validate_format(mac_address)
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'uri'
|
2
|
+
class UrlValidator < ActiveModel::EachValidator
|
3
|
+
|
4
|
+
def validate_each(record, attribute, value)
|
5
|
+
uri = URI.parse(value)
|
6
|
+
raise URI::InvalidURIError unless valid?(uri, options)
|
7
|
+
rescue URI::InvalidURIError
|
8
|
+
record.errors[attribute] << (options[:message] || I18n.t('errors.messages.url'))
|
9
|
+
end
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
DEFAULT_SCHEMES = [:http, :https]
|
14
|
+
|
15
|
+
def self.validate_domain(uri, domains)
|
16
|
+
host_downcased = uri.host.to_s.downcase
|
17
|
+
domains.empty? || domains.any? { |domain| host_downcased.end_with?(".#{domain.downcase}") }
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.validate_scheme(uri, schemes)
|
21
|
+
scheme_downcased = uri.scheme.to_s.downcase
|
22
|
+
schemes.empty? || schemes.any? { |scheme| scheme_downcased == scheme.to_s.downcase }
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.validate_root(uri)
|
26
|
+
['/', ''].include?(uri.path) && uri.query.blank? && uri.fragment.blank?
|
27
|
+
end
|
28
|
+
|
29
|
+
def valid?(uri, options)
|
30
|
+
uri.kind_of?(URI::Generic) \
|
31
|
+
&& self.class.validate_domain(uri, [*(options[:domain])]) \
|
32
|
+
&& self.class.validate_scheme(uri, [*(options[:scheme] || UrlValidator::DEFAULT_SCHEMES)]) \
|
33
|
+
&& (!!options[:root] ? self.class.validate_root(uri) : true)
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'active_model'
|
2
|
+
require 'active_support'
|
3
|
+
require 'rspec/matchers'
|
4
|
+
require 'flash_validators/version'
|
5
|
+
require 'flash_validators/validators/boolean_validator'
|
6
|
+
require 'flash_validators/validators/currency_validator'
|
7
|
+
require 'flash_validators/validators/email_validator'
|
8
|
+
require 'flash_validators/validators/equality_validator'
|
9
|
+
require 'flash_validators/validators/hex_validator'
|
10
|
+
require 'flash_validators/validators/imei_validator'
|
11
|
+
require 'flash_validators/validators/ip_validator'
|
12
|
+
require 'flash_validators/validators/latitude_validator'
|
13
|
+
require 'flash_validators/validators/longitude_validator'
|
14
|
+
require 'flash_validators/validators/mac_address_validator'
|
15
|
+
require 'flash_validators/validators/name_validator'
|
16
|
+
require 'flash_validators/validators/password_validator'
|
17
|
+
require 'flash_validators/validators/phone_validator'
|
18
|
+
require 'flash_validators/validators/slug_validator'
|
19
|
+
require 'flash_validators/validators/ssn_validator'
|
20
|
+
require 'flash_validators/validators/url_validator'
|
21
|
+
require 'flash_validators/validators/username_validator'
|
22
|
+
|
23
|
+
if defined?(RSpec)
|
24
|
+
require 'flash_validators/matchers/ensure_valid_boolean_format_of'
|
25
|
+
require 'flash_validators/matchers/ensure_valid_currency_format_of'
|
26
|
+
require 'flash_validators/matchers/ensure_valid_email_format_of'
|
27
|
+
require 'flash_validators/matchers/ensure_valid_equality_matcher_of'
|
28
|
+
require 'flash_validators/matchers/ensure_valid_hex_format_of'
|
29
|
+
require 'flash_validators/matchers/ensure_valid_imei_format_of'
|
30
|
+
require 'flash_validators/matchers/ensure_valid_ip_format_of'
|
31
|
+
require 'flash_validators/matchers/ensure_valid_latitude_format_of'
|
32
|
+
require 'flash_validators/matchers/ensure_valid_longitude_format_of'
|
33
|
+
require 'flash_validators/matchers/ensure_valid_mac_address_format_of'
|
34
|
+
require 'flash_validators/matchers/ensure_valid_name_format_of'
|
35
|
+
require 'flash_validators/matchers/ensure_valid_password_format_of'
|
36
|
+
require 'flash_validators/matchers/ensure_valid_phone_format_of'
|
37
|
+
require 'flash_validators/matchers/ensure_valid_slug_format_of'
|
38
|
+
require 'flash_validators/matchers/ensure_valid_ssn_format_of'
|
39
|
+
require 'flash_validators/matchers/ensure_valid_url_format_of'
|
40
|
+
require 'flash_validators/matchers/ensure_valid_username_format_of'
|
41
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe BooleanValidator do
|
4
|
+
|
5
|
+
context "Boolean has a valid value" do
|
6
|
+
let(:klass) do
|
7
|
+
Class.new do
|
8
|
+
include ActiveModel::Validations
|
9
|
+
attr_accessor :active, :name
|
10
|
+
validates :active, boolean: true
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
subject { klass.new }
|
15
|
+
|
16
|
+
it { should allow_value(true).for(:active) }
|
17
|
+
it { should allow_value(false).for(:active) }
|
18
|
+
it { should allow_value(1).for(:active) }
|
19
|
+
it { should allow_value(0).for(:active) }
|
20
|
+
|
21
|
+
it { should_not allow_value('').for(:active) }
|
22
|
+
it { should_not allow_value(' ').for(:active) }
|
23
|
+
it { should_not allow_value(nil).for(:active) }
|
24
|
+
it { should_not allow_value("true").for(:active) }
|
25
|
+
it { should_not allow_value("false").for(:active) }
|
26
|
+
it { should_not allow_value("1").for(:active) }
|
27
|
+
it { should_not allow_value("0").for(:active) }
|
28
|
+
it { should_not allow_value("! \#$%\`|").for(:active) }
|
29
|
+
it { should_not allow_value("<>@[]\`|").for(:active) }
|
30
|
+
|
31
|
+
it { should ensure_valid_boolean_format_of(:active) }
|
32
|
+
it { should_not ensure_valid_boolean_format_of(:name) }
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe CurrencyValidator do
|
4
|
+
|
5
|
+
context "Currency has a valid value" do
|
6
|
+
let(:klass) do
|
7
|
+
Class.new do
|
8
|
+
include ActiveModel::Validations
|
9
|
+
attr_accessor :price, :name
|
10
|
+
validates :price, currency: true
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
subject { klass.new }
|
15
|
+
|
16
|
+
it { should allow_value(".00").for(:price) }
|
17
|
+
it { should allow_value("1.0").for(:price) }
|
18
|
+
it { should allow_value("1.00").for(:price) }
|
19
|
+
it { should allow_value("12345678.00").for(:price) }
|
20
|
+
|
21
|
+
it { should_not allow_value('').for(:price) }
|
22
|
+
it { should_not allow_value(' ').for(:price) }
|
23
|
+
it { should_not allow_value(nil).for(:price) }
|
24
|
+
it { should_not allow_value("1").for(:price) }
|
25
|
+
it { should_not allow_value("1.000").for(:price) }
|
26
|
+
it { should_not allow_value("$1.00").for(:price) }
|
27
|
+
it { should_not allow_value("! \#$%\`|").for(:price) }
|
28
|
+
it { should_not allow_value("<>@[]\`|").for(:price) }
|
29
|
+
|
30
|
+
it { should ensure_valid_currency_format_of(:price) }
|
31
|
+
it { should_not ensure_valid_currency_format_of(:name) }
|
32
|
+
end
|
33
|
+
|
34
|
+
context "Currency with strict option has a valid value" do
|
35
|
+
let(:klass) do
|
36
|
+
Class.new do
|
37
|
+
include ActiveModel::Validations
|
38
|
+
attr_accessor :price, :name
|
39
|
+
validates :price, currency: { strict: true }
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
subject { klass.new }
|
44
|
+
|
45
|
+
it { should allow_value("1.00").for(:price) }
|
46
|
+
it { should allow_value("12345678.00").for(:price) }
|
47
|
+
|
48
|
+
it { should_not allow_value('').for(:price) }
|
49
|
+
it { should_not allow_value(' ').for(:price) }
|
50
|
+
it { should_not allow_value(nil).for(:price) }
|
51
|
+
it { should_not allow_value(".00").for(:price) }
|
52
|
+
it { should_not allow_value("1").for(:price) }
|
53
|
+
it { should_not allow_value("1.0").for(:price) }
|
54
|
+
it { should_not allow_value("1.000").for(:price) }
|
55
|
+
it { should_not allow_value("$1.00").for(:price) }
|
56
|
+
it { should_not allow_value("! \#$%\`|").for(:price) }
|
57
|
+
it { should_not allow_value("<>@[]\`|").for(:price) }
|
58
|
+
|
59
|
+
it { should ensure_valid_currency_format_of(:price) }
|
60
|
+
it { should_not ensure_valid_currency_format_of(:name) }
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe EmailValidator do
|
4
|
+
|
5
|
+
subject { klass.new }
|
6
|
+
|
7
|
+
## Valid email formats
|
8
|
+
context "Email with valid format" do
|
9
|
+
let(:klass) do
|
10
|
+
Class.new do
|
11
|
+
include ActiveModel::Validations
|
12
|
+
attr_accessor :email, :name
|
13
|
+
validates :email, email: true
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
[
|
18
|
+
"s_u@example.com",
|
19
|
+
"super.user@example.com",
|
20
|
+
"super+user@example.com",
|
21
|
+
"super-user@example.com",
|
22
|
+
"super+user@example-site.com",
|
23
|
+
"user@example.com",
|
24
|
+
"user@example-site.com",
|
25
|
+
"user@en.example.com",
|
26
|
+
"user@example.museum",
|
27
|
+
"user@123.com",
|
28
|
+
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@example.com",
|
29
|
+
"01234567890@example.com"
|
30
|
+
].each do |email|
|
31
|
+
it "#{email.inspect} should be valid" do
|
32
|
+
should allow_value(email).for(:email)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
[
|
37
|
+
"",
|
38
|
+
" ",
|
39
|
+
"example.com",
|
40
|
+
"super user@example.com",
|
41
|
+
" user@example.com",
|
42
|
+
" user@example.com ",
|
43
|
+
"user@example.com ",
|
44
|
+
"user",
|
45
|
+
"user@com",
|
46
|
+
"user@.com",
|
47
|
+
"user@example",
|
48
|
+
"user@example.",
|
49
|
+
"user@example.c",
|
50
|
+
"user_example.com",
|
51
|
+
"user@example_site.com",
|
52
|
+
"user@example.com@example.com",
|
53
|
+
"user@",
|
54
|
+
"user@! \"\#$%(),/;<>_[]\`|.com",
|
55
|
+
"user@127.0.0.1",
|
56
|
+
"user@127.0.0.1:25",
|
57
|
+
"user@example.com\n<script>alert('hello')</script>",
|
58
|
+
"@example.com",
|
59
|
+
"@example",
|
60
|
+
"@",
|
61
|
+
"! \#$%\`|@example.com",
|
62
|
+
"<>@[]\`|@example.com"
|
63
|
+
].each do |email|
|
64
|
+
it "#{email.inspect} should be invalid" do
|
65
|
+
should_not allow_value(email).for(:email)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
it { should ensure_valid_email_format_of(:email) }
|
70
|
+
it { should_not ensure_valid_email_format_of(:name) }
|
71
|
+
end
|
72
|
+
|
73
|
+
## Valid email domain formats
|
74
|
+
context "Email is in the specific domain" do
|
75
|
+
context "Email domain specified as string" do
|
76
|
+
let(:klass) do
|
77
|
+
Class.new do
|
78
|
+
include ActiveModel::Validations
|
79
|
+
attr_accessor :email, :name
|
80
|
+
validates :email, email: { domain: "edu" }
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
it { should allow_value("user@example.edu").for(:email) }
|
85
|
+
it { should_not allow_value("user@example.com").for(:email) }
|
86
|
+
|
87
|
+
it { should ensure_valid_email_format_of(:email) }
|
88
|
+
it { should_not ensure_valid_email_format_of(:name) }
|
89
|
+
end
|
90
|
+
|
91
|
+
context "Email set as an array of strings and symbols" do
|
92
|
+
let(:klass) do
|
93
|
+
Class.new do
|
94
|
+
include ActiveModel::Validations
|
95
|
+
attr_accessor :email, :name
|
96
|
+
validates :email, email: { domain: ['com', :edu, 'Com.Au'] }
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
it { should allow_value("user@example.com").for(:email) }
|
101
|
+
it { should allow_value("user@example.edu").for(:email) }
|
102
|
+
it { should allow_value("user@example.com.au").for(:email) }
|
103
|
+
it { should allow_value("user@example.Com.Au").for(:email) }
|
104
|
+
it { should_not allow_value("user@example.org").for(:email) }
|
105
|
+
|
106
|
+
it { should ensure_valid_email_format_of(:email) }
|
107
|
+
it { should_not ensure_valid_email_format_of(:name) }
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|