rippersnapper 0.0.8 → 0.0.9

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7202bdd1f9dc7fa438a08db2f2a6e09482033ee5
4
- data.tar.gz: 287f5995cb970c67673b50ac2982215ea8fe6515
3
+ metadata.gz: 2f34bb9857cd7aaebeade923e85ea856d187a2e9
4
+ data.tar.gz: ccc1cf211881f9d27fd6bccc3fd2c302143f1960
5
5
  SHA512:
6
- metadata.gz: 1861dada6eb732b7b5bf1eeee82e83bc1168ef06385ffa9c3aa619d645b6eee6a5d975519d6273fefd5c3db75da284d3085551d619cda24f43f7289dc295d3ba
7
- data.tar.gz: a7d4a01f0ea5e3319a6517a432d86d460b7aa8348dc4b35eb963aec412f661cb661d893095bb5ee0f64e08d2cdcc233439ab81f80c33bc81840dd8f328f38f5c
6
+ metadata.gz: 467c606b219291dc375c0eb276ce8bd9199551058f5b0081d065f83e6288ce2b960b8795b428844209d375f2e37de18207c80fb4a6efe4be0ad0cb8fe146475c
7
+ data.tar.gz: 3f9da79c65b973bbfa0e586b7ade9d0304b44bb9157c5012856ce88c4a9a26fa79fa0a4723ddfd589fdadea4c3be81c7af0fb65f4c54ac15b947a51b93f43dba
@@ -7,5 +7,3 @@ rvm:
7
7
  - ruby-head
8
8
  - 2.1.0
9
9
  - 2.0.0
10
- - 1.9.3
11
- - jruby-19mode
data/README.md CHANGED
@@ -36,6 +36,13 @@ Or install it yourself as:
36
36
  url.subdomain # => "foo.bar"
37
37
  url.path # => "/asdf.html?q=arg"
38
38
 
39
+ # optionally preload suffixes file to avoid loading on each call to `#parse`
40
+ Rippersnapper.load_suffixes
41
+ # subsequent calls to parse will use the same `SuffixFileReader` instance
42
+
43
+ # unloading the suffixes simply sets the internal variable to `nil`
44
+ Rippersnapper.unload_suffixes
45
+
39
46
  ## Notable differences between Rippersnapper and [Domainatrix](https://github.com/pauldix/domainatrix)
40
47
 
41
48
  One of Rippersnappers goals is to be a compatible API with Domainatrix, but
@@ -8,4 +8,26 @@ module Rippersnapper
8
8
  def self.parse url
9
9
  Url.new url
10
10
  end
11
+
12
+ # Load public suffix file into class instance var to be reused
13
+ #
14
+ # @return [void]
15
+ def self.load_suffixes file = nil
16
+ @suffix_file_reader = SuffixFileReader.new(file)
17
+ end
18
+
19
+ # Accessor for loaded suffix reader
20
+ #
21
+ # @return [SuffixFileReader]
22
+ # @return [nil] if not loaded
23
+ def self.suffix_file_reader
24
+ @suffix_file_reader
25
+ end
26
+
27
+ # Unload public suffix file
28
+ #
29
+ # @return [void]
30
+ def self.unload_suffixes
31
+ @suffix_file_reader = nil
32
+ end
11
33
  end
@@ -60,7 +60,8 @@ module Rippersnapper
60
60
  end
61
61
 
62
62
  def suffix_reader
63
- @suffix_reader ||= SuffixFileReader.new
63
+ @suffix_reader ||= (Rippersnapper.suffix_file_reader ||
64
+ SuffixFileReader.new)
64
65
  end
65
66
  end
66
67
  end
@@ -1,3 +1,3 @@
1
1
  module Rippersnapper
2
- VERSION = "0.0.8"
2
+ VERSION = "0.0.9"
3
3
  end
@@ -20,5 +20,5 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.add_development_dependency "bundler", "~> 1.3"
22
22
  spec.add_development_dependency "rake"
23
- spec.add_development_dependency "rspec", "~> 2.13.0"
23
+ spec.add_development_dependency "rspec", "~> 3.3"
24
24
  end
