user_agent_decoder 0.0.2
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 +15 -0
- data/lib/user_agent_decoder.rb +118 -0
- metadata +45 -0
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
ZjNhMGNmMGZkNWI2YTY5OWM5YjU1NGYxYzc4OWM3NjY2YzdjNzMzMw==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
ZDIwYWRmN2FiZTAxOThlM2ZlOTZhM2FlYTAwOTgxOGYwNDU2ZjFlMQ==
|
7
|
+
SHA512:
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
MDUxYTI3ZDIzYWUzNjQ1ZTZjNGRkMjBjNjA0NTUwMGY5ZTNlMzk0MDI1ZDc5
|
10
|
+
MGU3ZGRjZTJiYjU4ODk1YjdmZDljYTRhZGJhYjlkY2E3MzY0N2FkZjFhYzM4
|
11
|
+
ZWY4NzAwYmUyODcyNGU0NzgwYzMyNjdmMzg4MjI2OWMxODBmYjM=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
MWQxM2ZjMGQ0ZWI5MzgyZWI3MjBhYjAzYjIwNTc2NDQwZWZlNDc3NDU3OTlk
|
14
|
+
Yzc2NjAyZTM4OWI0ODU1Y2U5ZTI5MDI5NDEzY2FiYmFjMjc3ZWRjYWRkYzM5
|
15
|
+
ZDFmMzRiNmNmZGI4NTdiZjFmMTg4NDEzZmIyYTkzNzJkZjYzZWQ=
|
@@ -0,0 +1,118 @@
|
|
1
|
+
class UserAgentDecoder
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
attr_reader :result
|
5
|
+
attr_writer :user_agent_string
|
6
|
+
|
7
|
+
def initialize user_agent_string = nil
|
8
|
+
load_rules
|
9
|
+
|
10
|
+
@result = {
|
11
|
+
os: {
|
12
|
+
token: '',
|
13
|
+
name: '',
|
14
|
+
version: '',
|
15
|
+
version_name: ''
|
16
|
+
},
|
17
|
+
browser: {
|
18
|
+
name: '',
|
19
|
+
version: ''
|
20
|
+
}
|
21
|
+
}
|
22
|
+
|
23
|
+
if user_agent_string && user_agent_string.strip != ''
|
24
|
+
@user_agent_string = user_agent_string
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def parse
|
29
|
+
find_os
|
30
|
+
find_os_version_name
|
31
|
+
find_browser
|
32
|
+
|
33
|
+
@result
|
34
|
+
end
|
35
|
+
|
36
|
+
def find_os
|
37
|
+
catch :found_os do
|
38
|
+
@rules['os'].each do | token, os |
|
39
|
+
os['regex'].each do | regex |
|
40
|
+
|
41
|
+
matches = Regexp.new(regex, 'i').match @user_agent_string
|
42
|
+
|
43
|
+
if matches
|
44
|
+
@result[:os][:token] = token
|
45
|
+
@result[:os][:name] = os['name']
|
46
|
+
|
47
|
+
if matches[1]
|
48
|
+
@result[:os][:version] = matches[1].gsub '_', '.'
|
49
|
+
end
|
50
|
+
|
51
|
+
throw :found_os
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def find_os_version_name
|
59
|
+
catch :found_os_version_name do
|
60
|
+
version_names = @rules['os_version_names'][@result[:os][:token]]
|
61
|
+
|
62
|
+
if version_names
|
63
|
+
version_names.each do | version_name |
|
64
|
+
if Regexp.new("^#{version_name['version']}").match @result[:os][:version]
|
65
|
+
@result[:os][:version_name] = version_name['name']
|
66
|
+
|
67
|
+
throw :found_os_version_name
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def find_browser
|
75
|
+
catch :found_browser do
|
76
|
+
if @result[:os][:token] && @result[:os][:token].strip != ''
|
77
|
+
browsers = @rules['os_browsers'][@result[:os][:token]].each do | browser |
|
78
|
+
@rules['browsers'][browser]['regex'].each do | regex |
|
79
|
+
matches = Regexp.new(regex, 'i').match @user_agent_string
|
80
|
+
|
81
|
+
if matches
|
82
|
+
@result[:browser][:name] = @rules['browsers'][browser]['name']
|
83
|
+
|
84
|
+
if matches[1]
|
85
|
+
@result[:browser][:version] = matches[1].gsub '_', '.'
|
86
|
+
end
|
87
|
+
|
88
|
+
throw :found_browser
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def load_rules
|
97
|
+
@rules = YAML.load_file "lib/user_agent_rules.yml"
|
98
|
+
|
99
|
+
# Add fallbacks
|
100
|
+
# OS fallback
|
101
|
+
@rules['os']['fallback'] = { 'name' => 'Unknown OS', 'regex' => [''] }
|
102
|
+
|
103
|
+
# Browser fallback
|
104
|
+
@rules['browsers']['fallback'] = { 'name' => 'Unknown Browser', 'regex' => [''] }
|
105
|
+
|
106
|
+
# Fallback broswser to every os_browser combinations
|
107
|
+
@rules['os_browsers'].each do | os, browsers |
|
108
|
+
@rules['os_browsers'][os] << 'fallback'
|
109
|
+
end
|
110
|
+
|
111
|
+
# Add all browsers to the fallback os
|
112
|
+
@rules['os_browsers']['fallback'] = []
|
113
|
+
|
114
|
+
@rules['browsers'].each do | browser, info |
|
115
|
+
@rules['os_browsers']['fallback'] << browser
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
metadata
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: user_agent_decoder
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Matt Bearman
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-07-02 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Accurately parse User Agent strings using simple, cascading rules - devloped
|
14
|
+
for and by BugMuncher
|
15
|
+
email: info@bugmuncher.com
|
16
|
+
executables: []
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- lib/user_agent_decoder.rb
|
21
|
+
homepage: http://rubygems.org/gems/user_agent_decoder
|
22
|
+
licenses:
|
23
|
+
- MIT
|
24
|
+
metadata: {}
|
25
|
+
post_install_message:
|
26
|
+
rdoc_options: []
|
27
|
+
require_paths:
|
28
|
+
- lib
|
29
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ! '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
35
|
+
requirements:
|
36
|
+
- - ! '>='
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: '0'
|
39
|
+
requirements: []
|
40
|
+
rubyforge_project:
|
41
|
+
rubygems_version: 2.2.0
|
42
|
+
signing_key:
|
43
|
+
specification_version: 4
|
44
|
+
summary: User Agent Decoder
|
45
|
+
test_files: []
|