pager-validates_as_email_address 1.0.20080507

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 ADDED
@@ -0,0 +1,9 @@
1
+ *SVN*
2
+
3
+ *0.0.2* (May 5th, 2008)
4
+
5
+ * Update documentation
6
+
7
+ *0.0.1* (September 26th, 2007)
8
+
9
+ * Add documentation
data/LICENSE ADDED
@@ -0,0 +1,2 @@
1
+ Licensed under a Creative Commons Attribution-ShareAlike 2.5 License
2
+ http://creativecommons.org/licenses/by-sa/2.5/
data/README ADDED
@@ -0,0 +1,51 @@
1
+ = validates_as_email_address
2
+
3
+ +validates_as_email_address+ adds support for validating the format/length of
4
+ email addresses.
5
+
6
+ == Resources
7
+
8
+ Wiki
9
+
10
+ * http://wiki.pluginaweek.org/Validates_as_email_address
11
+
12
+ API
13
+
14
+ * http://api.pluginaweek.org/validates_as_email_address
15
+
16
+ Development
17
+
18
+ * http://dev.pluginaweek.org/browser/trunk/validates_as_email_address
19
+
20
+ Source
21
+
22
+ * http://svn.pluginaweek.org/trunk/validates_as_email_address
23
+
24
+ == Description
25
+
26
+ Consistently reliable email address validations are difficult to find and hard
27
+ to choose as there are far too many implementations in various programming
28
+ languages. This plugins builds on Thijs van der Vossen's validates_as_email
29
+ by adding advanced validation option support and also validating the length of
30
+ the email address.
31
+
32
+ == Usage
33
+
34
+ === Example
35
+
36
+ class Person < ActiveRecord::Base
37
+ validates_as_email_address :email, :on => :create
38
+ end
39
+
40
+ == Testing
41
+
42
+ Before you can run any tests, the following gem must be installed:
43
+ * plugin_test_helper[http://wiki.pluginaweek.org/Plugin_test_helper]
44
+
45
+ == References
46
+
47
+ * Cal Henderson - {Parsing Email Adresses in PHP}[http://iamcal.com/publish/articles/php/parsing_email]
48
+ * Tim Fletcher - {Ruby Translation}[http://tfletcher.com/lib/rfc822.rb]
49
+ * Dan Kubb[dan.kubb@autopilotmarketing.com]
50
+ * Ximon Eighteen[ximon.eightee@int.greenpeace.org]
51
+ * Thijs van der Vossen - validates_as_email[https://svn.greenpeace.org/repositories/rails_plugins/validates_as_email]
data/Rakefile ADDED
@@ -0,0 +1,79 @@
1
+ require 'rake/testtask'
2
+ require 'rake/rdoctask'
3
+ require 'rake/gempackagetask'
4
+ require 'rake/contrib/sshpublisher'
5
+
6
+ PKG_NAME = 'validates_as_email_address'
7
+ PKG_VERSION = '0.0.2'
8
+ PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
9
+ RUBY_FORGE_PROJECT = 'pluginaweek'
10
+
11
+ desc 'Default: run unit tests.'
12
+ task :default => :test
13
+
14
+ desc 'Test the validates_as_email_address plugin.'
15
+ Rake::TestTask.new(:test) do |t|
16
+ t.libs << 'lib'
17
+ t.pattern = 'test/**/*_test.rb'
18
+ t.verbose = true
19
+ end
20
+
21
+ desc 'Generate documentation for the validates_as_email_address plugin.'
22
+ Rake::RDocTask.new(:rdoc) do |rdoc|
23
+ rdoc.rdoc_dir = 'rdoc'
24
+ rdoc.title = 'ValidatesAsEmailAddress'
25
+ rdoc.options << '--line-numbers' << '--inline-source'
26
+ rdoc.rdoc_files.include('README')
27
+ rdoc.rdoc_files.include('lib/**/*.rb')
28
+ end
29
+
30
+ spec = Gem::Specification.new do |s|
31
+ s.name = PKG_NAME
32
+ s.version = PKG_VERSION
33
+ s.platform = Gem::Platform::RUBY
34
+ s.summary = 'Adds support for validating the format/length of email addresses'
35
+
36
+ s.files = FileList['{lib,test}/**/*'].to_a + %w(CHANGELOG init.rb LICENSE Rakefile README)
37
+ s.require_path = 'lib'
38
+ s.autorequire = 'validates_as_email_address'
39
+ s.has_rdoc = true
40
+ s.test_files = Dir['test/**/*_test.rb']
41
+
42
+ s.author = 'Aaron Pfeifer'
43
+ s.email = 'aaron@pluginaweek.org'
44
+ s.homepage = 'http://www.pluginaweek.org'
45
+ end
46
+
47
+ Rake::GemPackageTask.new(spec) do |p|
48
+ p.gem_spec = spec
49
+ p.need_tar = true
50
+ p.need_zip = true
51
+ end
52
+
53
+ desc 'Publish the beta gem'
54
+ task :pgem => [:package] do
55
+ Rake::SshFilePublisher.new('aaron@pluginaweek.org', '/home/aaron/gems.pluginaweek.org/public/gems', 'pkg', "#{PKG_FILE_NAME}.gem").upload
56
+ end
57
+
58
+ desc 'Publish the API documentation'
59
+ task :pdoc => [:rdoc] do
60
+ Rake::SshDirPublisher.new('aaron@pluginaweek.org', "/home/aaron/api.pluginaweek.org/public/#{PKG_NAME}", 'rdoc').upload
61
+ end
62
+
63
+ desc 'Publish the API docs and gem'
64
+ task :publish => [:pgem, :pdoc, :release]
65
+
66
+ desc 'Publish the release files to RubyForge.'
67
+ task :release => [:gem, :package] do
68
+ require 'rubyforge'
69
+
70
+ ruby_forge = RubyForge.new
71
+ ruby_forge.login
72
+
73
+ %w( gem tgz zip ).each do |ext|
74
+ file = "pkg/#{PKG_FILE_NAME}.#{ext}"
75
+ puts "Releasing #{File.basename(file)}..."
76
+
77
+ ruby_forge.add_release(RUBY_FORGE_PROJECT, PKG_NAME, PKG_VERSION, file)
78
+ end
79
+ end
@@ -0,0 +1,85 @@
1
+ require 'validates_as_email_address/rfc_822'
2
+
3
+ module PluginAWeek #:nodoc:
4
+ # Adds validations for email addresses
5
+ 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
+ # Validates whether the value of the specific attribute matches against the
30
+ # RFC822 specificiation.
31
+ #
32
+ # class Person < ActiveRecord::Base
33
+ # validates_as_email_address :email, :on => :create
34
+ # end
35
+ #
36
+ # This will also validate that the email address is within the specification
37
+ # limits, specifically between 3 and 320 characters in length.
38
+ #
39
+ # Configuration options for length:
40
+ # * +minimum+ - The minimum size of the attribute
41
+ # * +maximum+ - The maximum size of the attribute
42
+ # * +is+ - The exact size of the attribute
43
+ # * +within+ - A range specifying the minimum and maximum size of the attribute
44
+ # * +in+ - A synonym(or alias) for :within
45
+ # * +too_long+ - The error message if the attribute goes over the maximum (default is: "is too long (maximum is %d characters)")
46
+ # * +too_short+ - The error message if the attribute goes under the minimum (default is: "is too short (minimum is %d characters)")
47
+ # * +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)")
48
+ #
49
+ # Configuration options for format:
50
+ # * +wrong_format+ - A custom error message (default is: "is an invalid email address")
51
+ #
52
+ # Configuration options for both length and format:
53
+ # * +allow_nil+ - Attribute may be nil; skip validation.
54
+ # * +on+ - Specifies when this validation is active (default is :save, other options :create, :update)
55
+ # * +if+ - Specifies a method, proc or string to call to determine if the validation should
56
+ # occur (e.g. :if => :allow_validation, or :if => Proc.new { |user| user.signup_step > 2 }). The
57
+ # method, proc or string should return or evaluate to a true or false value.
58
+ def validates_as_email_address(*attr_names)
59
+ configuration = attr_names.last.is_a?(Hash) ? attr_names.pop : {}
60
+ configuration.assert_valid_keys(EMAIL_FORMAT_OPTIONS | EMAIL_LENGTH_OPTIONS)
61
+ configuration.reverse_merge!(
62
+ :wrong_format => ActiveRecord::Errors.default_error_messages[:invalid_email]
63
+ )
64
+
65
+ # Add format validation
66
+ format_configuration = configuration.reject {|key, value| !EMAIL_FORMAT_OPTIONS.include?(key)}
67
+ format_configuration[:message] = format_configuration.delete(:wrong_format)
68
+ format_configuration[:with] = RFC822::EmailAddress
69
+ validates_format_of attr_names, format_configuration
70
+
71
+ # Add length validation
72
+ length_configuration = configuration.reject {|key, value| !EMAIL_LENGTH_OPTIONS.include?(key)}
73
+ length_configuration.reverse_merge!(:within => 3..320)
74
+ validates_length_of attr_names, length_configuration
75
+ end
76
+ end
77
+ end
78
+
79
+ ActiveRecord::Base.class_eval do
80
+ extend PluginAWeek::ValidatesAsEmailAddress
81
+ end
82
+
83
+ ActiveRecord::Errors.default_error_messages.update(
84
+ :invalid_email => 'is an invalid email address'
85
+ )
@@ -0,0 +1,18 @@
1
+ # The standard describing the format of email addresses
2
+ module RFC822
3
+ EmailAddress = begin
4
+ qtext = '[^\\x0d\\x22\\x5c\\x80-\\xff]'
5
+ dtext = '[^\\x0d\\x5b-\\x5d\\x80-\\xff]'
6
+ atom = '[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+'
7
+ quoted_pair = '\\x5c[\\x00-\\x7f]'
8
+ domain_literal = "\\x5b(?:#{dtext}|#{quoted_pair})*\\x5d"
9
+ quoted_string = "\\x22(?:#{qtext}|#{quoted_pair})*\\x22"
10
+ domain_ref = atom
11
+ sub_domain = "(?:#{domain_ref}|#{domain_literal})"
12
+ word = "(?:#{atom}|#{quoted_string})"
13
+ domain = "#{sub_domain}(?:\\x2e#{sub_domain})*"
14
+ local_part = "#{word}(?:\\x2e#{word})*"
15
+ addr_spec = "(#{local_part})\\x40(#{domain})"
16
+ pattern = /\A#{addr_spec}\z/
17
+ end
18
+ end
data/rails/init.rb ADDED
@@ -0,0 +1 @@
1
+ require 'validates_as_email_address'
@@ -0,0 +1,3 @@
1
+ class User < ActiveRecord::Base
2
+ validates_as_email_address :email
3
+ end
@@ -0,0 +1,11 @@
1
+ class CreateUsers < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :users do |t|
4
+ t.string :email, :null => false, :limit => 320
5
+ end
6
+ end
7
+
8
+ def self.down
9
+ drop_table :users
10
+ end
11
+ end
@@ -0,0 +1,39 @@
1
+ # Logfile created on Sun Apr 06 00:59:11 -0400 2008 SQL (0.000430) select sqlite_version(*)
2
+ SQL (0.000442) CREATE TABLE "schema_info" (version varchar(255))
3
+ SQL (0.000121) INSERT INTO "schema_info" (version) VALUES(0)
4
+ SQL (0.000224) SELECT version FROM schema_info
5
+ Migrating to CreateUsers (1)
6
+ SQL (0.000223)  SELECT name
7
+ FROM sqlite_master
8
+ WHERE type = 'table' AND NOT name = 'sqlite_sequence'
9
+ 
10
+ SQL (0.000428) select sqlite_version(*)
11
+ SQL (0.000429) CREATE TABLE "schema_info" (version varchar(255))
12
+ SQL (0.000115) INSERT INTO "schema_info" (version) VALUES(0)
13
+ SQL (0.000221) SELECT version FROM schema_info
14
+ Migrating to CreateUsers (1)
15
+ SQL (0.000359) CREATE TABLE "users" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "email" varchar(320) NOT NULL) 
16
+ SQL (0.000106) UPDATE schema_info SET version = 1
17
+ SQL (0.000431) select sqlite_version(*)
18
+ SQL (0.000426) CREATE TABLE "schema_info" (version varchar(255))
19
+ SQL (0.000114) INSERT INTO "schema_info" (version) VALUES(0)
20
+ SQL (0.000224) SELECT version FROM schema_info
21
+ Migrating to CreateUsers (1)
22
+ SQL (0.000352) CREATE TABLE "users" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "email" varchar(320) NOT NULL) 
23
+ SQL (0.000105) UPDATE schema_info SET version = 1
24
+ SQL (0.000460)  SELECT name
25
+ FROM sqlite_master
26
+ WHERE type = 'table' AND NOT name = 'sqlite_sequence'
27
+ 
28
+ SQL (0.000260) select sqlite_version(*)
29
+ SQL (0.000324) CREATE TABLE "schema_migrations" ("version" varchar(255) NOT NULL) 
30
+ SQL (0.000255) CREATE UNIQUE INDEX "unique_schema_migrations" ON "schema_migrations" ("version")
31
+ SQL (0.000211)  SELECT name
32
+ FROM sqlite_master
33
+ WHERE type = 'table' AND NOT name = 'sqlite_sequence'
34
+ 
35
+ SQL (0.000150) SELECT version FROM schema_migrations
36
+ Migrating to CreateUsers (1)
37
+ SQL (0.000093) SELECT version FROM schema_migrations
38
+ SQL (0.000361) CREATE TABLE "users" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "email" varchar(320) NOT NULL) 
39
+ SQL (0.000151) INSERT INTO schema_migrations (version) VALUES ('1')
@@ -0,0 +1,7 @@
1
+ # Load the plugin testing framework
2
+ $:.unshift("#{File.dirname(__FILE__)}/../../plugin_test_helper/lib")
3
+ require 'rubygems'
4
+ require 'plugin_test_helper'
5
+
6
+ # Run the migrations
7
+ ActiveRecord::Migrator.migrate("#{RAILS_ROOT}/db/migrate")
@@ -0,0 +1,29 @@
1
+ require File.dirname(__FILE__) + '/../test_helper'
2
+
3
+ class ValidatesAsEmailAddressTest < Test::Unit::TestCase
4
+ def test_should_require_legal_rfc822_format
5
+ [
6
+ 'Max@Job 3:14',
7
+ 'Job@Book of Job',
8
+ 'J. P. \'s-Gravezande, a.k.a. The Hacker!@example.com',
9
+ ].each do |address|
10
+ assert !User.new(:email => address).valid?, "#{address} should be illegal."
11
+ end
12
+
13
+ [
14
+ 'test@example',
15
+ 'test@example.com',
16
+ 'test@example.co.uk',
17
+ '"J. P. \'s-Gravezande, a.k.a. The Hacker!"@example.com',
18
+ 'me@[187.223.45.119]',
19
+ 'someone@123.com',
20
+ ].each do |address|
21
+ assert User.new(:email => address).valid?, "#{address} should be legal."
22
+ end
23
+ end
24
+
25
+ def test_not_allow_email_addresses_longer_than_320_characters
26
+ assert User.new(:email => 'a' * 314 + '@a.com').valid?
27
+ assert !User.new(:email => 'a' * 315 + '@a.com').valid?
28
+ end
29
+ end
metadata ADDED
@@ -0,0 +1,71 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pager-validates_as_email_address
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.20080507
5
+ platform: ruby
6
+ authors:
7
+ - Aaron Pfeifer
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-05-07 00:00:00 -07:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description:
17
+ email: avanie@gmail.com
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files:
23
+ - README
24
+ - CHANGELOG
25
+ - LICENSE
26
+ files:
27
+ - CHANGELOG
28
+ - lib/validates_as_email_address/rfc_822.rb
29
+ - lib/validates_as_email_address.rb
30
+ - LICENSE
31
+ - rails/init.rb
32
+ - Rakefile
33
+ - README
34
+ - test/app_root/app/models/user.rb
35
+ - test/app_root/db/migrate/001_create_users.rb
36
+ - test/app_root/log/in_memory.log
37
+ - test/test_helper.rb
38
+ - test/unit/validates_as_email_address_test.rb
39
+ has_rdoc: true
40
+ homepage: http://github.com/pager/validates_as_email_address
41
+ post_install_message:
42
+ rdoc_options:
43
+ - --main
44
+ - README
45
+ require_paths:
46
+ - lib
47
+ required_ruby_version: !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ">="
50
+ - !ruby/object:Gem::Version
51
+ version: "0"
52
+ version:
53
+ required_rubygems_version: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: "0"
58
+ version:
59
+ requirements: []
60
+
61
+ rubyforge_project:
62
+ rubygems_version: 1.0.1
63
+ signing_key:
64
+ specification_version: 2
65
+ summary: Gemified validates_as_email_address plugin
66
+ test_files:
67
+ - test/app_root/app/models/user.rb
68
+ - test/app_root/db/migrate/001_create_users.rb
69
+ - test/app_root/log/in_memory.log
70
+ - test/test_helper.rb
71
+ - test/unit/validates_as_email_address_test.rb