@@ -6,24 +6,73 @@ module Rippersnapper
6
6
 
7
7
  context "simple domain" do
8
8
  subject { DomainParser.new "www.google.com" }
9
- its(:subdomain) { should eq "www" }
10
- its(:domain) { should eq "google" }
11
- its(:suffix) { should eq "com" }
9
+
10
+ describe '#subdomain' do
11
+ subject { super().subdomain }
12
+ it { is_expected.to eq "www" }
13
+ end
14
+
15
+ describe '#domain' do
16
+ subject { super().domain }
17
+ it { is_expected.to eq "google" }
18
+ end
19
+
20
+ describe '#suffix' do
21
+ subject { super().suffix }
22
+ it { is_expected.to eq "com" }
23
+ end
12
24
  end
13
25
 
14
26
  context "complex domain" do
15
27
  subject { DomainParser.new "my.drive.google.whatever.sapporo.jp" }
16
- its(:subdomain) { should eq "my.drive" }
17
- its(:domain) { should eq "google" }
18
- its(:suffix) { should eq "whatever.sapporo.jp" }
28
+
29
+ describe '#subdomain' do
30
+ subject { super().subdomain }
31
+ it { is_expected.to eq "my.drive" }
32
+ end
33
+
34
+ describe '#domain' do
35
+ subject { super().domain }
36
+ it { is_expected.to eq "google" }
37
+ end
38
+
39
+ describe '#suffix' do
40
+ subject { super().suffix }
41
+ it { is_expected.to eq "whatever.sapporo.jp" }
42
+ end
19
43
  end
20
44
 
21
45
  context "empty url" do
22
46
  subject { DomainParser.new "" }
23
- its(:subdomain) { should eq "" }
24
- its(:domain) { should eq "" }
25
- its(:suffix) { should eq "" }
47
+
48
+ describe '#subdomain' do
49
+ subject { super().subdomain }
50
+ it { is_expected.to eq "" }
51
+ end
52
+
53
+ describe '#domain' do
54
+ subject { super().domain }
55
+ it { is_expected.to eq "" }
56
+ end
57
+
58
+ describe '#suffix' do
59
+ subject { super().suffix }
60
+ it { is_expected.to eq "" }
61
+ end
26
62
  end
27
63
 
64
+ context "preloaded suffix file" do
65
+ before { Rippersnapper.load_suffixes }
66
+ after { Rippersnapper.unload_suffixes }
67
+
68
+ subject { described_class.new("").send(:suffix_reader) }
69
+
70
+ it { is_expected.to be_kind_of SuffixFileReader }
71
+
72
+ it "uses the preloaded reader" do
73
+ expect(subject.object_id)
74
+ .to eq(Rippersnapper.suffix_file_reader.object_id)
75
+ end
76
+ end
28
77
  end
29
78
  end
@@ -8,56 +8,64 @@ module Rippersnapper
8
8
  describe '#initialize' do
9
9
 
10
10
  context 'passing in a file' do
11
- let(:file) { stub :file, each_line: [] }
11
+ let(:file) { double :file, each_line: [] }
12
12
  subject { SuffixFileReader.new file }
13
- its(:file) { should be file}
13
+
14
+ describe '#file' do
15
+ subject { super().file }
16
+ it { is_expected.to be file}
17
+ end
14
18
  end
15
19
 
16
20
  context 'file default' do
17
21
  subject { SuffixFileReader.new }
18
- its(:file) { should be_a_kind_of File }
22
+
23
+ describe '#file' do
24
+ subject { super().file }
25
+ it { is_expected.to be_a_kind_of File }
26
+ end
19
27
  end
20
28
  end
21
29
 
22
30
  describe '#contains?' do
23
31
  subject { SuffixFileReader.new }
24
32
 
25
- it { should respond_to :contains? }
33
+ it { is_expected.to respond_to :contains? }
26
34
 
27
35
  context "matching valid data" do
28
36
 
29
37
  it 'matches a single suffix' do
30
- expect(subject.contains?("com")).to be_true
38
+ expect(subject.contains?("com")).to be_truthy
31
39
  end
