spectator-validates_email 0.0.3 → 0.0.4
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/README.rdoc +32 -12
- data/lib/validates_email.rb +1 -43
- data/lib/validates_email/email_validator.rb +69 -0
- data/lib/validates_email/version.rb +3 -0
- metadata +66 -36
- data/.gitignore +0 -15
- data/Rakefile +0 -41
- data/VERSION +0 -1
- data/init.rb +0 -1
- data/test/database.yml +0 -3
- data/test/schema.rb +0 -13
- data/test/test_helper.rb +0 -13
- data/test/validates_email_test.rb +0 -165
- data/validates_email.gemspec +0 -62
data/README.rdoc
CHANGED
@@ -6,41 +6,46 @@ validates_email is a Rails 3 plugin that validates email addresses against RFC 2
|
|
6
6
|
|
7
7
|
rails plugin install git://github.com/spectator/validates_email.git
|
8
8
|
|
9
|
-
|
9
|
+
or
|
10
10
|
|
11
11
|
gem 'spectator-validates_email', :require => 'validates_email'
|
12
12
|
|
13
13
|
== Usage
|
14
14
|
|
15
15
|
class User < ActiveRecord::Base
|
16
|
-
validates :
|
16
|
+
validates :primary_email, :email => true
|
17
17
|
end
|
18
18
|
|
19
19
|
As well as any other Rails 3 validation this one has the same triggers, such as <tt>:on</tt>, <tt>:if</tt>, <tt>:unless</tt>, <tt>:allow_blank</tt>, and <tt>:allow_nil</tt>.
|
20
20
|
|
21
|
-
Also, you can pass your custom error message
|
21
|
+
Also, you can pass your own custom error message.
|
22
22
|
|
23
23
|
class User < ActiveRecord::Base
|
24
|
-
validates :
|
24
|
+
validates :primary_email, :email => { :message => 'is not an email address' }
|
25
25
|
end
|
26
26
|
|
27
27
|
If you like to check MX Records for email, you can use <tt>:mx</tt> option.
|
28
28
|
|
29
29
|
class User < ActiveRecord::Base
|
30
|
-
validates :
|
30
|
+
validates :primary_email, :email => { :mx => true }
|
31
31
|
end
|
32
32
|
|
33
33
|
And if you like to check MX Records with fallback to A record, use <tt>:a_fallback</tt> option.
|
34
34
|
|
35
35
|
class User < ActiveRecord::Base
|
36
|
-
validates :
|
36
|
+
validates :primary_email, :email => { :mx => { :a_fallback => true } }
|
37
37
|
end
|
38
38
|
|
39
|
-
==
|
39
|
+
== I18n
|
40
40
|
|
41
|
-
|
41
|
+
If you don't specify your own error message, then ActiveRecord's <tt>:invalid</tt> error message will be used to show the error.
|
42
42
|
|
43
|
-
|
43
|
+
If do check MX Records, then you have to specify your own error message or add it to your traslations:
|
44
|
+
|
45
|
+
activerecord:
|
46
|
+
errors:
|
47
|
+
messages:
|
48
|
+
mx_invalid: "is not valid"
|
44
49
|
|
45
50
|
== Credits
|
46
51
|
|
@@ -48,9 +53,24 @@ Most of the code were taken from Alex Dunae (dunae.ca) plugin (see http://github
|
|
48
53
|
|
49
54
|
== Contributors
|
50
55
|
|
51
|
-
Petr Blaho
|
52
|
-
Christian Eichhorn
|
56
|
+
* Petr Blaho
|
57
|
+
* Christian Eichhorn
|
58
|
+
|
59
|
+
== How to contribute
|
60
|
+
|
61
|
+
* Fork
|
62
|
+
* Make changes
|
63
|
+
* Write specs
|
64
|
+
* Do pull request
|
65
|
+
|
66
|
+
== Testing
|
67
|
+
|
68
|
+
To execute unit tests run <tt>rake spec</tt> within plugin folder.
|
69
|
+
|
70
|
+
The unit tests for this plugin use an in-memory sqlite3 database.
|
53
71
|
|
54
72
|
== Notes
|
55
73
|
|
56
|
-
|
74
|
+
Compatible with following ruby versions:
|
75
|
+
* Ruby 1.8.7
|
76
|
+
* Ruby 1.9.2
|
data/lib/validates_email.rb
CHANGED
@@ -1,43 +1 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
LocalPartSpecialChars = Regexp.escape('!#$%&\'*-/=?+-^_`{|}~')
|
4
|
-
LocalPartUnquoted = '(([[:alnum:]' + LocalPartSpecialChars + ']+[\.\+]+))*[[:alnum:]' + LocalPartSpecialChars + '+]+'
|
5
|
-
LocalPartQuoted = '\"(([[:alnum:]' + LocalPartSpecialChars + '\.\+]*|(\\\\[\x00-\xFF]))*)\"'
|
6
|
-
Regex = Regexp.new('^((' + LocalPartUnquoted + ')|(' + LocalPartQuoted + ')+)@(((\w+\-+[^_])|(\w+\.[^_]))*([a-z0-9-]{1,63})\.[a-z]{2,6}$)', Regexp::EXTENDED | Regexp::IGNORECASE, 'n')
|
7
|
-
|
8
|
-
def validates_email_format(email)
|
9
|
-
# local part max is 64 chars, domain part max is 255 chars
|
10
|
-
# TODO: should this decode escaped entities before counting?
|
11
|
-
begin
|
12
|
-
local, domain = email.split('@', 2)
|
13
|
-
rescue NoMethodError
|
14
|
-
return false
|
15
|
-
end
|
16
|
-
|
17
|
-
email =~ Regex and not email =~ /\.\./ and domain.length <= 255 and local.length <= 64
|
18
|
-
end
|
19
|
-
|
20
|
-
def validates_email_domain(email, options)
|
21
|
-
require 'resolv'
|
22
|
-
a_fallback = options.is_a?(Hash) ? options[:a_fallback] : false
|
23
|
-
domain = email.match(/\@(.+)/)[1]
|
24
|
-
Resolv::DNS.open do |dns|
|
25
|
-
@mx = dns.getresources(domain, Resolv::DNS::Resource::IN::MX)
|
26
|
-
@mx.push(*dns.getresources(domain, Resolv::DNS::Resource::IN::A)) if a_fallback
|
27
|
-
end
|
28
|
-
@mx.size > 0 ? true : false
|
29
|
-
end
|
30
|
-
|
31
|
-
def validate_each(record, attribute, value)
|
32
|
-
if validates_email_format(value)
|
33
|
-
# only test the mx if the email format is valid first
|
34
|
-
# (missing @ raises exception in validates_email_domain)
|
35
|
-
if options[:mx] && !validates_email_domain(value, options[:mx])
|
36
|
-
record.errors[attribute] << (options[:mx_message] || I18n.t(:mx_invalid, :scope => [:activerecord, :errors, :messages]))
|
37
|
-
end
|
38
|
-
else
|
39
|
-
record.errors[attribute] << (options[:message] || I18n.t(:invalid, :scope => [:activerecord, :errors, :messages]))
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
end
|
1
|
+
require "validates_email/email_validator"
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# Email validation class which uses Rails 3 ActiveModel
|
2
|
+
# validation mechanism.
|
3
|
+
#
|
4
|
+
class EmailValidator < ActiveModel::EachValidator
|
5
|
+
|
6
|
+
LocalPartSpecialChars = Regexp.escape('!#$%&\'*-/=?+-^_`{|}~')
|
7
|
+
LocalPartUnquoted = '(([[:alnum:]' + LocalPartSpecialChars + ']+[\.\+]+))*[[:alnum:]' + LocalPartSpecialChars + '+]+'
|
8
|
+
LocalPartQuoted = '\"(([[:alnum:]' + LocalPartSpecialChars + '\.\+]*|(\\\\[\x00-\xFF]))*)\"'
|
9
|
+
Regex = Regexp.new('^((' + LocalPartUnquoted + ')|(' + LocalPartQuoted + ')+)@(((\w+\-+[^_])|(\w+\.[^_]))*([a-z0-9-]{1,63})\.[a-z]{2,6}$)', Regexp::EXTENDED | Regexp::IGNORECASE, 'n')
|
10
|
+
|
11
|
+
# Validates email address.
|
12
|
+
# If MX fallback was also requested, it will check if email is valid
|
13
|
+
# first, and only after that will go to MX fallback.
|
14
|
+
#
|
15
|
+
# @example
|
16
|
+
# class User < ActiveRecord::Base
|
17
|
+
# validates :primary_email, :email => { :mx => { :a_fallback => true } }
|
18
|
+
# end
|
19
|
+
#
|
20
|
+
def validate_each(record, attribute, value)
|
21
|
+
if validates_email_format(value)
|
22
|
+
if options[:mx] && !validates_email_domain(value, options[:mx])
|
23
|
+
record.errors[attribute] << (options[:mx_message] || I18n.t(:mx_invalid, :scope => [:activerecord, :errors, :messages]))
|
24
|
+
end
|
25
|
+
else
|
26
|
+
record.errors[attribute] << (options[:message] || I18n.t(:invalid, :scope => [:activerecord, :errors, :messages]))
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
# Checks email if it's valid by rules defined in `Regex`.
|
33
|
+
#
|
34
|
+
# @param [String] A string with email. Local part of email is max 64 chars,
|
35
|
+
# domain part is max 255 chars.
|
36
|
+
#
|
37
|
+
# @return [Boolean] True or false.
|
38
|
+
#
|
39
|
+
def validates_email_format(email)
|
40
|
+
# TODO: should this decode escaped entities before counting?
|
41
|
+
begin
|
42
|
+
local, domain = email.split('@', 2)
|
43
|
+
rescue NoMethodError
|
44
|
+
return false
|
45
|
+
end
|
46
|
+
|
47
|
+
email =~ Regex and not email =~ /\.\./ and domain.length <= 255 and local.length <= 64
|
48
|
+
end
|
49
|
+
|
50
|
+
# Checks email is its domain is valid. Fallbacks to A record if requested.
|
51
|
+
#
|
52
|
+
# @param [String] A string with email.
|
53
|
+
# @param [Hash] A hash of options, which tells whether to use A fallback or
|
54
|
+
# or not. Additional options can be also passed.
|
55
|
+
#
|
56
|
+
# @return [Integer, nil] In general, it's true or false.
|
57
|
+
#
|
58
|
+
def validates_email_domain(email, options)
|
59
|
+
require 'resolv'
|
60
|
+
a_fallback = options.is_a?(Hash) ? options[:a_fallback] : false
|
61
|
+
domain = email.match(/\@(.+)/)[1]
|
62
|
+
Resolv::DNS.open do |dns|
|
63
|
+
@mx = dns.getresources(domain, Resolv::DNS::Resource::IN::MX)
|
64
|
+
@mx.push(*dns.getresources(domain, Resolv::DNS::Resource::IN::A)) if a_fallback
|
65
|
+
end
|
66
|
+
@mx.size > 0 ? true : false
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
metadata
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spectator-validates_email
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
+
hash: 23
|
4
5
|
prerelease: false
|
5
6
|
segments:
|
6
7
|
- 0
|
7
8
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
9
|
+
- 4
|
10
|
+
version: 0.0.4
|
10
11
|
platform: ruby
|
11
12
|
authors:
|
12
13
|
- Yury Velikanau
|
@@ -14,84 +15,111 @@ autorequire:
|
|
14
15
|
bindir: bin
|
15
16
|
cert_chain: []
|
16
17
|
|
17
|
-
date: 2010-
|
18
|
+
date: 2010-11-07 00:00:00 -07:00
|
18
19
|
default_executable:
|
19
20
|
dependencies:
|
20
21
|
- !ruby/object:Gem::Dependency
|
21
|
-
name:
|
22
|
+
name: actionpack
|
22
23
|
prerelease: false
|
23
24
|
requirement: &id001 !ruby/object:Gem::Requirement
|
24
25
|
none: false
|
25
26
|
requirements:
|
26
27
|
- - ~>
|
27
28
|
- !ruby/object:Gem::Version
|
29
|
+
hash: 7
|
28
30
|
segments:
|
29
31
|
- 3
|
30
32
|
- 0
|
31
33
|
- 0
|
32
|
-
|
33
|
-
|
34
|
-
type: :development
|
34
|
+
version: 3.0.0
|
35
|
+
type: :runtime
|
35
36
|
version_requirements: *id001
|
36
37
|
- !ruby/object:Gem::Dependency
|
37
|
-
name:
|
38
|
+
name: activemodel
|
38
39
|
prerelease: false
|
39
40
|
requirement: &id002 !ruby/object:Gem::Requirement
|
40
41
|
none: false
|
41
42
|
requirements:
|
42
43
|
- - ~>
|
43
44
|
- !ruby/object:Gem::Version
|
45
|
+
hash: 7
|
44
46
|
segments:
|
45
47
|
- 3
|
46
48
|
- 0
|
47
49
|
- 0
|
48
|
-
|
49
|
-
|
50
|
-
type: :development
|
50
|
+
version: 3.0.0
|
51
|
+
type: :runtime
|
51
52
|
version_requirements: *id002
|
52
53
|
- !ruby/object:Gem::Dependency
|
53
|
-
name:
|
54
|
+
name: bundler
|
54
55
|
prerelease: false
|
55
56
|
requirement: &id003 !ruby/object:Gem::Requirement
|
56
57
|
none: false
|
57
58
|
requirements:
|
58
59
|
- - ~>
|
59
60
|
- !ruby/object:Gem::Version
|
61
|
+
hash: 23
|
62
|
+
segments:
|
63
|
+
- 1
|
64
|
+
- 0
|
65
|
+
- 0
|
66
|
+
version: 1.0.0
|
67
|
+
type: :development
|
68
|
+
version_requirements: *id003
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rspec
|
71
|
+
prerelease: false
|
72
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ~>
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
hash: 15
|
78
|
+
segments:
|
79
|
+
- 2
|
80
|
+
- 0
|
81
|
+
- 0
|
82
|
+
version: 2.0.0
|
83
|
+
type: :development
|
84
|
+
version_requirements: *id004
|
85
|
+
- !ruby/object:Gem::Dependency
|
86
|
+
name: sqlite3-ruby
|
87
|
+
prerelease: false
|
88
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ~>
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
hash: 25
|
60
94
|
segments:
|
61
95
|
- 1
|
62
96
|
- 3
|
63
97
|
- 1
|
64
98
|
version: 1.3.1
|
65
99
|
type: :development
|
66
|
-
version_requirements: *
|
67
|
-
description:
|
68
|
-
email:
|
100
|
+
version_requirements: *id005
|
101
|
+
description: Rails 3 plugin to validate email addresses against RFC 2822 and RFC 3696
|
102
|
+
email:
|
103
|
+
- yury.velikanau@gmail.com
|
69
104
|
executables: []
|
70
105
|
|
71
106
|
extensions: []
|
72
107
|
|
73
|
-
extra_rdoc_files:
|
74
|
-
|
108
|
+
extra_rdoc_files: []
|
109
|
+
|
75
110
|
files:
|
76
|
-
- .
|
111
|
+
- lib/validates_email/email_validator.rb
|
112
|
+
- lib/validates_email/version.rb
|
113
|
+
- lib/validates_email.rb
|
77
114
|
- MIT-LICENSE
|
78
115
|
- README.rdoc
|
79
|
-
- Rakefile
|
80
|
-
- VERSION
|
81
|
-
- init.rb
|
82
|
-
- lib/validates_email.rb
|
83
|
-
- test/database.yml
|
84
|
-
- test/schema.rb
|
85
|
-
- test/test_helper.rb
|
86
|
-
- test/validates_email_test.rb
|
87
|
-
- validates_email.gemspec
|
88
116
|
has_rdoc: true
|
89
117
|
homepage: http://github.com/spectator/validates_email
|
90
118
|
licenses: []
|
91
119
|
|
92
120
|
post_install_message:
|
93
|
-
rdoc_options:
|
94
|
-
|
121
|
+
rdoc_options: []
|
122
|
+
|
95
123
|
require_paths:
|
96
124
|
- lib
|
97
125
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -99,6 +127,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
99
127
|
requirements:
|
100
128
|
- - ">="
|
101
129
|
- !ruby/object:Gem::Version
|
130
|
+
hash: 3
|
102
131
|
segments:
|
103
132
|
- 0
|
104
133
|
version: "0"
|
@@ -107,17 +136,18 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
107
136
|
requirements:
|
108
137
|
- - ">="
|
109
138
|
- !ruby/object:Gem::Version
|
139
|
+
hash: 23
|
110
140
|
segments:
|
111
|
-
-
|
112
|
-
|
141
|
+
- 1
|
142
|
+
- 3
|
143
|
+
- 6
|
144
|
+
version: 1.3.6
|
113
145
|
requirements: []
|
114
146
|
|
115
147
|
rubyforge_project:
|
116
148
|
rubygems_version: 1.3.7
|
117
149
|
signing_key:
|
118
150
|
specification_version: 3
|
119
|
-
summary:
|
120
|
-
test_files:
|
121
|
-
|
122
|
-
- test/test_helper.rb
|
123
|
-
- test/validates_email_test.rb
|
151
|
+
summary: Rails 3 plugin to validate email addresses
|
152
|
+
test_files: []
|
153
|
+
|
data/.gitignore
DELETED
data/Rakefile
DELETED
@@ -1,41 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'rake'
|
3
|
-
|
4
|
-
begin
|
5
|
-
require 'jeweler'
|
6
|
-
Jeweler::Tasks.new do |gem|
|
7
|
-
gem.name = "spectator-validates_email"
|
8
|
-
gem.summary = %Q{Gem to validate email addresses for Rails 3}
|
9
|
-
gem.description = %Q{validates_email is a Rails 3 plugin that validates email addresses against RFC 2822 and RFC 3696}
|
10
|
-
gem.email = "yury.velikanau@gmail.com"
|
11
|
-
gem.homepage = "http://github.com/spectator/validates_email"
|
12
|
-
gem.authors = ["Yury Velikanau"]
|
13
|
-
gem.add_development_dependency "activerecord", "~> 3.0.0.beta"
|
14
|
-
gem.add_development_dependency "activesupport", "~> 3.0.0.beta"
|
15
|
-
gem.add_development_dependency "sqlite3-ruby", "~> 1.3.1"
|
16
|
-
end
|
17
|
-
Jeweler::GemcutterTasks.new
|
18
|
-
rescue LoadError
|
19
|
-
puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
|
20
|
-
end
|
21
|
-
|
22
|
-
require 'rake/testtask'
|
23
|
-
Rake::TestTask.new(:test) do |t|
|
24
|
-
t.libs << 'lib'
|
25
|
-
t.libs << 'test'
|
26
|
-
t.pattern = 'test/**/*_test.rb'
|
27
|
-
t.verbose = true
|
28
|
-
end
|
29
|
-
|
30
|
-
task :test => :check_dependencies
|
31
|
-
|
32
|
-
task :default => :test
|
33
|
-
|
34
|
-
require 'rake/rdoctask'
|
35
|
-
Rake::RDocTask.new(:rdoc) do |rdoc|
|
36
|
-
rdoc.rdoc_dir = 'rdoc'
|
37
|
-
rdoc.title = 'ValidatesEmail'
|
38
|
-
rdoc.options << '--line-numbers' << '--inline-source'
|
39
|
-
rdoc.rdoc_files.include('README')
|
40
|
-
rdoc.rdoc_files.include('lib/**/*.rb')
|
41
|
-
end
|
data/VERSION
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
0.0.3
|
data/init.rb
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
require 'validates_email'
|
data/test/database.yml
DELETED
data/test/schema.rb
DELETED
@@ -1,13 +0,0 @@
|
|
1
|
-
ActiveRecord::Schema.define(:version => 0) do
|
2
|
-
create_table :people, :force => true do |t|
|
3
|
-
t.string :email
|
4
|
-
end
|
5
|
-
|
6
|
-
create_table :mx_records, :force => true do |t|
|
7
|
-
t.string :email
|
8
|
-
end
|
9
|
-
|
10
|
-
create_table :mx_fallbacks, :force => true do |t|
|
11
|
-
t.string :email
|
12
|
-
end
|
13
|
-
end
|
data/test/test_helper.rb
DELETED
@@ -1,13 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'test/unit'
|
3
|
-
require 'active_record'
|
4
|
-
require 'active_support/core_ext/logger'
|
5
|
-
|
6
|
-
def load_schema
|
7
|
-
config = YAML::load(IO.read(File.dirname(__FILE__) + '/database.yml'))
|
8
|
-
ActiveRecord::Base.logger = Logger.new(File.dirname(__FILE__) + "/debug.log")
|
9
|
-
|
10
|
-
ActiveRecord::Base.establish_connection(config['plugin_test'])
|
11
|
-
load(File.dirname(__FILE__) + "/schema.rb")
|
12
|
-
require File.dirname(__FILE__) + '/../init.rb'
|
13
|
-
end
|
@@ -1,165 +0,0 @@
|
|
1
|
-
require 'test_helper'
|
2
|
-
|
3
|
-
class ValidatesEmailTest < ActiveSupport::TestCase
|
4
|
-
load_schema
|
5
|
-
|
6
|
-
class Person < ActiveRecord::Base
|
7
|
-
validates :email, :email => { :message => 'fails with custom message' }
|
8
|
-
end
|
9
|
-
|
10
|
-
class MxRecord < ActiveRecord::Base
|
11
|
-
validates :email, :email => { :mx => true,
|
12
|
-
:mx_message => 'fails with custom mx message' }
|
13
|
-
end
|
14
|
-
|
15
|
-
class MxFallback < ActiveRecord::Base
|
16
|
-
validates :email, :email => { :mx => { :a_fallback => true },
|
17
|
-
:mx_message => 'fails with custom mx message' }
|
18
|
-
end
|
19
|
-
|
20
|
-
def test_should_allow_valid_email_addresses
|
21
|
-
[
|
22
|
-
'valid@example.com',
|
23
|
-
'Valid@test.example.com',
|
24
|
-
'valid+valid123@test.example.com',
|
25
|
-
'valid_valid123@test.example.com',
|
26
|
-
'valid-valid+123@test.example.co.uk',
|
27
|
-
'valid-valid+1.23@test.example.com.au',
|
28
|
-
'valid@example.co.uk',
|
29
|
-
'v@example.com',
|
30
|
-
'valid@example.ca',
|
31
|
-
'valid_@example.com',
|
32
|
-
'valid123.456@example.org',
|
33
|
-
'valid123.456@example.travel',
|
34
|
-
'valid123.456@example.museum',
|
35
|
-
'valid@example.mobi',
|
36
|
-
'valid@example.info',
|
37
|
-
'valid-@example.com',
|
38
|
-
# from RFC 3696, page 6
|
39
|
-
'customer/department=shipping@example.com',
|
40
|
-
'$A12345@example.com',
|
41
|
-
'!def!xyz%abc@example.com',
|
42
|
-
'_somename@example.com',
|
43
|
-
# apostrophes
|
44
|
-
"test'test@example.com"
|
45
|
-
].each do |email|
|
46
|
-
p = create_person(:email => email)
|
47
|
-
save_passes(p, email)
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
def test_should_not_allow_invalid_email_addresses
|
52
|
-
[
|
53
|
-
'invalid@example-com',
|
54
|
-
# period can not start local part
|
55
|
-
'.invalid@example.com',
|
56
|
-
# period can not end local part
|
57
|
-
'invalid.@example.com',
|
58
|
-
# period can not appear twice consecutively in local part
|
59
|
-
'invali..d@example.com',
|
60
|
-
# should not allow underscores in domain names
|
61
|
-
'invalid@ex_mple.com',
|
62
|
-
'invalid@example.com.',
|
63
|
-
'invalid@example.com_',
|
64
|
-
'invalid@example.com-',
|
65
|
-
'invalid-example.com',
|
66
|
-
'invalid@example.b#r.com',
|
67
|
-
'invalid@example.c',
|
68
|
-
'invali d@example.com',
|
69
|
-
'invalidexample.com',
|
70
|
-
'invalid@example.'
|
71
|
-
].each do |email|
|
72
|
-
p = create_person(:email => email)
|
73
|
-
save_fails(p, email)
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
# from http://www.rfc-editor.org/errata_search.php?rfc=3696
|
78
|
-
def test_should_allow_quoted_characters
|
79
|
-
[
|
80
|
-
'"Abc\@def"@example.com',
|
81
|
-
'"Fred\ Bloggs"@example.com',
|
82
|
-
'"Joe.\\Blow"@example.com'
|
83
|
-
].each do |email|
|
84
|
-
p = create_person(:email => email)
|
85
|
-
save_passes(p, email)
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
# from http://tools.ietf.org/html/rfc3696, page 5
|
90
|
-
# corrected in http://www.rfc-editor.org/errata_search.php?rfc=3696
|
91
|
-
def test_should_not_allow_escaped_characters_without_quotes
|
92
|
-
[
|
93
|
-
'Fred\ Bloggs_@example.com',
|
94
|
-
'Abc\@def+@example.com',
|
95
|
-
'Joe.\\Blow@example.com'
|
96
|
-
].each do |email|
|
97
|
-
p = create_person(:email => email)
|
98
|
-
save_fails(p, email)
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
def test_should_check_length_limits
|
103
|
-
[
|
104
|
-
'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@example.com',
|
105
|
-
'test@aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com'
|
106
|
-
].each do |email|
|
107
|
-
p = create_person(:email => email)
|
108
|
-
save_fails(p, email)
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
def test_should_allow_custom_error_message
|
113
|
-
p = create_person(:email => @invalid_email)
|
114
|
-
save_fails(p)
|
115
|
-
# Object.errors[:field] returns array now
|
116
|
-
assert_equal ['fails with custom message'], p.errors[:email]
|
117
|
-
end
|
118
|
-
|
119
|
-
def test_should_validate_email_with_mx
|
120
|
-
valid_email = 'test@gmail.com'
|
121
|
-
p = MxRecord.new(:email => valid_email)
|
122
|
-
save_passes(p, valid_email)
|
123
|
-
|
124
|
-
invalid_email = 'test@example.com'
|
125
|
-
p = MxRecord.new(:email => invalid_email)
|
126
|
-
save_fails(p, invalid_email)
|
127
|
-
end
|
128
|
-
|
129
|
-
def test_should_validate_with_mx_fallback
|
130
|
-
valid_email = 'test@gmail.com'
|
131
|
-
p = MxFallback.new(:email => valid_email)
|
132
|
-
save_passes(p, valid_email)
|
133
|
-
|
134
|
-
invalid_email = 'test@example.com'
|
135
|
-
p = MxFallback.new(:email => invalid_email)
|
136
|
-
save_passes(p, invalid_email)
|
137
|
-
end
|
138
|
-
|
139
|
-
def test_should_not_validate_mx_with_invalid_email
|
140
|
-
invalid_email = 'testexample.com'
|
141
|
-
assert_nothing_raised do
|
142
|
-
p = MxFallback.new(:email => invalid_email)
|
143
|
-
save_fails(p, invalid_email)
|
144
|
-
end
|
145
|
-
end
|
146
|
-
|
147
|
-
protected
|
148
|
-
|
149
|
-
def create_person(params)
|
150
|
-
Person.new(params)
|
151
|
-
end
|
152
|
-
|
153
|
-
def save_passes(p, email = '')
|
154
|
-
assert p.valid?, " validating #{email}"
|
155
|
-
assert p.save
|
156
|
-
assert_empty p.errors[:email]
|
157
|
-
end
|
158
|
-
|
159
|
-
def save_fails(p, email = '')
|
160
|
-
assert !p.valid?, " validating #{email}"
|
161
|
-
assert !p.save
|
162
|
-
assert_not_empty p.errors[:email]
|
163
|
-
end
|
164
|
-
|
165
|
-
end
|
data/validates_email.gemspec
DELETED
@@ -1,62 +0,0 @@
|
|
1
|
-
# Generated by jeweler
|
2
|
-
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
-
# -*- encoding: utf-8 -*-
|
5
|
-
|
6
|
-
Gem::Specification.new do |s|
|
7
|
-
s.name = %q{spectator-validates_email}
|
8
|
-
s.version = "0.0.3"
|
9
|
-
|
10
|
-
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
-
s.authors = ["Yury Velikanau"]
|
12
|
-
s.date = %q{2010-10-24}
|
13
|
-
s.description = %q{validates_email is a Rails 3 plugin that validates email addresses against RFC 2822 and RFC 3696}
|
14
|
-
s.email = %q{yury.velikanau@gmail.com}
|
15
|
-
s.extra_rdoc_files = [
|
16
|
-
"README.rdoc"
|
17
|
-
]
|
18
|
-
s.files = [
|
19
|
-
".gitignore",
|
20
|
-
"MIT-LICENSE",
|
21
|
-
"README.rdoc",
|
22
|
-
"Rakefile",
|
23
|
-
"VERSION",
|
24
|
-
"init.rb",
|
25
|
-
"lib/validates_email.rb",
|
26
|
-
"test/database.yml",
|
27
|
-
"test/schema.rb",
|
28
|
-
"test/test_helper.rb",
|
29
|
-
"test/validates_email_test.rb",
|
30
|
-
"validates_email.gemspec"
|
31
|
-
]
|
32
|
-
s.homepage = %q{http://github.com/spectator/validates_email}
|
33
|
-
s.rdoc_options = ["--charset=UTF-8"]
|
34
|
-
s.require_paths = ["lib"]
|
35
|
-
s.rubygems_version = %q{1.3.7}
|
36
|
-
s.summary = %q{Gem to validate email addresses for Rails 3}
|
37
|
-
s.test_files = [
|
38
|
-
"test/schema.rb",
|
39
|
-
"test/test_helper.rb",
|
40
|
-
"test/validates_email_test.rb"
|
41
|
-
]
|
42
|
-
|
43
|
-
if s.respond_to? :specification_version then
|
44
|
-
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
45
|
-
s.specification_version = 3
|
46
|
-
|
47
|
-
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
48
|
-
s.add_development_dependency(%q<activerecord>, ["~> 3.0.0.beta"])
|
49
|
-
s.add_development_dependency(%q<activesupport>, ["~> 3.0.0.beta"])
|
50
|
-
s.add_development_dependency(%q<sqlite3-ruby>, ["~> 1.3.1"])
|
51
|
-
else
|
52
|
-
s.add_dependency(%q<activerecord>, ["~> 3.0.0.beta"])
|
53
|
-
s.add_dependency(%q<activesupport>, ["~> 3.0.0.beta"])
|
54
|
-
s.add_dependency(%q<sqlite3-ruby>, ["~> 1.3.1"])
|
55
|
-
end
|
56
|
-
else
|
57
|
-
s.add_dependency(%q<activerecord>, ["~> 3.0.0.beta"])
|
58
|
-
s.add_dependency(%q<activesupport>, ["~> 3.0.0.beta"])
|
59
|
-
s.add_dependency(%q<sqlite3-ruby>, ["~> 1.3.1"])
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|