ua-utils 0.3.3
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/LICENSE +22 -0
- data/README.md +35 -0
- data/lib/ua-utils.rb +23 -0
- data/lib/ua-utils/operating_system.rb +80 -0
- data/lib/ua-utils/user_agent.rb +36 -0
- data/spec/spec_helper.rb +3 -0
- data/spec/ua-utils/user_agent_spec.rb +159 -0
- metadata +88 -0
data/LICENSE
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
Copyright (c) 2013 Harald Walker
|
|
2
|
+
|
|
3
|
+
MIT License
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
|
6
|
+
a copy of this software and associated documentation files (the
|
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
|
11
|
+
the following conditions:
|
|
12
|
+
|
|
13
|
+
The above copyright notice and this permission notice shall be
|
|
14
|
+
included in all copies or substantial portions of the Software.
|
|
15
|
+
|
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# UA-UTILS
|
|
2
|
+
|
|
3
|
+
Utilities to parse user-agent strings.
|
|
4
|
+
|
|
5
|
+
First implementation is mainly focusing on most common operating systems and device types, so that content can be optimized.
|
|
6
|
+
|
|
7
|
+
## Usage
|
|
8
|
+
|
|
9
|
+
### Rails
|
|
10
|
+
|
|
11
|
+
In your Gemfile:
|
|
12
|
+
|
|
13
|
+
```ruby
|
|
14
|
+
gem 'ua-utils'
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
`bundle install` and restart your server to make the files available.
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
### Example
|
|
21
|
+
|
|
22
|
+
user_agent = UaUtils::UserAgent.new(user_agent_string)
|
|
23
|
+
or
|
|
24
|
+
os = UaUtils::OperatingSystem.new(user_agent_string)
|
|
25
|
+
|
|
26
|
+
## Operating systems
|
|
27
|
+
|
|
28
|
+
Following operating systems can be detected:
|
|
29
|
+
windows, windows phone, mac os x, iOS, android, bada, meego, symbian
|
|
30
|
+
|
|
31
|
+
## Devices
|
|
32
|
+
|
|
33
|
+
Following device types can be detected:
|
|
34
|
+
desktop, tablet, mobile, tv, bot
|
|
35
|
+
|
data/lib/ua-utils.rb
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
require 'ua-utils/user_agent'
|
|
2
|
+
require 'ua-utils/operating_system'
|
|
3
|
+
|
|
4
|
+
module UaUtils
|
|
5
|
+
|
|
6
|
+
VERSION = '0.3.3'
|
|
7
|
+
|
|
8
|
+
def self.logger
|
|
9
|
+
@logger ||= (rails_logger || default_logger)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def self.default_logger
|
|
13
|
+
require 'logger'
|
|
14
|
+
l = Logger.new(STDOUT)
|
|
15
|
+
l.level = Logger::INFO
|
|
16
|
+
l
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def self.logger=(logger)
|
|
20
|
+
@logger = logger
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
end
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
module UaUtils
|
|
2
|
+
|
|
3
|
+
# The operating system that can be detected based on the user agent string.
|
|
4
|
+
#
|
|
5
|
+
# === Example
|
|
6
|
+
#
|
|
7
|
+
# os = UaUtils::OperatingSystem.new(
|
|
8
|
+
# 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; en-us) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4')
|
|
9
|
+
#
|
|
10
|
+
# if os.tablet?
|
|
11
|
+
# (... do something for tablet devices ...)
|
|
12
|
+
# end
|
|
13
|
+
#
|
|
14
|
+
# if os.platform == :ios
|
|
15
|
+
# render "/ios/show"
|
|
16
|
+
# end
|
|
17
|
+
|
|
18
|
+
class OperatingSystem
|
|
19
|
+
|
|
20
|
+
attr_reader :platform, :device
|
|
21
|
+
|
|
22
|
+
# Initializes operating system for parsing with the given user agent string.
|
|
23
|
+
def initialize(user_agent_string)
|
|
24
|
+
@platform, @device = detect_device(user_agent_string)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Returns string representation of the operating system.
|
|
28
|
+
# @return [String]
|
|
29
|
+
def to_s
|
|
30
|
+
@platform.to_s
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Returns true if the operating system is a mobile device.
|
|
34
|
+
# @return [Boolean]
|
|
35
|
+
def mobile?
|
|
36
|
+
@device == :mobile
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Returns true if the operating system is a tablet device.
|
|
40
|
+
# @return [Boolean]
|
|
41
|
+
def tablet?
|
|
42
|
+
@device == :tablet
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Returns true if the operating system is a desktop device.
|
|
46
|
+
# @return [Boolean]
|
|
47
|
+
def desktop?
|
|
48
|
+
@device == :desktop
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Returns true if the operating system is a webTV device.
|
|
52
|
+
# @return [Boolean]
|
|
53
|
+
def webtv?
|
|
54
|
+
@device == :webtv
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
private
|
|
58
|
+
|
|
59
|
+
def detect_device(ua_string) #:nodoc:
|
|
60
|
+
case ua_string
|
|
61
|
+
when /(windows nt).*(touch)/i ; return :windows, :tablet
|
|
62
|
+
when /windows nt/i ; return :windows, :desktop
|
|
63
|
+
when /ipad/i ; return :ios, :tablet
|
|
64
|
+
when /iphone/i ; return :ios, :mobile
|
|
65
|
+
when /mac os x/i ; return :macosx, :desktop #after ios
|
|
66
|
+
when /android(?!.*kindle).*(mobile safari)/i ; return :android, :mobile
|
|
67
|
+
when /(android).*(safari)/i ; return :android, :tablet #after mobile android
|
|
68
|
+
when /windows phone/i ; return :windows_phone, :mobile
|
|
69
|
+
when /bada/i ; return :bada, :mobile
|
|
70
|
+
when /meego/i ; return :meego, :mobile
|
|
71
|
+
when /symbian|s60/i ; return :symbian, :mobile
|
|
72
|
+
when /googletv/i ; return :android, :tv
|
|
73
|
+
when /bot/i ; return :unknown, :bot
|
|
74
|
+
else ; return :unknown, :unknown
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
module UaUtils
|
|
2
|
+
|
|
3
|
+
# The user agent object.
|
|
4
|
+
#
|
|
5
|
+
# === Example
|
|
6
|
+
#
|
|
7
|
+
# user_agent = UaUtils::UserAgent.new(
|
|
8
|
+
# 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; en-us) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4')
|
|
9
|
+
#
|
|
10
|
+
# if user_agent.os.tablet?
|
|
11
|
+
# (... do something for tablet devices ...)
|
|
12
|
+
# end
|
|
13
|
+
#
|
|
14
|
+
# if user_agent.os.platform == :ios
|
|
15
|
+
# render "/ios/show"
|
|
16
|
+
# end
|
|
17
|
+
#
|
|
18
|
+
class UserAgent
|
|
19
|
+
|
|
20
|
+
attr_reader :os
|
|
21
|
+
|
|
22
|
+
# Initializes a user agent for parsing with a given user agent string
|
|
23
|
+
# @param [Object] user_agent_string
|
|
24
|
+
def initialize(user_agent_string)
|
|
25
|
+
@user_agent_string = user_agent_string
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Returns operating system of the user agent.
|
|
29
|
+
# @return [UaUtils::OperatingSystem] the detected operating system of the user agent string
|
|
30
|
+
def os
|
|
31
|
+
@os ||= UaUtils::OperatingSystem.new(@user_agent_string) # operating system
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
end
|
data/spec/spec_helper.rb
ADDED
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
module UaUtils
|
|
4
|
+
describe 'UserAgent' do
|
|
5
|
+
|
|
6
|
+
describe 'detects mobile devices' do
|
|
7
|
+
|
|
8
|
+
it 'recognizes iOS phones' do
|
|
9
|
+
test([
|
|
10
|
+
'Mozilla/5.0 (iPhone; U; CPU like Mac OS X; nl-nl) AppleWebKit/420.1 (KHTML, like Gecko)',
|
|
11
|
+
'Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko)',
|
|
12
|
+
'Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/4A93 Safari/419.3'
|
|
13
|
+
],
|
|
14
|
+
{ platform: :ios, device: :mobile })
|
|
15
|
+
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it 'recognizes Android phones' do
|
|
19
|
+
test([
|
|
20
|
+
'Mozilla/5.0 (Linux; U; Android 2.0; en-gb; Milestone Build/SHOLS_U2_01.03.1) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17',
|
|
21
|
+
'Mozilla/5.0 (Linux; U; Android 4.0.1; en-us; Galaxy Nexus Build/ICL41) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30'
|
|
22
|
+
],
|
|
23
|
+
{ platform: :android, device: :mobile })
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it 'recognizes Windows phones' do
|
|
27
|
+
test([
|
|
28
|
+
'Mozilla/4.0 (compatible; MSIE 7.0; Windows Phone OS 7.0; Trident/3.1; IEMobile/7.0) Asus;Galaxy6',
|
|
29
|
+
'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0)',
|
|
30
|
+
'Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 920)',
|
|
31
|
+
'Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 820)'
|
|
32
|
+
],
|
|
33
|
+
{ platform: :windows_phone, device: :mobile })
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
it 'recognizes Samsung bada phones' do
|
|
37
|
+
test([
|
|
38
|
+
'Mozilla/5.0 (SAMSUNG; SAMSUNG-GT-S8500/S8500NEJE5; U; Bada/1.0; fr-fr) AppleWebKit/533.1 (KHTML, like Gecko) Dolfin/2.0 Mobile WVGA SMM-MMS/1.2.0 NexPlayer/3.0 profile/MIDP-2.1 configuration/CLDC-1.1 OPN-B',
|
|
39
|
+
'Mozilla/5.0 (SAMSUNG; SAMSUNG-GT-S8500/S8500XXJL2; U; Bada/1.2; de-de) AppleWebKit/533.1 (KHTML, like Gecko) Dolfin/2.2 Mobile WVGA SMM-MMS/1.2.0 OPN-B'
|
|
40
|
+
],
|
|
41
|
+
{ platform: :bada, device: :mobile })
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
it 'recognizes Nokia MeeGo phones' do
|
|
45
|
+
test([
|
|
46
|
+
'Mozilla/5.0 (MeeGo; NokiaN9) AppleWebKit/534.13 (KHTML, like Gecko) NokiaBrowser/8.5.0 Mobile Safari/534.13'
|
|
47
|
+
],
|
|
48
|
+
{ platform: :meego, device: :mobile })
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it 'recognizes Symbian phones' do
|
|
52
|
+
test([
|
|
53
|
+
'Mozilla/5.0 (SymbianOS/9.2; U; Series60/3.1 NokiaN95/10.0.018; Profile/MIDP-2.0 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413',
|
|
54
|
+
'NokiaN80-3/1.0552.0.7Series60/3.0Profile/MIDP-2.0Configuration/CLDC-1.1',
|
|
55
|
+
'NokiaN90-1/3.0545.5.1 Series60/2.8 Profile/MIDP-2.0 Configuration/CLDC-1.1'
|
|
56
|
+
],
|
|
57
|
+
{ platform: :symbian, device: :mobile })
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
describe 'detects tablet devices' do
|
|
63
|
+
it 'recognized iPads' do
|
|
64
|
+
test([
|
|
65
|
+
'Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B367 Safari/531.21.10',
|
|
66
|
+
'Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.10',
|
|
67
|
+
'Mozilla/5.0 (iPad; U; CPU OS 4_2_1 like Mac OS X; ja-jp) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5',
|
|
68
|
+
'Mozilla/5.0 (iPad; CPU OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3' ],
|
|
69
|
+
{ platform: :ios, device: :tablet })
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
it 'recognized popular android tablets' do
|
|
73
|
+
test([
|
|
74
|
+
'Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13',
|
|
75
|
+
'Mozilla/5.0 (Linux; U; Android 3.0.1; en-us; Xoom Build/HRI66) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13',
|
|
76
|
+
'Mozilla/5.0 (Linux; U; Android 3.1; en-us; GT-P7510 Build/HMJ37) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13',
|
|
77
|
+
'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; Transformer TF101 Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30',
|
|
78
|
+
'Mozilla/5.0 (Linux; U; Android-4.0.3; en-us; Xoom Build/IML77) AppleWebKit/535.7 (KHTML, like Gecko) CrMo/16.0.912.75 Safari/535.7',
|
|
79
|
+
'Mozilla/5.0 (Linux; U; Android 4.1.1; en-gb; ASUS Transformer Pad TF700T Build/JRO03C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30',
|
|
80
|
+
'Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; Kindle Fire Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1'
|
|
81
|
+
],
|
|
82
|
+
{ platform: :android, device: :tablet })
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
it 'recognized windows 8 devices with touch support' do
|
|
86
|
+
test([
|
|
87
|
+
'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0; Touch)'
|
|
88
|
+
],{ platform: :windows, device: :tablet })
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
describe 'detect web-tv devices' do
|
|
93
|
+
|
|
94
|
+
it 'recognizes Google TV devices' do
|
|
95
|
+
test([
|
|
96
|
+
'Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.127 Large Screen Safari/533.4 GoogleTV/161242',
|
|
97
|
+
'Mozilla/5.0 (X11; U: Linux i686; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.127 Large Screen Safari/533.4 GoogleTV/162671', # Sony
|
|
98
|
+
'Mozilla/5.0 (X11; U: Linux i686; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.127 Large Screen Safari/533.4 GoogleTV/b39389' #Logitech Revue
|
|
99
|
+
],
|
|
100
|
+
{ platform: :android, device: :tv })
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
describe 'detect desktop devices' do
|
|
106
|
+
|
|
107
|
+
it 'recognizes Windows computers' do
|
|
108
|
+
test([
|
|
109
|
+
'Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 ( .NET CLR 3.5.30729)',
|
|
110
|
+
'Mozilla/5.0 (compatible; MSIE 7.0; Windows NT 5.2; WOW64; .NET CLR 2.0.50727)',
|
|
111
|
+
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.04506)',
|
|
112
|
+
'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; MDDC; MSOffice 12)',
|
|
113
|
+
'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Media Center PC 5.0; SLCC1; InfoPath.2)'
|
|
114
|
+
],
|
|
115
|
+
{ platform: :windows, device: :desktop })
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
it 'recognizes Mac OS X computers' do
|
|
119
|
+
test([
|
|
120
|
+
'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; en-us) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4',
|
|
121
|
+
'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_7; da-dk) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1'
|
|
122
|
+
],
|
|
123
|
+
{ platform: :macosx, device: :desktop })
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
# helper method to perform the tests for user-agent strings
|
|
128
|
+
def test(user_agent_strings, expect = { })
|
|
129
|
+
user_agent_strings.each do |user_agent_string|
|
|
130
|
+
user_agent = UserAgent.new(user_agent_string)
|
|
131
|
+
user_agent.os.platform.should == expect[:platform]
|
|
132
|
+
case expect[:device]
|
|
133
|
+
when :mobile
|
|
134
|
+
user_agent.os.mobile?.should be_true
|
|
135
|
+
user_agent.os.tablet?.should_not be_true
|
|
136
|
+
user_agent.os.desktop?.should_not be_true
|
|
137
|
+
user_agent.os.webtv?.should_not be_true
|
|
138
|
+
when :tablet
|
|
139
|
+
user_agent.os.tablet?.should be_true
|
|
140
|
+
user_agent.os.mobile?.should_not be_true
|
|
141
|
+
user_agent.os.desktop?.should_not be_true
|
|
142
|
+
user_agent.os.webtv?.should_not be_true
|
|
143
|
+
when :desktop
|
|
144
|
+
user_agent.os.desktop?.should be_true
|
|
145
|
+
user_agent.os.mobile?.should_not be_true
|
|
146
|
+
user_agent.os.tablet?.should_not be_true
|
|
147
|
+
user_agent.os.webtv?.should_not be_true
|
|
148
|
+
when :webtv
|
|
149
|
+
user_agent.os.webtv?.should be_true
|
|
150
|
+
user_agent.os.mobile?.should_not be_true
|
|
151
|
+
user_agent.os.tablet?.should_not be_true
|
|
152
|
+
user_agent.os.desktop?.should_not be_true
|
|
153
|
+
end
|
|
154
|
+
user_agent.os.device.should == expect[:device]
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
end
|
|
159
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: ua-utils
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.3.3
|
|
5
|
+
prerelease:
|
|
6
|
+
platform: ruby
|
|
7
|
+
authors:
|
|
8
|
+
- ! '''Harald'
|
|
9
|
+
- Walker'
|
|
10
|
+
autorequire:
|
|
11
|
+
bindir: bin
|
|
12
|
+
cert_chain: []
|
|
13
|
+
date: 2013-03-23 00:00:00.000000000 Z
|
|
14
|
+
dependencies:
|
|
15
|
+
- !ruby/object:Gem::Dependency
|
|
16
|
+
name: rspec
|
|
17
|
+
requirement: !ruby/object:Gem::Requirement
|
|
18
|
+
none: false
|
|
19
|
+
requirements:
|
|
20
|
+
- - ! '>='
|
|
21
|
+
- !ruby/object:Gem::Version
|
|
22
|
+
version: '0'
|
|
23
|
+
type: :development
|
|
24
|
+
prerelease: false
|
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
26
|
+
none: false
|
|
27
|
+
requirements:
|
|
28
|
+
- - ! '>='
|
|
29
|
+
- !ruby/object:Gem::Version
|
|
30
|
+
version: '0'
|
|
31
|
+
- !ruby/object:Gem::Dependency
|
|
32
|
+
name: rake
|
|
33
|
+
requirement: !ruby/object:Gem::Requirement
|
|
34
|
+
none: false
|
|
35
|
+
requirements:
|
|
36
|
+
- - ! '>='
|
|
37
|
+
- !ruby/object:Gem::Version
|
|
38
|
+
version: '0'
|
|
39
|
+
type: :development
|
|
40
|
+
prerelease: false
|
|
41
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
42
|
+
none: false
|
|
43
|
+
requirements:
|
|
44
|
+
- - ! '>='
|
|
45
|
+
- !ruby/object:Gem::Version
|
|
46
|
+
version: '0'
|
|
47
|
+
description: Utility for parsing and handling user-agent strings.
|
|
48
|
+
email:
|
|
49
|
+
- ! '''harald.walker@gmail.com'''
|
|
50
|
+
executables: []
|
|
51
|
+
extensions: []
|
|
52
|
+
extra_rdoc_files: []
|
|
53
|
+
files:
|
|
54
|
+
- lib/ua-utils/operating_system.rb
|
|
55
|
+
- lib/ua-utils/user_agent.rb
|
|
56
|
+
- lib/ua-utils.rb
|
|
57
|
+
- spec/spec_helper.rb
|
|
58
|
+
- spec/ua-utils/user_agent_spec.rb
|
|
59
|
+
- LICENSE
|
|
60
|
+
- README.md
|
|
61
|
+
homepage: https://github.com/HaraldWalker/ua-utils
|
|
62
|
+
licenses: []
|
|
63
|
+
post_install_message:
|
|
64
|
+
rdoc_options: []
|
|
65
|
+
require_paths:
|
|
66
|
+
- lib
|
|
67
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
68
|
+
none: false
|
|
69
|
+
requirements:
|
|
70
|
+
- - ! '>='
|
|
71
|
+
- !ruby/object:Gem::Version
|
|
72
|
+
version: '1.9'
|
|
73
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
74
|
+
none: false
|
|
75
|
+
requirements:
|
|
76
|
+
- - ! '>='
|
|
77
|
+
- !ruby/object:Gem::Version
|
|
78
|
+
version: '0'
|
|
79
|
+
requirements: []
|
|
80
|
+
rubyforge_project:
|
|
81
|
+
rubygems_version: 1.8.24
|
|
82
|
+
signing_key:
|
|
83
|
+
specification_version: 3
|
|
84
|
+
summary: Utility for parsing and handling user-agent strings.
|
|
85
|
+
test_files:
|
|
86
|
+
- spec/spec_helper.rb
|
|
87
|
+
- spec/ua-utils/user_agent_spec.rb
|
|
88
|
+
has_rdoc:
|