validates_as_email_address 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG.rdoc CHANGED
@@ -1,5 +1,9 @@
1
1
  == master
2
2
 
3
+ == 0.2.0 / 2008-12-14
4
+
5
+ * Remove the PluginAWeek namespace
6
+
3
7
  == 0.1.1 / 2008-10-25
4
8
 
5
9
  * Fix major performance hit on long domains when in strict mode
data/Rakefile CHANGED
@@ -5,7 +5,7 @@ require 'rake/contrib/sshpublisher'
5
5
 
6
6
  spec = Gem::Specification.new do |s|
7
7
  s.name = 'validates_as_email_address'
8
- s.version = '0.1.1'
8
+ s.version = '0.2.0'
9
9
  s.platform = Gem::Platform::RUBY
10
10
  s.summary = 'Adds support for validating the format/length of email addresses'
11
11
 
@@ -1,62 +1,60 @@
1
1
  require 'validates_as_email_address/rfc_822'
2
2
  require 'validates_as_email_address/rfc_1035'
3
3
 
4
- module PluginAWeek #:nodoc:
5
- # Adds validations for email addresses
6
- module ValidatesAsEmailAddress
7
- # Validates whether the value of the specific attribute matches against the
8
- # RFC822/RFC1035 specification.
9
- #
10
- # class Person < ActiveRecord::Base
11
- # validates_as_email_address :email, :on => :create
12
- # end
13
- #
14
- # This will also validate that the email address is within the specification
15
- # limits, i.e. between 3 and 320 characters in length.
16
- #
17
- # Configuration options for length:
18
- # * +minimum+ - The minimum size of the attribute
19
- # * +maximum+ - The maximum size of the attribute
20
- # * +is+ - The exact size of the attribute
21
- # * +within+ - A range specifying the minimum and maximum size of the attribute
22
- # * +in+ - A synonym(or alias) for :within
23
- # * +too_long+ - The error message if the attribute goes over the maximum (default is: "is too long (maximum is %d characters)")
24
- # * +too_short+ - The error message if the attribute goes under the minimum (default is: "is too short (minimum is %d characters)")
25
- # * +wrong_length+ - The error message if using the :is method and the attribute is the wrong size (default is: "is the wrong length (should be %d characters)")
26
- #
27
- # Configuration options for format:
28
- # * +wrong_format+ - A custom error message (default is: "is an invalid email address")
29
- #
30
- # Miscellaneous configuration options:
31
- # * +allow_nil+ - Attribute may be nil; skip validation.
32
- # * +on+ - Specifies when this validation is active (default is :save, other options :create, :update)
33
- # * +if+ - Specifies a method, proc or string to call to determine if the validation should
34
- # occur (e.g. :if => :allow_validation, or :if => lambda { |user| user.signup_step > 2 }). The
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.
37
- def validates_as_email_address(*attr_names)
38
- configuration = attr_names.last.is_a?(Hash) ? attr_names.pop : {}
39
- configuration.reverse_merge!(
40
- :wrong_format => ActiveRecord::Errors.default_error_messages[:invalid_email],
41
- :strict => true
42
- )
43
-
44
- # Add format validation
45
- format_configuration = configuration.dup
46
- format_configuration[:message] = configuration.delete(:wrong_format)
47
- format_configuration[:with] = configuration[:strict] ? RFC1035::EmailAddress : RFC822::EmailAddress
48
- validates_format_of attr_names, format_configuration
49
-
50
- # Add length validation
51
- length_configuration = configuration.dup
52
- length_configuration.reverse_merge!(:within => 3..320) unless ([:minimum, :maximum, :is, :within, :in] & configuration.keys).any?
53
- validates_length_of attr_names, length_configuration
54
- end
4
+ # Adds validations for email addresses
5
+ module ValidatesAsEmailAddress
6
+ # Validates whether the value of the specific attribute matches against the
7
+ # RFC822/RFC1035 specification.
8
+ #
9
+ # class Person < ActiveRecord::Base
10
+ # validates_as_email_address :email, :on => :create
11
+ # end
12
+ #
13
+ # This will also validate that the email address is within the specification
14
+ # limits, i.e. between 3 and 320 characters in length.
15
+ #
16
+ # Configuration options for length:
17
+ # * +minimum+ - The minimum size of the attribute
18
+ # * +maximum+ - The maximum size of the attribute
19
+ # * +is+ - The exact size of the attribute
20
+ # * +within+ - A range specifying the minimum and maximum size of the attribute
21
+ # * +in+ - A synonym(or alias) for :within
22
+ # * +too_long+ - The error message if the attribute goes over the maximum (default is: "is too long (maximum is %d characters)")
23
+ # * +too_short+ - The error message if the attribute goes under the minimum (default is: "is too short (minimum is %d characters)")
24
+ # * +wrong_length+ - The error message if using the :is method and the attribute is the wrong size (default is: "is the wrong length (should be %d characters)")
25
+ #
26
+ # Configuration options for format:
27
+ # * +wrong_format+ - A custom error message (default is: "is an invalid email address")
28
+ #
29
+ # Miscellaneous configuration options:
30
+ # * +allow_nil+ - Attribute may be nil; skip validation.
31
+ # * +on+ - Specifies when this validation is active (default is :save, other options :create, :update)
32
+ # * +if+ - Specifies a method, proc or string to call to determine if the validation should
33
+ # occur (e.g. :if => :allow_validation, or :if => lambda { |user| user.signup_step > 2 }). The
34
+ # method, proc or string should return or evaluate to a true or false value.
35
+ # * +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.
36
+ def validates_as_email_address(*attr_names)
37
+ configuration = attr_names.last.is_a?(Hash) ? attr_names.pop : {}
38
+ configuration.reverse_merge!(
39
+ :wrong_format => ActiveRecord::Errors.default_error_messages[:invalid_email],
40
+ :strict => true
41
+ )
42
+
43
+ # Add format validation
44
+ format_configuration = configuration.dup
45
+ format_configuration[:message] = configuration.delete(:wrong_format)
46
+ format_configuration[:with] = configuration[:strict] ? RFC1035::EmailAddress : RFC822::EmailAddress
47
+ validates_format_of attr_names, format_configuration
48
+
49
+ # Add length validation
50
+ length_configuration = configuration.dup
51
+ length_configuration.reverse_merge!(:within => 3..320) unless ([:minimum, :maximum, :is, :within, :in] & configuration.keys).any?
52
+ validates_length_of attr_names, length_configuration
55
53
  end
