useragent_parser 0.1.1 → 0.2.0
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.
- data/config/regexes.yaml +72 -2
 - data/lib/useragent_parser/parsers/referrer_parser.rb +34 -0
 - data/lib/useragent_parser/user_agent.rb +104 -0
 - data/lib/useragent_parser/version.rb +1 -1
 - data/lib/useragent_parser.rb +39 -2
 - data/spec/fixtures/pgts_browser_list.yaml +18 -18
 - data/spec/fixtures/test_referrers.yaml +40 -0
 - data/spec/fixtures/test_user_agent_parser.yaml +7 -7
 - data/spec/fixtures/test_user_agent_parser_email.yaml +2189 -0
 - data/spec/parsers/referrer_parser_spec.rb +12 -0
 - data/spec/parsers/useragent_parser_spec.rb +14 -0
 - data/spec/user_agent_spec.rb +106 -0
 - data/spec/useragent_parser_spec.rb +3 -3
 - metadata +9 -2
 
    
        data/config/regexes.yaml
    CHANGED
    
    | 
         @@ -79,8 +79,31 @@ user_agent_parsers: 
     | 
|
| 
       79 
79 
     | 
    
         | 
| 
       80 
80 
     | 
    
         
             
              # Lightning (for Thunderbird)
         
     | 
| 
       81 
81 
     | 
    
         
             
              # http://www.mozilla.org/projects/calendar/lightning/
         
     | 
| 
      
 82 
     | 
    
         
            +
              - regex: 'Lightning/\d+\.\d+[ab]?\d+[a-z]* (Thunderbird)/(\d+)\.(\d+)\.?(\d+)?'
         
     | 
| 
      
 83 
     | 
    
         
            +
             
     | 
| 
       82 
84 
     | 
    
         
             
              - regex: '(Lightning)/(\d+)\.(\d+)([ab]?\d+[a-z]*)'
         
     | 
| 
       83 
85 
     | 
    
         | 
| 
      
 86 
     | 
    
         
            +
              # Eudora
         
     | 
| 
      
 87 
     | 
    
         
            +
              - regex: '(Eudora)/(\d+)\.(\d+)\.?(\d+)?'
         
     | 
| 
      
 88 
     | 
    
         
            +
             
     | 
| 
      
 89 
     | 
    
         
            +
              - regex: '(EUDORA)'
         
     | 
| 
      
 90 
     | 
    
         
            +
                family_replacement: 'Eudora'
         
     | 
| 
      
 91 
     | 
    
         
            +
             
     | 
| 
      
 92 
     | 
    
         
            +
              # T-Online E-Mail
         
     | 
| 
      
 93 
     | 
    
         
            +
              - regex: '(T-Online eMail) (\d+)\.(\d+)?'
         
     | 
| 
      
 94 
     | 
    
         
            +
             
     | 
| 
      
 95 
     | 
    
         
            +
              # Apple Mail
         
     | 
| 
      
 96 
     | 
    
         
            +
              - regex: '(Mail)/\d+.*Darwin/10\.5'
         
     | 
| 
      
 97 
     | 
    
         
            +
                family_replacement: 'Apple Mail'
         
     | 
| 
      
 98 
     | 
    
         
            +
                v1_replacement: '3'
         
     | 
| 
      
 99 
     | 
    
         
            +
             
     | 
| 
      
 100 
     | 
    
         
            +
              # Sparrow
         
     | 
| 
      
 101 
     | 
    
         
            +
              - regex: '(Sparrow)/\d+'
         
     | 
| 
      
 102 
     | 
    
         
            +
                family_replacement: 'Sparrow'
         
     | 
| 
      
 103 
     | 
    
         
            +
             
     | 
| 
      
 104 
     | 
    
         
            +
              # Lotus Notes
         
     | 
| 
      
 105 
     | 
    
         
            +
              - regex: '(Lotus-Notes)/(\d+)\.(\d+)'
         
     | 
| 
      
 106 
     | 
    
         
            +
                family_replacement: 'Lotus Notes'
         
     | 
| 
       84 
107 
     | 
    
         
             
              # Swiftfox
         
     | 
| 
       85 
108 
     | 
    
         
             
              - regex: '(Firefox)/(\d+)\.(\d+)\.(\d+(?:pre)?) \(Swiftfox\)'
         
     | 
| 
       86 
109 
     | 
    
         
             
                family_replacement: 'Swiftfox'
         
     | 
| 
         @@ -153,21 +176,29 @@ user_agent_parsers: 
     | 
|
| 
       153 
176 
     | 
    
         
             
              - regex: '(Twitterbot)/(\d+)\.(\d+)'
         
     | 
| 
       154 
177 
     | 
    
         
             
                family_replacement: 'TwitterBot'
         
     | 
| 
       155 
178 
     | 
    
         | 
| 
      
 179 
     | 
    
         
            +
              # Windows Live Mail / Outlook Express
         
     | 
| 
      
 180 
     | 
    
         
            +
              - regex: '(Outlook-Express)/(\d+)\.(\d+)'
         
     | 
| 
      
 181 
     | 
    
         
            +
                family_replacement: 'Windows Live Mail'
         
     | 
| 
      
 182 
     | 
    
         
            +
             
     | 
| 
       156 
183 
     | 
    
         
             
              #### END SPECIAL CASES TOP ####
         
     | 
| 
       157 
184 
     | 
    
         | 
| 
       158 
185 
     | 
    
         
             
              #### MAIN CASES - this catches > 50% of all browsers ####
         
     | 
| 
       159 
186 
     | 
    
         | 
| 
       160 
187 
     | 
    
         
             
              # Browser/major_version.minor_version.beta_version
         
     | 
