browserino 2.5.2 → 2.5.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +9 -1
- data/README.md +8 -12
- data/bin/console +4 -5
- data/lib/browserino/agent.rb +29 -53
- data/lib/browserino/alias.rb +8 -16
- data/lib/browserino/browser.rb +16 -1
- data/lib/browserino/engine.rb +4 -2
- data/lib/browserino/integrate/action_controller.rb +1 -1
- data/lib/browserino/operating_system.rb +6 -4
- data/lib/browserino/patterns.rb +1 -1
- data/lib/browserino/version.rb +1 -1
- data/lib/browserino.rb +15 -27
- 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: 3625bb25aba01e627a8bd14d19971350f039c2f2
|
4
|
+
data.tar.gz: 15d14f30031beec4d0ae944b38a37600c19d57e9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7bded8f6898e7a644bb021d78716cdf26becec40c6171887ef2ae55bd9da8898b65773636604f958cf3c559f57c9513b92ff19c59bbc2d302eba8b4cd6ea4df5
|
7
|
+
data.tar.gz: 844f0b75b0ebbdaaeee98e6bff3aa9e09bd2634789d3fc266b942c28bf0435fcd23f29c1d684420942e576a1e3f06c3783f3568bbd0bd50335ce09ab77071f68
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,14 @@
|
|
1
1
|
## CHANGELOG
|
2
2
|
_dates are in dd-mm-yyyy format_
|
3
3
|
|
4
|
+
#### 12-01-2016 VERSION 2.5.0
|
5
|
+
|
6
|
+
- Added support for the Vivaldi browser
|
7
|
+
- New method `#vivaldi?`
|
8
|
+
- Added support for the bsd family of operating systems
|
9
|
+
- New method `#bsd?`
|
10
|
+
- Fixed using symbols for system version identification (e.g. `:vista` or `:el_capitan`) without a version number
|
11
|
+
|
4
12
|
#### 11-01-2016 VERSION 2.4.1(.1)
|
5
13
|
|
6
14
|
- Caching the agent object in Rails
|
@@ -42,7 +50,7 @@ _dates are in dd-mm-yyyy format_
|
|
42
50
|
- Added more tests
|
43
51
|
- Added more browsers to check: *(bolt, opera mini and ucbrowser)*
|
44
52
|
- Added `#known?` method to check if the agent is known
|
45
|
-
- Added a `#ua` method to return the User Agent string as given to `Browserino
|
53
|
+
- Added a `#ua` method to return the User Agent string as given to `Browserino.parse()`
|
46
54
|
- Added `#x64?` and `#x32?` convenience methods to check system architecture
|
47
55
|
- Added `#mobile?` to check wether or not a user agent is mobile
|
48
56
|
- Moved older changelogs to its own [CHANGELOG.md](https://github.com/SidOfc/browserino/blob/master/CHANGELOG.md) file
|
data/README.md
CHANGED
@@ -10,9 +10,13 @@ This gem aims to provide information about the browser that your visitor is usin
|
|
10
10
|
_dates are in dd-mm-yyyy format_
|
11
11
|
_older changes can be found in the [CHANGELOG.md](https://github.com/SidOfc/browserino/blob/master/CHANGELOG.md)_
|
12
12
|
|
13
|
+
#### 19-01-2016 VERSION 2.5.3
|
14
|
+
|
15
|
+
- Minor refactoring of code
|
16
|
+
|
13
17
|
#### 15-01-2016 VERSION 2.5.2
|
14
18
|
|
15
|
-
- **DEPRECATE** Custom return values (passed through `Browserino
|
19
|
+
- **DEPRECATE** Custom return values (passed through `Browserino.parse`) will no longer alter the output of the agent object
|
16
20
|
- Added support for windows phone detection
|
17
21
|
- Added `windows_phone?` method
|
18
22
|
|
@@ -20,14 +24,6 @@ _older changes can be found in the [CHANGELOG.md](https://github.com/SidOfc/brow
|
|
20
24
|
|
21
25
|
- Patched blackberry mapping, this used to be done by model number instead but is now corrected
|
22
26
|
|
23
|
-
#### 12-01-2016 VERSION 2.5.0
|
24
|
-
|
25
|
-
- Added support for the Vivaldi browser
|
26
|
-
- New method `#vivaldi?`
|
27
|
-
- Added support for the bsd family of operating systems
|
28
|
-
- New method `#bsd?`
|
29
|
-
- Fixed using symbols for system version identification (e.g. `:vista` or `:el_capitan`) without a version number
|
30
|
-
|
31
27
|
## Installation
|
32
28
|
|
33
29
|
*supports ruby 1.9.3+*
|
@@ -56,7 +52,7 @@ require 'browserino'
|
|
56
52
|
Afterwards you can simply call
|
57
53
|
|
58
54
|
```ruby
|
59
|
-
Browserino
|
55
|
+
Browserino.parse('<user agent>')
|
60
56
|
```
|
61
57
|
|
62
58
|
Or if you're using Rails *(>= 3.2.0)*, in your controllers you'll have access to an `agent` object
|
@@ -71,13 +67,13 @@ end
|
|
71
67
|
|
72
68
|
The return value will always be `nil` if a value isn't found
|
73
69
|
|
74
|
-
`Browserino
|
70
|
+
`Browserino.parse()` will return a `Browserino::Agent` object containing all the information parsed out of the supplied user agent.
|
75
71
|
On this object there are a few method calls you can do to retrieve information.
|
76
72
|
|
77
73
|
```ruby
|
78
74
|
require 'browserino'
|
79
75
|
|
80
|
-
agent = Browserino
|
76
|
+
agent = Browserino.parse('user-agent')
|
81
77
|
|
82
78
|
agent.browser_name
|
83
79
|
# => 'safari'
|
data/bin/console
CHANGED
@@ -3,13 +3,12 @@
|
|
3
3
|
require "bundler/setup"
|
4
4
|
require "browserino"
|
5
5
|
require "pry"
|
6
|
-
ua = 'Mozilla/5.0 (
|
7
|
-
@agent = Browserino
|
6
|
+
ua = 'Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0)'
|
7
|
+
@agent = Browserino.parse(ua)
|
8
8
|
|
9
9
|
puts "> @agent variable available parsed with: '#{ua}'\n\n"
|
10
10
|
puts "> You can create a fresh object by using\n"
|
11
|
-
puts "> Browserino
|
12
|
-
puts "> ua
|
13
|
-
puts "> unknown_alt - A default value for unknown properties, default nil (recommended)\n\n"
|
11
|
+
puts "> Browserino.parse([string] ua)\n\n"
|
12
|
+
puts "> ua - The user agent you'd actually want to parse as a string"
|
14
13
|
|
15
14
|
Pry.start
|
data/lib/browserino/agent.rb
CHANGED
@@ -1,14 +1,17 @@
|
|
1
1
|
module Browserino
|
2
2
|
class Agent
|
3
|
-
def initialize(ua
|
3
|
+
def initialize(ua)
|
4
4
|
@ua = ua
|
5
5
|
@not = false
|
6
6
|
|
7
|
-
cleansed_ua = Browserino
|
8
|
-
|
7
|
+
cleansed_ua = Browserino.strip_lies(@ua)
|
8
|
+
pat_name = Browser::name(cleansed_ua)
|
9
|
+
name = pat_name.to_s.downcase.gsub(/_/, ' ')
|
10
|
+
name = nil if name == ''
|
11
|
+
|
9
12
|
info = {
|
10
13
|
browser_name: name,
|
11
|
-
browser_version: Browser::version(cleansed_ua, PATTERNS[:browser][
|
14
|
+
browser_version: Browser::version(cleansed_ua, PATTERNS[:browser][pat_name]),
|
12
15
|
engine_name: Engine::name(cleansed_ua),
|
13
16
|
engine_version: Engine::version(cleansed_ua),
|
14
17
|
system_name: OperatingSystem::name(cleansed_ua),
|
@@ -18,73 +21,58 @@ module Browserino
|
|
18
21
|
bot_name: nil
|
19
22
|
}
|
20
23
|
|
21
|
-
if Browserino::PATTERNS[:bot].include?
|
22
|
-
info.merge!(
|
24
|
+
if Browserino::PATTERNS[:bot].include? pat_name
|
25
|
+
info.merge!(browser_name: nil,
|
26
|
+
browser_version: nil,
|
27
|
+
bot_name: name)
|
23
28
|
end
|
24
29
|
|
25
|
-
@info = Browserino
|
30
|
+
@info = Browserino.check_for_aliases(info)
|
26
31
|
end
|
27
32
|
|
28
33
|
def browser_name
|
29
|
-
|
30
|
-
v.to_s.downcase.gsub(/_/, ' ')
|
31
|
-
end
|
34
|
+
@info[:browser_name]
|
32
35
|
end
|
33
36
|
|
34
37
|
def browser_version(opts = {})
|
35
38
|
if ie? && engine_version && !opts[:compat]
|
36
39
|
(engine_version.to_f + 4.0).to_s
|
37
40
|
else
|
38
|
-
|
39
|
-
v.to_s.downcase.gsub('_', '.')
|
40
|
-
end
|
41
|
+
@info[:browser_version]
|
41
42
|
end
|
42
43
|
end
|
43
44
|
|
44
45
|
def engine_name
|
45
|
-
|
46
|
-
v.to_s.downcase
|
47
|
-
end
|
46
|
+
@info[:engine_name]
|
48
47
|
end
|
49
48
|
|
50
49
|
def engine_version
|
51
|
-
|
52
|
-
v.to_s.downcase.gsub('_', '.')
|
53
|
-
end
|
50
|
+
@info[:engine_version]
|
54
51
|
end
|
55
52
|
|
56
53
|
def system_name(opts = {})
|
57
54
|
opts = {full: false}.merge(opts)
|
58
|
-
name = with_valid(@info[:system_name]) do |v|
|
59
|
-
v.to_s.downcase
|
60
|
-
end
|
61
55
|
if opts[:full]
|
62
|
-
[
|
56
|
+
[@info[:system_name], fetch_system_version_name(@info[:system_name])]
|
63
57
|
else
|
64
|
-
|
58
|
+
@info[:system_name]
|
65
59
|
end
|
66
60
|
end
|
67
61
|
|
68
62
|
def system_version
|
69
|
-
|
70
|
-
v.to_s.downcase.gsub('_', '.')
|
71
|
-
end
|
63
|
+
@info[:system_version]
|
72
64
|
end
|
73
65
|
|
74
66
|
def system_architecture
|
75
|
-
|
76
|
-
v.to_s.downcase
|
77
|
-
end
|
67
|
+
@info[:system_architecture]
|
78
68
|
end
|
79
69
|
|
80
70
|
def locale
|
81
|
-
|
71
|
+
@info[:locale]
|
82
72
|
end
|
83
73
|
|
84
74
|
def bot_name
|
85
|
-
|
86
|
-
v.to_s.downcase.gsub(/_/, ' ')
|
87
|
-
end
|
75
|
+
@info[:bot_name]
|
88
76
|
end
|
89
77
|
|
90
78
|
def ua
|
@@ -96,7 +84,7 @@ module Browserino
|
|
96
84
|
end
|
97
85
|
|
98
86
|
def known?
|
99
|
-
allow_inverted_return (browser_name
|
87
|
+
allow_inverted_return (!browser_name.nil? || !bot_name.nil?)
|
100
88
|
end
|
101
89
|
|
102
90
|
def mobile?
|
@@ -131,12 +119,11 @@ module Browserino
|
|
131
119
|
|
132
120
|
def method_missing(method_sym, *args, &block)
|
133
121
|
name = method_sym.to_s.gsub('?', '')
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
allow_inverted_return res
|
122
|
+
allow_inverted_return case agent_or_system?(method_sym)
|
123
|
+
when :system then correct_system?(name, *args)
|
124
|
+
when :agent then correct_agent?(name, *args)
|
125
|
+
else super
|
126
|
+
end
|
140
127
|
end
|
141
128
|
|
142
129
|
def respond_to?(method_sym)
|
@@ -229,20 +216,9 @@ module Browserino
|
|
229
216
|
end
|
230
217
|
end
|
231
218
|
|
232
|
-
def with_valid(val)
|
233
|
-
if val && (val != '' || val != false) && block_given?
|
234
|
-
res = yield(val)
|
235
|
-
return Browserino::UNKNOWN if res == ''
|
236
|
-
res
|
237
|
-
else
|
238
|
-
Browserino::UNKNOWN
|
239
|
-
end
|
240
|
-
end
|
241
|
-
|
242
219
|
def fetch_system_version_name(name)
|
243
220
|
return Browserino::UNKNOWN if name.nil? || name == '' || !name
|
244
|
-
const = name.upcase.gsub(/\s/, '_')
|
245
|
-
name.downcase!
|
221
|
+
const = name.dup.upcase.gsub(/\s/, '_')
|
246
222
|
version = if system_version == Browserino::UNKNOWN
|
247
223
|
nil
|
248
224
|
elsif name.match(/mac|ios|blackberry/i)
|
data/lib/browserino/alias.rb
CHANGED
@@ -1,23 +1,15 @@
|
|
1
1
|
module Browserino
|
2
2
|
ALIAS = {
|
3
|
-
browser_name: {
|
4
|
-
|
5
|
-
},
|
6
|
-
browser_version: {},
|
7
|
-
engine_name: {
|
8
|
-
'webkit' => ['applewebkit']
|
9
|
-
},
|
10
|
-
engine_version: {},
|
3
|
+
browser_name: { 'ie' => /msie/ },
|
4
|
+
engine_name: { 'webkit' => /applewebkit/ },
|
11
5
|
system_name: {
|
12
|
-
'linux' =>
|
13
|
-
'windows_phone' =>
|
6
|
+
'linux' => /ubuntu|x11/,
|
7
|
+
'windows_phone' => /windows\sphone/,
|
8
|
+
'ios' => /ip(?:[ao]d|hone)/
|
14
9
|
},
|
15
|
-
system_version: {},
|
16
10
|
system_architecture: {
|
17
|
-
'x64' =>
|
18
|
-
'x32' => [
|
19
|
-
}
|
20
|
-
bot_name: {},
|
21
|
-
locale: {}
|
11
|
+
'x64' => /(?:x86_|amd|wow)?64/,
|
12
|
+
'x32' => /(?:(?:x86_)?32|i[36]8[36])/
|
13
|
+
}
|
22
14
|
}
|
23
15
|
end
|
data/lib/browserino/browser.rb
CHANGED
@@ -1,8 +1,23 @@
|
|
1
1
|
module Browserino
|
2
2
|
module Browser
|
3
|
+
def self.name(ua)
|
4
|
+
name = nil
|
5
|
+
patterns = PATTERNS[:browser].merge(PATTERNS[:bot])
|
6
|
+
agents = patterns.keys
|
7
|
+
|
8
|
+
until agents.empty? || !name.nil?
|
9
|
+
tmp = agents.shift
|
10
|
+
name = tmp if (ua.match(patterns[tmp][:name]))
|
11
|
+
end
|
12
|
+
|
13
|
+
name
|
14
|
+
end
|
15
|
+
|
3
16
|
def self.version(ua, patterns)
|
4
17
|
if patterns
|
5
|
-
Browserino::extract_match(ua.match(patterns[:version]), :version)
|
18
|
+
Browserino::extract_match(ua.match(patterns[:version]), :version) do |v|
|
19
|
+
v.gsub('_', '.')
|
20
|
+
end
|
6
21
|
else
|
7
22
|
UNKNOWN
|
8
23
|
end
|
data/lib/browserino/engine.rb
CHANGED
@@ -1,11 +1,13 @@
|
|
1
1
|
module Browserino
|
2
2
|
module Engine
|
3
3
|
def self.name(ua)
|
4
|
-
Browserino::extract_match(ua.match(PATTERNS[:engine][:name]), :name)
|
4
|
+
Browserino::extract_match(ua.match(PATTERNS[:engine][:name]), :name)
|
5
5
|
end
|
6
6
|
|
7
7
|
def self.version(ua)
|
8
|
-
Browserino::extract_match(ua.match(PATTERNS[:engine][:version]), :version)
|
8
|
+
Browserino::extract_match(ua.match(PATTERNS[:engine][:version]), :version) do |v|
|
9
|
+
v.gsub('_', '.')
|
10
|
+
end
|
9
11
|
end
|
10
12
|
end
|
11
13
|
end
|
@@ -1,19 +1,21 @@
|
|
1
1
|
module Browserino
|
2
2
|
module OperatingSystem
|
3
3
|
def self.name(ua)
|
4
|
-
Browserino::extract_match(ua.match(PATTERNS[:operating_system][:name]), :name)
|
4
|
+
Browserino::extract_match(ua.match(PATTERNS[:operating_system][:name]), :name)
|
5
5
|
end
|
6
6
|
|
7
7
|
def self.version(ua)
|
8
|
-
Browserino::extract_match(ua.match(PATTERNS[:operating_system][:version]), :version)
|
8
|
+
Browserino::extract_match(ua.match(PATTERNS[:operating_system][:version]), :version) do |v|
|
9
|
+
v.gsub('_', '.')
|
10
|
+
end
|
9
11
|
end
|
10
12
|
|
11
13
|
def self.architecture(ua)
|
12
|
-
Browserino::extract_match(ua.match(PATTERNS[:operating_system][:architecture]), :architecture)
|
14
|
+
Browserino::extract_match(ua.match(PATTERNS[:operating_system][:architecture]), :architecture)
|
13
15
|
end
|
14
16
|
|
15
17
|
def self.locale(ua)
|
16
|
-
Browserino::extract_match(ua.match(PATTERNS[:operating_system][:locale]), :locale)
|
18
|
+
Browserino::extract_match(ua.match(PATTERNS[:operating_system][:locale]), :locale)
|
17
19
|
end
|
18
20
|
end
|
19
21
|
end
|
data/lib/browserino/patterns.rb
CHANGED
@@ -84,7 +84,7 @@ module Browserino
|
|
84
84
|
},
|
85
85
|
|
86
86
|
operating_system: {
|
87
|
-
name: /(?<name>windows(?:\sphone(?:\sos)?)?|macintosh|android|
|
87
|
+
name: /(?<name>windows(?:\sphone(?:\sos)?)?|macintosh|android|ip(?:[ao]d|hone)|blackberry|linux|ubuntu|x11|bsd)/i,
|
88
88
|
version: /(?:windows(?:\sphone(?:\sos)?)?|nt|mac\sos\sx|android|(cpu\s|i)os|blackberry.*?version\/|bb)\s?(?<version>[\d\._]+)/i,
|
89
89
|
architecture: /(?<architecture>((?:x|x86_|amd|wow)64)|i(3|6)86)/i,
|
90
90
|
mobile: /bolt|nokia|samsung|mobi(?:le)?|android|i?p(?:[ao]d|hone)|bb\d+|blackberry|iemobile|fennec|bada|meego|vodafone|t\-mobile|opera\sm(?:ob|in)i/i,
|
data/lib/browserino/version.rb
CHANGED
data/lib/browserino.rb
CHANGED
@@ -24,20 +24,15 @@ require "browserino/operating_system"
|
|
24
24
|
# require_relative "../spec/user_agents_browsers"
|
25
25
|
|
26
26
|
module Browserino
|
27
|
-
def self.parse(ua,
|
28
|
-
|
29
|
-
puts "The feature for using a custom return value is deprecated and will be removed in a future release. For now, your value will be ignored and nil will be the return value for unknown properties."
|
30
|
-
end
|
31
|
-
Agent.new(ua, UNKNOWN)
|
27
|
+
def self.parse(ua, _ = nil) # _ = nil maintains backwards compatibility
|
28
|
+
Agent.new ua
|
32
29
|
end
|
33
30
|
|
34
31
|
private
|
35
32
|
|
36
33
|
def self.strip_lies(ua)
|
37
|
-
#make iphone / ipad / ipod consistent
|
38
|
-
ua = ua.gsub(/ip((a|o)d|hone)/i, 'ios')
|
39
34
|
ua = ua.gsub(/(Mozilla\/[\d\.]+)/i, '')
|
40
|
-
ua = ua.gsub(/9\.80
|
35
|
+
ua = ua.gsub(/9\.80/, '') if /opera/i =~ ua
|
41
36
|
ua = ua.gsub(/(?:apple)?webkit\/[\d\.]+/i, '') if /presto/i =~ ua
|
42
37
|
ua = ua.gsub(/(?:ms)?ie/i, '') if /rv\:/i =~ ua
|
43
38
|
ua = ua.gsub(/linux/i, '') if /android/i =~ ua
|
@@ -46,29 +41,22 @@ module Browserino
|
|
46
41
|
ua
|
47
42
|
end
|
48
43
|
|
49
|
-
def self.check_for_aliases(
|
50
|
-
|
51
|
-
|
52
|
-
memo[kv.first] = ls
|
53
|
-
memo
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
def self.agent_id(ua)
|
58
|
-
name = nil
|
59
|
-
patterns = PATTERNS[:browser].merge(PATTERNS[:bot])
|
60
|
-
browsers = patterns.keys
|
61
|
-
until browsers.empty? || !name.nil?
|
62
|
-
tmp = browsers.shift
|
63
|
-
name = tmp if (ua.match(patterns[tmp][:name]))
|
44
|
+
def self.check_for_aliases(h)
|
45
|
+
ALIAS.each do |k, v|
|
46
|
+
h[k] = v.select { |n, re| n if h[k] =~ re }.keys.first || h[k]
|
64
47
|
end
|
65
|
-
|
48
|
+
h
|
66
49
|
end
|
67
50
|
|
68
|
-
def self.extract_match(match, sym
|
51
|
+
def self.extract_match(match, sym)
|
69
52
|
if match && match.names.include?(sym.to_s)
|
70
|
-
match[sym].strip
|
71
|
-
|
53
|
+
m = match[sym].to_s.downcase.strip
|
54
|
+
m = yield(m) if block_given?
|
55
|
+
if m && m.strip != ''
|
56
|
+
m
|
57
|
+
else
|
58
|
+
UNKNOWN
|
59
|
+
end
|
72
60
|
else
|
73
61
|
UNKNOWN
|
74
62
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: browserino
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.5.
|
4
|
+
version: 2.5.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sidney Liebrand
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-01-
|
11
|
+
date: 2016-01-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|