domain_name_validator 0.2 → 0.3

Sign up to get free protection for your applications and to get access to all the features.
data/ChangeLog.md CHANGED
@@ -1,14 +1,20 @@
1
- 0.2 (2013-06-24)
1
+ 0.3 (2013-06-28)
2
2
  ----------------
3
3
 
4
- First version built and deployed as a gem on a real project, for general
5
- evaluation and testing purposes.
4
+ * Added a check, because labels cannot begin with a period.
5
+ * Updated documentation, plus defined Road Map for future changes.
6
+
7
+ 0.2 (2013-06-17)
8
+ ----------------
9
+
10
+ First version built and deployed as a gem on a real project. Released on
11
+ Rubygems.org for the first time.
6
12
 
7
13
  * Added more RSpec tests for improved test coverage.
8
14
  * Enhanced documentation.
9
15
 
10
16
 
11
- 0.1 (2013-06-18)
17
+ 0.1 (2013-06-10)
12
18
  ----------------
13
19
 
14
20
  Initial working version of the code, with minimal RSpec tests. Released on
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- domain_name_validator (0.1)
4
+ domain_name_validator (0.3)
5
5
 
6
6
  GEM
7
7
  remote: http://rubygems.org/
data/README.md CHANGED
@@ -2,7 +2,48 @@ domain_name_validator
2
2
  =====================
3
3
 
4
4
  Ever needed to validate a domain name? This gem will validate any domain name
5
- represented in ASCII or UTF-8.
5
+ represented in ASCII.
6
+
7
+ The scope of this gem is deliberately focused on validating domain names. It
8
+ simply answers the question: "Is this a real domain name?" Using this command,
9
+ you can make a realistic assessment about whether you want to store a domain
10
+ name or URL in your database. This gem will tell you 1) that a domain is or
11
+ is not valid, and 2) if it's not valid, what the errors are.
12
+
13
+ There are other gems and libraries that parse domain names into their various
14
+ components, or parse URLS, or properly handle Unicode domain names, etc. Use
15
+ them; many of them are very good at their well-defined roles. But none of the
16
+ ones that I came across were very good at simply telling me whether a domain
17
+ names was valid.
18
+
19
+ How It Works
20
+ ------------
21
+
22
+ To validate a domain name:
23
+
24
+ v = DomainNameValidator.new
25
+ if v.validate('keenertech.com')
26
+ # Do something
27
+ end
28
+
29
+ What about error messages? If a domain isn't valid, it's often desirable to
30
+ find out why the domain ewasn't valid. To do this, simply pass an array into
31
+ the "validate" message as the optional second argument.
32
+
33
+ errs = []
34
+ v = DomainNameValidator.new
35
+ unless v.validate('keenertech.123', errs)
36
+ puts("Errors: #{errs.inspect}")
37
+ end
38
+
39
+ This generates the following output:
40
+
41
+ Errors: ["The top-level domain (the extension) cannot be numerical"]
42
+
43
+ This gem should make it easy to validate domain names.
44
+
45
+ About Domain Names
46
+ ------------------
6
47
 
7
48
  Domain names provide a unique, memorizable name to represent numerically
8
49
  addressable Internet resources. They also provide a level of abstraction that
@@ -10,9 +51,9 @@ allows the underlying Internet address to be changed while still referencing
10
51
  a resource by its domain name. The domain name space is managed by the
11
52
  Internet Corporation for Assigned Names and Numbers (ICANN).
12
53
 
13
- The right-most label of a domain name is referred to as the top-level domain, or
14
- TLD. A limited set of top-level domain names, and two-character country codes,
15
- have been standardized. The Internet Assigned Numbers Authority (IANA)
54
+ The right-most label of a domain name is referred to as the top-level domain,
55
+ or TLD. A limited set of top-level domain names, and two-character country
56
+ codes, have been standardized. The Internet Assigned Numbers Authority (IANA)
16
57
  maintains an annotated list of top-level domains, as well as a list of
17
58
  "special use," or reserved, top-level domain names.
18
59
 
@@ -21,20 +62,24 @@ maintains an annotated list of top-level domains, as well as a list of
21
62
 
22
63
  Domain names follow some very detailed rules:
23
64
 
24
- 1. The maximum length of a domain name is 253 characters.
65
+ * The maximum length of a domain name is 253 characters.
25
66
 
26
- 2. A domain name is divided into "labels" separated by periods. The maximum
27
- number of labels is 127.
67
+ * A domain name is divided into "labels" separated by periods. The maximum
68
+ number of labels is 127.
28
69
 