| 
       161 
     | 
    
         
            -
              - regex: '(AdobeAIR|Chromium|FireWeb|Jasmine|ANTGalio|Midori|Fresco|Lobo|PaleMoon|Maxthon|Lynx|OmniWeb|Dillo|Camino|Demeter|Fluid|Fennec|Shiira|Sunrise|Chrome|Flock|Netscape|Lunascape|WebPilot|Vodafone|NetFront|Netfront|Konqueror|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|Opera Mini|iCab|NetNewsWire|ThunderBrowse|Iris|UP\.Browser|Bunjaloo|Google Earth|Raven for Mac)/(\d+)\.(\d+)\.(\d+)'
         
     | 
| 
      
 188 
     | 
    
         
            +
              - regex: '(AdobeAIR|Chromium|FireWeb|Jasmine|ANTGalio|Midori|Fresco|Lobo|PaleMoon|Maxthon|Lynx|OmniWeb|Dillo|Camino|Demeter|Fluid|Fennec|Shiira|Sunrise|Chrome|Flock|Netscape|Lunascape|WebPilot|Vodafone|NetFront|Netfront|Konqueror|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|Opera Mini|iCab|NetNewsWire|Thunderbird|ThunderBrowse|Iris|UP\.Browser|Bunjaloo|Google Earth|Raven for Mac)/(\d+)\.(\d+)\.(\d+)'
         
     | 
| 
       162 
189 
     | 
    
         | 
| 
       163 
190 
     | 
    
         
             
              # Browser/major_version.minor_version
         
     | 
| 
       164 
     | 
    
         
            -
              - regex: '(Bolt|Jasmine|IceCat|Skyfire|Midori|Maxthon|Lynx|Arora|IBrowse|Dillo|Camino|Shiira|Fennec|Phoenix|Chrome|Flock|Netscape|Lunascape|Epiphany|WebPilot|Opera Mini|Opera|Vodafone|NetFront|Netfront|Konqueror|Googlebot|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|iCab|NetNewsWire|Space Bison|Stainless|Orca|Dolfin|BOLT|Minimo|Tizen Browser|Polaris|Abrowser)/(\d+)\.(\d+)'
         
     | 
| 
      
 191 
     | 
    
         
            +
              - regex: '(Bolt|Jasmine|IceCat|Skyfire|Midori|Maxthon|Lynx|Arora|IBrowse|Dillo|Camino|Shiira|Fennec|Phoenix|Chrome|Flock|Netscape|Lunascape|Epiphany|WebPilot|Opera Mini|Opera|Vodafone|NetFront|Netfront|Konqueror|Googlebot|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|iCab|NetNewsWire|Space Bison|Stainless|Orca|Dolfin|BOLT|Minimo|Tizen Browser|Polaris|Abrowser|Thunderbird)/(\d+)\.(\d+)'
         
     | 
| 
       165 
192 
     | 
    
         | 
| 
       166 
193 
     | 
    
         
             
              # Browser major_version.minor_version.beta_version (space instead of slash)
         
     | 
| 
       167 
194 
     | 
    
         
             
              - regex: '(iRider|Crazy Browser|SkipStone|iCab|Lunascape|Sleipnir|Maemo Browser) (\d+)\.(\d+)\.(\d+)'
         
     | 
| 
       168 
195 
     | 
    
         
             
              # Browser major_version.minor_version (space instead of slash)
         
     | 
| 
       169 
196 
     | 
    
         
             
              - regex: '(iCab|Lunascape|Opera|Android|Jasmine|Polaris|BREW) (\d+)\.(\d+)\.?(\d+)?'
         
     | 
| 
       170 
197 
     | 
    
         | 
| 
      
 198 
     | 
    
         
            +
              # Microsoft Outlook 2007/2010
         
     | 
| 
      
 199 
     | 
    
         
            +
              - regex: '(MSOffice) (\d+)'
         
     | 
| 
      
 200 
     | 
    
         
            +
                family_replacement: 'Outlook'
         
     | 
| 
      
 201 
     | 
    
         
            +
             
     | 
| 
       171 
202 
     | 
    
         
             
              # weird android UAs
         
     | 
| 
       172 
203 
     | 
    
         
             
              - regex: '(Android) Donut'
         
     | 
| 
       173 
204 
     | 
    
         
             
                v1_replacement: '1'
         
     | 
| 
         @@ -319,6 +350,10 @@ user_agent_parsers: 
     | 
|
| 
       319 
350 
     | 
    
         | 
| 
       320 
351 
     | 
    
         
             
              - regex: '(Nintendo 3DS).* Version/(\d+)\.(\d+)(?:\.(\w+))'
         
     | 
| 
       321 
352 
     | 
    
         | 
| 
      
 353 
     | 
    
         
            +
              # Generic AppleWebKit detection
         
     | 
| 
      
 354 
     | 
    
         
            +
              - regex: '(AppleWebKit)/(\d+)\.?(\d+)?.*\(KHTML, like Gecko\)'
         
     | 
| 
      
 355 
     | 
    
         
            +
                family_replacement: 'Apple WebKit'
         
     | 
| 
      
 356 
     | 
    
         
            +
             
     | 
| 
       322 
357 
     | 
    
         
             
            os_parsers:
         
     | 
| 
       323 
358 
     | 
    
         | 
| 
       324 
359 
     | 
    
         
             
              ##########
         
     | 
| 
         @@ -827,3 +862,38 @@ mobile_os_families: 
     | 
|
| 
       827 
862 
     | 
    
         
             
              - 'Windows Phone 6.5'
         
     | 
| 
       828 
863 
     | 
    
         
             
              - 'Windows CE'
         
     | 
| 
       829 
864 
     | 
    
         
             
              - 'Symbian OS'
         
     | 
| 
      
 865 
     | 
    
         
            +
             
     | 
| 
      
 866 
     | 
    
         
            +
            referrer_parsers:
         
     | 
| 
      
 867 
     | 
    
         
            +
              - regex: '(mail\.live\.com)'
         
     | 