56
54
  end
57
55
 
58
56
  ActiveRecord::Base.class_eval do
59
- extend PluginAWeek::ValidatesAsEmailAddress
57
+ extend ValidatesAsEmailAddress
60
58
  end
61
59
 
62
60
  # Add error messages specific to this validation
@@ -1,29 +1,27 @@
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, with the exception
6
- # that domains can start with a letter *or* digit
7
- Domain = begin
8
- digit = "[\\d]"
9
- letter = "[\\x61-\\x7a\\x41-\\x5a]"
10
- let_dig = "(?:#{letter}|#{digit})"
11
- let_dig_hyp = "(?:#{let_dig}|[\\x2d])"
12
- label = "#{let_dig}(?:#{let_dig_hyp}*#{let_dig})?"
13
- subdomain = "(?:#{label}\\.)*#{label}"
14
- domain = "(?:#{subdomain}|\\x20)"
15
-
16
- /#{domain}/
17
- end
1
+ module ValidatesAsEmailAddress
2
+ # The standard describing the format of domains
3
+ module RFC1035
4
+ # Matches domain according to the RFC 1035 standard, with the exception
5
+ # that domains can start with a letter *or* digit
6
+ Domain = begin
7
+ digit = "[\\d]"
8
+ letter = "[\\x61-\\x7a\\x41-\\x5a]"
9
+ let_dig = "(?:#{letter}|#{digit})"
10
+ let_dig_hyp = "(?:#{let_dig}|[\\x2d])"
11
+ label = "#{let_dig}(?:#{let_dig_hyp}*#{let_dig})?"
12
+ subdomain = "(?:#{label}\\.)*#{label}"
13
+ domain = "(?:#{subdomain}|\\x20)"
18
14
 
19
- # Matches email addresses with domains that follow the RFC 1035 standard
20
- EmailAddress = begin
21
- local_part = RFC822::LocalPart.source
22
- domain = Domain.source
23
- addr_spec = "(#{local_part})\\x40(#{domain})"
24
-
25
- /\A#{addr_spec}\z/
26
- end
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/
27
25
  end
28
26
  end
29
27
  end