29
- 3. The maximum length of any label within a domain name is 63 characters.
70
+ * The maximum length of any label within a domain name is 63 characters.
30
71
 
31
- 4. No label, including TLDs, can begin or end with a dash.
72
+ * No label, including TLDs, can begin or end with a dash.
32
73
 
33
- 5. Top-level domain names cannot be all numeric.
74
+ * Top-level domain names cannot be all numeric.
34
75
 
35
- 6. The right-most label must be either a recognized TLD or a 2-letter country
36
- code. The only exception is for international domain names, for which
37
- TLD checking is currently bypassed.
76
+ * The right-most label must be either a recognized TLD or a 2-letter country
77
+ code. The only exception is for international domain names, for which
78
+ TLD checking is currently bypassed.
79
+
80
+ * Top-level domain names cannot be all numeric.
81
+
82
+ * Domain names may not begin with a period.
38
83
 
39
84
 
40
85
  Internationalized Domain Names
@@ -57,6 +102,55 @@ size limit of 63 characters. In the absence of specific guidelines, and because
57
102
  I've never actually seen an overly long label, I have chosen to apply the limit
58
103
  irregardless of the presence of the "xn--" prefix within a label.
59
104
 
105
+ Requirements
106
+ ------------
107
+
108
+ This is a Ruby gem with no run-time dependencies on anything else. It's only
109
+ been tested under Ruby 1.9.3, but it should be compatible with all versions of
110
+ Ruby more recent than Ruby 1.8.6.
111
+
112
+ Install
113
+ -------
114
+
115
+ Installation doesn't get much simpler than this:
116
+
117
+ gem install domain_name_validator
118
+
119
+ Road Map
120
+ --------
121
+
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 complex
124
+ than you might imagine).
125
+
126
+ Alternative Gems
127
+ ----------------
128
+
129
+ If this domain_name_validator gem does not suit your needs, here are a few
130
+ recommended gems that may provide you with the additional power (and
131
+ complexity) that is deliberately absent from this highly focused gem:
132
+
133
+ * domain_name - A full-featured gem for parsing/manipulating domain names.
134
+ * ip_address - For everything you need to do with Ipv4 and Ipv6 addresses.
135
+
136
+
137
+ Author
138
+ ------
139
+
140
+ David Keener
141
+
142
+ He's is a long-time Rubyist, with extensive experience both in the Internet
143
+ startup world and government contracting. He is one of the founders of the
144
+ RubyNation and DevIgnition conferences. He speaks often at technical
145
+ conferences, and blogs regularly on Internet-related subjects at
146
+ KeenerTech.com.
147
+
148
+ Contributors
149
+ ------------
150
+
151
+ Many thanks for the support of General Dynamics and the Department of
152
+ Homeland Security (DHS).
153
+
60
154
  YOUR SUPPORT
61
155
  ------------
62
156
 
@@ -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-06-17'
8
+ gem.date = '2013-06-28'
9
9
  gem.platform = Gem::Platform::RUBY
10
10
  gem.authors = ["David Keener"]
11
11
  gem.email = ["dkeener@keenertech.com"]
@@ -1,6 +1,6 @@
1
1
  # The purpose of this class is to provide a simple capability for validating
2
- # domain names represented in ASCII or UTF-8, a feature that seems to be
3
- # missing from other more wide-ranging domain-related gems.
2
+ # domain names represented in ASCII, a feature that seems to be missing or
3
+ # obscured in other more wide-ranging domain-related gems.
4
4
 
5
5
  class DomainNameValidator
6
6
 
@@ -9,14 +9,26 @@ class DomainNameValidator
9
9
  MAX_LEVELS = 127
10
10
  MIN_LEVELS = 2
11
11
 
