summaryrefslogtreecommitdiff
path: root/external/plyer/utils.py
diff options
context:
space:
mode:
Diffstat (limited to 'external/plyer/utils.py')
-rw-r--r--external/plyer/utils.py135
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