iGEL-ua_parser 0.0.1
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.rdoc +50 -0
- data/Rakefile +12 -0
- data/apache_log_tester.rb +138 -0
- data/lib/ua_parser/user_agent.rb +492 -0
- data/lib/ua_parser/version.rb +85 -0
- data/lib/ua_parser.rb +2 -0
- data/test/crawler_test.rb +620 -0
- data/test/gecko_test.rb +493 -0
- data/test/other_test.rb +146 -0
- data/test/presto_test.rb +169 -0
- data/test/trident_test.rb +146 -0
- data/test/version_test.rb +130 -0
- data/test/webkit_test.rb +242 -0
- data/ua_parser.gemspec +32 -0
- metadata +81 -0
@@ -0,0 +1,85 @@
|
|
1
|
+
module UaParser
|
2
|
+
# This class stores the version number for comparison and printing out the
|
3
|
+
# major version
|
4
|
+
class Version
|
5
|
+
include Comparable
|
6
|
+
|
7
|
+
attr_reader :name
|
8
|
+
|
9
|
+
class DifferentAgentsNotComparable < RuntimeError
|
10
|
+
end
|
11
|
+
|
12
|
+
# Initializes a new Version object with the given version number (you should
|
13
|
+
# pass it as a String). Optional you may pass a user agent name as a Symbol,
|
14
|
+
# which allows #major to print out the version number in the common way.
|
15
|
+
def initialize(version, name = nil)
|
16
|
+
version = version.to_s if version.is_a?(Integer) || version.is_a?(Float)
|
17
|
+
raise TypeError, "version must be a String, Integer or Float, but was a #{version.class}" unless version.is_a?(String)
|
18
|
+
@tokens = version.split(/(\.|_|[a-z]+)/)
|
19
|
+
@tokens.delete_if { |t| t == "." || t == "_" }
|
20
|
+
insert_zeros_before = []
|
21
|
+
@tokens.each_index do |i|
|
22
|
+
if @tokens[i] =~ /\A[0-9]+\Z/
|
23
|
+
while @tokens[i] =~ /\A0[0-9]/ # Remember zeros, but chop them of for now
|
24
|
+
insert_zeros_before << i
|
25
|
+
@tokens[i] = @tokens[i][1..-1]
|
26
|
+
end
|
27
|
+
@tokens[i] = @tokens[i].to_i
|
28
|
+
end
|
29
|
+
end
|
30
|
+
insert_zeros_before.each do |i| # Insert zeros again
|
31
|
+
@tokens.insert(i, 0)
|
32
|
+
end
|
33
|
+
@version = version
|
34
|
+
@name = name
|
35
|
+
end
|
36
|
+
|
37
|
+
# Returns -1, if the given version is smaller than the current one, 0 if
|
38
|
+
# they are equal and 1 if the current version is bigger. Used by Comparable
|
39
|
+
# to provide funktions like <, >= or between?
|
40
|
+
def <=>(other)
|
41
|
+
raise TypeError unless other.is_a?(Version)
|
42
|
+
raise DifferentAgentsNotComparable, "Cannot compare #{@name} and #{other.name}" unless @name == other.name
|
43
|
+
i_sort(other)
|
44
|
+
end
|
45
|
+
|
46
|
+
# Returns the whole version number, as given by the by the user agent.
|
47
|
+
def full
|
48
|
+
@version
|
49
|
+
end
|
50
|
+
|
51
|
+
# Returns the major version, e.g. "3.0", "2.0b" or "1.5" for Firefox,
|
52
|
+
# "9.6" for Opera or "7.0" or "5.5" for Internet Explorer
|
53
|
+
def major
|
54
|
+
if @name == :opera || (@name == :netscape && self >= Version.new(5, :netscape))
|
55
|
+
return "#{@tokens[0]}.#{@tokens[1].to_s[0...1]}"
|
56
|
+
elsif [:internet_explorer, :navigator].include?(@name) && @tokens[1] == 0
|
57
|
+
return "#{@tokens[0]}"
|
58
|
+
elsif @tokens.size == 1
|
59
|
+
return "#{@tokens[0]}"
|
60
|
+
elsif @tokens[2].is_a?(String)
|
61
|
+
return "#{@tokens[0]}.#{@tokens[1]}#{@tokens[2]}"
|
62
|
+
else
|
63
|
+
return "#{@tokens[0]}.#{@tokens[1]}"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
protected
|
68
|
+
# Required by i_sort
|
69
|
+
def tokens
|
70
|
+
@tokens
|
71
|
+
end
|
72
|
+
|
73
|
+
private
|
74
|
+
# Used to recursively compare the version numbers
|
75
|
+
def i_sort(other, deep = 0)
|
76
|
+
return 0 if @tokens[deep].nil? && other.tokens[deep].nil?
|
77
|
+
my_token = @tokens[deep] || 0
|
78
|
+
other_token = other.tokens[deep] || 0
|
79
|
+
return 1 if my_token.is_a?(Integer) && other_token.is_a?(String)
|
80
|
+
return -1 if my_token.is_a?(String) && other_token.is_a?(Integer)
|
81
|
+
return i_sort(other, deep + 1) if my_token == other_token
|
82
|
+
return my_token <=> other_token
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
data/lib/ua_parser.rb
ADDED
@@ -0,0 +1,620 @@
|
|
1
|
+
$:.unshift File.join(File.dirname(__FILE__),'..','lib')
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require 'ua_parser'
|
5
|
+
|
6
|
+
class CrawlerTest < Test::Unit::TestCase
|
7
|
+
include UaParser
|
8
|
+
|
9
|
+
def test_baiduspider
|
10
|
+
ua = UserAgent.new "Baiduspider+(+http://www.baidu.com/search/spider.htm)"
|
11
|
+
assert ua.known?
|
12
|
+
assert ua.bot?
|
13
|
+
assert !ua.browser?
|
14
|
+
assert !ua.feed_reader?
|
15
|
+
assert !ua.other?
|
16
|
+
assert_equal nil, ua.render_engine
|
17
|
+
assert_equal nil, ua.render_engine_version
|
18
|
+
assert_equal :baiduspider, ua.name
|
19
|
+
assert_equal nil, ua.version
|
20
|
+
assert_equal [], ua.emails
|
21
|
+
assert_equal nil, ua.email
|
22
|
+
assert_equal ["http://www.baidu.com/search/spider.htm"], ua.urls
|
23
|
+
assert_equal "http://www.baidu.com/search/spider.htm", ua.url
|
24
|
+
[:architecture, :os, :os_type, :os_version, :ui_lang, :ui_lang_country, :vendor].each do |method|
|
25
|
+
assert_raise NotImplementedError do
|
26
|
+
ua.method(method).call
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_cuil_twiceler_0_9
|
32
|
+
ua = UserAgent.new "Mozilla/5.0 (Twiceler-0.9 http://www.cuil.com/twiceler/robot.html)"
|
33
|
+
assert ua.known?
|
34
|
+
assert ua.bot?
|
35
|
+
assert !ua.browser?
|
36
|
+
assert !ua.feed_reader?
|
37
|
+
assert !ua.other?
|
38
|
+
assert_equal nil, ua.render_engine
|
39
|
+
assert_equal nil, ua.render_engine_version
|
40
|
+
assert_equal :"twiceler", ua.name
|
41
|
+
assert_equal "0.9", ua.version.full
|
42
|
+
assert_equal "0.9", ua.version.major
|
43
|
+
assert_equal [], ua.emails
|
44
|
+
assert_equal nil, ua.email
|
45
|
+
assert_equal ["http://www.cuil.com/twiceler/robot.html"], ua.urls
|
46
|
+
assert_equal "http://www.cuil.com/twiceler/robot.html", ua.url
|
47
|
+
[:architecture, :dotnet_versions, :os, :os_type, :os_version, :ui_lang, :ui_lang_country, :vendor].each do |method|
|
48
|
+
assert_raise NotImplementedError do
|
49
|
+
ua.method(method).call
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_cuil_0_9_twiceler_wrong_domain
|
55
|
+
ua = UserAgent.new "Mozilla/5.0 (Twiceler-0.9 http://www.cuill.com/twiceler/robot.html)"
|
56
|
+
assert ua.known?
|
57
|
+
assert ua.bot?
|
58
|
+
assert !ua.browser?
|
59
|
+
assert !ua.feed_reader?
|
60
|
+
assert !ua.other?
|
61
|
+
assert_equal nil, ua.render_engine
|
62
|
+
assert_equal nil, ua.render_engine_version
|
63
|
+
assert_equal :"twiceler", ua.name
|
64
|
+
assert_equal "0.9", ua.version.major
|
65
|
+
assert_equal "0.9", ua.version.full
|
66
|
+
assert_equal [], ua.emails
|
67
|
+
assert_equal nil, ua.email
|
68
|
+
assert_equal ["http://www.cuill.com/twiceler/robot.html"], ua.urls
|
69
|
+
assert_equal "http://www.cuill.com/twiceler/robot.html", ua.url
|
70
|
+
[:architecture, :dotnet_versions, :os, :os_type, :os_version, :ui_lang, :ui_lang_country, :vendor].each do |method|
|
71
|
+
assert_raise NotImplementedError do
|
72
|
+
ua.method(method).call
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def test_gigabot_3_0
|
78
|
+
ua = UserAgent.new "Gigabot/3.0 (http://www.gigablast.com/spider.html)"
|
79
|
+
assert ua.known?
|
80
|
+
assert ua.bot?
|
81
|
+
assert !ua.browser?
|
82
|
+
assert !ua.feed_reader?
|
83
|
+
assert !ua.other?
|
84
|
+
assert_equal nil, ua.render_engine
|
85
|
+
assert_equal nil, ua.render_engine_version
|
86
|
+
assert_equal :gigabot, ua.name
|
87
|
+
assert_equal "3.0", ua.version.full
|
88
|
+
assert_equal "3.0", ua.version.major
|
89
|
+
assert_equal [], ua.emails
|
90
|
+
assert_equal nil, ua.email
|
91
|
+
assert_equal ["http://www.gigablast.com/spider.html"], ua.urls
|
92
|
+
assert_equal "http://www.gigablast.com/spider.html", ua.url
|
93
|
+
[:architecture, :dotnet_versions, :os, :os_type, :os_version, :ui_lang, :ui_lang_country, :vendor].each do |method|
|
94
|
+
assert_raise NotImplementedError do
|
95
|
+
ua.method(method).call
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def test_gonzo_1
|
101
|
+
ua = UserAgent.new "gonzo1[P] +http://www.suchen.de/faq.html"
|
102
|
+
assert ua.known?
|
103
|
+
assert ua.bot?
|
104
|
+
assert !ua.browser?
|
105
|
+
assert !ua.feed_reader?
|
106
|
+
assert !ua.other?
|
107
|
+
assert_equal nil, ua.render_engine
|
108
|
+
assert_equal nil, ua.render_engine_version
|
109
|
+
assert_equal :gonzo, ua.name
|
110
|
+
assert_equal "1", ua.version.full
|
111
|
+
assert_equal "1", ua.version.major
|
112
|
+
assert_equal [], ua.emails
|
113
|
+
assert_equal nil, ua.email
|
114
|
+
assert_equal ["http://www.suchen.de/faq.html"], ua.urls
|
115
|
+
assert_equal "http://www.suchen.de/faq.html", ua.url
|
116
|
+
[:architecture, :dotnet_versions, :os, :os_type, :os_version, :ui_lang, :ui_lang_country, :vendor].each do |method|
|
117
|
+
assert_raise NotImplementedError do
|
118
|
+
ua.method(method).call
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
def test_gonzo_2
|
124
|
+
ua = UserAgent.new "gonzo2[P] +http://www.suchen.de/faq.html"
|
125
|
+
assert ua.known?
|
126
|
+
assert ua.bot?
|
127
|
+
assert !ua.browser?
|
128
|
+
assert !ua.feed_reader?
|
129
|
+
assert !ua.other?
|
130
|
+
assert_equal nil, ua.render_engine
|
131
|
+
assert_equal nil, ua.render_engine_version
|
132
|
+
assert_equal :gonzo, ua.name
|
133
|
+
assert_equal "2", ua.version.full
|
134
|
+
assert_equal "2", ua.version.major
|
135
|
+
assert_equal [], ua.emails
|
136
|
+
assert_equal nil, ua.email
|
137
|
+
assert_equal ["http://www.suchen.de/faq.html"], ua.urls
|
138
|
+
assert_equal "http://www.suchen.de/faq.html", ua.url
|
139
|
+
[:architecture, :dotnet_versions, :os, :os_type, :os_version, :ui_lang, :ui_lang_country, :vendor].each do |method|
|
140
|
+
assert_raise NotImplementedError do
|
141
|
+
ua.method(method).call
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
def test_googlebot_2_1
|
147
|
+
ua = UserAgent.new "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
|
148
|
+
assert ua.known?
|
149
|
+
assert ua.bot?
|
150
|
+
assert !ua.browser?
|
151
|
+
assert !ua.feed_reader?
|
152
|
+
assert !ua.other?
|
153
|
+
assert_equal nil, ua.render_engine
|
154
|
+
assert_equal nil, ua.render_engine_version
|
155
|
+
assert_equal :googlebot, ua.name
|
156
|
+
assert_equal "2.1", ua.version.full
|
157
|
+
assert_equal "2.1", ua.version.major
|
158
|
+
assert_equal [], ua.emails
|
159
|
+
assert_equal nil, ua.email
|
160
|
+
assert_equal ["http://www.google.com/bot.html"], ua.urls
|
161
|
+
assert_equal "http://www.google.com/bot.html", ua.url
|
162
|
+
[:architecture, :dotnet_versions, :os, :os_type, :os_version, :ui_lang, :ui_lang_country, :vendor].each do |method|
|
163
|
+
assert_raise NotImplementedError do
|
164
|
+
ua.method(method).call
|
165
|
+
end
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
def test_googlebot_image_1_0
|
170
|
+
ua = UserAgent.new "Googlebot-Image/1.0"
|
171
|
+
assert ua.known?
|
172
|
+
assert ua.bot?
|
173
|
+
assert !ua.browser?
|
174
|
+
assert !ua.feed_reader?
|
175
|
+
assert !ua.other?
|
176
|
+
assert_equal nil, ua.render_engine
|
177
|
+
assert_equal nil, ua.render_engine_version
|
178
|
+
assert_equal :"googlebot-image", ua.name
|
179
|
+
assert_equal "1.0", ua.version.full
|
180
|
+
assert_equal "1.0", ua.version.major
|
181
|
+
assert_equal [], ua.emails
|
182
|
+
assert_equal nil, ua.email
|
183
|
+
assert_equal [], ua.urls
|
184
|
+
assert_equal nil, ua.url
|
185
|
+
[:architecture, :dotnet_versions, :os, :os_type, :os_version, :ui_lang, :ui_lang_country, :vendor].each do |method|
|
186
|
+
assert_raise NotImplementedError do
|
187
|
+
ua.method(method).call
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
def test_mediapartners_google
|
193
|
+
ua = UserAgent.new "Mediapartners-Google"
|
194
|
+
assert ua.known?
|
195
|
+
assert ua.bot?
|
196
|
+
assert !ua.browser?
|
197
|
+
assert !ua.feed_reader?
|
198
|
+
assert !ua.other?
|
199
|
+
assert_equal nil, ua.render_engine
|
200
|
+
assert_equal nil, ua.render_engine_version
|
201
|
+
assert_equal :"mediapartners-google", ua.name
|
202
|
+
assert_equal nil, ua.version
|
203
|
+
assert_equal [], ua.emails
|
204
|
+
assert_equal nil, ua.email
|
205
|
+
assert_equal [], ua.urls
|
206
|
+
assert_equal nil, ua.url
|
207
|
+
[:architecture, :dotnet_versions, :os, :os_type, :os_version, :ui_lang, :ui_lang_country, :vendor].each do |method|
|
208
|
+
assert_raise NotImplementedError do
|
209
|
+
ua.method(method).call
|
210
|
+
end
|
211
|
+
end
|
212
|
+
end
|
213
|
+
|
214
|
+
def test_mediapartners_google_21
|
215
|
+
ua = UserAgent.new "Mediapartners-Google/2.1"
|
216
|
+
assert ua.known?
|
217
|
+
assert ua.bot?
|
218
|
+
assert !ua.browser?
|
219
|
+
assert !ua.feed_reader?
|
220
|
+
assert !ua.other?
|
221
|
+
assert_equal nil, ua.render_engine
|
222
|
+
assert_equal nil, ua.render_engine_version
|
223
|
+
assert_equal :"mediapartners-google", ua.name
|
224
|
+
assert_equal "2.1", ua.version.full
|
225
|
+
assert_equal "2.1", ua.version.major
|
226
|
+
assert_equal [], ua.emails
|
227
|
+
assert_equal nil, ua.email
|
228
|
+
assert_equal [], ua.urls
|
229
|
+
assert_equal nil, ua.url
|
230
|
+
[:architecture, :dotnet_versions, :os, :os_type, :os_version, :ui_lang, :ui_lang_country, :vendor].each do |method|
|
231
|
+
assert_raise NotImplementedError do
|
232
|
+
ua.method(method).call
|
233
|
+
end
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
def test_mj12bot_1_2_3
|
238
|
+
ua = UserAgent.new "Mozilla/5.0 (compatible; MJ12bot/v1.2.3; http://www.majestic12.co.uk/bot.php?+)"
|
239
|
+
assert ua.known?
|
240
|
+
assert ua.bot?
|
241
|
+
assert !ua.browser?
|
242
|
+
assert !ua.feed_reader?
|
243
|
+
assert !ua.other?
|
244
|
+
assert_equal nil, ua.render_engine
|
245
|
+
assert_equal nil, ua.render_engine_version
|
246
|
+
assert_equal :mj12bot, ua.name
|
247
|
+
assert_equal "1.2.3", ua.version.full
|
248
|
+
assert_equal "1.2", ua.version.major
|
249
|
+
assert_equal [], ua.emails
|
250
|
+
assert_equal nil, ua.email
|
251
|
+
assert_equal ["http://www.majestic12.co.uk/bot.php?+"], ua.urls
|
252
|
+
assert_equal "http://www.majestic12.co.uk/bot.php?+", ua.url
|
253
|
+
[:architecture, :dotnet_versions, :os, :os_type, :os_version, :ui_lang, :ui_lang_country, :vendor].each do |method|
|
254
|
+
assert_raise NotImplementedError do
|
255
|
+
ua.method(method).call
|
256
|
+
end
|
257
|
+
end
|
258
|
+
end
|
259
|
+
|
260
|
+
def test_msnbot_10
|
261
|
+
ua = UserAgent.new "msnbot/1.0 (+http://search.msn.com/msnbot.htm)"
|
262
|
+
assert ua.known?
|
263
|
+
assert ua.bot?
|
264
|
+
assert !ua.browser?
|
265
|
+
assert !ua.feed_reader?
|
266
|
+
assert !ua.other?
|
267
|
+
assert_equal nil, ua.render_engine
|
268
|
+
assert_equal nil, ua.render_engine_version
|
269
|
+
assert_equal :msnbot, ua.name
|
270
|
+
assert_equal "1.0", ua.version.full
|
271
|
+
assert_equal "1.0", ua.version.major
|
272
|
+
assert_equal [], ua.emails
|
273
|
+
assert_equal nil, ua.email
|
274
|
+
assert_equal ["http://search.msn.com/msnbot.htm"], ua.urls
|
275
|
+
assert_equal "http://search.msn.com/msnbot.htm", ua.url
|
276
|
+
[:architecture, :dotnet_versions, :os, :os_type, :os_version, :ui_lang, :ui_lang_country, :vendor].each do |method|
|
277
|
+
assert_raise NotImplementedError do
|
278
|
+
ua.method(method).call
|
279
|
+
end
|
280
|
+
end
|
281
|
+
end
|
282
|
+
|
283
|
+
def test_msnbot_11
|
284
|
+
ua = UserAgent.new "msnbot/1.1 (+http://search.msn.com/msnbot.htm)"
|
285
|
+
assert ua.known?
|
286
|
+
assert ua.bot?
|
287
|
+
assert !ua.browser?
|
288
|
+
assert !ua.feed_reader?
|
289
|
+
assert !ua.other?
|
290
|
+
assert_equal nil, ua.render_engine
|
291
|
+
assert_equal nil, ua.render_engine_version
|
292
|
+
assert_equal :msnbot, ua.name
|
293
|
+
assert_equal "1.1", ua.version.full
|
294
|
+
assert_equal "1.1", ua.version.major
|
295
|
+
assert_equal [], ua.emails
|
296
|
+
assert_equal nil, ua.email
|
297
|
+
assert_equal ["http://search.msn.com/msnbot.htm"], ua.urls
|
298
|
+
assert_equal "http://search.msn.com/msnbot.htm", ua.url
|
299
|
+
[:architecture, :dotnet_versions, :os, :os_type, :os_version, :ui_lang, :ui_lang_country, :vendor].each do |method|
|
300
|
+
assert_raise NotImplementedError do
|
301
|
+
ua.method(method).call
|
302
|
+
end
|
303
|
+
end
|
304
|
+
end
|
305
|
+
|
306
|
+
def test_msnbot_media_10
|
307
|
+
ua = UserAgent.new "msnbot-media/1.0 (+http://search.msn.com/msnbot.htm)"
|
308
|
+
assert ua.known?
|
309
|
+
assert ua.bot?
|
310
|
+
assert !ua.browser?
|
311
|
+
assert !ua.feed_reader?
|
312
|
+
assert !ua.other?
|
313
|
+
assert_equal nil, ua.render_engine
|
314
|
+
assert_equal nil, ua.render_engine_version
|
315
|
+
assert_equal :"msnbot-media", ua.name
|
316
|
+
assert_equal "1.0", ua.version.full
|
317
|
+
assert_equal "1.0", ua.version.major
|
318
|
+
assert_equal [], ua.emails
|
319
|
+
assert_equal nil, ua.email
|
320
|
+
assert_equal ["http://search.msn.com/msnbot.htm"], ua.urls
|
321
|
+
assert_equal "http://search.msn.com/msnbot.htm", ua.url
|
322
|
+
[:architecture, :dotnet_versions, :os, :os_type, :os_version, :ui_lang, :ui_lang_country, :vendor].each do |method|
|
323
|
+
assert_raise NotImplementedError do
|
324
|
+
ua.method(method).call
|
325
|
+
end
|
326
|
+
end
|
327
|
+
end
|
328
|
+
|
329
|
+
def test_msnbot_media_11
|
330
|
+
ua = UserAgent.new "msnbot-media/1.1 (+http://search.msn.com/msnbot.htm)"
|
331
|
+
assert ua.known?
|
332
|
+
assert ua.bot?
|
333
|
+
assert !ua.browser?
|
334
|
+
assert !ua.feed_reader?
|
335
|
+
assert !ua.other?
|
336
|
+
assert_equal nil, ua.render_engine
|
337
|
+
assert_equal nil, ua.render_engine_version
|
338
|
+
assert_equal :"msnbot-media", ua.name
|
339
|
+
assert_equal "1.1", ua.version.major
|
340
|
+
assert_equal "1.1", ua.version.full
|
341
|
+
assert_equal [], ua.emails
|
342
|
+
assert_equal nil, ua.email
|
343
|
+
assert_equal ["http://search.msn.com/msnbot.htm"], ua.urls
|
344
|
+
assert_equal "http://search.msn.com/msnbot.htm", ua.url
|
345
|
+
[:architecture, :dotnet_versions, :os, :os_type, :os_version, :ui_lang, :ui_lang_country, :vendor].each do |method|
|
346
|
+
assert_raise NotImplementedError do
|
347
|
+
ua.method(method).call
|
348
|
+
end
|
349
|
+
end
|
350
|
+
end
|
351
|
+
|
352
|
+
def test_seekbot_1_0
|
353
|
+
ua = UserAgent.new "Seekbot/1.0 (http://www.seekbot.net/bot.html) HTTPFetcher/2.2"
|
354
|
+
assert ua.known?
|
355
|
+
assert ua.bot?
|
356
|
+
assert !ua.browser?
|
357
|
+
assert !ua.feed_reader?
|
358
|
+
assert !ua.other?
|
359
|
+
assert_equal nil, ua.render_engine
|
360
|
+
assert_equal nil, ua.render_engine_version
|
361
|
+
assert_equal :seekbot, ua.name
|
362
|
+
assert_equal "1.0", ua.version.major
|
363
|
+
assert_equal "1.0", ua.version.full
|
364
|
+
assert_equal [], ua.emails
|
365
|
+
assert_equal nil, ua.email
|
366
|
+
assert_equal ["http://www.seekbot.net/bot.html"], ua.urls
|
367
|
+
assert_equal "http://www.seekbot.net/bot.html", ua.url
|
368
|
+
[:architecture, :dotnet_versions, :os, :os_type, :os_version, :ui_lang, :ui_lang_country, :vendor].each do |method|
|
369
|
+
assert_raise NotImplementedError do
|
370
|
+
ua.method(method).call
|
371
|
+
end
|
372
|
+
end
|
373
|
+
end
|
374
|
+
|
375
|
+
def test_speedy_spider
|
376
|
+
ua = UserAgent.new "Speedy Spider (http://www.entireweb.com/about/search_tech/speedy_spider/)"
|
377
|
+
assert ua.known?
|
378
|
+
assert ua.bot?
|
379
|
+
assert !ua.browser?
|
380
|
+
assert !ua.feed_reader?
|
381
|
+
assert !ua.other?
|
382
|
+
assert_equal nil, ua.render_engine
|
383
|
+
assert_equal nil, ua.render_engine_version
|
384
|
+
assert_equal :"speedy spider", ua.name
|
385
|
+
assert_equal nil, ua.version
|
386
|
+
assert_equal [], ua.emails
|
387
|
+
assert_equal nil, ua.email
|
388
|
+
assert_equal ["http://www.entireweb.com/about/search_tech/speedy_spider/"], ua.urls
|
389
|
+
assert_equal "http://www.entireweb.com/about/search_tech/speedy_spider/", ua.url
|
390
|
+
[:architecture, :dotnet_versions, :os, :os_type, :os_version, :ui_lang, :ui_lang_country, :vendor].each do |method|
|
391
|
+
assert_raise NotImplementedError do
|
392
|
+
ua.method(method).call
|
393
|
+
end
|
394
|
+
end
|
395
|
+
end
|
396
|
+
|
397
|
+
def test_unknown_bot
|
398
|
+
ua = UserAgent.new "iGELbot"
|
399
|
+
assert !ua.known?
|
400
|
+
assert ua.bot?
|
401
|
+
assert !ua.browser?
|
402
|
+
assert !ua.feed_reader?
|
403
|
+
assert !ua.other?
|
404
|
+
assert_equal nil, ua.render_engine
|
405
|
+
assert_equal nil, ua.render_engine_version
|
406
|
+
assert_equal :unknown_bot, ua.name
|
407
|
+
assert_equal nil, ua.version
|
408
|
+
assert_equal [], ua.emails
|
409
|
+
assert_equal nil, ua.email
|
410
|
+
assert_equal [], ua.urls
|
411
|
+
assert_equal nil, ua.url
|
412
|
+
[:architecture, :dotnet_versions, :os, :os_type, :os_version, :ui_lang, :ui_lang_country, :vendor].each do |method|
|
413
|
+
assert_raise NotImplementedError do
|
414
|
+
ua.method(method).call
|
415
|
+
end
|
416
|
+
end
|
417
|
+
end
|
418
|
+
|
419
|
+
def test_unknown_bot_with_emails
|
420
|
+
ua = UserAgent.new "iGELbot (a_sf-32@sub-dom3.x.de; +info@x.de"
|
421
|
+
assert !ua.known?
|
422
|
+
assert ua.bot?
|
423
|
+
assert !ua.browser?
|
424
|
+
assert !ua.feed_reader?
|
425
|
+
assert !ua.other?
|
426
|
+
assert_equal nil, ua.render_engine
|
427
|
+
assert_equal nil, ua.render_engine_version
|
428
|
+
assert_equal :unknown_bot, ua.name
|
429
|
+
assert_equal nil, ua.version
|
430
|
+
assert_equal ["a_sf-32@sub-dom3.x.de", "info@x.de"], ua.emails
|
431
|
+
assert_equal "a_sf-32@sub-dom3.x.de", ua.email
|
432
|
+
assert_equal [], ua.urls
|
433
|
+
assert_equal nil, ua.url
|
434
|
+
[:architecture, :dotnet_versions, :os, :os_type, :os_version, :ui_lang, :ui_lang_country, :vendor].each do |method|
|
435
|
+
assert_raise NotImplementedError do
|
436
|
+
ua.method(method).call
|
437
|
+
end
|
438
|
+
end
|
439
|
+
end
|
440
|
+
|
441
|
+
def test_unknown_bot_with_urls
|
442
|
+
ua = UserAgent.new "iGELbot (+http://xa2.a-z.43x.com:93/afzde.php?if=asdf&rm=3;x=hello+r%C3%BCdiger; www.heise.de)"
|
443
|
+
assert !ua.known?
|
444
|
+
assert ua.bot?
|
445
|
+
assert !ua.browser?
|
446
|
+
assert !ua.feed_reader?
|
447
|
+
assert !ua.other?
|
448
|
+
assert_equal nil, ua.render_engine
|
449
|
+
assert_equal nil, ua.render_engine_version
|
450
|
+
assert_equal :unknown_bot, ua.name
|
451
|
+
assert_equal nil, ua.version
|
452
|
+
assert_equal [], ua.emails
|
453
|
+
assert_equal nil, ua.email
|
454
|
+
assert_equal ["http://xa2.a-z.43x.com:93/afzde.php?if=asdf&rm=3;x=hello+r%c3%bcdiger", "www.heise.de"], ua.urls
|
455
|
+
assert_equal "http://xa2.a-z.43x.com:93/afzde.php?if=asdf&rm=3;x=hello+r%c3%bcdiger", ua.url
|
456
|
+
[:architecture, :dotnet_versions, :os, :os_type, :os_version, :ui_lang, :ui_lang_country, :vendor].each do |method|
|
457
|
+
assert_raise NotImplementedError do
|
458
|
+
ua.method(method).call
|
459
|
+
end
|
460
|
+
end
|
461
|
+
end
|
462
|
+
|
463
|
+
def test_unknown_crawler
|
464
|
+
ua = UserAgent.new "iGELcrawler"
|
465
|
+
assert !ua.known?
|
466
|
+
assert ua.bot?
|
467
|
+
assert !ua.browser?
|
468
|
+
assert !ua.feed_reader?
|
469
|
+
assert !ua.other?
|
470
|
+
assert_equal nil, ua.render_engine
|
471
|
+
assert_equal nil, ua.render_engine_version
|
472
|
+
assert_equal :unknown_bot, ua.name
|
473
|
+
assert_equal nil, ua.version
|
474
|
+
assert_equal [], ua.emails
|
475
|
+
assert_equal nil, ua.email
|
476
|
+
assert_equal [], ua.urls
|
477
|
+
assert_equal nil, ua.url
|
478
|
+
[:architecture, :dotnet_versions, :os, :os_type, :os_version, :ui_lang, :ui_lang_country, :vendor].each do |method|
|
479
|
+
assert_raise NotImplementedError do
|
480
|
+
ua.method(method).call
|
481
|
+
end
|
482
|
+
end
|
483
|
+
end
|
484
|
+
|
485
|
+
def test_unknown_spider
|
486
|
+
ua = UserAgent.new "iGELspider"
|
487
|
+
assert !ua.known?
|
488
|
+
assert ua.bot?
|
489
|
+
assert !ua.browser?
|
490
|
+
assert !ua.feed_reader?
|
491
|
+
assert !ua.other?
|
492
|
+
assert_equal nil, ua.render_engine
|
493
|
+
assert_equal nil, ua.render_engine_version
|
494
|
+
assert_equal :unknown_bot, ua.name
|
495
|
+
assert_equal nil, ua.version
|
496
|
+
assert_equal [], ua.emails
|
497
|
+
assert_equal nil, ua.email
|
498
|
+
assert_equal [], ua.urls
|
499
|
+
assert_equal nil, ua.url
|
500
|
+
[:architecture, :dotnet_versions, :os, :os_type, :os_version, :ui_lang, :ui_lang_country, :vendor].each do |method|
|
501
|
+
assert_raise NotImplementedError do
|
502
|
+
ua.method(method).call
|
503
|
+
end
|
504
|
+
end
|
505
|
+
end
|
506
|
+
|
507
|
+
def test_yahoo_slurp
|
508
|
+
ua = UserAgent.new "Mozilla/5.0 (compatible; Yahoo! Slurp; http://help.yahoo.com/help/us/ysearch/slurp)"
|
509
|
+
assert ua.known?
|
510
|
+
assert ua.bot?
|
511
|
+
assert !ua.browser?
|
512
|
+
assert !ua.feed_reader?
|
513
|
+
assert !ua.other?
|
514
|
+
assert_equal nil, ua.render_engine
|
515
|
+
assert_equal nil, ua.render_engine_version
|
516
|
+
assert_equal :"yahoo! slurp", ua.name
|
517
|
+
assert_equal nil, ua.version
|
518
|
+
assert_equal [], ua.emails
|
519
|
+
assert_equal nil, ua.email
|
520
|
+
assert_equal ["http://help.yahoo.com/help/us/ysearch/slurp"], ua.urls
|
521
|
+
assert_equal "http://help.yahoo.com/help/us/ysearch/slurp", ua.url
|
522
|
+
[:architecture, :dotnet_versions, :os, :os_type, :os_version, :ui_lang, :ui_lang_country, :vendor].each do |method|
|
523
|
+
assert_raise NotImplementedError do
|
524
|
+
ua.method(method).call
|
525
|
+
end
|
526
|
+
end
|
527
|
+
end
|
528
|
+
|
529
|
+
def test_yahoo_slurp_3_0
|
530
|
+
ua = UserAgent.new "Mozilla/5.0 (compatible; Yahoo! Slurp/3.0; http://help.yahoo.com/help/us/ysearch/slurp)"
|
531
|
+
assert ua.known?
|
532
|
+
assert ua.bot?
|
533
|
+
assert !ua.browser?
|
534
|
+
assert !ua.feed_reader?
|
535
|
+
assert !ua.other?
|
536
|
+
assert_equal nil, ua.render_engine
|
537
|
+
assert_equal nil, ua.render_engine_version
|
538
|
+
assert_equal :"yahoo! slurp", ua.name
|
539
|
+
assert_equal "3.0", ua.version.full
|
540
|
+
assert_equal "3.0", ua.version.major
|
541
|
+
assert_equal [], ua.emails
|
542
|
+
assert_equal nil, ua.email
|
543
|
+
assert_equal ["http://help.yahoo.com/help/us/ysearch/slurp"], ua.urls
|
544
|
+
assert_equal "http://help.yahoo.com/help/us/ysearch/slurp", ua.url
|
545
|
+
[:architecture, :dotnet_versions, :os, :os_type, :os_version, :ui_lang, :ui_lang_country, :vendor].each do |method|
|
546
|
+
assert_raise NotImplementedError do
|
547
|
+
ua.method(method).call
|
548
|
+
end
|
549
|
+
end
|
550
|
+
end
|
551
|
+
|
552
|
+
def test_yeti_0_01
|
553
|
+
ua = UserAgent.new "Yeti/0.01 (nhn/1noon, yetibot@naver.com, check robots.txt daily and follow it)"
|
554
|
+
assert ua.known?
|
555
|
+
assert ua.bot?
|
556
|
+
assert !ua.browser?
|
557
|
+
assert !ua.feed_reader?
|
558
|
+
assert !ua.other?
|
559
|
+
assert_equal nil, ua.render_engine
|
560
|
+
assert_equal nil, ua.render_engine_version
|
561
|
+
assert_equal :yeti, ua.name
|
562
|
+
assert_equal "0.01", ua.version.full
|
563
|
+
assert_equal "0.0", ua.version.major
|
564
|
+
assert_equal ["yetibot@naver.com"], ua.emails
|
565
|
+
assert_equal "yetibot@naver.com", ua.email
|
566
|
+
assert_equal [], ua.urls
|
567
|
+
assert_equal nil, ua.url
|
568
|
+
[:architecture, :dotnet_versions, :os, :os_type, :os_version, :ui_lang, :ui_lang_country, :vendor].each do |method|
|
569
|
+
assert_raise NotImplementedError do
|
570
|
+
ua.method(method).call
|
571
|
+
end
|
572
|
+
end
|
573
|
+
end
|
574
|
+
|
575
|
+
def test_yeti_1_0
|
576
|
+
ua = UserAgent.new "Yeti/1.0 (+http://help.naver.com/robots/)"
|
577
|
+
assert ua.known?
|
578
|
+
assert ua.bot?
|
579
|
+
assert !ua.browser?
|
580
|
+
assert !ua.feed_reader?
|
581
|
+
assert !ua.other?
|
582
|
+
assert_equal nil, ua.render_engine
|
583
|
+
assert_equal nil, ua.render_engine_version
|
584
|
+
assert_equal :yeti, ua.name
|
585
|
+
assert_equal "1.0", ua.version.full
|
586
|
+
assert_equal "1.0", ua.version.major
|
587
|
+
assert_equal [], ua.emails
|
588
|
+
assert_equal nil, ua.email
|
589
|
+
assert_equal ["http://help.naver.com/robots/"], ua.urls
|
590
|
+
assert_equal "http://help.naver.com/robots/", ua.url
|
591
|
+
[:architecture, :dotnet_versions, :os, :os_type, :os_version, :ui_lang, :ui_lang_country, :vendor].each do |method|
|
592
|
+
assert_raise NotImplementedError do
|
593
|
+
ua.method(method).call
|
594
|
+
end
|
595
|
+
end
|
596
|
+
end
|
597
|
+
|
598
|
+
def test_yeti_1_0_with_company
|
599
|
+
ua = UserAgent.new "Yeti/1.0 (NHN Corp.; http://help.naver.com/robots/)"
|
600
|
+
assert ua.known?
|
601
|
+
assert ua.bot?
|
602
|
+
assert !ua.browser?
|
603
|
+
assert !ua.feed_reader?
|
604
|
+
assert !ua.other?
|
605
|
+
assert_equal nil, ua.render_engine
|
606
|
+
assert_equal nil, ua.render_engine_version
|
607
|
+
assert_equal :yeti, ua.name
|
608
|
+
assert_equal "1.0", ua.version.full
|
609
|
+
assert_equal "1.0", ua.version.major
|
610
|
+
assert_equal [], ua.emails
|
611
|
+
assert_equal nil, ua.email
|
612
|
+
assert_equal ["http://help.naver.com/robots/"], ua.urls
|
613
|
+
assert_equal "http://help.naver.com/robots/", ua.url
|
614
|
+
[:architecture, :dotnet_versions, :os, :os_type, :os_version, :ui_lang, :ui_lang_country, :vendor].each do |method|
|
615
|
+
assert_raise NotImplementedError do
|
616
|
+
ua.method(method).call
|
617
|
+
end
|
618
|
+
end
|
619
|
+
end
|
620
|
+
end
|