validates_as_email_address 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/CHANGELOG.rdoc +19 -0
- data/{README → README.rdoc} +7 -7
- data/Rakefile +44 -36
- data/lib/validates_as_email_address.rb +14 -34
- data/lib/validates_as_email_address/rfc_1035.rb +28 -0
- data/lib/validates_as_email_address/rfc_822.rb +35 -16
- data/test/app_root/app/models/user.rb +0 -1
- data/test/factory.rb +27 -21
- data/test/unit/validates_as_email_address_test.rb +202 -14
- metadata +8 -8
- data/CHANGELOG +0 -13
data/CHANGELOG.rdoc
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
== master
|
2
|
+
|
3
|
+
== 0.1.0 / 2008-09-07
|
4
|
+
|
5
|
+
* Allow all options to be passed to format/length validations so that future options can be defined without changing this plugin
|
6
|
+
* Add support for overriding length limits
|
7
|
+
* Add support for requiring that domains follow the RFC 1035 format (on by default) [Kacper Bielecki]
|
8
|
+
|
9
|
+
== 0.0.3 / 2008-06-22
|
10
|
+
|
11
|
+
* Remove log files from gems
|
12
|
+
|
13
|
+
== 0.0.2 / 2008-05-05
|
14
|
+
|
15
|
+
* Update documentation
|
16
|
+
|
17
|
+
== 0.0.1 / 2007-09-26
|
18
|
+
|
19
|
+
* Add documentation
|
data/{README → README.rdoc}
RENAMED
@@ -5,21 +5,21 @@ email addresses.
|
|
5
5
|
|
6
6
|
== Resources
|
7
7
|
|
8
|
-
Wiki
|
9
|
-
|
10
|
-
* http://wiki.pluginaweek.org/Validates_as_email_address
|
11
|
-
|
12
8
|
API
|
13
9
|
|
14
10
|
* http://api.pluginaweek.org/validates_as_email_address
|
15
11
|
|
12
|
+
Bugs
|
13
|
+
|
14
|
+
* http://pluginaweek.lighthouseapp.com/projects/13293-validates_as_email_address
|
15
|
+
|
16
16
|
Development
|
17
17
|
|
18
|
-
* http://
|
18
|
+
* http://github.com/pluginaweek/validates_as_email_address
|
19
19
|
|
20
20
|
Source
|
21
21
|
|
22
|
-
*
|
22
|
+
* git://github.com/pluginaweek/validates_as_email_address.git
|
23
23
|
|
24
24
|
== Description
|
25
25
|
|
@@ -40,7 +40,7 @@ the email address.
|
|
40
40
|
== Testing
|
41
41
|
|
42
42
|
Before you can run any tests, the following gem must be installed:
|
43
|
-
* plugin_test_helper[http://
|
43
|
+
* plugin_test_helper[http://github.com/pluginaweek/plugin_test_helper]
|
44
44
|
|
45
45
|
To run against a specific version of Rails:
|
46
46
|
|
data/Rakefile
CHANGED
@@ -3,46 +3,54 @@ require 'rake/rdoctask'
|
|
3
3
|
require 'rake/gempackagetask'
|
4
4
|
require 'rake/contrib/sshpublisher'
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
6
|
+
spec = Gem::Specification.new do |s|
|
7
|
+
s.name = 'validates_as_email_address'
|
8
|
+
s.version = '0.1.0'
|
9
|
+
s.platform = Gem::Platform::RUBY
|
10
|
+
s.summary = 'Adds support for validating the format/length of email addresses'
|
11
|
+
|
12
|
+
s.files = FileList['{lib,test}/**/*'] + %w(CHANGELOG.rdoc init.rb LICENSE Rakefile README.rdoc) - FileList['test/app_root/{log,log/*,script,script/*}']
|
13
|
+
s.require_path = 'lib'
|
14
|
+
s.has_rdoc = true
|
15
|
+
s.test_files = Dir['test/**/*_test.rb']
|
16
|
+
|
17
|
+
s.author = 'Aaron Pfeifer'
|
18
|
+
s.email = 'aaron@pluginaweek.org'
|
19
|
+
s.homepage = 'http://www.pluginaweek.org'
|
20
|
+
s.rubyforge_project = 'pluginaweek'
|
21
|
+
end
|
22
|
+
|
23
|
+
desc 'Default: run all tests.'
|
12
24
|
task :default => :test
|
13
25
|
|
14
|
-
desc
|
26
|
+
desc "Test the #{spec.name} plugin."
|
15
27
|
Rake::TestTask.new(:test) do |t|
|
16
28
|
t.libs << 'lib'
|
17
|
-
t.
|
29
|
+
t.test_files = spec.test_files
|
18
30
|
t.verbose = true
|
19
31
|
end
|
20
32
|
|
21
|
-
|
33
|
+
begin
|
34
|
+
require 'rcov/rcovtask'
|
35
|
+
namespace :test do
|
36
|
+
desc "Test the #{spec.name} plugin with Rcov."
|
37
|
+
Rcov::RcovTask.new(:rcov) do |t|
|
38
|
+
t.libs << 'lib'
|
39
|
+
t.test_files = spec.test_files
|
40
|
+
t.rcov_opts << '--exclude="^(?!lib/)"'
|
41
|
+
t.verbose = true
|
42
|
+
end
|
43
|
+
end
|
44
|
+
rescue LoadError
|
45
|
+
end
|
46
|
+
|
47
|
+
desc "Generate documentation for the #{spec.name} plugin."
|
22
48
|
Rake::RDocTask.new(:rdoc) do |rdoc|
|
23
49
|
rdoc.rdoc_dir = 'rdoc'
|
24
|
-
rdoc.title =
|
50
|
+
rdoc.title = spec.name
|
25
51
|
rdoc.template = '../rdoc_template.rb'
|
26
52
|
rdoc.options << '--line-numbers' << '--inline-source'
|
27
|
-
rdoc.rdoc_files.include('README')
|
28
|
-
rdoc.rdoc_files.include('lib/**/*.rb')
|
29
|
-
end
|
30
|
-
|
31
|
-
spec = Gem::Specification.new do |s|
|
32
|
-
s.name = PKG_NAME
|
33
|
-
s.version = PKG_VERSION
|
34
|
-
s.platform = Gem::Platform::RUBY
|
35
|
-
s.summary = 'Adds support for validating the format/length of email addresses'
|
36
|
-
|
37
|
-
s.files = FileList['{lib,test}/**/*'].to_a - FileList['test/app_root/log/*'].to_a + %w(CHANGELOG init.rb LICENSE Rakefile README)
|
38
|
-
s.require_path = 'lib'
|
39
|
-
s.autorequire = 'validates_as_email_address'
|
40
|
-
s.has_rdoc = true
|
41
|
-
s.test_files = Dir['test/**/*_test.rb']
|
42
|
-
|
43
|
-
s.author = 'Aaron Pfeifer'
|
44
|
-
s.email = 'aaron@pluginaweek.org'
|
45
|
-
s.homepage = 'http://www.pluginaweek.org'
|
53
|
+
rdoc.rdoc_files.include('README.rdoc', 'CHANGELOG.rdoc', 'LICENSE', 'lib/**/*.rb')
|
46
54
|
end
|
47
55
|
|
48
56
|
Rake::GemPackageTask.new(spec) do |p|
|
@@ -51,14 +59,14 @@ Rake::GemPackageTask.new(spec) do |p|
|
|
51
59
|
p.need_zip = true
|
52
60
|
end
|
53
61
|
|
54
|
-
desc 'Publish the beta gem'
|
62
|
+
desc 'Publish the beta gem.'
|
55
63
|
task :pgem => [:package] do
|
56
|
-
Rake::SshFilePublisher.new('aaron@pluginaweek.org', '/home/aaron/gems.pluginaweek.org/public/gems', 'pkg', "#{
|
64
|
+
Rake::SshFilePublisher.new('aaron@pluginaweek.org', '/home/aaron/gems.pluginaweek.org/public/gems', 'pkg', "#{spec.name}-#{spec.version}.gem").upload
|
57
65
|
end
|
58
66
|
|
59
|
-
desc 'Publish the API documentation'
|
67
|
+
desc 'Publish the API documentation.'
|
60
68
|
task :pdoc => [:rdoc] do
|
61
|
-
Rake::SshDirPublisher.new('aaron@pluginaweek.org', "/home/aaron/api.pluginaweek.org/public/#{
|
69
|
+
Rake::SshDirPublisher.new('aaron@pluginaweek.org', "/home/aaron/api.pluginaweek.org/public/#{spec.name}", 'rdoc').upload
|
62
70
|
end
|
63
71
|
|
64
72
|
desc 'Publish the API docs and gem'
|
@@ -71,10 +79,10 @@ task :release => [:gem, :package] do
|
|
71
79
|
ruby_forge = RubyForge.new.configure
|
72
80
|
ruby_forge.login
|
73
81
|
|
74
|
-
%w(
|
75
|
-
file = "pkg/#{
|
82
|
+
%w(gem tgz zip).each do |ext|
|
83
|
+
file = "pkg/#{spec.name}-#{spec.version}.#{ext}"
|
76
84
|
puts "Releasing #{File.basename(file)}..."
|
77
85
|
|
78
|
-
ruby_forge.add_release(
|
86
|
+
ruby_forge.add_release(spec.rubyforge_project, spec.name, spec.version, file)
|
79
87
|
end
|
80
88
|
end
|
@@ -1,40 +1,18 @@
|
|
1
1
|
require 'validates_as_email_address/rfc_822'
|
2
|
+
require 'validates_as_email_address/rfc_1035'
|
2
3
|
|
3
4
|
module PluginAWeek #:nodoc:
|
4
5
|
# Adds validations for email addresses
|
5
6
|
module ValidatesAsEmailAddress
|
6
|
-
# The options that can be used when validating the format of the email address
|
7
|
-
EMAIL_FORMAT_OPTIONS = [
|
8
|
-
:wrong_format,
|
9
|
-
:allow_nil,
|
10
|
-
:on,
|
11
|
-
:if
|
12
|
-
]
|
13
|
-
|
14
|
-
# The options that can be used when validating the length of the email address
|
15
|
-
EMAIL_LENGTH_OPTIONS = [
|
16
|
-
:minimum,
|
17
|
-
:maximum,
|
18
|
-
:is,
|
19
|
-
:within,
|
20
|
-
:in,
|
21
|
-
:too_long,
|
22
|
-
:too_short,
|
23
|
-
:wrong_length,
|
24
|
-
:allow_nil,
|
25
|
-
:on,
|
26
|
-
:if
|
27
|
-
]
|
28
|
-
|
29
7
|
# Validates whether the value of the specific attribute matches against the
|
30
|
-
# RFC822
|
8
|
+
# RFC822/RFC1035 specification.
|
31
9
|
#
|
32
10
|
# class Person < ActiveRecord::Base
|
33
11
|
# validates_as_email_address :email, :on => :create
|
34
12
|
# end
|
35
13
|
#
|
36
14
|
# This will also validate that the email address is within the specification
|
37
|
-
# limits,
|
15
|
+
# limits, i.e. between 3 and 320 characters in length.
|
38
16
|
#
|
39
17
|
# Configuration options for length:
|
40
18
|
# * +minimum+ - The minimum size of the attribute
|
@@ -49,28 +27,29 @@ module PluginAWeek #:nodoc:
|
|
49
27
|
# Configuration options for format:
|
50
28
|
# * +wrong_format+ - A custom error message (default is: "is an invalid email address")
|
51
29
|
#
|
52
|
-
#
|
30
|
+
# Miscellaneous configuration options:
|
53
31
|
# * +allow_nil+ - Attribute may be nil; skip validation.
|
54
32
|
# * +on+ - Specifies when this validation is active (default is :save, other options :create, :update)
|
55
33
|
# * +if+ - Specifies a method, proc or string to call to determine if the validation should
|
56
|
-
# occur (e.g. :if => :allow_validation, or :if =>
|
34
|
+
# occur (e.g. :if => :allow_validation, or :if => lambda { |user| user.signup_step > 2 }). The
|
57
35
|
# method, proc or string should return or evaluate to a true or false value.
|
36
|
+
# * +strict+ - Specifies if the domain part of the email should be compliant to RFC 1035 (default is true). If set to false domains such as '-online.com', '[127.0.0.1]' become valid.
|
58
37
|
def validates_as_email_address(*attr_names)
|
59
38
|
configuration = attr_names.last.is_a?(Hash) ? attr_names.pop : {}
|
60
|
-
configuration.assert_valid_keys(EMAIL_FORMAT_OPTIONS | EMAIL_LENGTH_OPTIONS)
|
61
39
|
configuration.reverse_merge!(
|
62
|
-
:wrong_format => ActiveRecord::Errors.default_error_messages[:invalid_email]
|
40
|
+
:wrong_format => ActiveRecord::Errors.default_error_messages[:invalid_email],
|
41
|
+
:strict => true
|
63
42
|
)
|
64
43
|
|
65
44
|
# Add format validation
|
66
|
-
format_configuration = configuration.
|
67
|
-
format_configuration[:message] =
|
68
|
-
format_configuration[:with] = RFC822::EmailAddress
|
45
|
+
format_configuration = configuration.dup
|
46
|
+
format_configuration[:message] = configuration.delete(:wrong_format)
|
47
|
+
format_configuration[:with] = configuration[:strict] ? RFC1035::EmailAddress : RFC822::EmailAddress
|
69
48
|
validates_format_of attr_names, format_configuration
|
70
49
|
|
71
50
|
# Add length validation
|
72
|
-
length_configuration = configuration.
|
73
|
-
length_configuration.reverse_merge!(:within => 3..320)
|
51
|
+
length_configuration = configuration.dup
|
52
|
+
length_configuration.reverse_merge!(:within => 3..320) unless ([:minimum, :maximum, :is, :within, :in] & configuration.keys).any?
|
74
53
|
validates_length_of attr_names, length_configuration
|
75
54
|
end
|
76
55
|
end
|
@@ -80,6 +59,7 @@ ActiveRecord::Base.class_eval do
|
|
80
59
|
extend PluginAWeek::ValidatesAsEmailAddress
|
81
60
|
end
|
82
61
|
|
62
|
+
# Add error messages specific to this validation
|
83
63
|
ActiveRecord::Errors.default_error_messages.update(
|
84
64
|
:invalid_email => 'is an invalid email address'
|
85
65
|
)
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module PluginAWeek #:nodoc:
|
2
|
+
module ValidatesAsEmailAddress
|
3
|
+
# The standard describing the format of domains
|
4
|
+
module RFC1035
|
5
|
+
# Matches domain according to the RFC 1035 standard
|
6
|
+
Domain = begin
|
7
|
+
digit = "[\\d]"
|
8
|
+
letter = "[\\x61-\\x7a\\x41-\\x5a]"
|
9
|
+
let_dig = "(?:#{letter}|#{digit})"
|
10
|
+
ldh_str = "(?:#{let_dig}|[\\x2d])+"
|
11
|
+
label = "#{let_dig}(?:(?:#{ldh_str})*#{let_dig})"
|
12
|
+
subdomain = "(?:#{label}\\.)*#{label}"
|
13
|
+
domain = "(?:#{subdomain}|\\x20)"
|
14
|
+
|
15
|
+
/#{domain}/
|
16
|
+
end
|
17
|
+
|
18
|
+
# Matches email addresses with domains that follow the RFC 1035 standard
|
19
|
+
EmailAddress = begin
|
20
|
+
local_part = RFC822::LocalPart.source
|
21
|
+
domain = Domain.source
|
22
|
+
addr_spec = "(#{local_part})\\x40(#{domain})"
|
23
|
+
|
24
|
+
/\A#{addr_spec}\z/
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -1,18 +1,37 @@
|
|
1
|
-
|
2
|
-
module
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
1
|
+
module PluginAWeek #:nodoc:
|
2
|
+
module ValidatesAsEmailAddress
|
3
|
+
# The standard describing the format of email addresses
|
4
|
+
module RFC822
|
5
|
+
# Matches the two parts of an email address (before/after @)
|
6
|
+
LocalPart, Domain = begin
|
7
|
+
# Shared
|
8
|
+
qtext = '[^\\x0d\\x22\\x5c\\x80-\\xff]'
|
9
|
+
dtext = '[^\\x0d\\x5b-\\x5d\\x80-\\xff]'
|
10
|
+
atom = '[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+'
|
11
|
+
quoted_pair = '\\x5c[\\x00-\\x7f]'
|
12
|
+
domain_literal = "\\x5b(?:#{dtext}|#{quoted_pair})*\\x5d"
|
13
|
+
quoted_string = "\\x22(?:#{qtext}|#{quoted_pair})*\\x22"
|
14
|
+
|
15
|
+
# Local part
|
16
|
+
word = "(?:#{atom}|#{quoted_string})"
|
17
|
+
local_part = "#{word}(?:\\x2e#{word})*"
|
18
|
+
|
19
|
+
# Domain
|
20
|
+
domain_ref = atom
|
21
|
+
sub_domain = "(?:#{domain_ref}|#{domain_literal})"
|
22
|
+
domain = "#{sub_domain}(?:\\x2e#{sub_domain})*"
|
23
|
+
|
24
|
+
[/#{local_part}/, /#{domain}/]
|
25
|
+
end
|
26
|
+
|
27
|
+
# Matches email addresses according to the RFC822 standard
|
28
|
+
EmailAddress = begin
|
29
|
+
local_part = LocalPart.source
|
30
|
+
domain = Domain.source
|
31
|
+
addr_spec = "(#{local_part})\\x40(#{domain})"
|
32
|
+
|
33
|
+
/\A#{addr_spec}\z/
|
34
|
+
end
|
35
|
+
end
|
17
36
|
end
|
18
37
|
end
|
data/test/factory.rb
CHANGED
@@ -1,26 +1,32 @@
|
|
1
1
|
module Factory
|
2
|
-
# Build actions for the
|
3
|
-
def self.build(
|
4
|
-
name =
|
5
|
-
define_method("#{name}_attributes", block)
|
2
|
+
# Build actions for the model
|
3
|
+
def self.build(model, &block)
|
4
|
+
name = model.to_s.underscore
|
6
5
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
6
|
+
define_method("#{name}_attributes", block)
|
7
|
+
define_method("valid_#{name}_attributes") {|*args| valid_attributes_for(model, *args)}
|
8
|
+
define_method("new_#{name}") {|*args| new_record(model, *args)}
|
9
|
+
define_method("create_#{name}") {|*args| create_record(model, *args)}
|
10
|
+
end
|
11
|
+
|
12
|
+
# Get valid attributes for the model
|
13
|
+
def valid_attributes_for(model, attributes = {})
|
14
|
+
name = model.to_s.underscore
|
15
|
+
send("#{name}_attributes", attributes)
|
16
|
+
attributes
|
17
|
+
end
|
18
|
+
|
19
|
+
# Build an unsaved record
|
20
|
+
def new_record(model, *args)
|
21
|
+
model.new(valid_attributes_for(model, *args))
|
22
|
+
end
|
23
|
+
|
24
|
+
# Build and save/reload a record
|
25
|
+
def create_record(model, *args)
|
26
|
+
record = new_record(model, *args)
|
27
|
+
record.save!
|
28
|
+
record.reload
|
29
|
+
record
|
24
30
|
end
|
25
31
|
|
26
32
|
build User do |attributes|
|
@@ -1,9 +1,20 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/../test_helper'
|
2
2
|
|
3
|
-
class
|
4
|
-
def
|
5
|
-
|
6
|
-
|
3
|
+
class ValidatesAsEmailAddressByDefaultTest < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
User.validates_as_email_address :email
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_should_not_allow_email_addresses_shorter_than_3_characters
|
9
|
+
user = new_user(:email => 'a@')
|
10
|
+
assert !user.valid?
|
11
|
+
assert_equal 2, Array(user.errors.on(:email)).size
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_should_not_allow_email_addresses_longer_than_320_characters
|
15
|
+
user = new_user(:email => 'a@' + 'a' * 315 + '.com')
|
16
|
+
assert !user.valid?
|
17
|
+
assert_equal 1, Array(user.errors.on(:email)).size
|
7
18
|
end
|
8
19
|
|
9
20
|
def test_should_allow_legal_rfc822_formats
|
@@ -11,9 +22,8 @@ class ValidatesAsEmailAddressTest < Test::Unit::TestCase
|
|
11
22
|
'test@example',
|
12
23
|
'test@example.com',
|
13
24
|
'test@example.co.uk',
|
14
|
-
'"J.
|
15
|
-
'
|
16
|
-
'someone@123.com',
|
25
|
+
'"J. Smith\'s House, a.k.a. Home!"@example.com',
|
26
|
+
'test@123.com',
|
17
27
|
].each do |address|
|
18
28
|
user = new_user(:email => address)
|
19
29
|
assert user.valid?, "#{address} should be legal."
|
@@ -22,9 +32,9 @@ class ValidatesAsEmailAddressTest < Test::Unit::TestCase
|
|
22
32
|
|
23
33
|
def test_should_not_allow_illegal_rfc822_formats
|
24
34
|
[
|
25
|
-
'
|
26
|
-
'
|
27
|
-
'J.
|
35
|
+
'test@Monday 1:00',
|
36
|
+
'test@Monday the first',
|
37
|
+
'J. Smith\'s House, a.k.a. Home!@example.com',
|
28
38
|
].each do |address|
|
29
39
|
user = new_user(:email => address)
|
30
40
|
assert !user.valid?, "#{address} should be illegal."
|
@@ -32,15 +42,193 @@ class ValidatesAsEmailAddressTest < Test::Unit::TestCase
|
|
32
42
|
end
|
33
43
|
end
|
34
44
|
|
35
|
-
def
|
36
|
-
|
45
|
+
def test_should_not_allow_illegal_rfc1035_formats
|
46
|
+
[
|
47
|
+
'test@[127.0.0.1]',
|
48
|
+
'test@-domain_not_starting_with_letter.com',
|
49
|
+
'test@domain_not_ending_with_alphanum-.com'
|
50
|
+
].each do |address|
|
51
|
+
user = new_user(:email => address)
|
52
|
+
assert !user.valid?, "#{address} should be illegal."
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def teardown
|
57
|
+
User.class_eval do
|
58
|
+
@validate_callbacks = ActiveSupport::Callbacks::CallbackChain.new
|
59
|
+
@validate_on_create_callbacks = ActiveSupport::Callbacks::CallbackChain.new
|
60
|
+
@validate_on_update_callbacks = ActiveSupport::Callbacks::CallbackChain.new
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
class ValidatesAsEmailAddressTest < Test::Unit::TestCase
|
66
|
+
def test_should_allow_minimum_length
|
67
|
+
User.validates_as_email_address :email, :minimum => 8
|
68
|
+
|
69
|
+
user = new_user(:email => 'a@aa.com')
|
70
|
+
assert user.valid?
|
71
|
+
|
72
|
+
user = new_user(:email => 'a@a.com')
|
73
|
+
assert !user.valid?
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_should_not_check_maximum_length_if_minimum_length_defined
|
77
|
+
User.validates_as_email_address :email, :minimum => 10
|
78
|
+
|
79
|
+
user = new_user(:email => 'a@' + 'a' * 315 + '.com')
|
37
80
|
assert user.valid?
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_should_allow_maximum_length
|
84
|
+
User.validates_as_email_address :email, :maximum => 8
|
38
85
|
|
39
|
-
user
|
86
|
+
user = new_user(:email => 'a@aa.com')
|
40
87
|
assert user.valid?
|
41
88
|
|
42
|
-
user
|
89
|
+
user = new_user(:email => 'a@aaa.com')
|
90
|
+
assert !user.valid?
|
91
|
+
end
|
92
|
+
|
93
|
+
def test_should_not_check_minimum_length_if_maximum_length_defined
|
94
|
+
User.validates_as_email_address :email, :maximum => 8
|
95
|
+
|
96
|
+
user = new_user(:email => 'a@a')
|
43
97
|
assert !user.valid?
|
44
98
|
assert_equal 1, Array(user.errors.on(:email)).size
|
45
99
|
end
|
100
|
+
|
101
|
+
def test_should_allow_exact_length
|
102
|
+
User.validates_as_email_address :email, :is => 8
|
103
|
+
|
104
|
+
user = new_user(:email => 'a@aa.com')
|
105
|
+
assert user.valid?
|
106
|
+
|
107
|
+
user = new_user(:email => 'a@a.com')
|
108
|
+
assert !user.valid?
|
109
|
+
|
110
|
+
user = new_user(:email => 'a@aaa.com')
|
111
|
+
assert !user.valid?
|
112
|
+
end
|
113
|
+
|
114
|
+
def test_should_allow_within_range
|
115
|
+
User.validates_as_email_address :email, :within => 8..10
|
116
|
+
|
117
|
+
user = new_user(:email => 'a@a.com')
|
118
|
+
assert !user.valid?
|
119
|
+
|
120
|
+
user = new_user(:email => 'a@aa.com')
|
121
|
+
assert user.valid?
|
122
|
+
|
123
|
+
user = new_user(:email => 'a@aaaa.com')
|
124
|
+
assert user.valid?
|
125
|
+
|
126
|
+
user = new_user(:email => 'a@aaaaa.com')
|
127
|
+
assert !user.valid?
|
128
|
+
end
|
129
|
+
|
130
|
+
def test_should_allow_in_range
|
131
|
+
User.validates_as_email_address :email, :in => 8..10
|
132
|
+
|
133
|
+
user = new_user(:email => 'a@a.com')
|
134
|
+
assert !user.valid?
|
135
|
+
|
136
|
+
user = new_user(:email => 'a@aa.com')
|
137
|
+
assert user.valid?
|
138
|
+
|
139
|
+
user = new_user(:email => 'a@aaaa.com')
|
140
|
+
assert user.valid?
|
141
|
+
|
142
|
+
user = new_user(:email => 'a@aaaaa.com')
|
143
|
+
assert !user.valid?
|
144
|
+
end
|
145
|
+
|
146
|
+
def test_should_allow_too_long_message
|
147
|
+
User.validates_as_email_address :email, :too_long => 'custom'
|
148
|
+
|
149
|
+
user = new_user(:email => 'a@' + 'a' * 315 + '.com')
|
150
|
+
user.valid?
|
151
|
+
|
152
|
+
assert_equal 'custom', Array(user.errors.on(:email)).last
|
153
|
+
end
|
154
|
+
|
155
|
+
def test_should_allow_too_short_message
|
156
|
+
User.validates_as_email_address :email, :too_short => 'custom'
|
157
|
+
|
158
|
+
user = new_user(:email => 'a@')
|
159
|
+
user.valid?
|
160
|
+
|
161
|
+
assert_equal 'custom', Array(user.errors.on(:email)).last
|
162
|
+
end
|
163
|
+
|
164
|
+
def test_should_allow_wrong_length_message
|
165
|
+
User.validates_as_email_address :email, :is => 8, :wrong_length => 'custom'
|
166
|
+
|
167
|
+
user = new_user(:email => 'a@a.com')
|
168
|
+
user.valid?
|
169
|
+
|
170
|
+
assert_equal 'custom', Array(user.errors.on(:email)).last
|
171
|
+
end
|
172
|
+
|
173
|
+
def test_should_allow_wrong_format_message
|
174
|
+
User.validates_as_email_address :email, :is => 8, :wrong_format => 'custom'
|
175
|
+
|
176
|
+
user = new_user(:email => 'a@a')
|
177
|
+
user.valid?
|
178
|
+
|
179
|
+
assert_equal 'custom', Array(user.errors.on(:email)).first
|
180
|
+
end
|
181
|
+
|
182
|
+
def test_should_validate_if_if_is_true
|
183
|
+
User.validates_as_email_address :email, :if => lambda {true}
|
184
|
+
|
185
|
+
user = new_user(:email => 'a')
|
186
|
+
assert !user.valid?
|
187
|
+
end
|
188
|
+
|
189
|
+
def test_should_not_validate_if_if_is_false
|
190
|
+
User.validates_as_email_address :email, :if => lambda {false}
|
191
|
+
|
192
|
+
user = new_user(:email => 'a')
|
193
|
+
assert user.valid?
|
194
|
+
end
|
195
|
+
|
196
|
+
def test_should_validate_if_unless_is_false
|
197
|
+
User.validates_as_email_address :email, :unless => lambda {false}
|
198
|
+
|
199
|
+
user = new_user(:email => 'a')
|
200
|
+
assert !user.valid?
|
201
|
+
end
|
202
|
+
|
203
|
+
def test_should_not_validate_if_unless_is_true
|
204
|
+
User.validates_as_email_address :email, :unless => lambda {true}
|
205
|
+
|
206
|
+
user = new_user(:email => 'a')
|
207
|
+
assert user.valid?
|
208
|
+
end
|
209
|
+
|
210
|
+
def teardown
|
211
|
+
User.class_eval do
|
212
|
+
@validate_callbacks = ActiveSupport::Callbacks::CallbackChain.new
|
213
|
+
@validate_on_create_callbacks = ActiveSupport::Callbacks::CallbackChain.new
|
214
|
+
@validate_on_update_callbacks = ActiveSupport::Callbacks::CallbackChain.new
|
215
|
+
end
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
class ValidatesAsEmailAddressUnrestrictedTest < Test::Unit::TestCase
|
220
|
+
def setup
|
221
|
+
User.validates_as_email_address :email, :strict => false
|
222
|
+
end
|
223
|
+
|
224
|
+
def test_should_allow_illegal_rfc1035_formats
|
225
|
+
[
|
226
|
+
'test@[127.0.0.1]',
|
227
|
+
'test@-domain_not_starting_with_letter.com',
|
228
|
+
'test@domain_not_ending_with_alphanum-.com'
|
229
|
+
].each do |address|
|
230
|
+
user = new_user(:email => address)
|
231
|
+
assert user.valid?, "#{address} should be legal."
|
232
|
+
end
|
233
|
+
end
|
46
234
|
end
|
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: validates_as_email_address
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Aaron Pfeifer
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-
|
12
|
+
date: 2008-09-12 00:00:00 -04:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -23,6 +23,7 @@ extra_rdoc_files: []
|
|
23
23
|
|
24
24
|
files:
|
25
25
|
- lib/validates_as_email_address
|
26
|
+
- lib/validates_as_email_address/rfc_1035.rb
|
26
27
|
- lib/validates_as_email_address/rfc_822.rb
|
27
28
|
- lib/validates_as_email_address.rb
|
28
29
|
- test/app_root
|
@@ -32,16 +33,15 @@ files:
|
|
32
33
|
- test/app_root/db
|
33
34
|
- test/app_root/db/migrate
|
34
35
|
- test/app_root/db/migrate/001_create_users.rb
|
35
|
-
- test/app_root/log
|
36
36
|
- test/test_helper.rb
|
37
37
|
- test/factory.rb
|
38
38
|
- test/unit
|
39
39
|
- test/unit/validates_as_email_address_test.rb
|
40
|
-
- CHANGELOG
|
40
|
+
- CHANGELOG.rdoc
|
41
41
|
- init.rb
|
42
42
|
- LICENSE
|
43
43
|
- Rakefile
|
44
|
-
- README
|
44
|
+
- README.rdoc
|
45
45
|
has_rdoc: true
|
46
46
|
homepage: http://www.pluginaweek.org
|
47
47
|
post_install_message:
|
@@ -63,8 +63,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
63
63
|
version:
|
64
64
|
requirements: []
|
65
65
|
|
66
|
-
rubyforge_project:
|
67
|
-
rubygems_version: 1.
|
66
|
+
rubyforge_project: pluginaweek
|
67
|
+
rubygems_version: 1.2.0
|
68
68
|
signing_key:
|
69
69
|
specification_version: 2
|
70
70
|
summary: Adds support for validating the format/length of email addresses
|