Source code for python_sikuli_client.sikuli_class

"""
Base class for types based on the Sikuli native types
"""
from functools import wraps
from jython_sikuli_server.sikuli_class import ServerSikuliClass

__author__ = 'Alistair Broomhead'


[docs]class ClientSikuliClass(ServerSikuliClass): """ Base class for types based on the Sikuli native types """ _constructors = () _remote_funcs = {} remote = None #noinspection PyDocstring @classmethod
[docs] def mknew(cls, remote, *args, **kwargs): """ Create a new object, instantiating it on the server side. """ from python_sikuli_client.sikuli_client import SikuliClient assert isinstance(remote, SikuliClient) _remote, cls.remote = cls.remote, remote errors = [] for method in cls._constructors: try: server_id = method(*args, **kwargs) except TypeError as e: errors.append(e) continue else: if isinstance(_remote, SikuliClient): cls.remote = _remote obj = cls(remote=remote, server_id=server_id, is_new=True) obj.remote._del_obj(server_id) return obj for e in errors: print e raise NotImplementedError( "Not created a constructor for args=%r kwargs=%r" % (args, kwargs))
@property def _id(self): return self.server_id @property def _str_get(self): return "self._get_jython_object(%r)" % self.server_id @property def _on_server(self): if not int(self._id) in (int(id_) for id_ in self.remote.server_held_objects): return False return True def __new__(cls, remote, server_id, *args, **kwargs): cls.remote = remote # noinspection PyArgumentList obj = object.__new__(cls, remote, *args, **kwargs) return obj #noinspection PyUnusedLocal def __init__(self, remote, server_id, is_new=False, *args, **kwargs): """ :type server_id: int :type remote: SikuliClient """ super(ClientSikuliClass, self).__init__(None) def _apply_key(key): try: func = getattr(self, key) if func._augment is None: raise AttributeError runner = func.run except AttributeError: return @wraps(func) def _outer(*args, **kwargs): return runner(self, *args, **kwargs) setattr(self, key, _outer) for key in dir(self): _apply_key(key) self.remote = remote self.server_id = server_id self.remote._add_obj(server_id) if not is_new: self.remote._current_pool.append(server_id) #noinspection PyArgumentList
[docs]class UnimplementedSikuliClass(ClientSikuliClass): """ Base class for unimplemented types based on the Sikuli native types """ def __new__(cls, *args, **kwargs): raise NotImplementedError("Not implemented %r" % cls)
SikuliClass = ClientSikuliClass #noinspection PyStatementEffect """ For convenience - anything importing :class:`python_sikuli_client.sikuli_class.SikuliClass` will get :class:`~python_sikuli_client.sikuli_class.ClientSikuliClass`, wheras anything importing :class:`jython_sikuli_server.class_definitions.sikuli_class.SikuliClass` will get :class:`~jython_sikuli_server.class_definitions.sikuli_class.ServerSikuliClass` """