32
40
 
33
41
  it 'matches a nested suffix' do
34
- expect(subject.contains?("la.us")).to be_true
42
+ expect(subject.contains?("la.us")).to be_truthy
35
43
  end
36
44
 
37
45
  it 'matches a suffix with a single asterix' do
38
- expect(subject.contains?("whatever.uk")).to be_true
46
+ expect(subject.contains?("whatever.uk")).to be_truthy
39
47
  end
40
48
 
41
49
  it 'matches a suffix with multiple asterix' do
42
- expect(subject.contains?("whatever.sapporo.jp")).to be_true
50
+ expect(subject.contains?("whatever.sapporo.jp")).to be_truthy
43
51
  end
44
52
  end
45
53
 
46
54
  context "rejecting invalid data" do
47
55
  it "doesn't match suffix that is not in file" do
48
- expect(subject.contains?("baz")).to be_false
56
+ expect(subject.contains?("baz")).to be_falsey
49
57
  end
50
58
 
51
59
  it "doesn't match complex suffix that are not in file" do
52
- expect(subject.contains?("doesnt.exist.sapporo.jp")).to be_false
60
+ expect(subject.contains?("doesnt.exist.sapporo.jp")).to be_falsey
53
61
  end
54
62
 
55
63
  it "doesn't match comments" do
56
- expect(subject.contains?("// comment")).to be_false
64
+ expect(subject.contains?("// comment")).to be_falsey
57
65
  end
58
66
 
59
67
  it "doesn't match empty lines" do
60
- expect(subject.contains?("")).to be_false
68
+ expect(subject.contains?("")).to be_falsey
61
69
  end
62
70
  end
63
71
  end
@@ -5,67 +5,203 @@ module Rippersnapper
5
5
  describe Url do
6
6
  subject { Url.new "www.google.com" }
7
7
 
8
- it { should respond_to :domain }
9
- it { should respond_to :scheme }
10
- it { should respond_to :host }
11
- it { should respond_to :path }
12
- it { should respond_to :url }
13
- it { should respond_to :suffix }
14
- it { should respond_to :subdomain }
15
- it { should respond_to :port }
8
+ it { is_expected.to respond_to :domain }
9
+ it { is_expected.to respond_to :scheme }
10
+ it { is_expected.to respond_to :host }
11
+ it { is_expected.to respond_to :path }
12
+ it { is_expected.to respond_to :url }
13
+ it { is_expected.to respond_to :suffix }
14
+ it { is_expected.to respond_to :subdomain }
15
+ it { is_expected.to respond_to :port }
16
16
 
17
17
  context "with a scheme" do
18
18
  subject { Url.new "http://drive.google.com:91/micah" }
19
- its(:url) { should eq "http://drive.google.com:91/micah" }
20
- its(:path) { should eq "/micah" }
21
- its(:scheme) { should eq "http" }
22
- its(:host) { should eq "drive.google.com" }
23
- its(:suffix) { should eq "com" }
24
- its(:domain) { should eq "google" }
25
- its(:subdomain) { should eq "drive" }
26
- its(:port) { should eq 91 }
19
+
20
+ describe '#url' do
21
+ subject { super().url }
22
+ it { is_expected.to eq "http://drive.google.com:91/micah" }
23
+ end
24
+
25
+ describe '#path' do
26
+ subject { super().path }
27
+ it { is_expected.to eq "/micah" }
28
+ end
29
+
30
+ describe '#scheme' do
31
+ subject { super().scheme }
32
+ it { is_expected.to eq "http" }
33
+ end
34
+
35
+ describe '#host' do
36
+ subject { super().host }
37
+ it { is_expected.to eq "drive.google.com" }
38
+ end
39
+
40
+ describe '#suffix' do
41
+ subject { super().suffix }
42
+ it { is_expected.to eq "com" }
43
+ end
44
+
45
+ describe '#domain' do
46
+ subject { super().domain }
47
+ it { is_expected.to eq "google" }
48
+ end
49
+
50
+ describe '#subdomain' do
51
+ subject { super().subdomain }
52
+ it { is_expected.to eq "drive" }
53
+ end
54
+
55
+ describe '#port' do
56
+ subject { super().port }
57
+ it { is_expected.to eq 91 }
58
+ end
27
59
  end
