tld 0.6.1
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +43 -0
- data/Manifest.txt +22 -0
- data/README.rdoc +70 -0
- data/VERSION.yml +4 -0
- data/lib/tld.rb +14 -0
- data/lib/tld/alpha3.rb +13 -0
- data/lib/tld/cc_tld.rb +772 -0
- data/lib/tld/currency.rb +24 -0
- data/lib/tld/generic_tld.rb +28 -0
- data/lib/tld/infrastructure_tld.rb +10 -0
- data/lib/tld/name.rb +50 -0
- data/lib/tld/pseudo_tld.rb +28 -0
- data/lib/tld/reserved_tld.rb +19 -0
- data/lib/tld/retired_tld.rb +10 -0
- data/lib/tld/sponsored_tld.rb +46 -0
- data/lib/tld/tld.rb +104 -0
- data/test/tld_test.rb +87 -0
- metadata +113 -0
data/lib/tld/currency.rb
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'iso_country_codes'
|
3
|
+
|
4
|
+
class TLD
|
5
|
+
class Currency
|
6
|
+
CURRENCY_MAP = {
|
7
|
+
:eu => %w{EUR},
|
8
|
+
:gov => %w{USD},
|
9
|
+
:mil => %w{USD}
|
10
|
+
}
|
11
|
+
|
12
|
+
class << self
|
13
|
+
def find(klass)
|
14
|
+
tld = klass.tld
|
15
|
+
mapped_currency = CURRENCY_MAP[tld.to_sym]
|
16
|
+
if mapped_currency.nil?
|
17
|
+
return tld.match(/^\w\w$/) ? IsoCountryCodes.find(TLD::MAP[tld.to_sym] || tld).currencies : []
|
18
|
+
else
|
19
|
+
return mapped_currency
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
class TLD
|
2
|
+
class GenericTld < TLD
|
3
|
+
def type
|
4
|
+
:generic
|
5
|
+
end
|
6
|
+
class BIZ < GenericTld #:nodoc:
|
7
|
+
self.tld = %q{biz}
|
8
|
+
end
|
9
|
+
class COM < GenericTld #:nodoc:
|
10
|
+
self.tld = %q{com}
|
11
|
+
end
|
12
|
+
class INFO < GenericTld #:nodoc:
|
13
|
+
self.tld = %q{info}
|
14
|
+
end
|
15
|
+
class NAME < GenericTld #:nodoc:
|
16
|
+
self.tld = %q{name}
|
17
|
+
end
|
18
|
+
class NET < GenericTld #:nodoc:
|
19
|
+
self.tld = %q{net}
|
20
|
+
end
|
21
|
+
class ORG < GenericTld #:nodoc:
|
22
|
+
self.tld = %q{org}
|
23
|
+
end
|
24
|
+
class PRO < GenericTld #:nodoc:
|
25
|
+
self.tld = %q{pro}
|
26
|
+
end
|
27
|
+
end # end GenericTld
|
28
|
+
end # end TLD
|
data/lib/tld/name.rb
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'iso_country_codes'
|
3
|
+
|
4
|
+
class TLD
|
5
|
+
class Name
|
6
|
+
NAME_MAP = {
|
7
|
+
:aero => 'Aeroplane',
|
8
|
+
:arpa => 'Address and Routing Parameter Area (ARPA)',
|
9
|
+
:asia => 'Asia',
|
10
|
+
:bitnet => 'BITNET',
|
11
|
+
:biz => 'Business',
|
12
|
+
:cat => 'Catalan',
|
13
|
+
:com => 'Commercial',
|
14
|
+
:coop => 'Cooperative',
|
15
|
+
:csnet => 'Computer Science Network (CSNET)',
|
16
|
+
:edu => 'Education',
|
17
|
+
:eu => 'European Union',
|
18
|
+
:example => 'Example domain',
|
19
|
+
:exit => 'Preferred Tor exit node',
|
20
|
+
:gov => 'US Government',
|
21
|
+
:info => 'Information',
|
22
|
+
:int => 'Internet',
|
23
|
+
:invalid => 'Invalid domain',
|
24
|
+
:jobs => 'Jobs',
|
25
|
+
:local => 'Network discovery protocol',
|
26
|
+
:localhost => 'Localhost',
|
27
|
+
:mil => 'US Military',
|
28
|
+
:mobi => 'Mobile',
|
29
|
+
:museum => 'Museum',
|
30
|
+
:name => 'Name',
|
31
|
+
:nato => 'North Atlantic Treaty Organization (NATO)',
|
32
|
+
:net => 'Network',
|
33
|
+
:onion => 'Reachable via Tor',
|
34
|
+
:org => 'Organization',
|
35
|
+
:pro => 'Professional',
|
36
|
+
:root => 'Diagnostic marker',
|
37
|
+
:tel => 'Telnic',
|
38
|
+
:test => 'Test domain',
|
39
|
+
:travel => 'Travel',
|
40
|
+
:uucp => 'Reachable by Unix to Unix CoPy (UUCP)'
|
41
|
+
}
|
42
|
+
|
43
|
+
class << self
|
44
|
+
def find(klass)
|
45
|
+
tld = klass.tld
|
46
|
+
NAME_MAP[tld.to_sym] || IsoCountryCodes.find(TLD::MAP[tld.to_sym] || tld).name
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
class TLD
|
2
|
+
class PseudoTld < TLD
|
3
|
+
def type
|
4
|
+
:pseudo
|
5
|
+
end
|
6
|
+
class BITNET < PseudoTld #:nodoc:
|
7
|
+
self.tld = %q{bitnet}
|
8
|
+
end
|
9
|
+
class CSNET < PseudoTld #:nodoc:
|
10
|
+
self.tld = %q{csnet}
|
11
|
+
end
|
12
|
+
class LOCAL < PseudoTld #:nodoc:
|
13
|
+
self.tld = %q{local}
|
14
|
+
end
|
15
|
+
class ROOT < PseudoTld #:nodoc:
|
16
|
+
self.tld = %q{root}
|
17
|
+
end
|
18
|
+
class UUCP < PseudoTld #:nodoc:
|
19
|
+
self.tld = %q{uucp}
|
20
|
+
end
|
21
|
+
class ONION < PseudoTld #:nodoc:
|
22
|
+
self.tld = %q{onion}
|
23
|
+
end
|
24
|
+
class EXIT < PseudoTld #:nodoc:
|
25
|
+
self.tld = %q{exit}
|
26
|
+
end
|
27
|
+
end # end PseudoTld
|
28
|
+
end # end TLD
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class TLD
|
2
|
+
class ReservedTld < TLD
|
3
|
+
def type
|
4
|
+
:reserved
|
5
|
+
end
|
6
|
+
class EXAMPLE < ReservedTld #:nodoc:
|
7
|
+
self.tld = %q{example}
|
8
|
+
end
|
9
|
+
class INVALID < ReservedTld #:nodoc:
|
10
|
+
self.tld = %q{invalid}
|
11
|
+
end
|
12
|
+
class LOCALHOST < ReservedTld #:nodoc:
|
13
|
+
self.tld = %q{localhost}
|
14
|
+
end
|
15
|
+
class TEST < ReservedTld #:nodoc:
|
16
|
+
self.tld = %q{test}
|
17
|
+
end
|
18
|
+
end # end ReservedTld
|
19
|
+
end # end TLD
|
@@ -0,0 +1,46 @@
|
|
1
|
+
class TLD
|
2
|
+
class SponsoredTld < TLD
|
3
|
+
def type
|
4
|
+
:sponsored
|
5
|
+
end
|
6
|
+
class AERO < SponsoredTld #:nodoc:
|
7
|
+
self.tld = %q{aero}
|
8
|
+
end
|
9
|
+
class ASIA < SponsoredTld #:nodoc:
|
10
|
+
self.tld = %q{asia}
|
11
|
+
end
|
12
|
+
class CAT < SponsoredTld #:nodoc:
|
13
|
+
self.tld = %q{cat}
|
14
|
+
end
|
15
|
+
class COOP < SponsoredTld #:nodoc:
|
16
|
+
self.tld = %q{coop}
|
17
|
+
end
|
18
|
+
class EDU < SponsoredTld #:nodoc:
|
19
|
+
self.tld = %q{edu}
|
20
|
+
end
|
21
|
+
class GOV < SponsoredTld #:nodoc:
|
22
|
+
self.tld = %q{gov}
|
23
|
+
end
|
24
|
+
class INT < SponsoredTld #:nodoc:
|
25
|
+
self.tld = %q{int}
|
26
|
+
end
|
27
|
+
class JOBS < SponsoredTld #:nodoc:
|
28
|
+
self.tld = %q{jobs}
|
29
|
+
end
|
30
|
+
class MIL < SponsoredTld #:nodoc:
|
31
|
+
self.tld = %q{mil}
|
32
|
+
end
|
33
|
+
class MOBI < SponsoredTld #:nodoc:
|
34
|
+
self.tld = %q{mobi}
|
35
|
+
end
|
36
|
+
class MUSEUM < SponsoredTld #:nodoc:
|
37
|
+
self.tld = %q{museum}
|
38
|
+
end
|
39
|
+
class TEL < SponsoredTld #:nodoc:
|
40
|
+
self.tld = %q{tel}
|
41
|
+
end
|
42
|
+
class TRAVEL < SponsoredTld #:nodoc:
|
43
|
+
self.tld = %q{travel}
|
44
|
+
end
|
45
|
+
end # end SponsoredTld
|
46
|
+
end # end TLD
|
data/lib/tld/tld.rb
ADDED
@@ -0,0 +1,104 @@
|
|
1
|
+
require 'singleton'
|
2
|
+
require 'rubygems'
|
3
|
+
require 'addressable/uri'
|
4
|
+
|
5
|
+
class TLD
|
6
|
+
MAP = {
|
7
|
+
:ac => 'sh',
|
8
|
+
:uk => 'gb',
|
9
|
+
:su => 'ru',
|
10
|
+
:tp => 'tl',
|
11
|
+
:yu => 'rs'
|
12
|
+
}
|
13
|
+
|
14
|
+
include Singleton
|
15
|
+
|
16
|
+
class UnknownTldError < StandardError; end
|
17
|
+
|
18
|
+
def to_s
|
19
|
+
tld
|
20
|
+
end
|
21
|
+
|
22
|
+
def tld
|
23
|
+
self.class.tld
|
24
|
+
end
|
25
|
+
|
26
|
+
def name
|
27
|
+
self.class.name
|
28
|
+
end
|
29
|
+
|
30
|
+
def main_currency
|
31
|
+
self.class.main_currency
|
32
|
+
end
|
33
|
+
|
34
|
+
def currency
|
35
|
+
self.class.main_currency
|
36
|
+
end
|
37
|
+
|
38
|
+
def currencies
|
39
|
+
self.class.currencies
|
40
|
+
end
|
41
|
+
|
42
|
+
def alpha3
|
43
|
+
self.class.alpha3
|
44
|
+
end
|
45
|
+
|
46
|
+
class << self
|
47
|
+
attr_accessor :tld
|
48
|
+
|
49
|
+
@@tlds = []
|
50
|
+
|
51
|
+
def inherited(tld) #:nodoc:
|
52
|
+
super
|
53
|
+
@@tlds << tld.instance unless self == TLD
|
54
|
+
end
|
55
|
+
|
56
|
+
def all
|
57
|
+
@@tlds.uniq
|
58
|
+
end
|
59
|
+
|
60
|
+
def name
|
61
|
+
Name.find(self)
|
62
|
+
end
|
63
|
+
|
64
|
+
def currencies
|
65
|
+
Currency.find(self)
|
66
|
+
end
|
67
|
+
|
68
|
+
def alpha3
|
69
|
+
Alpha3.find(self)
|
70
|
+
end
|
71
|
+
|
72
|
+
def main_currency
|
73
|
+
currencies.first
|
74
|
+
end
|
75
|
+
|
76
|
+
alias_method :currency, :main_currency
|
77
|
+
|
78
|
+
def find(str)
|
79
|
+
host = normalized_host(str)
|
80
|
+
host = str.downcase if host == ''
|
81
|
+
last = host.match(/\./) ? host.split('.').last : host # Take the last one of foo.bar.baz
|
82
|
+
instance = all.select { |t| t.tld == last }.first
|
83
|
+
|
84
|
+
raise UnknownTldError, "TLD '#{str}' unkown." if instance.nil?
|
85
|
+
|
86
|
+
instance
|
87
|
+
end
|
88
|
+
|
89
|
+
def has_valid_tld?(str)
|
90
|
+
str = normalized_host(str)
|
91
|
+
str.match(/\./) ? self.valid?(str.split('.').last) : self.valid?(str)
|
92
|
+
end
|
93
|
+
|
94
|
+
def valid?(tld)
|
95
|
+
!!all.select { |t| t.to_s == tld.downcase }.first
|
96
|
+
end
|
97
|
+
|
98
|
+
private
|
99
|
+
|
100
|
+
def normalized_host(str)
|
101
|
+
Addressable::URI.heuristic_parse(str).normalized_host.to_s rescue str
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
data/test/tld_test.rb
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'tld'
|
3
|
+
require 'shoulda'
|
4
|
+
|
5
|
+
class TestTld < Test::Unit::TestCase
|
6
|
+
should 'find TLD by exact match' do
|
7
|
+
assert_equal 'au', TLD.find('au').tld
|
8
|
+
end
|
9
|
+
|
10
|
+
should 'find TLD by exact match with dot' do
|
11
|
+
assert_equal 'au', TLD.find('.au').tld
|
12
|
+
end
|
13
|
+
|
14
|
+
should 'find TLD with case' do
|
15
|
+
assert_equal 'au', TLD.find('AU').tld
|
16
|
+
end
|
17
|
+
|
18
|
+
should 'find TLD by hostname' do
|
19
|
+
assert_equal 'au', TLD.find('foo.bar.au').tld
|
20
|
+
end
|
21
|
+
|
22
|
+
should 'find TLD by url' do
|
23
|
+
assert_equal 'au', TLD.find('http://foo.bar.au/baz').tld
|
24
|
+
end
|
25
|
+
|
26
|
+
should 'get TLD currency' do
|
27
|
+
assert_equal 'AUD', TLD.find('au').currency
|
28
|
+
end
|
29
|
+
|
30
|
+
should 'get mapped TLD currency' do
|
31
|
+
assert_equal 'EUR', TLD.find('eu').currency
|
32
|
+
assert_equal 'GBP', TLD.find('uk').currency
|
33
|
+
end
|
34
|
+
|
35
|
+
should 'get TLD name' do
|
36
|
+
assert_equal 'Australia', TLD.find('au').name
|
37
|
+
assert_equal 'Business', TLD.find('biz').name
|
38
|
+
end
|
39
|
+
|
40
|
+
should 'get iso alpha3 code' do
|
41
|
+
assert_equal 'AUS', TLD.find('au').alpha3
|
42
|
+
assert_equal 'GBR', TLD.find('uk').alpha3
|
43
|
+
end
|
44
|
+
|
45
|
+
should 'get TLD as a string' do
|
46
|
+
tld = TLD.find('au')
|
47
|
+
|
48
|
+
assert_equal 'au', tld.to_s
|
49
|
+
assert_equal tld.tld, tld.to_s
|
50
|
+
end
|
51
|
+
|
52
|
+
should 'com should map to empty currency (not Comoros)' do
|
53
|
+
assert_equal [], TLD.find('com').currencies
|
54
|
+
assert_nil TLD.find('com').currency
|
55
|
+
end
|
56
|
+
|
57
|
+
should 'raise exception when TLD is unknown' do
|
58
|
+
assert_raises TLD::UnknownTldError do
|
59
|
+
TLD.find('foo')
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
should 'confirm that TLD is valid' do
|
64
|
+
assert TLD.valid?('au')
|
65
|
+
assert TLD.valid?('AU')
|
66
|
+
end
|
67
|
+
|
68
|
+
should 'confirm that TLD is invalid' do
|
69
|
+
assert_equal false, TLD.valid?('not-a-tld')
|
70
|
+
end
|
71
|
+
|
72
|
+
should 'confirm that hostname has a valid TLD' do
|
73
|
+
assert TLD.has_valid_tld?('foo.com.au')
|
74
|
+
assert TLD.has_valid_tld?('http://foo.com.au/bar')
|
75
|
+
end
|
76
|
+
|
77
|
+
should 'confirm that hostname does not have a valid TLD' do
|
78
|
+
assert_equal false, TLD.has_valid_tld?('foo.bar')
|
79
|
+
assert_equal false, TLD.has_valid_tld?('http://foo.bar')
|
80
|
+
end
|
81
|
+
|
82
|
+
should 'raise UnknownTldError if string cannot be parsed by Addressable::URI' do
|
83
|
+
assert_raises TLD::UnknownTldError do
|
84
|
+
TLD.find('foo:')
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
metadata
ADDED
@@ -0,0 +1,113 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: tld
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 5
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 6
|
9
|
+
- 1
|
10
|
+
version: 0.6.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- alex
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2010-05-20 00:00:00 +01:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: iso_country_codes
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 19
|
30
|
+
segments:
|
31
|
+
- 0
|
32
|
+
- 2
|
33
|
+
- 2
|
34
|
+
version: 0.2.2
|
35
|
+
type: :runtime
|
36
|
+
version_requirements: *id001
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: addressable
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ">="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
hash: 3
|
46
|
+
segments:
|
47
|
+
- 0
|
48
|
+
version: "0"
|
49
|
+
type: :runtime
|
50
|
+
version_requirements: *id002
|
51
|
+
description: Top-level domain library
|
52
|
+
email: alexrabarts@gmail.com
|
53
|
+
executables: []
|
54
|
+
|
55
|
+
extensions: []
|
56
|
+
|
57
|
+
extra_rdoc_files:
|
58
|
+
- README.rdoc
|
59
|
+
files:
|
60
|
+
- History.txt
|
61
|
+
- Manifest.txt
|
62
|
+
- README.rdoc
|
63
|
+
- VERSION.yml
|
64
|
+
- lib/tld/alpha3.rb
|
65
|
+
- lib/tld/cc_tld.rb
|
66
|
+
- lib/tld/currency.rb
|
67
|
+
- lib/tld/generic_tld.rb
|
68
|
+
- lib/tld/infrastructure_tld.rb
|
69
|
+
- lib/tld/name.rb
|
70
|
+
- lib/tld/pseudo_tld.rb
|
71
|
+
- lib/tld/reserved_tld.rb
|
72
|
+
- lib/tld/retired_tld.rb
|
73
|
+
- lib/tld/sponsored_tld.rb
|
74
|
+
- lib/tld/tld.rb
|
75
|
+
- lib/tld.rb
|
76
|
+
- test/tld_test.rb
|
77
|
+
has_rdoc: true
|
78
|
+
homepage: http://github.com/alexrabarts/tld
|
79
|
+
licenses: []
|
80
|
+
|
81
|
+
post_install_message:
|
82
|
+
rdoc_options:
|
83
|
+
- --inline-source
|
84
|
+
- --charset=UTF-8
|
85
|
+
require_paths:
|
86
|
+
- lib
|
87
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
88
|
+
none: false
|
89
|
+
requirements:
|
90
|
+
- - ">="
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
hash: 3
|
93
|
+
segments:
|
94
|
+
- 0
|
95
|
+
version: "0"
|
96
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ">="
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
hash: 3
|
102
|
+
segments:
|
103
|
+
- 0
|
104
|
+
version: "0"
|
105
|
+
requirements: []
|
106
|
+
|
107
|
+
rubyforge_project:
|
108
|
+
rubygems_version: 1.3.7
|
109
|
+
signing_key:
|
110
|
+
specification_version: 3
|
111
|
+
summary: Provides meta information for Internet Top Level Domains (TLDs).
|
112
|
+
test_files: []
|
113
|
+
|