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.
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: []