| 
      
 868 
     | 
    
         
            +
                referrer_replacement: 'Hotmail'
         
     | 
| 
      
 869 
     | 
    
         
            +
             
     | 
| 
      
 870 
     | 
    
         
            +
              - regex: '(mail\.yahoo\.com)'
         
     | 
| 
      
 871 
     | 
    
         
            +
                referrer_replacement: 'Yahoo! Mail'
         
     | 
| 
      
 872 
     | 
    
         
            +
             
     | 
| 
      
 873 
     | 
    
         
            +
              - regex: '(email\.freenet\.de)'
         
     | 
| 
      
 874 
     | 
    
         
            +
                referrer_replacement: 'WEB.DE'
         
     | 
| 
      
 875 
     | 
    
         
            +
             
     | 
| 
      
 876 
     | 
    
         
            +
              - regex: '(mail\.aol\.com)'
         
     | 
| 
      
 877 
     | 
    
         
            +
                referrer_replacement: 'AOL Webmail'
         
     | 
| 
      
 878 
     | 
    
         
            +
             
     | 
| 
      
 879 
     | 
    
         
            +
              - regex: '(mail\.google\.com)'
         
     | 
| 
      
 880 
     | 
    
         
            +
                referrer_replacement: 'Gmail'
         
     | 
| 
      
 881 
     | 
    
         
            +
             
     | 
| 
      
 882 
     | 
    
         
            +
              - regex: '(win\.mail\.ru)'
         
     | 
| 
      
 883 
     | 
    
         
            +
                referrer_replacement: 'mail.ru'
         
     | 
| 
      
 884 
     | 
    
         
            +
             
     | 
| 
      
 885 
     | 
    
         
            +
              - regex: '(service\.gmx\.net)'
         
     | 
| 
      
 886 
     | 
    
         
            +
                referrer_replacement: 'GMX'
         
     | 
| 
      
 887 
     | 
    
         
            +
             
     | 
| 
      
 888 
     | 
    
         
            +
              - regex: '(www\.gmxattachments\.net)'
         
     | 
| 
      
 889 
     | 
    
         
            +
                referrer_replacement: 'GMX'
         
     | 
| 
      
 890 
     | 
    
         
            +
             
     | 
| 
      
 891 
     | 
    
         
            +
              - regex: '(proxy[^\.]+\.bluewin\.ch)'
         
     | 
| 
      
 892 
     | 
    
         
            +
                referrer_replacement: 'Swisscom'
         
     | 
| 
      
 893 
     | 
    
         
            +
             
     | 
| 
      
 894 
     | 
    
         
            +
              - regex: '(communicator\.strato\.de)'
         
     | 
| 
      
 895 
     | 
    
         
            +
                referrer_replacement: 'Strato'
         
     | 
| 
      
 896 
     | 
    
         
            +
             
     | 
| 
      
 897 
     | 
    
         
            +
              - regex: '.+'
         
     | 
| 
      
 898 
     | 
    
         
            +
                referrer_replacement: 'Other'
         
     | 
| 
      
 899 
     | 
    
         
            +
             
     | 
| 
         @@ -0,0 +1,34 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # encoding: utf-8
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            module UseragentParser
         
     | 
| 
      
 4 
     | 
    
         
            +
              class ReferrerParser
         
     | 
| 
      
 5 
     | 
    
         
            +
                attr_accessor :pattern, :referrer_re, :referrer_replacement
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
                def initialize(pattern, referrer_replacement = nil)
         
     | 
| 
      
 8 
     | 
    
         
            +
                  @pattern = pattern
         
     | 
| 
      
 9 
     | 
    
         
            +
                  @referrer_re = Regexp.compile(pattern)
         
     | 
| 
      
 10 
     | 
    
         
            +
                  @referrer_replacement = referrer_replacement
         
     | 
| 
      
 11 
     | 
    
         
            +
                end
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                def match_spans(referrer_string)
         
     | 
| 
      
 14 
     | 
    
         
            +
                  match_spans = []
         
     | 
| 
      
 15 
     | 
    
         
            +
                  match = @referrer_re.match(referrer_string)
         
     | 
| 
      
 16 
     | 
    
         
            +
                  if match
         
     | 
| 
      
 17 
     | 
    
         
            +
                    # Return the offsets
         
     | 
| 
      
 18 
     | 
    
         
            +
                  end
         
     | 
| 
      
 19 
     | 
    
         
            +
                end
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
                def parse(referrer_string)
         
     | 
| 
      
 22 
     | 
    
         
            +
                  referrer = nil
         
     | 
| 
      
 23 
     | 
    
         
            +
                  match = @referrer_re.match(referrer_string)
         
     | 
| 
      
 24 
     | 
    
         
            +
                  if match
         
     | 
| 
      
 25 
     | 
    
         
            +
                    if @referrer_replacement
         
     | 
| 
      
 26 
     | 
    
         
            +
                      referrer = @referrer_replacement
         
     | 
| 
      
 27 
     | 
    
         
            +
                    else
         
     | 
| 
      
 28 
     | 
    
         
            +
                      referrer = match[1]
         
     | 
| 
      
 29 
     | 
    
         
            +
                    end
         
     | 
| 
      
 30 
     | 
    
         
            +
                  end
         
     | 
| 
      
 31 
     | 
    
         
            +
                  return referrer
         
     | 
| 
      
 32 
     | 
    
         
            +
                end
         
     | 
| 
      
 33 
     | 
    
         
            +
              end
         
     | 
| 
      
 34 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -2,6 +2,7 @@ module UseragentParser 
     | 
|
| 
       2 
2 
     | 
    
         
             
              class UserAgent
         
     | 
| 
       3 
3 
     | 
    
         
             
                attr_reader :browser, :browser_family, :browser_version, :browser_major_version, :browser_minor_version, :browser_patch_version
         
     | 
