public_suffix_service 0.4.0 → 0.5.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.
- data/CHANGELOG.rdoc +7 -0
- data/README.rdoc +38 -12
- data/Rakefile +19 -8
- data/lib/public_suffix_service/domain.rb +106 -29
- data/lib/public_suffix_service/rule.rb +11 -14
- data/lib/public_suffix_service/rule_list.rb +50 -16
- data/lib/public_suffix_service/version.rb +2 -2
- data/lib/public_suffix_service.rb +10 -5
- data/public_suffix_service.gemspec +2 -2
- data/test/public_suffix_service/domain_test.rb +6 -1
- data/test/public_suffix_service/rule_list_test.rb +23 -1
- metadata +5 -5
data/CHANGELOG.rdoc
CHANGED
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
= Changelog
|
|
2
2
|
|
|
3
3
|
|
|
4
|
+
== Release 0.5.0
|
|
5
|
+
|
|
6
|
+
* CHANGED: Improve documentation for Domain#domain and Domain#subdomain (#1).
|
|
7
|
+
|
|
8
|
+
* CHANGED: Performance improvements (#2).
|
|
9
|
+
|
|
10
|
+
|
|
4
11
|
== Release 0.4.0
|
|
5
12
|
|
|
6
13
|
* CHANGED: Rename library from DomainName to PublicSuffixService to reduce the probability of name conflicts.
|
data/README.rdoc
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
= Public Suffix Service
|
|
2
2
|
|
|
3
|
-
Public Suffix Service is a Ruby domain name parser based on the Public Suffix List
|
|
3
|
+
*Public Suffix Service* is a Ruby domain name parser based on the {Public Suffix List}[http://publicsuffix.org].
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
== What is the Public Suffix List?
|
|
7
7
|
|
|
8
|
-
The Public Suffix List is a cross-vendor initiative to provide an accurate list of domain name suffixes.
|
|
8
|
+
The *Public Suffix List* is a cross-vendor initiative to provide an accurate list of domain name suffixes.
|
|
9
9
|
|
|
10
|
-
The Public Suffix List is an initiative of the Mozilla Project, but is maintained as a community resource. It is available for use in any software, but was originally created to meet the needs of browser manufacturers.
|
|
10
|
+
The *Public Suffix List* is an initiative of the Mozilla Project, but is maintained as a community resource. It is available for use in any software, but was originally created to meet the needs of browser manufacturers.
|
|
11
11
|
|
|
12
12
|
A "public suffix" is one under which Internet users can directly register names. Some examples of public suffixes are ".com", ".co.uk" and "pvt.k12.wy.us". The Public Suffix List is a list of all known public suffixes.
|
|
13
13
|
|
|
@@ -32,22 +32,22 @@ http://stackoverflow.com/questions/288810/get-the-subdomain-from-a-url
|
|
|
32
32
|
|
|
33
33
|
== Requirements
|
|
34
34
|
|
|
35
|
-
* Ruby >= 1.8.6
|
|
35
|
+
* Ruby >= 1.8.6 or Ruby 1.9.x
|
|
36
36
|
|
|
37
|
-
Successfully tested
|
|
37
|
+
Successfully tested with the following interpreters
|
|
38
38
|
|
|
39
39
|
* Ruby 1.8.6 / 1.8.7 / 1.9.1
|
|
40
|
-
* MacRuby
|
|
40
|
+
* MacRuby
|
|
41
41
|
* Ruby Enterprise Edition
|
|
42
42
|
|
|
43
43
|
|
|
44
44
|
== Installation
|
|
45
45
|
|
|
46
|
-
|
|
46
|
+
The best way to install *Public Suffix Service* is via {RubyGems}[http://www.rubygems.org].
|
|
47
47
|
|
|
48
48
|
$ gem install public_suffix_service
|
|
49
49
|
|
|
50
|
-
You might need administrator privileges on your system to install
|
|
50
|
+
You might need administrator privileges on your system to install the Gem.
|
|
51
51
|
|
|
52
52
|
|
|
53
53
|
== Usage
|
|
@@ -55,22 +55,32 @@ You might need administrator privileges on your system to install it.
|
|
|
55
55
|
Example domain without subdomains.
|
|
56
56
|
|
|
57
57
|
domain = PublicSuffixService.parse("google.com")
|
|
58
|
+
# => #<PublicSuffixService::Domain>
|
|
58
59
|
domain.tld
|
|
59
60
|
# => "com"
|
|
60
|
-
domain.
|
|
61
|
+
domain.sld
|
|
61
62
|
# => "google"
|
|
63
|
+
domain.trd
|
|
64
|
+
# => nil
|
|
65
|
+
domain.domain
|
|
66
|
+
# => "google.com"
|
|
62
67
|
domain.subdomain
|
|
63
68
|
# => nil
|
|
64
69
|
|
|
65
70
|
Example domain with subdomains.
|
|
66
71
|
|
|
67
72
|
domain = PublicSuffixService.parse("www.google.com")
|
|
73
|
+
# => #<PublicSuffixService::Domain>
|
|
68
74
|
domain.tld
|
|
69
75
|
# => "com"
|
|
70
|
-
domain.
|
|
76
|
+
domain.sld
|
|
71
77
|
# => "google"
|
|
72
|
-
domain.
|
|
78
|
+
domain.trd
|
|
73
79
|
# => "www"
|
|
80
|
+
domain.domain
|
|
81
|
+
# => "google.com"
|
|
82
|
+
domain.subdomain
|
|
83
|
+
# => "google.com"
|
|
74
84
|
|
|
75
85
|
Simple validation example.
|
|
76
86
|
|
|
@@ -89,6 +99,21 @@ Simple validation example.
|
|
|
89
99
|
Author:: {Simone Carletti}[http://www.simonecarletti.com/] <weppos@weppos.net>
|
|
90
100
|
|
|
91
101
|
|
|
102
|
+
== FeedBack and Bug reports
|
|
103
|
+
|
|
104
|
+
If you use this library and find yourself missing any functionality I have missed, please {let me know}[mailto:weppos@weppos.net].
|
|
105
|
+
|
|
106
|
+
Bug reports and Feature suggestions {are welcomed}[http://github.com/weppos/public_suffix_service/issues].
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
== More
|
|
110
|
+
|
|
111
|
+
* {Homepage}[http://www.simonecarletti.com/code/public_suffix_service]
|
|
112
|
+
* {Repository}[http://github.com/weppos/public_suffix_service]
|
|
113
|
+
* {API Documentation}[http://www.simonecarletti.com/code/public_suffix_service/api/] (RDoc)
|
|
114
|
+
* {Introducing the Public Suffix List library for Ruby}[http://www.simonecarletti.com/blog/2010/06/public-suffix-list-library-for-ruby/]
|
|
115
|
+
|
|
116
|
+
|
|
92
117
|
== Changelog
|
|
93
118
|
|
|
94
119
|
See the CHANGELOG.rdoc file for details.
|
|
@@ -96,4 +121,5 @@ See the CHANGELOG.rdoc file for details.
|
|
|
96
121
|
|
|
97
122
|
== License
|
|
98
123
|
|
|
99
|
-
Copyright (c) 2009-2010 Simone Carletti,
|
|
124
|
+
Copyright (c) 2009-2010 Simone Carletti,
|
|
125
|
+
*Public Suffix Service* is released under the MIT license.
|
data/Rakefile
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
require "rubygems"
|
|
2
2
|
require "rake/testtask"
|
|
3
|
-
require "rake/rdoctask"
|
|
4
3
|
require "rake/gempackagetask"
|
|
4
|
+
begin
|
|
5
|
+
require "hanna/rdoctask"
|
|
6
|
+
rescue LoadError
|
|
7
|
+
require "rake/rdoctask"
|
|
8
|
+
end
|
|
5
9
|
|
|
6
10
|
$:.unshift(File.dirname(__FILE__) + "/lib")
|
|
7
|
-
require
|
|
11
|
+
require "public_suffix_service"
|
|
8
12
|
|
|
9
13
|
|
|
10
14
|
# Common package properties
|
|
@@ -49,8 +53,8 @@ spec = Gem::Specification.new do |s|
|
|
|
49
53
|
s.email = "weppos@weppos.net"
|
|
50
54
|
s.homepage = "http://www.simonecarletti.com/code/public_suffix_service"
|
|
51
55
|
s.description = <<-EOD
|
|
52
|
-
Intelligent
|
|
53
|
-
|
|
56
|
+
Intelligent domain name parser based in the Public Suffic List. \
|
|
57
|
+
PublicSuffixService can parse and decompose a domain name into top level domain, \
|
|
54
58
|
domain and subdomains.
|
|
55
59
|
EOD
|
|
56
60
|
|
|
@@ -86,9 +90,9 @@ task :gemspec do
|
|
|
86
90
|
File.open(file, "w") {|f| f << spec.to_ruby }
|
|
87
91
|
end
|
|
88
92
|
|
|
89
|
-
desc "Remove any temporary products, including gemspec
|
|
93
|
+
desc "Remove any temporary products, including gemspec"
|
|
90
94
|
task :clean => [:clobber] do
|
|
91
|
-
rm "#{spec.name}.gemspec"
|
|
95
|
+
rm "#{spec.name}.gemspec" if File.file?("#{spec.name}.gemspec")
|
|
92
96
|
end
|
|
93
97
|
|
|
94
98
|
desc "Remove any generated file"
|
|
@@ -100,7 +104,7 @@ task :package => [:gemspec]
|
|
|
100
104
|
begin
|
|
101
105
|
require "rcov/rcovtask"
|
|
102
106
|
|
|
103
|
-
desc "Create a code coverage report
|
|
107
|
+
desc "Create a code coverage report"
|
|
104
108
|
Rcov::RcovTask.new do |t|
|
|
105
109
|
t.test_files = FileList["test/**/*_test.rb"]
|
|
106
110
|
t.ruby_opts << "-Itest -x mocha,rcov,Rakefile"
|
|
@@ -117,7 +121,7 @@ task :console do
|
|
|
117
121
|
end
|
|
118
122
|
|
|
119
123
|
begin
|
|
120
|
-
require
|
|
124
|
+
require "code_statistics"
|
|
121
125
|
desc "Show library's code statistics"
|
|
122
126
|
task :stats do
|
|
123
127
|
CodeStatistics.new(["Public Suffix Service", "lib"],
|
|
@@ -127,6 +131,13 @@ rescue LoadError
|
|
|
127
131
|
puts "CodeStatistics (Rails) is not available"
|
|
128
132
|
end
|
|
129
133
|
|
|
134
|
+
desc "Publish documentation to the site"
|
|
135
|
+
task :publish_rdoc => [:clobber_rdoc, :rdoc] do
|
|
136
|
+
ENV["username"] || raise(ArgumentError, "Missing ssh username")
|
|
137
|
+
sh "rsync -avz --delete rdoc/ #{ENV["username"]}@code:/var/www/apps/code/#{PKG_NAME}/api"
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
|
|
130
141
|
Dir["tasks/**/*.rake"].each do |file|
|
|
131
142
|
load(file)
|
|
132
143
|
end
|
|
@@ -18,6 +18,22 @@ module PublicSuffixService
|
|
|
18
18
|
|
|
19
19
|
class Domain
|
|
20
20
|
|
|
21
|
+
# Splits a string into its possible labels as a domain in reverse order
|
|
22
|
+
# from the input string.
|
|
23
|
+
# The input is not validated, but it is assumed to be a valid domain.
|
|
24
|
+
#
|
|
25
|
+
# domain - The String domain to be split.
|
|
26
|
+
#
|
|
27
|
+
# Examples
|
|
28
|
+
#
|
|
29
|
+
# domain_to_labels('google.com.uk')
|
|
30
|
+
# # => ['uk', 'com', 'google']
|
|
31
|
+
#
|
|
32
|
+
# Returns an Array of String representing the possible labels.
|
|
33
|
+
def self.domain_to_labels(domain)
|
|
34
|
+
domain.to_s.split(".").reverse
|
|
35
|
+
end
|
|
36
|
+
|
|
21
37
|
def initialize(*args, &block)
|
|
22
38
|
@tld, @sld, @trd = args
|
|
23
39
|
yield(self) if block_given?
|
|
@@ -61,10 +77,10 @@ module PublicSuffixService
|
|
|
61
77
|
#
|
|
62
78
|
# Examples
|
|
63
79
|
#
|
|
64
|
-
#
|
|
80
|
+
# PublicSuffixService::Domain.new("com", "google").name
|
|
65
81
|
# # => "google.com"
|
|
66
82
|
#
|
|
67
|
-
#
|
|
83
|
+
# PublicSuffixService::Domain.new("com", "google", "www").name
|
|
68
84
|
# # => "www.google.com"
|
|
69
85
|
#
|
|
70
86
|
# Returns a String with the domain name.
|
|
@@ -75,23 +91,78 @@ module PublicSuffixService
|
|
|
75
91
|
# Returns a domain-like representation of this object
|
|
76
92
|
# if the object is a <tt>domain?</tt>,
|
|
77
93
|
# <tt>nil</tt> otherwise.
|
|
94
|
+
#
|
|
95
|
+
# PublicSuffixService::Domain.new("com").domain
|
|
96
|
+
# # => nil
|
|
97
|
+
#
|
|
98
|
+
# PublicSuffixService::Domain.new("com", "google").domain
|
|
99
|
+
# # => "google.com"
|
|
100
|
+
#
|
|
101
|
+
# PublicSuffixService::Domain.new("com", "google", "www").domain
|
|
102
|
+
# # => "www.google.com"
|
|
103
|
+
#
|
|
104
|
+
# This method doesn't validate the input. It handles the domain
|
|
105
|
+
# as a valid domain name and simply applies the necessary transformations.
|
|
106
|
+
#
|
|
107
|
+
# # This is an invalid domain
|
|
108
|
+
# PublicSuffixService::Domain.new("zip", "google").domain
|
|
109
|
+
# # => "google.zip"
|
|
110
|
+
#
|
|
111
|
+
# This method returns a FQD, not just the domain part.
|
|
112
|
+
# To get the domain part, use <tt>#sld</tt> (aka second level domain).
|
|
113
|
+
#
|
|
114
|
+
# PublicSuffixService::Domain.new("com", "google", "www").domain
|
|
115
|
+
# # => "google.com"
|
|
116
|
+
#
|
|
117
|
+
# PublicSuffixService::Domain.new("com", "google", "www").sld
|
|
118
|
+
# # => "google"
|
|
119
|
+
#
|
|
120
|
+
# Returns a String or nil.
|
|
78
121
|
def domain
|
|
79
122
|
return unless domain?
|
|
80
123
|
[sld, tld].join(".")
|
|
81
124
|
end
|
|
82
125
|
|
|
83
|
-
# Returns a
|
|
126
|
+
# Returns a domain-like representation of this object
|
|
84
127
|
# if the object is a <tt>subdomain?</tt>,
|
|
85
128
|
# <tt>nil</tt> otherwise.
|
|
129
|
+
#
|
|
130
|
+
# PublicSuffixService::Domain.new("com").subdomain
|
|
131
|
+
# # => nil
|
|
132
|
+
#
|
|
133
|
+
# PublicSuffixService::Domain.new("com", "google").subdomain
|
|
134
|
+
# # => nil
|
|
135
|
+
#
|
|
136
|
+
# PublicSuffixService::Domain.new("com", "google", "www").subdomain
|
|
137
|
+
# # => "www.google.com"
|
|
138
|
+
#
|
|
139
|
+
# This method doesn't validate the input. It handles the domain
|
|
140
|
+
# as a valid domain name and simply applies the necessary transformations.
|
|
141
|
+
#
|
|
142
|
+
# # This is an invalid domain
|
|
143
|
+
# PublicSuffixService::Domain.new("zip", "google", "www").subdomain
|
|
144
|
+
# # => "www.google.zip"
|
|
145
|
+
#
|
|
146
|
+
# This method returns a FQD, not just the domain part.
|
|
147
|
+
# To get the domain part, use <tt>#tld</tt> (aka third level domain).
|
|
148
|
+
#
|
|
149
|
+
# PublicSuffixService::Domain.new("com", "google", "www").subdomain
|
|
150
|
+
# # => "www.google.com"
|
|
151
|
+
#
|
|
152
|
+
# PublicSuffixService::Domain.new("com", "google", "www").trd
|
|
153
|
+
# # => "www"
|
|
154
|
+
#
|
|
155
|
+
# Returns a String or nil.
|
|
86
156
|
def subdomain
|
|
87
157
|
return unless subdomain?
|
|
88
158
|
[trd, sld, tld].join(".")
|
|
89
159
|
end
|
|
90
160
|
|
|
91
|
-
# Gets the rule matching this domain
|
|
161
|
+
# Gets the rule matching this domain
|
|
162
|
+
# in the default PublicSuffixService::RuleList.
|
|
92
163
|
#
|
|
93
|
-
# Returns
|
|
94
|
-
# nil if no rule is found.
|
|
164
|
+
# Returns the PublicSuffixService::Rule::Base instance
|
|
165
|
+
# if a rule matches current domain, nil if no rule is found.
|
|
95
166
|
def rule
|
|
96
167
|
RuleList.default.find(name)
|
|
97
168
|
end
|
|
@@ -102,25 +173,26 @@ module PublicSuffixService
|
|
|
102
173
|
# This method doesn't actually validate the domain.
|
|
103
174
|
# It only checks whether the instance contains
|
|
104
175
|
# a value for the <tt>tld</tt> and <tt>sld</tt> attributes.
|
|
105
|
-
# If you also want to validate the domain,
|
|
176
|
+
# If you also want to validate the domain,
|
|
177
|
+
# use <tt>#valid_domain?</tt> instead.
|
|
106
178
|
#
|
|
107
179
|
# Examples
|
|
108
180
|
#
|
|
109
|
-
#
|
|
181
|
+
# PublicSuffixService::Domain.new("com").domain?
|
|
110
182
|
# # => false
|
|
111
183
|
#
|
|
112
|
-
#
|
|
184
|
+
# PublicSuffixService::Domain.new("com", "google").domain?
|
|
113
185
|
# # => true
|
|
114
186
|
#
|
|
115
|
-
#
|
|
187
|
+
# PublicSuffixService::Domain.new("com", "google", "www").domain?
|
|
116
188
|
# # => true
|
|
117
189
|
#
|
|
118
190
|
# # This is an invalid domain, but returns true
|
|
119
191
|
# # because this method doesn't validate the content.
|
|
120
|
-
#
|
|
192
|
+
# PublicSuffixService::Domain.new("zip", "google").domain?
|
|
121
193
|
# # => true
|
|
122
194
|
#
|
|
123
|
-
# Returns
|
|
195
|
+
# Returns Boolean.
|
|
124
196
|
def domain?
|
|
125
197
|
!(tld.nil? || sld.nil?)
|
|
126
198
|
end
|
|
@@ -130,36 +202,41 @@ module PublicSuffixService
|
|
|
130
202
|
# This method doesn't actually validate the subdomain.
|
|
131
203
|
# It only checks whether the instance contains
|
|
132
204
|
# a value for the <tt>tld</tt>, <tt>sld</tt> and <tt>trd</tt> attributes.
|
|
133
|
-
# If you also want to validate the domain,
|
|
205
|
+
# If you also want to validate the domain,
|
|
206
|
+
# use <tt>#valid_subdomain?</tt> instead.
|
|
134
207
|
#
|
|
135
208
|
# Examples
|
|
136
209
|
#
|
|
137
|
-
#
|
|
210
|
+
# PublicSuffixService::Domain.new("com").subdomain?
|
|
138
211
|
# # => false
|
|
139
212
|
#
|
|
140
|
-
#
|
|
213
|
+
# PublicSuffixService::Domain.new("com", "google").subdomain?
|
|
141
214
|
# # => false
|
|
142
215
|
#
|
|
143
|
-
#
|
|
216
|
+
# PublicSuffixService::Domain.new("com", "google", "www").subdomain?
|
|
144
217
|
# # => true
|
|
145
218
|
#
|
|
146
219
|
# # This is an invalid domain, but returns true
|
|
147
220
|
# # because this method doesn't validate the content.
|
|
148
|
-
#
|
|
221
|
+
# PublicSuffixService::Domain.new("zip", "google", "www").subdomain?
|
|
149
222
|
# # => true
|
|
150
223
|
#
|
|
151
|
-
# Returns
|
|
224
|
+
# Returns Boolean.
|
|
152
225
|
def subdomain?
|
|
153
226
|
!(tld.nil? || sld.nil? || trd.nil?)
|
|
154
227
|
end
|
|
155
228
|
|
|
156
229
|
# Checks whether <tt>self</tt> is exclusively a domain,
|
|
157
230
|
# and not a subdomain.
|
|
231
|
+
#
|
|
232
|
+
# Returns Boolean.
|
|
158
233
|
def is_a_domain?
|
|
159
234
|
domain? && !subdomain?
|
|
160
235
|
end
|
|
161
236
|
|
|
162
237
|
# Checks whether <tt>self</tt> is exclusively a subdomain.
|
|
238
|
+
#
|
|
239
|
+
# Returns Boolean.
|
|
163
240
|
def is_a_subdomain?
|
|
164
241
|
subdomain?
|
|
165
242
|
end
|
|
@@ -170,7 +247,7 @@ module PublicSuffixService
|
|
|
170
247
|
# Note: this method triggers a new rule lookup in the default RuleList,
|
|
171
248
|
# which is a quite intensive task.
|
|
172
249
|
#
|
|
173
|
-
# Returns
|
|
250
|
+
# Returns Boolean.
|
|
174
251
|
def valid?
|
|
175
252
|
!rule.nil?
|
|
176
253
|
end
|
|
@@ -178,21 +255,21 @@ module PublicSuffixService
|
|
|
178
255
|
# Checks whether <tt>self</tt> looks like a domain and validates
|
|
179
256
|
# according to default <tt>RuleList</tt>.
|
|
180
257
|
#
|
|
181
|
-
# See also <tt
|
|
258
|
+
# See also <tt>#domain?</tt> and <tt>#valid?</tt>.
|
|
182
259
|
#
|
|
183
260
|
# Examples
|
|
184
261
|
#
|
|
185
|
-
#
|
|
262
|
+
# PublicSuffixService::Domain.new("com").domain?
|
|
186
263
|
# # => false
|
|
187
264
|
#
|
|
188
|
-
#
|
|
265
|
+
# PublicSuffixService::Domain.new("com", "google").domain?
|
|
189
266
|
# # => true
|
|
190
267
|
#
|
|
191
|
-
#
|
|
268
|
+
# PublicSuffixService::Domain.new("com", "google", "www").domain?
|
|
192
269
|
# # => true
|
|
193
270
|
#
|
|
194
271
|
# # This is an invalid domain
|
|
195
|
-
#
|
|
272
|
+
# PublicSuffixService::Domain.new("zip", "google").false?
|
|
196
273
|
# # => true
|
|
197
274
|
#
|
|
198
275
|
# Returns true if this instance looks like a domain and is valid.
|
|
@@ -203,21 +280,21 @@ module PublicSuffixService
|
|
|
203
280
|
# Checks whether <tt>self</tt> looks like a subdomain and validates
|
|
204
281
|
# according to default <tt>RuleList</tt>.
|
|
205
282
|
#
|
|
206
|
-
# See also <tt
|
|
283
|
+
# See also <tt>#subdomain?</tt> and <tt>#valid?</tt>.
|
|
207
284
|
#
|
|
208
285
|
# Examples
|
|
209
286
|
#
|
|
210
|
-
#
|
|
287
|
+
# PublicSuffixService::Domain.new("com").subdomain?
|
|
211
288
|
# # => false
|
|
212
289
|
#
|
|
213
|
-
#
|
|
290
|
+
# PublicSuffixService::Domain.new("com", "google").subdomain?
|
|
214
291
|
# # => false
|
|
215
292
|
#
|
|
216
|
-
#
|
|
293
|
+
# PublicSuffixService::Domain.new("com", "google", "www").subdomain?
|
|
217
294
|
# # => true
|
|
218
295
|
#
|
|
219
296
|
# # This is an invalid domain
|
|
220
|
-
#
|
|
297
|
+
# PublicSuffixService::Domain.new("zip", "google", "www").subdomain?
|
|
221
298
|
# # => false
|
|
222
299
|
#
|
|
223
300
|
# Returns true if this instance looks like a domain and is valid.
|
|
@@ -22,7 +22,7 @@ module PublicSuffixService
|
|
|
22
22
|
# and creates a new instance of that class.
|
|
23
23
|
# The <tt>name</tt> becomes the rule value.
|
|
24
24
|
#
|
|
25
|
-
# name - The rule
|
|
25
|
+
# name - The String rule definition.
|
|
26
26
|
#
|
|
27
27
|
# Examples
|
|
28
28
|
#
|
|
@@ -35,6 +35,7 @@ module PublicSuffixService
|
|
|
35
35
|
# PublicSuffixService::Rule.factory("!congresodelalengua3.ar")
|
|
36
36
|
# # => #<PublicSuffixService::Rule::Exception>
|
|
37
37
|
#
|
|
38
|
+
# Returns a rule instance, a kind of PublicSuffixService::Rule::Base.
|
|
38
39
|
def self.factory(name)
|
|
39
40
|
klass = case name.to_s[0..0]
|
|
40
41
|
when "*" then "wildcard"
|
|
@@ -137,12 +138,12 @@ module PublicSuffixService
|
|
|
137
138
|
@name = name.to_s
|
|
138
139
|
@value = value || @name
|
|
139
140
|
@type = self.class.name.split("::").last.downcase.to_sym
|
|
140
|
-
@labels = domain_to_labels(@value)
|
|
141
|
+
@labels = Domain.domain_to_labels(@value)
|
|
141
142
|
end
|
|
142
143
|
|
|
143
144
|
# Checks whether this rule is equal to <tt>other</tt>.
|
|
144
145
|
#
|
|
145
|
-
# other -
|
|
146
|
+
# other - The PublicSuffixService::Rule::Base to compare.
|
|
146
147
|
#
|
|
147
148
|
# Returns true if this rule and other are instances of the same class
|
|
148
149
|
# and has the same value, false otherwise.
|
|
@@ -156,13 +157,12 @@ module PublicSuffixService
|
|
|
156
157
|
|
|
157
158
|
# Checks whether this rule matches <tt>domain</tt>.
|
|
158
159
|
#
|
|
159
|
-
# domain -
|
|
160
|
+
# domain - The String domain name to check.
|
|
160
161
|
#
|
|
161
|
-
# Returns
|
|
162
|
-
# false otherwise.
|
|
162
|
+
# Returns Boolean.
|
|
163
163
|
def match?(domain)
|
|
164
164
|
l1 = labels
|
|
165
|
-
l2 = domain_to_labels(domain)
|
|
165
|
+
l2 = Domain.domain_to_labels(domain)
|
|
166
166
|
odiff(l1, l2).empty?
|
|
167
167
|
end
|
|
168
168
|
|
|
@@ -188,9 +188,6 @@ module PublicSuffixService
|
|
|
188
188
|
|
|
189
189
|
private
|
|
190
190
|
|
|
191
|
-
def domain_to_labels(domain)
|
|
192
|
-
domain.to_s.split(".").reverse
|
|
193
|
-
end
|
|
194
191
|
|
|
195
192
|
def odiff(one, two)
|
|
196
193
|
ii = 0
|
|
@@ -218,7 +215,7 @@ module PublicSuffixService
|
|
|
218
215
|
|
|
219
216
|
# Decomposes the domain according to rule properties.
|
|
220
217
|
#
|
|
221
|
-
# domain -
|
|
218
|
+
# domain - The String domain name to parse.
|
|
222
219
|
#
|
|
223
220
|
# Return an Array with [trd + sld, tld].
|
|
224
221
|
def decompose(domain)
|
|
@@ -248,7 +245,7 @@ module PublicSuffixService
|
|
|
248
245
|
|
|
249
246
|
# Decomposes the domain according to rule properties.
|
|
250
247
|
#
|
|
251
|
-
# domain -
|
|
248
|
+
# domain - The String domain name to parse.
|
|
252
249
|
#
|
|
253
250
|
# Return an Array with [trd + sld, tld].
|
|
254
251
|
def decompose(domain)
|
|
@@ -279,7 +276,7 @@ module PublicSuffixService
|
|
|
279
276
|
|
|
280
277
|
# Decomposes the domain according to rule properties.
|
|
281
278
|
#
|
|
282
|
-
# domain -
|
|
279
|
+
# domain - The String domain name to parse.
|
|
283
280
|
#
|
|
284
281
|
# Return an Array with [trd + sld, tld].
|
|
285
282
|
def decompose(domain)
|
|
@@ -291,4 +288,4 @@ module PublicSuffixService
|
|
|
291
288
|
|
|
292
289
|
end
|
|
293
290
|
|
|
294
|
-
end
|
|
291
|
+
end
|
|
@@ -51,17 +51,43 @@ module PublicSuffixService
|
|
|
51
51
|
include Enumerable
|
|
52
52
|
|
|
53
53
|
# Gets the list of rules.
|
|
54
|
-
# Each rule is expected to be a subclass of PublicSuffixService::Rule::Base.
|
|
55
54
|
#
|
|
56
|
-
# Returns
|
|
55
|
+
# Returns the Array of rule instances.
|
|
56
|
+
# Each rule is an instance of the proper corresponding of
|
|
57
|
+
# PublicSuffixService::Rule::Base.
|
|
57
58
|
attr_reader :list
|
|
58
59
|
|
|
60
|
+
# Gets the naive index, a hash that with the keys being the first label of
|
|
61
|
+
# every rule pointing to an array of integers (indexes of the rules in @list)
|
|
62
|
+
attr_reader :indexes
|
|
63
|
+
|
|
59
64
|
|
|
60
65
|
# Initializes an empty PublicSuffixService::RuleList.
|
|
61
66
|
# If block is given, yields on self.
|
|
62
67
|
def initialize(&block) # :yields: self
|
|
63
|
-
@list
|
|
68
|
+
@list = []
|
|
69
|
+
@indexes = {}
|
|
64
70
|
yield(self) if block_given?
|
|
71
|
+
create_index!
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# Creates a naive index for @list. Just a hash that will tell
|
|
75
|
+
# us where the elements of @list are relative to its first
|
|
76
|
+
# Rule#labels element.
|
|
77
|
+
#
|
|
78
|
+
# For instance if @list[5] and @list[4] are the only elements of the list
|
|
79
|
+
# where Rule#labels.first is 'us' @indexes['us'] #=> [5,4], that way in
|
|
80
|
+
# select we can avoid mapping every single rule against the candidate domain.
|
|
81
|
+
#
|
|
82
|
+
# Returns nothing.
|
|
83
|
+
def create_index!
|
|
84
|
+
@list.map{|l| l.labels.first }.each_with_index do |elm, inx|
|
|
85
|
+
if !@indexes.has_key?(elm)
|
|
86
|
+
@indexes[elm] = [inx]
|
|
87
|
+
else
|
|
88
|
+
@indexes[elm] << inx
|
|
89
|
+
end
|
|
90
|
+
end
|
|
65
91
|
end
|
|
66
92
|
|
|
67
93
|
# Checks whether two lists are equal.
|
|
@@ -161,10 +187,15 @@ module PublicSuffixService
|
|
|
161
187
|
|
|
162
188
|
# Selects all the rules matching given domain.
|
|
163
189
|
#
|
|
164
|
-
#
|
|
165
|
-
#
|
|
190
|
+
# Will use @indexes to try only the rules that share the same first label,
|
|
191
|
+
# that will speed up things when using RuleList.find('foo') a lot.
|
|
192
|
+
#
|
|
193
|
+
# Returns an Array of rule instances.
|
|
194
|
+
# Each rule is an instance of the corresponding subclass of
|
|
195
|
+
# PublicSuffixService::Rule::Base.
|
|
166
196
|
def select(domain)
|
|
167
|
-
|
|
197
|
+
indices = (@indexes[ Domain.domain_to_labels(domain).first ] || [])
|
|
198
|
+
@list.values_at(*indices).select { |rule| rule.match?(domain) }
|
|
168
199
|
end
|
|
169
200
|
|
|
170
201
|
|
|
@@ -172,11 +203,11 @@ module PublicSuffixService
|
|
|
172
203
|
|
|
173
204
|
class << self
|
|
174
205
|
|
|
175
|
-
# Gets the default
|
|
176
|
-
# Initializes a new
|
|
177
|
-
#
|
|
206
|
+
# Gets the default PublicSuffixService::RuleList.
|
|
207
|
+
# Initializes a new PublicSuffixService::RuleList parsing the content
|
|
208
|
+
# of PublicSuffixService::RuleList.default_definition, if required.
|
|
178
209
|
#
|
|
179
|
-
# Returns
|
|
210
|
+
# Returns a PublicSuffixService::RuleList.
|
|
180
211
|
def default
|
|
181
212
|
@@default ||= parse(default_definition)
|
|
182
213
|
end
|
|
@@ -185,12 +216,12 @@ module PublicSuffixService
|
|
|
185
216
|
#
|
|
186
217
|
# value - The new PublicSuffixService::RuleList.
|
|
187
218
|
#
|
|
188
|
-
# Returns the
|
|
219
|
+
# Returns the PublicSuffixService::RuleList.
|
|
189
220
|
def default=(value)
|
|
190
221
|
@@default = value
|
|
191
222
|
end
|
|
192
223
|
|
|
193
|
-
# Sets the default
|
|
224
|
+
# Sets the default PublicSuffixService::RuleList to nil.
|
|
194
225
|
#
|
|
195
226
|
# Returns self.
|
|
196
227
|
def clear
|
|
@@ -201,16 +232,17 @@ module PublicSuffixService
|
|
|
201
232
|
# Resets the default <tt>PublicSuffixService::RuleList</tt> and reinitialize it
|
|
202
233
|
# parsing the content of <tt>PublicSuffixService::RuleList.default_definition</tt>.
|
|
203
234
|
#
|
|
204
|
-
# Returns
|
|
235
|
+
# Returns a PublicSuffixService::RuleList.
|
|
205
236
|
def reload
|
|
206
237
|
self.clear.default
|
|
207
238
|
end
|
|
208
239
|
|
|
209
240
|
# Gets the default definition list.
|
|
210
|
-
# Can be any <tt>IOStream</tt> including a <tt>File</tt>
|
|
241
|
+
# Can be any <tt>IOStream</tt> including a <tt>File</tt>
|
|
242
|
+
# or a simple <tt>String</tt>.
|
|
211
243
|
# The object must respond to <tt>#each_line</tt>.
|
|
212
244
|
#
|
|
213
|
-
# Returns
|
|
245
|
+
# Returns a File.
|
|
214
246
|
def default_definition
|
|
215
247
|
File.new(File.join(File.dirname(__FILE__), "definitions.dat"))
|
|
216
248
|
end
|
|
@@ -219,7 +251,9 @@ module PublicSuffixService
|
|
|
219
251
|
# Parse given <tt>input</tt> treating the content as Public Suffic List.
|
|
220
252
|
# See http://publicsuffix.org/format/ for more details about input format.
|
|
221
253
|
#
|
|
222
|
-
# Returns an Array of
|
|
254
|
+
# Returns an Array of rule instances.
|
|
255
|
+
# Each rule is an instance of the corresponding subclass of
|
|
256
|
+
# PublicSuffixService::Rule::Base.
|
|
223
257
|
def parse(input)
|
|
224
258
|
new do |list|
|
|
225
259
|
input.each_line do |line|
|
|
@@ -28,9 +28,12 @@ module PublicSuffixService
|
|
|
28
28
|
AUTHORS = ["Simone Carletti <weppos@weppos.net>"]
|
|
29
29
|
|
|
30
30
|
|
|
31
|
-
# Parses <tt>domain</tt> and returns
|
|
31
|
+
# Parses <tt>domain</tt> and returns the
|
|
32
|
+
# PubliSuffixService::Domain instance.
|
|
32
33
|
#
|
|
33
|
-
# domain -
|
|
34
|
+
# domain - The String domain name to parse.
|
|
35
|
+
#
|
|
36
|
+
# Examples
|
|
34
37
|
#
|
|
35
38
|
# PublicSuffixService.parse("google.com")
|
|
36
39
|
# # => #<PubliSuffixService::Domain ...>
|
|
@@ -45,6 +48,8 @@ module PublicSuffixService
|
|
|
45
48
|
# # => PublicSuffixService::InvalidDomain
|
|
46
49
|
#
|
|
47
50
|
# Raises PublicSuffixService::Error if domain is not a valid domain
|
|
51
|
+
#
|
|
52
|
+
# Returns the PubliSuffixService::Domain domain.
|
|
48
53
|
def self.parse(domain)
|
|
49
54
|
rule = RuleList.default.find(domain) || raise(InvalidDomain, "`#{domain}' is not a valid domain")
|
|
50
55
|
|
|
@@ -64,9 +69,9 @@ module PublicSuffixService
|
|
|
64
69
|
# Checks whether <tt>domain</tt> is a valid domain name.
|
|
65
70
|
#
|
|
66
71
|
# This method doesn't care whether domain is a domain or subdomain.
|
|
67
|
-
# The check is performed using the default
|
|
72
|
+
# The check is performed using the default PublicSuffixService::RuleList.
|
|
68
73
|
#
|
|
69
|
-
# domain -
|
|
74
|
+
# domain - The String domain name to parse.
|
|
70
75
|
#
|
|
71
76
|
# Examples
|
|
72
77
|
#
|
|
@@ -82,7 +87,7 @@ module PublicSuffixService
|
|
|
82
87
|
# PublicSuffixService.valid?("x.yz")
|
|
83
88
|
# # => false
|
|
84
89
|
#
|
|
85
|
-
# Returns
|
|
90
|
+
# Returns Boolean.
|
|
86
91
|
def self.valid?(domain)
|
|
87
92
|
!RuleList.default.find(domain).nil?
|
|
88
93
|
end
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Gem::Specification.new do |s|
|
|
4
4
|
s.name = %q{public_suffix_service}
|
|
5
|
-
s.version = "0.
|
|
5
|
+
s.version = "0.4.0"
|
|
6
6
|
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
|
8
8
|
s.authors = ["Simone Carletti"]
|
|
@@ -12,7 +12,7 @@ Gem::Specification.new do |s|
|
|
|
12
12
|
s.email = %q{weppos@weppos.net}
|
|
13
13
|
s.extra_rdoc_files = ["CHANGELOG.rdoc", "LICENSE.rdoc", "README.rdoc"]
|
|
14
14
|
s.files = ["Rakefile", "CHANGELOG.rdoc", "LICENSE.rdoc", "README.rdoc", "public_suffix_service.gemspec", "test/acceptance_test.rb", "test/public_suffix_service/domain_test.rb", "test/public_suffix_service/rule_list_test.rb", "test/public_suffix_service/rule_test.rb", "test/public_suffix_service_test.rb", "test/test_helper.rb", "lib/public_suffix_service/definitions.dat", "lib/public_suffix_service/domain.rb", "lib/public_suffix_service/errors.rb", "lib/public_suffix_service/rule.rb", "lib/public_suffix_service/rule_list.rb", "lib/public_suffix_service/version.rb", "lib/public_suffix_service.rb"]
|
|
15
|
-
s.homepage = %q{http://www.simonecarletti.com/code/
|
|
15
|
+
s.homepage = %q{http://www.simonecarletti.com/code/public_suffix_service}
|
|
16
16
|
s.rdoc_options = ["--main", "README.rdoc"]
|
|
17
17
|
s.require_paths = ["lib"]
|
|
18
18
|
s.rubygems_version = %q{1.3.7}
|
|
@@ -6,6 +6,11 @@ class PublicSuffixService::DomainTest < Test::Unit::TestCase
|
|
|
6
6
|
@klass = PublicSuffixService::Domain
|
|
7
7
|
end
|
|
8
8
|
|
|
9
|
+
def test_domain_to_lables
|
|
10
|
+
assert_equal %w{com live spaces someone}, PublicSuffixService::Domain.domain_to_labels('someone.spaces.live.com')
|
|
11
|
+
assert_equal %w{com zoho wiki leontina23samiko}, PublicSuffixService::Domain.domain_to_labels('leontina23samiko.wiki.zoho.com')
|
|
12
|
+
end
|
|
13
|
+
|
|
9
14
|
|
|
10
15
|
def test_initialize_with_tld
|
|
11
16
|
domain = @klass.new("com")
|
|
@@ -138,4 +143,4 @@ class PublicSuffixService::DomainTest < Test::Unit::TestCase
|
|
|
138
143
|
assert !@klass.new("com", "google").valid_subdomain?
|
|
139
144
|
end
|
|
140
145
|
|
|
141
|
-
end
|
|
146
|
+
end
|
|
@@ -16,6 +16,28 @@ class PublicSuffixService::RuleListTest < Test::Unit::TestCase
|
|
|
16
16
|
assert_equal 0, @list.length
|
|
17
17
|
end
|
|
18
18
|
|
|
19
|
+
def test_initialize_create_index_when_empty
|
|
20
|
+
assert_equal({}, @list.indexes)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def test_find__with_index
|
|
24
|
+
@list = PublicSuffixService::RuleList.parse(<<EOS)
|
|
25
|
+
// com : http://en.wikipedia.org/wiki/.com
|
|
26
|
+
com
|
|
27
|
+
|
|
28
|
+
// uk : http://en.wikipedia.org/wiki/.uk
|
|
29
|
+
*.uk
|
|
30
|
+
*.sch.uk
|
|
31
|
+
!bl.uk
|
|
32
|
+
!british-library.uk
|
|
33
|
+
EOS
|
|
34
|
+
|
|
35
|
+
assert !@list.indexes.empty?
|
|
36
|
+
assert_equal [1,2,3,4], @list.indexes.delete('uk')
|
|
37
|
+
assert_equal [0], @list.indexes.delete('com')
|
|
38
|
+
assert @list.indexes.empty?
|
|
39
|
+
end
|
|
40
|
+
|
|
19
41
|
|
|
20
42
|
def test_equality_with_self
|
|
21
43
|
list = PublicSuffixService::RuleList.new
|
|
@@ -179,4 +201,4 @@ EOS
|
|
|
179
201
|
assert_equal %w(ac com.ac ad *.ar !congresodelalengua3.ar).map { |name| PublicSuffixService::Rule.factory(name) }, list.to_a
|
|
180
202
|
end
|
|
181
203
|
|
|
182
|
-
end
|
|
204
|
+
end
|
metadata
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: public_suffix_service
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
hash:
|
|
4
|
+
hash: 11
|
|
5
5
|
prerelease: false
|
|
6
6
|
segments:
|
|
7
7
|
- 0
|
|
8
|
-
-
|
|
8
|
+
- 5
|
|
9
9
|
- 0
|
|
10
|
-
version: 0.
|
|
10
|
+
version: 0.5.0
|
|
11
11
|
platform: ruby
|
|
12
12
|
authors:
|
|
13
13
|
- Simone Carletti
|
|
@@ -15,7 +15,7 @@ autorequire:
|
|
|
15
15
|
bindir: bin
|
|
16
16
|
cert_chain: []
|
|
17
17
|
|
|
18
|
-
date: 2010-
|
|
18
|
+
date: 2010-09-13 00:00:00 +02:00
|
|
19
19
|
default_executable:
|
|
20
20
|
dependencies:
|
|
21
21
|
- !ruby/object:Gem::Dependency
|
|
@@ -32,7 +32,7 @@ dependencies:
|
|
|
32
32
|
version: "0"
|
|
33
33
|
type: :development
|
|
34
34
|
version_requirements: *id001
|
|
35
|
-
description: " Intelligent
|
|
35
|
+
description: " Intelligent domain name parser based in the Public Suffic List. PublicSuffixService can parse and decompose a domain name into top level domain, domain and subdomains.\n"
|
|
36
36
|
email: weppos@weppos.net
|
|
37
37
|
executables: []
|
|
38
38
|
|