user_agent_decoder 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +15 -0
  2. data/lib/user_agent_decoder.rb +118 -0
  3. 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: []