| 
       4 
4 
     | 
    
         
             
                attr_reader :os, :os_family, :os_version, :os_major_version, :os_minor_version, :os_patch_version
         
     | 
| 
      
 5 
     | 
    
         
            +
                attr_reader :webmail_client
         
     | 
| 
       5 
6 
     | 
    
         | 
| 
       6 
7 
     | 
    
         
             
                def initialize(details = {})
         
     | 
| 
       7 
8 
     | 
    
         
             
                  if user_agent = details['user_agent']
         
     | 
| 
         @@ -23,6 +24,10 @@ module UseragentParser 
     | 
|
| 
       23 
24 
     | 
    
         
             
                     @is_mobile = device['is_mobile']
         
     | 
| 
       24 
25 
     | 
    
         
             
                     @is_spider = device['is_spider']
         
     | 
| 
       25 
26 
     | 
    
         
             
                   end
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                   if referrer = details['referrer']
         
     | 
| 
      
 29 
     | 
    
         
            +
                    @webmail_client = referrer['family']
         
     | 
| 
      
 30 
     | 
    
         
            +
                  end
         
     | 
| 
       26 
31 
     | 
    
         
             
                end
         
     | 
| 
       27 
32 
     | 
    
         | 
| 
       28 
33 
     | 
    
         
             
                def device
         
     | 
| 
         @@ -53,8 +58,107 @@ module UseragentParser 
     | 
|
| 
       53 
58 
     | 
    
         
             
                  @browser ||= browser_name
         
     | 
| 
       54 
59 
     | 
    
         
             
                end
         
     | 
| 
       55 
60 
     | 
    
         | 
| 
      
 61 
     | 
    
         
            +
                def email
         
     | 
| 
      
 62 
     | 
    
         
            +
                  @email ||= email_name
         
     | 
| 
      
 63 
     | 
    
         
            +
                end
         
     | 
| 
      
 64 
     | 
    
         
            +
             
     | 
| 
      
 65 
     | 
    
         
            +
                def email_version
         
     | 
| 
      
 66 
     | 
    
         
            +
                  @email_version ||= email_version_name
         
     | 
| 
      
 67 
     | 
    
         
            +
                end
         
     | 
| 
      
 68 
     | 
    
         
            +
             
     | 
| 
      
 69 
     | 
    
         
            +
                def is_email?
         
     | 
| 
      
 70 
     | 
    
         
            +
                  is_outlook? || is_ios_mail? || is_apple_mail? || is_desktop_email? || is_webmail?
         
     | 
| 
      
 71 
     | 
    
         
            +
                end
         
     | 
| 
      
 72 
     | 
    
         
            +
             
     | 
| 
       56 
73 
     | 
    
         
             
                protected
         
     | 
| 
       57 
74 
     | 
    
         | 
| 
      
 75 
     | 
    
         
            +
                def is_desktop_email?
         
     | 
| 
      
 76 
     | 
    
         
            +
                  [
         
     | 
| 
      
 77 
     | 
    
         
            +
                    "Thunderbird",
         
     | 
| 
      
 78 
     | 
    
         
            +
                    "T-Online eMail",
         
     | 
| 
      
 79 
     | 
    
         
            +
                    "Eudora",
         
     | 
| 
      
 80 
     | 
    
         
            +
                    "Apple Mail",
         
     | 
| 
      
 81 
     | 
    
         
            +
                    "Sparrow",
         
     | 
| 
      
 82 
     | 
    
         
            +
                    "Lotus Notes",
         
     | 
| 
      
 83 
     | 
    
         
            +
                    "Windows Live Mail",
         
     | 
| 
      
 84 
     | 
    
         
            +
                    "Outlook",
         
     | 
| 
      
 85 
     | 
    
         
            +
                    "AOL"
         
     | 
| 
      
 86 
     | 
    
         
            +
                  ].include? @browser_family
         
     | 
| 
      
 87 
     | 
    
         
            +
                end
         
     | 
| 
      
 88 
     | 
    
         
            +
             
     | 
| 
      
 89 
     | 
    
         
            +
                def is_ios_mail?
         
     | 
| 
      
 90 
     | 
    
         
            +
                  @webmail_client.nil?  && @browser_family == 'Mobile Safari' && @os_family == 'iOS'
         
     | 
| 
      
 91 
     | 
    
         
            +
                end
         
     | 
| 
      
 92 
     | 
    
         
            +
             
     | 
| 
      
 93 
     | 
    
         
            +
                def is_apple_mail?
         
     | 
| 
      
 94 
     | 
    
         
            +
                  @webmail_client.nil? && @browser_family == 'Apple WebKit' && @os_family == 'Mac OS X'
         
     | 
| 
      
 95 
     | 
    
         
            +
                end
         
     | 
| 
      
 96 
     | 
    
         
            +
             
     | 
| 
      
 97 
     | 
    
         
            +
                def is_webmail?
         
     | 
| 
      
 98 
     | 
    
         
            +
                  [
         
     | 
| 
      
 99 
     | 
    
         
            +
                    "Hotmail",
         
     | 
| 
      
 100 
     | 
    
         
            +
                    "Yahoo! Mail",
         
     | 
| 
      
 101 
     | 
    
         
            +
                    "WEB.DE",
         
     | 
| 
      
 102 
     | 
    
         
            +
                    "AOL Webmail",
         
     | 
| 
      
 103 
     | 
    
         
            +
                    "Gmail",
         
     | 
| 
      
 104 
     | 
    
         
            +
                    "GMX",
         
     | 
| 
      
 105 
     | 
    
         
            +
                    "Swisscom",
         
     | 
| 
      
 106 
     | 
    
         
            +
                    "Strato",
         
     | 
| 
      
 107 
     | 
    
         
            +
                    "mail.ru"
         
     | 
| 
      
 108 
     | 
    
         
            +
                  ].include?(@webmail_client)
         
     | 