28
60
 
29
61
  context "without a scheme" do
30
62
  subject { Url.new "www.google.com/micah" }
31
- its(:url) { should eq "http://www.google.com/micah" }
32
- its(:path) { should eq "/micah" }
33
- its(:scheme) { should eq "http" }
34
- its(:host) { should eq "www.google.com" }
35
- its(:suffix) { should eq "com" }
36
- its(:domain) { should eq "google" }
37
- its(:subdomain) { should eq "www" }
38
- its(:port) { should eq 80 }
63
+
64
+ describe '#url' do
65
+ subject { super().url }
66
+ it { is_expected.to eq "http://www.google.com/micah" }
67
+ end
68
+
69
+ describe '#path' do
70
+ subject { super().path }
71
+ it { is_expected.to eq "/micah" }
72
+ end
73
+
74
+ describe '#scheme' do
75
+ subject { super().scheme }
76
+ it { is_expected.to eq "http" }
77
+ end
78
+
79
+ describe '#host' do
80
+ subject { super().host }
81
+ it { is_expected.to eq "www.google.com" }
82
+ end
83
+
84
+ describe '#suffix' do
85
+ subject { super().suffix }
86
+ it { is_expected.to eq "com" }
87
+ end
88
+
89
+ describe '#domain' do
90
+ subject { super().domain }
91
+ it { is_expected.to eq "google" }
92
+ end
93
+
94
+ describe '#subdomain' do
95
+ subject { super().subdomain }
96
+ it { is_expected.to eq "www" }
97
+ end
98
+
99
+ describe '#port' do
100
+ subject { super().port }
101
+ it { is_expected.to eq 80 }
102
+ end
39
103
  end
40
104
 
41
105
  context "with a query string" do
42
106
  subject { Url.new "www.google.com/micah?date=today" }
43
- its(:path) { should eq "/micah?date=today" }
44
- its(:suffix) { should eq "com" }
45
- its(:domain) { should eq "google" }
107
+
108
+ describe '#path' do
109
+ subject { super().path }
110
+ it { is_expected.to eq "/micah?date=today" }
111
+ end
112
+
113
+ describe '#suffix' do
114
+ subject { super().suffix }
115
+ it { is_expected.to eq "com" }
116
+ end
117
+
118
+ describe '#domain' do
119
+ subject { super().domain }
120
+ it { is_expected.to eq "google" }
121
+ end
46
122
  end
47
123
 
48
124
  context "when url is nil" do
49
125
  subject {Url.new nil}
50
- its(:url) { should eq "" }
51
- its(:path) { should eq "" }
52
- its(:scheme) { should eq "" }
53
- its(:host) { should eq "" }
54
- its(:suffix) { should eq "" }
55
- its(:domain) { should eq "" }
56
- its(:subdomain) { should eq "" }
57
- its(:port) { should be_nil }
126
+
127
+ describe '#url' do
128
+ subject { super().url }
129
+ it { is_expected.to eq "" }
130
+ end
131
+
132
+ describe '#path' do
133
+ subject { super().path }
134
+ it { is_expected.to eq "" }
135
+ end
136
+
137
+ describe '#scheme' do
138
+ subject { super().scheme }
139
+ it { is_expected.to eq "" }
140
+ end
141
+
142
+ describe '#host' do
143
+ subject { super().host }
144
+ it { is_expected.to eq "" }
145
+ end
146
+
147
+ describe '#suffix' do
148
+ subject { super().suffix }
149
+ it { is_expected.to eq "" }
150
+ end
151
+
152
+ describe '#domain' do
153
+ subject { super().domain }
154
+ it { is_expected.to eq "" }
155
+ end
156
+
157
+ describe '#subdomain' do
158
+ subject { super().subdomain }
159
+ it { is_expected.to eq "" }
160
+ end
161
+
162
+ describe '#port' do
163
+ subject { super().port }
164
+ it { is_expected.to be_nil }
165
+ end
58
166
  end
