woothee 0.4.2 → 1.0.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.
- checksums.yaml +4 -4
- data/README.md +3 -1
- data/lib/woothee.rb +1 -0
- data/lib/woothee/appliance.rb +27 -7
- data/lib/woothee/browser.rb +3 -1
- data/lib/woothee/dataset.rb +4 -2
- data/lib/woothee/os.rb +82 -30
- data/lib/woothee/util.rb +4 -0
- data/lib/woothee/version.rb +1 -1
- data/scripts/dataset_yaml2rb.rb +3 -1
- data/spec/01_dataset_spec.rb +1 -1
- data/spec/02_run_testsets_spec.rb +2 -2
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8d02d577c470c8ee9b7204b5f7bdc48dd3af1dae
|
4
|
+
data.tar.gz: 7fd13c2c702219ee6f8ce5b059b64da041fcb55c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4622d9e21b6105f977d4bba8f508b851fa8a52963ec4bb0c9186cd72b43c6fcf1582a3a1fc9bca03f75c6f5777c6059ef6b1ba670e892b8b7878d4f9a443e691
|
7
|
+
data.tar.gz: 8c4d48ea2764cacfcdb311e623e574e6d7bc77f5a11527ddfaf7333bd537d961508bc559bd38eae66b1010d6825d174c713f9faefc1aa8d3414e11b46839e638
|
data/README.md
CHANGED
@@ -27,7 +27,7 @@ Class 'Woothee' have no instance methods.
|
|
27
27
|
```ruby
|
28
28
|
require 'woothee'
|
29
29
|
Woothee.parse("Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)")
|
30
|
-
# => {:name=>"Internet Explorer", :category=>:pc, :os=>"Windows 7", :version=>"8.0", :vendor=>"Microsoft"}
|
30
|
+
# => {:name=>"Internet Explorer", :category=>:pc, :os=>"Windows 7", :version=>"8.0", :vendor=>"Microsoft", :os_version=>"NT 6.1"}
|
31
31
|
```
|
32
32
|
|
33
33
|
Parse user-agent string and returns Hash instance with keys `:name`, `:category`, `:os`, `:version` and `:vendor`.
|
@@ -45,6 +45,8 @@ For unknown user-agent (or partially failed to parse), result Hash instance may
|
|
45
45
|
* This field used to indicate cellar phone carrier for category 'mobilephone'
|
46
46
|
* `:vendor`
|
47
47
|
* optional field, shows browser vendor
|
48
|
+
* `:os_version`
|
49
|
+
* optional field, shows version of operating systems
|
48
50
|
|
49
51
|
### Finding crawlers (almost all, not all) in fast
|
50
52
|
|
data/lib/woothee.rb
CHANGED
@@ -152,6 +152,7 @@ module Woothee
|
|
152
152
|
Woothee::ATTRIBUTE_NAME => Woothee::VALUE_UNKNOWN,
|
153
153
|
Woothee::ATTRIBUTE_CATEGORY => Woothee::VALUE_UNKNOWN,
|
154
154
|
Woothee::ATTRIBUTE_OS => Woothee::VALUE_UNKNOWN,
|
155
|
+
Woothee::ATTRIBUTE_OS_VERSION => Woothee::VALUE_UNKNOWN,
|
155
156
|
Woothee::ATTRIBUTE_VERSION => Woothee::VALUE_UNKNOWN,
|
156
157
|
Woothee::ATTRIBUTE_VENDOR => Woothee::VALUE_UNKNOWN,
|
157
158
|
}.freeze
|
data/lib/woothee/appliance.rb
CHANGED
@@ -7,16 +7,36 @@ module Woothee::Appliance
|
|
7
7
|
extend Woothee::Util
|
8
8
|
|
9
9
|
def self.challenge_playstation(ua, result)
|
10
|
-
data =
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
10
|
+
data = nil
|
11
|
+
os_version = nil
|
12
|
+
case
|
13
|
+
when ua.index('PSP (PlayStation Portable);')
|
14
|
+
data = Woothee::DataSet.get('PSP')
|
15
|
+
if ua =~ /PSP \(PlayStation Portable\); ([.0-9]+)\)/
|
16
|
+
os_version = $1
|
17
|
+
end
|
18
|
+
when ua.index('PlayStation Vita')
|
19
|
+
data = Woothee::DataSet.get('PSVita')
|
20
|
+
if ua =~ /PlayStation Vita ([.0-9]+)\)/
|
21
|
+
os_version = $1
|
22
|
+
end
|
23
|
+
when ua.index('PLAYSTATION 3 ') || ua.index('PLAYSTATION 3;')
|
24
|
+
data = Woothee::DataSet.get('PS3')
|
25
|
+
if ua =~ /PLAYSTATION 3;? ([.0-9]+)\)/
|
26
|
+
os_version = $1
|
27
|
+
end
|
28
|
+
when ua.index('PlayStation 4 ')
|
29
|
+
data = Woothee::DataSet.get('PS4')
|
30
|
+
if ua =~ /PlayStation 4 ([.0-9]+)\)/
|
31
|
+
os_version = $1
|
32
|
+
end
|
33
|
+
end
|
17
34
|
return false unless data
|
18
35
|
|
19
36
|
update_map(result, data)
|
37
|
+
if os_version
|
38
|
+
update_os_version(result, os_version)
|
39
|
+
end
|
20
40
|
true
|
21
41
|
end
|
22
42
|
|
data/lib/woothee/browser.rb
CHANGED
@@ -7,12 +7,14 @@ module Woothee::Browser
|
|
7
7
|
extend Woothee::Util
|
8
8
|
|
9
9
|
def self.challenge_msie(ua, result)
|
10
|
-
return false if ua.index("compatible; MSIE").nil? && ua.index("Trident/").nil?
|
10
|
+
return false if ua.index("compatible; MSIE").nil? && ua.index("Trident/").nil? && ua.index("IEMobile").nil?
|
11
11
|
|
12
12
|
version = if ua =~ /MSIE ([.0-9]+);/o
|
13
13
|
$1
|
14
14
|
elsif ua =~ /Trident\/([.0-9]+);(?: BOIE[0-9]+;[A-Z]+;)? rv:([.0-9]+)/o
|
15
15
|
$2
|
16
|
+
elsif ua =~ /IEMobile\/([.0-9]+);/o
|
17
|
+
$1
|
16
18
|
else
|
17
19
|
Woothee::VALUE_UNKNOWN
|
18
20
|
end
|
data/lib/woothee/dataset.rb
CHANGED
@@ -5,6 +5,7 @@ module Woothee
|
|
5
5
|
KEY_TYPE = :type
|
6
6
|
KEY_CATEGORY = :category
|
7
7
|
KEY_OS = :os
|
8
|
+
KEY_OS_VERSION = :os_version
|
8
9
|
KEY_VENDOR = :vendor
|
9
10
|
KEY_VERSION = :version
|
10
11
|
|
@@ -22,18 +23,19 @@ module Woothee
|
|
22
23
|
ATTRIBUTE_NAME = :name
|
23
24
|
ATTRIBUTE_CATEGORY = :category
|
24
25
|
ATTRIBUTE_OS = :os
|
26
|
+
ATTRIBUTE_OS_VERSION = :os_version
|
25
27
|
ATTRIBUTE_VENDOR = :vendor
|
26
28
|
ATTRIBUTE_VERSION = :version
|
27
29
|
|
28
30
|
VALUE_UNKNOWN = "UNKNOWN"
|
29
31
|
|
30
32
|
CATEGORY_LIST = [CATEGORY_PC,CATEGORY_SMARTPHONE,CATEGORY_MOBILEPHONE,CATEGORY_CRAWLER,CATEGORY_APPLIANCE,CATEGORY_MISC,VALUE_UNKNOWN]
|
31
|
-
ATTRIBUTE_LIST = [ATTRIBUTE_NAME,ATTRIBUTE_CATEGORY,ATTRIBUTE_OS,ATTRIBUTE_VENDOR,ATTRIBUTE_VERSION]
|
33
|
+
ATTRIBUTE_LIST = [ATTRIBUTE_NAME,ATTRIBUTE_CATEGORY,ATTRIBUTE_OS,ATTRIBUTE_VENDOR,ATTRIBUTE_VERSION,ATTRIBUTE_OS_VERSION]
|
32
34
|
end
|
33
35
|
|
34
36
|
module Woothee::DataSet
|
35
37
|
DATASET = {}
|
36
|
-
# GENERATED from dataset.yaml at
|
38
|
+
# GENERATED from dataset.yaml at Wed Oct 22 20:17:46 JST 2014 by tagomoris
|
37
39
|
obj = {:label => 'MSIE', :name => 'Internet Explorer', :type => :browser}
|
38
40
|
obj[:vendor] = 'Microsoft'
|
39
41
|
DATASET[obj[:label]] = obj
|
data/lib/woothee/os.rb
CHANGED
@@ -36,7 +36,9 @@ module Woothee::OS
|
|
36
36
|
when version == 'NT 6.1' then Woothee::DataSet.get('Win7')
|
37
37
|
when version == 'NT 6.0' then Woothee::DataSet.get('WinVista')
|
38
38
|
when version == 'NT 5.1' then Woothee::DataSet.get('WinXP')
|
39
|
-
when version =~ /^Phone OS
|
39
|
+
when version =~ /^Phone(?: OS)? ([.0-9]+)/o
|
40
|
+
version = $1
|
41
|
+
Woothee::DataSet.get('WinPhone')
|
40
42
|
when version == 'NT 5.0' then Woothee::DataSet.get('Win2000')
|
41
43
|
when version == 'NT 4.0' then Woothee::DataSet.get('WinNT4')
|
42
44
|
when version == '98' then Woothee::DataSet.get('Win98') # wow, WinMe is shown as 'Windows 98; Win9x 4.90', fxxxk
|
@@ -47,6 +49,7 @@ module Woothee::OS
|
|
47
49
|
end
|
48
50
|
update_category(result, data[Woothee::KEY_CATEGORY])
|
49
51
|
update_os(result, data[Woothee::KEY_NAME])
|
52
|
+
update_os_version(result, version)
|
50
53
|
true
|
51
54
|
end
|
52
55
|
|
@@ -54,6 +57,7 @@ module Woothee::OS
|
|
54
57
|
return false if ua.index('Mac OS X').nil?
|
55
58
|
|
56
59
|
data = Woothee::DataSet.get('OSX')
|
60
|
+
version = nil
|
57
61
|
if ua.index('like Mac OS X')
|
58
62
|
data = case
|
59
63
|
when ua.index('iPhone;') then Woothee::DataSet.get('iPhone')
|
@@ -61,42 +65,71 @@ module Woothee::OS
|
|
61
65
|
when ua.index('iPod') then Woothee::DataSet.get('iPod')
|
62
66
|
else data
|
63
67
|
end
|
68
|
+
if ua =~ /; CPU(?: iPhone)? OS (\d+_\d+(?:_\d+)?) like Mac OS X/
|
69
|
+
version = $1.gsub(/_/, '.')
|
70
|
+
end
|
71
|
+
else
|
72
|
+
if ua =~ /Mac OS X (10[._]\d+(?:[._]\d+)?)(?:\)|;)/
|
73
|
+
version = $1.gsub(/_/, '.')
|
74
|
+
end
|
64
75
|
end
|
65
76
|
update_category(result, data[Woothee::KEY_CATEGORY])
|
66
77
|
update_os(result, data[Woothee::KEY_NAME])
|
78
|
+
if version
|
79
|
+
update_os_version(result, version)
|
80
|
+
end
|
67
81
|
true
|
68
82
|
end
|
69
83
|
|
70
84
|
def self.challenge_linux(ua, result)
|
71
85
|
return false if ua.index('Linux').nil?
|
72
86
|
|
73
|
-
data =
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
87
|
+
data = nil
|
88
|
+
os_version = nil
|
89
|
+
if ua.index('Android')
|
90
|
+
data = Woothee::DataSet.get('Android')
|
91
|
+
if ua =~ /Android[- ](\d+\.\d+(?:\.\d+)?)/
|
92
|
+
os_version = $1
|
93
|
+
end
|
94
|
+
else
|
95
|
+
data = Woothee::DataSet.get('Linux')
|
96
|
+
end
|
78
97
|
update_category(result, data[Woothee::KEY_CATEGORY])
|
79
98
|
update_os(result, data[Woothee::KEY_NAME])
|
99
|
+
if os_version
|
100
|
+
update_os_version(result, os_version)
|
101
|
+
end
|
80
102
|
true
|
81
103
|
end
|
82
104
|
|
83
105
|
def self.challenge_smartphone(ua, result)
|
84
|
-
data =
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
106
|
+
data = nil
|
107
|
+
os_version = nil
|
108
|
+
case
|
109
|
+
when ua.index('iPhone')
|
110
|
+
data = Woothee::DataSet.get('iPhone')
|
111
|
+
when ua.index('iPad')
|
112
|
+
data = Woothee::DataSet.get('iPad')
|
113
|
+
when ua.index('iPod')
|
114
|
+
data = Woothee::DataSet.get('iPod')
|
115
|
+
when ua.index('Android')
|
116
|
+
data = Woothee::DataSet.get('Android')
|
117
|
+
when ua.index('CFNetwork')
|
118
|
+
data = Woothee::DataSet.get('iOS')
|
119
|
+
when ua.index('BlackBerry')
|
120
|
+
data = Woothee::DataSet.get('BlackBerry')
|
121
|
+
if ua =~ /BlackBerry(?:\d+)\/([.0-9]+) /
|
122
|
+
os_version = $1
|
123
|
+
end
|
124
|
+
end
|
93
125
|
|
94
126
|
if result[Woothee::KEY_NAME] && result[Woothee::KEY_NAME] == Woothee::DataSet.get('Firefox')[Woothee::KEY_NAME]
|
95
127
|
# Firefox OS specific pattern
|
96
128
|
# http://lawrencemandel.com/2012/07/27/decision-made-firefox-os-user-agent-string/
|
97
129
|
# https://github.com/woothee/woothee/issues/2
|
98
|
-
if ua =~ /^Mozilla\/[.0-9]+ \((?:Mobile|Tablet);(
|
130
|
+
if ua =~ /^Mozilla\/[.0-9]+ \((?:Mobile|Tablet);(?:.*;)? rv:([.0-9]+)\) Gecko\/[.0-9]+ Firefox\/[.0-9]+$/
|
99
131
|
data = Woothee::DataSet.get('FirefoxOS')
|
132
|
+
os_version = $1
|
100
133
|
end
|
101
134
|
end
|
102
135
|
|
@@ -104,6 +137,9 @@ module Woothee::OS
|
|
104
137
|
|
105
138
|
update_category(result, data[Woothee::KEY_CATEGORY])
|
106
139
|
update_os(result, data[Woothee::KEY_NAME])
|
140
|
+
if os_version
|
141
|
+
update_os_version(result, os_version)
|
142
|
+
end
|
107
143
|
true
|
108
144
|
end
|
109
145
|
|
@@ -166,23 +202,39 @@ module Woothee::OS
|
|
166
202
|
end
|
167
203
|
|
168
204
|
def self.challenge_misc(ua, result)
|
169
|
-
data =
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
205
|
+
data = nil
|
206
|
+
os_version = nil
|
207
|
+
case
|
208
|
+
when ua.index('(Win98;')
|
209
|
+
data = Woothee::DataSet.get('Win98')
|
210
|
+
os_version = "98"
|
211
|
+
when ua.index('Macintosh; U; PPC;')
|
212
|
+
data = Woothee::DataSet.get('MacOS')
|
213
|
+
if ua =~ /rv:(\d+\.\d+\.\d+)/
|
214
|
+
os_version = $1
|
215
|
+
end
|
216
|
+
when ua.index('Mac_PowerPC')
|
217
|
+
data = Woothee::DataSet.get('MacOS')
|
218
|
+
when ua.index('X11; FreeBSD ')
|
219
|
+
data = Woothee::DataSet.get('BSD')
|
220
|
+
if ua =~ /FreeBSD ([^;\)]+);/
|
221
|
+
os_version = $1
|
222
|
+
end
|
223
|
+
when ua.index('X11; CrOS ')
|
224
|
+
data = Woothee::DataSet.get('ChromeOS')
|
225
|
+
if ua =~ /CrOS ([^\)]+)\)/
|
226
|
+
os_version = $1
|
227
|
+
end
|
228
|
+
else
|
229
|
+
nil
|
230
|
+
end
|
231
|
+
|
183
232
|
if data
|
184
233
|
update_category(result, data[Woothee::KEY_CATEGORY])
|
185
234
|
update_os(result, data[Woothee::KEY_NAME])
|
235
|
+
if os_version
|
236
|
+
update_os_version(result, os_version)
|
237
|
+
end
|
186
238
|
return true
|
187
239
|
end
|
188
240
|
|
data/lib/woothee/util.rb
CHANGED
data/lib/woothee/version.rb
CHANGED
data/scripts/dataset_yaml2rb.rb
CHANGED
@@ -53,6 +53,7 @@ module Woothee
|
|
53
53
|
KEY_TYPE = :type
|
54
54
|
KEY_CATEGORY = :category
|
55
55
|
KEY_OS = :os
|
56
|
+
KEY_OS_VERSION = :os_version
|
56
57
|
KEY_VENDOR = :vendor
|
57
58
|
KEY_VERSION = :version
|
58
59
|
|
@@ -70,13 +71,14 @@ module Woothee
|
|
70
71
|
ATTRIBUTE_NAME = :name
|
71
72
|
ATTRIBUTE_CATEGORY = :category
|
72
73
|
ATTRIBUTE_OS = :os
|
74
|
+
ATTRIBUTE_OS_VERSION = :os_version
|
73
75
|
ATTRIBUTE_VENDOR = :vendor
|
74
76
|
ATTRIBUTE_VERSION = :version
|
75
77
|
|
76
78
|
VALUE_UNKNOWN = "UNKNOWN"
|
77
79
|
|
78
80
|
CATEGORY_LIST = [CATEGORY_PC,CATEGORY_SMARTPHONE,CATEGORY_MOBILEPHONE,CATEGORY_CRAWLER,CATEGORY_APPLIANCE,CATEGORY_MISC,VALUE_UNKNOWN]
|
79
|
-
ATTRIBUTE_LIST = [ATTRIBUTE_NAME,ATTRIBUTE_CATEGORY,ATTRIBUTE_OS,ATTRIBUTE_VENDOR,ATTRIBUTE_VERSION]
|
81
|
+
ATTRIBUTE_LIST = [ATTRIBUTE_NAME,ATTRIBUTE_CATEGORY,ATTRIBUTE_OS,ATTRIBUTE_VENDOR,ATTRIBUTE_VERSION,ATTRIBUTE_OS_VERSION]
|
80
82
|
end
|
81
83
|
|
82
84
|
module Woothee::DataSet
|
data/spec/01_dataset_spec.rb
CHANGED
@@ -15,7 +15,7 @@ describe Woothee::DataSet do
|
|
15
15
|
expect { Woothee::CATEGORY_LIST }.not_to raise_error()
|
16
16
|
expect(Woothee::ATTRIBUTE_LIST).to eql([
|
17
17
|
Woothee::ATTRIBUTE_NAME, Woothee::ATTRIBUTE_CATEGORY, Woothee::ATTRIBUTE_OS,
|
18
|
-
Woothee::ATTRIBUTE_VENDOR, Woothee::ATTRIBUTE_VERSION,
|
18
|
+
Woothee::ATTRIBUTE_VENDOR, Woothee::ATTRIBUTE_VERSION, Woothee::ATTRIBUTE_OS_VERSION,
|
19
19
|
])
|
20
20
|
expect(Woothee::CATEGORY_LIST).to eql([
|
21
21
|
Woothee::CATEGORY_PC, Woothee::CATEGORY_SMARTPHONE, Woothee::CATEGORY_MOBILEPHONE,
|
@@ -25,9 +25,9 @@ describe Woothee do
|
|
25
25
|
TARGETS.each do |filename,groupname|
|
26
26
|
YAML.load_file(TESTSET_DIR + filename).each do |e|
|
27
27
|
r = Woothee.parse(e['target'])
|
28
|
-
[:name, :category, :os, :version, :vendor].each do |attribute|
|
28
|
+
[:name, :category, :os, :version, :vendor, :os_version].each do |attribute|
|
29
29
|
it groupname + ("test(%s): %s" % [attribute, e['target']]) do
|
30
|
-
if [:name, :category].include?(attribute) or ([:os, :version, :vendor].include?(attribute) and e.has_key?(attribute.to_s))
|
30
|
+
if [:name, :category].include?(attribute) or ([:os, :version, :vendor, :os_version].include?(attribute) and e.has_key?(attribute.to_s))
|
31
31
|
expect(r[attribute].to_s).to eql(e[attribute.to_s])
|
32
32
|
end
|
33
33
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: woothee
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- TAGOMORI Satoshi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-10-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|