public_suffix 2.0.5 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +14 -0
- data/.rubocop_defaults.yml +54 -15
- data/.travis.yml +6 -3
- data/CHANGELOG.md +18 -9
- data/Gemfile +2 -2
- data/README.md +14 -0
- data/Rakefile +5 -3
- data/bin/console +14 -0
- data/data/list.txt +462 -82
- data/lib/public_suffix.rb +20 -16
- data/lib/public_suffix/list.rb +66 -107
- data/lib/public_suffix/rule.rb +42 -52
- data/lib/public_suffix/version.rb +1 -1
- data/public_suffix.gemspec +1 -1
- data/test/.empty +2 -0
- data/test/acceptance_test.rb +10 -2
- data/test/benchmarks/bm_find.rb +66 -0
- data/test/benchmarks/bm_find_all.rb +102 -0
- data/test/benchmarks/bm_names.rb +91 -0
- data/test/benchmarks/bm_select.rb +26 -0
- data/test/benchmarks/bm_select_incremental.rb +25 -0
- data/test/benchmarks/bm_valid.rb +101 -0
- data/test/profilers/domain_profiler.rb +12 -0
- data/test/profilers/find_profiler.rb +12 -0
- data/test/profilers/find_profiler_jp.rb +12 -0
- data/test/{initialization_profiler.rb → profilers/initialization_profiler.rb} +1 -1
- data/test/profilers/list_profsize.rb +11 -0
- data/test/profilers/object_binsize.rb +57 -0
- data/test/psl_test.rb +1 -1
- data/test/test_helper.rb +0 -8
- data/test/unit/domain_test.rb +15 -15
- data/test/unit/list_test.rb +46 -66
- data/test/unit/public_suffix_test.rb +5 -5
- data/test/unit/rule_test.rb +45 -49
- metadata +30 -12
- data/test/benchmark_helper.rb +0 -4
- data/test/execution_profiler.rb +0 -14
- data/test/performance_benchmark.rb +0 -38
data/public_suffix.gemspec
CHANGED
@@ -12,7 +12,7 @@ Gem::Specification.new do |s|
|
|
12
12
|
s.description = "PublicSuffix can parse and decompose a domain name into top level domain, domain and subdomains."
|
13
13
|
s.licenses = ["MIT"]
|
14
14
|
|
15
|
-
s.required_ruby_version = ">= 2.
|
15
|
+
s.required_ruby_version = ">= 2.1"
|
16
16
|
|
17
17
|
s.require_paths = ["lib"]
|
18
18
|
s.files = `git ls-files`.split("\n")
|
data/test/.empty
ADDED
data/test/acceptance_test.rb
CHANGED
@@ -19,7 +19,11 @@ class AcceptanceTest < Minitest::Test
|
|
19
19
|
trd, sld, tld = results
|
20
20
|
assert_equal tld, parsed.tld, "Invalid tld for `#{name}`"
|
21
21
|
assert_equal sld, parsed.sld, "Invalid sld for `#{name}`"
|
22
|
-
|
22
|
+
if trd.nil?
|
23
|
+
assert_nil parsed.trd, "Invalid trd for `#{name}`"
|
24
|
+
else
|
25
|
+
assert_equal trd, parsed.trd, "Invalid trd for `#{name}`"
|
26
|
+
end
|
23
27
|
|
24
28
|
assert_equal domain, PublicSuffix.domain(input)
|
25
29
|
assert PublicSuffix.valid?(input)
|
@@ -93,7 +97,11 @@ class AcceptanceTest < Minitest::Test
|
|
93
97
|
def test_ignore_private
|
94
98
|
# test domain and parse
|
95
99
|
INCLUDE_PRIVATE_CASES.each do |given, ignore_private, expected|
|
96
|
-
|
100
|
+
if expected.nil?
|
101
|
+
assert_nil PublicSuffix.domain(given, ignore_private: ignore_private)
|
102
|
+
else
|
103
|
+
assert_equal expected, PublicSuffix.domain(given, ignore_private: ignore_private)
|
104
|
+
end
|
97
105
|
end
|
98
106
|
# test valid?
|
99
107
|
INCLUDE_PRIVATE_CASES.each do |given, ignore_private, expected|
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require 'benchmark'
|
2
|
+
require_relative "../../lib/public_suffix"
|
3
|
+
|
4
|
+
NAME_SHORT = "example.de"
|
5
|
+
NAME_MEDIUM = "www.subdomain.example.de"
|
6
|
+
NAME_LONG = "one.two.three.four.five.example.de"
|
7
|
+
NAME_WILD = "one.two.three.four.five.example.bd"
|
8
|
+
NAME_EXCP = "one.two.three.four.five.www.ck"
|
9
|
+
|
10
|
+
IAAA = "www.example.ac"
|
11
|
+
IZZZ = "www.example.zone"
|
12
|
+
|
13
|
+
PAAA = "one.two.three.four.five.example.beep.pl"
|
14
|
+
PZZZ = "one.two.three.four.five.example.now.sh"
|
15
|
+
|
16
|
+
JP = "www.yokoshibahikari.chiba.jp"
|
17
|
+
IT = "www.example.it"
|
18
|
+
COM = "www.example.com"
|
19
|
+
|
20
|
+
TIMES = (ARGV.first || 50_000).to_i
|
21
|
+
|
22
|
+
# Initialize
|
23
|
+
PublicSuffixList = PublicSuffix::List.default
|
24
|
+
PublicSuffixList.find("example.com")
|
25
|
+
|
26
|
+
Benchmark.bmbm(25) do |x|
|
27
|
+
x.report("NAME_SHORT") do
|
28
|
+
TIMES.times { PublicSuffixList.find(NAME_SHORT) != nil }
|
29
|
+
end
|
30
|
+
x.report("NAME_MEDIUM") do
|
31
|
+
TIMES.times { PublicSuffixList.find(NAME_MEDIUM) != nil }
|
32
|
+
end
|
33
|
+
x.report("NAME_LONG") do
|
34
|
+
TIMES.times { PublicSuffixList.find(NAME_LONG) != nil }
|
35
|
+
end
|
36
|
+
x.report("NAME_WILD") do
|
37
|
+
TIMES.times { PublicSuffixList.find(NAME_WILD) != nil }
|
38
|
+
end
|
39
|
+
x.report("NAME_EXCP") do
|
40
|
+
TIMES.times { PublicSuffixList.find(NAME_EXCP) != nil }
|
41
|
+
end
|
42
|
+
|
43
|
+
x.report("IAAA") do
|
44
|
+
TIMES.times { PublicSuffixList.find(IAAA) != nil }
|
45
|
+
end
|
46
|
+
x.report("IZZZ") do
|
47
|
+
TIMES.times { PublicSuffixList.find(IZZZ) != nil }
|
48
|
+
end
|
49
|
+
|
50
|
+
x.report("PAAA") do
|
51
|
+
TIMES.times { PublicSuffixList.find(PAAA) != nil }
|
52
|
+
end
|
53
|
+
x.report("PZZZ") do
|
54
|
+
TIMES.times { PublicSuffixList.find(PZZZ) != nil }
|
55
|
+
end
|
56
|
+
|
57
|
+
x.report("JP") do
|
58
|
+
TIMES.times { PublicSuffixList.find(JP) != nil }
|
59
|
+
end
|
60
|
+
x.report("IT") do
|
61
|
+
TIMES.times { PublicSuffixList.find(IT) != nil }
|
62
|
+
end
|
63
|
+
x.report("COM") do
|
64
|
+
TIMES.times { PublicSuffixList.find(COM) != nil }
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
require 'benchmark'
|
2
|
+
require_relative "../../lib/public_suffix"
|
3
|
+
|
4
|
+
NAME_SHORT = "example.de"
|
5
|
+
NAME_MEDIUM = "www.subdomain.example.de"
|
6
|
+
NAME_LONG = "one.two.three.four.five.example.de"
|
7
|
+
NAME_WILD = "one.two.three.four.five.example.bd"
|
8
|
+
NAME_EXCP = "one.two.three.four.five.www.ck"
|
9
|
+
|
10
|
+
IAAA = "www.example.ac"
|
11
|
+
IZZZ = "www.example.zone"
|
12
|
+
|
13
|
+
PAAA = "one.two.three.four.five.example.beep.pl"
|
14
|
+
PZZZ = "one.two.three.four.five.example.now.sh"
|
15
|
+
|
16
|
+
JP = "www.yokoshibahikari.chiba.jp"
|
17
|
+
IT = "www.example.it"
|
18
|
+
COM = "www.example.com"
|
19
|
+
|
20
|
+
TIMES = (ARGV.first || 50_000).to_i
|
21
|
+
|
22
|
+
# Initialize
|
23
|
+
PublicSuffixList = PublicSuffix::List.default
|
24
|
+
PublicSuffixList.find("example.com")
|
25
|
+
|
26
|
+
Benchmark.bmbm(25) do |x|
|
27
|
+
x.report("NAME_SHORT") do
|
28
|
+
TIMES.times { PublicSuffixList.find(NAME_SHORT) != nil }
|
29
|
+
end
|
30
|
+
x.report("NAME_SHORT (noprivate)") do
|
31
|
+
TIMES.times { PublicSuffixList.find(NAME_SHORT, ignore_private: true) != nil }
|
32
|
+
end
|
33
|
+
x.report("NAME_MEDIUM") do
|
34
|
+
TIMES.times { PublicSuffixList.find(NAME_MEDIUM) != nil }
|
35
|
+
end
|
36
|
+
x.report("NAME_MEDIUM (noprivate)") do
|
37
|
+
TIMES.times { PublicSuffixList.find(NAME_MEDIUM, ignore_private: true) != nil }
|
38
|
+
end
|
39
|
+
x.report("NAME_LONG") do
|
40
|
+
TIMES.times { PublicSuffixList.find(NAME_LONG) != nil }
|
41
|
+
end
|
42
|
+
x.report("NAME_LONG (noprivate)") do
|
43
|
+
TIMES.times { PublicSuffixList.find(NAME_LONG, ignore_private: true) != nil }
|
44
|
+
end
|
45
|
+
x.report("NAME_WILD") do
|
46
|
+
TIMES.times { PublicSuffixList.find(NAME_WILD) != nil }
|
47
|
+
end
|
48
|
+
x.report("NAME_WILD (noprivate)") do
|
49
|
+
TIMES.times { PublicSuffixList.find(NAME_WILD, ignore_private: true) != nil }
|
50
|
+
end
|
51
|
+
x.report("NAME_EXCP") do
|
52
|
+
TIMES.times { PublicSuffixList.find(NAME_EXCP) != nil }
|
53
|
+
end
|
54
|
+
x.report("NAME_EXCP (noprivate)") do
|
55
|
+
TIMES.times { PublicSuffixList.find(NAME_EXCP, ignore_private: true) != nil }
|
56
|
+
end
|
57
|
+
|
58
|
+
x.report("IAAA") do
|
59
|
+
TIMES.times { PublicSuffixList.find(IAAA) != nil }
|
60
|
+
end
|
61
|
+
x.report("IAAA (noprivate)") do
|
62
|
+
TIMES.times { PublicSuffixList.find(IAAA, ignore_private: true) != nil }
|
63
|
+
end
|
64
|
+
x.report("IZZZ") do
|
65
|
+
TIMES.times { PublicSuffixList.find(IZZZ) != nil }
|
66
|
+
end
|
67
|
+
x.report("IZZZ (noprivate)") do
|
68
|
+
TIMES.times { PublicSuffixList.find(IZZZ, ignore_private: true) != nil }
|
69
|
+
end
|
70
|
+
|
71
|
+
x.report("PAAA") do
|
72
|
+
TIMES.times { PublicSuffixList.find(PAAA) != nil }
|
73
|
+
end
|
74
|
+
x.report("PAAA (noprivate)") do
|
75
|
+
TIMES.times { PublicSuffixList.find(PAAA, ignore_private: true) != nil }
|
76
|
+
end
|
77
|
+
x.report("PZZZ") do
|
78
|
+
TIMES.times { PublicSuffixList.find(PZZZ) != nil }
|
79
|
+
end
|
80
|
+
x.report("PZZZ (noprivate)") do
|
81
|
+
TIMES.times { PublicSuffixList.find(PZZZ, ignore_private: true) != nil }
|
82
|
+
end
|
83
|
+
|
84
|
+
x.report("JP") do
|
85
|
+
TIMES.times { PublicSuffixList.find(JP) != nil }
|
86
|
+
end
|
87
|
+
x.report("JP (noprivate)") do
|
88
|
+
TIMES.times { PublicSuffixList.find(JP, ignore_private: true) != nil }
|
89
|
+
end
|
90
|
+
x.report("IT") do
|
91
|
+
TIMES.times { PublicSuffixList.find(IT) != nil }
|
92
|
+
end
|
93
|
+
x.report("IT (noprivate)") do
|
94
|
+
TIMES.times { PublicSuffixList.find(IT, ignore_private: true) != nil }
|
95
|
+
end
|
96
|
+
x.report("COM") do
|
97
|
+
TIMES.times { PublicSuffixList.find(COM) != nil }
|
98
|
+
end
|
99
|
+
x.report("COM (noprivate)") do
|
100
|
+
TIMES.times { PublicSuffixList.find(COM, ignore_private: true) != nil }
|
101
|
+
end
|
102
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
require 'benchmark/ips'
|
2
|
+
|
3
|
+
STRING = "www.subdomain.example.com"
|
4
|
+
ARRAY = %w(
|
5
|
+
com
|
6
|
+
example.com
|
7
|
+
subdomain.example.com
|
8
|
+
www.subdomain.example.com
|
9
|
+
)
|
10
|
+
|
11
|
+
def tokenizer1(string)
|
12
|
+
parts = string.split(".").reverse!
|
13
|
+
index = 0
|
14
|
+
query = parts[index]
|
15
|
+
names = []
|
16
|
+
|
17
|
+
loop do
|
18
|
+
names << query
|
19
|
+
|
20
|
+
index += 1
|
21
|
+
break if index >= parts.size
|
22
|
+
query = parts[index] + "." + query
|
23
|
+
end
|
24
|
+
names
|
25
|
+
end
|
26
|
+
|
27
|
+
def tokenizer2(string)
|
28
|
+
parts = string.split(".")
|
29
|
+
index = parts.size - 1
|
30
|
+
query = parts[index]
|
31
|
+
names = []
|
32
|
+
|
33
|
+
loop do
|
34
|
+
names << query
|
35
|
+
|
36
|
+
index -= 1
|
37
|
+
break if index < 0
|
38
|
+
query = parts[index] + "." + query
|
39
|
+
end
|
40
|
+
names
|
41
|
+
end
|
42
|
+
|
43
|
+
def tokenizer3(string)
|
44
|
+
isx = string.size
|
45
|
+
idx = string.size - 1
|
46
|
+
names = []
|
47
|
+
|
48
|
+
loop do
|
49
|
+
isx = string.rindex(".", isx - 1) || -1
|
50
|
+
names << string[isx + 1, idx - isx]
|
51
|
+
|
52
|
+
break if isx <= 0
|
53
|
+
end
|
54
|
+
names
|
55
|
+
end
|
56
|
+
|
57
|
+
def tokenizer4(string)
|
58
|
+
isx = string.size
|
59
|
+
idx = string.size - 1
|
60
|
+
names = []
|
61
|
+
|
62
|
+
loop do
|
63
|
+
isx = string.rindex(".", isx - 1) || -1
|
64
|
+
names << string[(isx+1)..idx]
|
65
|
+
|
66
|
+
break if isx <= 0
|
67
|
+
end
|
68
|
+
names
|
69
|
+
end
|
70
|
+
|
71
|
+
(x = tokenizer1(STRING)) == ARRAY or fail("tokenizer1 failed: #{x.inspect}")
|
72
|
+
(x = tokenizer2(STRING)) == ARRAY or fail("tokenizer2 failed: #{x.inspect}")
|
73
|
+
(x = tokenizer3(STRING)) == ARRAY or fail("tokenizer3 failed: #{x.inspect}")
|
74
|
+
(x = tokenizer4(STRING)) == ARRAY or fail("tokenizer4 failed: #{x.inspect}")
|
75
|
+
|
76
|
+
Benchmark.ips do |x|
|
77
|
+
x.report("tokenizer1") do
|
78
|
+
tokenizer1(STRING).is_a?(Array)
|
79
|
+
end
|
80
|
+
x.report("tokenizer2") do
|
81
|
+
tokenizer2(STRING).is_a?(Array)
|
82
|
+
end
|
83
|
+
x.report("tokenizer3") do
|
84
|
+
tokenizer3(STRING).is_a?(Array)
|
85
|
+
end
|
86
|
+
x.report("tokenizer4") do
|
87
|
+
tokenizer4(STRING).is_a?(Array)
|
88
|
+
end
|
89
|
+
|
90
|
+
x.compare!
|
91
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'benchmark'
|
2
|
+
require_relative "../../lib/public_suffix"
|
3
|
+
|
4
|
+
JP = "www.yokoshibahikari.chiba.jp"
|
5
|
+
|
6
|
+
TIMES = (ARGV.first || 50_000).to_i
|
7
|
+
|
8
|
+
# Initialize
|
9
|
+
class PublicSuffix::List
|
10
|
+
public :select
|
11
|
+
end
|
12
|
+
PublicSuffixList = PublicSuffix::List.default
|
13
|
+
PublicSuffixList.select("example.jp")
|
14
|
+
PublicSuffixList.find("example.jp")
|
15
|
+
|
16
|
+
Benchmark.bmbm(25) do |x|
|
17
|
+
x.report("JP select") do
|
18
|
+
TIMES.times { PublicSuffixList.select(JP) }
|
19
|
+
end
|
20
|
+
x.report("JP find") do
|
21
|
+
TIMES.times { PublicSuffixList.find(JP) }
|
22
|
+
end
|
23
|
+
# x.report("JP (noprivate)") do
|
24
|
+
# TIMES.times { PublicSuffixList.find(JP, ignore_private: true) != nil }
|
25
|
+
# end
|
26
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'benchmark'
|
2
|
+
require_relative "../../lib/public_suffix"
|
3
|
+
|
4
|
+
JP = "www.yokoshibahikari.chiba.jp"
|
5
|
+
|
6
|
+
TIMES = (ARGV.first || 50_000).to_i
|
7
|
+
|
8
|
+
# Initialize
|
9
|
+
class PublicSuffix::List
|
10
|
+
public :select
|
11
|
+
end
|
12
|
+
PublicSuffixList = PublicSuffix::List.default
|
13
|
+
PublicSuffixList.select("example.jp")
|
14
|
+
|
15
|
+
Benchmark.bmbm(25) do |x|
|
16
|
+
x.report("select jp") do
|
17
|
+
TIMES.times { PublicSuffixList.select("jp") }
|
18
|
+
end
|
19
|
+
x.report("select example.jp") do
|
20
|
+
TIMES.times { PublicSuffixList.select("example.jp") }
|
21
|
+
end
|
22
|
+
x.report("select www.example.jp") do
|
23
|
+
TIMES.times { PublicSuffixList.select("www.example.jp") }
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
require 'benchmark'
|
2
|
+
require_relative "../../lib/public_suffix"
|
3
|
+
|
4
|
+
NAME_SHORT = "example.de"
|
5
|
+
NAME_MEDIUM = "www.subdomain.example.de"
|
6
|
+
NAME_LONG = "one.two.three.four.five.example.de"
|
7
|
+
NAME_WILD = "one.two.three.four.five.example.bd"
|
8
|
+
NAME_EXCP = "one.two.three.four.five.www.ck"
|
9
|
+
|
10
|
+
IAAA = "www.example.ac"
|
11
|
+
IZZZ = "www.example.zone"
|
12
|
+
|
13
|
+
PAAA = "one.two.three.four.five.example.beep.pl"
|
14
|
+
PZZZ = "one.two.three.four.five.example.now.sh"
|
15
|
+
|
16
|
+
JP = "www.yokoshibahikari.chiba.jp"
|
17
|
+
IT = "www.example.it"
|
18
|
+
COM = "www.example.com"
|
19
|
+
|
20
|
+
TIMES = (ARGV.first || 50_000).to_i
|
21
|
+
|
22
|
+
# Initialize
|
23
|
+
PublicSuffix.valid?("example.com")
|
24
|
+
|
25
|
+
Benchmark.bmbm(25) do |x|
|
26
|
+
x.report("NAME_SHORT") do
|
27
|
+
TIMES.times { PublicSuffix.valid?(NAME_SHORT) == true }
|
28
|
+
end
|
29
|
+
x.report("NAME_SHORT (noprivate)") do
|
30
|
+
TIMES.times { PublicSuffix.valid?(NAME_SHORT, ignore_private: true) == true }
|
31
|
+
end
|
32
|
+
x.report("NAME_MEDIUM") do
|
33
|
+
TIMES.times { PublicSuffix.valid?(NAME_MEDIUM) == true }
|
34
|
+
end
|
35
|
+
x.report("NAME_MEDIUM (noprivate)") do
|
36
|
+
TIMES.times { PublicSuffix.valid?(NAME_MEDIUM, ignore_private: true) == true }
|
37
|
+
end
|
38
|
+
x.report("NAME_LONG") do
|
39
|
+
TIMES.times { PublicSuffix.valid?(NAME_LONG) == true }
|
40
|
+
end
|
41
|
+
x.report("NAME_LONG (noprivate)") do
|
42
|
+
TIMES.times { PublicSuffix.valid?(NAME_LONG, ignore_private: true) == true }
|
43
|
+
end
|
44
|
+
x.report("NAME_WILD") do
|
45
|
+
TIMES.times { PublicSuffix.valid?(NAME_WILD) == true }
|
46
|
+
end
|
47
|
+
x.report("NAME_WILD (noprivate)") do
|
48
|
+
TIMES.times { PublicSuffix.valid?(NAME_WILD, ignore_private: true) == true }
|
49
|
+
end
|
50
|
+
x.report("NAME_EXCP") do
|
51
|
+
TIMES.times { PublicSuffix.valid?(NAME_EXCP) == true }
|
52
|
+
end
|
53
|
+
x.report("NAME_EXCP (noprivate)") do
|
54
|
+
TIMES.times { PublicSuffix.valid?(NAME_EXCP, ignore_private: true) == true }
|
55
|
+
end
|
56
|
+
|
57
|
+
x.report("IAAA") do
|
58
|
+
TIMES.times { PublicSuffix.valid?(IAAA) == true }
|
59
|
+
end
|
60
|
+
x.report("IAAA (noprivate)") do
|
61
|
+
TIMES.times { PublicSuffix.valid?(IAAA, ignore_private: true) == true }
|
62
|
+
end
|
63
|
+
x.report("IZZZ") do
|
64
|
+
TIMES.times { PublicSuffix.valid?(IZZZ) == true }
|
65
|
+
end
|
66
|
+
x.report("IZZZ (noprivate)") do
|
67
|
+
TIMES.times { PublicSuffix.valid?(IZZZ, ignore_private: true) == true }
|
68
|
+
end
|
69
|
+
|
70
|
+
x.report("PAAA") do
|
71
|
+
TIMES.times { PublicSuffix.valid?(PAAA) == true }
|
72
|
+
end
|
73
|
+
x.report("PAAA (noprivate)") do
|
74
|
+
TIMES.times { PublicSuffix.valid?(PAAA, ignore_private: true) == true }
|
75
|
+
end
|
76
|
+
x.report("PZZZ") do
|
77
|
+
TIMES.times { PublicSuffix.valid?(PZZZ) == true }
|
78
|
+
end
|
79
|
+
x.report("PZZZ (noprivate)") do
|
80
|
+
TIMES.times { PublicSuffix.valid?(PZZZ, ignore_private: true) == true }
|
81
|
+
end
|
82
|
+
|
83
|
+
x.report("JP") do
|
84
|
+
TIMES.times { PublicSuffix.valid?(JP) == true }
|
85
|
+
end
|
86
|
+
x.report("JP (noprivate)") do
|
87
|
+
TIMES.times { PublicSuffix.valid?(JP, ignore_private: true) == true }
|
88
|
+
end
|
89
|
+
x.report("IT") do
|
90
|
+
TIMES.times { PublicSuffix.valid?(IT) == true }
|
91
|
+
end
|
92
|
+
x.report("IT (noprivate)") do
|
93
|
+
TIMES.times { PublicSuffix.valid?(IT, ignore_private: true) == true }
|
94
|
+
end
|
95
|
+
x.report("COM") do
|
96
|
+
TIMES.times { PublicSuffix.valid?(COM) == true }
|
97
|
+
end
|
98
|
+
x.report("COM (noprivate)") do
|
99
|
+
TIMES.times { PublicSuffix.valid?(COM, ignore_private: true) == true }
|
100
|
+
end
|
101
|
+
end
|