| 
      
 109 
     | 
    
         
            +
                end
         
     | 
| 
      
 110 
     | 
    
         
            +
             
     | 
| 
      
 111 
     | 
    
         
            +
                def is_aol?
         
     | 
| 
      
 112 
     | 
    
         
            +
                  @browser_family == 'AOL' || @webmail_client == 'AOL Webmail'
         
     | 
| 
      
 113 
     | 
    
         
            +
                end
         
     | 
| 
      
 114 
     | 
    
         
            +
             
     | 
| 
      
 115 
     | 
    
         
            +
                def is_outlook?
         
     | 
| 
      
 116 
     | 
    
         
            +
                  @browser_family == 'Outlook' || (@browser_family == 'IE' and @webmail_client.nil?)
         
     | 
| 
      
 117 
     | 
    
         
            +
                end
         
     | 
| 
      
 118 
     | 
    
         
            +
             
     | 
| 
      
 119 
     | 
    
         
            +
                def email_name
         
     | 
| 
      
 120 
     | 
    
         
            +
                  return 'Microsoft Outlook' if is_outlook?
         
     | 
| 
      
 121 
     | 
    
         
            +
                  return 'Apple Mail' if is_apple_mail?
         
     | 
| 
      
 122 
     | 
    
         
            +
                  return 'Apple Mobile Mail' if is_ios_mail?
         
     | 
| 
      
 123 
     | 
    
         
            +
                  return @browser_family if is_desktop_email?
         
     | 
| 
      
 124 
     | 
    
         
            +
                  return @webmail_client if is_webmail?
         
     | 
| 
      
 125 
     | 
    
         
            +
                  return @os_family if @os_family == 'Android'
         
     | 
| 
      
 126 
     | 
    
         
            +
                  return 'AOL' if is_aol?
         
     | 
| 
      
 127 
     | 
    
         
            +
                end
         
     | 
| 
      
 128 
     | 
    
         
            +
             
     | 
| 
      
 129 
     | 
    
         
            +
                def email_version_name
         
     | 
| 
      
 130 
     | 
    
         
            +
                  return apple_mail_names if is_apple_mail?
         
     | 
| 
      
 131 
     | 
    
         
            +
                  return ios_mail_names if is_ios_mail?
         
     | 
| 
      
 132 
     | 
    
         
            +
                  return outlook_names if is_outlook?
         
     | 
| 
      
 133 
     | 
    
         
            +
                  return 'AOL Desktop' if @browser_family == 'AOL'
         
     | 
| 
      
 134 
     | 
    
         
            +
                  email_name
         
     | 
| 
      
 135 
     | 
    
         
            +
                end
         
     | 
| 
      
 136 
     | 
    
         
            +
             
     | 
| 
      
 137 
     | 
    
         
            +
                def apple_mail_names
         
     | 
| 
      
 138 
     | 
    
         
            +
                  case @os_minor_version
         
     | 
| 
      
 139 
     | 
    
         
            +
                  when '0', '1', '2', '3' then 'Apple Mail 1'
         
     | 
| 
      
 140 
     | 
    
         
            +
                  when '4' then 'Apple Mail 2'
         
     | 
| 
      
 141 
     | 
    
         
            +
                  when '5' then 'Apple Mail 3'
         
     | 
| 
      
 142 
     | 
    
         
            +
                  when '6' then 'Apple Mail 4'
         
     | 
| 
      
 143 
     | 
    
         
            +
                  when '7' then 'Apple Mail 5'
         
     | 
| 
      
 144 
     | 
    
         
            +
                  when '8' then 'Apple Mail 6'
         
     | 
| 
      
 145 
     | 
    
         
            +
                  else 'Apple Mail'
         
     | 
| 
      
 146 
     | 
    
         
            +
                  end
         
     | 
| 
      
 147 
     | 
    
         
            +
                end
         
     | 
| 
      
 148 
     | 
    
         
            +
             
     | 
| 
      
 149 
     | 
    
         
            +
                def ios_mail_names
         
     | 
| 
      
 150 
     | 
    
         
            +
                  @device
         
     | 
| 
      
 151 
     | 
    
         
            +
                end
         
     | 
| 
      
 152 
     | 
    
         
            +
             
     | 
| 
      
 153 
     | 
    
         
            +
                def outlook_names
         
     | 
| 
      
 154 
     | 
    
         
            +
                  return 'Outlook 2000/2003/Express' unless @browser_family == 'Outlook'
         
     | 
| 
      
 155 
     | 
    
         
            +
                  case @browser_major_version
         
     | 
| 
      
 156 
     | 
    
         
            +
                  when '12' then 'Outlook 2007'
         
     | 
| 
      
 157 
     | 
    
         
            +
                  when '14' then 'Outlook 2010'
         
     | 
| 
      
 158 
     | 
    
         
            +
                  else 'Outlook'
         
     | 
| 
      
 159 
     | 
    
         
            +
                  end
         
     | 
| 
      
 160 
     | 
    
         
            +
                end
         
     | 
| 
      
 161 
     | 
    
         
            +
             
     | 
| 
       58 
162 
     | 
    
         
             
                def browser_name
         
     | 
| 
       59 
163 
     | 
    
         
             
                  "#{browser_family} #{browser_version}"
         
     | 
| 
       60 
164 
     | 
    
         
             
                end
         
     | 
    
        data/lib/useragent_parser.rb
    CHANGED
    
    | 
         @@ -2,12 +2,15 @@ require "useragent_parser/version" 
     | 
|
| 
       2 
2 
     | 
    
         
             
            require "useragent_parser/parsers/user_agent_parser"
         
     | 
| 
       3 
3 
     | 
    
         
             
            require "useragent_parser/parsers/os_parser"
         
     | 
