dominatrix 1.0.0 → 1.1.0
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
- data/README.md +30 -2
- data/lib/dominatrix.rb +46 -33
- data/lib/dominatrix/version.rb +2 -2
- data/lib/extensions.txt +17 -17
- data/spec/dominatrix_spec.rb +29 -6
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6f7dda304ebe0f6acbb19b84cc811183cc9d1ab7
|
4
|
+
data.tar.gz: 77c378c2062ebf1c670c7c903c4c4d613cd761d4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f39a2448d7690076771e0f96167bc40f9f70df40e2acb63ac6842551588772c984cf9765eca4719b3cc8f0d29d852a090942f9bae431282444bab55bb84f9cf5
|
7
|
+
data.tar.gz: ef9561efae2e81a8e4de83f1752bb87a8c90828460c4bab3e570694db3fa743e90e2af0479bf51f585aeecff988bb30f62003e93274e754ec1650523b5c89cc3
|
data/README.md
CHANGED
@@ -22,8 +22,12 @@ Or install it yourself as:
|
|
22
22
|
|
23
23
|
### Parsing Domains
|
24
24
|
|
25
|
-
|
26
|
-
|
25
|
+
There are two approaches to parsing domains with Dominatrix: `Dominatrix.parse`
|
26
|
+
and `Dominatrix#parse`.
|
27
|
+
|
28
|
+
#### Dominatrix.parse
|
29
|
+
|
30
|
+
Call the `Dominatrix.parse` method with a URI object or parseable URI string.
|
27
31
|
|
28
32
|
```ruby
|
29
33
|
Dominatrix.parse('http://www.google.com')
|
@@ -62,6 +66,30 @@ following errors will be raised:
|
|
62
66
|
parsed.
|
63
67
|
* `Dominatrix::NotFoundError`: the URI does not contain a valid domain name.
|
64
68
|
|
69
|
+
#### Dominatrix#parse
|
70
|
+
|
71
|
+
Instantiate a `Dominatrix` object by passing in an optional set of valid domain
|
72
|
+
extensions. By default, this value is set to `Dominatrix.default_extensions`.
|
73
|
+
|
74
|
+
```ruby
|
75
|
+
dominatrix = Dominatrix.new
|
76
|
+
# => #<Dominatrix:0x007fda8428a8f0 @extensions=#<Set: {".ac", ".com.ac", ".gov.ac", ".mil.ac", ... }>>
|
77
|
+
|
78
|
+
dominatrix = Dominatrix.new(%w[.com .net].to_set)
|
79
|
+
# => #<Dominatrix:0x007fda823861c0 @extensions=#<Set: {".com", ".net"}>>
|
80
|
+
```
|
81
|
+
|
82
|
+
Once instantiated, call the `#parse` method with a URI object or parseable URI
|
83
|
+
string.
|
84
|
+
|
85
|
+
```ruby
|
86
|
+
dominatrix.parse('http://www.google.com')
|
87
|
+
# => "google.com"
|
88
|
+
|
89
|
+
dominatrix.parse('http://www.google.foo')
|
90
|
+
# => Dominatrix::NotFoundError: no matching domain for "http://www.google.foo"
|
91
|
+
```
|
92
|
+
|
65
93
|
### Domain Extensions
|
66
94
|
|
67
95
|
To see the list of domain extensions built into the gem, call the
|
data/lib/dominatrix.rb
CHANGED
@@ -2,49 +2,62 @@ require 'set'
|
|
2
2
|
require 'uri'
|
3
3
|
require 'dominatrix/version'
|
4
4
|
|
5
|
-
|
5
|
+
class Dominatrix
|
6
6
|
class NotFoundError < StandardError; end
|
7
7
|
|
8
|
-
|
9
|
-
def parse(uri, extensions = default_extensions)
|
10
|
-
uri = URI.parse(uri) if uri.is_a?(String)
|
11
|
-
raise ArgumentError, '`uri` must be a String or URI' unless uri.is_a?(URI)
|
12
|
-
raise ArgumentError, '`uri` must include a host' if uri.host.nil?
|
13
|
-
raise ArgumentError, '`extensions` must be Enumerable' unless extensions.is_a?(Enumerable)
|
8
|
+
attr_reader :extensions
|
14
9
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
end
|
10
|
+
def initialize(extensions = self.class.default_extensions)
|
11
|
+
self.extensions = extensions
|
12
|
+
end
|
19
13
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
end
|
25
|
-
end
|
14
|
+
def parse(uri)
|
15
|
+
uri = URI.parse(uri) if uri.is_a?(String)
|
16
|
+
raise ArgumentError, '`uri` must be a String or URI' unless uri.is_a?(URI)
|
17
|
+
raise ArgumentError, '`uri` must include a host' if uri.host.nil?
|
26
18
|
|
27
|
-
|
19
|
+
domain = extract_domain(uri.host)
|
20
|
+
raise NotFoundError, "no matching domain for \"#{uri}\"" if domain.nil?
|
21
|
+
domain
|
22
|
+
end
|
28
23
|
|
29
|
-
|
30
|
-
parts = host.split('.')
|
31
|
-
last_found_domain = nil
|
24
|
+
private
|
32
25
|
|
33
|
-
|
34
|
-
|
35
|
-
|
26
|
+
def extensions=(extensions)
|
27
|
+
raise ArgumentError, '`extensions` must be Enumerable' unless extensions.is_a?(Enumerable)
|
28
|
+
raise ArgumentError, '`extensions` must all start with "."' unless extensions.all? { |s| s.start_with?('.') }
|
29
|
+
@extensions = extensions
|
30
|
+
end
|
36
31
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
32
|
+
def extract_domain(host)
|
33
|
+
parts = host.split('.')
|
34
|
+
last_found_domain = nil
|
35
|
+
|
36
|
+
parts.size.times.each do |n|
|
37
|
+
offset = parts.size - n - 1
|
38
|
+
lookup = '.' + parts[offset..-1].join('.')
|
39
|
+
|
40
|
+
if extensions.include?(lookup)
|
41
|
+
last_found_domain = lookup
|
42
|
+
elsif last_found_domain
|
43
|
+
last_found_domain = parts[offset] + last_found_domain
|
44
|
+
break
|
45
|
+
else
|
46
|
+
break
|
45
47
|
end
|
48
|
+
end
|
49
|
+
|
50
|
+
last_found_domain
|
51
|
+
end
|
52
|
+
|
53
|
+
def self.parse(uri, extensions = default_extensions)
|
54
|
+
new(extensions).parse(uri)
|
55
|
+
end
|
46
56
|
|
47
|
-
|
57
|
+
def self.default_extensions
|
58
|
+
@default_domains ||= begin
|
59
|
+
file = File.join(File.dirname(__FILE__), 'extensions.txt')
|
60
|
+
File.readlines(file).map(&:strip).delete_if(&:empty?).to_set
|
48
61
|
end
|
49
62
|
end
|
50
63
|
end
|
data/lib/dominatrix/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
|
2
|
-
VERSION = '1.
|
1
|
+
class Dominatrix
|
2
|
+
VERSION = '1.1.0'
|
3
3
|
end
|
data/lib/extensions.txt
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
|
1
|
+
.ac
|
2
2
|
.com.ac
|
3
3
|
.gov.ac
|
4
4
|
.mil.ac
|
@@ -9,7 +9,7 @@
|
|
9
9
|
.ad
|
10
10
|
.nom.ad
|
11
11
|
.ae
|
12
|
-
|
12
|
+
.امارات
|
13
13
|
.co.ae
|
14
14
|
.net.ae
|
15
15
|
.org.ae
|
@@ -550,7 +550,7 @@
|
|
550
550
|
.web.do
|
551
551
|
.domains
|
552
552
|
.dz
|
553
|
-
|
553
|
+
.الجزائر
|
554
554
|
.com.dz
|
555
555
|
.art.dz
|
556
556
|
.asso.dz
|
@@ -582,7 +582,7 @@
|
|
582
582
|
.org.ee
|
583
583
|
.pri.ee
|
584
584
|
.eg
|
585
|
-
|
585
|
+
.مصر
|
586
586
|
.com.eg
|
587
587
|
.edu.eg
|
588
588
|
.eun.eg
|
@@ -868,7 +868,7 @@
|
|
868
868
|
.in
|
869
869
|
.ભારત
|
870
870
|
.भारत
|
871
|
-
|
871
|
+
.بھارت
|
872
872
|
.ਭਾਰਤ
|
873
873
|
.இந்தியா
|
874
874
|
.co.in
|
@@ -905,7 +905,7 @@
|
|
905
905
|
.org.iq
|
906
906
|
.tv.iq
|
907
907
|
.ir
|
908
|
-
|
908
|
+
.ایران
|
909
909
|
.ac.ir
|
910
910
|
.co.ir
|
911
911
|
.id.ir
|
@@ -930,7 +930,7 @@
|
|
930
930
|
.jm
|
931
931
|
.com.jm
|
932
932
|
.jo
|
933
|
-
|
933
|
+
.الاردن
|
934
934
|
.com.jo
|
935
935
|
.edu.jo
|
936
936
|
.gov.jo
|
@@ -1140,7 +1140,7 @@
|
|
1140
1140
|
.sch.ly
|
1141
1141
|
.mex.com
|
1142
1142
|
.ma
|
1143
|
-
|
1143
|
+
.المغرب
|
1144
1144
|
.co.ma
|
1145
1145
|
.net.ma
|
1146
1146
|
.org.ma
|
@@ -1268,7 +1268,7 @@
|
|
1268
1268
|
.edu.mx
|
1269
1269
|
.gob.mx
|
1270
1270
|
.my
|
1271
|
-
|
1271
|
+
.مليسيا
|
1272
1272
|
.com.my
|
1273
1273
|
.net.my
|
1274
1274
|
.org.my
|
@@ -1377,7 +1377,7 @@
|
|
1377
1377
|
.health.nz
|
1378
1378
|
.parliament.nz
|
1379
1379
|
.om
|
1380
|
-
|
1380
|
+
.عمان
|
1381
1381
|
.co.om
|
1382
1382
|
.com.om
|
1383
1383
|
.ac.om
|
@@ -1438,7 +1438,7 @@
|
|
1438
1438
|
.pictures
|
1439
1439
|
.pink
|
1440
1440
|
.pk
|
1441
|
-
|
1441
|
+
.پاکستان
|
1442
1442
|
.com.pk
|
1443
1443
|
.net.pk
|
1444
1444
|
.org.pk
|
@@ -1665,7 +1665,7 @@
|
|
1665
1665
|
.productions
|
1666
1666
|
.properties
|
1667
1667
|
.ps
|
1668
|
-
|
1668
|
+
.فلسطين
|
1669
1669
|
.com.ps
|
1670
1670
|
.net.ps
|
1671
1671
|
.org.ps
|
@@ -1697,7 +1697,7 @@
|
|
1697
1697
|
.org.py
|
1698
1698
|
.qc.com
|
1699
1699
|
.qa
|
1700
|
-
|
1700
|
+
.قطر
|
1701
1701
|
.com.qa
|
1702
1702
|
.net.qa
|
1703
1703
|
.org.qa
|
@@ -1781,7 +1781,7 @@
|
|
1781
1781
|
.org.sa
|
1782
1782
|
.pub.sa
|
1783
1783
|
.sch.sa
|
1784
|
-
|
1784
|
+
.السعودية
|
1785
1785
|
.com.sb
|
1786
1786
|
.net.sb
|
1787
1787
|
.org.sb
|
@@ -1911,7 +1911,7 @@
|
|
1911
1911
|
.red.sv
|
1912
1912
|
.sx
|
1913
1913
|
.sy
|
1914
|
-
|
1914
|
+
.سوريا
|
1915
1915
|
.systems
|
1916
1916
|
.co.sz
|
1917
1917
|
.sz
|
@@ -1965,7 +1965,7 @@
|
|
1965
1965
|
.org.tl
|
1966
1966
|
.tm
|
1967
1967
|
.tn
|
1968
|
-
|
1968
|
+
.تونس
|
1969
1969
|
.com.tn
|
1970
1970
|
.net.tn
|
1971
1971
|
.org.tn
|
@@ -2227,7 +2227,7 @@
|
|
2227
2227
|
.xxx
|
2228
2228
|
.xyz
|
2229
2229
|
.ye
|
2230
|
-
|
2230
|
+
.اليمن
|
2231
2231
|
.co.ye
|
2232
2232
|
.com.ye
|
2233
2233
|
.gov.ye
|
data/spec/dominatrix_spec.rb
CHANGED
@@ -2,9 +2,7 @@
|
|
2
2
|
require 'spec_helper'
|
3
3
|
|
4
4
|
RSpec.describe Dominatrix do
|
5
|
-
|
6
|
-
|
7
|
-
describe '.parse' do
|
5
|
+
describe '#parse' do
|
8
6
|
shared_examples_for 'a valid URL' do |domain|
|
9
7
|
it 'returns the domain when given a string' do
|
10
8
|
expect(subject.parse(url)).to eq domain
|
@@ -48,24 +46,49 @@ RSpec.describe Dominatrix do
|
|
48
46
|
end
|
49
47
|
|
50
48
|
describe 'when given a custom list of extensions' do
|
49
|
+
subject { described_class.new(extensions) }
|
50
|
+
|
51
51
|
let(:extensions) { %w[.uk .co.uk].to_set }
|
52
52
|
|
53
53
|
it 'returns the domain for a valid URI' do
|
54
|
-
expect(subject.parse('http://www.example.co.uk'
|
54
|
+
expect(subject.parse('http://www.example.co.uk')).to eq 'example.co.uk'
|
55
55
|
end
|
56
56
|
|
57
57
|
it 'raises an error for an invalid URI' do
|
58
|
-
expect { subject.parse('http://www.example.com'
|
58
|
+
expect { subject.parse('http://www.example.com') }.to raise_error Dominatrix::NotFoundError
|
59
59
|
end
|
60
60
|
end
|
61
61
|
end
|
62
62
|
|
63
|
+
describe '.parse' do
|
64
|
+
subject { described_class }
|
65
|
+
|
66
|
+
let(:url) { 'http://www.google.com' }
|
67
|
+
|
68
|
+
it 'delegates to a new instance' do
|
69
|
+
instance = subject.new
|
70
|
+
allow(subject).to receive(:new).and_return(instance)
|
71
|
+
expect(instance).to receive(:parse).with(url)
|
72
|
+
subject.parse(url)
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'includes the provided extension list' do
|
76
|
+
extensions = %w[.uk .co.uk].to_set
|
77
|
+
instance = subject.new(extensions)
|
78
|
+
allow(subject).to receive(:new).with(extensions).and_return(instance)
|
79
|
+
expect(instance).to receive(:parse).with(url)
|
80
|
+
subject.parse(url, extensions)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
63
84
|
describe '.default_extensions' do
|
85
|
+
subject { described_class }
|
86
|
+
|
64
87
|
it 'returns a set' do
|
65
88
|
expect(subject.default_extensions).to be_a Set
|
66
89
|
end
|
67
90
|
|
68
|
-
it 'prefixes each extension with a dot'
|
91
|
+
it 'prefixes each extension with a dot' do
|
69
92
|
expect(subject.default_extensions).to all start_with('.')
|
70
93
|
end
|
71
94
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dominatrix
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matt Huggins
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-12-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|