packages feed

ua-parser 0.3 → 0.4

raw patch · 4 files changed

+91/−29 lines, 4 filesdep ~aesondep ~yaml

Dependency ranges changed: aeson, yaml

Files

regexes.yaml view
@@ -88,7 +88,7 @@    # Lightning (for Thunderbird)   # http://www.mozilla.org/projects/calendar/lightning/-  - regex: '(Lightning)/(\d+)\.(\d+)([ab]?\d+[a-z]*)'+  - regex: '(Lightning)/(\d+)\.(\d+)\.?((?:[ab]?\d+[a-z]*)|(?:\d*))'    # Swiftfox   - regex: '(Firefox)/(\d+)\.(\d+)\.(\d+(?:pre)?) \(Swiftfox\)'@@ -156,6 +156,18 @@   - regex: '(FlyFlow)/(\d+)\.(\d+)'     family_replacement: 'Baidu Explorer' +  # QQ Browsers+  - regex: '(MQQBrowser)/(\d+)\.(\d+)\.(\d+)'+    family_replacement: 'QQ Browser Mobile'+  - regex: '(MQQBrowser)/(\d+)\.(\d+)'+    family_replacement: 'QQ Browser Mobile'+  - regex: '(QQBrowser)/(\d+)\.(\d+)\.(\d+)\.(\d+)'+    family_replacement: 'QQ Browser'+  - regex: 'MQQBrowser'+    family_replacement: 'QQ Browser Mobile'+  - regex: 'QQBrowser'+    family_replacement: 'QQ Browser'+   # Pingdom   - regex: '(Pingdom.com_bot_version_)(\d+)\.(\d+)'     family_replacement: 'PingdomBot'@@ -164,10 +176,18 @@   - regex: '(facebookexternalhit)/(\d+)\.(\d+)'     family_replacement: 'FacebookBot' +  # LinkedIn+  - regex: '(LinkedInBot)/(\d+)\.(\d+)'+    family_replacement: 'LinkedInBot'+   # Twitterbot   - regex: '(Twitterbot)/(\d+)\.(\d+)'     family_replacement: 'TwitterBot' +  # Google Plus+  - regex: 'Google.*/\+/web/snippet'+    family_replacement: 'GooglePlusBot'+   # Rackspace Monitoring   - regex: '(Rackspace Monitoring)/(\d+)\.(\d+)'     family_replacement: 'RackspaceBot'@@ -191,13 +211,35 @@   #### MAIN CASES - this catches > 50% of all browsers ####    # Browser/major_version.minor_version.beta_version-  - regex: '(AdobeAIR|FireWeb|Jasmine|ANTGalio|Midori|Fresco|Lobo|PaleMoon|Maxthon|Lynx|OmniWeb|Dillo|Camino|Demeter|Fluid|Fennec|Epiphany|Shiira|Sunrise|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|Bunjalloo|Google Earth|Raven for Mac|Openwave)/(\d+)\.(\d+)\.(\d+)'+  - regex: '(AdobeAIR|FireWeb|Jasmine|ANTGalio|Midori|Fresco|Lobo|PaleMoon|Maxthon|Lynx|OmniWeb|Dillo|Camino|Demeter|Fluid|Fennec|Epiphany|Shiira|Sunrise|Flock|Netscape|Lunascape|WebPilot|NetFront|Netfront|Konqueror|SeaMonkey|Kazehakase|Vienna|Iceape|Iceweasel|IceWeasel|Iron|K-Meleon|Sleipnir|Galeon|GranParadiso|Opera Mini|iCab|NetNewsWire|ThunderBrowse|Iris|UP\.Browser|Bunjalloo|Google Earth|Raven for Mac|Openwave)/(\d+)\.(\d+)\.(\d+)' +  # Outlook 2007+  - regex: 'MSOffice 12'+    family_replacement: 'Outlook'+    v1_replacement: '2007'++  # Outlook 2010+  - regex: 'MSOffice 14'+    family_replacement: 'Outlook'+    v1_replacement: '2010'++  # Outlook 2013+  - regex: 'Microsoft Outlook 15\.\d+\.\d+'+    family_replacement: 'Outlook'+    v1_replacement: '2013'++  # Apple Air Mail+  - regex: '(Airmail) (\d+)\.(\d+)(?:\.(\d+))?'++  # Thunderbird+  - regex: '(Thunderbird)/(\d+)\.(\d+)\.(\d+(?:pre)?)'+    family_replacement: 'Thunderbird'+   # Chrome/Chromium/major_version.minor_version.beta_version   - regex: '(Chromium|Chrome)/(\d+)\.(\d+)\.(\d+)'    # Browser/major_version.minor_version-  - 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|Planetweb|ICE Browser)/(\d+)\.(\d+)'+  - regex: '(bingbot|Bolt|Jasmine|IceCat|Skyfire|Midori|Maxthon|Lynx|Arora|IBrowse|Dillo|Camino|Shiira|Fennec|Phoenix|Chrome|Flock|Netscape|Lunascape|Epiphany|WebPilot|Opera Mini|Opera|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|Planetweb|ICE Browser)/(\d+)\.(\d+)'    # Chrome/Chromium/major_version.minor_version   - regex: '(Chromium|Chrome)/(\d+)\.(\d+)'@@ -238,10 +280,6 @@   - regex: '(MSIE) (\d+)\.(\d+).*XBLWP7'     family_replacement: 'IE Large Screen' -  # AFTER THE EDGE CASES ABOVE!-  - regex: '(Firefox)/(\d+)\.(\d+)\.(\d+)'-  - regex: '(Firefox)/(\d+)\.(\d+)(pre|[ab]\d+[a-z]*)?'-   #### END MAIN CASES ####    #### SPECIAL CASES ####@@ -283,9 +321,6 @@   - regex: '(BonEcho)/(\d+)\.(\d+)\.(\d+)'     family_replacement: 'Bon Echo' -  - regex: 'M?QQBrowser'-    family_replacement: 'QQ Browser'-   - regex: '(iPod).+Version/(\d+)\.(\d+)\.(\d+)'     family_replacement: 'Mobile Safari'   - regex: '(iPod).*Version/(\d+)\.(\d+)'@@ -315,8 +350,10 @@   - regex: '(QtCarBrowser)'     v1_replacement: '1' -  - regex: '(iBrowser/Mini)(\d+).(\d+)'+  - regex: '^(iBrowser/Mini)(\d+).(\d+)'     family_replacement: 'iBrowser Mini'+  - regex: '^(iBrowser|iRAPP)/(\d+).(\d+)'+   # nokia browsers   # based on: http://www.developer.nokia.com/Community/Wiki/User-Agent_headers_for_Nokia_devices   - regex: '^(Nokia)'@@ -397,10 +434,22 @@   - regex: '(Phantom)/V(\d+)\.(\d+)'     family_replacement: 'Phantom Browser' -  - regex: '([MS]?IE) (\d+)\.(\d+)'+  - regex: 'Trident(.*)rv.(\d+)\.(\d+)'     family_replacement: 'IE' -  - regex: 'Trident(.*)rv.(\d+)\.(\d+)'+ # Apple Mail++  # apple mail - not directly detectable, have it after Safari stuff+  - regex: '(AppleWebKit)/(\d+)\.(\d+)\.(\d+)'+    family_replacement: 'AppleMail'++  # AFTER THE EDGE CASES ABOVE!+  # AFTER IE11+  # BEFORE all other IE+  - regex: '(Firefox)/(\d+)\.(\d+)\.(\d+)'+  - regex: '(Firefox)/(\d+)\.(\d+)(pre|[ab]\d+[a-z]*)?'++  - regex: '([MS]?IE) (\d+)\.(\d+)'     family_replacement: 'IE'    - regex: '(python-requests)/(\d+)\.(\d+)'@@ -527,11 +576,14 @@    - regex: '(Windows NT 6\.2; ARM;)'     os_replacement: 'Windows RT'--  # is this a spoof or is nt 6.2 out and about in some capacity?   - regex: '(Windows NT 6\.2)'     os_replacement: 'Windows 8' +  - regex: '(Windows NT 6\.3; ARM;)'+    os_replacement: 'Windows RT 8.1'+  - regex: '(Windows NT 6\.3)'+    os_replacement: 'Windows 8.1'+   - regex: '(Windows NT 5\.0)'     os_replacement: 'Windows 2000' @@ -571,7 +623,7 @@   # iOS   # http://en.wikipedia.org/wiki/IOS_version_history   ##########-  - regex: '(CPU OS|iPhone OS) (\d+)_(\d+)(?:_(\d+))?'+  - regex: '(CPU OS|iPhone OS|CPU iPhone) (\d+)[_\.](\d+)(?:[_\.](\d+))?'     os_replacement: 'iOS'    # remaining cases are mostly only opera uas, so catch opera as to not catch iphone spoofs@@ -606,7 +658,7 @@   # Symbian + Symbian OS   # http://en.wikipedia.org/wiki/History_of_Symbian   ##########-  - regex: '(Symbian[Oo][Ss])/(\d+)\.(\d+)'+  - regex: '(Symbian[Oo][Ss])[/ ](\d+)\.(\d+)'     os_replacement: 'Symbian OS'   - regex: '(Symbian/3).+NokiaBrowser/7\.3'     os_replacement: 'Symbian^3 Anna'@@ -614,7 +666,7 @@     os_replacement: 'Symbian^3 Belle'   - regex: '(Symbian/3)'     os_replacement: 'Symbian^3'-  - regex: '(Series 60|SymbOS|S60)'+  - regex: '\b(Series 60|SymbOS|S60Version|S60V\d|S60\b)'     os_replacement: 'Symbian OS'   - regex: '(MeeGo)'   - regex: 'Symbian [Oo][Ss]'@@ -641,7 +693,7 @@   ##########   # Firefox OS   ##########-  - regex: '\(Mobile;.+Firefox/\d+\.\d+'+  - regex: '\((?:Mobile|Tablet);.+Firefox/\d+\.\d+'     os_replacement: 'Firefox OS'    ##########@@ -763,6 +815,16 @@     device_replacement: 'Kindle Fire HD 8.9" WiFi'   - regex: '(KFJWA Build)'     device_replacement: 'Kindle Fire HD 8.9" 4G'+  - regex: '(KFSOWI Build)'+    device_replacement: 'Kindle Fire HD 7" WiFi'+  - regex: '(KFTHWI Build)'+    device_replacement: 'Kindle Fire HDX 7" WiFi'+  - regex: '(KFTHWA Build)'+    device_replacement: 'Kindle Fire HDX 7" 4G'+  - regex: '(KFAPWI Build)'+    device_replacement: 'Kindle Fire HDX 8.9" WiFi'+  - regex: '(KFAPWA Build)'+    device_replacement: 'Kindle Fire HDX 8.9" 4G'   - regex: '(Kindle Fire)'   - regex: '(Kindle)'   - regex: '(Silk)/(\d+)\.(\d+)(?:\.([0-9\-]+))?'@@ -1068,6 +1130,6 @@   ##########   # Spiders (this is hack...)   ##########-  - regex: '(bot|borg|google(^tv)|yahoo|slurp|msnbot|msrbot|openbot|archiver|netresearch|lycos|scooter|altavista|teoma|gigabot|baiduspider|blitzbot|oegp|charlotte|furlbot|http%20client|polybot|htdig|ichiro|mogimogi|larbin|pompos|scrubby|searchsight|seekbot|semanticdiscovery|silk|snappy|speedy|spider|voila|vortex|voyager|zao|zeal|fast\-webcrawler|converacrawler|dataparksearch|findlinks|crawler)'+  - regex: '(bingbot|bot|borg|google(^tv)|yahoo|slurp|msnbot|msrbot|openbot|archiver|netresearch|lycos|scooter|altavista|teoma|gigabot|baiduspider|blitzbot|oegp|charlotte|furlbot|http%20client|polybot|htdig|ichiro|mogimogi|larbin|pompos|scrubby|searchsight|seekbot|semanticdiscovery|silk|snappy|speedy|spider|voila|vortex|voyager|zao|zeal|fast\-webcrawler|converacrawler|dataparksearch|findlinks|crawler)'     device_replacement: 'Spider' 
src/Web/UAParser/Core.hs view
@@ -72,7 +72,7 @@           mkRes [_,f,v1,v2] = Just $ UAResult (repF f) (repV1 v1) (Just v2) Nothing           mkRes [_,f,v1] = Just $ UAResult (repF f) (repV1 v1) Nothing Nothing           mkRes [_, f] = Just $ UAResult (repF f) Nothing Nothing Nothing-          mkRes x = Nothing+          mkRes _ = Nothing           -- error $  "Unsupported match in parseUA" ++ show x            repV1 x = uaV1Rep `mplus` Just x@@ -127,7 +127,7 @@           mkRes [_,f,v1,v2] = Just $ OSResult (repF f) (Just v1) (Just v2) Nothing Nothing           mkRes [_,f,v1] = Just $ OSResult (repF f) (Just v1) Nothing Nothing Nothing           mkRes [_, f] = Just $ OSResult (repF f) Nothing Nothing Nothing Nothing-          mkRes x = Nothing+          mkRes _ = Nothing           -- error $  "Unsupported match in parseOS" ++ show x            repF x = maybe x id osFamRep@@ -202,7 +202,7 @@  ------------------------------------------------------------------------------- parseRegex :: Object -> Parser Regex-parseRegex v = flip compile [] `liftM` (v .: "regex")+parseRegex v = flip compile [] `liftM` (T.encodeUtf8 <$> v .: "regex")   -------------------------------------------------------------------------------
test/src/TestSuite.hs view
@@ -159,7 +159,7 @@ ------------------------------------------------------------------------------- instance FromJSON UserAgentTestCase where     parseJSON (Object v) =-      UATC <$> v .: "user_agent_string"+      UATC <$> T.encodeUtf8 <$> v .: "user_agent_string"            <*> (v .: "family" <|> return "")            <*> (v .:? "v1" <|> return Nothing)            <*> (v .:? "v2" <|> return Nothing)@@ -180,7 +180,7 @@ ------------------------------------------------------------------------------- instance FromJSON OSTestCase where     parseJSON (Object v) =-      OSTC <$> (v .: "user_agent_string" <|> return "")+      OSTC <$> (T.encodeUtf8 <$> v .: "user_agent_string" <|> return "")            <*> (v .: "family" <|> return "")            <*> nonBlank (v .:? "major" <|> return Nothing)            <*> nonBlank (v .:? "minor" <|> return Nothing)
ua-parser.cabal view
@@ -1,7 +1,7 @@ Name:                ua-parser Description:         Please refer to the git/github README on the project for example usage.-Version:             0.3-Synopsis:            Port of ua-parser in Haskell+Version:             0.4+Synopsis:            A library for parsing User-Agent strings, official Haskell port of ua-parser License:             BSD3 License-file:        LICENSE Author:              Ozgun Ataman@@ -31,8 +31,8 @@     , bytestring     , text     , pcre-light-    , yaml >= 0.7-    , aeson+    , yaml >= 0.7 && < 0.9+    , aeson >= 0.7 && < 0.8     , filepath     , data-default     , syb