12
- ERR_MAX_DOMAIN_SIZE = 'Maximum domain length of 253 exceeded'
13
- ERR_MAX_LABEL_SIZE = 'Maximum domain label length of 63 exceeded'
14
- ERR_MAX_LEVEL_SIZE = 'Maximum domain level limit of 127 exceeded'
15
- ERR_MIN_LEVEL_SIZE = 'Minimum domain level limit of 2 not achieved'
16
- ERR_LABEL_DASH_BEGIN = 'No domain label may begin with a dash'
17
- ERR_LABEL_DASH_END = 'No domain label may end with a dash'
18
- ERR_TOP_NUMERICAL = 'The top-level domain (the extension) cannot be numerical'
19
- ERR_ILLEGAL_CHARS = 'Domain label contains an illegal character'
12
+ ERRS = {
13
+ :max_domain_size =>
14
+ 'Maximum domain length of 253 exceeded',
15
+ :max_label_size =>
16
+ 'Maximum domain label length of 63 exceeded',
17
+ :max_level_size =>
18
+ 'Maximum domain level limit of 127 exceeded',
19
+ :min_level_size =>
20
+ '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
+ :top_numerical =>
26
+ 'The top-level domain (the extension) cannot be numerical',
27
+ :illegal_chars =>
28
+ 'Domain label contains an illegal character',
29
+ :illegal_start =>
30
+ 'No domain name may start with a period'
31
+ }
20
32
 
21
33
  # Validates the proper formatting of a normalized domain name, i.e. - a
22
34
  # domain that is represented in ASCII. Thus, international domain names are
@@ -29,19 +41,21 @@ class DomainNameValidator
29
41
  # 3. The maximum length of any label within a domain name is 63 characters.
30
42
  # 4. No label, including top-level domains, can begin or end with a dash.
31
43
  # 5. Top-level names cannot be all numeric.
44
+ # 6. A domain name cannot begin with a period.
32
45
 
33
46
  def validate(dn, errs = [])
34
- errs << ERR_MAX_DOMAIN_SIZE if dn.size > MAX_DOMAIN_LENGTH
47
+ errs << ERRS[:max_domain_size] if dn.size > MAX_DOMAIN_LENGTH
35
48
  parts = dn.split('.')
36
- errs << ERR_MAX_LEVEL_SIZE if parts.size > MAX_LEVELS
37
- errs << ERR_MIN_LEVEL_SIZE if parts.size < MIN_LEVELS
49
+ errs << ERRS[:max_level_size] if parts.size > MAX_LEVELS
50
+ errs << ERRS[:min_level_size] if parts.size < MIN_LEVELS
38
51
  parts.each do |p|
39
- errs << ERR_MAX_LABEL_SIZE if p.size > MAX_LABEL_LENGTH
40
- errs << ERR_LABEL_DASH_BEGIN if p[0] == '-'
41
- errs << ERR_LABEL_DASH_END if p[-1] == '-'
42
- errs << ERR_ILLEGAL_CHARS unless p.match(/^[a-z0-9\-\_]+$/)
52
+ errs << ERRS[:max_label_size] if p.size > MAX_LABEL_LENGTH
53
+ errs << ERRS[:label_dash_begin] if p[0] == '-'
54
+ errs << ERRS[:label_dash_end] if p[-1] == '-'
55
+ errs << ERRS[:illegal_chars] unless p.match(/^[a-z0-9\-\_]+$/)
43
56
  end
44
- errs << ERR_TOP_NUMERICAL if parts.last.match(/^[0-9]+$/)
57
+ errs << ERRS[:top_numerical] if parts.last.match(/^[0-9]+$/)
58
+ errs << ERRS[:illegal_start] if parts.first[0] == '.'
45
59
 
46
60
  errs.size == 0 # TRUE if valid, FALSE otherwise
47
61
  end
@@ -1,3 +1,3 @@
1
1
  class DomainNameValidator
2
- VERSION = "0.2"
2
+ VERSION = "0.3"
3
3
  end
@@ -47,11 +47,17 @@ describe DomainNameValidator do
47
47
  response = @validator.validate(domain)
48
48
  response.should be == false
49
49
  end
50
+
51
+ it 'should fail when a domain name begins with a period' do
52
+ domain = ".b.c.com"
53
+ response = @validator.validate(domain)
54
+ response.should be == false
55
+ end
50
56
  end
51
57
 
52
58
  describe 'Internationalized (normalized) domain names' do
53
59
 
54
- it 'should fail when a TLD begins with a dash' do
60
+ it 'should pass when a normalized international domain name' do
55
61
  domain = "xn--kbenhavn-54.eu"
56
62
  response = @validator.validate(domain)
57
63
  response.should be == true
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.2'
4
+ version: '0.3'
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-06-17 00:00:00.000000000 Z
12
+ date: 2013-06-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &30848232 !ruby/object:Gem::Requirement
16
+ requirement: &31251708 !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: *30848232
24
+ version_requirements: *31251708
25
25
  description: Checks the validity of domain names.
26
26
  email:
27
27
  - dkeener@keenertech.com