ryodo 0.0.3 → 0.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.
data/README.md CHANGED
@@ -8,7 +8,9 @@ This is a pure Ruby implementation of the [regdomr](https://github.com/asaaki/re
8
8
 
9
9
  Without the Cext backend it should be also easily usable with Ruby implemenations like JRuby.
10
10
 
11
- **Works only with Ruby 1.9.x!**
11
+ **Works only with Ruby 1.9.x!** (I dropped all support for 1.8.x)
12
+
13
+
12
14
 
13
15
  ## Usage
14
16
 
@@ -52,7 +54,7 @@ ryodo("my.awesome.domain.co.jp")
52
54
  "my.awesome.domain.co.jp".ryodo
53
55
  ```
54
56
 
55
- UTF-8 junkie? ;o)
57
+ ### UTF-8 junkie?
56
58
 
57
59
  ```ruby
58
60
  # encoding: utf-8
@@ -61,10 +63,117 @@ ryōdo("my.awesome.domain.co.jp")
61
63
  りょうど("my.awesome.domain.co.jp")
62
64
  ```
63
65
 
66
+ ### Extension of URI
67
+
68
+ ```ruby
69
+ require "regdomr/uri"
70
+
71
+ uri = URI.parse("http://my.awesome.domain.jp:5555/path")
72
+ uri.host
73
+ #=> "my.awesome.domain.jp"
74
+
75
+ uri.host.class
76
+ #=> Ryodo::Domain
77
+ # but decorates the String class transparently
78
+
79
+ uri.host.domain
80
+ #=> "domain.com"
81
+ ```
82
+
83
+ In Gemfile:
84
+
85
+ ```ruby
86
+ gem "ryodo", :require => ["ryodo","ryodo/ext/uri"]
87
+ ```
88
+
89
+
90
+
91
+ ## Benchmark
92
+
93
+ There is another gem called [public_suffix](https://github.com/weppos/public_suffix_service), which does nearly the same (maybe with more features I don't need).
94
+
95
+ So I did a tiny benchmark.
96
+
97
+ **Setup**
98
+
99
+ A domain input list, taken by publicsuffix.org (checkPublicSuffix test script under [publicsuffix.org/list/](http://publicsuffix.org/list/)).
100
+
101
+ Some of them are also invalid (to test, if you implementation works correctly).
102
+
103
+ I added some very long domain names with many parts (for look-up time scale).
104
+
105
+ Finally 72 entries to check.
106
+
107
+ Ruby: 1.9.3-p194, no special patches
108
+
109
+ We only do a basic parsing and retrieve the registered/registrable domain. (Should hit the most important code of the gems.)
110
+
111
+ **Test script snippet**
112
+
113
+ ```ruby
114
+ # DOMAINS is the array of domain entries - shuffled on every benchmark run
115
+
116
+ LOOPS = 1_000
117
+
118
+ Benchmark.bmbm do |b|
119
+
120
+ b.report "ryodo" do
121
+ LOOPS.times do
122
+ DOMAINS.each do |domain|
123
+ Ryodo.parse(domain).domain # returns nil if not valid
124
+ end
125
+ end
126
+ end
127
+
128
+ b.report "public_suffix" do
129
+ LOOPS.times do
130
+ DOMAINS.each do |domain|
131
+ PublicSuffix.parse(domain).domain rescue nil # it raises if not valid in any way, so we rescue it
132
+ end
133
+ end
134
+ end
135
+
136
+ end
137
+ ```
138
+
139
+ **Caveats**
140
+
141
+ `PublicSuffix.parse(…)` will raise errors if domain input is invalid (e.g. not a registrable domain).
142
+
143
+ `Ryodo.parse(…)` won't raise but return nil values for invalid stuff (it only raises if input is not a String, of course).
144
+
145
+ **Result**
146
+
147
+ ```
148
+ Rehearsal -------------------------------------------------
149
+ ryodo 1.800000 0.000000 1.800000 ( 1.809521)
150
+ public_suffix 21.880000 0.020000 21.900000 ( 21.907808)
151
+ --------------------------------------- total: 23.700000sec
152
+
153
+ user system total real
154
+ ryodo 1.770000 0.000000 1.770000 ( 1.769734)
155
+ public_suffix 22.320000 0.010000 22.330000 ( 22.346013)
156
+ ```
157
+
158
+ As you can see, Ryodo is more than **10 times faster**.
159
+
160
+ _(Funfact: My first approach was 6 times slower — improvement factor of 60!)_
161
+
162
+
163
+
164
+
165
+ ## TODO
166
+
167
+ Lot of specs missing, this first version of second approach was developed in playground mode. ;o)
168
+
169
+
170
+
64
171
  ## Foo …
65
172
 
66
173
  "Uh, excuse me Sir … just one more question." — Columbo (Peter Falk †)
67
174
 
175
+
176
+
68
177
  ## License
69
178
 
70
179
  MIT/X11 — see `LICENSE.txt`
data/Rakefile CHANGED
@@ -51,6 +51,7 @@ end
51
51
  desc "Fetch and save public suffix data (task for updates)"
52
52
  task :fetch_data do
53
53
  require "ryodo"
54
+ require "ryodo/suffix_list_fetcher"
54
55
  Ryodo::SuffixListFetcher.fetch_and_save!
55
56
  end
56
57
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.3
1
+ 0.1.0
@@ -9,7 +9,7 @@ def checkPublicSuffix query, expectation
9
9
  calculated = q.domain.nil? ? "NULL" : q.domain
10
10
  passed = (calculated==expectation) ? " OK" : "FAIL"
11
11
 
12
- puts "#{passed} === Q: #{query.ljust(20)} | #{expectation.rjust(20)} <=> #{calculated.ljust(20)}"
12
+ puts "#{passed} === Q: #{query.ljust(26)} | #{expectation.rjust(16)} <=> #{calculated.ljust(16)}"
13
13
  end
14
14
 
15
15
  # NULL input.
@@ -23,6 +23,11 @@ checkPublicSuffix('.com', 'NULL')
23
23
  checkPublicSuffix('.example', 'NULL')
24
24
  checkPublicSuffix('.example.com', 'NULL')
25
25
  checkPublicSuffix('.example.example', 'NULL')
26
+ #Trailing dot (FQDN).
27
+ checkPublicSuffix('com.', 'NULL')
28
+ checkPublicSuffix('example.com.', 'example.com')
29
+ checkPublicSuffix('www.example.com.', 'example.com')
30
+ checkPublicSuffix('www.subdomain.example.com.', 'example.com')
26
31
  # Unlisted TLD.
27
32
  checkPublicSuffix('example', 'NULL')
28
33
  checkPublicSuffix('example.example', 'NULL')
@@ -20,6 +20,7 @@ require "ryodo/suffix_list"
20
20
 
21
21
  require "ryodo/methods"
22
22
  require "ryodo/ext/string"
23
+ #require "ryodo/ext/uri"
23
24
 
24
25
  # Convenient shorthands
25
26
  module Ryodo
@@ -0,0 +1,12 @@
1
+ # encoding: utf-8
2
+ require "uri"
3
+
4
+ class URI::Generic
5
+
6
+ alias_method :set_host_string, :set_host
7
+
8
+ def set_host(v)
9
+ @host = Ryodo.parse(self.set_host_string(v)) unless self.set_host_string(v).nil?
10
+ end
11
+
12
+ end
@@ -9,7 +9,6 @@ module Ryodo
9
9
  end
10
10
 
11
11
  def build!
12
-
13
12
  Ryodo::SuffixList.list.each do |line|
14
13
 
15
14
  line.each.with_index do |node_name, idx|
@@ -33,11 +32,9 @@ module Ryodo
33
32
  end
34
33
 
35
34
  end
36
-
37
35
  end
38
36
 
39
37
  def select_rule(rule_path)
40
-
41
38
  path = rule_path.dup
42
39
 
43
40
  if current = path.pop
@@ -51,7 +48,6 @@ module Ryodo
51
48
  end
52
49
 
53
50
  end
54
-
55
51
  end
56
52
 
57
53
  def match(path)
@@ -70,7 +66,6 @@ module Ryodo
70
66
  if match && !match.children.keys.include?(domain[0]) && domain[0]
71
67
  [ suffix, [domain.shift], domain ]
72
68
  end
73
-
74
69
  end
75
70
 
76
71
  end
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "ryodo"
8
- s.version = "0.0.3"
8
+ s.version = "0.1.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Christoph Grabo"]
@@ -36,6 +36,7 @@ Gem::Specification.new do |s|
36
36
  "lib/ryodo/convenience/.u.rb",
37
37
  "lib/ryodo/domain.rb",
38
38
  "lib/ryodo/ext/string.rb",
39
+ "lib/ryodo/ext/uri.rb",
39
40
  "lib/ryodo/methods.rb",
40
41
  "lib/ryodo/parser.rb",
41
42
  "lib/ryodo/rule.rb",
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ryodo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -150,6 +150,7 @@ files:
150
150
  - lib/ryodo/convenience/.u.rb
151
151
  - lib/ryodo/domain.rb
152
152
  - lib/ryodo/ext/string.rb
153
+ - lib/ryodo/ext/uri.rb
153
154
  - lib/ryodo/methods.rb
154
155
  - lib/ryodo/parser.rb
155
156
  - lib/ryodo/rule.rb
@@ -177,7 +178,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
177
178
  version: '0'
178
179
  segments:
179
180
  - 0
180
- hash: -1101056168484725658
181
+ hash: -130552580166080210
181
182
  required_rubygems_version: !ruby/object:Gem::Requirement
182
183
  none: false
183
184
  requirements: