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