ruby_email 0.1.5 → 0.1.6
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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG +10 -0
- data/README.md +22 -9
- data/lib/ruby_email/core.rb +21 -30
- data/lib/ruby_email/{public → rfc5322/public}/string.rb +1 -1
- data/lib/ruby_email/rfc5322/public.rb +21 -0
- data/lib/ruby_email/rfc5322/string.rb +5 -0
- data/lib/ruby_email/rfc5322.rb +28 -0
- data/lib/ruby_email.rb +6 -3
- data/ruby_email.gemspec +4 -3
- data/test/unit_test.rb +38 -31
- data/version +1 -1
- data.tar.gz.sig +0 -0
- metadata +5 -4
- metadata.gz.sig +0 -0
- data/lib/ruby_email/core/string.rb +0 -5
- data/lib/ruby_email/public.rb +0 -43
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 992dcd485d48991c1e09827fefd0f396ba93099c
|
4
|
+
data.tar.gz: f4c6e74256ad4f147bc32a4b99221424f85bb8b2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d75c0b231723e17f9eeec5c34b8fb898f29c88c2b3a84ad72da406e2c426c7ce2d40ae1863bfd14485a49435d99e3e2dcbb0f17f2d594859c326bbd08a65cd9a
|
7
|
+
data.tar.gz: 0477f20e580eb1165a69bcc89b31c203e1fe564faadc2f60be644eb72316ea0e435b9dee5474163285c54020d89d578f765e0e963eb0291cbb70fb6f04d0da63
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/CHANGELOG
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
v0.1.6
|
2
|
+
* Break compatibility (100%)
|
3
|
+
* Improve architecture
|
4
|
+
* Rfc5322 designed as it
|
5
|
+
* Rfc5322 and Rfc5322::Public are now Classes (instead of modules)
|
6
|
+
* Core is now an Abstract, completed by adding the REGEXP constant in it's
|
7
|
+
children
|
8
|
+
* Update unitary tests
|
9
|
+
* Add some documentation
|
10
|
+
|
1
11
|
v0.1.5
|
2
12
|
* Split into files each feature (core, public, f/string)
|
3
13
|
|
data/README.md
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
# A RFC compliant Email validator
|
2
2
|
|
3
|
-
|
3
|
+
What is an [email address](https://en.wikipedia.org/wiki/Email_address) ?
|
4
|
+
|
5
|
+
- Compliant to the [rfc 5322](https://tools.ietf.org/html/rfc5322) standard.
|
6
|
+
- To do [rfc 6530](https://tools.ietf.org/html/rfc6530).
|
7
|
+
|
4
8
|
|
5
9
|
## Installation
|
6
10
|
|
@@ -20,17 +24,26 @@ gem 'ruby_email'
|
|
20
24
|
```ruby
|
21
25
|
require 'ruby_email'
|
22
26
|
|
27
|
+
# Pure Rfc5322
|
28
|
+
RubyEmail::Rfc322.validates? "toto@tata" # => true
|
29
|
+
RubyEmail::Rfc322.match "toto@tata" # => #<MatchData "toto@tata" local:"toto" domain:"tata">
|
30
|
+
RubyEmail::Rfc322.validates? "toto" # => false
|
31
|
+
RubyEmail::Rfc322.match "toto" # => nil
|
32
|
+
|
33
|
+
# Rfc5322 + Internet basic usage
|
34
|
+
RubyEmail::Rfc322::Public.validates? "toto@tata.com" # => true
|
35
|
+
RubyEmail::Rfc322::Public.match "toto@tata.com" # => #<MatchData "toto@tata" local:"toto" domain:"tata.com">
|
36
|
+
|
37
|
+
# Rfc5322 Strings
|
38
|
+
require 'ruby_email/rfc5322/string'
|
23
39
|
"local@domain".is_email? # => true
|
24
|
-
RubyEmail.validates? "toto@tata" # => true
|
25
|
-
RubyEmail.match "toto@tata" # => #<MatchData "toto@tata" local:"toto" domain:"tata">
|
26
40
|
"local".is_email? # => false
|
27
|
-
RubyEmail.validates? "toto" # => false
|
28
|
-
RubyEmail.match "toto" # => nil
|
29
41
|
|
42
|
+
# Rfc5322 Strings + Internet basic usage
|
43
|
+
require 'ruby_email/rfc5322/public/string'
|
30
44
|
"local@domain.root".is_public_email? # => true
|
31
45
|
"local@domain".is_public_email? # => false
|
32
|
-
|
33
|
-
RubyEmail::Public.match "toto@tata.com" # => #<MatchData "toto@tata" local:"toto" domain:"tata.com">
|
46
|
+
|
34
47
|
```
|
35
48
|
|
36
49
|
|
@@ -38,8 +51,8 @@ RubyEmail::Public.match "toto@tata.com" # => #<MatchData "toto@tata" local:"toto
|
|
38
51
|
|
39
52
|
```ruby
|
40
53
|
class Model < ActiveRecord::Base
|
41
|
-
# validates :email, format: RubyEmail::REGEXP # valid on an intranet ...
|
42
|
-
validates :email, format: RubyEmail::Public::REGEXP
|
54
|
+
# validates :email, format: RubyEmail::Rfc322::REGEXP # valid on an intranet ...
|
55
|
+
validates :email, format: RubyEmail::Rfc322::Public::REGEXP
|
43
56
|
end
|
44
57
|
```
|
45
58
|
|
data/lib/ruby_email/core.rb
CHANGED
@@ -1,37 +1,28 @@
|
|
1
|
-
# http://www.ietf.org/rfc/rfc5322.txt
|
2
1
|
module RubyEmail
|
3
|
-
# one valid character (not . because used to separe domains)
|
4
|
-
ATEXT = '([A-Za-z0-9!#\$%&\'*\+\-/=\?\^_`\{\}\|~])'
|
5
|
-
ATOM = "#{ATEXT}+"
|
6
|
-
DOT_ATOM_TEXT = "(#{ATOM})(\\.#{ATOM})*"
|
7
|
-
# email grammar
|
8
|
-
VALIDE = "(?<local>#{DOT_ATOM_TEXT})@(?<domain>#{DOT_ATOM_TEXT})"
|
9
|
-
# regexp to validate complete email
|
10
|
-
REGEXP = Regexp.new "\\A#{VALIDE}\\Z"
|
11
2
|
|
12
|
-
#
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
3
|
+
# Abstract class to inherit and complete by adding the REGEXP constant
|
4
|
+
class Core
|
5
|
+
# Check if the {::String} is a valid email.
|
6
|
+
# @param str [::String] string to match
|
7
|
+
# @raise [ArgumentError] if str is not a String
|
8
|
+
# @return [TrueClass or FalseClass]
|
9
|
+
def self.validates? str
|
10
|
+
!!match(str)
|
11
|
+
end
|
19
12
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
13
|
+
# Check if the string is a valid email and details how
|
14
|
+
# @param str [::String] string to match
|
15
|
+
# @raise [ArgumentError] if str is not a String
|
16
|
+
# @return [MatchData or NilClass] matched email with the keys "local" and "domain"
|
17
|
+
def self.match str
|
18
|
+
raise ArgumentError, "Cannot validate a `#{str.class}`. Only `String` can be." unless str.is_a?(String)
|
19
|
+
str.match regexp
|
20
|
+
end
|
28
21
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
def is_email?
|
34
|
-
RubyEmail.validates? self
|
22
|
+
# @return [Regexp] constant to erase in the children
|
23
|
+
def self.regexp
|
24
|
+
self::REGEXP
|
25
|
+
#raise NoMethodError, "Not implemented in #{self.class}"
|
35
26
|
end
|
36
27
|
|
37
28
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require_relative '../rfc5322'
|
2
|
+
|
3
|
+
module RubyEmail
|
4
|
+
class Rfc5322
|
5
|
+
|
6
|
+
# Internet realist version of {Rfc5322}. It requires a root domain.
|
7
|
+
class Public < Rfc5322
|
8
|
+
VALIDE = "(?<local>#{DOT_ATOM_TEXT})@(?<domain>#{DOT_ATOM_TEXT}\\.#{DOT_ATOM_TEXT})"
|
9
|
+
REGEXP = Regexp.new "\\A#{VALIDE}\\Z"
|
10
|
+
|
11
|
+
module String
|
12
|
+
# Check if the current [::String] instance is a valid email
|
13
|
+
# @return [TrueClass or FalseClass]
|
14
|
+
def is_public_email?
|
15
|
+
RubyEmail::Rfc5322::Public.validates? self
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require_relative 'core'
|
2
|
+
|
3
|
+
module RubyEmail
|
4
|
+
|
5
|
+
# http://www.ietf.org/rfc/rfc5322.txt
|
6
|
+
# The Rfc5322 designe an email with the format local@domain, wher local and
|
7
|
+
# domain are a string of US-ASCII characters, without some symboles.
|
8
|
+
class Rfc5322 < Core
|
9
|
+
# one valid character (not . because used to separe domains)
|
10
|
+
ATEXT = '([A-Za-z0-9!#\$%&\'*\+\-/=\?\^_`\{\}\|~])'
|
11
|
+
# a valid string
|
12
|
+
ATOM = "#{ATEXT}+"
|
13
|
+
# a valid string with subdomains, separated by dots
|
14
|
+
DOT_ATOM_TEXT = "(#{ATOM})(\\.#{ATOM})*"
|
15
|
+
# email grammar
|
16
|
+
VALIDE = "(?<local>#{DOT_ATOM_TEXT})@(?<domain>#{DOT_ATOM_TEXT})"
|
17
|
+
# regexp to validate complete email
|
18
|
+
REGEXP = Regexp.new "\\A#{VALIDE}\\Z"
|
19
|
+
module String
|
20
|
+
# Check if the current [::String] instance is a valid email
|
21
|
+
# @return [TrueClass or FalseClass]
|
22
|
+
def is_email?
|
23
|
+
RubyEmail::Rfc5322.validates? self
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
data/lib/ruby_email.rb
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
require_relative 'ruby_email/core'
|
2
|
-
require_relative 'ruby_email/core/string'
|
3
2
|
|
4
|
-
require_relative 'ruby_email/
|
5
|
-
|
3
|
+
require_relative 'ruby_email/rfc5322'
|
4
|
+
|
5
|
+
require_relative 'ruby_email/rfc5322/public'
|
6
|
+
|
7
|
+
#require_relative 'ruby_email/rfc5322/string'
|
8
|
+
#require_relative 'ruby_email/rfc5322/public/string'
|
data/ruby_email.gemspec
CHANGED
@@ -9,9 +9,10 @@ Gem::Specification.new do |s|
|
|
9
9
|
s.files = %w(
|
10
10
|
lib/ruby_email.rb
|
11
11
|
lib/ruby_email/core.rb
|
12
|
-
lib/ruby_email/
|
13
|
-
lib/ruby_email/
|
14
|
-
lib/ruby_email/public
|
12
|
+
lib/ruby_email/rfc5322.rb
|
13
|
+
lib/ruby_email/rfc5322/string.rb
|
14
|
+
lib/ruby_email/rfc5322/public.rb
|
15
|
+
lib/ruby_email/rfc5322/public/string.rb
|
15
16
|
|
16
17
|
README.md
|
17
18
|
CHANGELOG
|
data/test/unit_test.rb
CHANGED
@@ -7,65 +7,72 @@ require_relative '../lib/ruby_email'
|
|
7
7
|
class TestRubyEmail < Test::Unit::TestCase
|
8
8
|
|
9
9
|
def test_simple_true
|
10
|
-
assert RubyEmail.validates?("toto@toto")
|
11
|
-
assert RubyEmail.validates?("toto@toto.toto")
|
12
|
-
assert RubyEmail.validates?("toto@toto.toto.toto")
|
13
|
-
assert RubyEmail.validates?("toto@toto.toto.toto.toto")
|
10
|
+
assert RubyEmail::Rfc5322.validates?("toto@toto")
|
11
|
+
assert RubyEmail::Rfc5322.validates?("toto@toto.toto")
|
12
|
+
assert RubyEmail::Rfc5322.validates?("toto@toto.toto.toto")
|
13
|
+
assert RubyEmail::Rfc5322.validates?("toto@toto.toto.toto.toto")
|
14
14
|
end
|
15
15
|
|
16
16
|
def test_simple_false
|
17
|
-
assert !RubyEmail.validates?("t")
|
18
|
-
assert !RubyEmail.validates?("t@")
|
19
|
-
assert !RubyEmail.validates?("@t")
|
17
|
+
assert !RubyEmail::Rfc5322.validates?("t")
|
18
|
+
assert !RubyEmail::Rfc5322.validates?("t@")
|
19
|
+
assert !RubyEmail::Rfc5322.validates?("@t")
|
20
20
|
end
|
21
21
|
|
22
22
|
def test_plus_true
|
23
|
-
assert RubyEmail.validates?("i'am%toto@here")
|
24
|
-
assert RubyEmail.validates?("ich-bin-toto@___")
|
25
|
-
assert RubyEmail.validates?("arthur+spam@mail.com")
|
23
|
+
assert RubyEmail::Rfc5322.validates?("i'am%toto@here")
|
24
|
+
assert RubyEmail::Rfc5322.validates?("ich-bin-toto@___")
|
25
|
+
assert RubyEmail::Rfc5322.validates?("arthur+spam@mail.com")
|
26
26
|
end
|
27
27
|
|
28
28
|
def test_plus_false
|
29
|
-
assert !RubyEmail.validates?("i have @ some things")
|
30
|
-
assert !RubyEmail.validates?("toto;toto@toto;toto")
|
31
|
-
assert !RubyEmail.validates?("toto,toto@toto,toto")
|
32
|
-
assert !RubyEmail.validates?("toto()toto@toto()toto")
|
33
|
-
assert !RubyEmail.validates?("toto[]toto@toto[]toto")
|
34
|
-
assert !RubyEmail.validates?("toto:toto@toto:toto")
|
35
|
-
assert !RubyEmail.validates?("toto<>toto@toto<>toto")
|
36
|
-
assert !RubyEmail.validates?("toto\\toto@toto\\toto")
|
37
|
-
assert !RubyEmail.validates?("toto\"toto@toto\"toto")
|
29
|
+
assert !RubyEmail::Rfc5322.validates?("i have @ some things")
|
30
|
+
assert !RubyEmail::Rfc5322.validates?("toto;toto@toto;toto")
|
31
|
+
assert !RubyEmail::Rfc5322.validates?("toto,toto@toto,toto")
|
32
|
+
assert !RubyEmail::Rfc5322.validates?("toto()toto@toto()toto")
|
33
|
+
assert !RubyEmail::Rfc5322.validates?("toto[]toto@toto[]toto")
|
34
|
+
assert !RubyEmail::Rfc5322.validates?("toto:toto@toto:toto")
|
35
|
+
assert !RubyEmail::Rfc5322.validates?("toto<>toto@toto<>toto")
|
36
|
+
assert !RubyEmail::Rfc5322.validates?("toto\\toto@toto\\toto")
|
37
|
+
assert !RubyEmail::Rfc5322.validates?("toto\"toto@toto\"toto")
|
38
38
|
end
|
39
39
|
|
40
40
|
def test_match
|
41
|
-
m = RubyEmail.match "toto@toto.toto.toto.toto"
|
41
|
+
m = RubyEmail::Rfc5322.match "toto@toto.toto.toto.toto"
|
42
42
|
assert m.names & %w(local domain)
|
43
43
|
assert_equal "toto", m["local"]
|
44
44
|
assert_equal "toto.toto.toto.toto", m["domain"]
|
45
45
|
end
|
46
46
|
|
47
47
|
def test_string
|
48
|
-
|
48
|
+
assert_raise { "toto@toto".is_email? }
|
49
|
+
require_relative '../lib/ruby_email/rfc5322/string'
|
49
50
|
assert "toto@toto".is_email?
|
51
|
+
assert !"toto".is_email?
|
50
52
|
end
|
51
53
|
|
52
54
|
def test_exceptions
|
53
|
-
assert_raise { RubyEmail.match 1 }
|
54
|
-
assert_raise { RubyEmail.validates? 1.0 }
|
55
|
-
assert_raise { RubyEmail.validates? /toto/ }
|
56
|
-
assert_raise { RubyEmail.validates? :ok }
|
57
|
-
assert_raise { RubyEmail.validates? Class }
|
55
|
+
assert_raise { RubyEmail::Rfc5322.match 1 }
|
56
|
+
assert_raise { RubyEmail::Rfc5322.validates? 1.0 }
|
57
|
+
assert_raise { RubyEmail::Rfc5322.validates? /toto/ }
|
58
|
+
assert_raise { RubyEmail::Rfc5322.validates? :ok }
|
59
|
+
assert_raise { RubyEmail::Rfc5322.validates? Class }
|
58
60
|
end
|
59
61
|
|
60
62
|
end
|
61
63
|
|
62
64
|
class TestRubyEmailPublic < Test::Unit::TestCase
|
63
65
|
def test_simpe
|
64
|
-
assert RubyEmail::Public.validates?("toto@toto.toto")
|
65
|
-
assert RubyEmail::Public.validates?("toto@toto.toto.toto")
|
66
|
-
assert RubyEmail::Public.validates?("toto@toto.toto.toto.toto")
|
67
|
-
assert !RubyEmail::Public.validates?("toto@toto")
|
68
|
-
assert RubyEmail::Public.match("toto@toto.toto")
|
66
|
+
assert RubyEmail::Rfc5322::Public.validates?("toto@toto.toto")
|
67
|
+
assert RubyEmail::Rfc5322::Public.validates?("toto@toto.toto.toto")
|
68
|
+
assert RubyEmail::Rfc5322::Public.validates?("toto@toto.toto.toto.toto")
|
69
|
+
assert !RubyEmail::Rfc5322::Public.validates?("toto@toto")
|
70
|
+
assert RubyEmail::Rfc5322::Public.match("toto@toto.toto")
|
71
|
+
end
|
72
|
+
|
73
|
+
def test_string
|
74
|
+
assert_raise { "toto@toto.toto".is_public_email? }
|
75
|
+
require_relative '../lib/ruby_email/rfc5322/public/string'
|
69
76
|
assert "toto@toto.toto".is_public_email?
|
70
77
|
assert !"toto@toto".is_public_email?
|
71
78
|
end
|
data/version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.6
|
data.tar.gz.sig
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby_email
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nephos (poulet_a)
|
@@ -61,9 +61,10 @@ files:
|
|
61
61
|
- Rakefile
|
62
62
|
- lib/ruby_email.rb
|
63
63
|
- lib/ruby_email/core.rb
|
64
|
-
- lib/ruby_email/
|
65
|
-
- lib/ruby_email/public.rb
|
66
|
-
- lib/ruby_email/public/string.rb
|
64
|
+
- lib/ruby_email/rfc5322.rb
|
65
|
+
- lib/ruby_email/rfc5322/public.rb
|
66
|
+
- lib/ruby_email/rfc5322/public/string.rb
|
67
|
+
- lib/ruby_email/rfc5322/string.rb
|
67
68
|
- ruby_email.gemspec
|
68
69
|
- test/unit_test.rb
|
69
70
|
- version
|
metadata.gz.sig
CHANGED
Binary file
|
data/lib/ruby_email/public.rb
DELETED
@@ -1,43 +0,0 @@
|
|
1
|
-
require_relative 'core'
|
2
|
-
|
3
|
-
# http://www.ietf.org/rfc/rfc5322.txt
|
4
|
-
module RubyEmail
|
5
|
-
|
6
|
-
# Only valid on the public internet. "toto@toto" is not valid, but "toto@toto.toto" is good
|
7
|
-
module Public
|
8
|
-
# one valid character (not . because used to separe domains)
|
9
|
-
ATEXT = '([A-Za-z0-9!#\$%&\'*\+\-/=\?\^_`\{\}\|~])'
|
10
|
-
ATOM = "#{ATEXT}+"
|
11
|
-
DOT_ATOM_TEXT = "(#{ATOM})(\\.#{ATOM})*"
|
12
|
-
VALIDE = "(?<local>#{DOT_ATOM_TEXT})@(?<domain>#{DOT_ATOM_TEXT}\\.#{DOT_ATOM_TEXT})"
|
13
|
-
REGEXP = Regexp.new "\\A#{VALIDE}\\Z"
|
14
|
-
|
15
|
-
# Check if the {::String} is a valid email on internet
|
16
|
-
# @param str [::String] string to match
|
17
|
-
# @raise [ArgumentError] if str is not a String
|
18
|
-
# @return [TrueClass or FalseClass]
|
19
|
-
def self.validates? str
|
20
|
-
!!match(str)
|
21
|
-
end
|
22
|
-
|
23
|
-
# Check if the string is a valid email on internet and details how
|
24
|
-
# @param str [::String] string to match
|
25
|
-
# @raise [ArgumentError] if str is not a String
|
26
|
-
# @return [MatchData or NilClass] matched email with the keys "local" and "domain"
|
27
|
-
def self.match str
|
28
|
-
raise ArgumentError, "Cannot validate a `#{str.class}`. Only `String` can be." unless str.is_a?(String)
|
29
|
-
str.match(REGEXP)
|
30
|
-
end
|
31
|
-
|
32
|
-
# included by {::String}
|
33
|
-
module String
|
34
|
-
# Check if the current [::String] instance is a valid email on internet
|
35
|
-
# @return [TrueClass or FalseClass]
|
36
|
-
def is_public_email?
|
37
|
-
RubyEmail::Public.validates? self
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
end
|
42
|
-
|
43
|
-
end
|