| 
       4 
4 
     | 
    
         
             
            require "useragent_parser/parsers/device_parser"
         
     | 
| 
      
 5 
     | 
    
         
            +
            require "useragent_parser/parsers/referrer_parser"
         
     | 
| 
       5 
6 
     | 
    
         
             
            require "useragent_parser/user_agent"
         
     | 
| 
      
 7 
     | 
    
         
            +
            require "yaml"
         
     | 
| 
       6 
8 
     | 
    
         | 
| 
       7 
9 
     | 
    
         
             
            module UseragentParser
         
     | 
| 
       8 
10 
     | 
    
         
             
              USER_AGENT_PARSERS = []
         
     | 
| 
       9 
11 
     | 
    
         
             
              OS_PARSERS = []
         
     | 
| 
       10 
12 
     | 
    
         
             
              DEVICE_PARSERS = []
         
     | 
| 
      
 13 
     | 
    
         
            +
              REFERRER_PARSERS = []
         
     | 
| 
       11 
14 
     | 
    
         
             
              MOBILE_USER_AGENT_FAMILIES = []
         
     | 
| 
       12 
15 
     | 
    
         
             
              MOBILE_OS_FAMILIES = []
         
     | 
| 
       13 
16 
     | 
    
         | 
| 
         @@ -35,12 +38,36 @@ module UseragentParser 
     | 
|
| 
       35 
38 
     | 
    
         
             
                  DEVICE_PARSERS.push UseragentParser::DeviceParser.new(regex, device_replacement)
         
     | 
| 
       36 
39 
     | 
    
         
             
                end
         
     | 
| 
       37 
40 
     | 
    
         | 
| 
      
 41 
     | 
    
         
            +
                yaml['referrer_parsers'].each do |parser|
         
     | 
| 
      
 42 
     | 
    
         
            +
                  regex = parser['regex']
         
     | 
| 
      
 43 
     | 
    
         
            +
                  referrer_replacement = parser.fetch('referrer_replacement', nil)
         
     | 
| 
      
 44 
     | 
    
         
            +
             
     | 
| 
      
 45 
     | 
    
         
            +
                  REFERRER_PARSERS.push UseragentParser::ReferrerParser.new(regex, referrer_replacement)
         
     | 
| 
      
 46 
     | 
    
         
            +
                end
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
       38 
48 
     | 
    
         
             
                MOBILE_USER_AGENT_FAMILIES.push *yaml['mobile_user_agent_families']
         
     | 
| 
       39 
49 
     | 
    
         
             
                MOBILE_OS_FAMILIES.push *yaml['mobile_os_families']
         
     | 
| 
       40 
50 
     | 
    
         
             
              end
         
     | 
| 
       41 
51 
     | 
    
         | 
| 
       42 
     | 
    
         
            -
              def self. 
     | 
| 
       43 
     | 
    
         
            -
                 
     | 
| 
      
 52 
     | 
    
         
            +
              def self.parse(user_agent_string, *js_args)
         
     | 
| 
      
 53 
     | 
    
         
            +
                UseragentParser::UserAgent.new(self.parse_browser(user_agent_string, *js_args))
         
     | 
| 
      
 54 
     | 
    
         
            +
              end
         
     | 
| 
      
 55 
     | 
    
         
            +
             
     | 
| 
      
 56 
     | 
    
         
            +
              def self.parse_with_referrer(user_agent_string, referrer = nil, *js_args)
         
     | 
| 
      
 57 
     | 
    
         
            +
                UseragentParser::UserAgent.new(self.parse_email(user_agent_string, referrer, *js_args))
         
     | 
| 
      
 58 
     | 
    
         
            +
              end
         
     | 
| 
      
 59 
     | 
    
         
            +
             
     | 
| 
      
 60 
     | 
    
         
            +
              def self.parse_email(user_agent_string, referrer = nil, *js_args)
         
     | 
| 
      
 61 
     | 
    
         
            +
                {
         
     | 
| 
      
 62 
     | 
    
         
            +
                  'user_agent'  => self.parse_user_agent(user_agent_string, *js_args),
         
     | 
| 
      
 63 
     | 
    
         
            +
                  'os'          => self.parse_os(user_agent_string, *js_args),
         
     | 
| 
      
 64 
     | 
    
         
            +
                  'device'      => self.parse_device(user_agent_string, *js_args),
         
     | 
| 
      
 65 
     | 
    
         
            +
                  'string'      => user_agent_string,
         
     | 
| 
      
 66 
     | 
    
         
            +
                  'referrer'    => self.parse_referrer(referrer)
         
     | 
| 
      
 67 
     | 
    
         
            +
                }
         
     | 
| 
      
 68 
     | 
    
         
            +
              end
         
     | 
| 
      
 69 
     | 
    
         
            +
             
     | 
| 
      
 70 
     | 
    
         
            +
              def self.parse_browser(user_agent_string, *js_args)
         
     | 
| 
       44 
