diff options
Diffstat (limited to 'external/plyer/utils.py')
-rw-r--r-- | external/plyer/utils.py | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/external/plyer/utils.py b/external/plyer/utils.py new file mode 100644 index 0000000..347c8d5 --- /dev/null +++ b/external/plyer/utils.py @@ -0,0 +1,135 @@ +''' +Utils +===== + +''' + +__all__ = ('platform', ) + +from os import environ +from os import path +from sys import platform as _sys_platform + + +class Platform(object): + # refactored to class to allow module function to be replaced + # with module variable + + def __init__(self): + self._platform_ios = None + self._platform_android = None + + def __eq__(self, other): + return other == self._get_platform() + + def __ne__(self, other): + return other != self._get_platform() + + def __str__(self): + return self._get_platform() + + def __repr__(self): + return 'platform name: \'{platform}\' from: \n{instance}'.format( + platform=self._get_platform(), + instance=super(Platform, self).__repr__() + ) + + def __hash__(self): + return self._get_platform().__hash__() + + def _get_platform(self): + + if self._platform_android is None: + # ANDROID_ARGUMENT and ANDROID_PRIVATE are 2 environment variables + # from python-for-android project + self._platform_android = 'ANDROID_ARGUMENT' in environ + + if self._platform_ios is None: + self._platform_ios = (environ.get('KIVY_BUILD', '') == 'ios') + + # On android, _sys_platform return 'linux2', so prefer to check the + # import of Android module than trying to rely on _sys_platform. + if self._platform_android is True: + return 'android' + elif self._platform_ios is True: + return 'ios' + elif _sys_platform in ('win32', 'cygwin'): + return 'win' + elif _sys_platform == 'darwin': + return 'macosx' + elif _sys_platform[:5] == 'linux': + return 'linux' + return 'unknown' + + +platform = Platform() + + +class Proxy(object): + # taken from http://code.activestate.com/recipes/496741-object-proxying/ + + __slots__ = ['_obj', '_name', '_facade'] + + def __init__(self, name, facade): + object.__init__(self) + object.__setattr__(self, '_obj', None) + object.__setattr__(self, '_name', name) + object.__setattr__(self, '_facade', facade) + + def _ensure_obj(self): + obj = object.__getattribute__(self, '_obj') + if obj: + return obj + # do the import + try: + name = object.__getattribute__(self, '_name') + module = 'plyer.platforms.{}.{}'.format( + platform, name) + mod = __import__(module, fromlist='.') + obj = mod.instance() + except: + import traceback + traceback.print_exc() + facade = object.__getattribute__(self, '_facade') + obj = facade() + + object.__setattr__(self, '_obj', obj) + return obj + + def __getattribute__(self, name): + if name == '__doc__': + return + object.__getattribute__(self, '_ensure_obj')() + return getattr(object.__getattribute__(self, '_obj'), name) + + def __delattr__(self, name): + object.__getattribute__(self, '_ensure_obj')() + delattr(object.__getattribute__(self, '_obj'), name) + + def __setattr__(self, name, value): + object.__getattribute__(self, '_ensure_obj')() + setattr(object.__getattribute__(self, '_obj'), name, value) + + def __bool__(self): + object.__getattribute__(self, '_ensure_obj')() + return bool(object.__getattribute__(self, '_obj')) + + def __str__(self): + object.__getattribute__(self, '_ensure_obj')() + return str(object.__getattribute__(self, '_obj')) + + def __repr__(self): + object.__getattribute__(self, '_ensure_obj')() + return repr(object.__getattribute__(self, '_obj')) + + +def whereis_exe(program): + ''' Tries to find the program on the system path. + Returns the path if it is found or None if it's not found. + ''' + path_split = ';' if platform == 'win' else ':' + for p in environ.get('PATH', '').split(path_split): + if path.exists(path.join(p, program)) and \ + not path.isdir(path.join(p, program)): + return path.join(p, program) + return None |