Class: UserAgentDecoder

Inherits:
Object
  • Object
show all
Defined in:
lib/user_agent_decoder.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(user_agent_string = nil) ⇒ UserAgentDecoder

Returns a new instance of UserAgentDecoder.



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/user_agent_decoder.rb', line 7

def initialize user_agent_string = nil
	load_rules

	@result = {
		os: {
			token: '',
			name: '',
			version: '',
			version_name: ''
		},
		browser: {
			name: '',
			version: ''
		}
	}

	if user_agent_string && user_agent_string.strip != ''
		@user_agent_string = user_agent_string
	end
end

Instance Attribute Details

#resultObject (readonly)

Returns the value of attribute result.



4
5
6
# File 'lib/user_agent_decoder.rb', line 4

def result
  @result
end

#user_agent_string=(value) ⇒ Object (writeonly)

Sets the attribute user_agent_string

Parameters:

  • value

    the value to set the attribute user_agent_string to.



5
6
7
# File 'lib/user_agent_decoder.rb', line 5

def user_agent_string=(value)
  @user_agent_string = value
end

Instance Method Details

#find_browserObject



74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/user_agent_decoder.rb', line 74

def find_browser
	catch :found_browser do
		if @result[:os][:token] && @result[:os][:token].strip != ''
			browsers = @rules['os_browsers'][@result[:os][:token]].each do | browser |
				@rules['browsers'][browser]['regex'].each do | regex |
					matches = Regexp.new(regex, 'i').match @user_agent_string

					if matches
						@result[:browser][:name] = @rules['browsers'][browser]['name']
						
						if matches[1]
							@result[:browser][:version] = matches[1].gsub '_', '.'
						end

						throw :found_browser
					end
				end
			end
		end
	end
end

#find_osObject



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/user_agent_decoder.rb', line 36

def find_os
	catch :found_os do
		@rules['os'].each do | token, os |
			os['regex'].each do | regex |

				matches = Regexp.new(regex, 'i').match @user_agent_string

				if matches
					@result[:os][:token] = token
					@result[:os][:name] = os['name']
					
					if matches[1]
						@result[:os][:version] = matches[1].gsub '_', '.'
					end

					throw :found_os
				end
			end
		end
	end
end

#find_os_version_nameObject



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/user_agent_decoder.rb', line 58

def find_os_version_name
	catch :found_os_version_name do
		version_names = @rules['os_version_names'][@result[:os][:token]]
		
		if version_names 
			version_names.each do | version_name |
				if Regexp.new("^#{version_name['version']}").match @result[:os][:version]
					@result[:os][:version_name] = version_name['name']

					throw :found_os_version_name
				end
			end
		end
	end
end

#load_rulesObject



96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# File 'lib/user_agent_decoder.rb', line 96

def load_rules
   @rules = YAML.load_file(File.join(File.dirname(File.expand_path(__FILE__)), 'user_agent_rules.yml'))

   # Add fallbacks
   # OS fallback
   @rules['os']['fallback'] = { 'name' => 'Unknown OS', 'regex' => [''] }
   
   # Browser fallback
   @rules['browsers']['fallback'] = { 'name' => 'Unknown Browser', 'regex' => [''] }

   # Fallback broswser to every os_browser combinations
   @rules['os_browsers'].each do | os, browsers |
      @rules['os_browsers'][os] << 'fallback'
   end

   # Add all browsers to the fallback os
   @rules['os_browsers']['fallback'] = []

   @rules['browsers'].each do | browser, info |
     @rules['os_browsers']['fallback'] << browser
   end
end

#parseObject



28
29
30
31
32
33
34
# File 'lib/user_agent_decoder.rb', line 28

def parse
	find_os
	find_os_version_name
	find_browser

	@result
end