59
167
 
60
168
  context "whith ip address" do
61
169
  subject { Url.new "http://10.0.1.1/" }
62
- its(:url) { should eq "http://10.0.1.1/" }
63
- its(:path) { should eq "/" }
64
- its(:scheme) { should eq "http" }
65
- its(:host) { should eq "10.0.1.1" }
66
- its(:suffix) { should eq "" }
67
- its(:domain) { should eq "10.0.1.1" }
68
- its(:subdomain) { should eq "" }
170
+
171
+ describe '#url' do
172
+ subject { super().url }
173
+ it { is_expected.to eq "http://10.0.1.1/" }
174
+ end
175
+
176
+ describe '#path' do
177
+ subject { super().path }
178
+ it { is_expected.to eq "/" }
179
+ end
180
+
181
+ describe '#scheme' do
182
+ subject { super().scheme }
183
+ it { is_expected.to eq "http" }
184
+ end
185
+
186
+ describe '#host' do
187
+ subject { super().host }
188
+ it { is_expected.to eq "10.0.1.1" }
189
+ end
190
+
191
+ describe '#suffix' do
192
+ subject { super().suffix }
193
+ it { is_expected.to eq "" }
194
+ end
195
+
196
+ describe '#domain' do
197
+ subject { super().domain }
198
+ it { is_expected.to eq "10.0.1.1" }
199
+ end
200
+
201
+ describe '#subdomain' do
202
+ subject { super().subdomain }
203
+ it { is_expected.to eq "" }
204
+ end
69
205
  end
70
206
  end
71
207
  end
@@ -1,6 +1,34 @@
1
1
  describe Rippersnapper do
2
2
  describe '::parse' do
3
3
  subject { Rippersnapper.parse "www.google.com" }
4
- it { should be_a_kind_of Rippersnapper::Url }
4
+ it { is_expected.to be_a_kind_of Rippersnapper::Url }
5
+ end
6
+
7
+ describe "::load_suffixes" do
8
+ subject { described_class.load_suffixes }
9
+ after { described_class.unload_suffixes }
10
+ it { is_expected.to be_a_kind_of described_class::SuffixFileReader }
11
+ end
12
+
13
+ describe "::suffix_file_reader" do
14
+ subject { described_class.suffix_file_reader }
15
+ it { is_expected.to be_nil }
16
+
17
+ context "with loaded suffixes" do
18
+ before { described_class.load_suffixes }
19
+ after { described_class.unload_suffixes }
20
+ it { is_expected.to be_a_kind_of described_class::SuffixFileReader }
21
+ end
22
+ end
23
+
24
+ describe "::unload_suffixes" do
25
+ before { described_class.load_suffixes }
26
+ after { described_class.unload_suffixes }
27
+
28
+ it "unloads suffixes" do
29
+ expect(described_class.suffix_file_reader).to_not be_nil
30
+ described_class.unload_suffixes
31
+ expect(described_class.suffix_file_reader).to be_nil
32
+ end
5
33
  end
6
34
  end
@@ -7,7 +7,6 @@ require 'rippersnapper'
7
7
  #
8
8
  # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
9
9
  RSpec.configure do |config|
10
- config.treat_symbols_as_metadata_keys_with_true_values = true
11
10
  config.run_all_when_everything_filtered = true
12
11
  config.filter_run :focus
13
12
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rippersnapper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.8
4
+ version: 0.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Micah Woods
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-05-07 00:00:00.000000000 Z
11
+ date: 2016-07-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -44,14 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 2.13.0
47
+ version: '3.3'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 2.13.0
54
+ version: '3.3'
55
55
  description: Rip and snap domains using Rippersnappers jaws of steele!
56
56
  email:
57
57
  - micahwoods@gmail.com
@@ -100,7 +100,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
100
100
  version: '0'
101
101
  requirements: []
102
102
  rubyforge_project:
103
- rubygems_version: 2.2.2
103
+ rubygems_version: 2.5.1
104
104
  signing_key:
105
105
  specification_version: 4
106
106
  summary: Named after the worst decepticon ever, a shark with T-Rex arms...