domain_name_validator 0.3 → 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/ChangeLog.md +11 -0
- data/Developers.md +52 -0
- data/Gemfile.lock +1 -1
- data/README.md +8 -5
- data/domain_name_validator.gemspec +1 -1
- data/lib/domain_name_validator/validator.rb +21 -9
- data/lib/domain_name_validator/version.rb +1 -1
- data/spec/domain_name_validator_spec.rb +38 -3
- metadata +5 -4
data/ChangeLog.md
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
0.4 (2013-07-17)
|
2
|
+
----------------
|
3
|
+
|
4
|
+
* By request, added rudimentary TLD checking. A TLD, the right-most label of a
|
5
|
+
domain name, should be either 2 or 3 characters, unless it's "aero", "arpa",
|
6
|
+
"museum" or begins with "xn--" (for a normalized Unicode TLD). This check
|
7
|
+
does not validate against a master list of TLD's, but basically just fails
|
8
|
+
a domain name if the TLD basically could not be valid under any
|
9
|
+
circumstances. This validation would, for example, reject a domain name
|
10
|
+
such as "test.domain".
|
11
|
+
|
1
12
|
0.3 (2013-06-28)
|
2
13
|
----------------
|
3
14
|
|
data/Developers.md
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
For Developers Only
|
2
|
+
===================
|
3
|
+
|
4
|
+
Building and testing the domain_name_validator gem is pretty easy.
|
5
|
+
|
6
|
+
Gemspec
|
7
|
+
-------
|
8
|
+
|
9
|
+
The gemspec file for the gem, domain_name_validator.gemspec, is an active
|
10
|
+
file containing Ruby code. In other words, the gemspec file itself has code
|
11
|
+
to figure out what files should be included in the gem, etc. Each time a
|
12
|
+
release is done, the only thing that needs to be edited is the "gem.date"
|
13
|
+
property.
|
14
|
+
|
15
|
+
Version
|
16
|
+
-------
|
17
|
+
|
18
|
+
The version number is defined in the version.rb file, located in the lib
|
19
|
+
directory tree. The version number should be bumped up in some fashion with
|
20
|
+
each release. Version numbers often have 3 digits, e.g. - 1.2.3. The left-most
|
21
|
+
number is a release, followed by a sub-release and a patch. All versions
|
22
|
+
within a release should generally be backwards compatible. A sub-release
|
23
|
+
generally include significant new features, whilea patch is generally a minor
|
24
|
+
update (often a bug fix).
|
25
|
+
|
26
|
+
The gemspec file automatically picks up the version number from the version.rb
|
27
|
+
file, so make sure you keep it updated properly.
|
28
|
+
|
29
|
+
Testing the Code
|
30
|
+
----------------
|
31
|
+
|
32
|
+
Testing the code is simple. Run the following command from the top level
|
33
|
+
of the gem's directory tree:
|
34
|
+
|
35
|
+
$ bundle exec rspec spec
|
36
|
+
|
37
|
+
Creating the Gem
|
38
|
+
----------------
|
39
|
+
|
40
|
+
To create the gem file for this gem, run the following command from the top
|
41
|
+
level of the gem's directory tree:
|
42
|
+
|
43
|
+
$ gem build domain_name_validator.gemspec
|
44
|
+
|
45
|
+
Pushing to RubyGems
|
46
|
+
-------------------
|
47
|
+
|
48
|
+
Obviously, you can only do this step if you've got the appropriate privileges
|
49
|
+
at RubyGems.org and everything is properly configured.
|
50
|
+
|
51
|
+
$ gem push domain_name_validator.gem
|
52
|
+
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -14,7 +14,7 @@ There are other gems and libraries that parse domain names into their various
|
|
14
14
|
components, or parse URLS, or properly handle Unicode domain names, etc. Use
|
15
15
|
them; many of them are very good at their well-defined roles. But none of the
|
16
16
|
ones that I came across were very good at simply telling me whether a domain
|
17
|
-
names was valid.
|
17
|
+
names was valid, or WHY it was invalid if it failed the validations.
|
18
18
|
|
19
19
|
How It Works
|
20
20
|
------------
|
@@ -120,8 +120,10 @@ Road Map
|
|
120
120
|
--------
|
121
121
|
|
122
122
|
More types of checks will be added as they are identified. Support for
|
123
|
-
validating top-level domains is also in the works (it's a bit more
|
124
|
-
than you might imagine).
|
123
|
+
validating top-level domains (TLD's) is also in the works (it's a bit more
|
124
|
+
complex than you might imagine). This will also bring in the capability to
|
125
|
+
validate effective TLD's as well, i.e. - strings that are treated as top-level
|
126
|
+
domains by registrars around the world.
|
125
127
|
|
126
128
|
Alternative Gems
|
127
129
|
----------------
|
@@ -139,7 +141,7 @@ Author
|
|
139
141
|
|
140
142
|
David Keener
|
141
143
|
|
142
|
-
He's
|
144
|
+
He's a long-time Rubyist, with extensive experience both in the Internet
|
143
145
|
startup world and government contracting. He is one of the founders of the
|
144
146
|
RubyNation and DevIgnition conferences. He speaks often at technical
|
145
147
|
conferences, and blogs regularly on Internet-related subjects at
|
@@ -149,7 +151,8 @@ Contributors
|
|
149
151
|
------------
|
150
152
|
|
151
153
|
Many thanks for the support of General Dynamics and the Department of
|
152
|
-
Homeland Security (DHS).
|
154
|
+
Homeland Security (DHS). And more specifically on input from Andrew Finch,
|
155
|
+
Josh Lentz, Jonathan Quigg and Dave Roberts.
|
153
156
|
|
154
157
|
YOUR SUPPORT
|
155
158
|
------------
|
@@ -5,7 +5,7 @@ require "domain_name_validator/version"
|
|
5
5
|
Gem::Specification.new do |gem|
|
6
6
|
gem.name = "domain_name_validator"
|
7
7
|
gem.version = DomainNameValidator::VERSION
|
8
|
-
gem.date = '2013-
|
8
|
+
gem.date = '2013-07-17'
|
9
9
|
gem.platform = Gem::Platform::RUBY
|
10
10
|
gem.authors = ["David Keener"]
|
11
11
|
gem.email = ["dkeener@keenertech.com"]
|
@@ -7,9 +7,21 @@ class DomainNameValidator
|
|
7
7
|
MAX_DOMAIN_LENGTH = 253
|
8
8
|
MAX_LABEL_LENGTH = 63
|
9
9
|
MAX_LEVELS = 127
|
10
|
+
MAX_TLD_LENGTH = 3 # Except for "aero", "arpa", and "museum"
|
10
11
|
MIN_LEVELS = 2
|
12
|
+
MIN_TLD_LENGTH = 2
|
11
13
|
|
12
14
|
ERRS = {
|
15
|
+
:bogus_tld =>
|
16
|
+
'Malformed TLD',
|
17
|
+
:illegal_chars =>
|
18
|
+
'Domain label contains an illegal character',
|
19
|
+
:illegal_start =>
|
20
|
+
'No domain name may start with a period',
|
21
|
+
:label_dash_begin =>
|
22
|
+
'No domain label may begin with a dash',
|
23
|
+
:label_dash_end =>
|
24
|
+
'No domain label may end with a dash',
|
13
25
|
:max_domain_size =>
|
14
26
|
'Maximum domain length of 253 exceeded',
|
15
27
|
:max_label_size =>
|
@@ -18,16 +30,8 @@ class DomainNameValidator
|
|
18
30
|
'Maximum domain level limit of 127 exceeded',
|
19
31
|
:min_level_size =>
|
20
32
|
'Minimum domain level limit of 2 not achieved',
|
21
|
-
:label_dash_begin =>
|
22
|
-
'No domain label may begin with a dash',
|
23
|
-
:label_dash_end =>
|
24
|
-
'No domain label may end with a dash',
|
25
33
|
:top_numerical =>
|
26
|
-
'The top-level domain (
|
27
|
-
:illegal_chars =>
|
28
|
-
'Domain label contains an illegal character',
|
29
|
-
:illegal_start =>
|
30
|
-
'No domain name may start with a period'
|
34
|
+
'The top-level domain (TLD) cannot be numerical'
|
31
35
|
}
|
32
36
|
|
33
37
|
# Validates the proper formatting of a normalized domain name, i.e. - a
|
@@ -55,6 +59,14 @@ class DomainNameValidator
|
|
55
59
|
errs << ERRS[:illegal_chars] unless p.match(/^[a-z0-9\-\_]+$/)
|
56
60
|
end
|
57
61
|
errs << ERRS[:top_numerical] if parts.last.match(/^[0-9]+$/)
|
62
|
+
if parts.last.size < MIN_TLD_LENGTH || parts.last.size > MAX_TLD_LENGTH
|
63
|
+
unless parts.last == 'arpa' ||
|
64
|
+
parts.last == 'aero' ||
|
65
|
+
parts.last == 'museum' ||
|
66
|
+
parts.last.match(/^xn--/)
|
67
|
+
errs << ERRS[:bogus_tld]
|
68
|
+
end
|
69
|
+
end
|
58
70
|
errs << ERRS[:illegal_start] if parts.first[0] == '.'
|
59
71
|
|
60
72
|
errs.size == 0 # TRUE if valid, FALSE otherwise
|
@@ -57,7 +57,7 @@ describe DomainNameValidator do
|
|
57
57
|
|
58
58
|
describe 'Internationalized (normalized) domain names' do
|
59
59
|
|
60
|
-
it 'should pass
|
60
|
+
it 'should pass with a normalized international domain name' do
|
61
61
|
domain = "xn--kbenhavn-54.eu"
|
62
62
|
response = @validator.validate(domain)
|
63
63
|
response.should be == true
|
@@ -65,9 +65,44 @@ describe DomainNameValidator do
|
|
65
65
|
|
66
66
|
end
|
67
67
|
|
68
|
-
|
68
|
+
describe 'Rudimentary TLD Checking' do
|
69
|
+
|
70
|
+
it 'should fail if the TLD is too short' do
|
71
|
+
domain = "test.a"
|
72
|
+
response = @validator.validate(domain)
|
73
|
+
response.should be == false
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'should fail if the TLD is too long' do
|
77
|
+
domain = "test.domain"
|
78
|
+
response = @validator.validate(domain)
|
79
|
+
response.should be == false
|
80
|
+
end
|
81
|
+
|
82
|
+
it "should succeed if the TLD is too long but equals 'aero'" do
|
83
|
+
domain = "test.aero"
|
84
|
+
response = @validator.validate(domain)
|
85
|
+
response.should be == true
|
86
|
+
end
|
87
|
+
|
88
|
+
it "should succeed if the TLD is too long but equals 'arpa'" do
|
89
|
+
domain = "test.arpa"
|
90
|
+
response = @validator.validate(domain)
|
91
|
+
response.should be == true
|
92
|
+
end
|
93
|
+
|
94
|
+
it "should succeed if the TLD is too long but equals 'museum'" do
|
95
|
+
domain = "test.museum"
|
96
|
+
response = @validator.validate(domain)
|
97
|
+
response.should be == true
|
98
|
+
end
|
99
|
+
|
100
|
+
it "should succeed if the TLD is too long but matches 'xn--'" do
|
101
|
+
domain = "test.xn--really-long-text"
|
102
|
+
response = @validator.validate(domain)
|
103
|
+
response.should be == true
|
104
|
+
end
|
69
105
|
|
70
|
-
describe 'TLD Checking' do
|
71
106
|
end
|
72
107
|
|
73
108
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: domain_name_validator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '0.
|
4
|
+
version: '0.4'
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-07-17 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
16
|
-
requirement: &
|
16
|
+
requirement: &28073220 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,7 +21,7 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *28073220
|
25
25
|
description: Checks the validity of domain names.
|
26
26
|
email:
|
27
27
|
- dkeener@keenertech.com
|
@@ -30,6 +30,7 @@ extensions: []
|
|
30
30
|
extra_rdoc_files: []
|
31
31
|
files:
|
32
32
|
- ChangeLog.md
|
33
|
+
- Developers.md
|
33
34
|
- Gemfile
|
34
35
|
- Gemfile.lock
|
35
36
|
- LICENSE.txt
|