@@ -1,37 +1,35 @@
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
1
+ module ValidatesAsEmailAddress
2
+ # The standard describing the format of email addresses
3
+ module RFC822
4
+ # Matches the two parts of an email address (before/after @)
5
+ LocalPart, Domain = begin
6
+ # Shared
7
+ qtext = '[^\\x0d\\x22\\x5c\\x80-\\xff]'
8
+ dtext = '[^\\x0d\\x5b-\\x5d\\x80-\\xff]'
9
+ atom = '[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+'
10
+ quoted_pair = '\\x5c[\\x00-\\x7f]'
11
+ domain_literal = "\\x5b(?:#{dtext}|#{quoted_pair})*\\x5d"
12
+ quoted_string = "\\x22(?:#{qtext}|#{quoted_pair})*\\x22"
26
13
 
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
14
+ # Local part
15
+ word = "(?:#{atom}|#{quoted_string})"
16
+ local_part = "#{word}(?:\\x2e#{word})*"
17
+
18
+ # Domain
19
+ domain_ref = atom
20
+ sub_domain = "(?:#{domain_ref}|#{domain_literal})"
21
+ domain = "#{sub_domain}(?:\\x2e#{sub_domain})*"
22
+
23
+ [/#{local_part}/, /#{domain}/]
24
+ end
25
+
26
+ # Matches email addresses according to the RFC822 standard
27
+ EmailAddress = begin
28
+ local_part = LocalPart.source
29
+ domain = Domain.source
30
+ addr_spec = "(#{local_part})\\x40(#{domain})"
31
+
32
+ /\A#{addr_spec}\z/
35
33
  end
36
34
  end
37
35
  end
@@ -8,7 +8,7 @@ class ValidatesAsEmailAddressByDefaultTest < Test::Unit::TestCase
8
8
  def test_should_not_allow_email_addresses_shorter_than_3_characters
9
9
  user = new_user(:email => 'a@')
10
10
  assert !user.valid?
11
- assert_equal 2, Array(user.errors.on(:email)).size
11
+ assert user.errors.invalid?(:email)
12
12
 
13
13
  user.email = 'a@a'
14
14
  assert user.valid?
@@ -20,7 +20,7 @@ class ValidatesAsEmailAddressByDefaultTest < Test::Unit::TestCase
20
20
 
21
21
  user.email += 'a'
22
22
  assert !user.valid?
23
- assert_equal 1, Array(user.errors.on(:email)).size
23
+ assert user.errors.invalid?(:email)
24
24
  end
25
25
 
26
26
  def test_should_allow_legal_rfc822_formats
@@ -44,7 +44,7 @@ class ValidatesAsEmailAddressByDefaultTest < Test::Unit::TestCase
44
44
  ].each do |address|
45
45
  user = new_user(:email => address)
46
46
  assert !user.valid?, "#{address} should be illegal."
47
- assert_equal 1, Array(user.errors.on(:email)).size
47
+ assert user.errors.invalid?(:email)
48
48
  end
49
49
  end
50
50
 
@@ -101,7 +101,7 @@ class ValidatesAsEmailAddressTest < Test::Unit::TestCase
101
101
 
102
102
  user = new_user(:email => 'a@')
103
103
  assert !user.valid?
104
- assert_equal 1, Array(user.errors.on(:email)).size
104
+ assert user.errors.invalid?(:email)
105
105
  end
106
106
 
107
107
  def test_should_allow_exact_length
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: validates_as_email_address
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aaron Pfeifer
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-10-26 00:00:00 -04:00
12
+ date: 2008-12-14 00:00:00 -05:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -23,20 +23,20 @@ extra_rdoc_files: []
23
23
 
24
24
  files:
25
25
  - lib/validates_as_email_address
26
- - lib/validates_as_email_address/rfc_1035.rb
27
26
  - lib/validates_as_email_address/rfc_822.rb
27
+ - lib/validates_as_email_address/rfc_1035.rb
28
28
  - lib/validates_as_email_address.rb
29
+ - test/factory.rb
30
+ - test/test_helper.rb
31
+ - test/unit
32
+ - test/unit/validates_as_email_address_test.rb
29
33
  - test/app_root
30
- - test/app_root/app
31
- - test/app_root/app/models
32
- - test/app_root/app/models/user.rb
33
34
  - test/app_root/db
34
35
  - test/app_root/db/migrate
35
36
  - test/app_root/db/migrate/001_create_users.rb
36
- - test/test_helper.rb
37
- - test/factory.rb
38
- - test/unit
39
- - test/unit/validates_as_email_address_test.rb
37
+ - test/app_root/app
38
+ - test/app_root/app/models
39
+ - test/app_root/app/models/user.rb
40
40
  - CHANGELOG.rdoc
41
41
  - init.rb
42
42
  - LICENSE