<s> """<STR_LIT>""" <EOL> import sys <EOL> class DetectorsHub ( dict ) : <EOL> _known_types = [ '<STR_LIT>' , '<STR_LIT>' , '<STR_LIT>' , '<STR_LIT>' ] <EOL> def __init__ ( self , * args , ** kw ) : <EOL> dict . __init__ ( self , * args , ** kw ) <EOL> for typ in self . _known_types : <EOL> self . setdefault ( typ , [ ] ) <EOL> self . registerDetectors ( ) <EOL> def register ( self , detector ) : <EOL> if detector . info_type not in self . _known_types : <EOL> self [ detector . info_type ] = [ detector ] <EOL> self . _known_types . insert ( detector . order , detector . info_type ) <EOL> else : <EOL> self [ detector . info_type ] . append ( detector ) <EOL> def reorderByPrefs ( self , detectors , prefs ) : <EOL> if prefs is None : <EOL> return [ ] <EOL> elif prefs == [ ] : <EOL> return detectors <EOL> else : <EOL> prefs . insert ( <NUM_LIT:0> , '<STR_LIT>' ) <EOL> def key_name ( d ) : <EOL> return d . name in prefs and prefs . index ( d . name ) or sys . maxint <EOL> return sorted ( detectors , key = key_name ) <EOL> def __iter__ ( self ) : <EOL> return iter ( self . _known_types ) <EOL> def registerDetectors ( self ) : <EOL> detectors = [ v ( ) for v in globals ( ) . values ( ) <EOL> if DetectorBase in getattr ( v , '<STR_LIT>' , [ ] ) ] <EOL> for d in detectors : <EOL> if d . can_register : <EOL> self . register ( d ) <EOL> class DetectorBase ( object ) : <EOL> name = "<STR_LIT>" <EOL> info_type = '<STR_LIT>' <EOL> result_key = '<STR_LIT>' <EOL> order = <NUM_LIT:10> <EOL> look_for = [ ] <EOL> skip_if_found = [ ] <EOL> can_register = False <EOL> is_mobile = False <EOL> is_tablet = False <EOL> prefs = dict ( ) <EOL> version_splitters = [ "<STR_LIT:/>" , "<STR_LIT:U+0020>" ] <EOL> _suggested_detectors = None <EOL> def __init__ ( self ) : <EOL> if not self . name : <EOL> self . name = self . __class__ . __name__ <EOL> self . can_register = ( self . __class__ . __dict__ . get ( '<STR_LIT>' , True ) ) <EOL> def detect ( self , agent , result ) : <EOL> if agent and self . checkWords ( agent ) : <EOL> result [ self . info_type ] = dict ( name = self . name ) <EOL> is_mobile = self . is_mobile <EOL> is_tablet = self . is_tablet <EOL> if is_mobile : <EOL> result [ '<STR_LIT>' ] = is_mobile <EOL> if is_tablet : <EOL> result [ '<STR_LIT>' ] = is_tablet <EOL> version = self . getVersion ( agent ) <EOL> if version : <EOL> result [ self . info_type ] [ '<STR_LIT:version>' ] = version <EOL> return True <EOL> return False <EOL> def checkWords ( self , agent ) : <EOL> for w in self . skip_if_found : <EOL> if w in agent : <EOL> return False <EOL> for w in self . look_for : <EOL> if not w in agent : <EOL> return False <EOL> return True <EOL> def getVersion ( self , agent ) : <EOL> vs = self . version_splitters <EOL> return agent . partition ( self . look_for [ <NUM_LIT:0> ] + vs [ <NUM_LIT:0> ] ) [ <NUM_LIT:2> ] . partition ( vs [ <NUM_LIT:1> ] ) [ <NUM_LIT:0> ] . strip ( ) <EOL> class OS ( DetectorBase ) : <EOL> info_type = "<STR_LIT>" <EOL> can_register = False <EOL> version_splitters = [ "<STR_LIT:;>" , "<STR_LIT:U+0020>" ] <EOL> class Dist ( DetectorBase ) : <EOL> info_type = "<STR_LIT>" <EOL> can_register = False <EOL> class Flavor ( DetectorBase ) : <EOL> info_type = "<STR_LIT>" <EOL> can_register = False <EOL> class Browser ( DetectorBase ) : <EOL> info_type = "<STR_LIT>" <EOL> can_register = False <EOL> class Macintosh ( OS ) : <EOL> look_for = [ '<STR_LIT>' ] <EOL> prefs = dict ( dist = None ) <EOL> def getVersion ( self , agent ) : <EOL> pass <EOL> class Firefox ( Browser ) : <EOL> look_for = [ "<STR_LIT>" ] <EOL> class Konqueror ( Browser ) : <EOL> look_for = [ "<STR_LIT>" ] <EOL> version_splitters = [ "<STR_LIT:/>" , "<STR_LIT:;>" ] <EOL> class Opera ( Browser ) : <EOL> look_for = [ "<STR_LIT>" ] <EOL> def getVersion ( self , agent ) : <EOL> return agent . partition ( self . look_for [ <NUM_LIT:0> ] ) [ <NUM_LIT:2> ] [ <NUM_LIT:1> : ] . partition ( '<STR_LIT:U+0020>' ) [ <NUM_LIT:0> ] <EOL> class Netscape ( Browser ) : <EOL> look_for = [ "<STR_LIT>" ] <EOL> class MSIE ( Browser ) : <EOL> look_for = [ "<STR_LIT>" ] <EOL> skip_if_found = [ "<STR_LIT>" ] <EOL> name = "<STR_LIT>" <EOL> version_splitters = [ "<STR_LIT:U+0020>" , "<STR_LIT:;>" ] <EOL> class Galeon ( Browser ) : <EOL> look_for = [ "<STR_LIT>" ] <EOL> class Safari ( Browser ) : <EOL> look_for = [ "<STR_LIT>" ] <EOL> skip_if_found = [ "<STR_LIT>" , "<STR_LIT>" , "<STR_LIT>" , "<STR_LIT>" , '<STR_LIT>' ] <EOL> def getVersion ( self , agent ) : <EOL> if "<STR_LIT>" in agent : <EOL> return agent . partition ( '<STR_LIT>' ) [ <NUM_LIT:2> ] . partition ( '<STR_LIT:U+0020>' ) [ <NUM_LIT:0> ] . strip ( ) <EOL> class SafariTablet ( Browser ) : <EOL> name = "<STR_LIT>" <EOL> look_for = [ '<STR_LIT>' , '<STR_LIT>' ] <EOL> skip_if_found = [ "<STR_LIT>" , "<STR_LIT>" , "<STR_LIT>" , "<STR_LIT>" ] <EOL> is_mobile = True <EOL> is_tablet = True <EOL> def getVersion ( self , agent ) : <EOL> if "<STR_LIT>" in agent : <EOL> return agent . partition ( '<STR_LIT>' ) [ <NUM_LIT:2> ] . partition ( '<STR_LIT:U+0020>' ) [ <NUM_LIT:0> ] . strip ( ) <EOL> class SafariMobile ( Browser ) : <EOL> name = "<STR_LIT>" <EOL> look_for = [ "<STR_LIT>" , "<STR_LIT>" ] <EOL> is_mobile = True <EOL> def getVersion ( self , agent ) : <EOL> if "<STR_LIT>" in agent : <EOL> return agent . partition ( '<STR_LIT>' ) [ <NUM_LIT:2> ] . partition ( '<STR_LIT:U+0020>' ) [ <NUM_LIT:0> ] . strip ( ) <EOL> class SafariNokia ( Browser ) : <EOL> name = "<STR_LIT>" <EOL> look_for = [ "<STR_LIT>" , "<STR_LIT>" ] <EOL> is_mobile = True <EOL> def getVersion ( self , agent ) : <EOL> pass <EOL> class SafariiPad ( Browser ) : <EOL> name = "<STR_LIT>" <EOL> look_for = [ "<STR_LIT>" , "<STR_LIT>" ] <EOL> skip_if_found = [ "<STR_LIT>" , "<STR_LIT>" ] <EOL> is_mobile = True <EOL> is_tablet = True <EOL> def getVersion ( self , agent ) : <EOL> if "<STR_LIT>" in agent : <EOL> return agent . partition ( '<STR_LIT>' ) [ <NUM_LIT:2> ] . partition ( '<STR_LIT:U+0020>' ) [ <NUM_LIT:0> ] . strip ( ) <EOL> class Linux ( OS ) : <EOL> look_for = [ "<STR_LIT>" ] <EOL> prefs = dict ( dist = [ "<STR_LIT>" , "<STR_LIT>" , "<STR_LIT>" ] , flavor = None ) <EOL> def getVersion ( self , agent ) : <EOL> pass <EOL> class BlackBerry ( OS ) : <EOL> look_for = [ '<STR_LIT>' ] <EOL> prefs = dict ( flavor = [ '<STR_LIT>' ] ) <EOL> is_mobile = True <EOL> def checkWords ( self , agent ) : <EOL> if '<STR_LIT>' in agent or '<STR_LIT>' in agent : <EOL> return True <EOL> return False <EOL> def getVersion ( self , agent ) : <EOL> pass <EOL> class PlayBook ( Flavor ) : <EOL> look_for = [ '<STR_LIT>' ] <EOL> is_mobile = True <EOL> is_tablet = True <EOL> def getVersion ( self , agent ) : <EOL> return agent . partition ( '<STR_LIT>' ) [ <NUM_LIT:2> ] . partition ( '<STR_LIT:;>' ) [ <NUM_LIT:0> ] . strip ( ) <EOL> class Macintosh ( OS ) : <EOL> look_for = [ '<STR_LIT>' ] <EOL> prefs = dict ( dist = None , flavor = [ '<STR_LIT>' ] ) <EOL> def getVersion ( self , agent ) : <EOL> pass <EOL> class MacOS ( Flavor ) : <EOL> look_for = [ '<STR_LIT>' ] <EOL> prefs = dict ( browser = [ '<STR_LIT>' , '<STR_LIT>' , '<STR_LIT>' , <EOL> '<STR_LIT>' , '<STR_LIT>' , "<STR_LIT>" ] ) <EOL> def getVersion ( self , agent ) : <EOL> version_end_chars = [ '<STR_LIT:;>' , '<STR_LIT:)>' ] <EOL> part = agent . partition ( '<STR_LIT>' ) [ <NUM_LIT:2> ] . strip ( ) <EOL> for c in version_end_chars : <EOL> if c in part : <EOL> version = part . partition ( c ) [ <NUM_LIT:0> ] <EOL> break <EOL> return version . replace ( '<STR_LIT:_>' , '<STR_LIT:.>' ) <EOL> class Windows ( OS ) : <EOL> look_for = [ '<STR_LIT>' , '<STR_LIT>' ] <EOL> prefs = dict ( browser = [ "<STR_LIT>" , '<STR_LIT>' ] , <EOL> dist = [ '<STR_LIT>' ] , flavor = None ) <EOL> def getVersion ( self , agent ) : <EOL> v = agent . partition ( '<STR_LIT>' ) <EOL> return v [ <NUM_LIT:1> ] + '<STR_LIT:U+0020>' + v [ <NUM_LIT:2> ] . replace ( '<STR_LIT:)>' , '<STR_LIT:;>' ) . partition ( '<STR_LIT:;>' ) [ <NUM_LIT:0> ] . strip ( ) <EOL> class WindowsMobile ( Dist ) : <EOL> name = '<STR_LIT>' <EOL> look_for = [ '<STR_LIT>' , '<STR_LIT>' ] <EOL> is_mobile = True <EOL> def getVersion ( self , agent ) : <EOL> return agent . partition ( '<STR_LIT>' ) [ <NUM_LIT:2> ] . replace ( '<STR_LIT:)>' , '<STR_LIT>' ) . partition ( '<STR_LIT:;>' ) [ <NUM_LIT:0> ] . strip ( ) <EOL> class Ubuntu ( Dist ) : <EOL> look_for = [ '<STR_LIT>' ] <EOL> version_splitters = [ "<STR_LIT:/>" , "<STR_LIT:U+0020>" ] <EOL> prefs = dict ( browser = [ '<STR_LIT>' ] ) <EOL> class Debian ( Dist ) : <EOL> look_for = [ '<STR_LIT>' ] <EOL> version_splitters = [ "<STR_LIT:/>" , "<STR_LIT:U+0020>" ] <EOL> prefs = dict ( browser = [ '<STR_LIT>' ] ) <EOL> class Chrome ( Browser ) : <EOL> look_for = [ '<STR_LIT>' ] <EOL> version_splitters = [ "<STR_LIT:/>" , "<STR_LIT:U+0020>" ] <EOL> class ChromeOS ( OS ) : <EOL> look_for = [ '<STR_LIT>' ] <EOL> version_splitters = [ "<STR_LIT:U+0020>" , "<STR_LIT:)>" ] <EOL> prefs = dict ( browser = [ '<STR_LIT>' ] ) <EOL> def getVersion ( self , agent ) : <EOL> vs = self . version_splitters <EOL> return agent . partition ( self . look_for [ <NUM_LIT:0> ] + vs [ <NUM_LIT:0> ] ) [ <NUM_LIT:2> ] . partition ( vs [ <NUM_LIT:1> ] ) [ <NUM_LIT:0> ] . partition ( "<STR_LIT:U+0020>" ) [ <NUM_LIT:2> ] . strip ( ) <EOL> class Android ( Dist ) : <EOL> look_for = [ '<STR_LIT>' ] <EOL> prefs = dict ( browser = [ '<STR_LIT>' , '<STR_LIT>' ] ) <EOL> is_mobile = True <EOL> def getVersion ( self , agent ) : <EOL> return agent . partition ( '<STR_LIT>' ) [ <NUM_LIT:2> ] . partition ( '<STR_LIT:;>' ) [ <NUM_LIT:0> ] . strip ( ) <EOL> class SymbianOS ( OS ) : <EOL> look_for = [ '<STR_LIT>' ] <EOL> prefs = dict ( dist = [ '<STR_LIT>' ] , browser = [ '<STR_LIT>' , '<STR_LIT>' ] ) <EOL> is_mobile = True <EOL> version_splitters = [ '<STR_LIT:/>' , '<STR_LIT>' ] <EOL> class Series ( Flavor ) : <EOL> look_for = [ '<STR_LIT>' , '<STR_LIT>' ] <EOL> version_splitters = [ '<STR_LIT:/>' , '<STR_LIT:;>' ] <EOL> def getVersion ( self , agent ) : <EOL> return agent . partition ( '<STR_LIT>' ) [ <NUM_LIT:2> ] . partition ( '<STR_LIT:U+0020>' ) [ <NUM_LIT:0> ] . replace ( '<STR_LIT:/>' , '<STR_LIT:U+0020>' ) <EOL> class BrowserNG ( Browser ) : <EOL> look_for = [ '<STR_LIT>' ] <EOL> version_splitters = [ '<STR_LIT:/>' , '<STR_LIT:;>' ] <EOL> class iPhone ( Dist ) : <EOL> look_for = [ '<STR_LIT>' ] <EOL> is_mobile = True <EOL> prefs = dict ( browser = [ '<STR_LIT>' ] ) <EOL> def getVersion ( self , agent ) : <EOL> version_end_chars = [ '<STR_LIT>' , '<STR_LIT:;>' , '<STR_LIT:)>' ] <EOL> if ( not '<STR_LIT>' in agent ) and ( not '<STR_LIT>' in agent ) : <EOL> return '<STR_LIT:X>' <EOL> part = agent . partition ( '<STR_LIT>' ) [ <NUM_LIT:2> ] . strip ( ) <EOL> for c in version_end_chars : <EOL> if c in part : <EOL> version = '<STR_LIT>' + part . partition ( c ) [ <NUM_LIT:0> ] . strip ( ) <EOL> break <EOL> return version . replace ( '<STR_LIT:_>' , '<STR_LIT:.>' ) <EOL> class iPad ( Dist ) : <EOL> look_for = [ '<STR_LIT>' ] <EOL> is_mobile = True <EOL> is_tablet = True <EOL> def getVersion ( self , agent ) : <EOL> version_end_chars = [ '<STR_LIT>' , '<STR_LIT:;>' , '<STR_LIT:)>' ] <EOL> if not '<STR_LIT>' in agent : <EOL> return '<STR_LIT>' <EOL> part = agent . partition ( '<STR_LIT>' ) [ <NUM_LIT:2> ] . strip ( ) <EOL> for c in version_end_chars : <EOL> if c in part : <EOL> version = '<STR_LIT>' + part . partition ( c ) [ <NUM_LIT:0> ] . strip ( ) <EOL> break <EOL> return version . replace ( '<STR_LIT:_>' , '<STR_LIT:.>' ) <EOL> detectorshub = DetectorsHub ( ) <EOL> def detect ( agent ) : <EOL> result = dict ( ) <EOL> prefs = dict ( ) <EOL> result [ '<STR_LIT>' ] = False <EOL> result [ '<STR_LIT>' ] = False <EOL> for info_type in detectorshub : <EOL> detectors = detectorshub [ info_type ] <EOL> _d_prefs = prefs . get ( info_type , [ ] ) <EOL> detectors = detectorshub . reorderByPrefs ( detectors , _d_prefs ) <EOL> try : <EOL> for detector in detectors : <EOL> if detector . detect ( agent , result ) : <EOL> prefs = detector . prefs <EOL> break <EOL> except Exception , ex : <EOL> result [ '<STR_LIT>' ] = ex <EOL> if not '<STR_LIT>' in result : <EOL> result [ '<STR_LIT>' ] = { '<STR_LIT:name>' : '<STR_LIT>' } <EOL> return result <EOL> class Result ( dict ) : <EOL> def __missing__ ( self , k ) : <EOL> return "<STR_LIT>" <EOL> def simple_detect ( agent ) : <EOL> """<STR_LIT>""" <EOL> result = detect ( agent ) <EOL> os_list = [ ] <EOL> if '<STR_LIT>' in result : <EOL> os_list . append ( result [ '<STR_LIT>' ] [ '<STR_LIT:name>' ] ) <EOL> if '<STR_LIT>' in result : <EOL> os_list . append ( result [ '<STR_LIT>' ] [ '<STR_LIT:name>' ] ) <EOL> if '<STR_LIT>' in result : <EOL> os_list . append ( result [ '<STR_LIT>' ] [ '<STR_LIT:name>' ] ) <EOL> os = os_list and "<STR_LIT:U+0020>" . join ( os_list ) or "<STR_LIT>" <EOL> os_version = os_list and ( '<STR_LIT>' in result and result [ '<STR_LIT>' ] and result [ '<STR_LIT>' ] . get ( <EOL> '<STR_LIT:version>' ) ) or ( '<STR_LIT>' in result and result [ '<STR_LIT>' ] and result [ '<STR_LIT>' ] . get ( '<STR_LIT:version>' ) ) or ( '<STR_LIT>' in result and result [ '<STR_LIT>' ] and result [ '<STR_LIT>' ] . get ( '<STR_LIT:version>' ) ) or "<STR_LIT>" <EOL> browser = '<STR_LIT>' in result and result [ '<STR_LIT>' ] [ <EOL> '<STR_LIT:name>' ] or '<STR_LIT>' <EOL> browser_version = '<STR_LIT>' in result and result [ '<STR_LIT>' ] . get ( '<STR_LIT:version>' ) or "<STR_LIT>" <EOL> if browser_version : <EOL> browser = "<STR_LIT:U+0020>" . join ( ( browser , browser_version ) ) <EOL> if os_version : <EOL> os = "<STR_LIT:U+0020>" . join ( ( os , os_version ) ) <EOL> return os , browser , result [ '<STR_LIT>' ] <EOL> if __name__ == '<STR_LIT:__main__>' : <EOL> import time <EOL> import unittest <EOL> data = ( <EOL> ( <EOL> '<STR_LIT>' , <EOL> ( '<STR_LIT>' , '<STR_LIT>' , True ) , <EOL> { '<STR_LIT>' : True , '<STR_LIT>' : False , '<STR_LIT>' : { '<STR_LIT:name>' : '<STR_LIT>' , '<STR_LIT:version>' : '<STR_LIT>' } , '<STR_LIT>' : { '<STR_LIT:name>' : '<STR_LIT>' , '<STR_LIT:version>' : '<STR_LIT>' } , '<STR_LIT>' : { '<STR_LIT:name>' : '<STR_LIT>' } } , ) , <EOL> ( <EOL> '<STR_LIT>' , <EOL> ( '<STR_LIT>' , '<STR_LIT>' , True ) , <EOL> { '<STR_LIT>' : True , '<STR_LIT>' : False , '<STR_LIT>' : { '<STR_LIT:name>' : '<STR_LIT>' , '<STR_LIT:version>' : '<STR_LIT>' } , '<STR_LIT>' : { '<STR_LIT:name>' : '<STR_LIT>' , '<STR_LIT:version>' : '<STR_LIT>' } , '<STR_LIT>' : { '<STR_LIT:name>' : '<STR_LIT>' , '<STR_LIT:version>' : '<STR_LIT>' } } , ) , <EOL> ( <EOL> '<STR_LIT>' , <EOL> ( '<STR_LIT>' , '<STR_LIT>' , True ) , <EOL> { '<STR_LIT>' : True , '<STR_LIT>' : False , '<STR_LIT>' : { '<STR_LIT:name>' : '<STR_LIT>' , '<STR_LIT:version>' : '<STR_LIT>' } , '<STR_LIT>' : { '<STR_LIT:name>' : '<STR_LIT>' , '<STR_LIT:version>' : '<STR_LIT>' } , '<STR_LIT>' : { '<STR_LIT:name>' : '<STR_LIT>' , '<STR_LIT:version>' : '<STR_LIT>' } } , ) , <EOL> ( <EOL> '<STR_LIT>' , <EOL> ( '<STR_LIT>' , '<STR_LIT>' , True ) , <EOL> { '<STR_LIT>' : True , '<STR_LIT>' : True , '<STR_LIT>' : { '<STR_LIT:name>' : '<STR_LIT>' , '<STR_LIT:version>' : '<STR_LIT>' } , '<STR_LIT>' : { '<STR_LIT:name>' : '<STR_LIT>' } , '<STR_LIT>' : { '<STR_LIT:name>' : '<STR_LIT>' , '<STR_LIT:version>' : '<STR_LIT>' } } , ) , <EOL> ( <EOL> '<STR_LIT>' , <EOL> ( '<STR_LIT>' , '<STR_LIT>' , True ) , <EOL> { '<STR_LIT>' : True , '<STR_LIT>' : False , '<STR_LIT>' : { '<STR_LIT:name>' : '<STR_LIT>' } , '<STR_LIT>' : { '<STR_LIT:name>' : '<STR_LIT>' , '<STR_LIT:version>' : '<STR_LIT>' } } , ) , <EOL> ( <EOL> '<STR_LIT>' , <EOL> ( '<STR_LIT>' , '<STR_LIT>' , True ) , <EOL> { '<STR_LIT>' : True , '<STR_LIT>' : False , '<STR_LIT>' : { '<STR_LIT:name>' : '<STR_LIT>' } , '<STR_LIT>' : { '<STR_LIT:name>' : '<STR_LIT>' , '<STR_LIT:version>' : '<STR_LIT>' } } , ) , <EOL> ( <EOL> '<STR_LIT>' , <EOL> ( '<STR_LIT>' , '<STR_LIT>' , True ) , <EOL> { '<STR_LIT>' : True , '<STR_LIT>' : True , '<STR_LIT>' : { '<STR_LIT:version>' : '<STR_LIT:X>' , '<STR_LIT:name>' : '<STR_LIT>' } , '<STR_LIT>' : { '<STR_LIT:version>' : '<STR_LIT>' , '<STR_LIT:name>' : '<STR_LIT>' } , '<STR_LIT>' : { '<STR_LIT:name>' : '<STR_LIT>' , '<STR_LIT:version>' : '<STR_LIT>' } } , ) , <EOL> ( <EOL> '<STR_LIT>' , <EOL> ( '<STR_LIT>' , '<STR_LIT>' , False ) , <EOL> { '<STR_LIT>' : False , '<STR_LIT>' : False , '<STR_LIT>' : { '<STR_LIT:name>' : '<STR_LIT>' , '<STR_LIT:version>' : '<STR_LIT>' } , '<STR_LIT>' : { '<STR_LIT:name>' : '<STR_LIT>' , '<STR_LIT:version>' : '<STR_LIT>' } } , ) , <EOL> ( <EOL> '<STR_LIT>' , <EOL> ( '<STR_LIT>' , '<STR_LIT>' , True ) , <EOL> { '<STR_LIT>' : True , '<STR_LIT>' : True , '<STR_LIT>' : { '<STR_LIT:version>' : '<STR_LIT>' , '<STR_LIT:name>' : '<STR_LIT>' } , '<STR_LIT>' : { '<STR_LIT:name>' : '<STR_LIT>' } , '<STR_LIT>' : { '<STR_LIT:version>' : '<STR_LIT>' , '<STR_LIT:name>' : '<STR_LIT>' } } , ) , <EOL> ( <EOL> '<STR_LIT>' , <EOL> ( '<STR_LIT>' , '<STR_LIT>' , True ) , <EOL> { '<STR_LIT>' : True , '<STR_LIT>' : False , '<STR_LIT>' : { '<STR_LIT:version>' : '<STR_LIT>' , '<STR_LIT:name>' : '<STR_LIT>' } , '<STR_LIT>' : { '<STR_LIT:name>' : '<STR_LIT>' } , '<STR_LIT>' : { '<STR_LIT:version>' : '<STR_LIT>' , '<STR_LIT:name>' : '<STR_LIT>' } } , ) , <EOL> ( <EOL> '<STR_LIT>' , <EOL> ( '<STR_LIT>' , '<STR_LIT>' , False ) , <EOL> { '<STR_LIT>' : False , '<STR_LIT>' : False , '<STR_LIT>' : { '<STR_LIT:version>' : '<STR_LIT>' , '<STR_LIT:name>' : '<STR_LIT>' } , '<STR_LIT>' : { '<STR_LIT:name>' : '<STR_LIT>' } , '<STR_LIT>' : { '<STR_LIT:version>' : '<STR_LIT>' , '<STR_LIT:name>' : '<STR_LIT>' } } , ) , <EOL> ( <EOL> '<STR_LIT>' , <EOL> ( '<STR_LIT>' , '<STR_LIT>' , False ) , <EOL> { '<STR_LIT>' : False , '<STR_LIT>' : False , '<STR_LIT>' : { '<STR_LIT:version>' : '<STR_LIT>' , '<STR_LIT:name>' : '<STR_LIT>' } , '<STR_LIT>' : { '<STR_LIT:name>' : '<STR_LIT>' } , '<STR_LIT>' : { '<STR_LIT:version>' : '<STR_LIT>' , '<STR_LIT:name>' : '<STR_LIT>' } } , ) , <EOL> ( <EOL> '<STR_LIT>' , <EOL> ( '<STR_LIT>' , '<STR_LIT>' , False ) , <EOL> { '<STR_LIT>' : False , '<STR_LIT>' : False , '<STR_LIT>' : { '<STR_LIT:version>' : '<STR_LIT>' , '<STR_LIT:name>' : '<STR_LIT>' } , '<STR_LIT>' : { '<STR_LIT:name>' : '<STR_LIT>' } , '<STR_LIT>' : { '<STR_LIT:version>' : '<STR_LIT>' , '<STR_LIT:name>' : '<STR_LIT>' } } , ) , <EOL> ( <EOL> '<STR_LIT>' , <EOL> ( '<STR_LIT>' , '<STR_LIT>' , True ) , <EOL> { '<STR_LIT>' : True , '<STR_LIT>' : False , '<STR_LIT>' : { '<STR_LIT:version>' : '<STR_LIT>' , '<STR_LIT:name>' : '<STR_LIT>' } , '<STR_LIT>' : { '<STR_LIT:name>' : '<STR_LIT>' } , '<STR_LIT>' : { '<STR_LIT:version>' : '<STR_LIT>' , '<STR_LIT:name>' : '<STR_LIT>' } } , ) , <EOL> ( <EOL> '<STR_LIT>' , <EOL> ( '<STR_LIT>' , '<STR_LIT>' , True ) , <EOL> { '<STR_LIT>' : True , '<STR_LIT>' : False , '<STR_LIT>' : { '<STR_LIT:version>' : '<STR_LIT>' , '<STR_LIT:name>' : '<STR_LIT>' } , '<STR_LIT>' : { '<STR_LIT:name>' : '<STR_LIT>' } , '<STR_LIT>' : { '<STR_LIT:version>' : '<STR_LIT>' , '<STR_LIT:name>' : '<STR_LIT>' } } , ) , <EOL> ( <EOL> '<STR_LIT>' , <EOL> ( '<STR_LIT>' , '<STR_LIT>' , True ) , <EOL> { '<STR_LIT>' : True , '<STR_LIT>' : False , '<STR_LIT>' : { '<STR_LIT:version>' : '<STR_LIT:X>' , '<STR_LIT:name>' : '<STR_LIT>' } , '<STR_LIT>' : { '<STR_LIT:version>' : '<STR_LIT:X>' , '<STR_LIT:name>' : '<STR_LIT>' } , '<STR_LIT>' : { '<STR_LIT:version>' : '<STR_LIT>' , '<STR_LIT:name>' : '<STR_LIT>' } } , ) , <EOL> ( <EOL> '<STR_LIT>' , <EOL> ( '<STR_LIT>' , '<STR_LIT>' , False ) , <EOL> { '<STR_LIT>' : False , '<STR_LIT>' : False , '<STR_LIT>' : { '<STR_LIT:name>' : '<STR_LIT>' , '<STR_LIT:version>' : '<STR_LIT>' } , '<STR_LIT>' : { '<STR_LIT:name>' : '<STR_LIT>' , '<STR_LIT:version>' : '<STR_LIT>' } } , ) , <EOL> ( <EOL> '<STR_LIT>' , <EOL> ( '<STR_LIT>' , '<STR_LIT>' , False ) , <EOL> { '<STR_LIT>' : False , '<STR_LIT>' : False , '<STR_LIT>' : { '<STR_LIT:name>' : '<STR_LIT>' , '<STR_LIT:version>' : '<STR_LIT>' } , '<STR_LIT>' : { '<STR_LIT:name>' : '<STR_LIT>' , '<STR_LIT:version>' : '<STR_LIT>' } } , ) , <EOL> ( '<STR_LIT>' , <EOL> ( '<STR_LIT>' , '<STR_LIT>' , False ) , <EOL> { '<STR_LIT>' : False , '<STR_LIT>' : False , '<STR_LIT>' : { '<STR_LIT:name>' : '<STR_LIT>' } , '<STR_LIT>' : { '<STR_LIT:name>' : '<STR_LIT>' , '<STR_LIT:version>' : '<STR_LIT>' } } , ) , <EOL> ) <EOL> class TestHAP ( unittest . TestCase ) : <EOL> def setUp ( self ) : <EOL> self . harass_repeat = <NUM_LIT:100> <EOL> self . data = data <EOL> def test_simple_detect ( self ) : <EOL> for agent , simple_res , res in data : <EOL> self . assertEqual ( simple_detect ( agent ) , simple_res ) <EOL> def test_detect ( self ) : <EOL> for agent , simple_res , res in data : <EOL> self . assertEqual ( detect ( agent ) , res ) <EOL> def test_harass ( self ) : <EOL> then = time . time ( ) <EOL> for agent , simple_res , res in data * self . harass_repeat : <EOL> detect ( agent ) <EOL> time_taken = time . time ( ) - then <EOL> no_of_tests = len ( self . data ) * self . harass_repeat <EOL> print "<STR_LIT>" % ( no_of_tests , time_taken ) <EOL> print "<STR_LIT>" , time_taken / ( len ( self . data ) * self . harass_repeat ) <EOL> unittest . main ( ) <EOL> class mobilize ( object ) : <EOL> def __init__ ( self , func ) : <EOL> self . func = func <EOL> def __call__ ( self ) : <EOL> from gluon import current <EOL> user_agent = current . request . user_agent ( ) <EOL> if user_agent . is_mobile : <EOL> items = current . response . view . split ( '<STR_LIT:.>' ) <EOL> items . insert ( - <NUM_LIT:1> , '<STR_LIT>' ) <EOL> current . response . view = '<STR_LIT:.>' . join ( items ) <EOL> return self . func ( ) </s>