71 
     | 
    
         
             
                {
         
     | 
| 
       45 
72 
     | 
    
         
             
                  'user_agent'  => self.parse_user_agent(user_agent_string, *js_args),
         
     | 
| 
       46 
73 
     | 
    
         
             
                  'os'          => self.parse_os(user_agent_string, *js_args),
         
     | 
| 
         @@ -108,6 +135,16 @@ module UseragentParser 
     | 
|
| 
       108 
135 
     | 
    
         | 
| 
       109 
136 
     | 
    
         
             
                { 'family' => device, 'is_mobile' => is_mobile, 'is_spider' => (device == 'Spider') }
         
     | 
| 
       110 
137 
     | 
    
         
             
              end
         
     | 
| 
      
 138 
     | 
    
         
            +
             
     | 
| 
      
 139 
     | 
    
         
            +
              def self.parse_referrer(referrer_string)
         
     | 
| 
      
 140 
     | 
    
         
            +
                referrer = nil
         
     | 
| 
      
 141 
     | 
    
         
            +
                REFERRER_PARSERS.each do |parser|
         
     | 
| 
      
 142 
     | 
    
         
            +
                  referrer = parser.parse(referrer_string)
         
     | 
| 
      
 143 
     | 
    
         
            +
                  break unless referrer.nil?
         
     | 
| 
      
 144 
     | 
    
         
            +
                end
         
     | 
| 
      
 145 
     | 
    
         
            +
             
     | 
| 
      
 146 
     | 
    
         
            +
                { 'family' => referrer }
         
     | 
| 
      
 147 
     | 
    
         
            +
              end
         
     | 
| 
       111 
148 
     | 
    
         
             
            end
         
     | 
| 
       112 
149 
     | 
    
         | 
| 
       113 
150 
     | 
    
         
             
            UseragentParser.load_parsers!
         
     | 
| 
         @@ -3925,14 +3925,14 @@ test_cases: 
     | 
|
| 
       3925 
3925 
     | 
    
         
             
                  minor:
         
     | 
| 
       3926 
3926 
     | 
    
         
             
                  patch:
         
     | 
| 
       3927 
3927 
     | 
    
         
             
                - user_agent_string: "Mozilla/4.0 (compatible; Lotus-Notes/5.0; Windows-NT)"
         
     | 
| 
       3928 
     | 
    
         
            -
                  family: " 
     | 
| 
       3929 
     | 
    
         
            -
                  major:
         
     | 
| 
       3930 
     | 
    
         
            -
                  minor:
         
     | 
| 
      
 3928 
     | 
    
         
            +
                  family: "Lotus Notes"
         
     | 
| 
      
 3929 
     | 
    
         
            +
                  major: '5'
         
     | 
| 
      
 3930 
     | 
    
         
            +
                  minor: '0'
         
     | 
| 
       3931 
3931 
     | 
    
         
             
                  patch:
         
     | 
| 
       3932 
3932 
     | 
    
         
             
                - user_agent_string: "Mozilla/4.0 (compatible; Lotus-Notes/6.0; Windows-NT)"
         
     | 
| 
       3933 
     | 
    
         
            -
                  family: " 
     | 
| 
       3934 
     | 
    
         
            -
                  major:
         
     | 
| 
       3935 
     | 
    
         
            -
                  minor:
         
     | 
| 
      
 3933 
     | 
    
         
            +
                  family: "Lotus Notes"
         
     | 
| 
      
 3934 
     | 
    
         
            +
                  major: '6'
         
     | 
| 
      
 3935 
     | 
    
         
            +
                  minor: '0'
         
     | 
| 
       3936 
3936 
     | 
    
         
             
                  patch:
         
     | 
| 
       3937 
3937 
     | 
    
         
             
                - user_agent_string: "LTH/3.02a (http://www.learntohack.nil)"
         
     | 
| 
       3938 
3938 
     | 
    
         
             
                  family: "Other"
         
     | 
| 
         @@ -5185,13 +5185,13 @@ test_cases: 
     | 
|
| 
       5185 
5185 
     | 
    
         
             
                  minor:
         
     | 
| 
       5186 
5186 
     | 
    
         
             
                  patch:
         
     | 
| 
       5187 
5187 
     | 
    
         
             
                - user_agent_string: "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/103u (KHTML, like Gecko) safari/100"
         
     | 
| 
       5188 
     | 
    
         
            -
                  family: " 
     | 
| 
       5189 
     | 
    
         
            -
                  major:
         
     | 
| 
      
 5188 
     | 
    
         
            +
                  family: "Apple WebKit"
         
     | 
| 
      
 5189 
     | 
    
         
            +
                  major: '103'
         
     | 
| 
       5190 
5190 
     | 
    
         
             
                  minor:
         
     | 
| 
       5191 
5191 
     | 
    
         
             
                  patch:
         
     | 
| 
       5192 
5192 
     | 
    
         
             
                - user_agent_string: "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/124 (KHTML, like Gecko)"
         
     | 
| 
       5193 
     | 
    
         
            -
                  family: " 
     | 
| 
       5194 
     | 
    
         
            -
                  major:
         
     | 
| 
      
 5193 
     | 
    
         
            +
                  family: "Apple WebKit"
         
     | 
| 
      
 5194 
     | 
    
         
            +
                  major: '124'
         
     | 
| 
       5195 
5195 
     | 
    
         
             
                  minor:
         
     | 
| 
       5196 
5196 
     | 
    
         
             
                  patch:
         
     | 
| 
       5197 
5197 
     | 
    
         
             
                - user_agent_string: "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/124 (KHTML, like Gecko, Safari) Shiira/0.9.1"
         
     | 
| 
         @@ -5235,8 +5235,8 @@ test_cases: 
     | 
|
| 
       5235 
5235 
     | 
    
         
             
                  minor:
         
     | 
| 
       5236 
5236 
     | 
    
         
             
                  patch:
         
     | 
| 
       5237 
5237 
     | 
    
         
             
                - user_agent_string: "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/124 (KHTML, like Gecko) safari/125.0"
         
     | 
| 
       5238 
     | 
    
         
            -
                  family: " 
     | 
| 
       5239 
     | 
    
         
            -
                  major:
         
     | 
| 
      
 5238 
     | 
    
         
            +
                  family: "Apple WebKit"
         
     | 
| 
      
 5239 
     | 
    
         
            +
                  major: '124'
         
     | 
| 
       5240 
5240 
     | 
    
         
             
                  minor:
         
     | 
| 
       5241 
5241 
     | 
    
         
             
                  patch:
         
     | 
| 
       5242 
5242 
     | 
    
         
             
                - user_agent_string: "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-us) AppleWebKit/125.2 (KHTML, like Gecko, Safari) Shiira/0.9.2.2"
         
     | 
| 
         @@ -5265,18 +5265,18 @@ test_cases: 
     | 
|
| 
       5265 
5265 
     | 
    
         
             
                  minor: '34'
         
     | 
| 
       5266 
5266 
     | 
    
         
             
                  patch:
         
     | 
| 
       5267 
5267 
     | 
    
         
             
                - user_agent_string: "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/85 (KHTML, like Gecko) OmniWeb/v496"
         
     | 
| 
       5268 
     | 
    
         
            -
                  family: " 
     | 
| 
       5269 
     | 
    
         
            -
                  major:
         
     | 
| 
      
 5268 
     | 
    
         
            +
                  family: "Apple WebKit"
         
     | 
| 
      
 5269 
     | 
    
         
            +
                  major: '85'
         
     | 
| 
       5270 
5270 
     | 
    
         
             
                  minor:
         
     | 
| 
       5271 
5271 
     | 
    
         
             
                  patch:
         
     | 
| 
       5272 
5272 
     | 
    
         
             
                - user_agent_string: "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/85 (KHTML, like Gecko) OmniWeb/v549"
         
     | 
| 
       5273 
     | 
    
         
            -
                  family: " 
     | 
| 
       5274 
     | 
    
         
            -
                  major:
         
     | 
| 
      
 5273 
     | 
    
         
            +
                  family: "Apple WebKit"
         
     | 
| 
      
 5274 
     | 
    
         
            +
                  major: '85'
         
     | 
| 
       5275 
5275 
     | 
    
         
             
                  minor:
         
     | 
| 
       5276 
5276 
     | 
    
         
             
                  patch:
         
     | 
| 
       5277 
5277 
     | 
    
         
             
                - user_agent_string: "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/85 (KHTML, like Gecko) OmniWeb/v558"
         
     | 
| 
       5278 
     | 
    
         
            -
                  family: " 
     | 
| 
       5279 
     | 
    
         
            -
                  major:
         
     | 
| 
      
 5278 
     | 
    
         
            +
                  family: "Apple WebKit"
         
     | 
| 
      
 5279 
     | 
    
         
            +
                  major: '85'
         
     | 
| 
       5280 
5280 
     | 
    
         
             
                  minor:
         
     | 
| 
       5281 
5281 
     | 
    
         
             
                  patch:
         
     | 
| 
       5282 
5282 
     | 
    
         
             
                - user_agent_string: "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/85 (KHTML, like Gecko) OmniWeb/v558.43"
         
     | 
| 
         @@ -0,0 +1,40 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            test_cases:
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
              - referrer_string: 'http://bl131w.blu131.mail.live.com/mail/InboxLight.aspx?n=1166653403'
         
     | 
| 
      
 4 
     | 
    
         
            +
                family: 'Hotmail'
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
              - referrer_string: 'http://de.mc250.mail.yahoo.com/mc/welcome?.gx=1&.tm=1290672405&.rand=4rtrlgfb1p8na'
         
     | 
| 
      
 7 
     | 
    
         
            +
                family: 'Yahoo! Mail'
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
              - referrer_string: 'http://email.freenet.de/Email/View/Body?msg=4681&folder=INBOX&showImages=0&showImages=1&updateShowImagesStatus=1'
         
     | 
| 
      
 10 
     | 
    
         
            +
                family: 'WEB.DE'
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
              - referrer_string: 'http://webmail.aol.com/42951/aol/en-us/Suite.aspx'
         
     | 
| 
      
 13 
     | 
    
         
            +
                family: 'AOL Webmail'
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
              - referrer_string: 'http://mail.aol.com/32945-111/aol-1/de-de/Lite/MsgRead.aspx?folder=Spam&uid=1.27991476&seq=1&searchIn=none&searchQuery=&start=0&sort=received'
         
     | 
| 
      
 16 
     | 
    
         
            +
                family: 'AOL Webmail'
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
              - referrer_string: 'http://mail.google.com/mail/?ui=2&view=bsp&ver=ohhl4rw8mbn4'
         
     | 
| 
      
 19 
     | 
    
         
            +
                family: 'Gmail'
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
              - referrer_string: 'http://service.gmx.net/de/cgi/g.fcgi/mail/print?folder=inbox&uid=NDI5OMAkFGxkb%2FUN4WZuvoB2anv6Llsc&CUSTOMERNO=8421009&t=de730856557.1294240410.14bd9d8'
         
     | 
| 
      
 22 
     | 
    
         
            +
                family: 'GMX'
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
              - referrer_string: 'http://www.gmxattachments.net/de/cgi/g.fcgi/mail/print/fullhtml?mid=babgebac.1290790887.16270.a7fshhjuag.74&uid=ZGllQYdlCG9ydask92VvuYdkdFl2iYWj&partUid=ZGllQYdlCG9ydask92VvuYdkdFl2iYWj'
         
     | 
| 
      
 25 
     | 
    
         
            +
                family: 'GMX'
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
              - referrer_string: 'http://proxy-mssazhh.bluewin.ch/mail/MessageRead?sid='
         
     | 
| 
      
 28 
     | 
    
         
            +
                family: 'Swisscom'
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
              - referrer_string: 'http://communicator.strato.de/messages/mail_preview.html?msgNo=964'
         
     | 
| 
      
 31 
     | 
    
         
            +
                family: 'Strato'
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
              - referrer_string: 'http://win.mail.ru/cgi-bin/msglist'
         
     | 
| 
      
 34 
     | 
    
         
            +
                family: 'mail.ru'
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
              - referrer_string: 'http://www.example.com'
         
     | 
| 
      
 37 
     | 
    
         
            +
                family: 'Other'
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
              - referrer_string: ''
         
     | 
| 
      
 40 
     | 
    
         
            +
                family:
         
     |