rails_email_validator 0.0.3 → 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.
- data/Gemfile +1 -2
- data/README.rdoc +13 -2
- data/Rakefile +0 -14
- data/VERSION +1 -1
- data/lib/rails_email_validator.rb +33 -6
- data/rails_email_validator.gemspec +5 -8
- data/test/test_rails_email_validator.rb +121 -2
- metadata +7 -22
data/Gemfile
CHANGED
data/README.rdoc
CHANGED
@@ -9,17 +9,28 @@ If you want to use it as plugin
|
|
9
9
|
|
10
10
|
== Using
|
11
11
|
Use to validate email
|
12
|
-
|
12
|
+
validates :email, :email => true
|
13
13
|
|
14
14
|
Use email validation without mx validation
|
15
|
-
|
15
|
+
validates :email, :email => { :validate_mx => false }
|
16
16
|
|
17
|
+
Use email validation without idn support
|
18
|
+
validates :email, :email => { :allow_idn => false }
|
17
19
|
|
18
20
|
== Features
|
19
21
|
|
20
22
|
* validates local part of email
|
21
23
|
* validates domain part of email
|
22
24
|
* validate domain has a valid mx entry
|
25
|
+
* idn support if idn available
|
26
|
+
* tests for validator
|
27
|
+
|
28
|
+
== IDN support
|
29
|
+
|
30
|
+
If you want to support idn for email, you must install idn.
|
31
|
+
|
32
|
+
fork with ruby 1.9 support
|
33
|
+
gem "idn", :git => "git://github.com/mihu/idn.git"
|
23
34
|
|
24
35
|
== Contributing to rails_email_validator
|
25
36
|
|
data/Rakefile
CHANGED
@@ -33,20 +33,6 @@ Rake::TestTask.new(:test) do |test|
|
|
33
33
|
test.verbose = true
|
34
34
|
end
|
35
35
|
|
36
|
-
require 'rcov/rcovtask'
|
37
|
-
Rcov::RcovTask.new do |test|
|
38
|
-
test.libs << 'test'
|
39
|
-
test.pattern = 'test/**/test_*.rb'
|
40
|
-
test.verbose = true
|
41
|
-
end
|
42
|
-
|
43
|
-
require 'reek/rake/task'
|
44
|
-
Reek::Rake::Task.new do |t|
|
45
|
-
t.fail_on_error = true
|
46
|
-
t.verbose = false
|
47
|
-
t.source_files = 'lib/**/*.rb'
|
48
|
-
end
|
49
|
-
|
50
36
|
task :default => :test
|
51
37
|
|
52
38
|
require 'rake/rdoctask'
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0
|
1
|
+
0.1.0
|
@@ -1,12 +1,16 @@
|
|
1
|
-
|
2
1
|
require 'active_model'
|
3
2
|
|
3
|
+
# Validator for email
|
4
4
|
class EmailValidator < ActiveModel::EachValidator
|
5
5
|
# check the options for do mx validation
|
6
6
|
def validate_mx?
|
7
7
|
options[:validate_mx].nil? or options[:validate_mx] == true
|
8
8
|
end
|
9
9
|
|
10
|
+
def allow_idn?
|
11
|
+
options[:allow_idn].nil? or options[:allow_idn] == true
|
12
|
+
end
|
13
|
+
|
10
14
|
# validate if an mx exists on domain
|
11
15
|
def has_mx?(domain)
|
12
16
|
require 'resolv'
|
@@ -17,18 +21,41 @@ class EmailValidator < ActiveModel::EachValidator
|
|
17
21
|
not mx.nil? and mx.size > 0
|
18
22
|
end
|
19
23
|
|
24
|
+
def convert_idn(domain_part)
|
25
|
+
if allow_idn?
|
26
|
+
# idn suport if available
|
27
|
+
begin
|
28
|
+
require 'idn'
|
29
|
+
# encode domain part
|
30
|
+
return IDN::Idna.toASCII(domain_part)
|
31
|
+
rescue LoadError
|
32
|
+
rescue IDN::Idna::IdnaError
|
33
|
+
end
|
34
|
+
end
|
35
|
+
domain_part
|
36
|
+
end
|
37
|
+
|
20
38
|
# main validator for email
|
21
39
|
def validate_each(record, attribute, value)
|
22
40
|
unless value.blank?
|
23
|
-
# split local and domain part
|
24
|
-
(local_part, domain_part) = value.split('@', 2)
|
25
41
|
|
26
42
|
# pre var
|
27
43
|
valid = true
|
44
|
+
local_part = nil
|
45
|
+
domain_part = nil
|
46
|
+
|
47
|
+
if valid
|
48
|
+
# split local and domain part
|
49
|
+
(local_part, domain_part) = value.to_s.split('@', 2)
|
50
|
+
end
|
28
51
|
|
29
|
-
|
30
|
-
|
31
|
-
valid
|
52
|
+
domain_part = convert_idn domain_part
|
53
|
+
|
54
|
+
if valid
|
55
|
+
# check syntax
|
56
|
+
valid = false unless local_part =~ /\A[A-Za-z0-9.!\#$%&'*+-\/=?^_`{|}~]+\Z/
|
57
|
+
valid = false unless domain_part =~ /\A((?:[-a-zA-Z0-9]+\.)+[a-zA-Z]{2,})(.|)\Z/
|
58
|
+
end
|
32
59
|
|
33
60
|
# check mx
|
34
61
|
if valid and validate_mx?
|
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{rails_email_validator}
|
8
|
-
s.version = "0.0
|
8
|
+
s.version = "0.1.0"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Marco Scholl"]
|
12
|
-
s.date = %q{
|
12
|
+
s.date = %q{2011-01-22}
|
13
13
|
s.description = %q{a class to validate emails. it builded for rails}
|
14
14
|
s.email = %q{develop@marco-scholl.de}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -47,23 +47,20 @@ Gem::Specification.new do |s|
|
|
47
47
|
s.add_runtime_dependency(%q<activemodel>, [">= 3.0.0"])
|
48
48
|
s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
|
49
49
|
s.add_development_dependency(%q<jeweler>, ["~> 1.5.1"])
|
50
|
-
s.add_development_dependency(%q<
|
51
|
-
s.add_development_dependency(%q<reek>, ["~> 1.2.8"])
|
50
|
+
s.add_development_dependency(%q<idn>, [">= 0"])
|
52
51
|
s.add_runtime_dependency(%q<activemodel>, [">= 3.0.0"])
|
53
52
|
else
|
54
53
|
s.add_dependency(%q<activemodel>, [">= 3.0.0"])
|
55
54
|
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
56
55
|
s.add_dependency(%q<jeweler>, ["~> 1.5.1"])
|
57
|
-
s.add_dependency(%q<
|
58
|
-
s.add_dependency(%q<reek>, ["~> 1.2.8"])
|
56
|
+
s.add_dependency(%q<idn>, [">= 0"])
|
59
57
|
s.add_dependency(%q<activemodel>, [">= 3.0.0"])
|
60
58
|
end
|
61
59
|
else
|
62
60
|
s.add_dependency(%q<activemodel>, [">= 3.0.0"])
|
63
61
|
s.add_dependency(%q<bundler>, ["~> 1.0.0"])
|
64
62
|
s.add_dependency(%q<jeweler>, ["~> 1.5.1"])
|
65
|
-
s.add_dependency(%q<
|
66
|
-
s.add_dependency(%q<reek>, ["~> 1.2.8"])
|
63
|
+
s.add_dependency(%q<idn>, [">= 0"])
|
67
64
|
s.add_dependency(%q<activemodel>, [">= 3.0.0"])
|
68
65
|
end
|
69
66
|
end
|
@@ -1,7 +1,126 @@
|
|
1
|
+
# encoding:utf-8
|
2
|
+
|
1
3
|
require 'helper'
|
2
4
|
|
5
|
+
class ValidateEmailWithMx
|
6
|
+
include ActiveModel::Validations
|
7
|
+
attr_accessor :email
|
8
|
+
validates :email, :email => true
|
9
|
+
end
|
10
|
+
|
11
|
+
class ValidateEmailWithoutMx
|
12
|
+
include ActiveModel::Validations
|
13
|
+
attr_accessor :email
|
14
|
+
validates :email, :email => {:validate_mx => false}
|
15
|
+
end
|
16
|
+
|
17
|
+
class ValidateEmailDisabledIdm
|
18
|
+
include ActiveModel::Validations
|
19
|
+
attr_accessor :email
|
20
|
+
validates :email, :email => {:allow_idn => false}
|
21
|
+
end
|
22
|
+
|
23
|
+
|
3
24
|
class TestRailsEmailValidator < Test::Unit::TestCase
|
4
|
-
|
5
|
-
|
25
|
+
|
26
|
+
|
27
|
+
def test_valid_emails_with_mx_validation
|
28
|
+
model = ValidateEmailWithMx.new
|
29
|
+
|
30
|
+
[
|
31
|
+
'test@marco-scholl.de'
|
32
|
+
].each do |email|
|
33
|
+
|
34
|
+
model.email = email
|
35
|
+
assert model.valid?, ">>#{email}<<"
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_invalid_emails_with_mx_validation
|
41
|
+
model = ValidateEmailWithMx.new
|
42
|
+
|
43
|
+
[
|
44
|
+
'test@invalidmx.marco-scholl.de'
|
45
|
+
].each do |email|
|
46
|
+
|
47
|
+
model.email = email
|
48
|
+
assert !model.valid?, ">>#{email}<<"
|
49
|
+
|
50
|
+
end
|
6
51
|
end
|
52
|
+
|
53
|
+
|
54
|
+
def test_valid_emails_without_mx_validation
|
55
|
+
model = ValidateEmailWithoutMx.new
|
56
|
+
|
57
|
+
[
|
58
|
+
nil,
|
59
|
+
'',
|
60
|
+
' ',
|
61
|
+
'test@example.net',
|
62
|
+
'test@sub1.example.net',
|
63
|
+
'test@sub1.example.co.uk',
|
64
|
+
'test@sub2.sub1.example.net',
|
65
|
+
'test@sub2.sub1.example.tttttttt',
|
66
|
+
'test@mexample.net.'
|
67
|
+
].each do |email|
|
68
|
+
|
69
|
+
model.email = email
|
70
|
+
assert model.valid?, ">>#{email}<<"
|
71
|
+
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_invalid_emails_without_mx_validation
|
76
|
+
model = ValidateEmailWithoutMx.new
|
77
|
+
|
78
|
+
[
|
79
|
+
1.2,
|
80
|
+
1,
|
81
|
+
'email',
|
82
|
+
'test@localhost',
|
83
|
+
'müller@example.net',
|
84
|
+
'test@example.net..'
|
85
|
+
].each do |email|
|
86
|
+
|
87
|
+
model.email = email
|
88
|
+
assert !model.valid?, ">>#{email}<<"
|
89
|
+
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def test_idn_adresses
|
94
|
+
model = ValidateEmailWithoutMx.new
|
95
|
+
|
96
|
+
[
|
97
|
+
'mueller@müller.de',
|
98
|
+
'test@räksmörgås.nu',
|
99
|
+
'test@sub1.räksmörgås.nu',
|
100
|
+
'test@xn--rksmrgs-5wao1o.nu',
|
101
|
+
'test@sub1.xn--rksmrgs-5wao1o.nu'
|
102
|
+
].each do |email|
|
103
|
+
|
104
|
+
model.email = email
|
105
|
+
assert model.valid?, ">>#{email}<<"
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def test_idn_with_disabled_idn_support
|
110
|
+
model = ValidateEmailDisabledIdm.new
|
111
|
+
|
112
|
+
[
|
113
|
+
'mueller@müller.de',
|
114
|
+
'test@räksmörgås.nu',
|
115
|
+
'test@sub1.räksmörgås.nu',
|
116
|
+
'test@xn--rksmrgs-5wao1o.nu',
|
117
|
+
'test@sub1.xn--rksmrgs-5wao1o.nu'
|
118
|
+
].each do |email|
|
119
|
+
|
120
|
+
model.email = email
|
121
|
+
assert !model.valid?, ">>#{email}<<"
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
|
7
126
|
end
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
+
- 1
|
7
8
|
- 0
|
8
|
-
|
9
|
-
version: 0.0.3
|
9
|
+
version: 0.1.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Marco Scholl
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date:
|
17
|
+
date: 2011-01-22 00:00:00 +01:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -63,7 +63,7 @@ dependencies:
|
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: *id003
|
65
65
|
- !ruby/object:Gem::Dependency
|
66
|
-
name:
|
66
|
+
name: idn
|
67
67
|
requirement: &id004 !ruby/object:Gem::Requirement
|
68
68
|
none: false
|
69
69
|
requirements:
|
@@ -75,24 +75,9 @@ dependencies:
|
|
75
75
|
type: :development
|
76
76
|
prerelease: false
|
77
77
|
version_requirements: *id004
|
78
|
-
- !ruby/object:Gem::Dependency
|
79
|
-
name: reek
|
80
|
-
requirement: &id005 !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
|
-
requirements:
|
83
|
-
- - ~>
|
84
|
-
- !ruby/object:Gem::Version
|
85
|
-
segments:
|
86
|
-
- 1
|
87
|
-
- 2
|
88
|
-
- 8
|
89
|
-
version: 1.2.8
|
90
|
-
type: :development
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: *id005
|
93
78
|
- !ruby/object:Gem::Dependency
|
94
79
|
name: activemodel
|
95
|
-
requirement: &
|
80
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
96
81
|
none: false
|
97
82
|
requirements:
|
98
83
|
- - ">="
|
@@ -104,7 +89,7 @@ dependencies:
|
|
104
89
|
version: 3.0.0
|
105
90
|
type: :runtime
|
106
91
|
prerelease: false
|
107
|
-
version_requirements: *
|
92
|
+
version_requirements: *id005
|
108
93
|
description: a class to validate emails. it builded for rails
|
109
94
|
email: develop@marco-scholl.de
|
110
95
|
executables: []
|
@@ -140,7 +125,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
140
125
|
requirements:
|
141
126
|
- - ">="
|
142
127
|
- !ruby/object:Gem::Version
|
143
|
-
hash:
|
128
|
+
hash: -2629671929889912192
|
144
129
|
segments:
|
145
130
|
- 0
|
146
131
|
version: "0"
|