useragent_parser 0.0.4 → 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/config/regexes.yaml +829 -0
- data/lib/useragent_parser/parsers/device_parser.rb +38 -0
- data/lib/useragent_parser/parsers/os_parser.rb +39 -0
- data/lib/useragent_parser/{parser.rb → parsers/user_agent_parser.rb} +3 -7
- data/lib/useragent_parser/user_agent.rb +31 -9
- data/lib/useragent_parser/version.rb +1 -1
- data/lib/useragent_parser.rb +70 -29
- data/spec/fixtures/additional_os_tests.yaml +134 -0
- data/spec/fixtures/firefox_user_agent_strings.yaml +804 -804
- data/spec/fixtures/pgts_browser_list.yaml +37489 -37489
- data/spec/fixtures/test_device.yaml +31 -0
- data/spec/fixtures/test_user_agent_parser.yaml +216 -687
- data/spec/fixtures/test_user_agent_parser_os.yaml +346 -0
- data/spec/parsers/device_parser_spec.rb +18 -0
- data/spec/parsers/os_parser_spec.rb +35 -0
- data/spec/{useragent_parser → parsers}/useragent_parser_spec.rb +16 -20
- data/spec/user_agent_spec.rb +190 -0
- data/spec/useragent_parser_spec.rb +34 -0
- metadata +44 -21
- data/config/user_agent_parser.yaml +0 -259
- data/spec/useragent_parser/user_agent_spec.rb +0 -169
@@ -0,0 +1,34 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe UseragentParser do
|
6
|
+
let(:user_agent_string) { 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.4; fr; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5,gzip(gfe),gzip(gfe)' }
|
7
|
+
|
8
|
+
describe "should return user agent information" do
|
9
|
+
subject { UseragentParser.parse_all(user_agent_string)['user_agent'] }
|
10
|
+
|
11
|
+
its(['family']) { should == 'Firefox' }
|
12
|
+
its(['major']) { should == '3' }
|
13
|
+
its(['minor']) { should == '5' }
|
14
|
+
its(['patch']) { should == '5' }
|
15
|
+
end
|
16
|
+
|
17
|
+
describe "should return the operating system information" do
|
18
|
+
subject { UseragentParser.parse_all(user_agent_string)['os'] }
|
19
|
+
|
20
|
+
its(['family']) { should == 'Mac OS X' }
|
21
|
+
its(['major']) { should == '10' }
|
22
|
+
its(['minor']) { should == '4' }
|
23
|
+
its(['patch']) { should be_nil }
|
24
|
+
its(['patch_minor']) { should be_nil }
|
25
|
+
end
|
26
|
+
|
27
|
+
describe "should return the device information" do
|
28
|
+
subject { UseragentParser.parse_all(user_agent_string)['device'] }
|
29
|
+
|
30
|
+
its(['family']) { should be_nil }
|
31
|
+
its(['is_spider']) { should be_false }
|
32
|
+
its(['is_mobile']) { should be_false }
|
33
|
+
end
|
34
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: useragent_parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2012-09-13 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rake
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,15 @@ dependencies:
|
|
21
21
|
version: 0.9.0
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 0.9.0
|
25
30
|
- !ruby/object:Gem::Dependency
|
26
31
|
name: rspec
|
27
|
-
requirement:
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
28
33
|
none: false
|
29
34
|
requirements:
|
30
35
|
- - ~>
|
@@ -32,10 +37,15 @@ dependencies:
|
|
32
37
|
version: 2.6.0
|
33
38
|
type: :development
|
34
39
|
prerelease: false
|
35
|
-
version_requirements:
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 2.6.0
|
36
46
|
- !ruby/object:Gem::Dependency
|
37
47
|
name: multi_json
|
38
|
-
requirement:
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
39
49
|
none: false
|
40
50
|
requirements:
|
41
51
|
- - ~>
|
@@ -43,7 +53,12 @@ dependencies:
|
|
43
53
|
version: 1.0.1
|
44
54
|
type: :development
|
45
55
|
prerelease: false
|
46
|
-
version_requirements:
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 1.0.1
|
47
62
|
description: UseragentParser extracts browser and operating system information from
|
48
63
|
the headers sent by most browsers and email clients
|
49
64
|
email:
|
@@ -58,17 +73,25 @@ files:
|
|
58
73
|
- LICENSE
|
59
74
|
- README.md
|
60
75
|
- Rakefile
|
61
|
-
- config/
|
76
|
+
- config/regexes.yaml
|
62
77
|
- lib/useragent_parser.rb
|
63
|
-
- lib/useragent_parser/
|
78
|
+
- lib/useragent_parser/parsers/device_parser.rb
|
79
|
+
- lib/useragent_parser/parsers/os_parser.rb
|
80
|
+
- lib/useragent_parser/parsers/user_agent_parser.rb
|
64
81
|
- lib/useragent_parser/user_agent.rb
|
65
82
|
- lib/useragent_parser/version.rb
|
83
|
+
- spec/fixtures/additional_os_tests.yaml
|
66
84
|
- spec/fixtures/firefox_user_agent_strings.yaml
|
67
85
|
- spec/fixtures/pgts_browser_list.yaml
|
86
|
+
- spec/fixtures/test_device.yaml
|
68
87
|
- spec/fixtures/test_user_agent_parser.yaml
|
88
|
+
- spec/fixtures/test_user_agent_parser_os.yaml
|
89
|
+
- spec/parsers/device_parser_spec.rb
|
90
|
+
- spec/parsers/os_parser_spec.rb
|
91
|
+
- spec/parsers/useragent_parser_spec.rb
|
69
92
|
- spec/spec_helper.rb
|
70
|
-
- spec/
|
71
|
-
- spec/
|
93
|
+
- spec/user_agent_spec.rb
|
94
|
+
- spec/useragent_parser_spec.rb
|
72
95
|
- useragent_parser.gemspec
|
73
96
|
homepage: https://github.com/yabawock/useragent_parser
|
74
97
|
licenses: []
|
@@ -82,28 +105,28 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
82
105
|
- - ! '>='
|
83
106
|
- !ruby/object:Gem::Version
|
84
107
|
version: '0'
|
85
|
-
segments:
|
86
|
-
- 0
|
87
|
-
hash: -1051950562318165295
|
88
108
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
89
109
|
none: false
|
90
110
|
requirements:
|
91
111
|
- - ! '>='
|
92
112
|
- !ruby/object:Gem::Version
|
93
113
|
version: '0'
|
94
|
-
segments:
|
95
|
-
- 0
|
96
|
-
hash: -1051950562318165295
|
97
114
|
requirements: []
|
98
115
|
rubyforge_project: useragent_parser
|
99
|
-
rubygems_version: 1.8.
|
116
|
+
rubygems_version: 1.8.23
|
100
117
|
signing_key:
|
101
118
|
specification_version: 3
|
102
119
|
summary: A library to extract informtion from Useragent headers
|
103
120
|
test_files:
|
121
|
+
- spec/fixtures/additional_os_tests.yaml
|
104
122
|
- spec/fixtures/firefox_user_agent_strings.yaml
|
105
123
|
- spec/fixtures/pgts_browser_list.yaml
|
124
|
+
- spec/fixtures/test_device.yaml
|
106
125
|
- spec/fixtures/test_user_agent_parser.yaml
|
126
|
+
- spec/fixtures/test_user_agent_parser_os.yaml
|
127
|
+
- spec/parsers/device_parser_spec.rb
|
128
|
+
- spec/parsers/os_parser_spec.rb
|
129
|
+
- spec/parsers/useragent_parser_spec.rb
|
107
130
|
- spec/spec_helper.rb
|
108
|
-
- spec/
|
109
|
-
- spec/
|
131
|
+
- spec/user_agent_spec.rb
|
132
|
+
- spec/useragent_parser_spec.rb
|
@@ -1,259 +0,0 @@
|
|
1
|
-
user_agent_parsers:
|
2
|
-
#### SPECIAL CASES TOP ####
|
3
|
-
|
4
|
-
# must go before Opera
|
5
|
-
- regex: '^(Opera)/(\d+)\.(\d+) \(Nintendo Wii'
|
6
|
-
family_replacement: 'Wii'
|
7
|
-
|
8
|
-
# must go before Firefox to catch SeaMonkey.
|
9
|
-
- regex: '(SeaMonkey|Fennec|Camino)/(\d+)\.(\d+)\.?([ab]?\d+[a-z]*)'
|
10
|
-
|
11
|
-
# must go before Firefox
|
12
|
-
|
13
|
-
# must go before Browser/major_version.minor_version - eg: Minefield/3.1a1pre
|
14
|
-
- regex: '(Namoroka|Shiretoko|Minefield)/(\d+)\.(\d+)\.(\d+(?:pre)?)'
|
15
|
-
family_replacement: 'Firefox ($1)'
|
16
|
-
|
17
|
-
- regex: '(Firefox)/(\d+)\.(\d+)([ab]\d+[a-z]*)'
|
18
|
-
family_replacement: 'Firefox Beta'
|
19
|
-
|
20
|
-
- regex: '(Firefox)-(?:\d+\.\d+)?/(\d+)\.(\d+)([ab]\d+[a-z]*)'
|
21
|
-
family_replacement: 'Firefox Beta'
|
22
|
-
|
23
|
-
- regex: '(Namoroka|Shiretoko|Minefield)/(\d+)\.(\d+)([ab]\d+[a-z]*)?'
|
24
|
-
family_replacement: 'Firefox ($1)'
|
25
|
-
|
26
|
-
- regex: '(Firefox).*Tablet browser (\d+)\.(\d+)\.(\d+)'
|
27
|
-
family_replacement: 'MicroB'
|
28
|
-
|
29
|
-
- regex: '(MozillaDeveloperPreview)/(\d+)\.(\d+)([ab]\d+[a-z]*)?'
|
30
|
-
|
31
|
-
# e.g.: Flock/2.0b2
|
32
|
-
- regex: '(Flock)/(\d+)\.(\d+)(b\d+?)'
|
33
|
-
|
34
|
-
# RockMelt
|
35
|
-
- regex: '(RockMelt)/(\d+)\.(\d+)\.(\d+)'
|
36
|
-
|
37
|
-
# e.g.: Fennec/0.9pre
|
38
|
-
- regex: '(Fennec)/(\d+)\.(\d+)(pre)'
|
39
|
-
|
40
|
-
- regex: '(Navigator)/(\d+)\.(\d+)\.(\d+)'
|
41
|
-
family_replacement: 'Netscape'
|
42
|
-
|
43
|
-
- regex: '(Navigator)/(\d+)\.(\d+)([ab]\d+)'
|
44
|
-
family_replacement: 'Netscape'
|
45
|
-
|
46
|
-
- regex: '(Netscape6)/(\d+)\.(\d+)\.(\d+)'
|
47
|
-
family_replacement: 'Netscape'
|
48
|
-
|
49
|
-
- regex: '(MyIBrow)/(\d+)\.(\d+)'
|
50
|
-
family_replacement: 'My Internet Browser'
|
51
|
-
|
52
|
-
# Opera will stop at 9.80 and hide the real version in the Version string.
|
53
|
-
# see: http://dev.opera.com/articles/view/opera-ua-string-changes/
|
54
|
-
- regex: '(Opera Tablet).*Version\/(\d+)\.(\d+)(?:\.(\d+))?'
|
55
|
-
|
56
|
-
- regex: '(Opera)/.+Opera Mobi.+Version/(\d+)\.(\d+)'
|
57
|
-
family_replacement: 'Opera Mobile'
|
58
|
-
|
59
|
-
- regex: '(Opera Mini)/(\d+)\.(\d+)'
|
60
|
-
|
61
|
-
- regex: '(Opera)/9.80.*Version\/(\d+)\.(\d+)(?:\.(\d+))?'
|
62
|
-
|
63
|
-
# Palm WebOS looks a lot like Safari.
|
64
|
-
- regex: '(webOS)/(\d+)\.(\d+)'
|
65
|
-
family_replacement: 'Palm webOS'
|
66
|
-
|
67
|
-
# LuaKit has no version info.
|
68
|
-
# http://luakit.org/projects/luakit/
|
69
|
-
- regex: '(luakit)'
|
70
|
-
family_replacement: 'LuaKit'
|
71
|
-
|
72
|
-
# Lightning (for Thunderbird)
|
73
|
-
# http://www.mozilla.org/projects/calendar/lightning/
|
74
|
-
- regex: '(Lightning)/(\d+)\.(\d+)([ab]?\d+[a-z]*)'
|
75
|
-
|
76
|
-
# Swiftfox
|
77
|
-
- regex: '(Firefox)/(\d+)\.(\d+)\.(\d+(?:pre)?) \(Swiftfox\)'
|
78
|
-
family_replacement: 'Swiftfox'
|
79
|
-
- regex: '(Firefox)/(\d+)\.(\d+)([ab]\d+[a-z]*)? \(Swiftfox\)'
|
80
|
-
family_replacement: 'Swiftfox'
|
81
|
-
|
82
|
-
# Rekonq
|
83
|
-
- regex: 'rekonq'
|
84
|
-
family_replacement: 'Rekonq'
|
85
|
-
|
86
|
-
# Conkeror lowercase/uppercase
|
87
|
-
# http://conkeror.org/
|
88
|
-
- regex: '(conkeror|Conkeror)/(\d+)\.(\d+)\.?(\d+)?'
|
89
|
-
family_replacement: 'Conkeror'
|
90
|
-
|
91
|
-
# catches lower case konqueror
|
92
|
-
- regex: '(konqueror)/(\d+)\.(\d+)\.(\d+)'
|
93
|
-
family_replacement: 'Konqueror'
|
94
|
-
|
95
|
-
- regex: '(PlayBook).+RIM Tablet OS (\d+)\.(\d+)\.(\d+)'
|
96
|
-
|
97
|
-
- regex: '(WeTab)-Browser'
|
98
|
-
|
99
|
-
- regex: '(wOSBrowser).+TouchPad/(\d+)\.(\d+)'
|
100
|
-
family_replacement: 'webOS TouchPad'
|
101
|
-
|
102
|
-
- regex: '(Comodo_Dragon)/(\d+)\.(\d+)\.(\d+)'
|
103
|
-
family_replacement: 'Comodo Dragon'
|
104
|
-
|
105
|
-
# YottaaMonitor bot
|
106
|
-
- regex: '(YottaaMonitor)'
|
107
|
-
|
108
|
-
# must go before NetFront below
|
109
|
-
- regex: '(Kindle)/(\d+)\.(\d+)'
|
110
|
-
|
111
|
-
# Maxthon Googlebot
|
112
|
-
- regex: 'Googlebot\/\d+\.\d+.+(Maxthon)'
|
113
|
-
|
114
|
-
# Mobile Safari on Android
|
115
|
-
- regex: 'Android.*\).*(Version)/(\d+)\.(\d+)(?:\.(\d+))?.*Safari/'
|
116
|
-
family_replacement: 'Mobile Safari'
|
117
|
-
|
118
|
-
# Mobile Safari on iOS
|
119
|
-
- regex: '(Version)/(\d+)\.(\d+)(?:\.(\d+))?.*Mobile/\w+ Safari/\d+'
|
120
|
-
family_replacement: 'Mobile Safari'
|
121
|
-
|
122
|
-
#### END SPECIAL CASES TOP ####
|
123
|
-
|
124
|
-
#### MAIN CASES - this catches > 50% of all browsers ####
|
125
|
-
|
126
|
-
# Browser/major_version.minor_version.beta_version
|
127
|
-
- regex: '(AdobeAIR|Chromium|FireWeb|Jasmine|ANTGalio|Midori|Fresco|Lobo|PaleMoon|Maxthon|Lynx|OmniWeb|Dillo|Camino|Demeter|Fluid|Fennec|Shiira|Sunrise|Chrome|Flock|Netscape|Lunascape|Epiphany|WebPilot|Vodafone|NetFront|Konqueror|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|Opera Mini|iCab|NetNewsWire|ThunderBrowse|Thunderbird|Iron|Iris)/(\d+)\.(\d+)\.(\d+)'
|
128
|
-
|
129
|
-
# Browser/major_version.minor_version
|
130
|
-
- regex: '(Bolt|Jasmine|IEMobile|IceCat|Skyfire|Midori|Maxthon|Lynx|Arora|IBrowse|Dillo|Camino|Shiira|Fennec|Phoenix|Chrome|Flock|Netscape|Lunascape|Epiphany|WebPilot|Opera Mini|Opera|Vodafone|NetFront|Konqueror|Googlebot|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|iCab|NetNewsWire|Iron|Space Bison|Stainless|Orca|Dolfin|BOLT)/(\d+)\.(\d+)'
|
131
|
-
|
132
|
-
# Browser major_version.minor_version.beta_version (space instead of slash)
|
133
|
-
- regex: '(iRider|Crazy Browser|SkipStone|iCab|Lunascape|Sleipnir|Maemo Browser) (\d+)\.(\d+)\.(\d+)'
|
134
|
-
# Browser major_version.minor_version (space instead of slash)
|
135
|
-
- regex: '(iCab|Lunascape|Opera|Android) (\d+)\.(\d+)\.?(\d+)?'
|
136
|
-
|
137
|
-
- regex: '(IEMobile) (\d+)\.(\d+)'
|
138
|
-
family_replacement: 'IE Mobile'
|
139
|
-
|
140
|
-
# AFTER THE EDGE CASES ABOVE!
|
141
|
-
- regex: '(Firefox)/(\d+)\.(\d+)\.(\d+)'
|
142
|
-
|
143
|
-
- regex: '(Firefox)/(\d+)\.(\d+)(pre|[ab]\d+[a-z]*)?'
|
144
|
-
#### END MAIN CASES ####
|
145
|
-
|
146
|
-
#### SPECIAL CASES ####
|
147
|
-
- regex: '(Obigo|OBIGO)[^\d]*(\d+)(?:.(\d+))?'
|
148
|
-
family_replacement: 'Obigo'
|
149
|
-
|
150
|
-
- regex: '(MAXTHON|Maxthon) (\d+)\.(\d+)'
|
151
|
-
family_replacement: 'Maxthon'
|
152
|
-
|
153
|
-
- regex: '(Maxthon|MyIE2|Uzbl|Shiira)'
|
154
|
-
major_version_replacement: '0'
|
155
|
-
|
156
|
-
- regex: '(PLAYSTATION) (\d+)'
|
157
|
-
family_replacement: 'PlayStation'
|
158
|
-
|
159
|
-
- regex: '(PlayStation Portable)[^\d]+(\d+).(\d+)'
|
160
|
-
|
161
|
-
- regex: '(BrowseX) \((\d+)\.(\d+)\.(\d+)'
|
162
|
-
|
163
|
-
- regex: '(POLARIS)/(\d+)\.(\d+)'
|
164
|
-
family_replacement: 'Polaris'
|
165
|
-
|
166
|
-
- regex: '(BonEcho)/(\d+)\.(\d+)\.(\d+)'
|
167
|
-
family_replacement: 'Bon Echo'
|
168
|
-
|
169
|
-
- regex: '(iPod).+Version/(\d+)\.(\d+)\.(\d+)'
|
170
|
-
|
171
|
-
- regex: '(iPhone) OS (\d+)_(\d+)(?:_(\d+))?'
|
172
|
-
|
173
|
-
- regex: '(iPad).+ OS (\d+)_(\d+)(?:_(\d+))?'
|
174
|
-
|
175
|
-
- regex: '(Avant)'
|
176
|
-
major_version_replacement: '1'
|
177
|
-
|
178
|
-
- regex: '(Nokia)[EN]?(\d+)'
|
179
|
-
|
180
|
-
# BlackBerry devices
|
181
|
-
- regex: '(Black[bB]erry).+Version\/(\d+)\.(\d+)\.(\d+)'
|
182
|
-
family_replacement: 'Blackberry'
|
183
|
-
|
184
|
-
- regex: '(Black[bB]erry)\s?(\d+)'
|
185
|
-
family_replacement: 'Blackberry'
|
186
|
-
|
187
|
-
- regex: '(OmniWeb)/v(\d+)\.(\d+)'
|
188
|
-
|
189
|
-
- regex: '(Blazer)/(\d+)\.(\d+)'
|
190
|
-
family_replacement: 'Palm Blazer'
|
191
|
-
|
192
|
-
- regex: '(Pre)/(\d+)\.(\d+)'
|
193
|
-
family_replacement: 'Palm Pre'
|
194
|
-
|
195
|
-
- regex: '(Links) \((\d+)\.(\d+)'
|
196
|
-
|
197
|
-
- regex: '(QtWeb) Internet Browser/(\d+)\.(\d+)'
|
198
|
-
|
199
|
-
#- regex: '\(iPad;.+(Version)/(\d+)\.(\d+)(?:\.(\d+))?.*Safari/'
|
200
|
-
# family_replacement: 'iPad'
|
201
|
-
|
202
|
-
# Safari
|
203
|
-
- regex: '(Version)/(\d+)\.(\d+)(?:\.(\d+))?.*Safari/'
|
204
|
-
family_replacement: 'Safari'
|
205
|
-
# Safari didn't provide "Version/d.d.d" prior to 3.0
|
206
|
-
- regex: '(Safari)/\d+'
|
207
|
-
|
208
|
-
- regex: '(OLPC)/Update(\d+)\.(\d+)'
|
209
|
-
|
210
|
-
- regex: '(OLPC)/Update()\.(\d+)'
|
211
|
-
major_version_replacement: '0'
|
212
|
-
|
213
|
-
- regex: '(SamsungSGHi560)'
|
214
|
-
family_replacement: 'Samsung SGHi560'
|
215
|
-
|
216
|
-
- regex: '^(SonyEricssonK800i)'
|
217
|
-
family_replacement: 'Sony Ericsson K800i'
|
218
|
-
|
219
|
-
- regex: '(Teleca Q7)'
|
220
|
-
|
221
|
-
- regex: '(MSIE) (\d+)\.(\d+)'
|
222
|
-
family_replacement: 'IE'
|
223
|
-
|
224
|
-
|
225
|
-
os_parsers:
|
226
|
-
- regex: '(Windows NT|Windows) (\d+)\.(\d+)'
|
227
|
-
family_replacement: 'Windows'
|
228
|
-
- regex: '(Windows Phone OS) (\d+)\.(\d+)'
|
229
|
-
family_replacement: 'Windows Phone'
|
230
|
-
- regex: '(Windows|Win) (XP|9x|95|98|ME)'
|
231
|
-
family_replacement: 'Windows'
|
232
|
-
- regex: '(Windows CE)'
|
233
|
-
- regex: '(Win)(95|98|9x)'
|
234
|
-
family_replacement: 'Windows'
|
235
|
-
- regex: '(Windows)'
|
236
|
-
|
237
|
-
- regex: '(Android) (\d+)\.(\d+)\.(\d+)'
|
238
|
-
- regex: '(Android) (\d+)\.(\d+)'
|
239
|
-
|
240
|
-
- regex: '(CPU OS|CPU iPhone OS) (\d+)_(\d+)_(\d+) like Mac OS X'
|
241
|
-
family_replacement: 'iOS'
|
242
|
-
- regex: '(CPU OS|CPU iPhone OS) (\d+)_(\d+) like Mac OS X'
|
243
|
-
family_replacement: 'iOS'
|
244
|
-
|
245
|
-
- regex: '(Mac OS X) v?(\d+)\.(\d+)\.?(\d+)?'
|
246
|
-
- regex: '(Mac OS X) v?(\d+)_(\d+)_?(\d+)?'
|
247
|
-
- regex: '(Mac OS X)/(\d+)\.(\d+)\.?(\d+)?'
|
248
|
-
- regex: '(os=Mac) (\d+)\.(\d+)\.(\d+)'
|
249
|
-
family_replacement: 'Mac OS X'
|
250
|
-
- regex: '(Mac OS X|Mac_PowerPC|iMac|MacBook|Macintosh|PowerMac)'
|
251
|
-
family_replacement: 'Mac OS X'
|
252
|
-
|
253
|
-
- regex: '(FreeBSD)'
|
254
|
-
- regex: '(iPhone Simulator)'
|
255
|
-
|
256
|
-
- regex: '(Linux)'
|
257
|
-
|
258
|
-
product_parsers:
|
259
|
-
- regex: '(iPhone)'
|
@@ -1,169 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
describe UseragentParser::UserAgent do
|
6
|
-
describe "for browser details" do
|
7
|
-
it "should report the browser family" do
|
8
|
-
UseragentParser::UserAgent.new({ 'family' => 'Chrome', 'v1' => '14', 'v2' => '0', 'v3' => '835' }).browser_family.should == 'Chrome'
|
9
|
-
end
|
10
|
-
|
11
|
-
it "should report the browser major version" do
|
12
|
-
UseragentParser::UserAgent.new({ 'family' => 'Chrome', 'v1' => '14', 'v2' => '0', 'v3' => '835' }).browser_major_version.should == '14'
|
13
|
-
end
|
14
|
-
|
15
|
-
it "should report the browser minor version" do
|
16
|
-
UseragentParser::UserAgent.new({ 'family' => 'Chrome', 'v1' => '14', 'v2' => '0', 'v3' => '835' }).browser_minor_version.should == '0'
|
17
|
-
end
|
18
|
-
|
19
|
-
it "should report the browser patch version" do
|
20
|
-
UseragentParser::UserAgent.new({ 'family' => 'Chrome', 'v1' => '14', 'v2' => '0', 'v3' => '835' }).browser_patch_version.should == '835'
|
21
|
-
end
|
22
|
-
|
23
|
-
it "should report the browser version" do
|
24
|
-
UseragentParser::UserAgent.new({ 'family' => 'Chrome', 'v1' => '14', 'v2' => '0', 'v3' => '835' }).browser_version.should == '14.0.835'
|
25
|
-
end
|
26
|
-
|
27
|
-
it "should report the browser version without patch level" do
|
28
|
-
UseragentParser::UserAgent.new({ 'family' => 'Firefox', 'v1' => '5', 'v2' => '0' }).browser_version.should == '5.0'
|
29
|
-
end
|
30
|
-
|
31
|
-
it "should report the browser version without minor version" do
|
32
|
-
UseragentParser::UserAgent.new({ 'family' => 'Firefox', 'v1' => '5' }).browser_version.should == '5'
|
33
|
-
end
|
34
|
-
|
35
|
-
it "should report the browser family without version" do
|
36
|
-
UseragentParser::UserAgent.new({ 'family' => 'Opera' }).browser_version.should == ''
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
describe "for operating system details" do
|
41
|
-
it "should report the os family" do
|
42
|
-
UseragentParser::UserAgent.new({ 'os_family' => 'Windows NT', 'os_v1' => '3', 'os_v2' => '1' }).os_family.should == 'Windows NT'
|
43
|
-
end
|
44
|
-
|
45
|
-
it "should report the major os version" do
|
46
|
-
UseragentParser::UserAgent.new({ 'os_family' => 'Windows NT', 'os_v1' => '3', 'os_v2' => '1' }).os_major_version.should == '3'
|
47
|
-
end
|
48
|
-
|
49
|
-
it "should report the minor os version" do
|
50
|
-
UseragentParser::UserAgent.new({ 'os_family' => 'Windows NT', 'os_v1' => '3', 'os_v2' => '1' }).os_minor_version.should == '1'
|
51
|
-
end
|
52
|
-
|
53
|
-
it "should report the os patchlevel" do
|
54
|
-
UseragentParser::UserAgent.new({ 'os_family' => 'Windows NT', 'os_v1' => '3', 'os_v2' => '1' }).os_patch_version.should be_nil
|
55
|
-
end
|
56
|
-
|
57
|
-
it "should report the os version" do
|
58
|
-
UseragentParser::UserAgent.new({ 'os_family' => 'Windows NT', 'os_v1' => '3', 'os_v2' => '1' }).os_version.should == '3.1'
|
59
|
-
end
|
60
|
-
|
61
|
-
it "should know the code name for Windows NT 3.1" do
|
62
|
-
UseragentParser::UserAgent.new({ 'os_family' => 'Windows NT', 'os_v1' => '3', 'os_v2' => '1' }).os.should == 'Microsoft Windows NT 3.1'
|
63
|
-
end
|
64
|
-
|
65
|
-
it "should know the code name for Windows NT 3.5" do
|
66
|
-
UseragentParser::UserAgent.new({ 'os_family' => 'Windows NT', 'os_v1' => '3', 'os_v2' => '5' }).os.should == 'Microsoft Windows NT 3.5'
|
67
|
-
end
|
68
|
-
|
69
|
-
it "should know the code name for Windows NT 4.0" do
|
70
|
-
UseragentParser::UserAgent.new({ 'os_family' => 'Windows NT', 'os_v1' => '4', 'os_v2' => '0' }).os.should == 'Microsoft Windows NT 4.0'
|
71
|
-
end
|
72
|
-
|
73
|
-
it "should know the code name for Windows 2000" do
|
74
|
-
UseragentParser::UserAgent.new({ 'os_family' => 'Windows NT', 'os_v1' => '5', 'os_v2' => '0' }).os.should == 'Microsoft Windows 2000'
|
75
|
-
end
|
76
|
-
|
77
|
-
it "should know the code name for Windows XP" do
|
78
|
-
UseragentParser::UserAgent.new({ 'os_family' => 'Windows NT', 'os_v1' => '5', 'os_v2' => '1' }).os.should == 'Microsoft Windows XP'
|
79
|
-
end
|
80
|
-
|
81
|
-
it "should know the code name for Windows XP 64bit / Server 2003" do
|
82
|
-
UseragentParser::UserAgent.new({ 'os_family' => 'Windows NT', 'os_v1' => '5', 'os_v2' => '2' }).os.should == 'Microsoft Windows XP 64bit / Server 2003'
|
83
|
-
end
|
84
|
-
|
85
|
-
it "should know the code name for Windows Vista / Server 2008" do
|
86
|
-
UseragentParser::UserAgent.new({ 'os_family' => 'Windows NT', 'os_v1' => '6', 'os_v2' => '0' }).os.should == 'Microsoft Windows Vista / Server 2008'
|
87
|
-
end
|
88
|
-
|
89
|
-
it "should know the code name for Windows 7 / Server 2008 R2" do
|
90
|
-
UseragentParser::UserAgent.new({ 'os_family' => 'Windows NT', 'os_v1' => '6', 'os_v2' => '1' }).os.should == 'Microsoft Windows 7 / Server 2008 R2'
|
91
|
-
end
|
92
|
-
|
93
|
-
it "should know the code name for Windows 8" do
|
94
|
-
UseragentParser::UserAgent.new({ 'os_family' => 'Windows NT', 'os_v1' => '6', 'os_v2' => '2' }).os.should == 'Microsoft Windows 8'
|
95
|
-
end
|
96
|
-
|
97
|
-
it "should know the code name for Windows 3.1" do
|
98
|
-
UseragentParser::UserAgent.new({ 'os_family' => 'Windows', 'os_v1' => '3', 'os_v2' => '1' }).os.should == 'Microsoft Windows 3.1'
|
99
|
-
end
|
100
|
-
|
101
|
-
it "should know the code name for Windows 95" do
|
102
|
-
UseragentParser::UserAgent.new({ 'os_family' => 'Windows', 'os_v1' => '95' }).os.should == 'Microsoft Windows 95'
|
103
|
-
end
|
104
|
-
|
105
|
-
it "should know the code name for Windows 98" do
|
106
|
-
UseragentParser::UserAgent.new({ 'os_family' => 'Windows', 'os_v1' => '98' }).os.should == 'Microsoft Windows 98'
|
107
|
-
end
|
108
|
-
|
109
|
-
it "should know the code name for Windows ME" do
|
110
|
-
UseragentParser::UserAgent.new({ 'os_family' => 'Windows', 'os_v1' => 'ME' }).os.should == 'Microsoft Windows ME'
|
111
|
-
end
|
112
|
-
|
113
|
-
it "should know the code name for Windows 9x" do
|
114
|
-
UseragentParser::UserAgent.new({ 'os_family' => 'Windows', 'os_v1' => '9x' }).os.should == 'Microsoft Windows 9x'
|
115
|
-
end
|
116
|
-
|
117
|
-
it "should know the code name for Mac OS X 10.0" do
|
118
|
-
UseragentParser::UserAgent.new({ 'os_family' => 'Mac OS X', 'os_v1' => '10', 'os_v2' => '0' }).os.should == 'Apple Mac OS X 10.0 (Cheetah)'
|
119
|
-
end
|
120
|
-
|
121
|
-
it "should know the code name for Mac OS X 10.0" do
|
122
|
-
UseragentParser::UserAgent.new({ 'os_family' => 'Mac OS X', 'os_v1' => '10', 'os_v2' => '0', 'os_v3' => 2 }).os.should == 'Apple Mac OS X 10.0.2 (Cheetah)'
|
123
|
-
end
|
124
|
-
|
125
|
-
it "should know the code name for Mac OS X 10.1" do
|
126
|
-
UseragentParser::UserAgent.new({ 'os_family' => 'Mac OS X', 'os_v1' => '10', 'os_v2' => '1', 'os_v3' => 2 }).os.should == 'Apple Mac OS X 10.1.2 (Puma)'
|
127
|
-
end
|
128
|
-
|
129
|
-
it "should know the code name for Mac OS X 10.2" do
|
130
|
-
UseragentParser::UserAgent.new({ 'os_family' => 'Mac OS X', 'os_v1' => '10', 'os_v2' => '2', 'os_v3' => 2 }).os.should == 'Apple Mac OS X 10.2.2 (Jaguar)'
|
131
|
-
end
|
132
|
-
|
133
|
-
it "should know the code name for Mac OS X 10.3" do
|
134
|
-
UseragentParser::UserAgent.new({ 'os_family' => 'Mac OS X', 'os_v1' => '10', 'os_v2' => '3', 'os_v3' => 2 }).os.should == 'Apple Mac OS X 10.3.2 (Panther)'
|
135
|
-
end
|
136
|
-
|
137
|
-
it "should know the code name for Mac OS X 10.4" do
|
138
|
-
UseragentParser::UserAgent.new({ 'os_family' => 'Mac OS X', 'os_v1' => '10', 'os_v2' => '4', 'os_v3' => 2 }).os.should == 'Apple Mac OS X 10.4.2 (Tiger)'
|
139
|
-
end
|
140
|
-
|
141
|
-
it "should know the code name for Mac OS X 10.5" do
|
142
|
-
UseragentParser::UserAgent.new({ 'os_family' => 'Mac OS X', 'os_v1' => '10', 'os_v2' => '5', 'os_v3' => 2 }).os.should == 'Apple Mac OS X 10.5.2 (Leopard)'
|
143
|
-
end
|
144
|
-
|
145
|
-
it "should know the code name for Mac OS X 10.6" do
|
146
|
-
UseragentParser::UserAgent.new({ 'os_family' => 'Mac OS X', 'os_v1' => '10', 'os_v2' => '6', 'os_v3' => 2 }).os.should == 'Apple Mac OS X 10.6.2 (Snow Leopard)'
|
147
|
-
end
|
148
|
-
|
149
|
-
it "should know the code name for Mac OS X 10.7" do
|
150
|
-
UseragentParser::UserAgent.new({ 'os_family' => 'Mac OS X', 'os_v1' => '10', 'os_v2' => '7', 'os_v3' => '2' }).os.should == 'Apple Mac OS X 10.7.2 (Lion)'
|
151
|
-
end
|
152
|
-
|
153
|
-
it "should provide a generic os/version for other operating systems" do
|
154
|
-
UseragentParser::UserAgent.new({ 'os_family' => 'Linux', 'os_v1' => '2', 'os_v2' => '6', 'os_v3' => '32' }).os.should == 'Linux 2.6.32'
|
155
|
-
end
|
156
|
-
|
157
|
-
it "should provide a generic os name without version" do
|
158
|
-
UseragentParser::UserAgent.new({ 'os_family' => 'FreeBSD' }).os.should == 'FreeBSD'
|
159
|
-
end
|
160
|
-
end
|
161
|
-
|
162
|
-
it "should confuse operating system and browser version" do
|
163
|
-
ua = UseragentParser::UserAgent.new({ 'os_family' => 'Mac OS X', 'os_v1' => '10', 'os_v2' => '7', 'os_v3' => '2', 'family' => 'Chrome', 'v1' => '14', 'v2' => '0', 'v3' => '835' })
|
164
|
-
ua.browser_family.should == 'Chrome'
|
165
|
-
ua.browser_version.should == '14.0.835'
|
166
|
-
ua.os_family.should == 'Mac OS X'
|
167
|
-
ua.os_version.should == '10.7.2'
|
168
|
-
end
|
169
|
-
end
|